/* * 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 . */ package ai.individual; import java.util.concurrent.Future; import java.util.logging.Level; import javolution.util.FastList; import ai.group_template.L2AttackableAIScript; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; import com.l2jserver.gameserver.datatables.DoorTable; import com.l2jserver.gameserver.datatables.NpcTable; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.instancemanager.GrandBossManager; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.zone.type.L2BossZone; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.serverpackets.ActionFailed; import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; /** * Ice Fairy Sirra AI * @author Kerberos */ public class IceFairySirra extends L2AttackableAIScript { private static final int STEWARD = 32029; private static final int SILVER_HEMOCYTE = 8057; private static L2BossZone _sirrasZone; private static L2PcInstance _player = null; protected FastList _allMobs = new FastList(); protected Future _onDeadEventTask = null; public IceFairySirra(int id, String name, String descr) { super(id, name, descr); int[] mob = { 22100, 22102, 22104, 29056 }; registerMobs(mob); registerMobs(new int[] { STEWARD }, QuestEventType.QUEST_START, QuestEventType.ON_TALK, QuestEventType.ON_FIRST_TALK); String test = loadGlobalQuestVar("Sirra_Respawn"); if (!test.equalsIgnoreCase("")) { long remain = Long.parseLong(test) - System.currentTimeMillis(); if (remain <= 0) { init(false); } else { init(true); startQuestTimer("respawn", remain, null, null); } } else { init(false); } } public void init(boolean isBusy) { _sirrasZone = GrandBossManager.getInstance().getZone(105546, -127892, -2768); if (_sirrasZone == null) { _log.warning("IceFairySirraManager: Failed to load zone"); return; } _sirrasZone.setZoneEnabled(false); L2Npc steward = findTemplate(STEWARD); if (steward != null) { steward.setBusy(isBusy); } openGates(); } public void cleanUp() { init(false); cancelQuestTimer("30MinutesRemaining", null, _player); cancelQuestTimer("20MinutesRemaining", null, _player); cancelQuestTimer("10MinutesRemaining", null, _player); cancelQuestTimer("End", null, _player); for (L2Npc mob : _allMobs) { try { mob.getSpawn().stopRespawn(); mob.deleteMe(); } catch (Exception e) { _log.log(Level.SEVERE, "IceFairySirraManager: Failed deleting mob.", e); } } _allMobs.clear(); } public L2Npc findTemplate(int npcId) { L2Npc npc = null; for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable()) { if ((spawn != null) && (spawn.getNpcid() == npcId)) { npc = spawn.getLastSpawn(); break; } } return npc; } protected void openGates() { for (int i = 23140001; i < 23140003; i++) { try { L2DoorInstance door = DoorTable.getInstance().getDoor(i); if (door != null) { door.openMe(); } else { _log.warning("IceFairySirraManager: Attempted to open undefined door. doorId: " + i); } } catch (Exception e) { _log.log(Level.SEVERE, "IceFairySirraManager: Failed closing door", e); } } } protected void closeGates() { for (int i = 23140001; i < 23140003; i++) { try { L2DoorInstance door = DoorTable.getInstance().getDoor(i); if (door != null) { door.closeMe(); } else { _log.warning("IceFairySirraManager: Attempted to close undefined door. doorId: " + i); } } catch (Exception e) { _log.log(Level.SEVERE, "IceFairySirraManager: Failed closing door", e); } } } public boolean checkItems(L2PcInstance player) { if (player.getParty() != null) { for (L2PcInstance pc : player.getParty().getPartyMembers()) { L2ItemInstance i = pc.getInventory().getItemByItemId(SILVER_HEMOCYTE); if ((i == null) || (i.getCount() < 10)) { return false; } } } else { return false; } return true; } public void destroyItems(L2PcInstance player) { if (player.getParty() != null) { for (L2PcInstance pc : player.getParty().getPartyMembers()) { L2ItemInstance i = pc.getInventory().getItemByItemId(SILVER_HEMOCYTE); pc.destroyItem("Hemocytes", i.getObjectId(), 10, null, false); } } else { cleanUp(); } } public void teleportInside(L2PcInstance player) { if (player.getParty() != null) { for (L2PcInstance pc : player.getParty().getPartyMembers()) { pc.teleToLocation(113533, -126159, -3488, false); if (_sirrasZone == null) { _log.warning("IceFairySirraManager: Failed to load zone"); cleanUp(); return; } _sirrasZone.allowPlayerEntry(pc, 2103); } } else { cleanUp(); } } public void screenMessage(L2PcInstance player, NpcStringId npcString, int time) { if (player.getParty() != null) { for (L2PcInstance pc : player.getParty().getPartyMembers()) { pc.sendPacket(new ExShowScreenMessage(npcString, 2, time)); } } else { cleanUp(); } } public void doSpawns() { int[][] mobs = { { 29060, 105546, -127892, -2768 }, { 29056, 102779, -125920, -2840 }, { 22100, 111719, -126646, -2992 }, { 22102, 109509, -128946, -3216 }, { 22104, 109680, -125756, -3136 } }; L2Spawn spawnDat; L2NpcTemplate template; try { for (int i = 0; i < 5; i++) { template = NpcTable.getInstance().getTemplate(mobs[i][0]); if (template != null) { spawnDat = new L2Spawn(template); spawnDat.setAmount(1); spawnDat.setLocx(mobs[i][1]); spawnDat.setLocy(mobs[i][2]); spawnDat.setLocz(mobs[i][3]); spawnDat.setHeading(0); spawnDat.setRespawnDelay(60); SpawnTable.getInstance().addNewSpawn(spawnDat, false); _allMobs.add(spawnDat.doSpawn()); spawnDat.stopRespawn(); } else { _log.warning("IceFairySirraManager: Data missing in NPC table for ID: " + mobs[i][0]); } } } catch (Exception e) { _log.warning("IceFairySirraManager: Spawns could not be initialized: " + e); } } public String getHtmlPath(int val) { String pom = ""; pom = "32029-" + val; if (val == 0) { pom = "32029"; } String temp = "data/html/default/" + pom + ".htm"; if (!Config.LAZY_CACHE) { // If not running lazy cache the file must be in the cache or it doesnt exist if (HtmCache.getInstance().contains(temp)) { return temp; } } else if (HtmCache.getInstance().isLoadable(temp)) { return temp; } // If the file is not found, the standard message "I have nothing to say to you" is returned return "data/html/npcdefault.htm"; } public void sendHtml(L2Npc npc, L2PcInstance player, String filename) { NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); html.setFile(player.getHtmlPrefix(), filename); html.replace("%objectId%", String.valueOf(npc.getObjectId())); player.sendPacket(html); player.sendPacket(ActionFailed.STATIC_PACKET); } @Override public String onFirstTalk(L2Npc npc, L2PcInstance player) { if (player.getQuestState("IceFairySirra") == null) { newQuestState(player); } player.setLastQuestNpcObject(npc.getObjectId()); String filename = ""; if (npc.isBusy()) { filename = getHtmlPath(10); } else { filename = getHtmlPath(0); } sendHtml(npc, player, filename); return null; } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { if (event.equalsIgnoreCase("check_condition")) { if (npc.isBusy())// should never happen { return super.onAdvEvent(event, npc, player); } String filename = ""; if (player.isInParty() && (player.getParty().getPartyLeaderOID() == player.getObjectId())) { if (checkItems(player)) { startQuestTimer("start", 100000, null, player); _player = player; destroyItems(player); player.getInventory().addItem("Scroll", 8379, 3, player, null); npc.setBusy(true); screenMessage(player, NpcStringId.STEWARD_PLEASE_WAIT_A_MOMENT, 100000); filename = getHtmlPath(3); } else { filename = getHtmlPath(2); } } else { filename = getHtmlPath(1); } sendHtml(npc, player, filename); } else if (event.equalsIgnoreCase("start")) { if (_sirrasZone == null) { _log.warning("IceFairySirraManager: Failed to load zone"); cleanUp(); return super.onAdvEvent(event, npc, player); } _sirrasZone.setZoneEnabled(true); closeGates(); doSpawns(); startQuestTimer("Party_Port", 2000, null, player); startQuestTimer("End", 1802000, null, player); } else if (event.equalsIgnoreCase("Party_Port")) { teleportInside(player); screenMessage(player, NpcStringId.STEWARD_PLEASE_RESTORE_THE_QUEENS_FORMER_APPEARANCE, 10000); startQuestTimer("30MinutesRemaining", 300000, null, player); } else if (event.equalsIgnoreCase("30MinutesRemaining")) { screenMessage(player, NpcStringId.N30_MINUTES_REMAIN, 10000); startQuestTimer("20minutesremaining", 600000, null, player); } else if (event.equalsIgnoreCase("20MinutesRemaining")) { screenMessage(player, NpcStringId.N20_MINUTES_REMAIN, 10000); startQuestTimer("10minutesremaining", 600000, null, player); } else if (event.equalsIgnoreCase("10MinutesRemaining")) { screenMessage(player, NpcStringId.STEWARD_WASTE_NO_TIME_PLEASE_HURRY, 10000); } else if (event.equalsIgnoreCase("End")) { screenMessage(player, NpcStringId.STEWARD_WAS_IT_INDEED_TOO_MUCH_TO_ASK, 10000); cleanUp(); } else if (event.equalsIgnoreCase("respawn")) { cleanUp(); } return super.onAdvEvent(event, npc, player); } @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet) { if (npc.getNpcId() == 29056) { cancelQuestTimer("30MinutesRemaining", null, _player); cancelQuestTimer("20MinutesRemaining", null, _player); cancelQuestTimer("10MinutesRemaining", null, _player); cancelQuestTimer("End", null, _player); for (L2Npc mob : _allMobs) { try { mob.getSpawn().stopRespawn(); mob.deleteMe(); } catch (Exception e) { _log.log(Level.SEVERE, "IceFairySirraManager: Failed deleting mob.", e); } } _allMobs.clear(); init(true); int respawnMinDelay = 43200000 * (int) (Config.RAID_MIN_RESPAWN_MULTIPLIER); int respawnMaxDelay = 129600000 * (int) (Config.RAID_MAX_RESPAWN_MULTIPLIER); int respawn_delay = getRandom(respawnMinDelay, respawnMaxDelay); saveGlobalQuestVar("Sirra_Respawn", String.valueOf(System.currentTimeMillis() + respawn_delay)); startQuestTimer("respawn", respawn_delay, null, null); screenMessage(killer, NpcStringId.STEWARD_PLEASE_RESTORE_THE_QUEENS_FORMER_APPEARANCE, 10000); } return super.onKill(npc, killer, isPet); } public static void main(String[] args) { new IceFairySirra(-1, "IceFairySirra", "ai"); } }