Package com.l2jfrozen.gameserver.managers

Source Code of com.l2jfrozen.gameserver.managers.DayNightSpawnManager$SingletonHolder

/*
* 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 2, 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package com.l2jfrozen.gameserver.managers;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javolution.util.FastMap;

import com.l2jfrozen.gameserver.controllers.GameTimeController;
import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2RaidBossInstance;
import com.l2jfrozen.gameserver.model.spawn.L2Spawn;

/**
*
* @version $Revision: $ $Date: $
* @author godson
*/

public class DayNightSpawnManager {

  private static Logger _log = Logger.getLogger(DayNightSpawnManager.class
      .getName());

  private List<L2Spawn> _dayCreatures;
  private List<L2Spawn> _nightCreatures;
  private Map<L2Spawn, L2RaidBossInstance> _bosses;

  // private static int _currentState; // 0 = Day, 1 = Night

  public static DayNightSpawnManager getInstance() {
    return SingletonHolder._instance;
  }

  private DayNightSpawnManager() {
    _dayCreatures = new ArrayList<L2Spawn>();
    _nightCreatures = new ArrayList<L2Spawn>();
    _bosses = new FastMap<L2Spawn, L2RaidBossInstance>();

    _log.info("DayNightSpawnManager: Day/Night handler initialized");
  }

  public void addDayCreature(L2Spawn spawnDat) {
    _dayCreatures.add(spawnDat);
  }

  public void addNightCreature(L2Spawn spawnDat) {
    _nightCreatures.add(spawnDat);
  }

  /**
   * 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 : List with spawns must be unspawned Arg 2 :
   * List with spawns must be spawned Arg 3 : String for log info for
   * unspawned L2NpcInstance Arg 4 : String for log info for spawned
   * L2NpcInstance
   *
   * @param unSpawnCreatures
   * @param spawnCreatures
   * @param UnspawnLogInfo
   * @param SpawnLogInfo
   */
  private void spawnCreatures(List<L2Spawn> unSpawnCreatures,
      List<L2Spawn> spawnCreatures, String UnspawnLogInfo,
      String SpawnLogInfo) {
    try {
      if (!unSpawnCreatures.isEmpty()) {
        int i = 0;
        for (L2Spawn spawn : unSpawnCreatures) {
          if (spawn == null)
            continue;

          spawn.stopRespawn();
          L2NpcInstance last = spawn.getLastSpawn();
          if (last != null) {
            last.deleteMe();
            i++;
          }
        }
        _log.info("DayNightSpawnManager: Removed " + i + " "
            + UnspawnLogInfo + " creatures");
      }

      int i = 0;
      for (L2Spawn spawnDat : spawnCreatures) {
        if (spawnDat == null)
          continue;
        spawnDat.startRespawn();
        spawnDat.doSpawn();
        i++;
      }

      _log.info("DayNightSpawnManager: Spawned " + i + " " + SpawnLogInfo
          + " creatures");
    } catch (Exception e) {
      _log.log(Level.WARNING,
          "Error while spawning creatures: " + e.getMessage(), e);
    }
  }

  private void changeMode(int mode) {
    if (_nightCreatures.isEmpty() && _dayCreatures.isEmpty())
      return;

    switch (mode) {
    case 0:
      spawnDayCreatures();
      specialNightBoss(0);
      _log.info("DayNightSpawnManager: Spawning Day creatures.");
      break;
    case 1:
      spawnNightCreatures();
      specialNightBoss(1);
      _log.info("DayNightSpawnManager: Spawning Night creatures.");
      break;
    default:
      _log.severe(" [ERROR] [WARNING]DayNightSpawnManager: Wrong mode sent");
      break;
    }
  }

  public DayNightSpawnManager trim() {
    ((ArrayList<?>) _nightCreatures).trimToSize();
    ((ArrayList<?>) _dayCreatures).trimToSize();
    return this;
  }

  public void notifyChangeMode() {
    try {
      if (GameTimeController.getInstance().isNowNight())
        changeMode(1);
      else
        changeMode(0);
    } catch (Exception e) {
      _log.log(Level.WARNING,
          "Error while notifyChangeMode(): " + e.getMessage(), e);
    }
  }

  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) {
      _log.log(Level.WARNING,
          "Error while specialNoghtBoss(): " + e.getMessage(), e);
    }
  }

  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;
    }
    _bosses.put(spawnDat, null);

    return null;
  }

  @SuppressWarnings("synthetic-access")
  private static class SingletonHolder {
    protected static final DayNightSpawnManager _instance = new DayNightSpawnManager();
  }
}
TOP

Related Classes of com.l2jfrozen.gameserver.managers.DayNightSpawnManager$SingletonHolder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.