/* * 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.taskmanager; import java.util.Map; import java.util.NoSuchElementException; import java.util.logging.Logger; import javolution.util.FastMap; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.instance.L2RaidBossInstance; /** * @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); private static DecayTaskManager _instance; public DecayTaskManager() { ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new DecayScheduler(),10000,5000); } public static DecayTaskManager getInstance() { if(_instance == null) _instance = new DecayTaskManager(); return _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 instanceof L2RaidBossInstance) delay = 30000; else delay = 8500; if((current - _decayTasks.get(actor)) > delay) { actor.onDecay(); _decayTasks.remove(actor); } } } catch (Throwable 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; } }