📄 l1summoninstance.java
字号:
getMap().setPassable(getLocation(), true);
// アイテム解放処理
L1Inventory targetInventory = _master.getInventory();
List<L1ItemInstance> items = _inventory.getItems();
for (L1ItemInstance item : items) {
if (_master.getInventory().checkAddItem( // 容量重量確認及びメッセージ送信
item, item.getCount()) == L1Inventory.OK) {
_inventory
.tradeItem(item, item.getCount(), targetInventory);
// \f1%0が%1をくれました。
((L1PcInstance) _master).sendPackets(new S_ServerMessage(
143, getName(), item.getLogName()));
} else { // 持てないので足元に落とす
targetInventory = L1World.getInstance().getInventory(
getX(), getY(), getMapId());
_inventory
.tradeItem(item, item.getCount(), targetInventory);
}
}
deleteMe();
} else {
liberate();
}
}
// オブジェクト消去処理
@Override
public synchronized void deleteMe() {
if (_destroyed) {
return;
}
if (!_tamed && !_isReturnToNature) {
broadcastPacket(new S_SkillSound(getId(), 169));
}
_master.getPetList().remove(getId());
super.deleteMe();
if (_summonFuture != null) {
_summonFuture.cancel(false);
_summonFuture = null;
}
}
// テイミングモンスター、クリエイトゾンビの時の解放処理
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.setCurrentHpDirect(getCurrentHp());
monster.setCurrentMpDirect(getCurrentMp());
monster.setExp(0);
deleteMe();
L1World.getInstance().storeObject(monster);
L1World.getInstance().addVisibleObject(monster);
}
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 onAction(L1PcInstance attacker) {
// XXX:NullPointerException回避。onActionの引数の型はL1Characterのほうが良い?
if (attacker == null) {
return;
}
L1Character cha = this.getMaster();
if (cha == null) {
return;
}
L1PcInstance master = (L1PcInstance) cha;
if (master.isTeleport()) {
// テレポート処理中
return;
}
if ((getZoneType() == 1 || attacker.getZoneType() == 1)
&& isExsistMaster()) {
// 攻撃される側がセーフティーゾーン
// 攻撃モーション送信
L1Attack attack_mortion = new L1Attack(attacker, this);
attack_mortion.action();
return;
}
if (attacker.checkNonPvP(attacker, this)) {
return;
}
L1Attack attack = new L1Attack(attacker, this);
if (attack.calcHit()) {
attack.calcDamage();
}
attack.action();
attack.commit();
}
@Override
public void onTalkAction(L1PcInstance player) {
if (isDead()) {
return;
}
if (_master.equals(player)) {
player.sendPackets(new S_PetMenuPacket(this, 0));
}
}
@Override
public void onFinalAction(L1PcInstance player, String action) {
int status = ActionType(action);
if (status == 0) {
return;
}
if (status == 6) {
if (_tamed) {
// テイミングモンスター、クリエイトゾンビの解放
liberate();
} else {
// サモンの解散
Death(null);
}
} else {
// 同じ主人のペットの状態をすべて更新
Object[] petList = _master.getPetList().values().toArray();
for (Object petObject : petList) {
if (petObject instanceof L1SummonInstance) {
// サモンモンスター
L1SummonInstance summon = (L1SummonInstance) petObject;
summon.set_currentPetStatus(status);
} else {
// ペット
}
}
}
}
@Override
public void onPerceive(L1PcInstance perceivedFrom) {
perceivedFrom.addKnownObject(this);
perceivedFrom.sendPackets(new S_SummonPack(this, perceivedFrom));
}
@Override
public void onItemUse() {
if (!isActived()) {
// 100%の確率でヘイストポーション使用
useItem(USEITEM_HASTE, 100);
}
if (getCurrentHp() * 100 / getMaxHp() < 40) {
// HPが40%きったら
// 100%の確率で回復ポーション使用
useItem(USEITEM_HEAL, 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;
}
return status;
}
@Override
public void setCurrentHp(int i) {
int currentHp = i;
if (currentHp >= getMaxHp()) {
currentHp = getMaxHp();
}
setCurrentHpDirect(currentHp);
if (getMaxHp() > getCurrentHp()) {
startHpRegeneration();
}
if (_master instanceof L1PcInstance) {
int HpRatio = 100 * currentHp / getMaxHp();
L1PcInstance Master = (L1PcInstance) _master;
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 set_currentPetStatus(int i) {
_currentPetStatus = i;
if (_currentPetStatus == 5) {
setHomeX(getX());
setHomeY(getY());
}
if (_currentPetStatus == 3) {
allTargetClear();
} else {
if (!isAiRunning()) {
startAI();
}
}
}
public int get_currentPetStatus() {
return _currentPetStatus;
}
public boolean isExsistMaster() {
boolean isExsistMaster = true;
if (this.getMaster() != null) {
String masterName = this.getMaster().getName();
if (L1World.getInstance().getPlayer(masterName) == null) {
isExsistMaster = false;
}
}
return isExsistMaster;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -