Dropped DecayTask from DecayTaskManager.

This commit is contained in:
MobiusDevelopment
2019-06-05 21:04:42 +00:00
parent 33c731ee3f
commit 16c80a88d6
13 changed files with 351 additions and 663 deletions

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }

View File

@ -18,11 +18,7 @@ package org.l2jmobius.gameserver.taskmanager;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
@ -31,17 +27,31 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
/** /**
* @author NosBit * @author Mobius
*/ */
public final class DecayTaskManager public final class DecayTaskManager
{ {
protected static final Logger LOGGER = Logger.getLogger(DecayTaskManager.class.getName()); private static final Map<Creature, Long> DECAY_SCHEDULES = new ConcurrentHashMap<>();
protected final Map<Creature, ScheduledFuture<?>> _decayTasks = new ConcurrentHashMap<>(); public DecayTaskManager()
{
ThreadPool.scheduleAtFixedRate(() ->
{
final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{
if (time > entry.getValue())
{
final Creature creature = entry.getKey();
DECAY_SCHEDULES.remove(creature);
creature.onDecay();
}
}
}, 0, 1000);
}
/** /**
* Adds a decay task for the specified character.<br> * Adds a decay task for the specified character.<br>
* <br>
* If the decay task already exists it cancels it and re-adds it. * If the decay task already exists it cancels it and re-adds it.
* @param creature the creature * @param creature the creature
*/ */
@ -67,17 +77,8 @@ public final class DecayTaskManager
delay += Config.SPOILED_CORPSE_EXTEND_TIME; delay += Config.SPOILED_CORPSE_EXTEND_TIME;
} }
// Remove entries that became null. // Add to decay schedules.
_decayTasks.entrySet().removeIf(Objects::isNull); DECAY_SCHEDULES.put(creature, System.currentTimeMillis() + (delay * 1000));
try
{
_decayTasks.putIfAbsent(creature, ThreadPool.schedule(new DecayTask(creature), delay * 1000));
}
catch (Exception e)
{
LOGGER.warning("DecayTaskManager add " + creature + " caused [" + e.getMessage() + "] exception.");
}
} }
/** /**
@ -86,11 +87,7 @@ public final class DecayTaskManager
*/ */
public void cancel(Creature creature) public void cancel(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.remove(creature); DECAY_SCHEDULES.remove(creature);
if (decayTask != null)
{
decayTask.cancel(false);
}
} }
/** /**
@ -100,30 +97,8 @@ public final class DecayTaskManager
*/ */
public long getRemainingTime(Creature creature) public long getRemainingTime(Creature creature)
{ {
final ScheduledFuture<?> decayTask = _decayTasks.get(creature); final Long time = DECAY_SCHEDULES.get(creature);
if (decayTask != null) return time != null ? time - System.currentTimeMillis() : Long.MAX_VALUE;
{
return decayTask.getDelay(TimeUnit.MILLISECONDS);
}
return Long.MAX_VALUE;
}
private class DecayTask implements Runnable
{
private final Creature _creature;
protected DecayTask(Creature creature)
{
_creature = creature;
}
@Override
public void run()
{
_decayTasks.remove(_creature);
_creature.onDecay();
}
} }
@Override @Override
@ -133,19 +108,20 @@ public final class DecayTaskManager
ret.append("============= DecayTask Manager Report ============"); ret.append("============= DecayTask Manager Report ============");
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks count: "); ret.append("Tasks count: ");
ret.append(_decayTasks.size()); ret.append(DECAY_SCHEDULES.size());
ret.append(Config.EOL); ret.append(Config.EOL);
ret.append("Tasks dump:"); ret.append("Tasks dump:");
ret.append(Config.EOL); ret.append(Config.EOL);
for (Entry<Creature, ScheduledFuture<?>> entry : _decayTasks.entrySet()) final long time = System.currentTimeMillis();
for (Entry<Creature, Long> entry : DECAY_SCHEDULES.entrySet())
{ {
ret.append("Class/Name: "); ret.append("Class/Name: ");
ret.append(entry.getKey().getClass().getSimpleName()); ret.append(entry.getKey().getClass().getSimpleName());
ret.append('/'); ret.append('/');
ret.append(entry.getKey().getName()); ret.append(entry.getKey().getName());
ret.append(" decay timer: "); ret.append(" decay timer: ");
ret.append(entry.getValue().getDelay(TimeUnit.MILLISECONDS)); ret.append(entry.getValue() - time);
ret.append(Config.EOL); ret.append(Config.EOL);
} }