ThreadPool manager rework.

This commit is contained in:
MobiusDev
2017-08-23 05:23:31 +00:00
parent 374c53df4b
commit b77de360af
718 changed files with 3180 additions and 7193 deletions

View File

@@ -127,7 +127,7 @@ public final class DenOfEvil extends AbstractNpcAI
zone.addSkill(skillId, skillLevel + 1);
if (skillLevel == 3) // 3+1=4
{
ThreadPoolManager.getInstance().scheduleAi(new KashaDestruction(zone), 2 * 60 * 1000l);
ThreadPoolManager.schedule(new KashaDestruction(zone), 2 * 60 * 1000l);
zone.broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.DEFEAT_KASHA_S_EYES_TO_LIFT_THE_GREAT_CURSE));
}
else if (skillLevel == 2)
@@ -140,7 +140,7 @@ public final class DenOfEvil extends AbstractNpcAI
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
ThreadPoolManager.getInstance().scheduleAi(new RespawnNewEye(npc.getLocation()), 15000);
ThreadPoolManager.schedule(new RespawnNewEye(npc.getLocation()), 15000);
final L2EffectZone zone = ZoneManager.getInstance().getZone(npc, L2EffectZone.class);
if (zone == null)
{
@@ -213,7 +213,7 @@ public final class DenOfEvil extends AbstractNpcAI
final L2Npc npc = (L2Npc) character;
if (CommonUtil.contains(EYE_IDS, npc.getId()))
{
ThreadPoolManager.getInstance().scheduleAi(new RespawnNewEye(npc.getLocation()), 15000);
ThreadPoolManager.schedule(new RespawnNewEye(npc.getLocation()), 15000);
}
}
}

View File

@@ -129,11 +129,11 @@ public final class Parade extends AbstractNpcAI
{
// Starts at 8:00 and repeats every 6 hours.
final long diff = timeLeftMilli(8, 0, 0), cycle = 3600000L;
ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Start(), diff, cycle);
ThreadPoolManager.scheduleAtFixedRate(new Start(), diff, cycle);
// Test - Starts 3 minutes after server startup and repeats every 20 minutes.
// final long diff = timeLeftMilli(8, 0, 0), cycle = 600000L;
// ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Start(), 180000L, cycle);
// ThreadPoolManager.scheduleAtFixedRate(new Start(), 180000L, cycle);
_log.info("Fantasy Isle: Parade starting at " + new SimpleDateFormat("yyyy/MM/dd HH:mm").format(System.currentTimeMillis() + diff) + " and is scheduled each next " + (cycle / 3600000) + " hours.");
}
@@ -171,9 +171,9 @@ public final class Parade extends AbstractNpcAI
public void run()
{
load();
spawnTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Spawn(), 0, 5000);
deleteTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Delete(), 10000, 1000);
cleanTask = ThreadPoolManager.getInstance().scheduleGeneral(new Clean(), 420000);
spawnTask = ThreadPoolManager.scheduleAtFixedRate(new Spawn(), 0, 5000);
deleteTask = ThreadPoolManager.scheduleAtFixedRate(new Delete(), 10000, 1000);
cleanTask = ThreadPoolManager.schedule(new Clean(), 420000);
}
}

View File

@@ -141,7 +141,7 @@ public final class GainakSiege extends AbstractNpcAI
final L2SiegeZone zone = ZoneManager.getInstance().getZone(npc, L2SiegeZone.class);
if ((zone != null) && (zone.getId() == 60019) && zone.isActive())
{
ThreadPoolManager.getInstance().scheduleAi(new RespawnNewAssassin(npc.getLocation()), 60000);
ThreadPoolManager.schedule(new RespawnNewAssassin(npc.getLocation()), 60000);
}
return super.onKill(npc, killer, isSummon);
}

View File

@@ -256,7 +256,7 @@ public final class FourSepulchers extends AbstractNpcAI implements IGameXmlReade
if ((doorInfo[0] == sepulcherId) && (doorInfo[1] == currentWave))
{
openDoor(doorInfo[2], 0);
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
closeDoor(doorInfo[2], 0);
}, 15000);
@@ -578,7 +578,7 @@ public final class FourSepulchers extends AbstractNpcAI implements IGameXmlReade
showHtmlFile(player, npcId + "-OK.html", npc, null);
// Kick all players when/if time is over
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
ZoneManager.getInstance().getZoneById(MANAGER_ZONES.get(npcId)).oustAllPlayers();
}, TIME_ATTACK * 60 * 1000);

View File

@@ -109,7 +109,7 @@ public class AltarOfSacrifice extends AbstractNpcAI
private void sendMessage(L2Npc npc, NpcStringId npcString, int delay)
{
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
if (npc != null)
{

View File

@@ -349,7 +349,7 @@ public final class AwakeningMaster extends AbstractNpcAI
player.sendSkillList();
}
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
player.sendPacket(ExShowUsm.AWAKENING_END);
}, 10000);

View File

@@ -174,7 +174,7 @@ public class HarnakUndergroundRuinsZone extends AbstractNpcAI
_templates.stream().forEach(t -> t.spawn(g -> String.valueOf(g.getName()).equalsIgnoreCase(zoneName.concat("_demonic")), null));
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 600, 0, NpcStringId.DEMONIC_SYSTEM_ACTIVATED)));
currentInfo.setZoneStage(7);
ThreadPoolManager.getInstance().scheduleGeneral(new changeZoneStage(zone), 600000); // 10min
ThreadPoolManager.schedule(new changeZoneStage(zone), 600000); // 10min
}
else
{
@@ -202,7 +202,7 @@ public class HarnakUndergroundRuinsZone extends AbstractNpcAI
if (currentInfo.getZoneStage() < 6)
{
currentInfo.setZoneStage(currentInfo.getZoneStage() + 1);
ThreadPoolManager.getInstance().scheduleGeneral(new changeZoneStage(zone), 5000);
ThreadPoolManager.schedule(new changeZoneStage(zone), 5000);
}
}
catch (Exception e)
@@ -248,7 +248,7 @@ public class HarnakUndergroundRuinsZone extends AbstractNpcAI
if (calcPoints >= 300)
{
calcPoints = 300;
ThreadPoolManager.getInstance().scheduleGeneral(new changeZoneStage(currentZone.getKey()), 1000);
ThreadPoolManager.schedule(new changeZoneStage(currentZone.getKey()), 1000);
}
currentInfo.setCurrentPoint(calcPoints);
for (L2PcInstance player : currentZone.getKey().getPlayersInside())

View File

@@ -258,7 +258,7 @@ public final class QueenAnt extends AbstractNpcAI
{
((L2MonsterInstance) npc).getMinionList().spawnMinions(npc.getParameters().getMinionList("Privates"));
}
_task = ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new QueenAntTask(), 5 * 1000, 5 * 1000);
_task = ThreadPoolManager.scheduleAtFixedRate(new QueenAntTask(), 5 * 1000, 5 * 1000);
break;
}
}

View File

@@ -701,7 +701,7 @@ public final class EnergySeeds extends AbstractNpcAI
public void scheduleRespawn(long waitTime)
{
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
// if the AI is inactive, do not spawn the NPC
if (isSeedActive(_seedId))

View File

@@ -90,6 +90,6 @@ public class NpcBufferAI implements Runnable
_npc.doCast(skill);
ThreadPoolManager.getInstance().scheduleGeneral(this, skill.getReuseDelay());
ThreadPoolManager.schedule(this, skill.getReuseDelay());
}
}

View File

@@ -53,7 +53,7 @@ public final class NpcBuffers extends AbstractNpcAI
final NpcBufferData data = _npcBuffers.getNpcBuffer(npc.getId());
for (NpcBufferSkillData skill : data.getSkills())
{
ThreadPoolManager.getInstance().scheduleAi(new NpcBufferAI(npc, skill), skill.getInitialDelay());
ThreadPoolManager.schedule(new NpcBufferAI(npc, skill), skill.getInitialDelay());
}
return super.onSpawn(npc);
}

View File

@@ -112,7 +112,7 @@ public final class Elpies extends Event
Broadcast.toAllOnlinePlayers("Help us exterminate them!");
Broadcast.toAllOnlinePlayers("You have " + EVENT_DURATION_MINUTES + " minutes!");
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(() ->
_eventTask = ThreadPoolManager.schedule(() ->
{
Broadcast.toAllOnlinePlayers("Time is up!");
eventStop();

View File

@@ -138,7 +138,7 @@ public final class Race extends Event
Broadcast.toAllOnlinePlayers("Visit Event Manager in Dion village and signup, you have " + _time_register + " min before Race Start...");
// Schedule Event end
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(() -> StartRace(), _time_register * 60 * 1000);
_eventTask = ThreadPoolManager.schedule(() -> StartRace(), _time_register * 60 * 1000);
return true;
@@ -181,7 +181,7 @@ public final class Race extends Event
}
}
// Schedule timeup for Race
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(() -> timeUp(), _time_race * 60 * 1000);
_eventTask = ThreadPoolManager.schedule(() -> timeUp(), _time_race * 60 * 1000);
}
@Override

View File

@@ -308,7 +308,6 @@ import handlers.telnethandlers.server.ServerAbort;
import handlers.telnethandlers.server.ServerRestart;
import handlers.telnethandlers.server.ServerShutdown;
import handlers.telnethandlers.server.Status;
import handlers.telnethandlers.server.ThreadPoolDebug;
import handlers.usercommandhandlers.ChannelDelete;
import handlers.usercommandhandlers.ChannelInfo;
import handlers.usercommandhandlers.ChannelLeave;
@@ -749,7 +748,6 @@ public class MasterHandler
TelnetServer.getInstance().addHandler(new ServerRestart());
TelnetServer.getInstance().addHandler(new ServerShutdown());
TelnetServer.getInstance().addHandler(new Status());
TelnetServer.getInstance().addHandler(new ThreadPoolDebug());
TelnetServer.getInstance().addHandler(new handlers.telnethandlers.server.Debug());
}

View File

@@ -107,7 +107,7 @@ public class AdminMonsterRace implements IAdminCommandHandler
activeChar.sendPacket(spk);
activeChar.broadcastPacket(spk);
ThreadPoolManager.getInstance().scheduleGeneral(new RunRace(codes, activeChar), 5000);
ThreadPoolManager.schedule(new RunRace(codes, activeChar), 5000);
}
}
@@ -137,7 +137,7 @@ public class AdminMonsterRace implements IAdminCommandHandler
final MonRaceInfo spk = new MonRaceInfo(codes[2][0], codes[2][1], MonsterRace.getInstance().getMonsters(), MonsterRace.getInstance().getSpeeds());
activeChar.sendPacket(spk);
activeChar.broadcastPacket(spk);
ThreadPoolManager.getInstance().scheduleGeneral(new RunEnd(activeChar), 30000);
ThreadPoolManager.schedule(new RunEnd(activeChar), 30000);
}
}

View File

@@ -20,14 +20,12 @@ import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.GameServer;
import com.l2jmobius.gameserver.GameTimeController;
import com.l2jmobius.gameserver.ThreadPoolManager;
import com.l2jmobius.gameserver.cache.HtmCache;
import com.l2jmobius.gameserver.data.xml.impl.AdminData;
import com.l2jmobius.gameserver.handler.IAdminCommandHandler;
@@ -72,14 +70,6 @@ public class AdminServerInfo implements IAdminCommandHandler
html.replace("%usedMem%", (RunTime.maxMemory() / mb) - (((RunTime.maxMemory() - RunTime.totalMemory()) + RunTime.freeMemory()) / mb));
html.replace("%freeMem%", ((RunTime.maxMemory() - RunTime.totalMemory()) + RunTime.freeMemory()) / mb);
html.replace("%totalMem%", Runtime.getRuntime().maxMemory() / 1048576);
html.replace("%theardInfoGen%", buildTheardInfo("GENERAL"));
html.replace("%theardInfoEff%", buildTheardInfo("EFFECTS"));
html.replace("%theardInfoAi%", buildTheardInfo("AI"));
html.replace("%theardInfoEvent%", buildTheardInfo("EVENT"));
html.replace("%theardInfoPack%", buildTheardInfo("PACKETS"));
html.replace("%theardInfoIOPack%", buildTheardInfo("IOPACKETS"));
html.replace("%theardInfoGenTask%", buildTheardInfo("GENERAL_TASKS"));
html.replace("%theardInfoEvnTask%", buildTheardInfo("EVENT_TASKS"));
activeChar.sendPacket(html);
}
return true;
@@ -96,22 +86,6 @@ public class AdminServerInfo implements IAdminCommandHandler
return days + " Days, " + hours + " Hours, " + TimeUnit.MILLISECONDS.toMinutes(time) + " Minutes";
}
private String buildTheardInfo(String category)
{
final StringBuilder tb = new StringBuilder();
tb.append("<table width=\"270\" border=\"0\" bgcolor=\"444444\">");
for (Entry<String, Object> info : ThreadPoolManager.getInstance().getStats(category).getSet().entrySet())
{
tb.append("<tr>");
tb.append("<td>" + info.getKey() + ":</td>");
tb.append("<td><font color=\"00FF00\">" + info.getValue() + "</font></td>");
tb.append("</tr>");
}
tb.append("</table>");
return tb.toString();
}
private int getPlayersCount(String type)
{
switch (type)

View File

@@ -46,7 +46,7 @@ public class AdminTest implements IAdminCommandHandler
{
if (command.equals("admin_stats"))
{
for (String line : ThreadPoolManager.getInstance().getStats())
for (String line : ThreadPoolManager.getStats())
{
activeChar.sendMessage(line);
}

View File

@@ -57,7 +57,7 @@ public class ClassChange extends AbstractEffect
{
final L2PcInstance player = effected.getActingPlayer();
// TODO: FIX ME - Executing 1 second later otherwise interupted exception during storeCharBase()
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
final int activeClass = player.getClassId().getId();

View File

@@ -67,7 +67,7 @@ public final class ServitorShare extends AbstractEffect
if (effected != null)
{
ThreadPoolManager.getInstance().scheduleEffect(new ScheduledEffectExitTask(effected, info.getSkill().getId()), 100);
ThreadPoolManager.schedule(new ScheduledEffectExitTask(effected, info.getSkill().getId()), 100);
}
}
}

View File

@@ -162,7 +162,7 @@ public class JailHandler implements IPunishmentHandler
OlympiadManager.getInstance().removeDisconnectedCompetitor(player);
}
ThreadPoolManager.getInstance().scheduleGeneral(new TeleportTask(player, L2JailZone.getLocationIn()), 2000);
ThreadPoolManager.schedule(new TeleportTask(player, L2JailZone.getLocationIn()), 2000);
// Open a Html message to inform the player
final NpcHtmlMessage msg = new NpcHtmlMessage();
@@ -198,7 +198,7 @@ public class JailHandler implements IPunishmentHandler
*/
private static void removeFromPlayer(L2PcInstance player)
{
ThreadPoolManager.getInstance().scheduleGeneral(new TeleportTask(player, L2JailZone.getLocationOut()), 2000);
ThreadPoolManager.schedule(new TeleportTask(player, L2JailZone.getLocationOut()), 2000);
// Open a Html message to inform the player
final NpcHtmlMessage msg = new NpcHtmlMessage();

View File

@@ -68,7 +68,7 @@ public class Debug implements ITelnetCommand
@Override
public String getUsage()
{
return "Debug <decay/packetsend/PacketTP/IOPacketTP/GeneralTP/full>";
return "Debug <decay/packetsend/full>";
}
@Override
@@ -108,90 +108,6 @@ public class Debug implements ITelnetCommand
player.sendPacket(sp);
return "Packet has been sent!";
}
case "PacketTP":
{
final String str = ThreadPoolManager.getInstance().getPacketStats();
int i = 0;
File f = new File("./log/StackTrace-PacketTP-" + i + ".txt");
while (f.exists())
{
i++;
f = new File("./log/StackTrace-PacketTP-" + i + ".txt");
}
f.getParentFile().mkdirs();
try
{
Files.write(f.toPath(), str.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
}
catch (IOException e)
{
LOGGER.log(Level.WARNING, "Couldn't write packet tp.", e);
}
return str;
}
case "IOPacketTP":
{
final String str = ThreadPoolManager.getInstance().getIOPacketStats();
int i = 0;
File f = new File("./log/StackTrace-IOPacketTP-" + i + ".txt");
while (f.exists())
{
i++;
f = new File("./log/StackTrace-IOPacketTP-" + i + ".txt");
}
f.getParentFile().mkdirs();
try
{
Files.write(f.toPath(), str.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
}
catch (IOException e)
{
LOGGER.log(Level.WARNING, "Couldn't write packet tp.", e);
}
return str;
}
case "GeneralTP":
{
final String str = ThreadPoolManager.getInstance().getGeneralStats();
int i = 0;
File f = new File("./log/StackTrace-GeneralTP-" + i + ".txt");
while (f.exists())
{
i++;
f = new File("./log/StackTrace-GeneralTP-" + i + ".txt");
}
f.getParentFile().mkdirs();
try
{
Files.write(f.toPath(), str.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
}
catch (IOException e)
{
LOGGER.log(Level.WARNING, "Couldn't write packet tp.", e);
}
return str;
}
case "GeneralScheduledTP":
{
final String str = ThreadPoolManager.getInstance().getGeneralStats();
int i = 0;
File f = new File("./log/StackTrace-GeneralScheduledTP-" + i + ".txt");
while (f.exists())
{
i++;
f = new File("./log/StackTrace-GeneralScheduledTP-" + i + ".txt");
}
f.getParentFile().mkdirs();
try
{
Files.write(f.toPath(), str.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
}
catch (IOException e)
{
LOGGER.log(Level.WARNING, "Couldn't write packet tp.", e);
}
return str;
}
case "full":
{
final Calendar cal = Calendar.getInstance();
@@ -283,7 +199,7 @@ public class Debug implements ITelnetCommand
}
sb.append("\r\n## Thread Pool Manager Statistics ##\r\n");
for (String line : ThreadPoolManager.getInstance().getStats())
for (String line : ThreadPoolManager.getStats())
{
sb.append(line);
sb.append("\r\n");

View File

@@ -42,9 +42,9 @@ public class Performance implements ITelnetCommand
@Override
public String handle(ChannelHandlerContext ctx, String[] args)
{
ThreadPoolManager.getInstance().purge();
// ThreadPoolManager.purge();
final StringBuilder sb = new StringBuilder();
for (String line : ThreadPoolManager.getInstance().getStats())
for (String line : ThreadPoolManager.getStats())
{
sb.append(line + Config.EOL);
}

View File

@@ -42,9 +42,9 @@ public class Purge implements ITelnetCommand
@Override
public String handle(ChannelHandlerContext ctx, String[] args)
{
ThreadPoolManager.getInstance().purge();
ThreadPoolManager.purge();
final StringBuilder sb = new StringBuilder("STATUS OF THREAD POOLS AFTER PURGE COMMAND:" + Config.EOL);
for (String line : ThreadPoolManager.getInstance().getStats())
for (String line : ThreadPoolManager.getStats())
{
sb.append(line + Config.EOL);
}

View File

@@ -1,171 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.telnethandlers.server;
import java.lang.reflect.Field;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.ThreadPoolManager;
import com.l2jmobius.gameserver.ThreadPoolManager.RunnableWrapper;
import com.l2jmobius.gameserver.network.telnet.ITelnetCommand;
import io.netty.channel.ChannelHandlerContext;
/**
* @author UnAfraid
*/
public class ThreadPoolDebug implements ITelnetCommand
{
private static final Logger LOGGER = Logger.getLogger(ThreadPoolDebug.class.getName());
@Override
public String getCommand()
{
return "threadpooldebug";
}
@Override
public String getUsage()
{
return "threadpooldebug [effect, general, ai, events]";
}
@Override
public String handle(ChannelHandlerContext ctx, String[] args)
{
String pool = "_generalScheduledThreadPool";
if (args.length > 0)
{
switch (args[0])
{
case "effect":
{
pool = "_effectsScheduledThreadPool";
break;
}
case "general":
{
pool = "_generalScheduledThreadPool";
break;
}
case "ai":
{
pool = "_aiScheduledThreadPool";
break;
}
case "events":
{
pool = "_eventScheduledThreadPool";
break;
}
default:
{
return args[0] + " is not implemented!";
}
}
}
final ScheduledThreadPoolExecutor executor = getObject(ThreadPoolManager.class, ThreadPoolManager.getInstance(), pool, ScheduledThreadPoolExecutor.class);
if (executor == null)
{
return "Couldn't retreive " + pool + "!";
}
Class<?> adapterClass;
try
{
adapterClass = Class.forName("java.util.concurrent.Executors$RunnableAdapter");
}
catch (Exception e)
{
return e.getMessage();
}
final Map<String, Integer> tasks = new HashMap<>();
for (Runnable run : executor.getQueue())
{
try
{
if (run instanceof FutureTask)
{
final Object callableObject = getObject(FutureTask.class, run, "callable", Object.class);
final Object taskObject = getObject(adapterClass, callableObject, "task", Object.class);
if (taskObject instanceof RunnableWrapper)
{
final Runnable task = getObject(RunnableWrapper.class, taskObject, "_r", Runnable.class);
final String name = task.getClass().getName();
final int times = tasks.containsKey(name) ? tasks.get(name) : 0;
tasks.put(name, times + 1);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
final StringBuilder sb = new StringBuilder();
sb.append(pool + " queue size: " + executor.getQueue().size() + Config.EOL);
tasks.entrySet().stream().sorted(Comparator.comparingInt(Entry::getValue)).forEach(entry -> sb.append("Class: " + entry.getKey() + " = " + entry.getValue() + Config.EOL));
return sb.toString();
}
private static <T> T getObject(Class<?> sourceClass, Object sourceInstance, String fieldName, Class<T> targetClass)
{
try
{
final Field field = sourceClass.getDeclaredField(fieldName);
// Mark down if field was accessible
final boolean isAccessible = field.isAccessible();
// Enforce accessible to retrieve the object associated with this field
if (!isAccessible)
{
field.setAccessible(true);
}
// Get the object
final Object fieldObject = field.get(sourceInstance);
// Restore the original accessible state.
field.setAccessible(isAccessible);
// Make sure the object is the one we expect to be
if (targetClass.isInstance(fieldObject))
{
return targetClass.cast(fieldObject);
}
}
catch (Exception e)
{
LOGGER.log(Level.WARNING, "Error while retrieving object of " + sourceInstance.getClass().getName() + "." + fieldName, e);
}
return null;
}
}

View File

@@ -22,7 +22,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import com.l2jmobius.commons.util.CommonUtil;
import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -203,7 +202,7 @@ public final class CastleDungeon extends AbstractInstance
*/
private void spawnRaid(Instance instance)
{
final ScheduledFuture<?> spawnTask = ThreadPoolManager.getInstance().scheduleGeneral(() ->
final ScheduledFuture<?> spawnTask = ThreadPoolManager.schedule(() ->
{
// Get template id of raid
final int npcId;
@@ -230,7 +229,7 @@ public final class CastleDungeon extends AbstractInstance
// Unset spawn task reference
instance.setParameter("spawnTask", null);
}, 2, TimeUnit.MINUTES);
}, 2 * 60 * 1000); // 2 minutes
// Save timer to instance world
instance.setParameter("spawnTask", spawnTask);

View File

@@ -111,7 +111,7 @@ public final class ChamberOfDelusion extends AbstractInstance
changeRoom(instance);
// Start banish task
final ScheduledFuture<?> banishTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() ->
final ScheduledFuture<?> banishTask = ThreadPoolManager.scheduleAtFixedRate(() ->
{
if (instance.getRemainingTime() < 60000)
{
@@ -410,7 +410,7 @@ public final class ChamberOfDelusion extends AbstractInstance
final long nextInterval = (bossRoom) ? 60000L : (ROOM_CHANGE_INTERVAL + getRandom(ROOM_CHANGE_RANDOM_TIME)) * 1000L;
if (world.getRemainingTime() > nextInterval)
{
final ScheduledFuture<?> roomChangeTask = ThreadPoolManager.getInstance().scheduleGeneral(() ->
final ScheduledFuture<?> roomChangeTask = ThreadPoolManager.schedule(() ->
{
try
{

View File

@@ -22,7 +22,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import com.l2jmobius.commons.util.CommonUtil;
import com.l2jmobius.gameserver.ThreadPoolManager;
@@ -226,7 +225,7 @@ public final class FortressDungeon extends AbstractInstance
*/
private void spawnRaid(Instance instance)
{
final ScheduledFuture<?> spawnTask = ThreadPoolManager.getInstance().scheduleGeneral(() ->
final ScheduledFuture<?> spawnTask = ThreadPoolManager.schedule(() ->
{
// Get template id of raid
final int npcId;
@@ -247,7 +246,7 @@ public final class FortressDungeon extends AbstractInstance
// Unset spawn task reference
instance.setParameter("spawnTask", null);
}, 2, TimeUnit.MINUTES);
}, 2 * 60 * 1000); // 2 minutes
// Save timer to instance world
instance.setParameter("spawnTask", spawnTask);

View File

@@ -168,7 +168,7 @@ public final class Q10292_SevenSignsGirlOfDoubt extends Quest
creature1.setRandomWalking(true);
final L2Npc creature2 = addSpawn(CREATURE_OF_THE_DUSK2, 89524, -238131, -9632, 56, false, 0, false, player.getInstanceId());
creature2.setRandomWalking(true);
ThreadPoolManager.getInstance().scheduleGeneral(() ->
ThreadPoolManager.schedule(() ->
{
creature1.deleteMe();
creature2.deleteMe();

View File

@@ -291,11 +291,11 @@ public abstract class AirShipController extends AbstractNpcAI
playMovie(_dockedShip.getPassengers(), _movie);
}
ThreadPoolManager.getInstance().scheduleGeneral(_decayTask, 1000);
ThreadPoolManager.schedule(_decayTask, 1000);
}
else
{
_departSchedule = ThreadPoolManager.getInstance().scheduleGeneral(_departTask, DEPART_INTERVAL);
_departSchedule = ThreadPoolManager.schedule(_departTask, DEPART_INTERVAL);
}
}
}

View File

@@ -248,7 +248,7 @@ public final class AirShipGludioGracia extends AbstractNpcAI implements Runnable
case 1:
// _ship.teleToLocation(-167874, 256731, -509, 41035, false);
_ship.setOustLoc(OUST_GRACIA);
ThreadPoolManager.getInstance().scheduleGeneral(this, 5000);
ThreadPoolManager.schedule(this, 5000);
break;
case 2:
_ship.executePath(WARPGATE_TO_GRACIA);
@@ -257,7 +257,7 @@ public final class AirShipGludioGracia extends AbstractNpcAI implements Runnable
broadcastInGracia(NpcStringId.THE_REGULARLY_SCHEDULED_AIRSHIP_HAS_ARRIVED_IT_WILL_DEPART_FOR_THE_ADEN_CONTINENT_IN_1_MINUTE);
_ship.setInDock(GRACIA_DOCK_ID);
_ship.oustPlayers();
ThreadPoolManager.getInstance().scheduleGeneral(this, 60000);
ThreadPoolManager.schedule(this, 60000);
break;
case 4:
broadcastInGracia(NpcStringId.THE_REGULARLY_SCHEDULED_AIRSHIP_THAT_FLIES_TO_THE_ADEN_CONTINENT_HAS_DEPARTED);
@@ -267,7 +267,7 @@ public final class AirShipGludioGracia extends AbstractNpcAI implements Runnable
case 5:
// _ship.teleToLocation(-157261, 255664, 221, 64781, false);
_ship.setOustLoc(OUST_GLUDIO);
ThreadPoolManager.getInstance().scheduleGeneral(this, 5000);
ThreadPoolManager.schedule(this, 5000);
break;
case 6:
_ship.executePath(WARPGATE_TO_GLUDIO);
@@ -276,7 +276,7 @@ public final class AirShipGludioGracia extends AbstractNpcAI implements Runnable
broadcastInGludio(NpcStringId.THE_REGULARLY_SCHEDULED_AIRSHIP_HAS_ARRIVED_IT_WILL_DEPART_FOR_THE_GRACIA_CONTINENT_IN_1_MINUTE);
_ship.setInDock(GLUDIO_DOCK_ID);
_ship.oustPlayers();
ThreadPoolManager.getInstance().scheduleGeneral(this, 60000);
ThreadPoolManager.schedule(this, 60000);
break;
}
_cycle++;

View File

@@ -175,15 +175,15 @@ public class BoatGludinRune implements Runnable
{
case 0:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], LEAVE_GLUDIN5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 1:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], LEAVE_GLUDIN1);
ThreadPoolManager.getInstance().scheduleGeneral(this, 40000);
ThreadPoolManager.schedule(this, 40000);
break;
case 2:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], LEAVE_GLUDIN0);
ThreadPoolManager.getInstance().scheduleGeneral(this, 20000);
ThreadPoolManager.schedule(this, 20000);
break;
case 3:
BoatManager.getInstance().dockShip(BoatManager.GLUDIN_HARBOR, false);
@@ -191,19 +191,19 @@ public class BoatGludinRune implements Runnable
_boat.broadcastPacket(GLUDIN_SOUND);
_boat.payForRide(7905, 1, -90015, 150422, -3610);
_boat.executePath(GLUDIN_TO_RUNE);
ThreadPoolManager.getInstance().scheduleGeneral(this, 250000);
ThreadPoolManager.schedule(this, 250000);
break;
case 4:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_RUNE15);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 5:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_RUNE10);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 6:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_RUNE5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 7:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_RUNE1);
@@ -222,7 +222,7 @@ public class BoatGludinRune implements Runnable
_shoutCount = 0;
}
ThreadPoolManager.getInstance().scheduleGeneral(this, 5000);
ThreadPoolManager.schedule(this, 5000);
return;
}
_boat.executePath(RUNE_DOCK);
@@ -231,19 +231,19 @@ public class BoatGludinRune implements Runnable
BoatManager.getInstance().dockShip(BoatManager.RUNE_HARBOR, true);
BoatManager.getInstance().broadcastPackets(RUNE_DOCK[0], GLUDIN_DOCK[0], ARRIVED_AT_RUNE, ARRIVED_AT_RUNE_2);
_boat.broadcastPacket(RUNE_SOUND);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 10:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], LEAVE_RUNE5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 11:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], LEAVE_RUNE1);
ThreadPoolManager.getInstance().scheduleGeneral(this, 40000);
ThreadPoolManager.schedule(this, 40000);
break;
case 12:
BoatManager.getInstance().broadcastPacket(RUNE_DOCK[0], GLUDIN_DOCK[0], LEAVE_RUNE0);
ThreadPoolManager.getInstance().scheduleGeneral(this, 20000);
ThreadPoolManager.schedule(this, 20000);
break;
case 13:
BoatManager.getInstance().dockShip(BoatManager.RUNE_HARBOR, false);
@@ -251,19 +251,19 @@ public class BoatGludinRune implements Runnable
_boat.broadcastPacket(RUNE_SOUND);
_boat.payForRide(7904, 1, 34513, -38009, -3640);
_boat.executePath(RUNE_TO_GLUDIN);
ThreadPoolManager.getInstance().scheduleGeneral(this, 60000);
ThreadPoolManager.schedule(this, 60000);
break;
case 14:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], ARRIVAL_GLUDIN15);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 15:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], ARRIVAL_GLUDIN10);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 16:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], ARRIVAL_GLUDIN5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 17:
BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], RUNE_DOCK[0], ARRIVAL_GLUDIN1);
@@ -282,7 +282,7 @@ public class BoatGludinRune implements Runnable
_shoutCount = 0;
}
ThreadPoolManager.getInstance().scheduleGeneral(this, 5000);
ThreadPoolManager.schedule(this, 5000);
return;
}
_boat.executePath(GLUDIN_DOCK);
@@ -291,7 +291,7 @@ public class BoatGludinRune implements Runnable
BoatManager.getInstance().dockShip(BoatManager.GLUDIN_HARBOR, true);
BoatManager.getInstance().broadcastPackets(GLUDIN_DOCK[0], RUNE_DOCK[0], ARRIVED_AT_GLUDIN, ARRIVED_AT_GLUDIN_2);
_boat.broadcastPacket(GLUDIN_SOUND);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
}
_shoutCount = 0;

View File

@@ -118,44 +118,44 @@ public class BoatInnadrilTour implements Runnable
{
case 0:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, LEAVE_INNADRIL5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 1:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, LEAVE_INNADRIL1);
ThreadPoolManager.getInstance().scheduleGeneral(this, 40000);
ThreadPoolManager.schedule(this, 40000);
break;
case 2:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, LEAVE_INNADRIL0);
ThreadPoolManager.getInstance().scheduleGeneral(this, 20000);
ThreadPoolManager.schedule(this, 20000);
break;
case 3:
BoatManager.getInstance().broadcastPackets(DOCK, DOCK, LEAVING_INNADRIL, INNADRIL_SOUND);
_boat.payForRide(0, 1, 107092, 219098, -3952);
_boat.executePath(TOUR);
ThreadPoolManager.getInstance().scheduleGeneral(this, 650000);
ThreadPoolManager.schedule(this, 650000);
break;
case 4:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, ARRIVAL20);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 5:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, ARRIVAL15);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 6:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, ARRIVAL10);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
case 7:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, ARRIVAL5);
ThreadPoolManager.getInstance().scheduleGeneral(this, 240000);
ThreadPoolManager.schedule(this, 240000);
break;
case 8:
BoatManager.getInstance().broadcastPacket(DOCK, DOCK, ARRIVAL1);
break;
case 9:
BoatManager.getInstance().broadcastPackets(DOCK, DOCK, ARRIVED_AT_INNADRIL, INNADRIL_SOUND);
ThreadPoolManager.getInstance().scheduleGeneral(this, 300000);
ThreadPoolManager.schedule(this, 300000);
break;
}
_cycle++;

View File

@@ -117,7 +117,7 @@ public class BoatRunePrimeval implements Runnable
break;
case 1:
BoatManager.getInstance().broadcastPackets(PRIMEVAL_DOCK, RUNE_DOCK[0], ARRIVED_AT_PRIMEVAL, ARRIVED_AT_PRIMEVAL_2, PRIMEVAL_SOUND);
ThreadPoolManager.getInstance().scheduleGeneral(this, 180000);
ThreadPoolManager.schedule(this, 180000);
break;
case 2:
BoatManager.getInstance().broadcastPackets(PRIMEVAL_DOCK, RUNE_DOCK[0], LEAVING_PRIMEVAL, PRIMEVAL_SOUND);
@@ -138,7 +138,7 @@ public class BoatRunePrimeval implements Runnable
_shoutCount = 0;
}
ThreadPoolManager.getInstance().scheduleGeneral(this, 5000);
ThreadPoolManager.schedule(this, 5000);
return;
}
_boat.executePath(RUNE_DOCK);
@@ -146,7 +146,7 @@ public class BoatRunePrimeval implements Runnable
case 4:
BoatManager.getInstance().dockShip(BoatManager.RUNE_HARBOR, true);
BoatManager.getInstance().broadcastPackets(RUNE_DOCK[0], PRIMEVAL_DOCK, ARRIVED_AT_RUNE, ARRIVED_AT_RUNE_2, RUNE_SOUND);
ThreadPoolManager.getInstance().scheduleGeneral(this, 180000);
ThreadPoolManager.schedule(this, 180000);
break;
}
_shoutCount = 0;