From c1126213cc51831004c98121b0c738a67bae16e9 Mon Sep 17 00:00:00 2001 From: ronancpl Date: Thu, 14 Dec 2017 11:08:55 -0200 Subject: [PATCH] Server broadcastMessage to worlds & MapleQuestItemFetcher update Fixed a bug with the map drop mechanics sometimes permitting over the max drop count in certain circumstances. Fixed server broadcastMessage always broadcasting packets at world 0, even if the caller is from another world id. Improved the MapleQuestItemFetcher, now displaying expired quests alongside the reported info. --- docs/mychanges_ptbr.txt | 6 ++- src/client/MapleCharacter.java | 7 ++-- src/client/autoban/AutobanFactory.java | 2 +- src/client/command/Commands.java | 28 +++++++------- src/net/server/Server.java | 12 +++--- .../channel/handlers/ItemRewardHandler.java | 2 +- .../handlers/PlayerLoggedinHandler.java | 2 +- .../channel/handlers/ReportHandler.java | 8 ++-- .../channel/handlers/UseCashItemHandler.java | 14 ++++--- .../handlers/login/CreateCharHandler.java | 2 +- src/scripting/npc/NPCConversationManager.java | 2 +- src/server/MapleItemInformationProvider.java | 2 +- src/server/expeditions/MapleExpedition.java | 2 +- src/server/maps/MapleMap.java | 35 +++++++++++------- src/server/maps/MapleTVEffect.java | 6 +-- src/tools/LogHelper.java | 2 +- .../dist/MapleQuestItemFetcher.jar | Bin 143164 -> 143574 bytes .../MapleQuestItemFetcher/lib/QuestReport.txt | 18 ++------- .../nbproject/private/private.xml | 4 +- .../MapleQuestItemFetcher.java | 28 ++++++++++---- 20 files changed, 99 insertions(+), 83 deletions(-) diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index e3fa0db244..1324c99121 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -720,5 +720,7 @@ Corrigido 3o job de Cygnus. Removido UI que aponta erroneamente "Stat Upgrade" nos níveis 15, 20, 25 e 30. Adicionado comando "droplimit", cuja funcionalidade é informar ao jogador a quantidade de drops no mapa em contraste com o limite permitido. -11 Dezembro 2017, -Resolvido bug onde contador do drops do mapa não atualizaria seu valor em casos onde reatores consomem itens ou ao se aplicar comandos como "cleardrops". \ No newline at end of file +11 - 12 Dezembro 2017, +Resolvido bug onde contador do drops do mapa não atualizaria seu valor em casos onde reatores consomem itens ou ao se aplicar comandos como "cleardrops". +Corrigido server enviando packets com BroadcastMessage somente para o world 0, ao invés de ser para o world alvo. +MapleQuestItemFetcher agora mostra quests já expiradas no relatório. \ No newline at end of file diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 286896d6df..4309648509 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -6606,8 +6606,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { public void sendPolice(String text) { String message = getName() + " received this - " + text; - if (Server.getInstance().isGmOnline()) { //Alert and log if a GM is online - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip(message)); + if (Server.getInstance().isGmOnline(this.getWorld())) { //Alert and log if a GM is online + Server.getInstance().broadcastGMMessage(this.getWorld(), MaplePacketCreator.sendYellowTip(message)); FilePrinter.printError("autobanwarning.txt", message + "\r\n"); } else { //Auto DC and log if no GM is online client.disconnect(false, false); @@ -7656,7 +7656,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { client.disconnect(false, false); } }, 5000); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, MapleCharacter.makeMapleReadable(this.name) + " was autobanned for " + reason)); + + Server.getInstance().broadcastGMMessage(this.getWorld(), MaplePacketCreator.serverNotice(6, MapleCharacter.makeMapleReadable(this.name) + " was autobanned for " + reason)); } public void block(int reason, int days, String desc) { diff --git a/src/client/autoban/AutobanFactory.java b/src/client/autoban/AutobanFactory.java index 66e166a8ff..1d385a587a 100644 --- a/src/client/autoban/AutobanFactory.java +++ b/src/client/autoban/AutobanFactory.java @@ -91,7 +91,7 @@ public enum AutobanFactory { if (chr != null && MapleLogger.ignored.contains(chr.getName())){ return; } - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip((chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason)); + Server.getInstance().broadcastGMMessage((chr != null ? chr.getWorld() : 0), MaplePacketCreator.sendYellowTip((chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason)); } } diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java index d219193b83..a13cb42af9 100644 --- a/src/client/command/Commands.java +++ b/src/client/command/Commands.java @@ -551,8 +551,8 @@ public class Commands { break; } String message = joinStringFrom(sub, 1); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[GM MESSAGE]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(1, message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[GM MESSAGE]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(1, message)); FilePrinter.printError("gm.txt", MapleCharacter.makeMapleReadable(player.getName()) + ": " + message + "\r\n"); player.dropMessage(5, "Your message '" + message + "' was sent to GMs."); player.dropMessage(5, tips[Randomizer.nextInt(tips.length)]); @@ -565,8 +565,8 @@ public class Commands { break; } message = joinStringFrom(sub, 1); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[BUG]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(1, message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[BUG]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(1, message)); FilePrinter.printError("bug.txt", MapleCharacter.makeMapleReadable(player.getName()) + ": " + message + "\r\n"); player.dropMessage(5, "Your bug '" + message + "' was submitted successfully to our developers. Thank you!"); break; @@ -881,7 +881,7 @@ public class Commands { if(victim != null) { victim.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300166), victim.getPosition()); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, player.getName() + " used !bomb on " + victim.getName())); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, player.getName() + " used !bomb on " + victim.getName())); } else { player.message("Player '" + sub[1] + "' could not be found on this world."); } @@ -1598,7 +1598,7 @@ public class Commands { } player.yellowMessage(victim.getName() + " is " + (!monitored ? "now being monitored." : "no longer being monitored.")); String message = player.getName() + (!monitored ? " has started monitoring " : " has stopped monitoring ") + victim.getName() + "."; - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, message)); break; case "monitors": @@ -1625,7 +1625,7 @@ public class Commands { } player.yellowMessage(victim.getName() + " is " + (!monitored_ ? "now being ignored." : "no longer being ignored.")); String message_ = player.getName() + (!monitored_ ? " has started ignoring " : " has stopped ignoring ") + victim.getName() + "."; - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, message_)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, message_)); break; case "ignored": @@ -1754,7 +1754,7 @@ public class Commands { break; case "expeds": - for (Channel ch : Server.getInstance().getChannelsFromWorld(0)) { + for (Channel ch : Server.getInstance().getChannelsFromWorld(c.getWorld())) { if (ch.getExpeditions().size() == 0) { player.yellowMessage("No Expeditions in Channel " + ch.getId()); continue; @@ -1789,7 +1789,7 @@ public class Commands { victim = cserv.getPlayerStorage().getCharacterByName(sub[1]); if(victim != null) { victim.setHpMp(0); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, player.getName() + " used !kill on " + victim.getName())); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, player.getName() + " used !kill on " + victim.getName())); } else { player.message("Player '" + sub[1] + "' could not be found on this channel."); } @@ -1831,11 +1831,11 @@ public class Commands { break; case "notice": - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, "[Notice] " + joinStringFrom(sub, 1))); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, "[Notice] " + joinStringFrom(sub, 1))); break; case "rip": - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, "[RIP]: " + joinStringFrom(sub, 1))); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, "[RIP]: " + joinStringFrom(sub, 1))); break; case "openportal": @@ -1964,10 +1964,10 @@ public class Commands { rip.getClient().disconnect(false, false); } }, 5000); //5 Seconds - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned.")); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned.")); } else if (MapleCharacter.ban(ign, reason, false)) { c.announce(MaplePacketCreator.getGMEffect(4, (byte) 0)); - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned.")); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, "[RIP]: " + ign + " has been banned.")); } else { c.announce(MaplePacketCreator.getGMEffect(6, (byte) 1)); } @@ -2513,7 +2513,7 @@ public class Commands { } } String message = player.getName() + " used !saveall."; - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, message)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, message)); player.message("All players saved successfully."); break; diff --git a/src/net/server/Server.java b/src/net/server/Server.java index 70d4d57e3d..0282c68fbe 100644 --- a/src/net/server/Server.java +++ b/src/net/server/Server.java @@ -688,20 +688,20 @@ public class Server implements Runnable { worlda.reloadGuildSummary(); } - public void broadcastMessage(final byte[] packet) { - for (Channel ch : getChannelsFromWorld(0)) { + public void broadcastMessage(int world, final byte[] packet) { + for (Channel ch : getChannelsFromWorld(world)) { ch.broadcastPacket(packet); } } - public void broadcastGMMessage(final byte[] packet) { - for (Channel ch : getChannelsFromWorld(0)) { + public void broadcastGMMessage(int world, final byte[] packet) { + for (Channel ch : getChannelsFromWorld(world)) { ch.broadcastGMPacket(packet); } } - public boolean isGmOnline() { - for (Channel ch : getChannelsFromWorld(0)) { + public boolean isGmOnline(int world) { + for (Channel ch : getChannelsFromWorld(world)) { for (MapleCharacter player : ch.getPlayerStorage().getAllCharacters()) { if (player.isGM()){ return true; diff --git a/src/net/server/channel/handlers/ItemRewardHandler.java b/src/net/server/channel/handlers/ItemRewardHandler.java index eecdd3bbdc..1d40cf261a 100644 --- a/src/net/server/channel/handlers/ItemRewardHandler.java +++ b/src/net/server/channel/handlers/ItemRewardHandler.java @@ -67,7 +67,7 @@ public final class ItemRewardHandler extends AbstractMaplePacketHandler { String msg = reward.worldmsg; msg.replaceAll("/name", c.getPlayer().getName()); msg.replaceAll("/item", ii.getName(reward.itemid)); - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, msg)); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, msg)); } break; } diff --git a/src/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/net/server/channel/handlers/PlayerLoggedinHandler.java index 79a4ad6f93..1446ea5e9b 100644 --- a/src/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -281,7 +281,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler { } */ if (player.isGM()){ - Server.getInstance().broadcastGMMessage(MaplePacketCreator.earnTitleMessage((player.gmLevel() < 6 ? "GM " : "Admin ") + player.getName() + " has logged in")); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.earnTitleMessage((player.gmLevel() < 6 ? "GM " : "Admin ") + player.getName() + " has logged in")); } } diff --git a/src/net/server/channel/handlers/ReportHandler.java b/src/net/server/channel/handlers/ReportHandler.java index 4493b06821..17a28596d4 100644 --- a/src/net/server/channel/handlers/ReportHandler.java +++ b/src/net/server/channel/handlers/ReportHandler.java @@ -58,7 +58,7 @@ public final class ReportHandler extends AbstractMaplePacketHandler { c.announce(MaplePacketCreator.reportResponse((byte) 2)); return; } - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, victim + " was reported for: " + description)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, victim + " was reported for: " + description)); addReport(c.getPlayer().getId(), MapleCharacter.getIdByName(victim), 0, description, null); } else if (type == 1) { String chatlog = slea.readMapleAsciiString(); @@ -74,10 +74,10 @@ public final class ReportHandler extends AbstractMaplePacketHandler { return; } } - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, victim + " was reported for: " + description)); - addReport(c.getPlayer().getId() ,MapleCharacter.getIdByName(victim), reason, description, chatlog); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, victim + " was reported for: " + description)); + addReport(c.getPlayer().getId(), MapleCharacter.getIdByName(victim), reason, description, chatlog); } else { - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, c.getPlayer().getName() + " is probably packet editing. Got unknown report type, which is impossible.")); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, c.getPlayer().getName() + " is probably packet editing. Got unknown report type, which is impossible.")); } } diff --git a/src/net/server/channel/handlers/UseCashItemHandler.java b/src/net/server/channel/handlers/UseCashItemHandler.java index 8e1159c586..7270271784 100644 --- a/src/net/server/channel/handlers/UseCashItemHandler.java +++ b/src/net/server/channel/handlers/UseCashItemHandler.java @@ -277,7 +277,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { } break; case 2: // Super megaphone - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + slea.readMapleAsciiString(), (slea.readByte() != 0))); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + slea.readMapleAsciiString(), (slea.readByte() != 0))); break; case 5: // Maple TV int tvType = itemId % 10; @@ -309,7 +309,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { } slea.readInt(); if (megassenger) { - Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + builder.toString(), ear)); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + builder.toString(), ear)); } if (!MapleTVEffect.isActive()) { new MapleTVEffect(player, victim, messages, tvType); @@ -334,7 +334,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { return; } } - Server.getInstance().broadcastMessage(MaplePacketCreator.itemMegaphone(msg, whisper, c.getChannel(), item)); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.itemMegaphone(msg, whisper, c.getChannel(), item)); break; case 7: //triple megaphone int lines = slea.readByte(); @@ -347,7 +347,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { msg2[i] = medal + c.getPlayer().getName() + " : " + slea.readMapleAsciiString(); } whisper = slea.readByte() == 1; - Server.getInstance().broadcastMessage(MaplePacketCreator.getMultiMegaphone(msg2, c.getChannel(), whisper)); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.getMultiMegaphone(msg2, c.getChannel(), whisper)); break; } remove(c, itemId); @@ -475,11 +475,13 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { for (int i = 0; i < 4; i++) { lines.add(slea.readMapleAsciiString()); } - Server.getInstance().broadcastMessage(MaplePacketCreator.getAvatarMega(c.getPlayer(), medal, c.getChannel(), itemId, lines, (slea.readByte() != 0))); + + final int world = c.getWorld(); + Server.getInstance().broadcastMessage(world, MaplePacketCreator.getAvatarMega(c.getPlayer(), medal, c.getChannel(), itemId, lines, (slea.readByte() != 0))); TimerManager.getInstance().schedule(new Runnable() { @Override public void run() { - Server.getInstance().broadcastMessage(MaplePacketCreator.byeAvatarMega()); + Server.getInstance().broadcastMessage(world, MaplePacketCreator.byeAvatarMega()); } }, 1000 * 10); remove(c, itemId); diff --git a/src/net/server/handlers/login/CreateCharHandler.java b/src/net/server/handlers/login/CreateCharHandler.java index 53dd4b6c14..010126b249 100644 --- a/src/net/server/handlers/login/CreateCharHandler.java +++ b/src/net/server/handlers/login/CreateCharHandler.java @@ -131,6 +131,6 @@ public final class CreateCharHandler extends AbstractMaplePacketHandler { return; } c.announce(MaplePacketCreator.addNewCharEntry(newchar)); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[NEW CHAR]: " + c.getAccountName() + " has created a new character with IGN " + name)); + Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[NEW CHAR]: " + c.getAccountName() + " has created a new character with IGN " + name)); } } \ No newline at end of file diff --git a/src/scripting/npc/NPCConversationManager.java b/src/scripting/npc/NPCConversationManager.java index 0303ce66ba..090d063194 100644 --- a/src/scripting/npc/NPCConversationManager.java +++ b/src/scripting/npc/NPCConversationManager.java @@ -385,7 +385,7 @@ public class NPCConversationManager extends AbstractPlayerInteraction { LogHelper.logGacha(getPlayer(), item.getId(), map); if (item.getTier() > 0){ //Uncommon and Rare - Server.getInstance().broadcastMessage(MaplePacketCreator.gachaponMessage(itemGained, map, getPlayer())); + Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.gachaponMessage(itemGained, map, getPlayer())); } } diff --git a/src/server/MapleItemInformationProvider.java b/src/server/MapleItemInformationProvider.java index 6c8c6935a3..20cc979404 100644 --- a/src/server/MapleItemInformationProvider.java +++ b/src/server/MapleItemInformationProvider.java @@ -1488,7 +1488,7 @@ public class MapleItemInformationProvider { if (!EquipSlot.getFromTextSlot(islot).isAllowed(dst, isCash(id))) { equip.wear(false); String itemName = MapleItemInformationProvider.getInstance().getName(equip.getItemId()); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[WARNING]: " + chr.getName() + " tried to equip " + itemName + " into slot " + dst + ".")); + Server.getInstance().broadcastGMMessage(chr.getWorld(), MaplePacketCreator.sendYellowTip("[WARNING]: " + chr.getName() + " tried to equip " + itemName + " into slot " + dst + ".")); AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to forcibly equip an item."); FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to equip " + itemName + " into " + dst + " slot.\r\n"); return false; diff --git a/src/server/expeditions/MapleExpedition.java b/src/server/expeditions/MapleExpedition.java index 317cac29df..2b86343323 100644 --- a/src/server/expeditions/MapleExpedition.java +++ b/src/server/expeditions/MapleExpedition.java @@ -133,7 +133,7 @@ public class MapleExpedition { broadcastExped(MaplePacketCreator.removeClock()); broadcastExped(MaplePacketCreator.serverNotice(6, "[Expedition] The expedition has started! Good luck, brave heroes!")); startTime = System.currentTimeMillis(); - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[Expedition] " + type.toString() + " Expedition started with leader: " + leader.getName())); + Server.getInstance().broadcastGMMessage(leader.getWorld(), MaplePacketCreator.serverNotice(6, "[Expedition] " + type.toString() + " Expedition started with leader: " + leader.getName())); } public String addMember(MapleCharacter player) { diff --git a/src/server/maps/MapleMap.java b/src/server/maps/MapleMap.java index 58897f6401..0ef92dc950 100644 --- a/src/server/maps/MapleMap.java +++ b/src/server/maps/MapleMap.java @@ -708,21 +708,22 @@ public class MapleMap { return droppedItemCount.get(); } - private void instantiateItemDrop(MapleMapItem mdrop) { + private synchronized void instantiateItemDrop(MapleMapItem mdrop) { if(droppedItemCount.get() >= ServerConstants.ITEM_LIMIT_ON_MAP) { MapleMapObject mapobj; - objectWLock.lock(); - try { - mapobj = registeredDrops.remove(0).get(); - while(mapobj == null) { + do { + objectWLock.lock(); + try { mapobj = registeredDrops.remove(0).get(); + while(mapobj == null) { + if(registeredDrops.isEmpty()) break; + mapobj = registeredDrops.remove(0).get(); + } + } finally { + objectWLock.unlock(); } - } finally { - objectWLock.unlock(); - } - - makeDisappearItemFromMap(mapobj); + } while (!makeDisappearItemFromMap(mapobj)); } objectWLock.lock(); @@ -2806,24 +2807,30 @@ public class MapleMap { return null; } - public void makeDisappearItemFromMap(MapleMapObject mapobj) { + public boolean makeDisappearItemFromMap(MapleMapObject mapobj) { if(mapobj instanceof MapleMapItem) { - makeDisappearItemFromMap((MapleMapItem) mapobj); + return makeDisappearItemFromMap((MapleMapItem) mapobj); + } else { + return mapobj == null; // no drop to make disappear... } } - public void makeDisappearItemFromMap(MapleMapItem mapitem) { + public boolean makeDisappearItemFromMap(MapleMapItem mapitem) { if (mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) { mapitem.lockItem(); try { if (mapitem.isPickedUp()) { - return; + return true; } + MapleMap.this.pickItemDrop(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem); + return true; } finally { mapitem.unlockItem(); } } + + return false; } private class ActivateItemReactor implements Runnable { diff --git a/src/server/maps/MapleTVEffect.java b/src/server/maps/MapleTVEffect.java index 6a01fd4277..f11d3090df 100644 --- a/src/server/maps/MapleTVEffect.java +++ b/src/server/maps/MapleTVEffect.java @@ -57,8 +57,8 @@ public class MapleTVEffect { Server server = Server.getInstance(); ACTIVE = activity; if (ACTIVE) { - server.broadcastMessage(MaplePacketCreator.enableTV()); - server.broadcastMessage(MaplePacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner)); + server.broadcastMessage(user.getWorld(), MaplePacketCreator.enableTV()); + server.broadcastMessage(user.getWorld(), MaplePacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner)); int delay = 15000; if (type == 4) { delay = 30000; @@ -72,7 +72,7 @@ public class MapleTVEffect { } }, delay); } else { - server.broadcastMessage(MaplePacketCreator.removeTV()); + server.broadcastMessage(user.getWorld(), MaplePacketCreator.removeTV()); } } } diff --git a/src/tools/LogHelper.java b/src/tools/LogHelper.java index e7e80c1bba..39903c3698 100644 --- a/src/tools/LogHelper.java +++ b/src/tools/LogHelper.java @@ -36,7 +36,7 @@ public class LogHelper { } public static void logExpedition(MapleExpedition expedition) { - Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(6, expedition.getType().toString() + " Expedition with leader " + expedition.getLeader().getName() + " finished after " + getTimeString(expedition.getStartTime()))); + Server.getInstance().broadcastGMMessage(expedition.getLeader().getWorld(), MaplePacketCreator.serverNotice(6, expedition.getType().toString() + " Expedition with leader " + expedition.getLeader().getName() + " finished after " + getTimeString(expedition.getStartTime()))); String log = expedition.getType().toString() + " EXPEDITION\r\n"; log += getTimeString(expedition.getStartTime()) + "\r\n"; diff --git a/tools/MapleQuestItemFetcher/dist/MapleQuestItemFetcher.jar b/tools/MapleQuestItemFetcher/dist/MapleQuestItemFetcher.jar index 59e6ab4f35ba027bb99818044262930e3d8ead6d..eecb39f117b1348fc8034a4f2c7f0d8ee3d07d60 100644 GIT binary patch delta 12014 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 delta 11636 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 6945 4031861 : 6944 -> 6945 4031871 : 6350 -> 28344 +4032324 : 21736 -> 21737 4032339 : 0 -> 21303 @@ -110,7 +111,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB 4031220 - 9210 4031225 - 3606 4031226 - 9321 -4031227 - 4103 +4031227 - 4103 EXPIRED 4031230 - 3619 4031231 - 3620 4031235 - 3607 @@ -233,6 +234,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB 4031812 - 4950 4031833 - 9946 4031837 - 9945 +4031839 - 2162 4031881 - 4484 4031894 - 2214 4031921 - 4646 @@ -288,8 +290,6 @@ ITEMS WITH NO QUEST DROP DATA ON DB 4032318 - 21718 4032319 - 21723 4032321 - 21727 -4032322 - 21731 -4032324 - 21737 4032325 - 21752 4032326 - 21752 4032331 - 21601 @@ -313,13 +313,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB 4032437 - 28321 4032443 - 28317 4032496 - 28238 -4032511 - 3718 4032512 - 3720 -4032513 - 3722 -4032514 - 3727 -4032516 - 3735 -4032517 - 3740 -4032518 - 3743 4161000 - 9322 @@ -340,12 +334,6 @@ COMPLETE QUEST ITEMS WITH ZERO QUANTITY 2054: 4031028 -2162: - 4031839 - -2164: - 4031840 - 2167: 4031841 diff --git a/tools/MapleQuestItemFetcher/nbproject/private/private.xml b/tools/MapleQuestItemFetcher/nbproject/private/private.xml index 6807a2ba19..531edc4876 100644 --- a/tools/MapleQuestItemFetcher/nbproject/private/private.xml +++ b/tools/MapleQuestItemFetcher/nbproject/private/private.xml @@ -2,6 +2,8 @@ - + + file:/C:/Nexon/MapleSolaxia/HeavenMS/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java + diff --git a/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java b/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java index 5986f3e5ba..8231c38585 100644 --- a/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java +++ b/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java @@ -61,7 +61,7 @@ import tools.Pair; * * Running it should generate a report file under "lib" folder with the search results. * - * Estimated parse time: 1.5 minute + * Estimated parse time: 1 minute */ public class MapleQuestItemFetcher { static MapleItemInformationProvider ii; @@ -91,6 +91,7 @@ public class MapleQuestItemFetcher { static Map> zeroedStartQuestItems = new HashMap<>(); static Map> zeroedCompleteQuestItems = new HashMap<>(); static Map mixedQuestidItems = new HashMap<>(); + static Set limitedQuestids = new HashSet<>(); static byte status = 0; static int questId = -1; @@ -103,11 +104,13 @@ public class MapleQuestItemFetcher { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound + if(j < i) return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway + dest = new char[initialStringLength]; token.getChars(i, j, dest, 0); @@ -245,8 +248,15 @@ public class MapleQuestItemFetcher { } status += 1; - } + } else { + if(status == 3) { + d = getName(token); + if(d.equals("end")) { + limitedQuestids.add(questId); + } + } + } } private static void calculateQuestItemDiff() { @@ -414,6 +424,10 @@ public class MapleQuestItemFetcher { return list; } + private static String getExpiredStringLabel(int questid) { + return (!limitedQuestids.contains(questid) ? "" : " EXPIRED"); + } + private static void ReportQuestItemData() { // This will reference one line at a time String line = null; @@ -460,7 +474,7 @@ public class MapleQuestItemFetcher { printWriter.println("INCORRECT QUESTIDS ON DB"); for(Entry emqi : getSortedMapEntries1(mixedQuestidItems)) { int[] mqi = emqi.getValue(); - printWriter.println(mqi[0] + " : " + mqi[1] + " -> " + mqi[2]); + printWriter.println(mqi[0] + " : " + mqi[1] + " -> " + mqi[2] + getExpiredStringLabel(mqi[2])); } printWriter.println("\n\n\n\n\n"); } @@ -473,7 +487,7 @@ public class MapleQuestItemFetcher { printWriter.println("ITEMS WITH NO QUEST DROP DATA ON DB"); for(Entry iwq : getSortedMapEntries0(mapIwq)) { - printWriter.println(iwq.getKey() + " - " + iwq.getValue()); + printWriter.println(iwq.getKey() + " - " + iwq.getValue() + getExpiredStringLabel(iwq.getValue())); } printWriter.println("\n\n\n\n\n"); } @@ -482,7 +496,7 @@ public class MapleQuestItemFetcher { if(!zeroedStartQuestItems.isEmpty()) { printWriter.println("START QUEST ITEMS WITH ZERO QUANTITY"); for(Pair> iwq : getSortedMapEntries2(zeroedStartQuestItems)) { - printWriter.println(iwq.getLeft() + ":"); + printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":"); for(Integer i : iwq.getRight()) { printWriter.println(" " + i); } @@ -494,7 +508,7 @@ public class MapleQuestItemFetcher { if(!zeroedCompleteQuestItems.isEmpty()) { printWriter.println("COMPLETE QUEST ITEMS WITH ZERO QUANTITY"); for(Pair> iwq : getSortedMapEntries2(zeroedCompleteQuestItems)) { - printWriter.println(iwq.getLeft() + ":"); + printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":"); for(Integer i : iwq.getRight()) { printWriter.println(" " + i); }