📄 l1petinstance.java
字号:
l1pet.set_level(getLevel());
l1pet.set_hp(getMaxHp());
l1pet.set_mp(getMaxMp());
l1pet.set_exp(getExp());
PetTable.getInstance().storeNewPet(this, getId(), new_itemobjid);
_itemObjId = new_itemobjid;
return newNpcId;
}
//~所有怪物都可抓進化
// 解放処理
public void liberate() {
L1MonsterInstance monster = new L1MonsterInstance(getNpcTemplate());
monster.setId(IdFactory.getInstance().nextId());
monster.setX(getX());
monster.setY(getY());
monster.setMap(getMapId());
monster.setHeading(getHeading());
monster.set_storeDroped(true);
monster.setInventory(getInventory());
setInventory(null);
monster.setLevel(getLevel());
monster.setMaxHp(getMaxHp());
monster.setCurrentHpDirect(getCurrentHp());
monster.setMaxMp(getMaxMp());
monster.setCurrentMpDirect(getCurrentMp());
_petMaster.getPetList().remove(getId());
deleteMe();
// DBとPetTableから削除し、ペットアミュも破棄
_petMaster.getInventory().removeItem(_itemObjId, 1);
PetTable.getInstance().deletePet(_itemObjId);
L1World.getInstance().storeObject(monster);
L1World.getInstance().addVisibleObject(monster);
for (L1PcInstance pc : L1World.getInstance()
.getRecognizePlayer(monster)) {
onPerceive(pc);
}
}
// ペットの持ち物を収集
public void collect() {
L1Inventory targetInventory = _petMaster.getInventory();
List<L1ItemInstance> items = _inventory.getItems();
int size = _inventory.getSize();
for (int i = 0; i < size; i++) {
L1ItemInstance item = items.get(0);
if (item.isEquipped()) { // 装備中のペットアイテム
continue;
}
if (_petMaster.getInventory().checkAddItem( // 容量重量確認及びメッセージ送信
item, item.getCount()) == L1Inventory.OK) {
_inventory.tradeItem(item, item.getCount(), targetInventory);
_petMaster.sendPackets(new S_ServerMessage(143, getName(), item
.getLogName())); // \f1%0が%1をくれました。
} else { // 持てないので足元に落とす
targetInventory = L1World.getInstance().getInventory(getX(),
getY(), getMapId());
_inventory.tradeItem(item, item.getCount(), targetInventory);
}
}
}
// リスタート時にDROPを地面に落とす
public void dropItem() {
L1Inventory targetInventory = L1World.getInstance().getInventory(
getX(), getY(), getMapId());
List<L1ItemInstance> items = _inventory.getItems();
int size = _inventory.getSize();
for (int i = 0; i < size; i++) {
L1ItemInstance item = items.get(0);
item.setEquipped(false);
_inventory.tradeItem(item, item.getCount(), targetInventory);
}
}
// ペットの笛を使った
public void call() {
int id = _type.getMessageId(L1PetType.getMessageNumber(getLevel()));
if (id != 0) {
broadcastPacket(new S_NpcChatPacket(this, "$" + id, 0));
}
setCurrentPetStatus(7); // 主人の近くで休憩状態
}
public void setTarget(L1Character target) {
if (target != null
&& (_currentPetStatus == 1 || _currentPetStatus == 2 || _currentPetStatus == 5)) {
setHate(target, 0);
if (!isAiRunning()) {
startAI();
}
}
}
public void setMasterTarget(L1Character target) {
if (target != null
&& (_currentPetStatus == 1 || _currentPetStatus == 5)) {
setHate(target, 0);
if (!isAiRunning()) {
startAI();
}
}
}
@Override
public void onPerceive(L1PcInstance perceivedFrom) {
perceivedFrom.addKnownObject(this);
perceivedFrom.sendPackets(new S_PetPack(this, perceivedFrom)); // ペット系オブジェクト認識
if (isDead()) {
perceivedFrom.sendPackets(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Die));
}
}
@Override
public void onAction(L1PcInstance player) {
L1Character cha = this.getMaster();
L1PcInstance master = (L1PcInstance) cha;
if (master.isTeleport()) { // テレポート処理中
return;
}
if (getZoneType() == 1) { // 攻撃される側がセーフティーゾーン
L1Attack attack_mortion = new L1Attack(player, this); // 攻撃モーション送信
attack_mortion.action();
return;
}
if (player.checkNonPvP(player, this)) {
return;
}
L1Attack attack = new L1Attack(player, this);
if (attack.calcHit()) {
attack.calcDamage();
}
attack.action();
attack.commit();
}
@Override
public void onTalkAction(L1PcInstance player) {
if (isDead()) {
return;
}
if (_petMaster.equals(player)) {
player.sendPackets(new S_PetMenuPacket(this, getExpPercent()));
L1Pet l1pet = PetTable.getInstance().getTemplate(_itemObjId);
// XXX ペットに話しかけるたびにDBに書き込む必要はない
if (l1pet != null) {
l1pet.set_exp(getExp());
l1pet.set_level(getLevel());
l1pet.set_hp(getMaxHp());
l1pet.set_mp(getMaxMp());
PetTable.getInstance().storePet(l1pet); // DBに書き込み
}
}
}
@Override
public void onFinalAction(L1PcInstance player, String action) {
int status = actionType(action);
if (status == 0) {
return;
}
if (status == 6) {
liberate(); // ペットの解放
} else {
// 同じ主人のペットの状態をすべて更新
Object[] petList = _petMaster.getPetList().values().toArray();
for (Object petObject : petList) {
if (petObject instanceof L1PetInstance) { // ペット
L1PetInstance pet = (L1PetInstance) petObject;
if (_petMaster != null && _petMaster.getLevel() >= pet
.getLevel()) {
pet.setCurrentPetStatus(status);
} else {
L1PetType type = PetTypeTable.getInstance().get(
pet.getNpcTemplate().get_npcId());
int id = type.getDefyMessageId();
if (id != 0) {
broadcastPacket(new S_NpcChatPacket(pet,
"$" + id, 0));
}
}
}
}
}
}
@Override
public void onItemUse() {
/*刪除if (!isActived()) {
useItem(USEITEM_HASTE, 100); // 100%の確率でヘイストポーション使用
}刪除*/
//TODO 喝綠判斷變更 by 阿傑
if (!hasSkillEffect(1001) && !hasSkillEffect(43)) {//補上加速術判斷
useItem(USEITEM_HASTE, 100); // 100%の確率でヘイストポーション使用
}
//喝綠判斷變更 end
if (getCurrentHp() * 100 / getMaxHp() < 40) { // HPが40%きったら
useItem(USEITEM_HEAL, 100); // 100%の確率で回復ポーション使用
}
}
@Override
public void onGetItem(L1ItemInstance item) {
if (getNpcTemplate().get_digestitem() > 0) {
setDigestItem(item);
}
Arrays.sort(healPotions);
Arrays.sort(haestPotions);
if (Arrays.binarySearch(healPotions, item.getItem().getItemId()) >= 0) {
if (getCurrentHp() != getMaxHp()) {
useItem(USEITEM_HEAL, 100);
}
} else if (Arrays
.binarySearch(haestPotions, item.getItem().getItemId()) >= 0) {
useItem(USEITEM_HASTE, 100);
}
}
private int actionType(String action) {
int status = 0;
if (action.equalsIgnoreCase("aggressive")) { // 攻撃態勢
status = 1;
} else if (action.equalsIgnoreCase("defensive")) { // 防御態勢
status = 2;
} else if (action.equalsIgnoreCase("stay")) { // 休憩
status = 3;
} else if (action.equalsIgnoreCase("extend")) { // 配備
status = 4;
} else if (action.equalsIgnoreCase("alert")) { // 警戒
status = 5;
} else if (action.equalsIgnoreCase("dismiss")) { // 解散
status = 6;
} else if (action.equalsIgnoreCase("getitem")) { // 収集
collect();
}
return status;
}
@Override
public void setCurrentHp(int i) {
int currentHp = i;
if (currentHp >= getMaxHp()) {
currentHp = getMaxHp();
}
setCurrentHpDirect(currentHp);
if (getMaxHp() > getCurrentHp()) {
startHpRegeneration();
}
if (_petMaster != null) {
int HpRatio = 100 * currentHp / getMaxHp();
L1PcInstance Master = _petMaster;
Master.sendPackets(new S_HPMeter(getId(), HpRatio));
}
}
@Override
public void setCurrentMp(int i) {
int currentMp = i;
if (currentMp >= getMaxMp()) {
currentMp = getMaxMp();
}
setCurrentMpDirect(currentMp);
if (getMaxMp() > getCurrentMp()) {
startMpRegeneration();
}
}
public void setCurrentPetStatus(int i) {
_currentPetStatus = i;
if (_currentPetStatus == 5) {
setHomeX(getX());
setHomeY(getY());
}
if (_currentPetStatus == 7) {
allTargetClear();
}
if (_currentPetStatus == 3) {
allTargetClear();
} else {
if (!isAiRunning()) {
startAI();
}
}
}
public int getCurrentPetStatus() {
return _currentPetStatus;
}
public int getItemObjId() {
return _itemObjId;
}
public void setExpPercent(int expPercent) {
_expPercent = expPercent;
}
public int getExpPercent() {
return _expPercent;
}
private L1ItemInstance _weapon;
public void setWeapon(L1ItemInstance weapon) {
_weapon = weapon;
}
public L1ItemInstance getWeapon() {
return _weapon;
}
private L1ItemInstance _armor;
public void setArmor(L1ItemInstance armor) {
_armor = armor;
}
public L1ItemInstance getArmor() {
return _armor;
}
private int _hitByWeapon;
public void setHitByWeapon(int i) {
_hitByWeapon = i;
}
public int getHitByWeapon() {
return _hitByWeapon;
}
private int _damageByWeapon;
public void setDamageByWeapon(int i) {
_damageByWeapon = i;
}
public int getDamageByWeapon() {
return _damageByWeapon;
}
private static Logger _log = Logger
.getLogger(L1PetInstance.class.getName());
private int _currentPetStatus;
private L1PcInstance _petMaster;
private int _itemObjId;
private L1PetType _type;
private int _expPercent;
public L1PetType getPetType() {
return _type;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -