/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package com.l2jserver.gameserver.model.actor.instance; import java.util.concurrent.Future; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.datatables.SkillTable; import com.l2jserver.gameserver.instancemanager.FourSepulchersManager; import com.l2jserver.gameserver.model.L2Skill; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.network.serverpackets.NpcSay; import com.l2jserver.gameserver.templates.chars.L2NpcTemplate; /** * * @author sandman */ public class L2SepulcherMonsterInstance extends L2MonsterInstance { public int mysteriousBoxId = 0; protected Future<?> _victimSpawnKeyBoxTask = null; protected Future<?> _victimShout = null; protected Future<?> _changeImmortalTask = null; protected Future<?> _onDeadEventTask = null; public L2SepulcherMonsterInstance(int objectId, L2NpcTemplate template) { super(objectId, template); setInstanceType(InstanceType.L2SepulcherMonsterInstance); setShowSummonAnimation(true); switch (template.npcId) { case 25339: case 25342: case 25346: case 25349: setIsRaid(true); } } @Override public void onSpawn() { setShowSummonAnimation(false); switch (getNpcId()) { case 18150: case 18151: case 18152: case 18153: case 18154: case 18155: case 18156: case 18157: if (_victimSpawnKeyBoxTask != null) _victimSpawnKeyBoxTask.cancel(true); _victimSpawnKeyBoxTask = ThreadPoolManager.getInstance().scheduleEffect(new VictimSpawnKeyBox(this), 300000); if (_victimShout != null) _victimShout.cancel(true); _victimShout = ThreadPoolManager.getInstance().scheduleEffect(new VictimShout(this), 5000); break; case 18196: case 18197: case 18198: case 18199: case 18200: case 18201: case 18202: case 18203: case 18204: case 18205: case 18206: case 18207: case 18208: case 18209: case 18210: case 18211: break; case 18231: case 18232: case 18233: case 18234: case 18235: case 18236: case 18237: case 18238: case 18239: case 18240: case 18241: case 18242: case 18243: if (_changeImmortalTask != null) _changeImmortalTask.cancel(true); _changeImmortalTask = ThreadPoolManager.getInstance().scheduleEffect(new ChangeImmortal(this), 1600); break; case 18256: break; case 25339: case 25342: case 25346: case 25349: setIsRaid(true); break; } super.onSpawn(); } @Override public boolean doDie(L2Character killer) { if (!super.doDie(killer)) return false; switch (getNpcId()) { case 18120: case 18121: case 18122: case 18123: case 18124: case 18125: case 18126: case 18127: case 18128: case 18129: case 18130: case 18131: case 18149: case 18158: case 18159: case 18160: case 18161: case 18162: case 18163: case 18164: case 18165: case 18183: case 18184: case 18212: case 18213: case 18214: case 18215: case 18216: case 18217: case 18218: case 18219: if (_onDeadEventTask != null) _onDeadEventTask.cancel(true); _onDeadEventTask = ThreadPoolManager.getInstance().scheduleEffect(new OnDeadEvent(this), 3500); break; case 18150: case 18151: case 18152: case 18153: case 18154: case 18155: case 18156: case 18157: if (_victimSpawnKeyBoxTask != null) { _victimSpawnKeyBoxTask.cancel(true); _victimSpawnKeyBoxTask = null; } if (_victimShout != null) { _victimShout.cancel(true); _victimShout = null; } if (_onDeadEventTask != null) _onDeadEventTask.cancel(true); _onDeadEventTask = ThreadPoolManager.getInstance().scheduleEffect(new OnDeadEvent(this), 3500); break; case 18141: case 18142: case 18143: case 18144: case 18145: case 18146: case 18147: case 18148: if (FourSepulchersManager.getInstance().isViscountMobsAnnihilated(mysteriousBoxId)) { if (_onDeadEventTask != null) _onDeadEventTask.cancel(true); _onDeadEventTask = ThreadPoolManager.getInstance().scheduleEffect(new OnDeadEvent(this), 3500); } break; case 18220: case 18221: case 18222: case 18223: case 18224: case 18225: case 18226: case 18227: case 18228: case 18229: case 18230: case 18231: case 18232: case 18233: case 18234: case 18235: case 18236: case 18237: case 18238: case 18239: case 18240: if (FourSepulchersManager.getInstance().isDukeMobsAnnihilated(mysteriousBoxId)) { if (_onDeadEventTask != null) _onDeadEventTask.cancel(true); _onDeadEventTask = ThreadPoolManager.getInstance().scheduleEffect(new OnDeadEvent(this), 3500); } break; case 25339: case 25342: case 25346: case 25349: giveCup(killer); if (_onDeadEventTask != null) _onDeadEventTask.cancel(true); _onDeadEventTask = ThreadPoolManager.getInstance().scheduleEffect(new OnDeadEvent(this), 8500); break; } return true; } @Override public void deleteMe() { if (_victimSpawnKeyBoxTask != null) { _victimSpawnKeyBoxTask.cancel(true); _victimSpawnKeyBoxTask = null; } if (_onDeadEventTask != null) { _onDeadEventTask.cancel(true); _onDeadEventTask = null; } super.deleteMe(); } private void giveCup(L2Character killer) { String questId = "620_FourGoblets"; int cupId = 0; int oldBrooch = 7262; switch (getNpcId()) { case 25339: cupId = 7256; break; case 25342: cupId = 7257; break; case 25346: cupId = 7258; break; case 25349: cupId = 7259; break; } L2PcInstance player = killer.getActingPlayer(); if (player == null) return; if (player.getParty() != null) { for (L2PcInstance mem : player.getParty().getPartyMembers()) { QuestState qs = mem.getQuestState(questId); if (qs != null && (qs.isStarted() || qs.isCompleted()) && mem.getInventory().getItemByItemId(oldBrooch) == null) { mem.addItem("Quest", cupId, 1, mem, true); } } } else { QuestState qs = player.getQuestState(questId); if (qs != null && (qs.isStarted() || qs.isCompleted()) && player.getInventory().getItemByItemId(oldBrooch) == null) { player.addItem("Quest", cupId, 1, player, true); } } } private class VictimShout implements Runnable { private L2SepulcherMonsterInstance _activeChar; public VictimShout(L2SepulcherMonsterInstance activeChar) { _activeChar = activeChar; } public void run() { if (_activeChar.isDead()) return; if (!_activeChar.isVisible()) return; broadcastPacket(new NpcSay(getObjectId(), 0, getNpcId(), "forgive me!!")); } } private class VictimSpawnKeyBox implements Runnable { private L2SepulcherMonsterInstance _activeChar; public VictimSpawnKeyBox(L2SepulcherMonsterInstance activeChar) { _activeChar = activeChar; } public void run() { if (_activeChar.isDead()) return; if (!_activeChar.isVisible()) return; FourSepulchersManager.getInstance().spawnKeyBox(_activeChar); broadcastPacket(new NpcSay(getObjectId(), 0, getNpcId(), "Many thanks for rescue me.")); if (_victimShout != null) { _victimShout.cancel(true); } } } private static class OnDeadEvent implements Runnable { L2SepulcherMonsterInstance _activeChar; public OnDeadEvent(L2SepulcherMonsterInstance activeChar) { _activeChar = activeChar; } public void run() { switch (_activeChar.getNpcId()) { case 18120: case 18121: case 18122: case 18123: case 18124: case 18125: case 18126: case 18127: case 18128: case 18129: case 18130: case 18131: case 18149: case 18158: case 18159: case 18160: case 18161: case 18162: case 18163: case 18164: case 18165: case 18183: case 18184: case 18212: case 18213: case 18214: case 18215: case 18216: case 18217: case 18218: case 18219: FourSepulchersManager.getInstance().spawnKeyBox(_activeChar); break; case 18150: case 18151: case 18152: case 18153: case 18154: case 18155: case 18156: case 18157: FourSepulchersManager.getInstance().spawnExecutionerOfHalisha(_activeChar); break; case 18141: case 18142: case 18143: case 18144: case 18145: case 18146: case 18147: case 18148: FourSepulchersManager.getInstance().spawnMonster(_activeChar.mysteriousBoxId); break; case 18220: case 18221: case 18222: case 18223: case 18224: case 18225: case 18226: case 18227: case 18228: case 18229: case 18230: case 18231: case 18232: case 18233: case 18234: case 18235: case 18236: case 18237: case 18238: case 18239: case 18240: FourSepulchersManager.getInstance().spawnArchonOfHalisha(_activeChar.mysteriousBoxId); break; case 25339: case 25342: case 25346: case 25349: FourSepulchersManager.getInstance().spawnEmperorsGraveNpc(_activeChar.mysteriousBoxId); break; } } } private static class ChangeImmortal implements Runnable { L2SepulcherMonsterInstance activeChar; public ChangeImmortal(L2SepulcherMonsterInstance mob) { activeChar = mob; } public void run() { L2Skill fp = SkillTable.FrequentSkill.FAKE_PETRIFICATION.getSkill(); // Invulnerable by petrification fp.getEffects(activeChar, activeChar); } } @Override public boolean isAutoAttackable(L2Character attacker) { return true; } }