Index: C:/workspace/L2_GameServer/java/config/command-privileges.properties =================================================================== --- C:/workspace/L2_GameServer/java/config/command-privileges.properties (revision 1754) +++ C:/workspace/L2_GameServer/java/config/command-privileges.properties (working copy) @@ -61,6 +61,8 @@ ################### admin_itemcreate = 100 admin_create_item = 100 +admin_giveitem = 100 +admin_give_item = 100 ############## ### DELETE ### Index: C:/workspace/L2_GameServer/java/net/sf/l2j/loginserver/ClientThread.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/loginserver/ClientThread.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/loginserver/ClientThread.java (working copy) @@ -414,7 +414,7 @@ _bannedIPs.add(ip); int time = incorrectCount * incorrectCount * 1000; //System.out.println("Banning ip "+ip+" for "+time/1000.0+" seconds."); - ClientScheduler.getInstance().scheduleMed(new UnbanTask(ip), time); + ClientScheduler.getInstance().scheduleHigh(new UnbanTask(ip), time); } public static void addBannedIP(String ip) Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java (working copy) @@ -95,7 +95,7 @@ { _sessionId = 0x12345678; _connection = new Connection(this, socket, _cryptkey); - _autoSaveInDB = ClientScheduler.getInstance().scheduleLowAtFixedRate( + _autoSaveInDB = ClientScheduler.getInstance().scheduleMedAtFixedRate( new AutoSaveTask(), 5*60*1000L, 15*60*1000L ); } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/SelectorThread.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/SelectorThread.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/SelectorThread.java (working copy) @@ -139,7 +139,7 @@ if (Config.ASSERT) assert instance == null; if (Config.COUNT_PACKETS) { - packetMonitor = ClientScheduler.getInstance().scheduleLowAtFixedRate(new MonitorPackets(), 10000, 10000); + packetMonitor = ClientScheduler.getInstance().scheduleMedAtFixedRate(new MonitorPackets(), 10000, 10000); } instance = this; this._hostname = hostname; @@ -703,7 +703,7 @@ if(GameTimeController.getGameTicks() - player.getAttackEndTime() < 15 * GameTimeController.TICKS_PER_SECOND || player.isAttacked()) { c.onlyClose(); - ClientScheduler.getInstance().scheduleLow(new DisconnectionTask(c), 15000); + ClientScheduler.getInstance().scheduleMed(new DisconnectionTask(c), 15000); return; } } @@ -752,7 +752,7 @@ packetHistory.clear(); byteHistory.clear(); - packetMonitor = ClientScheduler.getInstance().scheduleLowAtFixedRate( + packetMonitor = ClientScheduler.getInstance().scheduleMedAtFixedRate( new Runnable() { public void run() Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/RequestRestartPoint.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/RequestRestartPoint.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/RequestRestartPoint.java (working copy) @@ -122,21 +122,21 @@ && castle.getSiege().checkIsAttacker(activeChar.getClan())) { // Schedule respawn delay for attacker - ClientScheduler.getInstance().scheduleLow(new DeathTask(activeChar), castle.getSiege().getAttackerRespawnDelay()); + ClientScheduler.getInstance().scheduleMed(new DeathTask(activeChar), castle.getSiege().getAttackerRespawnDelay()); sm.addString("You will be re-spawned in " + castle.getSiege().getAttackerRespawnDelay()/1000 + " seconds"); activeChar.sendPacket(sm); } else { // Schedule respawn delay for defender with penalty for CT lose - ClientScheduler.getInstance().scheduleLow(new DeathTask(activeChar), castle.getSiege().getDefenderRespawnDelay()); + ClientScheduler.getInstance().scheduleMed(new DeathTask(activeChar), castle.getSiege().getDefenderRespawnDelay()); sm.addString("You will be re-spawned in " + castle.getSiege().getDefenderRespawnDelay()/1000 + " seconds"); activeChar.sendPacket(sm); } return; } - ClientScheduler.getInstance().scheduleLow(new DeathTask(activeChar), 1); + ClientScheduler.getInstance().scheduleMed(new DeathTask(activeChar), 1); } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/model/L2Character.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -137,7 +137,7 @@ private boolean _IsSleeping = false; // Cannot move/attack until sleep timed out or monster is attacked private boolean _IsStunned = false; // Cannot move/attack until stun timed out private boolean _IsTeleporting = false; - private int _LastAttackChange = 0; + protected int _LastAttackChange = 0; private CharStat _Stat; private CharStatus _Status; private L2CharTemplate _Template; // The link on the L2CharTemplate object containing generic and static properties of this L2Character type (ex : Max HP, Speed...) @@ -438,7 +438,7 @@ else { // Cancel the action because the bow can't be re-use at this moment - ClientScheduler.getInstance().scheduleMed(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000); + ClientScheduler.getInstance().scheduleHigh(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000); ActionFailed af = new ActionFailed(); sendPacket(af); @@ -524,7 +524,7 @@ int reuse = weaponItem==null ? 0 : weaponItem.getAttackReuseDelay(); // Notify AI with EVT_READY_TO_ACT - ClientScheduler.getInstance().scheduleMed(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), sAtk+reuse); + ClientScheduler.getInstance().scheduleHigh(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), sAtk+reuse); } /** @@ -600,7 +600,7 @@ } // Create a new hit task with Medium priority - ClientScheduler.getInstance().scheduleMed(new HitTask(target, damage1, crit1, miss1, attack._soulshot, shld1), sAtk); + ClientScheduler.getInstance().scheduleHigh(new HitTask(target, damage1, crit1, miss1, attack._soulshot, shld1), sAtk); // Calculate and set the disable delay of the bow in function of the Attack Speed _disableBowAttackEndTime = (sAtk+reuse)/GameTimeController.MILLIS_IN_TICK + GameTimeController.getGameTicks(); @@ -672,10 +672,10 @@ } // Create a new hit task with Medium priority for hit 1 - ClientScheduler.getInstance().scheduleMed(new HitTask(target, damage1, crit1, miss1, attack._soulshot, shld1), 650); + ClientScheduler.getInstance().scheduleHigh(new HitTask(target, damage1, crit1, miss1, attack._soulshot, shld1), 650); // Create a new hit task with Medium priority for hit 2 with a higher delay - ClientScheduler.getInstance().scheduleMed(new HitTask(target, damage2, crit2, miss2, attack._soulshot, shld2), 1250); + ClientScheduler.getInstance().scheduleHigh(new HitTask(target, damage2, crit2, miss2, attack._soulshot, shld2), 1250); // Add those hits to the Server-Client packet Attack attack.addHit(target, damage1, miss1, crit1, shld1); @@ -2541,7 +2541,7 @@ protected L2CharacterAI _ai; /** Future Skill Cast */ - private Future _skillCast; + protected Future _skillCast; /** Char Coords from Client */ private int _clientX; @@ -3436,7 +3436,7 @@ // { // if (_currentAttackTask == null )//&& !isInCombat()) // { -// _currentAttackTask = ClientScheduler.getInstance().scheduleMed(new AttackTask(), 0); +// _currentAttackTask = ClientScheduler.getInstance().scheduleHigh(new AttackTask(), 0); // } // else // { Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/loginserverpackets/LoginServerBasePacket.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/loginserverpackets/LoginServerBasePacket.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/loginserverpackets/LoginServerBasePacket.java (working copy) @@ -18,6 +18,8 @@ */ package net.sf.l2j.gameserver.loginserverpackets; +import net.sf.l2j.gameserver.TaskPriority; + /** * @author -Wooden- * @@ -94,4 +96,6 @@ _off += length; return result; } + + public TaskPriority getPriority() { return TaskPriority.PR_URGENT; } } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfEscape.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfEscape.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfEscape.java (working copy) @@ -88,7 +88,7 @@ EscapeFinalizer ef = new EscapeFinalizer(activeChar, item.getItemId()); // continue execution later - activeChar.setSkillCast(ClientScheduler.getInstance().scheduleLow(ef, skill.getSkillTime())); + activeChar.setSkillCast(ClientScheduler.getInstance().scheduleMed(ef, skill.getSkillTime())); activeChar.setSkillCastEndTime(10+GameTimeController.getGameTicks()+skill.getSkillTime()/GameTimeController.MILLIS_IN_TICK); } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/MysteryPotion.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/MysteryPotion.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/MysteryPotion.java (working copy) @@ -59,7 +59,7 @@ activeChar.sendPacket(sm); MysteryPotionStop mp = new MysteryPotionStop(playable); - ClientScheduler.getInstance().scheduleLow(mp, _effectDuration); + ClientScheduler.getInstance().scheduleMed(mp, _effectDuration); } public class MysteryPotionStop implements Runnable Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/SoulCrystals.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/SoulCrystals.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/SoulCrystals.java (working copy) @@ -85,7 +85,7 @@ // Continue execution later CrystalFinalizer cf = new CrystalFinalizer(activeChar, target, crystalId); - ClientScheduler.getInstance().scheduleLow(cf, skill.getSkillTime()); + ClientScheduler.getInstance().scheduleMed(cf, skill.getSkillTime()); } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java (working copy) @@ -167,13 +167,13 @@ newpet.startFeed( false ); // continue execution in 1 seconds - ClientScheduler.getInstance().scheduleLow(new SummonFinalizer(activeChar, newpet), 900); + ClientScheduler.getInstance().scheduleMed(new SummonFinalizer(activeChar, newpet), 900); // if pet died of hunger last time it was summoned if ( newpet.getCurrentFed() <= 0 ) { // wait 1 minute for owner to feed - ClientScheduler.getInstance().scheduleLow(new FeedWait(activeChar, newpet), 60000); + ClientScheduler.getInstance().scheduleMed(new FeedWait(activeChar, newpet), 60000); } else { Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfResurrection.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfResurrection.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ScrollOfResurrection.java (working copy) @@ -141,7 +141,7 @@ activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false); //ResurrectFinalizer rf = new ResurrectFinalizer(target); // continue execution later - //ClientScheduler.getInstance().scheduleLow(rf, skill.getSkillTime() - 200); + //ClientScheduler.getInstance().scheduleMed(rf, skill.getSkillTime() - 200); } } } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java (working copy) @@ -64,7 +64,7 @@ EscapeFinalizer ef = new EscapeFinalizer(activeChar); // continue execution later - ClientScheduler.getInstance().scheduleLow(ef, unstuckTimer); + ClientScheduler.getInstance().scheduleMed(ef, unstuckTimer); return true; } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminCreateItem.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminCreateItem.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminCreateItem.java (working copy) @@ -27,6 +27,8 @@ import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.serverpackets.SystemMessage; +import net.sf.l2j.gameserver.model.L2Object; +import net.sf.l2j.gameserver.model.L2World; /** * This class handles following admin commands: @@ -39,7 +41,9 @@ private static String[] _adminCommands = { "admin_itemcreate", - "admin_create_item" + "admin_create_item", + "admin_giveitem", + "admin_give_item" }; private static final int REQUIRED_LEVEL = Config.GM_CREATE_ITEM; @@ -87,6 +91,49 @@ sm.addString("Wrong number entered."); activeChar.sendPacket(sm); } + } else if (command.startsWith("admin_giveitem") || command.startsWith("admin_give_item")) + { + try + { + String params = (command.startsWith("admin_give_item") ? command.substring(15) : command.substring(14)); + StringTokenizer st = new StringTokenizer(params); + if (st.countTokens() == 3) + { + L2PcInstance player = net.sf.l2j.gameserver.model.L2World.getInstance().getPlayer(st.nextToken()); + L2Object target = activeChar.getTarget(); + if (target instanceof L2PcInstance) + { + player = (L2PcInstance) target; + } + int itemId = Integer.parseInt(st.nextToken()); + int itemAmount = Integer.parseInt(st.nextToken()); + giveItem(player, itemId, itemAmount, activeChar); + SystemMessage sm = new SystemMessage(614); + sm.addString("Spawned " + itemAmount + "items number " + itemId + " in " + player + "'s inventory."); + activeChar.sendPacket(sm); + } + else if (st.countTokens() == 2) + { + L2PcInstance player = L2World.getInstance().getPlayer(st.nextToken()); + L2Object target = activeChar.getTarget(); + if (target instanceof L2PcInstance) + { + player = (L2PcInstance) target; + } + int itemId = Integer.parseInt(st.nextToken()); + giveItem(player, itemId, 1, activeChar); + SystemMessage sm = new SystemMessage(614); + sm.addString("Spawned item number " + itemId + " in " + player + "'s inventory."); + activeChar.sendPacket(sm); + } + + } + catch (StringIndexOutOfBoundsException e) + { + SystemMessage sm = new SystemMessage(614); + sm.addString("Error while creating item."); + activeChar.sendPacket(sm); + } } String target = (activeChar.getTarget() != null?activeChar.getTarget().getName():"no-target"); GMAudit.auditGMAction(activeChar.getName(), command, target, ""); @@ -127,4 +174,16 @@ adminReply.setHtml(replyMSG.toString()); activeChar.sendPacket(adminReply); } + + private void giveItem(L2PcInstance selectedplayer, int itemId, int itemAmount, L2PcInstance admin) + { + selectedplayer.getInventory().addItem("AdminGiveItem", itemId, itemAmount, selectedplayer, admin); + + ItemList il = new ItemList(selectedplayer, true); + selectedplayer.sendPacket(il); + + SystemMessage sm = new SystemMessage(614); + sm.addString("An Admin has spawned " + itemAmount + " item(s) number " + itemId + " in your inventory."); + selectedplayer.sendPacket(sm); + } } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/CastleUpdater.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/CastleUpdater.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/CastleUpdater.java (working copy) @@ -61,7 +61,7 @@ // re-run again in 1 hours CastleUpdater cu = new CastleUpdater(_clan, _RunCount); - ClientScheduler.getInstance().scheduleLow(cu, 3600000); + ClientScheduler.getInstance().scheduleMed(cu, 3600000); } } catch (Throwable e) { e.printStackTrace(); Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (working copy) @@ -242,7 +242,7 @@ // If not idle - create an AI task (schedule onEvtThink repeatedly) if (aiTask == null) { - aiTask = ClientScheduler.getInstance().scheduleLowAtFixedRate(this, 1000, 1000); + aiTask = ClientScheduler.getInstance().scheduleMedAtFixedRate(this, 1000, 1000); } } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2SiegeGuardAI.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2SiegeGuardAI.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2SiegeGuardAI.java (working copy) @@ -200,7 +200,7 @@ // If not idle - create an AI task (schedule onEvtThink repeatedly) if (aiTask == null) { - aiTask = ClientScheduler.getInstance().scheduleLowAtFixedRate(this, 1000, 1000); + aiTask = ClientScheduler.getInstance().scheduleMedAtFixedRate(this, 1000, 1000); } } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java (working copy) @@ -17,8 +17,8 @@ */ public class DecayTaskManager { - private Map _decayTasks = new FastMap().setShared(true); - private FastList _actorsToRemove = new FastList(); // put this as a field to avoid newing it every time + protected Map _decayTasks = new FastMap().setShared(true); + protected FastList _actorsToRemove = new FastList(); // put this as a field to avoid newing it every time public static DecayTaskManager _instance; @@ -54,7 +54,7 @@ catch(NoSuchElementException e){} } - private class DecayScheduler implements Runnable + protected class DecayScheduler implements Runnable { public void run() { Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/gameserverpackets/GameServerBasePacket.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/gameserverpackets/GameServerBasePacket.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/gameserverpackets/GameServerBasePacket.java (working copy) @@ -21,6 +21,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import net.sf.l2j.gameserver.TaskPriority; + /** * @author -Wooden- * @@ -118,5 +120,6 @@ return _bao.toByteArray(); } + public TaskPriority getPriority() { return TaskPriority.PR_HIGH; } public abstract byte[] getContent() throws IOException; } Index: C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/GameTimeController.java =================================================================== --- C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/GameTimeController.java (revision 1754) +++ C:/workspace/L2_GameServer/java/net/sf/l2j/gameserver/GameTimeController.java (working copy) @@ -72,8 +72,8 @@ _timer = new TimerThread(); _timer.start(); - ClientScheduler.getInstance().scheduleLowAtFixedRate(new TimerWatcher(), 0, 1000); - ClientScheduler.getInstance().scheduleLowAtFixedRate(new BroadcastSunState(), 0, 60 * 60 * 1000); + ClientScheduler.getInstance().scheduleMedAtFixedRate(new TimerWatcher(), 0, 1000); + ClientScheduler.getInstance().scheduleMedAtFixedRate(new BroadcastSunState(), 0, 60 * 60 * 1000); } public boolean isNowNight() @@ -147,7 +147,7 @@ // Create a task to update the _knownObject and _knowPlayers of each L2Character that finished its movement and of their already known L2Object // then notify AI with EVT_ARRIVED if (ended != null) - ClientScheduler.getInstance().scheduleLow(new MovingObjectArrived(ended), 10); + ClientScheduler.getInstance().scheduleMed(new MovingObjectArrived(ended), 10); }