/* * 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 com.l2jserver.gameserver.taskmanager; import java.util.Map; import java.util.NoSuchElementException; import java.util.logging.Logger; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.actor.L2Character; import javolution.util.FastMap; /** * @author la2 Lets drink to code! */ public class DecayTaskManager { protected static final Logger _log = Logger.getLogger(DecayTaskManager.class.getName()); protected Map _decayTasks = new FastMap().setShared(true); public static final int RAID_BOSS_DECAY_TIME = 30000; public static final int ATTACKABLE_DECAY_TIME = 8500; private DecayTaskManager() { ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new DecayScheduler(), 10000, 5000); } public static DecayTaskManager getInstance() { return SingletonHolder._instance; } public void addDecayTask(L2Character actor) { _decayTasks.put(actor, System.currentTimeMillis()); } public void addDecayTask(L2Character actor, int interval) { _decayTasks.put(actor, System.currentTimeMillis() + interval); } public void cancelDecayTask(L2Character actor) { try { _decayTasks.remove(actor); } catch (NoSuchElementException e) { } } private class DecayScheduler implements Runnable { protected DecayScheduler() { // Do nothing } public void run() { Long current = System.currentTimeMillis(); int delay; try { if (_decayTasks != null) for (L2Character actor : _decayTasks.keySet()) { if (actor.isRaid() && !actor.isRaidMinion()) delay = RAID_BOSS_DECAY_TIME; else delay = ATTACKABLE_DECAY_TIME; if ((current - _decayTasks.get(actor)) > delay) { actor.onDecay(); _decayTasks.remove(actor); } } } catch (Exception e) { // TODO: Find out the reason for exception. Unless caught here, // mob decay would stop. _log.warning(e.toString()); } } } @Override public String toString() { String ret = "============= DecayTask Manager Report ============\r\n"; ret += "Tasks count: " + _decayTasks.size() + "\r\n"; ret += "Tasks dump:\r\n"; Long current = System.currentTimeMillis(); for (L2Character actor : _decayTasks.keySet()) { ret += "Class/Name: " + actor.getClass().getSimpleName() + "/" + actor.getName() + " decay timer: " + (current - _decayTasks.get(actor)) + "\r\n"; } return ret; } /** * Read only */ public Map getTasks() { return _decayTasks; } @SuppressWarnings("synthetic-access") private static class SingletonHolder { protected static final DecayTaskManager _instance = new DecayTaskManager(); } }