/* * 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 net.sf.l2j.gameserver.instancemanager; import java.util.Map; import java.util.logging.Logger; import javolution.util.FastMap; import net.sf.l2j.Config; import net.sf.l2j.gameserver.GameTimeController; import net.sf.l2j.gameserver.model.L2Spawn; import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2RaidBossInstance; /** * This class ... * * @version $Revision: $ $Date: $ * @author godson */ public class DayNightSpawnManager { private static Logger _log = Logger.getLogger(DayNightSpawnManager.class.getName()); private static DayNightSpawnManager _instance; private static Map _dayCreatures; private static Map _nightCreatures; private static Map _bosses; //private static int _currentState; // 0 = Day, 1 = Night public static DayNightSpawnManager getInstance() { if (_instance == null) _instance = new DayNightSpawnManager(); return _instance; } private DayNightSpawnManager() { _dayCreatures = new FastMap(); _nightCreatures = new FastMap(); _bosses = new FastMap(); _log.info("DayNightSpawnManager: Day/Night handler initialized"); } public void addDayCreature(L2Spawn spawnDat) { if (_dayCreatures.containsKey(spawnDat)) { _log.warning("DayNightSpawnManager: Spawn already added into day map"); return; } else _dayCreatures.put(spawnDat, null); } public void addNightCreature(L2Spawn spawnDat) { if (_nightCreatures.containsKey(spawnDat)) { _log.warning("DayNightSpawnManager: Spawn already added into night map"); return; } else _nightCreatures.put(spawnDat, null); } /* * Spawn Day Creatures, and Unspawn Night Creatures */ public void spawnDayCreatures(){ spawnCreatures(_nightCreatures,_dayCreatures, "night", "day"); } /* * Spawn Night Creatures, and Unspawn Day Creatures */ public void spawnNightCreatures(){ spawnCreatures(_dayCreatures,_nightCreatures, "day", "night"); } /* * Manage Spawn/Respawn * Arg 1 : Map with L2NpcInstance must be unspawned * Arg 2 : Map with L2NpcInstance must be spawned * Arg 3 : String for log info for unspawned L2NpcInstance * Arg 4 : String for log info for spawned L2NpcInstance */ private void spawnCreatures(Map UnSpawnCreatures,Map SpawnCreatures, String UnspawnLogInfo, String SpawnLogInfo){ try { if (UnSpawnCreatures.size() != 0) { int i = 0; for (L2NpcInstance dayCreature : UnSpawnCreatures.values()) { if (dayCreature == null) continue; dayCreature.getSpawn().stopRespawn(); dayCreature.deleteMe(); i++; } if (Config.DEBUG) _log.info("DayNightSpawnManager: Deleted " + i + " "+UnspawnLogInfo+" creatures"); } int i = 0; L2NpcInstance creature = null; for (L2Spawn spawnDat : SpawnCreatures.keySet()) { if (SpawnCreatures.get(spawnDat) == null) { creature = spawnDat.doSpawn(); if (creature == null) continue; SpawnCreatures.remove(spawnDat); SpawnCreatures.put(spawnDat, creature); creature.setCurrentHp(creature.getMaxHp()); creature.setCurrentMp(creature.getMaxMp()); creature.getSpawn().startRespawn(); if (creature.isDecayed()) creature.setDecayed(false); if (creature.isDead()) creature.doRevive(); } else { creature = SpawnCreatures.get(spawnDat); if (creature == null) continue; creature.getSpawn().startRespawn(); if (creature.isDecayed()) creature.setDecayed(false); if (creature.isDead()) creature.doRevive(); creature.setCurrentHp(creature.getMaxHp()); creature.setCurrentMp(creature.getMaxMp()); creature.spawnMe(); } i++; } if (Config.DEBUG) _log.info("DayNightSpawnManager: Spawning " + i + " "+SpawnLogInfo+" creatures"); }catch(Exception e){e.printStackTrace();} } private void changeMode(int mode) { if (_nightCreatures.size() == 0 && _dayCreatures.size() == 0) return; switch(mode) { case 0: spawnDayCreatures(); specialNightBoss(0); break; case 1: spawnNightCreatures(); specialNightBoss(1); break; default: _log.warning("DayNightSpawnManager: Wrong mode sent"); break; } } public void notifyChangeMode() { try{ if (GameTimeController.getInstance().isNowNight()) changeMode(1); else changeMode(0); }catch(Exception e){e.printStackTrace();} } public void cleanUp() { _nightCreatures.clear(); _dayCreatures.clear(); _bosses.clear(); } private void specialNightBoss(int mode) { try{ for (L2Spawn spawn : _bosses.keySet()) { L2RaidBossInstance boss = _bosses.get(spawn); if (boss == null && mode == 1) { boss = (L2RaidBossInstance)spawn.doSpawn(); RaidBossSpawnManager.getInstance().notifySpawnNightBoss(boss); _bosses.remove(spawn); _bosses.put(spawn, boss); continue; } if (boss == null && mode == 0) continue; if(boss.getNpcId() == 25328 && boss.getRaidStatus().equals(RaidBossSpawnManager.StatusEnum.ALIVE)) handleHellmans(boss, mode); return; } }catch(Exception e){e.printStackTrace();} } private void handleHellmans(L2RaidBossInstance boss, int mode) { switch(mode) { case 0: boss.deleteMe(); _log.info("DayNightSpawnManager: Deleting Hellman raidboss"); break; case 1: boss.spawnMe(); _log.info("DayNightSpawnManager: Spawning Hellman raidboss"); break; } } public L2RaidBossInstance handleBoss(L2Spawn spawnDat) { if(_bosses.containsKey(spawnDat)) return _bosses.get(spawnDat); if (GameTimeController.getInstance().isNowNight()) { L2RaidBossInstance raidboss = (L2RaidBossInstance)spawnDat.doSpawn(); _bosses.put(spawnDat, raidboss); return raidboss; } else _bosses.put(spawnDat, null); return null; } }