📄 l1summoninstance.java
字号:
package l1j.server.server.model.Instance;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;
import java.util.Random;
import l1j.server.server.ActionCodes;
import l1j.server.server.GeneralThreadPool;
import l1j.server.server.IdFactory;
import l1j.server.server.datatables.DropTable;
import l1j.server.server.datatables.NpcTable;
import l1j.server.server.model.L1Attack;
import l1j.server.server.model.L1Character;
import l1j.server.server.model.L1Inventory;
import l1j.server.server.model.L1World;
import l1j.server.server.model.skill.L1SkillId;
import l1j.server.server.serverpackets.S_DoActionGFX;
import l1j.server.server.serverpackets.S_HPMeter;
import l1j.server.server.serverpackets.S_PetMenuPacket;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_SkillSound;
import l1j.server.server.serverpackets.S_SummonPack;
import l1j.server.server.templates.L1Npc;
public class L1SummonInstance extends L1NpcInstance {
private static final long serialVersionUID = 1L;
private static l1j.eric.EricLogger _log = l1j.eric.EricLogger.getLogger2(L1SummonInstance.class
.getName());
private ScheduledFuture<?> _summonFuture;
private static final long SUMMON_TIME = 3600000L;
private int _currentPetStatus;
private boolean _tamed;
private boolean _isReturnToNature = false;
private static Random _random = new Random();
// ターゲットがいない場合の処理
@Override
public boolean noTarget() {
if (_currentPetStatus == 3) {
// ● 休憩の場合
return true;
} else if (_currentPetStatus == 4) {
// ● 配備の場合
if (_master != null
&& _master.getMapId() == getMapId()
&& getLocation().getTileLineDistance(_master.getLocation()) < 5) {
int dir = targetReverseDirection(_master.getX(), _master.getY());
dir = checkObject(getX(), getY(), getMapId(), dir);
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(), MOVE_SPEED));
} else {
// 主人を見失うか5マス以上はなれたら休憩状態に
_currentPetStatus = 3;
return true;
}
} else if (_currentPetStatus == 5) {
// ● 警戒の場合はホームへ
if (Math.abs(getHomeX() - getX()) > 1
|| Math.abs(getHomeY() - getY()) > 1) {
int dir = moveDirection(getHomeX(), getHomeY());
if (dir == -1) {
// ホームが離れすぎてたら現在地がホーム
setHomeX(getX());
setHomeY(getY());
} else {
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(), MOVE_SPEED));
}
}
} else if (_master != null && _master.getMapId() == getMapId()) {
// ●主人を追尾
if (getLocation().getTileLineDistance(_master.getLocation()) > 2) {
int dir = moveDirection(_master.getX(), _master.getY());
if (dir == -1) {
// 主人が離れすぎたら休憩状態に
_currentPetStatus = 3;
return true;
} else {
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(), MOVE_SPEED));
}
}
} else {
// ● 主人を見失ったら休憩状態に
_currentPetStatus = 3;
return true;
}
return false;
}
// 1時間計測用
class SummonTimer implements Runnable {
@Override
public void run() {
if (_destroyed) { // 既に破棄されていないかチェック
return;
}
if (_tamed) {
// テイミングモンスター、クリエイトゾンビの解放
liberate();
} else {
// サモンの解散
Death(null);
}
}
}
// サモンモンスター用
public L1SummonInstance(L1Npc template, L1Character master) {
super(template);
setId(IdFactory.getInstance().nextId());
_summonFuture = GeneralThreadPool.getInstance().schedule(
new SummonTimer(), SUMMON_TIME);
setMaster(master);
setX(master.getX() + _random.nextInt(5) - 2);
setY(master.getY() + _random.nextInt(5) - 2);
setMap(master.getMapId());
setHeading(5);
setLightSize(template.getLightSize());
_currentPetStatus = 3;
_tamed = false;
L1World.getInstance().storeObject(this);
L1World.getInstance().addVisibleObject(this);
for (L1PcInstance pc : L1World.getInstance().getRecognizePlayer(this)) {
onPerceive(pc);
}
master.addPet(this);
}
// テイミングモンスター、クリエイトゾンビ用
public L1SummonInstance(L1NpcInstance target, L1Character master,
boolean isCreateZombie) {
super(null);
setId(IdFactory.getInstance().nextId());
if (isCreateZombie) { // クリエイトゾンビ
int npcId = 45065;
L1PcInstance pc = (L1PcInstance) master;
int level = pc.getLevel();
if (pc.isWizard()) {
if (level >= 24 && level <= 31) {
npcId = 81183;
} else if (level >= 32 && level <= 39) {
npcId = 81184;
} else if (level >= 40 && level <= 43) {
npcId = 81185;
} else if (level >= 44 && level <= 47) {
npcId = 81186;
} else if (level >= 48 && level <= 51) {
npcId = 81187;
} else if (level >= 52) {
npcId = 81188;
}
} else if (pc.isElf()) {
if (level >= 48) {
npcId = 81183;
}
}
L1Npc template = NpcTable.getInstance().getTemplate(npcId).clone();
setting_template(template);
} else { // テイミングモンスター
setting_template(target.getNpcTemplate());
setCurrentHpDirect(target.getCurrentHp());
setCurrentMpDirect(target.getCurrentMp());
}
_summonFuture = GeneralThreadPool.getInstance().schedule(
new SummonTimer(), SUMMON_TIME);
setMaster(master);
setX(target.getX());
setY(target.getY());
setMap(target.getMapId());
setHeading(target.getHeading());
setLightSize(target.getLightSize());
setPetcost(6);
if (target instanceof L1MonsterInstance
&& !((L1MonsterInstance) target).is_storeDroped()) {
DropTable.getInstance().setDrop(target, target.getInventory());
}
setInventory(target.getInventory());
target.setInventory(null);
_currentPetStatus = 3;
_tamed = true;
// ペットが攻撃中だった場合止めさせる
for (L1NpcInstance each : master.getPetList().values()) {
each.targetRemove(target);
}
target.deleteMe();
L1World.getInstance().storeObject(this);
L1World.getInstance().addVisibleObject(this);
for (L1PcInstance pc : L1World.getInstance().getRecognizePlayer(this)) {
onPerceive(pc);
}
master.addPet(this);
}
@Override
public void receiveDamage(L1Character attacker, int damage) { // 攻撃でHPを減らすときはここを使用
if (getCurrentHp() > 0) {
if (damage > 0) {
setHate(attacker, 0); // サモンはヘイト無し
removeSkillEffect(L1SkillId.FOG_OF_SLEEPING);
if (!isExsistMaster()) {
_currentPetStatus = 1;
setTarget(attacker);
}
}
if (attacker instanceof L1PcInstance && damage > 0) {
L1PcInstance player = (L1PcInstance) attacker;
player.setPetTarget(this);
}
int newHp = getCurrentHp() - damage;
if (newHp <= 0) {
Death(attacker);
} else {
setCurrentHp(newHp);
}
} else if (!isDead()) // 念のため
{
l1j.eric.gui.J_Main.getInstance().addConsolPost("警告:招喚怪物HP減少處理出現錯誤。※將視為hp=0作處理");
Death(attacker);
}
}
public synchronized void Death(L1Character lastAttacker) {
if (!isDead()) {
setDead(true);
setCurrentHp(0);
setStatus(ActionCodes.ACTION_Die);
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);
}
}
if (_tamed) {
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Die));
startDeleteTimer();
} else {
deleteMe();
}
}
}
public synchronized void returnToNature() {
_isReturnToNature = true;
if (!_tamed) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -