📄 l1monsterinstance.java
字号:
setDead(true);
setStatus(ActionCodes.ACTION_Die);
Death death = new Death(attacker);
GeneralThreadPool.getInstance().execute(death);
// Death(attacker);
} else { // 変身するモンスター
// distributeExpDropKarma(attacker);
transform(transformId);
}
}
if (newHp > 0) {
setCurrentHp(newHp);
hide();
}
} else if (!isDead()) { // 念のため
setDead(true);
setStatus(ActionCodes.ACTION_Die);
Death death = new Death(attacker);
GeneralThreadPool.getInstance().execute(death);
// Death(attacker);
}
}
/**
* 距離が5以上離れているpcを距離3~4の位置に引き寄せる。
*
* @param pc
*/
private void recall(L1PcInstance pc) {
if (getMapId() != pc.getMapId()) {
return;
}
if (getLocation().getTileLineDistance(pc.getLocation()) > 4) {
for (int count = 0; count < 10; count++) {
L1Location newLoc = getLocation().randomLocation(3, 4, false);
if (glanceCheck(newLoc.getX(), newLoc.getY())) {
L1Teleport.teleport(pc, newLoc.getX(), newLoc.getY(),
getMapId(), 5, true);
break;
}
}
}
}
@Override
public void setCurrentHp(int i) {
int currentHp = i;
if (currentHp >= getMaxHp()) {
currentHp = getMaxHp();
}
setCurrentHpDirect(currentHp);
if (getMaxHp() > getCurrentHp()) {
startHpRegeneration();
}
}
@Override
public void setCurrentMp(int i) {
int currentMp = i;
if (currentMp >= getMaxMp()) {
currentMp = getMaxMp();
}
setCurrentMpDirect(currentMp);
if (getMaxMp() > getCurrentMp()) {
startMpRegeneration();
}
}
class Death implements Runnable {
L1Character _lastAttacker;
public Death(L1Character lastAttacker) {
_lastAttacker = lastAttacker;
}
@Override
public void run() {
setDeathProcessing(true);
setCurrentHpDirect(0);
setDead(true);
setStatus(ActionCodes.ACTION_Die);
getMap().setPassable(getLocation(), true);
broadcastPacket(new S_DoActionGFX(getId(), ActionCodes.ACTION_Die));
startChat(CHAT_TIMING_DEAD);
distributeExpDropKarma(_lastAttacker);
giveUbSeal();
setDeathProcessing(false);
setExp(0);
setKarma(0);
allTargetClear();
startDeleteTimer();
}
}
private void distributeExpDropKarma(L1Character lastAttacker) {
L1PcInstance pc = null;
if (lastAttacker instanceof L1PcInstance) {
pc = (L1PcInstance) lastAttacker;
} else if (lastAttacker instanceof L1PetInstance) {
pc = (L1PcInstance) ((L1PetInstance) lastAttacker).getMaster();
} else if (lastAttacker instanceof L1SummonInstance) {
pc = (L1PcInstance) ((L1SummonInstance) lastAttacker).getMaster();
}
if (pc != null) {
ArrayList<L1Character> targetList = _hateList.toTargetArrayList();
ArrayList<Integer> hateList = _hateList.toHateArrayList();
int exp = getExp();
CalcExp.calcExp(pc, getId(), targetList, hateList, exp);
// 死亡した場合はドロップとカルマも分配、死亡せず変身した場合はEXPのみ
if (isDead()) {
distributeDrop();
giveKarma(pc);
}
} else if (lastAttacker instanceof L1EffectInstance) { // FWが倒した場合
ArrayList<L1Character> targetList = _hateList.toTargetArrayList();
ArrayList<Integer> hateList = _hateList.toHateArrayList();
// ヘイトリストにキャラクターが存在する
if (hateList.size() != 0) {
// 最大ヘイトを持つキャラクターが倒したものとする
int maxHate = 0;
for (int i = hateList.size() - 1; i >= 0; i--) {
if (maxHate < ((Integer) hateList.get(i))) {
maxHate = (hateList.get(i));
lastAttacker = targetList.get(i);
}
}
if (lastAttacker instanceof L1PcInstance) {
pc = (L1PcInstance) lastAttacker;
} else if (lastAttacker instanceof L1PetInstance) {
pc = (L1PcInstance) ((L1PetInstance) lastAttacker)
.getMaster();
} else if (lastAttacker instanceof L1SummonInstance) {
pc = (L1PcInstance) ((L1SummonInstance)
lastAttacker).getMaster();
}
int exp = getExp();
CalcExp.calcExp(pc, getId(), targetList, hateList, exp);
// 死亡した場合はドロップとカルマも分配、死亡せず変身した場合はEXPのみ
if (isDead()) {
distributeDrop();
giveKarma(pc);
}
}
}
}
private void distributeDrop() {
ArrayList<L1Character> dropTargetList = _dropHateList
.toTargetArrayList();
ArrayList<Integer> dropHateList = _dropHateList.toHateArrayList();
try {
int npcId = getNpcTemplate().get_npcId();
if (npcId != 45640
|| (npcId == 45640 && getTempCharGfx() == 2332)) {
DropTable.getInstance().dropShare(L1MonsterInstance.this,
dropTargetList, dropHateList);
}
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
private void giveKarma(L1PcInstance pc) {
int karma = getKarma();
if (karma != 0) {
int karmaSign = Integer.signum(karma);
int pcKarmaLevel = pc.getKarmaLevel();
int pcKarmaLevelSign = Integer.signum(pcKarmaLevel);
// カルマ背信行為は5倍
if (pcKarmaLevelSign != 0 && karmaSign != pcKarmaLevelSign) {
karma *= 5;
}
// カルマは止めを刺したプレイヤーに設定。ペットorサモンで倒した場合も入る。
pc.addKarma((int) (karma * Config.RATE_KARMA));
}
}
private void giveUbSeal() {
if (getUbSealCount() != 0) { // UBの勇者の証
L1UltimateBattle ub = UBTable.getInstance().getUb(getUbId());
if (ub != null) {
for (L1PcInstance pc : ub.getMembersArray()) {
if (pc != null && !pc.isDead() && !pc.isGhost()) {
L1ItemInstance item = pc.getInventory()
.storeItem(41402, getUbSealCount());
pc.sendPackets(new S_ServerMessage(403, item
.getLogName())); // %0を手に入れました。
}
}
}
}
}
public boolean is_storeDroped() {
return _storeDroped;
}
public void set_storeDroped(boolean flag) {
_storeDroped = flag;
}
private int _ubSealCount = 0; // UBで倒された時、参加者に与えられる勇者の証の數量
public int getUbSealCount() {
return _ubSealCount;
}
public void setUbSealCount(int i) {
_ubSealCount = i;
}
private int _ubId = 0; // UBID
public int getUbId() {
return _ubId;
}
public void setUbId(int i) {
_ubId = i;
}
private void hide() {
int npcid = getNpcTemplate().get_npcId();
if (npcid == 45061 // カーズドスパルトイ
|| npcid == 45161 // スパルトイ
|| npcid == 45181 // スパルトイ
|| npcid == 45455) { // デッドリースパルトイ
if (getMaxHp() / 3 > getCurrentHp()) {
int rnd = _random.nextInt(10);
if (1 > rnd) {
allTargetClear();
setHiddenStatus(HIDDEN_STATUS_SINK);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Hide));
setStatus(13);
broadcastPacket(new S_NPCPack(this));
}
}
} else if (npcid == 45682) { // アンタラス
if (getMaxHp() / 3 > getCurrentHp()) {
int rnd = _random.nextInt(50);
if (1 > rnd) {
allTargetClear();
setHiddenStatus(HIDDEN_STATUS_SINK);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_AntharasHide));
setStatus(20);
broadcastPacket(new S_NPCPack(this));
}
}
} else if (npcid == 45067 // バレーハーピー
|| npcid == 45264 // ハーピー
|| npcid == 45452 // ハーピー
|| npcid == 45090 // バレーグリフォン
|| npcid == 45321 // グリフォン
|| npcid == 45445) { // グリフォン
if (getMaxHp() / 3 > getCurrentHp()) {
int rnd = _random.nextInt(10);
if (1 > rnd) {
allTargetClear();
setHiddenStatus(HIDDEN_STATUS_FLY);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Moveup));
setStatus(4);
broadcastPacket(new S_NPCPack(this));
}
}
} else if (npcid == 45681) { // リンドビオル
if (getMaxHp() / 3 > getCurrentHp()) {
int rnd = _random.nextInt(50);
if (1 > rnd) {
allTargetClear();
setHiddenStatus(HIDDEN_STATUS_FLY);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Moveup));
setStatus(11);
broadcastPacket(new S_NPCPack(this));
}
}
} else if (npcid == 46107 // テーベ マンドラゴラ(白)
|| npcid == 46108) { // テーベ マンドラゴラ(黒)
if (getMaxHp() / 4> getCurrentHp()) {
int rnd = _random.nextInt(10);
if (1 > rnd) {
allTargetClear();
setHiddenStatus(HIDDEN_STATUS_SINK);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Hide));
setStatus(13);
broadcastPacket(new S_NPCPack(this));
}
}
}
}
public void initHide() {
// 出現直後の隠れる動作
// 潜るMOBは一定の確率で地中に潜った状態に、
// 飛ぶMOBは飛んだ状態にしておく
int npcid = getNpcTemplate().get_npcId();
if (npcid == 45061 // カーズドスパルトイ
|| npcid == 45161 // スパルトイ
|| npcid == 45181 // スパルトイ
|| npcid == 45455) { // デッドリースパルトイ
int rnd = _random.nextInt(3);
if (1 > rnd) {
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(13);
}
} else if (npcid == 45045 // クレイゴーレム
|| npcid == 45126 // ストーンゴーレム
|| npcid == 45134 // ストーンゴーレム
|| npcid == 45281) { // ギランストーンゴーレム
int rnd = _random.nextInt(3);
if (1 > rnd) {
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(4);
}
} else if (npcid == 45067 // バレーハーピー
|| npcid == 45264 // ハーピー
|| npcid == 45452 // ハーピー
|| npcid == 45090 // バレーグリフォン
|| npcid == 45321 // グリフォン
|| npcid == 45445) { // グリフォン
setHiddenStatus(HIDDEN_STATUS_FLY);
setStatus(4);
} else if (npcid == 45681) { // リンドビオル
setHiddenStatus(HIDDEN_STATUS_FLY);
setStatus(11);
} else if (npcid == 46107 // テーベ マンドラゴラ(白)
|| npcid == 46108) { // テーベ マンドラゴラ(黒)
int rnd = _random.nextInt(3);
if (1 > rnd) {
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(13);
}
}
}
public void initHideForMinion(L1NpcInstance leader) {
// グループに属するモンスターの出現直後の隠れる動作(リーダーと同じ動作にする)
int npcid = getNpcTemplate().get_npcId();
if (leader.getHiddenStatus() == HIDDEN_STATUS_SINK) {
if (npcid == 45061 // カーズドスパルトイ
|| npcid == 45161 // スパルトイ
|| npcid == 45181 // スパルトイ
|| npcid == 45455) { // デッドリースパルトイ
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(13);
} else if (npcid == 45045 // クレイゴーレム
|| npcid == 45126 // ストーンゴーレム
|| npcid == 45134 // ストーンゴーレム
|| npcid == 45281) { // ギランストーンゴーレム
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(4);
} else if (npcid == 46107 // テーベ マンドラゴラ(白)
|| npcid == 46108) { // テーベ マンドラゴラ(黒)
setHiddenStatus(HIDDEN_STATUS_SINK);
setStatus(13);
}
} else if (leader.getHiddenStatus() == HIDDEN_STATUS_FLY) {
if (npcid == 45067 // バレーハーピー
|| npcid == 45264 // ハーピー
|| npcid == 45452 // ハーピー
|| npcid == 45090 // バレーグリフォン
|| npcid == 45321 // グリフォン
|| npcid == 45445) { // グリフォン
setHiddenStatus(HIDDEN_STATUS_FLY);
setStatus(4);
} else if (npcid == 45681) { // リンドビオル
setHiddenStatus(HIDDEN_STATUS_FLY);
setStatus(11);
}
}
}
@Override
protected void transform(int transformId) {
super.transform(transformId);
// DROPの再設定
getInventory().clearItems();
DropTable.getInstance().setDrop(this, getInventory());
getInventory().shuffle();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -