ThreadPool manager rework.
This commit is contained in:
		| @@ -8,7 +8,6 @@ | ||||
| </tr> | ||||
| </table> | ||||
| <br> | ||||
| <br> | ||||
| <font color="LEVEL">General:<font><br1> | ||||
| 	<table width="270" border="0" bgcolor="444444"> | ||||
| 		<tr> | ||||
| @@ -76,30 +75,5 @@ | ||||
| 			<td><font color="00FF00">%totalMem% MB</font></td> | ||||
| 		</tr> | ||||
| 	</table> | ||||
| <br> | ||||
| <font color="LEVEL">Thread - General (STP):<font><br1> | ||||
| 	%theardInfoGen% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - Effects (STP):<font><br1> | ||||
| 	%theardInfoEff% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - AI (STP):<font><br1> | ||||
| 	%theardInfoAi% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - Event (STP):<font><br1> | ||||
| 	%theardInfoEvent% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - Packets (TP):<font><br1> | ||||
| 	%theardInfoPack% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - I/O Packets (TP):<font><br1> | ||||
| 	%theardInfoIOPack% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - General Tasks (TP):<font><br1> | ||||
| 	%theardInfoGenTask% | ||||
| <br> | ||||
| <font color="LEVEL">Thread - Event Tasks (TP):<font><br1> | ||||
| 	%theardInfoEvnTask% | ||||
| <br> | ||||
| </center> | ||||
| </body></html> | ||||
| @@ -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); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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) | ||||
| 			{ | ||||
|   | ||||
| @@ -349,7 +349,7 @@ public final class AwakeningMaster extends AbstractNpcAI | ||||
| 			player.sendSkillList(); | ||||
| 		} | ||||
| 		 | ||||
| 		ThreadPoolManager.getInstance().scheduleGeneral(() -> | ||||
| 		ThreadPoolManager.schedule(() -> | ||||
| 		{ | ||||
| 			player.sendPacket(ExShowUsm.AWAKENING_END); | ||||
| 		}, 10000); | ||||
|   | ||||
| @@ -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()) | ||||
|   | ||||
| @@ -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; | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -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)) | ||||
|   | ||||
| @@ -90,6 +90,6 @@ public class NpcBufferAI implements Runnable | ||||
| 		 | ||||
| 		_npc.doCast(skill); | ||||
| 		 | ||||
| 		ThreadPoolManager.getInstance().scheduleGeneral(this, skill.getReuseDelay()); | ||||
| 		ThreadPoolManager.schedule(this, skill.getReuseDelay()); | ||||
| 	} | ||||
| } | ||||
| @@ -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); | ||||
| 	} | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -307,7 +307,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; | ||||
| @@ -747,7 +746,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()); | ||||
| 		} | ||||
| 		 | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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); | ||||
| 			} | ||||
|   | ||||
| @@ -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(); | ||||
| 				 | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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"); | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
|   | ||||
| @@ -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; | ||||
| 	} | ||||
| } | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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 | ||||
| 				{ | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -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++; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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++; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 MobiusDev
					MobiusDev