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.
This commit is contained in:
ronancpl
2017-12-14 11:08:55 -02:00
parent b141efdbf2
commit c1126213cc
20 changed files with 99 additions and 83 deletions

View File

@@ -720,5 +720,7 @@ Corrigido 3o job de Cygnus.
Removido UI que aponta erroneamente "Stat Upgrade" nos níveis 15, 20, 25 e 30. 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. Adicionado comando "droplimit", cuja funcionalidade é informar ao jogador a quantidade de drops no mapa em contraste com o limite permitido.
11 Dezembro 2017, 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". 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.

View File

@@ -6606,8 +6606,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
public void sendPolice(String text) { public void sendPolice(String text) {
String message = getName() + " received this - " + text; String message = getName() + " received this - " + text;
if (Server.getInstance().isGmOnline()) { //Alert and log if a GM is online if (Server.getInstance().isGmOnline(this.getWorld())) { //Alert and log if a GM is online
Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip(message)); Server.getInstance().broadcastGMMessage(this.getWorld(), MaplePacketCreator.sendYellowTip(message));
FilePrinter.printError("autobanwarning.txt", message + "\r\n"); FilePrinter.printError("autobanwarning.txt", message + "\r\n");
} else { //Auto DC and log if no GM is online } else { //Auto DC and log if no GM is online
client.disconnect(false, false); client.disconnect(false, false);
@@ -7656,7 +7656,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
client.disconnect(false, false); client.disconnect(false, false);
} }
}, 5000); }, 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) { public void block(int reason, int days, String desc) {

View File

@@ -91,7 +91,7 @@ public enum AutobanFactory {
if (chr != null && MapleLogger.ignored.contains(chr.getName())){ if (chr != null && MapleLogger.ignored.contains(chr.getName())){
return; 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));
} }
} }

View File

@@ -551,8 +551,8 @@ public class Commands {
break; break;
} }
String message = joinStringFrom(sub, 1); String message = joinStringFrom(sub, 1);
Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[GM MESSAGE]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[GM MESSAGE]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message));
Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(1, message)); Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(1, message));
FilePrinter.printError("gm.txt", MapleCharacter.makeMapleReadable(player.getName()) + ": " + message + "\r\n"); FilePrinter.printError("gm.txt", MapleCharacter.makeMapleReadable(player.getName()) + ": " + message + "\r\n");
player.dropMessage(5, "Your message '" + message + "' was sent to GMs."); player.dropMessage(5, "Your message '" + message + "' was sent to GMs.");
player.dropMessage(5, tips[Randomizer.nextInt(tips.length)]); player.dropMessage(5, tips[Randomizer.nextInt(tips.length)]);
@@ -565,8 +565,8 @@ public class Commands {
break; break;
} }
message = joinStringFrom(sub, 1); message = joinStringFrom(sub, 1);
Server.getInstance().broadcastGMMessage(MaplePacketCreator.sendYellowTip("[BUG]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message)); Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[BUG]:" + MapleCharacter.makeMapleReadable(player.getName()) + ": " + message));
Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(1, message)); Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(1, message));
FilePrinter.printError("bug.txt", MapleCharacter.makeMapleReadable(player.getName()) + ": " + message + "\r\n"); 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!"); player.dropMessage(5, "Your bug '" + message + "' was submitted successfully to our developers. Thank you!");
break; break;
@@ -881,7 +881,7 @@ public class Commands {
if(victim != null) { if(victim != null) {
victim.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300166), victim.getPosition()); 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 { } else {
player.message("Player '" + sub[1] + "' could not be found on this world."); 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.")); 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() + "."; 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; break;
case "monitors": case "monitors":
@@ -1625,7 +1625,7 @@ public class Commands {
} }
player.yellowMessage(victim.getName() + " is " + (!monitored_ ? "now being ignored." : "no longer being ignored.")); 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() + "."; 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; break;
case "ignored": case "ignored":
@@ -1754,7 +1754,7 @@ public class Commands {
break; break;
case "expeds": case "expeds":
for (Channel ch : Server.getInstance().getChannelsFromWorld(0)) { for (Channel ch : Server.getInstance().getChannelsFromWorld(c.getWorld())) {
if (ch.getExpeditions().size() == 0) { if (ch.getExpeditions().size() == 0) {
player.yellowMessage("No Expeditions in Channel " + ch.getId()); player.yellowMessage("No Expeditions in Channel " + ch.getId());
continue; continue;
@@ -1789,7 +1789,7 @@ public class Commands {
victim = cserv.getPlayerStorage().getCharacterByName(sub[1]); victim = cserv.getPlayerStorage().getCharacterByName(sub[1]);
if(victim != null) { if(victim != null) {
victim.setHpMp(0); 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 { } else {
player.message("Player '" + sub[1] + "' could not be found on this channel."); player.message("Player '" + sub[1] + "' could not be found on this channel.");
} }
@@ -1831,11 +1831,11 @@ public class Commands {
break; break;
case "notice": 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; break;
case "rip": 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; break;
case "openportal": case "openportal":
@@ -1964,10 +1964,10 @@ public class Commands {
rip.getClient().disconnect(false, false); rip.getClient().disconnect(false, false);
} }
}, 5000); //5 Seconds }, 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)) { } else if (MapleCharacter.ban(ign, reason, false)) {
c.announce(MaplePacketCreator.getGMEffect(4, (byte) 0)); 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 { } else {
c.announce(MaplePacketCreator.getGMEffect(6, (byte) 1)); c.announce(MaplePacketCreator.getGMEffect(6, (byte) 1));
} }
@@ -2513,7 +2513,7 @@ public class Commands {
} }
} }
String message = player.getName() + " used !saveall."; 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."); player.message("All players saved successfully.");
break; break;

View File

@@ -688,20 +688,20 @@ public class Server implements Runnable {
worlda.reloadGuildSummary(); worlda.reloadGuildSummary();
} }
public void broadcastMessage(final byte[] packet) { public void broadcastMessage(int world, final byte[] packet) {
for (Channel ch : getChannelsFromWorld(0)) { for (Channel ch : getChannelsFromWorld(world)) {
ch.broadcastPacket(packet); ch.broadcastPacket(packet);
} }
} }
public void broadcastGMMessage(final byte[] packet) { public void broadcastGMMessage(int world, final byte[] packet) {
for (Channel ch : getChannelsFromWorld(0)) { for (Channel ch : getChannelsFromWorld(world)) {
ch.broadcastGMPacket(packet); ch.broadcastGMPacket(packet);
} }
} }
public boolean isGmOnline() { public boolean isGmOnline(int world) {
for (Channel ch : getChannelsFromWorld(0)) { for (Channel ch : getChannelsFromWorld(world)) {
for (MapleCharacter player : ch.getPlayerStorage().getAllCharacters()) { for (MapleCharacter player : ch.getPlayerStorage().getAllCharacters()) {
if (player.isGM()){ if (player.isGM()){
return true; return true;

View File

@@ -67,7 +67,7 @@ public final class ItemRewardHandler extends AbstractMaplePacketHandler {
String msg = reward.worldmsg; String msg = reward.worldmsg;
msg.replaceAll("/name", c.getPlayer().getName()); msg.replaceAll("/name", c.getPlayer().getName());
msg.replaceAll("/item", ii.getName(reward.itemid)); msg.replaceAll("/item", ii.getName(reward.itemid));
Server.getInstance().broadcastMessage(MaplePacketCreator.serverNotice(6, msg)); Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.serverNotice(6, msg));
} }
break; break;
} }

View File

@@ -281,7 +281,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
} }
*/ */
if (player.isGM()){ 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"));
} }
} }

View File

@@ -58,7 +58,7 @@ public final class ReportHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.reportResponse((byte) 2)); c.announce(MaplePacketCreator.reportResponse((byte) 2));
return; 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); addReport(c.getPlayer().getId(), MapleCharacter.getIdByName(victim), 0, description, null);
} else if (type == 1) { } else if (type == 1) {
String chatlog = slea.readMapleAsciiString(); String chatlog = slea.readMapleAsciiString();
@@ -74,10 +74,10 @@ public final class ReportHandler extends AbstractMaplePacketHandler {
return; 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), reason, description, chatlog); addReport(c.getPlayer().getId(), MapleCharacter.getIdByName(victim), reason, description, chatlog);
} else { } 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."));
} }
} }

View File

@@ -277,7 +277,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} }
break; break;
case 2: // Super megaphone 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; break;
case 5: // Maple TV case 5: // Maple TV
int tvType = itemId % 10; int tvType = itemId % 10;
@@ -309,7 +309,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} }
slea.readInt(); slea.readInt();
if (megassenger) { 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()) { if (!MapleTVEffect.isActive()) {
new MapleTVEffect(player, victim, messages, tvType); new MapleTVEffect(player, victim, messages, tvType);
@@ -334,7 +334,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
return; return;
} }
} }
Server.getInstance().broadcastMessage(MaplePacketCreator.itemMegaphone(msg, whisper, c.getChannel(), item)); Server.getInstance().broadcastMessage(c.getWorld(), MaplePacketCreator.itemMegaphone(msg, whisper, c.getChannel(), item));
break; break;
case 7: //triple megaphone case 7: //triple megaphone
int lines = slea.readByte(); int lines = slea.readByte();
@@ -347,7 +347,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
msg2[i] = medal + c.getPlayer().getName() + " : " + slea.readMapleAsciiString(); msg2[i] = medal + c.getPlayer().getName() + " : " + slea.readMapleAsciiString();
} }
whisper = slea.readByte() == 1; 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; break;
} }
remove(c, itemId); remove(c, itemId);
@@ -475,11 +475,13 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
lines.add(slea.readMapleAsciiString()); 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() { TimerManager.getInstance().schedule(new Runnable() {
@Override @Override
public void run() { public void run() {
Server.getInstance().broadcastMessage(MaplePacketCreator.byeAvatarMega()); Server.getInstance().broadcastMessage(world, MaplePacketCreator.byeAvatarMega());
} }
}, 1000 * 10); }, 1000 * 10);
remove(c, itemId); remove(c, itemId);

View File

@@ -131,6 +131,6 @@ public final class CreateCharHandler extends AbstractMaplePacketHandler {
return; return;
} }
c.announce(MaplePacketCreator.addNewCharEntry(newchar)); 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));
} }
} }

View File

@@ -385,7 +385,7 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
LogHelper.logGacha(getPlayer(), item.getId(), map); LogHelper.logGacha(getPlayer(), item.getId(), map);
if (item.getTier() > 0){ //Uncommon and Rare 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()));
} }
} }

View File

@@ -1488,7 +1488,7 @@ public class MapleItemInformationProvider {
if (!EquipSlot.getFromTextSlot(islot).isAllowed(dst, isCash(id))) { if (!EquipSlot.getFromTextSlot(islot).isAllowed(dst, isCash(id))) {
equip.wear(false); equip.wear(false);
String itemName = MapleItemInformationProvider.getInstance().getName(equip.getItemId()); 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."); 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"); FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to equip " + itemName + " into " + dst + " slot.\r\n");
return false; return false;

View File

@@ -133,7 +133,7 @@ public class MapleExpedition {
broadcastExped(MaplePacketCreator.removeClock()); broadcastExped(MaplePacketCreator.removeClock());
broadcastExped(MaplePacketCreator.serverNotice(6, "[Expedition] The expedition has started! Good luck, brave heroes!")); broadcastExped(MaplePacketCreator.serverNotice(6, "[Expedition] The expedition has started! Good luck, brave heroes!"));
startTime = System.currentTimeMillis(); 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) { public String addMember(MapleCharacter player) {

View File

@@ -708,21 +708,22 @@ public class MapleMap {
return droppedItemCount.get(); return droppedItemCount.get();
} }
private void instantiateItemDrop(MapleMapItem mdrop) { private synchronized void instantiateItemDrop(MapleMapItem mdrop) {
if(droppedItemCount.get() >= ServerConstants.ITEM_LIMIT_ON_MAP) { if(droppedItemCount.get() >= ServerConstants.ITEM_LIMIT_ON_MAP) {
MapleMapObject mapobj; MapleMapObject mapobj;
do {
objectWLock.lock(); objectWLock.lock();
try { try {
mapobj = registeredDrops.remove(0).get(); mapobj = registeredDrops.remove(0).get();
while(mapobj == null) { while(mapobj == null) {
if(registeredDrops.isEmpty()) break;
mapobj = registeredDrops.remove(0).get(); mapobj = registeredDrops.remove(0).get();
} }
} finally { } finally {
objectWLock.unlock(); objectWLock.unlock();
} }
} while (!makeDisappearItemFromMap(mapobj));
makeDisappearItemFromMap(mapobj);
} }
objectWLock.lock(); objectWLock.lock();
@@ -2806,24 +2807,30 @@ public class MapleMap {
return null; return null;
} }
public void makeDisappearItemFromMap(MapleMapObject mapobj) { public boolean makeDisappearItemFromMap(MapleMapObject mapobj) {
if(mapobj instanceof MapleMapItem) { 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())) { if (mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) {
mapitem.lockItem(); mapitem.lockItem();
try { try {
if (mapitem.isPickedUp()) { if (mapitem.isPickedUp()) {
return; return true;
} }
MapleMap.this.pickItemDrop(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem); MapleMap.this.pickItemDrop(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem);
return true;
} finally { } finally {
mapitem.unlockItem(); mapitem.unlockItem();
} }
} }
return false;
} }
private class ActivateItemReactor implements Runnable { private class ActivateItemReactor implements Runnable {

View File

@@ -57,8 +57,8 @@ public class MapleTVEffect {
Server server = Server.getInstance(); Server server = Server.getInstance();
ACTIVE = activity; ACTIVE = activity;
if (ACTIVE) { if (ACTIVE) {
server.broadcastMessage(MaplePacketCreator.enableTV()); server.broadcastMessage(user.getWorld(), MaplePacketCreator.enableTV());
server.broadcastMessage(MaplePacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner)); server.broadcastMessage(user.getWorld(), MaplePacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner));
int delay = 15000; int delay = 15000;
if (type == 4) { if (type == 4) {
delay = 30000; delay = 30000;
@@ -72,7 +72,7 @@ public class MapleTVEffect {
} }
}, delay); }, delay);
} else { } else {
server.broadcastMessage(MaplePacketCreator.removeTV()); server.broadcastMessage(user.getWorld(), MaplePacketCreator.removeTV());
} }
} }
} }

View File

@@ -36,7 +36,7 @@ public class LogHelper {
} }
public static void logExpedition(MapleExpedition expedition) { 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"; String log = expedition.getType().toString() + " EXPEDITION\r\n";
log += getTimeString(expedition.getStartTime()) + "\r\n"; log += getTimeString(expedition.getStartTime()) + "\r\n";

View File

@@ -29,6 +29,7 @@ INCORRECT QUESTIDS ON DB
4031860 : 6944 -> 6945 4031860 : 6944 -> 6945
4031861 : 6944 -> 6945 4031861 : 6944 -> 6945
4031871 : 6350 -> 28344 4031871 : 6350 -> 28344
4032324 : 21736 -> 21737
4032339 : 0 -> 21303 4032339 : 0 -> 21303
@@ -110,7 +111,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB
4031220 - 9210 4031220 - 9210
4031225 - 3606 4031225 - 3606
4031226 - 9321 4031226 - 9321
4031227 - 4103 4031227 - 4103 EXPIRED
4031230 - 3619 4031230 - 3619
4031231 - 3620 4031231 - 3620
4031235 - 3607 4031235 - 3607
@@ -233,6 +234,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB
4031812 - 4950 4031812 - 4950
4031833 - 9946 4031833 - 9946
4031837 - 9945 4031837 - 9945
4031839 - 2162
4031881 - 4484 4031881 - 4484
4031894 - 2214 4031894 - 2214
4031921 - 4646 4031921 - 4646
@@ -288,8 +290,6 @@ ITEMS WITH NO QUEST DROP DATA ON DB
4032318 - 21718 4032318 - 21718
4032319 - 21723 4032319 - 21723
4032321 - 21727 4032321 - 21727
4032322 - 21731
4032324 - 21737
4032325 - 21752 4032325 - 21752
4032326 - 21752 4032326 - 21752
4032331 - 21601 4032331 - 21601
@@ -313,13 +313,7 @@ ITEMS WITH NO QUEST DROP DATA ON DB
4032437 - 28321 4032437 - 28321
4032443 - 28317 4032443 - 28317
4032496 - 28238 4032496 - 28238
4032511 - 3718
4032512 - 3720 4032512 - 3720
4032513 - 3722
4032514 - 3727
4032516 - 3735
4032517 - 3740
4032518 - 3743
4161000 - 9322 4161000 - 9322
@@ -340,12 +334,6 @@ COMPLETE QUEST ITEMS WITH ZERO QUANTITY
2054: 2054:
4031028 4031028
2162:
4031839
2164:
4031840
2167: 2167:
4031841 4031841

View File

@@ -2,6 +2,8 @@
<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/> <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/> <group>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java</file>
</group>
</open-files> </open-files>
</project-private> </project-private>

View File

@@ -61,7 +61,7 @@ import tools.Pair;
* *
* Running it should generate a report file under "lib" folder with the search results. * 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 { public class MapleQuestItemFetcher {
static MapleItemInformationProvider ii; static MapleItemInformationProvider ii;
@@ -91,6 +91,7 @@ public class MapleQuestItemFetcher {
static Map<Integer, Set<Integer>> zeroedStartQuestItems = new HashMap<>(); static Map<Integer, Set<Integer>> zeroedStartQuestItems = new HashMap<>();
static Map<Integer, Set<Integer>> zeroedCompleteQuestItems = new HashMap<>(); static Map<Integer, Set<Integer>> zeroedCompleteQuestItems = new HashMap<>();
static Map<Integer, int[]> mixedQuestidItems = new HashMap<>(); static Map<Integer, int[]> mixedQuestidItems = new HashMap<>();
static Set<Integer> limitedQuestids = new HashSet<>();
static byte status = 0; static byte status = 0;
static int questId = -1; static int questId = -1;
@@ -108,6 +109,8 @@ public class MapleQuestItemFetcher {
i = token.indexOf("\"", i) + 1; //lower bound of the string i = token.indexOf("\"", i) + 1; //lower bound of the string
j = token.indexOf("\"", i); //upper bound 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]; dest = new char[initialStringLength];
token.getChars(i, j, dest, 0); token.getChars(i, j, dest, 0);
@@ -245,8 +248,15 @@ public class MapleQuestItemFetcher {
} }
status += 1; status += 1;
} } else {
if(status == 3) {
d = getName(token);
if(d.equals("end")) {
limitedQuestids.add(questId);
}
}
}
} }
private static void calculateQuestItemDiff() { private static void calculateQuestItemDiff() {
@@ -414,6 +424,10 @@ public class MapleQuestItemFetcher {
return list; return list;
} }
private static String getExpiredStringLabel(int questid) {
return (!limitedQuestids.contains(questid) ? "" : " EXPIRED");
}
private static void ReportQuestItemData() { private static void ReportQuestItemData() {
// This will reference one line at a time // This will reference one line at a time
String line = null; String line = null;
@@ -460,7 +474,7 @@ public class MapleQuestItemFetcher {
printWriter.println("INCORRECT QUESTIDS ON DB"); printWriter.println("INCORRECT QUESTIDS ON DB");
for(Entry<Integer, int[]> emqi : getSortedMapEntries1(mixedQuestidItems)) { for(Entry<Integer, int[]> emqi : getSortedMapEntries1(mixedQuestidItems)) {
int[] mqi = emqi.getValue(); 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"); printWriter.println("\n\n\n\n\n");
} }
@@ -473,7 +487,7 @@ public class MapleQuestItemFetcher {
printWriter.println("ITEMS WITH NO QUEST DROP DATA ON DB"); printWriter.println("ITEMS WITH NO QUEST DROP DATA ON DB");
for(Entry<Integer, Integer> iwq : getSortedMapEntries0(mapIwq)) { for(Entry<Integer, Integer> 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"); printWriter.println("\n\n\n\n\n");
} }
@@ -482,7 +496,7 @@ public class MapleQuestItemFetcher {
if(!zeroedStartQuestItems.isEmpty()) { if(!zeroedStartQuestItems.isEmpty()) {
printWriter.println("START QUEST ITEMS WITH ZERO QUANTITY"); printWriter.println("START QUEST ITEMS WITH ZERO QUANTITY");
for(Pair<Integer, List<Integer>> iwq : getSortedMapEntries2(zeroedStartQuestItems)) { for(Pair<Integer, List<Integer>> iwq : getSortedMapEntries2(zeroedStartQuestItems)) {
printWriter.println(iwq.getLeft() + ":"); printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":");
for(Integer i : iwq.getRight()) { for(Integer i : iwq.getRight()) {
printWriter.println(" " + i); printWriter.println(" " + i);
} }
@@ -494,7 +508,7 @@ public class MapleQuestItemFetcher {
if(!zeroedCompleteQuestItems.isEmpty()) { if(!zeroedCompleteQuestItems.isEmpty()) {
printWriter.println("COMPLETE QUEST ITEMS WITH ZERO QUANTITY"); printWriter.println("COMPLETE QUEST ITEMS WITH ZERO QUANTITY");
for(Pair<Integer, List<Integer>> iwq : getSortedMapEntries2(zeroedCompleteQuestItems)) { for(Pair<Integer, List<Integer>> iwq : getSortedMapEntries2(zeroedCompleteQuestItems)) {
printWriter.println(iwq.getLeft() + ":"); printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":");
for(Integer i : iwq.getRight()) { for(Integer i : iwq.getRight()) {
printWriter.println(" " + i); printWriter.println(" " + i);
} }