diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index 20d681ed6c..11c5760ce4 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -1530,4 +1530,20 @@ Corrigido comandos que transportam jogadores entre mapas não levando em conside 21 Dezembro 2018, Cosméticos já usados pelo jogador não estão mais disponíveis nos estilistas/cirurgiões. -Corrigido alguns itens estéticos não sendo devidamente disponibilizados se jogadores usam algum cosmético de cor não-default. \ No newline at end of file +Corrigido alguns itens estéticos não sendo devidamente disponibilizados se jogadores usam algum cosmético de cor não-default. + +28 Dezembro 2018, +Corrigido um problema com comando Music, que não identificaria informações das músicas do jogo corretamente. +Corrigido scripts de NPC de cosméticos bloqueando dialógo de jogadores em certos casos. + +29 - 31 Dezembro 2018, +Resolvido envio de temporarização descompassada pro cliente (quests, expirações de itens, BBS threads, etc). +Corrigido quests não registrando tempo de completude corretamente. +Corrigido mob Jesters utilizando autoaggro. + +03 - 06 Janeiro 2019, +Corrigido Homing Beacon skill provocando autoflag em mobs para jogadores que mudam de mapas, onde há mobs com mesmo objectid do mob alvejado anteriormente. +Resolvido casos onde pets equipados poderiam provocar inconsistências na DB ao ser removido da aba de cash no inventário. +Revisado sistema de log por todo o código-fonte. Espera-se uma formatação similar para os vários logs. +Corrigido pet excludes não sendo devidamente removidos ao retirar o pet da DB. +Corrigido bug na expedição de Horntail ao tentar reentrar numa expedição já começada. \ No newline at end of file diff --git a/scripts/event/GuildQuest.js b/scripts/event/GuildQuest.js index 921efdf8f5..8f3c755643 100644 --- a/scripts/event/GuildQuest.js +++ b/scripts/event/GuildQuest.js @@ -237,7 +237,7 @@ function changedMap(eim, player, mapid) { function afterChangedMap(eim, player, mapid) { if (mapid == 990000100) { var texttt = "So, here is the brief. You guys should be warned that, once out on the fortress outskirts, anyone that would not be equipping the #b#t1032033##k will die instantly due to the deteriorated state of the air around there. That being said, once your team moves out, make sure to #bhit the glowing rocks#k in that region and #bequip the dropped item#k before advancing stages. That will protect you thoroughly from the air sickness. Good luck!"; - player.getClient().announce(Packages.tools.MaplePacketCreator.getNPCTalk(9040000, /*(byte)*/ 0, texttt, "00 00", /*(byte)*/ 0)); + player.getClient().getAbstractPlayerInteraction().npcTalk(9040000, texttt); } } diff --git a/scripts/event/HorntailBattle.js b/scripts/event/HorntailBattle.js index 9f48812575..f31c2cdb06 100644 --- a/scripts/event/HorntailBattle.js +++ b/scripts/event/HorntailBattle.js @@ -88,7 +88,7 @@ function setEventRewards(eim) { function afterSetup(eim) {} function setup(channel) { - var eim = em.newInstance("Scarga" + channel); + var eim = em.newInstance("Horntail" + channel); // thanks Thora for reporting an issue with misleading event name here eim.setProperty("canJoin", 1); eim.setProperty("defeatedBoss", 0); eim.setProperty("defeatedHead", 0); diff --git a/scripts/event/OrbisPQ.js b/scripts/event/OrbisPQ.js index 9ab4462fdd..2d11c2c409 100644 --- a/scripts/event/OrbisPQ.js +++ b/scripts/event/OrbisPQ.js @@ -180,7 +180,7 @@ function playerEntry(eim, player) { player.changeMap(map, map.getPortal(0)); var texttt = "Hi, my name is Eak, the Chamberlain of the Goddess. Don't be alarmed; you won't be able to see me right now. Back when the Goddess turned into a block of stone, I simultaneously lost my own power. If you gather up the power of the Magic Cloud of Orbis, however, then I'll be able to recover my body and re-transform back to my original self. Please collect #b20#k Magic Clouds and bring them back to me. Right now, you'll only see me as a tiny, flickering light."; - player.getClient().announce(Packages.tools.MaplePacketCreator.getNPCTalk(2013001, /*(byte)*/ 0, texttt, "00 00", /*(byte)*/ 0)); + player.getClient().getAbstractPlayerInteraction().npcTalk(2013001, texttt); } function scheduledTimeout(eim) { diff --git a/scripts/npc/1012104.js b/scripts/npc/1012104.js index d00ec8f207..8f075f6ac7 100644 --- a/scripts/npc/1012104.js +++ b/scripts/npc/1012104.js @@ -45,13 +45,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/1012105.js b/scripts/npc/1012105.js index c928d6662d..0e052b6ddc 100644 --- a/scripts/npc/1012105.js +++ b/scripts/npc/1012105.js @@ -32,14 +32,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && type > 0) { - cm.dispose(); - return; - } - if (mode == 1) status++; else diff --git a/scripts/npc/1012117.js b/scripts/npc/1012117.js index 4dd03728d7..131f45b7f9 100644 --- a/scripts/npc/1012117.js +++ b/scripts/npc/1012117.js @@ -48,14 +48,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && type > 0) { - cm.dispose(); - return; - } - if (mode == 1) status++; else diff --git a/scripts/npc/1052004.js b/scripts/npc/1052004.js index 1a44a73f86..7d2848bf59 100644 --- a/scripts/npc/1052004.js +++ b/scripts/npc/1052004.js @@ -42,13 +42,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/1052005.js b/scripts/npc/1052005.js index 40b92bf9f2..2e7bd8e5b3 100644 --- a/scripts/npc/1052005.js +++ b/scripts/npc/1052005.js @@ -42,13 +42,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/1052100.js b/scripts/npc/1052100.js index 2f8a772c13..5be126551f 100644 --- a/scripts/npc/1052100.js +++ b/scripts/npc/1052100.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/1052101.js b/scripts/npc/1052101.js index f35f863af2..53b5e393ba 100644 --- a/scripts/npc/1052101.js +++ b/scripts/npc/1052101.js @@ -45,13 +45,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/1101001.js b/scripts/npc/1101001.js index 7837038476..e08c21fb28 100644 --- a/scripts/npc/1101001.js +++ b/scripts/npc/1101001.js @@ -8,8 +8,10 @@ importPackage(Packages.constants); function start() { if (cm.getPlayer().isCygnus() && GameConstants.getJobBranch(cm.getJob()) > 2) { cm.useItem(2022458); + cm.sendOk("Let me cast you my blessings, my Knight. Please protect the world of Maple...."); + } else { + cm.sendOk("Don't stop training. Every ounce of your energy is required to protect the world of Maple...."); } - cm.sendOk("Don't stop training. Every ounce of your energy is required to protect the world of Maple...."); cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/2010001.js b/scripts/npc/2010001.js index 64dcfb3bd6..ed798b74fe 100644 --- a/scripts/npc/2010001.js +++ b/scripts/npc/2010001.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2010002.js b/scripts/npc/2010002.js index 9be9a9784c..c9dd0e5136 100644 --- a/scripts/npc/2010002.js +++ b/scripts/npc/2010002.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2012008.js b/scripts/npc/2012008.js index 914dd002cb..bf7cdcb96c 100644 --- a/scripts/npc/2012008.js +++ b/scripts/npc/2012008.js @@ -31,13 +31,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2040019.js b/scripts/npc/2040019.js index cd4ccf4708..7ecf6af85f 100644 --- a/scripts/npc/2040019.js +++ b/scripts/npc/2040019.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2041007.js b/scripts/npc/2041007.js index d7c2f8ad23..0cc2197a5d 100644 --- a/scripts/npc/2041007.js +++ b/scripts/npc/2041007.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2041009.js b/scripts/npc/2041009.js index d89c13a6d2..af2cd7d995 100644 --- a/scripts/npc/2041009.js +++ b/scripts/npc/2041009.js @@ -46,13 +46,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2041010.js b/scripts/npc/2041010.js index d76e15c5fd..adff60bdc9 100644 --- a/scripts/npc/2041010.js +++ b/scripts/npc/2041010.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2041013.js b/scripts/npc/2041013.js index 41f54a4445..16f85921dd 100644 --- a/scripts/npc/2041013.js +++ b/scripts/npc/2041013.js @@ -29,13 +29,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2090100.js b/scripts/npc/2090100.js index c4e8b89721..60609facb3 100644 --- a/scripts/npc/2090100.js +++ b/scripts/npc/2090100.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2090101.js b/scripts/npc/2090101.js index 9d23503983..92066c7c3e 100644 --- a/scripts/npc/2090101.js +++ b/scripts/npc/2090101.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2090102.js b/scripts/npc/2090102.js index c16055f951..e1980b9840 100644 --- a/scripts/npc/2090102.js +++ b/scripts/npc/2090102.js @@ -32,13 +32,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2090103.js b/scripts/npc/2090103.js index 4edf8d6ed4..e825cd6040 100644 --- a/scripts/npc/2090103.js +++ b/scripts/npc/2090103.js @@ -51,13 +51,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2090104.js b/scripts/npc/2090104.js index ae1138ce45..755f0d8d52 100644 --- a/scripts/npc/2090104.js +++ b/scripts/npc/2090104.js @@ -51,13 +51,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2100005.js b/scripts/npc/2100005.js index 02dff1f73c..015b847652 100644 --- a/scripts/npc/2100005.js +++ b/scripts/npc/2100005.js @@ -24,14 +24,13 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc + if (type == 7) { + cm.sendNext("I guess you aren't ready to make the change yet. Let me know when you are!"); + } + cm.dispose(); } else { - if (mode == 0 && status >= 0) { - cm.sendNext("I guess you aren't ready to make the change yet. Let me know when you are!"); - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2100006.js b/scripts/npc/2100006.js index 9e6a054c2b..5da564f95d 100644 --- a/scripts/npc/2100006.js +++ b/scripts/npc/2100006.js @@ -24,13 +24,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status >= 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2100007.js b/scripts/npc/2100007.js index 3fc087cbfa..55a32b25c3 100644 --- a/scripts/npc/2100007.js +++ b/scripts/npc/2100007.js @@ -13,13 +13,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status >= 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2100008.js b/scripts/npc/2100008.js index ac28e0c1b1..9fac81c781 100644 --- a/scripts/npc/2100008.js +++ b/scripts/npc/2100008.js @@ -34,13 +34,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/2100009.js b/scripts/npc/2100009.js index 5da61a5c5c..181a396c8b 100644 --- a/scripts/npc/2100009.js +++ b/scripts/npc/2100009.js @@ -34,14 +34,13 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc + if (type == 7) { + cm.sendNext("I see...take your time, see if you really want it. Let me know when you make up your mind."); + } + cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.sendNext("I see...take your time, see if you really want it. Let me know when you make up your mind."); - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9120100.js b/scripts/npc/9120100.js index eb4810a715..5533c582e1 100644 --- a/scripts/npc/9120100.js +++ b/scripts/npc/9120100.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9120101.js b/scripts/npc/9120101.js index 70df6cfea9..3a0dee60dd 100644 --- a/scripts/npc/9120101.js +++ b/scripts/npc/9120101.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9120102.js b/scripts/npc/9120102.js index b8bf440aa9..52b1e7d27a 100644 --- a/scripts/npc/9120102.js +++ b/scripts/npc/9120102.js @@ -56,13 +56,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9200100.js b/scripts/npc/9200100.js index 516d82248c..85bc796f47 100644 --- a/scripts/npc/9200100.js +++ b/scripts/npc/9200100.js @@ -50,15 +50,14 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) - cm.dispose(); if (mode == 1) status++; else status--; + if (status == 0) cm.sendSimple("Hi, there~! I'm Dr. Lenu, in charge of the cosmetic lenses here at the Henesys Plastic Surgery Shop! With #b#t5152010##k or #b#t5152013##k, you can let us take care of the rest and have the kind of beautiful look you've always craved~! Remember, the first thing everyone notices about you is the eyes, and we can help you find the cosmetic lens that most fits you! Now, what would you like to use?\r\n#L1#Cosmetic Lenses: #i5152010##t5152010##l\r\n#L2#Cosmetic Lenses: #i5152013##t5152013##l\r\n#L3#One-time Cosmetic Lenses: #i5152103# (any color)#l"); else if (status == 1) { diff --git a/scripts/npc/9200101.js b/scripts/npc/9200101.js index fc5a8a8a6b..99532c29b4 100644 --- a/scripts/npc/9200101.js +++ b/scripts/npc/9200101.js @@ -50,13 +50,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9200102.js b/scripts/npc/9200102.js index 78ff68ade6..69386b776f 100644 --- a/scripts/npc/9200102.js +++ b/scripts/npc/9200102.js @@ -50,13 +50,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201015.js b/scripts/npc/9201015.js index 58ecd8a92a..3d3ade88b4 100644 --- a/scripts/npc/9201015.js +++ b/scripts/npc/9201015.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201016.js b/scripts/npc/9201016.js index fb1d2d799e..1e05472a60 100644 --- a/scripts/npc/9201016.js +++ b/scripts/npc/9201016.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201017.js b/scripts/npc/9201017.js index 98e2257568..d3aa73dfaf 100644 --- a/scripts/npc/9201017.js +++ b/scripts/npc/9201017.js @@ -50,13 +50,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201018.js b/scripts/npc/9201018.js index c511102ca1..6296173151 100644 --- a/scripts/npc/9201018.js +++ b/scripts/npc/9201018.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201019.js b/scripts/npc/9201019.js index f7c66d73f5..4db4bb3c64 100644 --- a/scripts/npc/9201019.js +++ b/scripts/npc/9201019.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201039.js b/scripts/npc/9201039.js index 491e3b8e0a..203cc8de61 100644 --- a/scripts/npc/9201039.js +++ b/scripts/npc/9201039.js @@ -46,12 +46,12 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc + if (type == 7) { + cm.sendNext("Ok, I'll give you a minute."); + } + cm.dispose(); - } else if (mode == 0) { - cm.sendNext("Ok, I'll give you a minute."); - cm.dispose(); - return; } status++; if (status == 1) { diff --git a/scripts/npc/9201061.js b/scripts/npc/9201061.js index 0c61db6b64..bbdb900422 100644 --- a/scripts/npc/9201061.js +++ b/scripts/npc/9201061.js @@ -42,13 +42,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201062.js b/scripts/npc/9201062.js index 228ad43bc3..1438423ac7 100644 --- a/scripts/npc/9201062.js +++ b/scripts/npc/9201062.js @@ -49,13 +49,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201063.js b/scripts/npc/9201063.js index 47224f97a3..d59b5c2cc8 100644 --- a/scripts/npc/9201063.js +++ b/scripts/npc/9201063.js @@ -44,13 +44,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201064.js b/scripts/npc/9201064.js index 06e696ea62..7625f74fe1 100644 --- a/scripts/npc/9201064.js +++ b/scripts/npc/9201064.js @@ -43,13 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201065.js b/scripts/npc/9201065.js index 94811914ee..32049e4b76 100644 --- a/scripts/npc/9201065.js +++ b/scripts/npc/9201065.js @@ -20,7 +20,7 @@ along with this program. If not, see . */ /* Miranda -NLC Skin Change. + NLC Skin Change. */ var status = 0; var price = 1000000; @@ -31,13 +31,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201069.js b/scripts/npc/9201069.js index fe70fa205b..edb97c8e75 100644 --- a/scripts/npc/9201069.js +++ b/scripts/npc/9201069.js @@ -42,13 +42,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9201070.js b/scripts/npc/9201070.js index 92d19f172a..70f03ecdf9 100644 --- a/scripts/npc/9201070.js +++ b/scripts/npc/9201070.js @@ -42,13 +42,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) { + if (mode < 1) { // disposing issue with stylishs found thanks to Vcoc cm.dispose(); } else { - if (mode == 0 && status == 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/npc/9270023.js b/scripts/npc/9270023.js index 45e93e6846..656c7c151a 100644 --- a/scripts/npc/9270023.js +++ b/scripts/npc/9270023.js @@ -43,14 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status >= 0) { - cm.dispose(); - return; - } - if (mode == 1) status++; else diff --git a/scripts/npc/9270024.js b/scripts/npc/9270024.js index 605f93f4f6..b194e24c8e 100644 --- a/scripts/npc/9270024.js +++ b/scripts/npc/9270024.js @@ -43,14 +43,9 @@ function start() { } function action(mode, type, selection) { - if (mode == -1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status >= 0) { - cm.dispose(); - return; - } - if (mode == 1) status++; else diff --git a/scripts/npc/9270025.js b/scripts/npc/9270025.js index a6fdc0c2af..84ef57df63 100644 --- a/scripts/npc/9270025.js +++ b/scripts/npc/9270025.js @@ -32,13 +32,9 @@ function start() { } function action(mode, type, selection) { - if (mode < 1) + if (mode < 1) // disposing issue with stylishs found thanks to Vcoc cm.dispose(); else { - if (mode == 0 && status >= 0) { - cm.dispose(); - return; - } if (mode == 1) status++; else diff --git a/scripts/quest/8185.js b/scripts/quest/8185.js index b9f949b68d..b4623a147c 100644 --- a/scripts/quest/8185.js +++ b/scripts/quest/8185.js @@ -44,7 +44,7 @@ function end(mode, type, selection) { return; } - qm.sendNextPrev("#e#bHey, you did it!#n#k \r\n#rWow!#k Now I could complete my studies on your pet!"); + qm.sendNext("#e#bHey, you did it!#n#k \r\n#rWow!#k Now I could complete my studies on your pet!"); } else if (status == 1) { if (mode == 0) { qm.sendOk("I see... Come back when you wish to do it. I'm really excited to do this."); diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 10662c614d..f5db5de785 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -187,7 +187,6 @@ public class MapleCharacter extends AbstractMapleCharacterObject { private MapleFamily family; private int familyId; private int bookCover; - private int markedMonster = 0; private int battleshipHp = 0; private int mesosTraded = 0; private int possibleReports = 10; @@ -2785,11 +2784,6 @@ public class MapleCharacter extends AbstractMapleCharacterObject { deletedCoupon = true; } } else { - if (item.getPetId() > -1) { - int petIdx = getPetIndex(item.getPetId()); - if(petIdx > -1) unequipPet(getPet(petIdx), true); - } - if (ItemConstants.isExpirablePet(item.getItemId())) { client.announce(MaplePacketCreator.itemExpired(item.getItemId())); toberemove.add(item); @@ -4638,10 +4632,6 @@ public class MapleCharacter extends AbstractMapleCharacterObject { return mapid; } - public int getMarkedMonster() { - return markedMonster; - } - public MapleRing getMarriageRing() { return partnerId > 0 ? marriageRing : null; } @@ -8003,10 +7993,10 @@ public class MapleCharacter extends AbstractMapleCharacterObject { String message = getName() + " received this - " + text; 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"); + FilePrinter.print(FilePrinter.AUTOBAN_WARNING, message); } else { //Auto DC and log if no GM is online client.disconnect(false, false); - FilePrinter.printError("autobandced.txt", message + "\r\n"); + FilePrinter.print(FilePrinter.AUTOBAN_DC, message); } //Server.getInstance().broadcastGMMessage(0, MaplePacketCreator.serverNotice(1, getName() + " received this - " + text)); //announce(MaplePacketCreator.sendPolice(text)); @@ -8357,10 +8347,6 @@ public class MapleCharacter extends AbstractMapleCharacterObject { public void setMap(MapleMap newmap) { this.map = newmap; } - - public void setMarkedMonster(int markedMonster) { - this.markedMonster = markedMonster; - } public void setMessenger(MapleMessenger messenger) { this.messenger = messenger; diff --git a/src/client/autoban/AutobanFactory.java b/src/client/autoban/AutobanFactory.java index 32bf79a67c..92894c0fe1 100644 --- a/src/client/autoban/AutobanFactory.java +++ b/src/client/autoban/AutobanFactory.java @@ -91,7 +91,7 @@ public enum AutobanFactory { Server.getInstance().broadcastGMMessage((chr != null ? chr.getWorld() : 0), MaplePacketCreator.sendYellowTip((chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason)); } if (ServerConstants.USE_AUTOBAN_LOG) { - FilePrinter.printError("autobanwarning.txt", (chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason + "\r\n"); + FilePrinter.print(FilePrinter.AUTOBAN_WARNING, (chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason); } } diff --git a/src/client/autoban/AutobanManager.java b/src/client/autoban/AutobanManager.java index 6f86cdca28..b9579daae1 100644 --- a/src/client/autoban/AutobanManager.java +++ b/src/client/autoban/AutobanManager.java @@ -58,7 +58,7 @@ public class AutobanManager { } if (ServerConstants.USE_AUTOBAN_LOG) { // Lets log every single point too. - FilePrinter.printError("autobanwarning.txt", MapleCharacter.makeMapleReadable(chr.getName()) + " caused " + fac.name() + " " + reason + "\r\n"); + FilePrinter.print(FilePrinter.AUTOBAN_WARNING, MapleCharacter.makeMapleReadable(chr.getName()) + " caused " + fac.name() + " " + reason); } } diff --git a/src/client/command/CommandsExecutor.java b/src/client/command/CommandsExecutor.java index 3ddda29c7c..701ba30e1e 100644 --- a/src/client/command/CommandsExecutor.java +++ b/src/client/command/CommandsExecutor.java @@ -113,7 +113,7 @@ public class CommandsExecutor { private void writeLog(MapleClient client, String command){ SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm"); FilePrinter.print(FilePrinter.USED_COMMANDS, client.getPlayer().getName() + " used: " + command + " on " - + sdf.format(Calendar.getInstance().getTime()) + "\r\n"); + + sdf.format(Calendar.getInstance().getTime())); } private void addCommandInfo(String name, Class commandClass) { @@ -262,7 +262,7 @@ public class CommandsExecutor { addCommand("ignored", 3, IgnoredCommand.class); addCommand("pos", 3, PosCommand.class); addCommand("togglecoupon", 3, ToggleCouponCommand.class); - addCommand("chat", 3, ChatCommand.class); + addCommand("togglewhitechat", 3, ChatCommand.class); addCommand("fame", 3, FameCommand.class); addCommand("givenx", 3, GiveNxCommand.class); addCommand("givevp", 3, GiveVpCommand.class); diff --git a/src/client/command/commands/gm0/GachaCommand.java b/src/client/command/commands/gm0/GachaCommand.java index 5c4ecd46af..44762e9a43 100644 --- a/src/client/command/commands/gm0/GachaCommand.java +++ b/src/client/command/commands/gm0/GachaCommand.java @@ -61,6 +61,7 @@ public class GachaCommand extends Command { } } talkStr += "\r\nPlease keep in mind that there are items that are in all gachapons and are not listed here."; - c.announce(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, talkStr, "00 00", (byte) 0)); + + c.getAbstractPlayerInteraction().npcTalk(9010000, talkStr); } } diff --git a/src/client/command/commands/gm0/GmCommand.java b/src/client/command/commands/gm0/GmCommand.java index 893b98fa15..906210a636 100644 --- a/src/client/command/commands/gm0/GmCommand.java +++ b/src/client/command/commands/gm0/GmCommand.java @@ -53,7 +53,7 @@ public class GmCommand extends Command { String message = joinStringFrom(params, 0); 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"); + FilePrinter.printError(FilePrinter.COMMAND_GM, MapleCharacter.makeMapleReadable(player.getName()) + ": " + message); player.dropMessage(5, "Your message '" + message + "' was sent to GMs."); player.dropMessage(5, tips[Randomizer.nextInt(tips.length)]); } diff --git a/src/client/command/commands/gm0/ReportBugCommand.java b/src/client/command/commands/gm0/ReportBugCommand.java index 0654da4f0f..06dfff78b6 100644 --- a/src/client/command/commands/gm0/ReportBugCommand.java +++ b/src/client/command/commands/gm0/ReportBugCommand.java @@ -46,7 +46,7 @@ public class ReportBugCommand extends Command { String message = joinStringFrom(params, 0); 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"); + FilePrinter.printError(FilePrinter.COMMAND_BUG, MapleCharacter.makeMapleReadable(player.getName()) + ": " + message); player.dropMessage(5, "Your bug '" + message + "' was submitted successfully to our developers. Thank you!"); } diff --git a/src/client/command/commands/gm1/GotoCommand.java b/src/client/command/commands/gm1/GotoCommand.java index 4ba8bb5a2c..f39df86498 100644 --- a/src/client/command/commands/gm1/GotoCommand.java +++ b/src/client/command/commands/gm1/GotoCommand.java @@ -50,7 +50,7 @@ public class GotoCommand extends Command { } if (player.getEventInstance() != null || MapleMiniDungeonInfo.isDungeonMap(player.getMapId()) || FieldLimit.CANNOTMIGRATE.check(player.getMap().getFieldLimit()) || !player.isAlive()) { - player.yellowMessage("This command can not be used in this map."); + player.dropMessage(1, "This command can not be used in this map."); return; } diff --git a/src/client/command/commands/gm1/WhatDropsFromCommand.java b/src/client/command/commands/gm1/WhatDropsFromCommand.java index 7d80c1b60c..d8d554121d 100644 --- a/src/client/command/commands/gm1/WhatDropsFromCommand.java +++ b/src/client/command/commands/gm1/WhatDropsFromCommand.java @@ -72,6 +72,7 @@ public class WhatDropsFromCommand extends Command { output += "\r\n"; } } - c.announce(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, output, "00 00", (byte) 0)); + + c.getAbstractPlayerInteraction().npcTalk(9010000, output); } } diff --git a/src/client/command/commands/gm1/WhoDropsCommand.java b/src/client/command/commands/gm1/WhoDropsCommand.java index 9d4a428007..81f5dd4580 100644 --- a/src/client/command/commands/gm1/WhoDropsCommand.java +++ b/src/client/command/commands/gm1/WhoDropsCommand.java @@ -86,7 +86,8 @@ public class WhoDropsCommand extends Command { player.dropMessage(5, "The item you searched for doesn't exist."); return; } - c.announce(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, output, "00 00", (byte) 0)); + + c.getAbstractPlayerInteraction().npcTalk(9010000, output); } finally { c.releaseClient(); } diff --git a/src/client/command/commands/gm2/SearchCommand.java b/src/client/command/commands/gm2/SearchCommand.java index 31b3e518b7..81640584d4 100644 --- a/src/client/command/commands/gm2/SearchCommand.java +++ b/src/client/command/commands/gm2/SearchCommand.java @@ -136,6 +136,6 @@ public class SearchCommand extends Command { } sb.append("\r\n#kLoaded within ").append((double) (System.currentTimeMillis() - start) / 1000).append(" seconds.");//because I can, and it's free - c.announce(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, sb.toString(), "00 00", (byte) 0)); + c.getAbstractPlayerInteraction().npcTalk(9010000, sb.toString()); } } diff --git a/src/client/command/commands/gm2/WarpCommand.java b/src/client/command/commands/gm2/WarpCommand.java index aee84fc769..ff03a70f15 100644 --- a/src/client/command/commands/gm2/WarpCommand.java +++ b/src/client/command/commands/gm2/WarpCommand.java @@ -26,7 +26,9 @@ package client.command.commands.gm2; import client.command.Command; import client.MapleClient; import client.MapleCharacter; +import server.maps.FieldLimit; import server.maps.MapleMap; +import server.maps.MapleMiniDungeonInfo; public class WarpCommand extends Command { { @@ -48,6 +50,11 @@ public class WarpCommand extends Command { return; } + if (player.getEventInstance() != null || MapleMiniDungeonInfo.isDungeonMap(player.getMapId()) || FieldLimit.CANNOTMIGRATE.check(player.getMap().getFieldLimit()) || !player.isAlive()) { + player.dropMessage(1, "This command cannot be used in this map."); + return; + } + // expedition issue with this command detected thanks to Masterrulax player.saveLocationOnWarp(); player.changeMap(target, target.getRandomPlayerSpawnpoint()); diff --git a/src/client/command/commands/gm3/MusicCommand.java b/src/client/command/commands/gm3/MusicCommand.java index 3ca6b4953e..9f383d781f 100644 --- a/src/client/command/commands/gm3/MusicCommand.java +++ b/src/client/command/commands/gm3/MusicCommand.java @@ -26,6 +26,7 @@ package client.command.commands.gm3; import client.command.Command; import client.MapleClient; import client.MapleCharacter; +import constants.GameConstants; import tools.MaplePacketCreator; public class MusicCommand extends Command { @@ -33,181 +34,42 @@ public class MusicCommand extends Command { setDescription(""); } + private static String getSongList() { + String songList = "Song:\r\n"; + for (String s : GameConstants.GAME_SONGS) { + songList += (" " + s + "\r\n"); + } + + return songList; + } + @Override public void execute(MapleClient c, String[] params) { - final String[] songs = { - "Jukebox/Congratulation", - "Bgm00/SleepyWood", - "Bgm00/FloralLife", - "Bgm00/GoPicnic", - "Bgm00/Nightmare", - "Bgm00/RestNPeace", - "Bgm01/AncientMove", - "Bgm01/MoonlightShadow", - "Bgm01/WhereTheBarlogFrom", - "Bgm01/CavaBien", - "Bgm01/HighlandStar", - "Bgm01/BadGuys", - "Bgm02/MissingYou", - "Bgm02/WhenTheMorningComes", - "Bgm02/EvilEyes", - "Bgm02/JungleBook", - "Bgm02/AboveTheTreetops", - "Bgm03/Subway", - "Bgm03/Elfwood", - "Bgm03/BlueSky", - "Bgm03/Beachway", - "Bgm03/SnowyVillage", - "Bgm04/PlayWithMe", - "Bgm04/WhiteChristmas", - "Bgm04/UponTheSky", - "Bgm04/ArabPirate", - "Bgm04/Shinin'Harbor", - "Bgm04/WarmRegard", - "Bgm05/WolfWood", - "Bgm05/DownToTheCave", - "Bgm05/AbandonedMine", - "Bgm05/MineQuest", - "Bgm05/HellGate", - "Bgm06/FinalFight", - "Bgm06/WelcomeToTheHell", - "Bgm06/ComeWithMe", - "Bgm06/FlyingInABlueDream", - "Bgm06/FantasticThinking", - "Bgm07/WaltzForWork", - "Bgm07/WhereverYouAre", - "Bgm07/FunnyTimeMaker", - "Bgm07/HighEnough", - "Bgm07/Fantasia", - "Bgm08/LetsMarch", - "Bgm08/ForTheGlory", - "Bgm08/FindingForest", - "Bgm08/LetsHuntAliens", - "Bgm08/PlotOfPixie", - "Bgm09/DarkShadow", - "Bgm09/TheyMenacingYou", - "Bgm09/FairyTale", - "Bgm09/FairyTalediffvers", - "Bgm09/TimeAttack", - "Bgm10/Timeless", - "Bgm10/TimelessB", - "Bgm10/BizarreTales", - "Bgm10/TheWayGrotesque", - "Bgm10/Eregos", - "Bgm11/BlueWorld", - "Bgm11/Aquarium", - "Bgm11/ShiningSea", - "Bgm11/DownTown", - "Bgm11/DarkMountain", - "Bgm12/AquaCave", - "Bgm12/DeepSee", - "Bgm12/WaterWay", - "Bgm12/AcientRemain", - "Bgm12/RuinCastle", - "Bgm12/Dispute", - "Bgm13/CokeTown", - "Bgm13/Leafre", - "Bgm13/Minar'sDream", - "Bgm13/AcientForest", - "Bgm13/TowerOfGoddess", - "Bgm14/DragonLoad", - "Bgm14/HonTale", - "Bgm14/CaveOfHontale", - "Bgm14/DragonNest", - "Bgm14/Ariant", - "Bgm14/HotDesert", - "Bgm15/MureungHill", - "Bgm15/MureungForest", - "Bgm15/WhiteHerb", - "Bgm15/Pirate", - "Bgm15/SunsetDesert", - "Bgm16/Duskofgod", - "Bgm16/FightingPinkBeen", - "Bgm16/Forgetfulness", - "Bgm16/Remembrance", - "Bgm16/Repentance", - "Bgm16/TimeTemple", - "Bgm17/MureungSchool1", - "Bgm17/MureungSchool2", - "Bgm17/MureungSchool3", - "Bgm17/MureungSchool4", - "Bgm18/BlackWing", - "Bgm18/DrillHall", - "Bgm18/QueensGarden", - "Bgm18/RaindropFlower", - "Bgm18/WolfAndSheep", - "Bgm19/BambooGym", - "Bgm19/CrystalCave", - "Bgm19/MushCatle", - "Bgm19/RienVillage", - "Bgm19/SnowDrop", - "Bgm20/GhostShip", - "Bgm20/NetsPiramid", - "Bgm20/UnderSubway", - "Bgm21/2021year", - "Bgm21/2099year", - "Bgm21/2215year", - "Bgm21/2230year", - "Bgm21/2503year", - "Bgm21/KerningSquare", - "Bgm21/KerningSquareField", - "Bgm21/KerningSquareSubway", - "Bgm21/TeraForest", - "BgmEvent/FunnyRabbit", - "BgmEvent/FunnyRabbitFaster", - "BgmEvent/wedding", - "BgmEvent/weddingDance", - "BgmEvent/wichTower", - "BgmGL/amoria", - "BgmGL/Amorianchallenge", - "BgmGL/chapel", - "BgmGL/cathedral", - "BgmGL/Courtyard", - "BgmGL/CrimsonwoodKeep", - "BgmGL/CrimsonwoodKeepInterior", - "BgmGL/GrandmastersGauntlet", - "BgmGL/HauntedHouse", - "BgmGL/NLChunt", - "BgmGL/NLCtown", - "BgmGL/NLCupbeat", - "BgmGL/PartyQuestGL", - "BgmGL/PhantomForest", - "BgmJp/Feeling", - "BgmJp/BizarreForest", - "BgmJp/Hana", - "BgmJp/Yume", - "BgmJp/Bathroom", - "BgmJp/BattleField", - "BgmJp/FirstStepMaster", - "BgmMY/Highland", - "BgmMY/KualaLumpur", - "BgmSG/BoatQuay_field", - "BgmSG/BoatQuay_town", - "BgmSG/CBD_field", - "BgmSG/CBD_town", - "BgmSG/Ghostship", - "BgmUI/ShopBgm", - "BgmUI/Title" - }; + MapleCharacter player = c.getPlayer(); if (params.length < 1) { - player.yellowMessage("Syntax: !music "); - for (String s : songs) { - player.yellowMessage(s); - } + String sendMsg = ""; + + sendMsg += "Syntax: #r!music #k\r\n\r\n"; + sendMsg += getSongList(); + + c.announce(MaplePacketCreator.getNPCTalk(1052015, (byte) 0, sendMsg, "00 00", (byte) 0)); return; } + String song = joinStringFrom(params, 0); - for (String s : songs) { - if (s.equals(song)) { + for (String s : GameConstants.GAME_SONGS) { + if (s.equalsIgnoreCase(song)) { // thanks Masterrulax for finding an issue here player.getMap().broadcastMessage(MaplePacketCreator.musicChange(s)); - player.yellowMessage("Now playing song " + song + "."); - break; + player.yellowMessage("Now playing song " + s + "."); + return; } } - player.yellowMessage("Song not found, please enter a song below."); - for (String s : songs) { - player.yellowMessage(s); - } + + String sendMsg = ""; + sendMsg += "Song not found, please enter a song below.\r\n\r\n"; + sendMsg += getSongList(); + + c.announce(MaplePacketCreator.getNPCTalk(1052015, (byte) 0, sendMsg, "00 00", (byte) 0)); } } diff --git a/src/client/command/commands/gm4/ProItemCommand.java b/src/client/command/commands/gm4/ProItemCommand.java index 40cc7c43a0..86ff99636b 100644 --- a/src/client/command/commands/gm4/ProItemCommand.java +++ b/src/client/command/commands/gm4/ProItemCommand.java @@ -45,11 +45,18 @@ public class ProItemCommand extends Command { player.yellowMessage("Syntax: !proitem []"); return; } + + MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); int itemid = Integer.parseInt(params[0]); + + if(ii.getName(itemid) == null) { + player.yellowMessage("Item id '" + params[0] + "' does not exist."); + return; + } + short stat = (short) Math.max(0, Short.parseShort(params[1])); short spdjmp = params.length >= 3 ? (short) Math.max(0, Short.parseShort(params[2])) : 0; - - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + MapleInventoryType type = ItemConstants.getInventoryType(itemid); if (type.equals(MapleInventoryType.EQUIP)) { Item it = ii.getEquipById(itemid); diff --git a/src/client/command/commands/gm5/DebugCommand.java b/src/client/command/commands/gm5/DebugCommand.java index 43d1fc56f7..9d1296867b 100644 --- a/src/client/command/commands/gm5/DebugCommand.java +++ b/src/client/command/commands/gm5/DebugCommand.java @@ -64,7 +64,7 @@ public class DebugCommand extends Command { msgTypes += ("#L" + i + "#" + debugTypes[i] + "#l\r\n"); } - player.announce(MaplePacketCreator.getNPCTalk(9201143, (byte) 0, msgTypes, "00 00", (byte) 0)); + c.getAbstractPlayerInteraction().npcTalk(9201143, msgTypes); break; case "monster": diff --git a/src/client/creator/CharacterFactory.java b/src/client/creator/CharacterFactory.java index a5ebb12579..5227e90065 100644 --- a/src/client/creator/CharacterFactory.java +++ b/src/client/creator/CharacterFactory.java @@ -28,6 +28,7 @@ import client.inventory.MapleInventoryType; import constants.ServerConstants; import net.server.Server; import server.MapleItemInformationProvider; +import tools.FilePrinter; import tools.MaplePacketCreator; /** @@ -93,6 +94,7 @@ public abstract class CharacterFactory { Server.getInstance().createCharacterEntry(newchar); Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.sendYellowTip("[NEW CHAR]: " + c.getAccountName() + " has created a new character with IGN " + name)); + FilePrinter.print(FilePrinter.CREATED_CHAR + c.getAccountName() + ".txt", c.getAccountName() + " created character with IGN " + name); return 0; } diff --git a/src/client/inventory/MaplePet.java b/src/client/inventory/MaplePet.java index 2f9b8d3fd0..67483cd49e 100644 --- a/src/client/inventory/MaplePet.java +++ b/src/client/inventory/MaplePet.java @@ -81,17 +81,24 @@ public class MaplePet extends Item { return null; } } - - public void deleteFromDb() { + + public static void deleteFromDb(int petid) { try { Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("DELETE FROM pets WHERE `petid` = ?"); - ps.setInt(1, this.getUniqueId()); + ps.setInt(1, petid); ps.executeUpdate(); ps.close(); + + ps = con.prepareStatement("DELETE FROM petignores WHERE `petid` = ?"); // thanks Vcoc for detecting petignores remaining after deletion + ps.setInt(1, petid); + ps.executeUpdate(); + ps.close(); + con.close(); - MapleCashidGenerator.freeCashId(this.getUniqueId()); + MapleCashidGenerator.freeCashId(petid); } catch (SQLException ex) { ex.printStackTrace(); } diff --git a/src/client/inventory/manipulator/MapleInventoryManipulator.java b/src/client/inventory/manipulator/MapleInventoryManipulator.java index 4e4bdd0c06..bfd9ed9e57 100644 --- a/src/client/inventory/manipulator/MapleInventoryManipulator.java +++ b/src/client/inventory/manipulator/MapleInventoryManipulator.java @@ -28,6 +28,7 @@ import client.inventory.Equip; import client.inventory.Item; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; +import client.inventory.MaplePet; import client.inventory.ModifyInventory; import client.newyear.NewYearCardRecord; import constants.ItemConstants; @@ -361,14 +362,15 @@ public class MapleInventoryManipulator { } public static void removeFromSlot(MapleClient c, MapleInventoryType type, short slot, short quantity, boolean fromDrop, boolean consume) { - MapleInventory inv = c.getPlayer().getInventory(type); + MapleCharacter chr = c.getPlayer(); + MapleInventory inv = chr.getInventory(type); Item item = inv.getItem(slot); boolean allowZero = consume && ItemConstants.isRechargeable(item.getItemId()); if(type == MapleInventoryType.EQUIPPED) { inv.lockInventory(); try { - c.getPlayer().unequippedItem((Equip) item); + chr.unequippedItem((Equip) item); inv.removeItem(slot, quantity, allowZero); } finally { inv.unlockInventory(); @@ -376,10 +378,25 @@ public class MapleInventoryManipulator { announceModifyInventory(c, item, fromDrop, allowZero); } else { - inv.removeItem(slot, quantity, allowZero); + int petid = item.getPetId(); + if (petid > -1) { // thanks Vcoc for finding a d/c issue with equipped pets & pets remaining on DB here + int petIdx = chr.getPetIndex(petid); + if(petIdx > -1) { + MaplePet pet = chr.getPet(petIdx); + chr.unequipPet(pet, true); + } - if(type != MapleInventoryType.CANHOLD) { - announceModifyInventory(c, item, fromDrop, allowZero); + inv.removeItem(slot, quantity, allowZero); + if(type != MapleInventoryType.CANHOLD) { + announceModifyInventory(c, item, fromDrop, allowZero); + } + + MaplePet.deleteFromDb(petid); + } else { + inv.removeItem(slot, quantity, allowZero); + if(type != MapleInventoryType.CANHOLD) { + announceModifyInventory(c, item, fromDrop, allowZero); + } } } } diff --git a/src/client/processor/AssignSPProcessor.java b/src/client/processor/AssignSPProcessor.java index 111ed8ade4..a5a4e8ca98 100644 --- a/src/client/processor/AssignSPProcessor.java +++ b/src/client/processor/AssignSPProcessor.java @@ -53,7 +53,7 @@ public class AssignSPProcessor { boolean isBeginnerSkill = false; if ((!GameConstants.isPqSkillMap(player.getMapId()) && GameConstants.isPqSkill(skillid)) || (!player.isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, player.getJob().getId()) && !player.isGM())) { AutobanFactory.PACKET_EDIT.alert(player, "tried to packet edit in distributing sp."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skillid + " without it being in their job.\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skillid + " without it being in their job."); final MapleClient client = c; ThreadManager.getInstance().newTask(new Runnable() { diff --git a/src/client/processor/DueyProcessor.java b/src/client/processor/DueyProcessor.java index 42b4e005ac..b06ffdd3d9 100644 --- a/src/client/processor/DueyProcessor.java +++ b/src/client/processor/DueyProcessor.java @@ -351,7 +351,7 @@ public class DueyProcessor { final long sendMesos = (long) mesos + fee; if (mesos < 0 || sendMesos > Integer.MAX_VALUE || (amount < 1 && mesos == 0)) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with duey."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use duey with mesos " + mesos + " and amount " + amount + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use duey with mesos " + mesos + " and amount " + amount); c.disconnect(true, false); return; } @@ -464,7 +464,7 @@ public class DueyProcessor { dp = dueypack; if(dp == null) { c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_RECV_UNKNOWN_ERROR.getCode())); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to receive package from duey with id " + packageid + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to receive package from duey with id " + packageid); return; } diff --git a/src/client/processor/FredrickProcessor.java b/src/client/processor/FredrickProcessor.java index 96813f6711..50cd97f912 100644 --- a/src/client/processor/FredrickProcessor.java +++ b/src/client/processor/FredrickProcessor.java @@ -94,7 +94,7 @@ public class FredrickProcessor { Item item = it.getLeft(); MapleInventoryManipulator.addFromDrop(chr.getClient(), item, false); String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId()); - FilePrinter.print(FilePrinter.FREDRICK + chr.getName() + ".txt", chr.getName() + " gained " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n"); + FilePrinter.print(FilePrinter.FREDRICK + chr.getName() + ".txt", chr.getName() + " gained " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")"); } chr.announce(MaplePacketCreator.fredrickMessage((byte) 0x1E)); diff --git a/src/client/processor/SpawnPetProcessor.java b/src/client/processor/SpawnPetProcessor.java index 8264cbee8c..459fba8b8c 100644 --- a/src/client/processor/SpawnPetProcessor.java +++ b/src/client/processor/SpawnPetProcessor.java @@ -62,7 +62,7 @@ public class SpawnPetProcessor { long expiration = chr.getInventory(MapleInventoryType.CASH).getItem(slot).getExpiration(); MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, petid, (short) 1, false, false); MapleInventoryManipulator.addById(c, evolveid, (short) 1, null, petId, expiration); - pet.deleteFromDb(); + MaplePet.deleteFromDb(petId); c.announce(MaplePacketCreator.enableActions()); return; diff --git a/src/client/processor/StorageProcessor.java b/src/client/processor/StorageProcessor.java index 0d8e731eba..77eeafd740 100644 --- a/src/client/processor/StorageProcessor.java +++ b/src/client/processor/StorageProcessor.java @@ -61,7 +61,7 @@ public class StorageProcessor { byte slot = slea.readByte(); if (slot < 0 || slot > storage.getSlots()) { // removal starts at zero AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage."); - FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to work with storage slot " + slot + "\r\n"); + FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to work with storage slot " + slot); c.disconnect(true, false); return; } @@ -84,7 +84,7 @@ public class StorageProcessor { if (MapleInventoryManipulator.checkSpace(c, item.getItemId(), item.getQuantity(), item.getOwner())) { item = storage.takeOut(slot);//actually the same but idc String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId()); - FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " took out " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n"); + FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " took out " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")"); chr.setUsedStorage(); MapleKarmaManipulator.toggleKarmaFlagToUntradeable(item); MapleInventoryManipulator.addFromDrop(c, item, false); @@ -101,7 +101,7 @@ public class StorageProcessor { MapleInventory Inv = chr.getInventory(slotType); if (slot < 1 || slot > Inv.getSlotLimit()) { //player inv starts at one AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage."); - FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to store item at slot " + slot + "\r\n"); + FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to store item at slot " + slot); c.disconnect(true, false); return; } @@ -137,7 +137,7 @@ public class StorageProcessor { storage.store(item); storage.sendStored(c, ItemConstants.getInventoryType(itemId)); String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId()); - FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " stored " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n"); + FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " stored " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")"); chr.setUsedStorage(); } } @@ -164,7 +164,7 @@ public class StorageProcessor { } storage.setMeso(storageMesos - meso); chr.gainMeso(meso, false, true, false); - FilePrinter.print(FilePrinter.STORAGE + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + (meso > 0 ? " took out " : " stored ") + Math.abs(meso) + " mesos\r\n"); + FilePrinter.print(FilePrinter.STORAGE + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + (meso > 0 ? " took out " : " stored ") + Math.abs(meso) + " mesos"); chr.setUsedStorage(); } else { c.announce(MaplePacketCreator.enableActions()); diff --git a/src/constants/GameConstants.java b/src/constants/GameConstants.java index 8ca837828e..1c5b8c7dd7 100644 --- a/src/constants/GameConstants.java +++ b/src/constants/GameConstants.java @@ -1,5 +1,7 @@ package constants; +import java.util.ArrayList; +import java.util.List; import java.util.HashMap; import java.util.Map; import client.MapleJob; @@ -102,6 +104,161 @@ public class GameConstants { put("fm", 910000000); }}; + public static final List GAME_SONGS = new ArrayList(170) {{ + add("Jukebox/Congratulation"); + add("Bgm00/SleepyWood"); + add("Bgm00/FloralLife"); + add("Bgm00/GoPicnic"); + add("Bgm00/Nightmare"); + add("Bgm00/RestNPeace"); + add("Bgm01/AncientMove"); + add("Bgm01/MoonlightShadow"); + add("Bgm01/WhereTheBarlogFrom"); + add("Bgm01/CavaBien"); + add("Bgm01/HighlandStar"); + add("Bgm01/BadGuys"); + add("Bgm02/MissingYou"); + add("Bgm02/WhenTheMorningComes"); + add("Bgm02/EvilEyes"); + add("Bgm02/JungleBook"); + add("Bgm02/AboveTheTreetops"); + add("Bgm03/Subway"); + add("Bgm03/Elfwood"); + add("Bgm03/BlueSky"); + add("Bgm03/Beachway"); + add("Bgm03/SnowyVillage"); + add("Bgm04/PlayWithMe"); + add("Bgm04/WhiteChristmas"); + add("Bgm04/UponTheSky"); + add("Bgm04/ArabPirate"); + add("Bgm04/Shinin'Harbor"); + add("Bgm04/WarmRegard"); + add("Bgm05/WolfWood"); + add("Bgm05/DownToTheCave"); + add("Bgm05/AbandonedMine"); + add("Bgm05/MineQuest"); + add("Bgm05/HellGate"); + add("Bgm06/FinalFight"); + add("Bgm06/WelcomeToTheHell"); + add("Bgm06/ComeWithMe"); + add("Bgm06/FlyingInABlueDream"); + add("Bgm06/FantasticThinking"); + add("Bgm07/WaltzForWork"); + add("Bgm07/WhereverYouAre"); + add("Bgm07/FunnyTimeMaker"); + add("Bgm07/HighEnough"); + add("Bgm07/Fantasia"); + add("Bgm08/LetsMarch"); + add("Bgm08/ForTheGlory"); + add("Bgm08/FindingForest"); + add("Bgm08/LetsHuntAliens"); + add("Bgm08/PlotOfPixie"); + add("Bgm09/DarkShadow"); + add("Bgm09/TheyMenacingYou"); + add("Bgm09/FairyTale"); + add("Bgm09/FairyTalediffvers"); + add("Bgm09/TimeAttack"); + add("Bgm10/Timeless"); + add("Bgm10/TimelessB"); + add("Bgm10/BizarreTales"); + add("Bgm10/TheWayGrotesque"); + add("Bgm10/Eregos"); + add("Bgm11/BlueWorld"); + add("Bgm11/Aquarium"); + add("Bgm11/ShiningSea"); + add("Bgm11/DownTown"); + add("Bgm11/DarkMountain"); + add("Bgm12/AquaCave"); + add("Bgm12/DeepSee"); + add("Bgm12/WaterWay"); + add("Bgm12/AcientRemain"); + add("Bgm12/RuinCastle"); + add("Bgm12/Dispute"); + add("Bgm13/CokeTown"); + add("Bgm13/Leafre"); + add("Bgm13/Minar'sDream"); + add("Bgm13/AcientForest"); + add("Bgm13/TowerOfGoddess"); + add("Bgm14/DragonLoad"); + add("Bgm14/HonTale"); + add("Bgm14/CaveOfHontale"); + add("Bgm14/DragonNest"); + add("Bgm14/Ariant"); + add("Bgm14/HotDesert"); + add("Bgm15/MureungHill"); + add("Bgm15/MureungForest"); + add("Bgm15/WhiteHerb"); + add("Bgm15/Pirate"); + add("Bgm15/SunsetDesert"); + add("Bgm16/Duskofgod"); + add("Bgm16/FightingPinkBeen"); + add("Bgm16/Forgetfulness"); + add("Bgm16/Remembrance"); + add("Bgm16/Repentance"); + add("Bgm16/TimeTemple"); + add("Bgm17/MureungSchool1"); + add("Bgm17/MureungSchool2"); + add("Bgm17/MureungSchool3"); + add("Bgm17/MureungSchool4"); + add("Bgm18/BlackWing"); + add("Bgm18/DrillHall"); + add("Bgm18/QueensGarden"); + add("Bgm18/RaindropFlower"); + add("Bgm18/WolfAndSheep"); + add("Bgm19/BambooGym"); + add("Bgm19/CrystalCave"); + add("Bgm19/MushCatle"); + add("Bgm19/RienVillage"); + add("Bgm19/SnowDrop"); + add("Bgm20/GhostShip"); + add("Bgm20/NetsPiramid"); + add("Bgm20/UnderSubway"); + add("Bgm21/2021year"); + add("Bgm21/2099year"); + add("Bgm21/2215year"); + add("Bgm21/2230year"); + add("Bgm21/2503year"); + add("Bgm21/KerningSquare"); + add("Bgm21/KerningSquareField"); + add("Bgm21/KerningSquareSubway"); + add("Bgm21/TeraForest"); + add("BgmEvent/FunnyRabbit"); + add("BgmEvent/FunnyRabbitFaster"); + add("BgmEvent/wedding"); + add("BgmEvent/weddingDance"); + add("BgmEvent/wichTower"); + add("BgmGL/amoria"); + add("BgmGL/Amorianchallenge"); + add("BgmGL/chapel"); + add("BgmGL/cathedral"); + add("BgmGL/Courtyard"); + add("BgmGL/CrimsonwoodKeep"); + add("BgmGL/CrimsonwoodKeepInterior"); + add("BgmGL/GrandmastersGauntlet"); + add("BgmGL/HauntedHouse"); + add("BgmGL/NLChunt"); + add("BgmGL/NLCtown"); + add("BgmGL/NLCupbeat"); + add("BgmGL/PartyQuestGL"); + add("BgmGL/PhantomForest"); + add("BgmJp/Feeling"); + add("BgmJp/BizarreForest"); + add("BgmJp/Hana"); + add("BgmJp/Yume"); + add("BgmJp/Bathroom"); + add("BgmJp/BattleField"); + add("BgmJp/FirstStepMaster"); + add("BgmMY/Highland"); + add("BgmMY/KualaLumpur"); + add("BgmSG/BoatQuay_field"); + add("BgmSG/BoatQuay_town"); + add("BgmSG/CBD_field"); + add("BgmSG/CBD_town"); + add("BgmSG/Ghostship"); + add("BgmUI/ShopBgm"); + add("BgmUI/Title"); + }}; + // MapleStory default keyset private static final int[] DEFAULT_KEY = {18, 65, 2, 23, 3, 4, 5, 6, 16, 17, 19, 25, 26, 27, 31, 34, 35, 37, 38, 40, 43, 44, 45, 46, 50, 56, 59, 60, 61, 62, 63, 64, 57, 48, 29, 7, 24, 33, 41, 39}; private static final int[] DEFAULT_TYPE = {4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 5, 6, 6, 6, 6, 6, 6, 5, 4, 5, 4, 4, 4, 4, 4}; diff --git a/src/net/server/audit/ThreadTracker.java b/src/net/server/audit/ThreadTracker.java index 7ad940f346..319f1bd144 100644 --- a/src/net/server/audit/ThreadTracker.java +++ b/src/net/server/audit/ThreadTracker.java @@ -198,7 +198,7 @@ public class ThreadTracker { dateFormat.setTimeZone(TimeZone.getDefault()); FilePrinter.printError(FilePrinter.DEADLOCK_STATE, printThreadTrackerState(dateFormat.format(new Date()))); - //FilePrinter.printError(FilePrinter.DEADLOCK_STATE, "[" + dateFormat.format(new Date()) + "] Presenting current lock path for lockid " + lockId.name() + ".\r\n" + printLockStatus(lockId) + "\r\n-------------------------------\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_STATE, "[" + dateFormat.format(new Date()) + "] Presenting current lock path for lockid " + lockId.name() + ".\r\n" + printLockStatus(lockId) + "\r\n-------------------------------"); } } else { long tid = Thread.currentThread().getId(); diff --git a/src/net/server/audit/locks/active/TrackerReadLock.java b/src/net/server/audit/locks/active/TrackerReadLock.java index 22fbc26183..bed688d8f0 100644 --- a/src/net/server/audit/locks/active/TrackerReadLock.java +++ b/src/net/server/audit/locks/active/TrackerReadLock.java @@ -64,7 +64,7 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } @@ -89,7 +89,7 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements if(super.tryLock()) { if(ServerConstants.USE_THREAD_TRACKER) { if(deadlockedState != null) { - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } diff --git a/src/net/server/audit/locks/active/TrackerReentrantLock.java b/src/net/server/audit/locks/active/TrackerReentrantLock.java index c60fe5f892..5a211086f2 100644 --- a/src/net/server/audit/locks/active/TrackerReentrantLock.java +++ b/src/net/server/audit/locks/active/TrackerReentrantLock.java @@ -66,7 +66,7 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } @@ -91,7 +91,7 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen if(super.tryLock()) { if(ServerConstants.USE_THREAD_TRACKER) { if(deadlockedState != null) { - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } diff --git a/src/net/server/audit/locks/active/TrackerWriteLock.java b/src/net/server/audit/locks/active/TrackerWriteLock.java index 82bc429106..dd160fcad9 100644 --- a/src/net/server/audit/locks/active/TrackerWriteLock.java +++ b/src/net/server/audit/locks/active/TrackerWriteLock.java @@ -62,7 +62,7 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "[CRITICAL] " + dateFormat.format(new Date()) + " Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } @@ -87,7 +87,7 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement if(super.tryLock()) { if(ServerConstants.USE_THREAD_TRACKER) { if(deadlockedState != null) { - //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState) + "\r\n\r\n"); + //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; } diff --git a/src/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/net/server/channel/handlers/AbstractDealDamageHandler.java index df5168eaeb..6eecd578dc 100644 --- a/src/net/server/channel/handlers/AbstractDealDamageHandler.java +++ b/src/net/server/channel/handlers/AbstractDealDamageHandler.java @@ -326,8 +326,8 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl } else if (attack.skill == ILArchMage.ICE_DEMON) { monster.setTempEffectiveness(Element.FIRE, ElementalEffectiveness.WEAK, SkillFactory.getSkill(ILArchMage.ICE_DEMON).getEffect(player.getSkillLevel(SkillFactory.getSkill(ILArchMage.ICE_DEMON))).getDuration() * 1000); } else if (attack.skill == Outlaw.HOMING_BEACON || attack.skill == Corsair.BULLSEYE) { - player.setMarkedMonster(monster.getObjectId()); - player.announce(MaplePacketCreator.giveBuff(1, attack.skill, Collections.singletonList(new Pair<>(MapleBuffStat.HOMING_BEACON, monster.getObjectId())))); + MapleStatEffect beacon = SkillFactory.getSkill(attack.skill).getEffect(player.getSkillLevel(attack.skill)); + beacon.applyBeaconBuff(player, monster.getObjectId()); } else if (attack.skill == Outlaw.FLAME_THROWER) { if (!monster.isBoss()) { Skill type = SkillFactory.getSkill(Outlaw.FLAME_THROWER); diff --git a/src/net/server/channel/handlers/CashOperationHandler.java b/src/net/server/channel/handlers/CashOperationHandler.java index 6ad2bd3722..34fbcc7ecb 100644 --- a/src/net/server/channel/handlers/CashOperationHandler.java +++ b/src/net/server/channel/handlers/CashOperationHandler.java @@ -172,7 +172,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler { return; } if (chr.getStorage().gainSlots(4)) { - FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " bought 4 slots to their account storage.\r\n"); + FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " bought 4 slots to their account storage."); chr.setUsedStorage(); c.announce(MaplePacketCreator.showBoughtStorageSlots(chr.getStorage().getSlots())); @@ -187,7 +187,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler { return; } if (chr.getStorage().gainSlots(8)) { // thanks ABaldParrot & Thora for detecting storage issues here - FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " bought 8 slots to their account storage.\r\n"); + FilePrinter.print(FilePrinter.STORAGE + c.getAccountName() + ".txt", c.getPlayer().getName() + " bought 8 slots to their account storage."); chr.setUsedStorage(); c.announce(MaplePacketCreator.showBoughtStorageSlots(chr.getStorage().getSlots())); diff --git a/src/net/server/channel/handlers/GeneralChatHandler.java b/src/net/server/channel/handlers/GeneralChatHandler.java index beacc59592..5fbea4eb43 100644 --- a/src/net/server/channel/handlers/GeneralChatHandler.java +++ b/src/net/server/channel/handlers/GeneralChatHandler.java @@ -43,7 +43,7 @@ public final class GeneralChatHandler extends AbstractMaplePacketHandler { } if (s.length() > Byte.MAX_VALUE && !chr.isGM()) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit in General Chat."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + s.length() + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + s.length()); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/GiveFameHandler.java b/src/net/server/channel/handlers/GiveFameHandler.java index c8c11a7943..fadf9f8e6b 100644 --- a/src/net/server/channel/handlers/GiveFameHandler.java +++ b/src/net/server/channel/handlers/GiveFameHandler.java @@ -43,7 +43,7 @@ public final class GiveFameHandler extends AbstractMaplePacketHandler { return; } else if (famechange != 1 && famechange != -1) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit fame."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to fame hack with famechange " + famechange + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to fame hack with famechange " + famechange); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/ItemPickupHandler.java b/src/net/server/channel/handlers/ItemPickupHandler.java index 988d2fc0ca..fca88aae9f 100644 --- a/src/net/server/channel/handlers/ItemPickupHandler.java +++ b/src/net/server/channel/handlers/ItemPickupHandler.java @@ -49,7 +49,7 @@ public final class ItemPickupHandler extends AbstractMaplePacketHandler { Point charPos = chr.getPosition(); Point obPos = ob.getPosition(); if (Math.abs(charPos.getX() - obPos.getX()) > 800 || Math.abs(charPos.getY() - obPos.getY()) > 600) { - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to pick up an item too far away. Mapid: " + chr.getMapId() + " Player pos: " + charPos + " Object pos: " + obPos + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to pick up an item too far away. Mapid: " + chr.getMapId() + " Player pos: " + charPos + " Object pos: " + obPos); return; } diff --git a/src/net/server/channel/handlers/KeymapChangeHandler.java b/src/net/server/channel/handlers/KeymapChangeHandler.java index f7762d40df..5613ddaef6 100644 --- a/src/net/server/channel/handlers/KeymapChangeHandler.java +++ b/src/net/server/channel/handlers/KeymapChangeHandler.java @@ -51,7 +51,7 @@ public final class KeymapChangeHandler extends AbstractMaplePacketHandler { isBanndedSkill = GameConstants.bannedBindSkills(skill.getId()); if (isBanndedSkill || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skill.getId())) || (!GameConstants.isInJobTree(skill.getId(), c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) { //for those skills are are "technically" in the beginner tab, like bamboo rain in Dojo or skills you find in PYPQ //AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit keymapping."); - //FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId() + "\r\n"); + //FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId()); //c.disconnect(true, false); //return; diff --git a/src/net/server/channel/handlers/MultiChatHandler.java b/src/net/server/channel/handlers/MultiChatHandler.java index af883d8ad5..8924774c32 100644 --- a/src/net/server/channel/handlers/MultiChatHandler.java +++ b/src/net/server/channel/handlers/MultiChatHandler.java @@ -50,7 +50,7 @@ public final class MultiChatHandler extends AbstractMaplePacketHandler { String chattext = slea.readMapleAsciiString(); if (chattext.length() > Byte.MAX_VALUE && !player.isGM()) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit chats."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + chattext.length() + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + chattext.length()); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/NPCShopHandler.java b/src/net/server/channel/handlers/NPCShopHandler.java index d59fe28163..1598df933c 100644 --- a/src/net/server/channel/handlers/NPCShopHandler.java +++ b/src/net/server/channel/handlers/NPCShopHandler.java @@ -41,7 +41,7 @@ public final class NPCShopHandler extends AbstractMaplePacketHandler { short quantity = slea.readShort(); if (quantity < 1) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit a npc shop."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to buy quantity " + quantity + " of item id " + itemId + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to buy quantity " + quantity + " of item id " + itemId); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/NPCTalkHandler.java b/src/net/server/channel/handlers/NPCTalkHandler.java index aeaa78ade2..64f5a3b7fe 100644 --- a/src/net/server/channel/handlers/NPCTalkHandler.java +++ b/src/net/server/channel/handlers/NPCTalkHandler.java @@ -67,7 +67,7 @@ public final class NPCTalkHandler extends AbstractMaplePacketHandler { boolean hasNpcScript = NPCScriptManager.getInstance().start(c, npc.getId(), oid, null); if (!hasNpcScript) { if (!npc.hasShop()) { - FilePrinter.printError(FilePrinter.NPC_UNCODED, "NPC " + npc.getName() + "(" + npc.getId() + ") is not coded.\r\n"); + FilePrinter.printError(FilePrinter.NPC_UNCODED, "NPC " + npc.getName() + "(" + npc.getId() + ") is not coded."); return; } else if(c.getPlayer().getShop() != null) { c.announce(MaplePacketCreator.enableActions()); diff --git a/src/net/server/channel/handlers/PetChatHandler.java b/src/net/server/channel/handlers/PetChatHandler.java index e7cd003243..448583b5f6 100644 --- a/src/net/server/channel/handlers/PetChatHandler.java +++ b/src/net/server/channel/handlers/PetChatHandler.java @@ -45,7 +45,7 @@ public final class PetChatHandler extends AbstractMaplePacketHandler { String text = slea.readMapleAsciiString(); if (text.length() > Byte.MAX_VALUE) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with pets."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length() + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length()); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/PlayerInteractionHandler.java b/src/net/server/channel/handlers/PlayerInteractionHandler.java index 44a70242ab..d674c85ac0 100644 --- a/src/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/net/server/channel/handlers/PlayerInteractionHandler.java @@ -577,7 +577,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { int slot = slea.readShort(); if (slot >= shop.getItems().size() || slot < 0) { AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit with a player shop."); - FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to remove item at slot " + slot + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to remove item at slot " + slot); c.disconnect(true, false); return; } @@ -609,7 +609,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { short quantity = slea.readShort(); if (quantity < 1) { AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit with a hired merchant and or player shop."); - FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to buy item " + itemid + " with quantity " + quantity + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to buy item " + itemid + " with quantity " + quantity); c.disconnect(true, false); return; } @@ -635,7 +635,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { int slot = slea.readShort(); if (slot >= merchant.getItems().size() || slot < 0) { AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit with a hired merchant."); - FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to remove item at slot " + slot + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to remove item at slot " + slot); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/PlayerMapTransitionHandler.java b/src/net/server/channel/handlers/PlayerMapTransitionHandler.java index da797948ed..af7ccc57b5 100644 --- a/src/net/server/channel/handlers/PlayerMapTransitionHandler.java +++ b/src/net/server/channel/handlers/PlayerMapTransitionHandler.java @@ -20,8 +20,14 @@ package net.server.channel.handlers; +import client.MapleBuffStat; +import client.MapleCharacter; import client.MapleClient; +import java.util.Collections; +import java.util.List; import net.AbstractMaplePacketHandler; +import tools.MaplePacketCreator; +import tools.Pair; import tools.data.input.SeekableLittleEndianAccessor; /** @@ -32,6 +38,15 @@ public final class PlayerMapTransitionHandler extends AbstractMaplePacketHandler @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - c.getPlayer().setMapTransitionComplete(); + MapleCharacter chr = c.getPlayer(); + chr.setMapTransitionComplete(); + + int beaconid = chr.getBuffSource(MapleBuffStat.HOMING_BEACON); + if (beaconid != -1) { + chr.cancelBuffStats(MapleBuffStat.HOMING_BEACON); + + final List> stat = Collections.singletonList(new Pair<>(MapleBuffStat.HOMING_BEACON, 0)); + chr.announce(MaplePacketCreator.giveBuff(1, beaconid, stat)); + } } } \ No newline at end of file diff --git a/src/net/server/channel/handlers/SpecialMoveHandler.java b/src/net/server/channel/handlers/SpecialMoveHandler.java index 1ad186209f..1fb868d340 100644 --- a/src/net/server/channel/handlers/SpecialMoveHandler.java +++ b/src/net/server/channel/handlers/SpecialMoveHandler.java @@ -54,7 +54,7 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler { /* if ((!GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(skillid)) || (!chr.isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, chr.getJob().getId()) && !chr.isGM())) { AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit skills."); - FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to use skill " + skillid + " without it being in their job.\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to use skill " + skillid + " without it being in their job."); c.disconnect(true, false); return; } diff --git a/src/net/server/channel/handlers/WhisperHandler.java b/src/net/server/channel/handlers/WhisperHandler.java index 3be5be386e..d3e35f78dd 100644 --- a/src/net/server/channel/handlers/WhisperHandler.java +++ b/src/net/server/channel/handlers/WhisperHandler.java @@ -56,7 +56,7 @@ public final class WhisperHandler extends AbstractMaplePacketHandler { } if (text.length() > Byte.MAX_VALUE && !player.isGM()) { AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with whispers."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length() + "\r\n"); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length()); c.disconnect(true, false); return; } diff --git a/src/net/server/handlers/login/DeleteCharHandler.java b/src/net/server/handlers/login/DeleteCharHandler.java index ae64c2d3d9..5220c9ea3a 100644 --- a/src/net/server/handlers/login/DeleteCharHandler.java +++ b/src/net/server/handlers/login/DeleteCharHandler.java @@ -35,7 +35,7 @@ public final class DeleteCharHandler extends AbstractMaplePacketHandler { int cid = slea.readInt(); if (c.checkPic(pic)) { if(c.deleteCharacter(cid, c.getAccID())) { - FilePrinter.print(FilePrinter.DELETED_CHARACTERS + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid + "\r\n"); + FilePrinter.print(FilePrinter.DELETED_CHAR + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid); c.announce(MaplePacketCreator.deleteCharResponse(cid, 0)); } else { c.announce(MaplePacketCreator.deleteCharResponse(cid, 0x14)); diff --git a/src/net/server/worker/CouponWorker.java b/src/net/server/worker/CouponWorker.java index 8e460c14ba..484c4b225f 100644 --- a/src/net/server/worker/CouponWorker.java +++ b/src/net/server/worker/CouponWorker.java @@ -34,7 +34,7 @@ public class CouponWorker implements Runnable { Server.getInstance().updateActiveCoupons(); Server.getInstance().commitActiveCoupons(); } catch(SQLException sqle) { - FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, "Unexpected SQL error: " + sqle.getMessage() + "\n\n"); + FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, "Unexpected SQL error: " + sqle.getMessage()); } } } diff --git a/src/scripting/AbstractPlayerInteraction.java b/src/scripting/AbstractPlayerInteraction.java index fedd040262..6b3363ef8a 100644 --- a/src/scripting/AbstractPlayerInteraction.java +++ b/src/scripting/AbstractPlayerInteraction.java @@ -450,7 +450,6 @@ public class AbstractPlayerInteraction { } Item tmp = gainItem(afterId, (short) 1, false, true, period, target); - getPlayer().unequipPet(target, true, false); /* evolved = MaplePet.loadFromDb(tmp.getItemId(), tmp.getPosition(), tmp.getPetId()); diff --git a/src/scripting/quest/QuestScriptManager.java b/src/scripting/quest/QuestScriptManager.java index 7b94add557..c599a943f2 100644 --- a/src/scripting/quest/QuestScriptManager.java +++ b/src/scripting/quest/QuestScriptManager.java @@ -67,7 +67,7 @@ public class QuestScriptManager extends AbstractScriptManager { if(GameConstants.isMedalQuest(questid)) { // start generic medal quest iv = getInvocable("quest/medalQuest.js", c); } else { - FilePrinter.printError(FilePrinter.QUEST_UNCODED, "START Quest " + questid + " is uncoded.\r\n"); + FilePrinter.printError(FilePrinter.QUEST_UNCODED, "START Quest " + questid + " is uncoded."); } } if (iv == null || QuestScriptManager.getInstance() == null) { @@ -122,7 +122,7 @@ public class QuestScriptManager extends AbstractScriptManager { if(GameConstants.isMedalQuest(questid)) { // start generic medal quest iv = getInvocable("quest/medalQuest.js", c); } else { - FilePrinter.printError(FilePrinter.QUEST_UNCODED, "END Quest " + questid + " is uncoded.\r\n"); + FilePrinter.printError(FilePrinter.QUEST_UNCODED, "END Quest " + questid + " is uncoded."); qm.dispose(); return; } diff --git a/src/server/MapleItemInformationProvider.java b/src/server/MapleItemInformationProvider.java index 7a5853f4d9..8416453e14 100644 --- a/src/server/MapleItemInformationProvider.java +++ b/src/server/MapleItemInformationProvider.java @@ -1659,7 +1659,7 @@ public class MapleItemInformationProvider { String itemName = MapleItemInformationProvider.getInstance().getName(equip.getItemId()); 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"); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to equip " + itemName + " into " + dst + " slot."); return false; } diff --git a/src/server/MapleStatEffect.java b/src/server/MapleStatEffect.java index 05c6ee24b5..6db3bd234d 100644 --- a/src/server/MapleStatEffect.java +++ b/src/server/MapleStatEffect.java @@ -1016,6 +1016,14 @@ public class MapleStatEffect { applyto.registerEffect(this, starttime, Long.MAX_VALUE, false); } + public final void applyBeaconBuff(final MapleCharacter applyto, int objectid) { // thanks Thora & Hyun for reporting an issue with homing beacon autoflagging mobs when changing maps + final List> stat = Collections.singletonList(new Pair<>(MapleBuffStat.HOMING_BEACON, objectid)); + applyto.announce(MaplePacketCreator.giveBuff(1, sourceid, stat)); + + final long starttime = Server.getInstance().getCurrentTime(); + applyto.registerEffect(this, starttime, Long.MAX_VALUE, false); + } + public void updateBuffEffect(MapleCharacter target, List> activeStats, long starttime) { int localDuration = getBuffLocalDuration(); localDuration = alchemistModifyVal(target, localDuration, false); diff --git a/src/server/maps/MapleMap.java b/src/server/maps/MapleMap.java index 9482cc2de6..5b4d1fff58 100644 --- a/src/server/maps/MapleMap.java +++ b/src/server/maps/MapleMap.java @@ -1952,7 +1952,7 @@ public class MapleMap { } else if (monster.getId() == 9400326 || monster.getId() == 9400331 || monster.getId() == 9400336) { monsterItemDrop(monster, monster.getDropPeriodTime()); } else { - FilePrinter.printError(FilePrinter.UNHANDLED_EVENT, "UNCODED TIMED MOB DETECTED: " + monster.getId() + "\r\n"); + FilePrinter.printError(FilePrinter.UNHANDLED_EVENT, "UNCODED TIMED MOB DETECTED: " + monster.getId()); } } diff --git a/src/tools/FilePrinter.java b/src/tools/FilePrinter.java index 4ae5a12416..cef5a64c29 100644 --- a/src/tools/FilePrinter.java +++ b/src/tools/FilePrinter.java @@ -11,55 +11,67 @@ import java.util.Calendar; public class FilePrinter { public static final String - ACCOUNT_STUCK = "accountStuck.txt", - EXCEPTION_CAUGHT = "exceptionCaught.txt", - CLIENT_START = "clientStartError.txt", - ADD_PLAYER = "addPlayer.txt", - MAPLE_MAP = "mapleMap.txt", - ERROR38 = "error38.txt", - PACKET_LOG = "log.txt", - CASHITEM_BOUGHT = "cashlog.txt", - EXCEPTION = "exceptions.txt", - SQL_EXCEPTION = "sqlexceptions.txt", - PACKET_HANDLER = "PacketHandler/", - PORTAL = "portals/", - PORTAL_STUCK = "portalblocks/", - NPC = "npcs/", - INVOCABLE = "invocable/", - REACTOR = "reactors/", - QUEST = "quests/", - ITEM = "items/", - MOB_MOVEMENT = "mobmovement.txt", - MAP_SCRIPT = "mapscript/", - DIRECTION = "directions/", - SAVE_CHAR = "saveToDB.txt", - INSERT_CHAR = "insertCharacter.txt", - LOAD_CHAR = "loadCharFromDB.txt", - UNHANDLED_EVENT = "doesNotExist.txt", - SESSION = "sessions.txt", - EXPLOITS = "exploits/", - STORAGE = "storage/", - PACKET_LOGS = "packetlogs/", - DELETED_CHARACTERS = "deletedchars/", - FREDRICK = "fredrick/", - NPC_UNCODED = "uncodedNPCs.txt", - QUEST_UNCODED = "uncodedQuests.txt", - AUTOSAVING_CHARACTER = "saveCharAuto.txt", - SAVING_CHARACTER = "saveChar.txt", - USED_COMMANDS = "usedCommands.txt", - DEADLOCK_ERROR = "deadlocks.txt", - DEADLOCK_STACK = "deadlocks/path.txt", - DEADLOCK_LOCKS = "deadlocks/locks.txt", - DEADLOCK_STATE = "deadlocks/state.txt", - DISPOSED_LOCKS = "deadlocks/disposed.txt"; + AUTOBAN_WARNING = "game/AutoBanWarning.txt", // log naming version by Vcoc + AUTOBAN_DC = "game/AutoBanDC.txt", + ACCOUNT_STUCK = "players/AccountStuck.txt", + COMMAND_GM = "reports/Gm.txt", + COMMAND_BUG = "reports/Bug.txt", + LOG_TRADE = "interactions/Trades.txt", + LOG_EXPEDITION = "interactions/Expeditions.txt", + LOG_LEAF = "interactions/MapleLeaves.txt", + LOG_GACHAPON = "interactions/Gachapon.txt", + LOG_CHAT = "interactions/ChatLog.txt", + EXCEPTION_CAUGHT = "game/ExceptionCaught.txt", + CLIENT_START = "game/ClientStartError.txt", + MAPLE_MAP = "game/MapleMap.txt", + ERROR38 = "game/Error38.txt", + PACKET_LOG = "game/Log.txt", + CASHITEM_BOUGHT = "interactions/CashLog.txt", + EXCEPTION = "game/Exceptions.txt", + SQL_EXCEPTION = "game/SqlExceptions.txt", + PACKET_HANDLER = "game/packethandler/", + PORTAL = "game/portals/", + PORTAL_STUCK = "game/portalblocks/", + NPC = "game/npcs/", + INVOCABLE = "game/invocable/", + REACTOR = "game/reactors/", + QUEST = "game/quests/", + ITEM = "game/items/", + MOB_MOVEMENT = "game/MobMovement.txt", + MAP_SCRIPT = "game/mapscript/", + DIRECTION = "game/directions/", + SAVE_CHAR = "players/SaveToDB.txt", + INSERT_CHAR = "players/InsertCharacter.txt", + LOAD_CHAR = "players/LoadCharFromDB.txt", + CREATED_CHAR = "players/createdchars/", + DELETED_CHAR = "players/deletedchars/", + UNHANDLED_EVENT = "game/DoesNotExist.txt", + SESSION = "players/Sessions.txt", + EXPLOITS = "game/exploits/", + STORAGE = "game/storage/", + PACKET_LOGS = "game/packetlogs/", + FREDRICK = "game/npcs/fredrick/", + NPC_UNCODED = "game/npcs/UncodedNPCs.txt", + QUEST_UNCODED = "game/quests/UncodedQuests.txt", + AUTOSAVING_CHARACTER = "players/SaveCharAuto.txt", + SAVING_CHARACTER = "players/SaveChar.txt", + USED_COMMANDS = "commands/UsedCommands.txt", + DEADLOCK_ERROR = "deadlocks/Deadlocks.txt", + DEADLOCK_STACK = "deadlocks/Path.txt", + DEADLOCK_LOCKS = "deadlocks/Locks.txt", + DEADLOCK_STATE = "deadlocks/State.txt", + DISPOSED_LOCKS = "deadlocks/Disposed.txt"; private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //for file system purposes, it's nice to use yyyy-MM-dd private static final String FILE_PATH = "logs/" + sdf.format(Calendar.getInstance().getTime()) + "/"; // + sdf.format(Calendar.getInstance().getTime()) + "/" private static final String ERROR = "error/"; public static void printError(final String name, final Throwable t) { + String stringT = getString(t); + System.out.println("Error thrown: " + name); - System.out.println(getString(t)); + System.out.println(stringT); + System.out.println(); FileOutputStream out = null; final String file = FILE_PATH + ERROR + name; try { @@ -68,8 +80,9 @@ public class FilePrinter { outputFile.getParentFile().mkdirs(); } out = new FileOutputStream(file, true); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); + out.write(stringT.getBytes()); + out.write("\r\n---------------------------------\r\n".getBytes()); + out.write("\r\n".getBytes()); // thanks Vcoc for suggesting review body log structure } catch (IOException ess) { ess.printStackTrace(); } finally { @@ -84,8 +97,11 @@ public class FilePrinter { } public static void printError(final String name, final Throwable t, final String info) { + String stringT = getString(t); + System.out.println("Error thrown: " + name); - System.out.println(getString(t)); + System.out.println(stringT); + System.out.println(); FileOutputStream out = null; final String file = FILE_PATH + ERROR + name; try { @@ -95,8 +111,9 @@ public class FilePrinter { } out = new FileOutputStream(file, true); out.write((info + "\r\n").getBytes()); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); + out.write(stringT.getBytes()); + out.write("\r\n---------------------------------\r\n".getBytes()); + out.write("\r\n".getBytes()); } catch (IOException ess) { ess.printStackTrace(); } finally { @@ -113,6 +130,7 @@ public class FilePrinter { public static void printError(final String name, final String s) { System.out.println("Error thrown: " + name); System.out.println(s); + System.out.println(); FileOutputStream out = null; final String file = FILE_PATH + ERROR + name; try { @@ -122,7 +140,8 @@ public class FilePrinter { } out = new FileOutputStream(file, true); out.write(s.getBytes()); - //out.write("\n---------------------------------\n".getBytes()); + //out.write("\r\n---------------------------------\r\n".getBytes()); + out.write("\r\n".getBytes()); } catch (IOException ess) { ess.printStackTrace(); } finally { @@ -143,6 +162,7 @@ public class FilePrinter { public static void print(final String name, final String s, boolean line) { System.out.println("Log: " + name); System.out.println(s); + System.out.println(); FileOutputStream out = null; String file = FILE_PATH + name; try { @@ -152,10 +172,10 @@ public class FilePrinter { } out = new FileOutputStream(file, true); out.write(s.getBytes()); - out.write("\r\n".getBytes()); if (line) { - out.write("---------------------------------\r\n".getBytes()); + out.write("\r\n---------------------------------\r\n".getBytes()); } + out.write("\r\n".getBytes()); } catch (IOException ess) { ess.printStackTrace(); } finally { diff --git a/src/tools/LogHelper.java b/src/tools/LogHelper.java index f1ec043610..f34d6422b6 100644 --- a/src/tools/LogHelper.java +++ b/src/tools/LogHelper.java @@ -6,9 +6,6 @@ import java.util.Date; import client.MapleClient; import net.server.Server; -import net.server.channel.Channel; -import net.server.world.MapleParty; -import net.server.world.MaplePartyCharacter; import server.MapleItemInformationProvider; import server.MapleTrade; import server.expeditions.MapleExpedition; @@ -34,7 +31,7 @@ public class LogHelper { log += item.getQuantity() + " " + itemName + " from " + name2 + " to " + name1 + " \r\n";; } log += "\r\n\r\n"; - FilePrinter.print("trades.txt", log); + FilePrinter.print(FilePrinter.LOG_TRADE, log); } public static void logExpedition(MapleExpedition expedition) { @@ -50,8 +47,8 @@ public class LogHelper { for (String message: expedition.getBossLogs()){ log += message; } - log += "\r\n\r\n"; - FilePrinter.print("expeditions.txt", log); + log += "\r\n"; + FilePrinter.print(FilePrinter.LOG_EXPEDITION, log); } public static String getTimeString(long then){ @@ -63,20 +60,20 @@ public class LogHelper { public static void logLeaf(MapleCharacter player, boolean gotPrize, String operation) { String timeStamp = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss").format(new Date()); - String log = player.getName() + (gotPrize ? " used a maple leaf to buy " + operation : " redeemed " + operation + " VP for a leaf") + " - " + timeStamp + "\r\n"; - FilePrinter.print("mapleleaves.txt", log); + String log = player.getName() + (gotPrize ? " used a maple leaf to buy " + operation : " redeemed " + operation + " VP for a leaf") + " - " + timeStamp; + FilePrinter.print(FilePrinter.LOG_LEAF, log); } public static void logGacha(MapleCharacter player, int itemid, String map) { String itemName = MapleItemInformationProvider.getInstance().getName(itemid); String timeStamp = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss").format(new Date()); - String log = player.getName() + " got a " + itemName + "(" + itemid + ") from the " + map + " gachapon. - " + timeStamp + "\r\n"; - FilePrinter.print("gachapon.txt", log); + String log = player.getName() + " got a " + itemName + "(" + itemid + ") from the " + map + " gachapon. - " + timeStamp; + FilePrinter.print(FilePrinter.LOG_GACHAPON, log); } public static void logChat(MapleClient player, String chatType, String text){ SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm"); - FilePrinter.print("chat.txt", "[" + sdf.format(Calendar.getInstance().getTime()) + "] (" + chatType + ") " +player.getPlayer().getName() + ": " + text + "\r\n"); + FilePrinter.print(FilePrinter.LOG_CHAT, "[" + sdf.format(Calendar.getInstance().getTime()) + "] (" + chatType + ") " +player.getPlayer().getName() + ": " + text); } } diff --git a/src/tools/MapleLogger.java b/src/tools/MapleLogger.java index 389d159523..2ee01e1041 100644 --- a/src/tools/MapleLogger.java +++ b/src/tools/MapleLogger.java @@ -49,7 +49,7 @@ public class MapleLogger { return; } String packet = op.toString() + "\r\n" + HexTool.toString((byte[]) message); - FilePrinter.printError(FilePrinter.PACKET_LOGS + c.getAccountName() + "-" + c.getPlayer().getName() + ".txt", packet + "\r\n\r\n"); + FilePrinter.printError(FilePrinter.PACKET_LOGS + c.getAccountName() + "-" + c.getPlayer().getName() + ".txt", packet); } private static final boolean isRecvBlocked(RecvOpcode op){ diff --git a/src/tools/MaplePacketCreator.java b/src/tools/MaplePacketCreator.java index ecca589eb1..c9dde3513b 100644 --- a/src/tools/MaplePacketCreator.java +++ b/src/tools/MaplePacketCreator.java @@ -120,7 +120,7 @@ import server.maps.AbstractMapleMapObject; public class MaplePacketCreator { public static final List> EMPTY_STATUPDATE = Collections.emptyList(); - private final static long FT_UT_OFFSET = 116444592000000000L; // EDT + private final static long FT_UT_OFFSET = 116444628000000000L; private final static long DEFAULT_TIME = 150842304000000000L;//00 80 05 BB 46 E6 17 02 public final static long ZERO_TIME = 94354848000000000L;//00 40 E0 FD 3B 37 4F 01 private final static long PERMANENT = 150841440000000000L; // 00 C0 9B 90 7D E5 17 02 @@ -363,7 +363,7 @@ public class MaplePacketCreator { } private static void addExpirationTime(final MaplePacketLittleEndianWriter mplew, long time) { - mplew.writeLong(getTime(time)); + mplew.writeLong(getTime(time)); // offset expiration time issue found thanks to Thora } private static void addItemInfo(final MaplePacketLittleEndianWriter mplew, Item item) { @@ -1064,8 +1064,8 @@ public class MaplePacketCreator { mplew.write(spawnPoint); mplew.writeShort(chr.getHp()); mplew.writeBool(false); - mplew.writeLong(getTime(Server.getInstance().getCurrentTime())); - mplew.skip(8); + mplew.writeLong(0); // getTime(Server.getInstance().getCurrentTime())? + mplew.skip(ServerConstants.DEBUG_VALUES[0]); return mplew.getPacket(); } @@ -1081,8 +1081,8 @@ public class MaplePacketCreator { mplew.writeBool(true); mplew.writeInt(spawnPosition.x); // spawn position placement thanks to Arnah (Vertisy) mplew.writeInt(spawnPosition.y); - mplew.writeLong(getTime(Server.getInstance().getCurrentTime())); - mplew.skip(8); + mplew.writeLong(0); // getTime(Server.getInstance().getCurrentTime())? + mplew.skip(ServerConstants.DEBUG_VALUES[0]); return mplew.getPacket(); } @@ -2867,7 +2867,7 @@ public class MaplePacketCreator { mplew.write(1); mplew.writeShort(quest); mplew.write(2); - mplew.writeLong(time); + mplew.writeLong(getTime(time)); return mplew.getPacket(); } diff --git a/wz/Mob.wz/9400638.img.xml b/wz/Mob.wz/9400638.img.xml index bc2b4946c8..48531a5276 100644 --- a/wz/Mob.wz/9400638.img.xml +++ b/wz/Mob.wz/9400638.img.xml @@ -18,7 +18,7 @@ - + diff --git a/wz/Mob.wz/9400639.img.xml b/wz/Mob.wz/9400639.img.xml index 88a82167e9..ee46fb8a19 100644 --- a/wz/Mob.wz/9400639.img.xml +++ b/wz/Mob.wz/9400639.img.xml @@ -17,7 +17,7 @@ - + diff --git a/wz/Mob.wz/9400640.img.xml b/wz/Mob.wz/9400640.img.xml index 3e1a602f9a..2511b500ea 100644 --- a/wz/Mob.wz/9400640.img.xml +++ b/wz/Mob.wz/9400640.img.xml @@ -17,7 +17,7 @@ - + diff --git a/wz/String.wz/Skill.img.xml b/wz/String.wz/Skill.img.xml index eba9f463ac..76726b3dfb 100644 --- a/wz/String.wz/Skill.img.xml +++ b/wz/String.wz/Skill.img.xml @@ -8702,26 +8702,26 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +