Improved item & drop-point checking + Dojo fixes + Duey revamp

Fixed some issues with items being dropped sometimes out-of-reach and in a weird way.
Improved item checking function, now looking up one-of-a-kind items properly.
Fixed some issues with dojo skills and possible exploits in dojo progression.
Improved Duey, now displaying better info to players.
This commit is contained in:
ronancpl
2018-01-03 18:45:56 -02:00
parent 012f965f6a
commit 1190513d0c
69 changed files with 781 additions and 423 deletions
+24 -1
View File
@@ -728,4 +728,27 @@ MapleQuestItemFetcher agora mostra quests j
17 - 19 Dezembro 2017, 17 - 19 Dezembro 2017,
Implementado New Years card. Implementado New Years card.
Adicionado informação, destinado ao dono da loja, de compra de itens dos Player Shops e dos Hired Merchants. Adicionado informação, destinado ao dono da loja, de compra de itens dos Player Shops e dos Hired Merchants.
Resolvido um problema com overflow em Player Shops. Resolvido um problema com overflow em Player Shops.
20 - 22 Dezembro 2017,
Resolvido problema com itens ainda saindo das bordas de alguns mapas em certos casos.
Corrigido Enhanced Crafting com a Agent E rodando probabilidade do Chaos Scroll ao fazer o item.
Resolvido um problema com certos mapas não possuindo minimapa fazendo drops cairem sempre na posição x = 0.
Corrigido pets reduzindo fullness enquanto no Cash Shop ou no MTS.
Corrigido bug em skills de PQ/Dojo para players que tem skill level = 0. Espera-se que todos possam "ativá-las".
Modificado mapa de fora do dojo agora resetando dojo energy, evitando assim possível exploit com skills do dojo.
Corrigido exploit em dojos permitindo que jogadores acessem mapas de estágios avançados se não progrediram juntos nos estágios anteriores.
Pontos agora estão sendo corretamente atribuídos aos jogadores que estão sendo automaticamente levados para o próximo rest point (quando um jogador passa pelo último portal de cada etapa).
Corrigido jogador comprando itens one-of-a-kind dos Hired Merchants quando não se pode obtê-los.
23 - 24 Dezembro 2017,
Corrigido checagem de itens no inventário não verificando apropriadamente itens one-of-a-kind.
Adicionado e corrigido vários aspectos do Duey. Descoberto opcodes e respostas de ações de jogadores.
Corrigido autopot agora contabilizando bonus de HP e MP dos equipamentos nos stats a serem checados.
Adicionado Ereve na lista de plataformas de Orbis.
27 Dezembro 2017,
Corrigido AP reset modificando stats de forma errônea.
03 Janeiro 2018,
Corrigido item megafone permitindo o display de equipamentos não-comercializáveis, mesmo marcados como Untradeable.
+1 -1
View File
@@ -1492,7 +1492,7 @@ ossyria
270010300 - Time Lane - Memory Lane3 270010300 - Time Lane - Memory Lane3
270010310 - Time Lane - Resting Spot of Memory3 270010310 - Time Lane - Resting Spot of Memory3
270010400 - Time Lane - Memory Lane4 270010400 - Time Lane - Memory Lane4
270010410 - Memory Keeper - Resting Spot of Memory4 270010410 - Time Lane - Resting Spot of Memory4
270010500 - Time Lane - Memory Lane5 270010500 - Time Lane - Memory Lane5
270020000 - Time Lane - Frozen Past 270020000 - Time Lane - Frozen Past
270020100 - Time Lane - Road of Regrets1 270020100 - Time Lane - Road of Regrets1
+9 -1
View File
@@ -2,6 +2,14 @@
<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="2"/> <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="2"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/> <group>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/constants/skills/Legend.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/server/MapleInventoryManipulator.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/net/server/channel/handlers/MessengerHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/net/server/channel/handlers/UseCashItemHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/client/SkillFactory.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/client/MapleCharacter.java</file>
<file>file:/C:/Nexon/MapleSolaxia/HeavenMS/src/server/MapleItemInformationProvider.java</file>
</group>
</open-files> </open-files>
</project-private> </project-private>
+2
View File
@@ -31,6 +31,8 @@ function start(ms) {
if(ms.getPlayer().getMap().findClosestPlayerSpawnpoint(ms.getPlayer().getPosition()).getId() == 0) { if(ms.getPlayer().getMap().findClosestPlayerSpawnpoint(ms.getPlayer().getPosition()).getId() == 0) {
ms.getPlayer().startMapEffect(messages[(Math.random() * messages.length) | 0], 5120024); ms.getPlayer().startMapEffect(messages[(Math.random() * messages.length) | 0], 5120024);
} }
ms.resetDojoEnergy();
} else { } else {
ms.getPlayer().resetEnteredScript(); //in case the person dcs in here we set it at dojang_tuto portal ms.getPlayer().resetEnteredScript(); //in case the person dcs in here we set it at dojang_tuto portal
ms.getPlayer().startMapEffect("Ha! Let's see what you got! I won't let you leave unless you defeat me first!", 5120024); ms.getPlayer().startMapEffect("Ha! Let's see what you got! I won't let you leave unless you defeat me first!", 5120024);
+1 -1
View File
@@ -22,7 +22,7 @@ function action(mode, type, selection) {
} else if (status == 2) { } else if (status == 2) {
if (!cm.canHold(itemids[selection], 1)) { if (!cm.canHold(itemids[selection], 1)) {
cm.sendOk("Please make room"); cm.sendOk("Please make room");
} else if (cm.getItemQuantity(4001261) < 1) { } else if (!cm.haveItemWithId(4001261)) {
cm.sendOk("You don't have enough leathers."); cm.sendOk("You don't have enough leathers.");
} else { } else {
cm.gainItem(4001261, -1); cm.gainItem(4001261, -1);
+1 -1
View File
@@ -6,7 +6,7 @@ function start() {
} }
function action(mode, type, selection) { function action(mode, type, selection) {
if(cm.getPlayer().getItemQuantity(1902016, true) > 0) { if(cm.haveItemWithId(1902016, true)) {
cm.warp(140010210, 0); cm.warp(140010210, 0);
} else { } else {
cm.sendOk("What is it? If you you're here to waste my time, get lost!"); cm.sendOk("What is it? If you you're here to waste my time, get lost!");
+4 -4
View File
@@ -1,8 +1,8 @@
var status = -1; var status = -1;
var sel; var sel;
var destinations = new Array("Ellinia", "Ludibrium", "Leafre", "Mu Lung", "Ariant"); var destinations = new Array("Ellinia", "Ludibrium", "Leafre", "Mu Lung", "Ariant", "Ereve");
var boatType = new Array("the ship", "the ship", "Hak", "Hak", "Genie"); var boatType = new Array("the ship", "the train", "the bird", "Hak", "Genie", "the ship");
function start() { function start() {
var message = "Orbis Station has lots of platforms available to choose from. You need to choose the one that'll take you to the destination of your choice. Which platform will you take?\r\n"; var message = "Orbis Station has lots of platforms available to choose from. You need to choose the one that'll take you to the destination of your choice. Which platform will you take?\r\n";
@@ -20,8 +20,8 @@ function action(mode, type, selection) {
status++; status++;
if (status == 0){ if (status == 0){
sel = selection; sel = selection;
cm.sendNext("Ok #h #, I will send you to the platform for #m" + (200000110 + (sel * 10)) + "#"); cm.sendNext("Ok #h #, I will send you to the platform for #b#m" + (200000110 + (sel * 10)) + "##k.");
}else if (status == 1) { }else if (status == 1) {
cm.warp(200000110 + (sel * 10), "west00"); cm.warp(200000110 + (sel * 10), "west00");
cm.dispose(); cm.dispose();
} }
+50 -46
View File
@@ -1,8 +1,6 @@
/* /*
This file is part of the OdinMS Maple Story Server This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyright (C) 2008 Patrick Huy <[email protected]> Copyleft (L) 2017 RonanLana
Matthias Butz <[email protected]>
Jan Christian Meyer <[email protected]>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as it under the terms of the GNU Affero General Public License as
@@ -30,6 +28,7 @@ importPackage(Packages.server.maps);
var disabled = false; var disabled = false;
var belts = Array(1132000, 1132001, 1132002, 1132003, 1132004); var belts = Array(1132000, 1132001, 1132002, 1132003, 1132004);
var belt_level = Array(25, 35, 45, 60, 75); var belt_level = Array(25, 35, 45, 60, 75);
var belt_on_inventory;
/* var belt_points = Array(200, 1800, 4000, 9200, 17000); */ /* var belt_points = Array(200, 1800, 4000, 9200, 17000); */
var belt_points = Array(10, 90, 200, 460, 850); /* Watered down version */ var belt_points = Array(10, 90, 200, 460, 850); /* Watered down version */
@@ -45,6 +44,11 @@ function start() {
return; return;
} }
belt_on_inventory = new Array();
for (var i = 0; i < belts.length; i++) {
belt_on_inventory.push(cm.haveItemWithId(belts[i], true));
}
action(1, 0, 0); action(1, 0, 0);
} }
@@ -112,42 +116,24 @@ function action(mode, type, selection) {
} }
} }
} else if (cm.getPlayer().getDojoStage() > 0) { } else if (cm.getPlayer().getDojoStage() > 0) {
if (status == 1) { dojoWarp = cm.getPlayer().getDojoStage();
dojoWarp = cm.getPlayer().getDojoStage(); cm.getPlayer().setDojoStage(0);
cm.getPlayer().setDojoStage(0); cm.sendYesNo("The last time you took the challenge by yourself, you went up to level #b" + dojoWarp + "#k. I can take you there right now. Do you want to go there? (Select #rNo#k to erase this record.)");
cm.sendYesNo("The last time you took the challenge by yourself, you went up to level " + dojoWarp + ". I can take you there right now. Do you want to go there?");
} else {
var avDojo = cm.getClient().getChannelServer().getAvailableDojo(false);
if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
cm.getPlayer().setDojoStage(dojoWarp);
}
else {
var warpDojoMap = ((mode == 1) ? 925020000 + (dojoWarp + 1) * 100 + avDojo : 925020100 + avDojo);
cm.getClient().getChannelServer().resetDojoMap(warpDojoMap);
cm.getClient().getChannelServer().resetDojo(warpDojoMap);
cm.resetDojoEnergy();
cm.warp(warpDojoMap, 0);
}
cm.dispose();
}
} else { } else {
var avDojo = cm.getClient().getChannelServer().getAvailableDojo(false); var avDojo = cm.getClient().getChannelServer().getAvailableDojo(false);
if(avDojo < 0) { if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again."); if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter."); else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
}
else { cm.getPlayer().setDojoStage(dojoWarp);
cm.getClient().getChannelServer().resetDojoMap(925020100 + avDojo); } else {
cm.getClient().getChannelServer().resetDojo(925020100 + avDojo); var warpDojoMap = 925020000 + (dojoWarp + 1) * 100 + avDojo;
cm.getClient().getChannelServer().resetDojoMap(warpDojoMap);
cm.getClient().getChannelServer().resetDojo(warpDojoMap);
cm.resetDojoEnergy(); cm.resetDojoEnergy();
cm.warp(925020100 + avDojo, 0); cm.warp(warpDojoMap, 0);
} }
cm.dispose(); cm.dispose();
@@ -181,8 +167,7 @@ function action(mode, type, selection) {
if(avDojo < 0) { if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again."); if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter."); else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
} } else {
else {
cm.getClient().getChannelServer().resetDojoMap(925030100 + avDojo); cm.getClient().getChannelServer().resetDojoMap(925030100 + avDojo);
cm.getClient().getChannelServer().resetDojo(925030100 + avDojo); cm.getClient().getChannelServer().resetDojo(925030100 + avDojo);
@@ -207,7 +192,7 @@ function action(mode, type, selection) {
if (status == 1) { if (status == 1) {
var selStr = "You have #b" + cm.getPlayer().getDojoPoints() + "#k training points. Master prefers those with great talent. If you obtain more points than the average, you can receive a belt depending on your score.\r\n"; var selStr = "You have #b" + cm.getPlayer().getDojoPoints() + "#k training points. Master prefers those with great talent. If you obtain more points than the average, you can receive a belt depending on your score.\r\n";
for (var i = 0; i < belts.length; i++) { for (var i = 0; i < belts.length; i++) {
if (cm.getPlayer().getItemQuantity(belts[i], true) > 0) { if (belt_on_inventory[i]) {
selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "# (Already on inventory)"; selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "# (Already on inventory)";
} else } else
selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "#"; selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "#";
@@ -217,16 +202,24 @@ function action(mode, type, selection) {
var belt = belts[selection]; var belt = belts[selection];
var level = belt_level[selection]; var level = belt_level[selection];
var points = belt_points[selection]; var points = belt_points[selection];
if (cm.getPlayer().getDojoPoints() >= points) {
if (cm.getPlayer().getLevel() > level) { var oldbelt = (selection > 0) ? belts[selection - 1] : -1;
var haveOldbelt = (oldbelt == -1 || cm.haveItemWithId(oldbelt, false));
if (selection > 0 && !belt_on_inventory[selection - 1]) {
sendBeltRequirements(belt, oldbelt, haveOldbelt, level, points);
} else if (cm.getPlayer().getDojoPoints() >= points) {
if (selection > 0 && !haveOldbelt) {
sendBeltRequirements(belt, oldbelt, haveOldbelt, level, points);
} else if (cm.getPlayer().getLevel() > level) {
if(selection > 0) cm.gainItem(oldbelt, -1);
cm.gainItem(belt, 1); cm.gainItem(belt, 1);
cm.getPlayer().setDojoPoints(cm.getPlayer().getDojoPoints() - points); cm.getPlayer().setDojoPoints(cm.getPlayer().getDojoPoints() - points);
cm.sendNext("There is the #i" + belt + "# #b#t" + belt + "##k. You have proven your valor to ascend on the Dojo ranks. Well done!"); cm.sendNext("There is the #i" + belt + "# #b#t" + belt + "##k. You have proven your valor to ascend on the Dojo ranks. Well done!");
} } else
else sendBeltRequirements(belt, oldbelt, haveOldbelt, level, points);
cm.sendNext("In order to receive #i" + belt + "# #b#t" + belt + "##k, you have to be at least over level #b" + level + "#k and you need to have earned at least #b" + points + " training points#k.\r\n\r\nIf you want to obtain this belt, you need #r" + (points - cm.getPlayer().getDojoPoints()) + "#k more training points.");
} else } else
cm.sendNext("In order to receive #i" + belt + "# #b#t" + belt + "##k, you have to be at least over level #b" + level + "#k and you need to have earned at least #b" + points + " training points#k.\r\n\r\nIf you want to obtain this belt, you need #r" + (points - cm.getPlayer().getDojoPoints()) + "#k more training points."); sendBeltRequirements(belt, oldbelt, haveOldbelt, level, points);
cm.dispose(); cm.dispose();
return; return;
@@ -267,8 +260,7 @@ function action(mode, type, selection) {
cm.dispose(); cm.dispose();
return; return;
} } else {
else {
cm.dispose(); cm.dispose();
return; return;
} }
@@ -312,8 +304,7 @@ function action(mode, type, selection) {
if(avDojo < 0) { if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again."); if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
else cm.sendOk("Your party already registered for the dojo. Wait for the end of the registration time to enter again."); else cm.sendOk("Your party already registered for the dojo. Wait for the end of the registration time to enter again.");
} } else {
else {
var baseStg = hasParty ? 925030000 : 925020000; var baseStg = hasParty ? 925030000 : 925020000;
var nextStg = Math.floor((cm.getPlayer().getMap().getId() + 100) / 100) % 100; var nextStg = Math.floor((cm.getPlayer().getMap().getId() + 100) / 100) % 100;
@@ -323,6 +314,9 @@ function action(mode, type, selection) {
cm.getClient().getChannelServer().resetDojo(dojoWarpMap, nextStg - 1); cm.getClient().getChannelServer().resetDojo(dojoWarpMap, nextStg - 1);
} }
//non-leader party members can progress whilst having the record saved if they don't command to enter the next stage
cm.getPlayer().setDojoStage(0);
if(!hasParty || !cm.isLeader()) cm.warp(dojoWarpMap, 0); if(!hasParty || !cm.isLeader()) cm.warp(dojoWarpMap, 0);
else cm.warpParty(dojoWarpMap, 0); else cm.warpParty(dojoWarpMap, 0);
} }
@@ -348,7 +342,7 @@ function action(mode, type, selection) {
} else if (cm.getPlayer().getDojoStage() == Math.floor(cm.getMapId() / 100) % 100) { } else if (cm.getPlayer().getDojoStage() == Math.floor(cm.getMapId() / 100) % 100) {
cm.sendOk("Looks like you came all the way up here without recording your score. Sorry, but you can't record now."); cm.sendOk("Looks like you came all the way up here without recording your score. Sorry, but you can't record now.");
} else { } else {
cm.sendNext("I recorded your score. If you tell me the next time you go up, you'll be able to start where you left off."); cm.sendNext("I recorded your score. If you tell me the next time you go up, you'll be able to start where you left off. Note that you will have your #rrecord erased#k if you choose to #bcontinue challenging the Dojo#k, so choose carefully.");
cm.getPlayer().setDojoStage(Math.floor(cm.getMapId() / 100) % 100); cm.getPlayer().setDojoStage(Math.floor(cm.getMapId() / 100) % 100);
} }
cm.dispose(); cm.dispose();
@@ -372,6 +366,16 @@ function action(mode, type, selection) {
} }
} }
function sendBeltRequirements(belt, oldbelt, haveOldbelt, level, points) {
var beltReqStr = (oldbelt != -1) ? " you must have the #i" + oldbelt + "# belt in your inventory," : "";
var pointsLeftStr = (points - cm.getPlayer().getDojoPoints() > 0) ? " you need #r" + (points - cm.getPlayer().getDojoPoints()) + "#k more training points" : "";
var beltLeftStr = (!haveOldbelt) ? " you must have the needed belt unequipped and available in your EQP inventory" : "";
var conjStr = (pointsLeftStr.length > 0 && beltLeftStr.length > 0) ? " and" : "";
cm.sendNext("In order to receive #i" + belt + "# #b#t" + belt + "##k," + beltReqStr + " you have to be at least over level #b" + level + "#k and you need to have earned at least #b" + points + " training points#k.\r\n\r\nIf you want to obtain this belt," + beltLeftStr + conjStr + pointsLeftStr + ".");
}
function isRestingSpot(id) { function isRestingSpot(id) {
return (Math.floor(id / 100) % 100) % 6 == 0 && id != 925020001; return (Math.floor(id / 100) % 100) % 6 == 0 && id != 925020001;
} }
+1 -1
View File
@@ -154,7 +154,7 @@ function action(mode, type, selection) {
if (status == 0) { if (status == 0) {
var selStr = "You have #b" + cm.getPlayer().getDojoPoints() + "#k training points. Master prefers those with great talent. If you obtain more points than the average, you can receive a belt depending on your score.\r\n"; var selStr = "You have #b" + cm.getPlayer().getDojoPoints() + "#k training points. Master prefers those with great talent. If you obtain more points than the average, you can receive a belt depending on your score.\r\n";
for (var i = 0; i < belts.length; i++) { for (var i = 0; i < belts.length; i++) {
if (cm.getPlayer().getItemQuantity(belts[i], true) > 0) { if (cm.haveItemWithId(belts[i], true)) {
selStr += "\r\n #i" + belts[i] + "# #t" + belts[i] + "#(Obtain)"; selStr += "\r\n #i" + belts[i] + "# #t" + belts[i] + "#(Obtain)";
} else } else
selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "#l"; selStr += "\r\n#L" + i + "##i" + belts[i] + "# #t" + belts[i] + "#l";
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
function start() { function start() {
cm.askAcceptDecline("If only I had the Mirror of Goodness then I can re-summon the Black Wizard! \r\nWait! something's not right! Why is the Black Wizard not summoned? Wait, what's this force? I feel something... totally different from the Black Wizard Ahhhhh!!!!! \r\n\r\n #b(Places a hand on the shoulder of Kryston.)"); cm.sendAcceptDecline("If only I had the Mirror of Goodness then I can re-summon the Black Wizard! \r\nWait! something's not right! Why is the Black Wizard not summoned? Wait, what's this force? I feel something... totally different from the Black Wizard Ahhhhh!!!!! \r\n\r\n #b(Places a hand on the shoulder of Kryston.)");
} }
function action(mode, type, selection) { function action(mode, type, selection) {
+46
View File
@@ -0,0 +1,46 @@
/*
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
var status;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && type > 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
cm.sendOk("I came from far-away places looking for people powerful enough to join my expedition against the evil that lays waste on this land. Are you, by any chance, one of those people?");
cm.dispose();
}
}
}
+19 -3
View File
@@ -32,15 +32,31 @@ function enter(pi) {
if(gate != null) { if(gate != null) {
if (gate.getState() == 1 || pi.getMap().countMonsters() == 0) { if (gate.getState() == 1 || pi.getMap().countMonsters() == 0) {
if (Math.floor(pi.getPlayer().getMapId() / 100) % 100 < 38) { if (Math.floor(pi.getPlayer().getMapId() / 100) % 100 < 38) {
pi.getPlayer().message("You received " + pi.getPlayer().addDojoPointsByMap() + " training points. Your total training points score is now " + pi.getPlayer().getDojoPoints() + ".");
if(((Math.floor((pi.getPlayer().getMap().getId() + 100) / 100)) % 100) % 6 == 0) { if(((Math.floor((pi.getPlayer().getMap().getId() + 100) / 100)) % 100) % 6 == 0) {
if(Math.floor(pi.getPlayer().getMapId() / 10000) == 92503) { if(Math.floor(pi.getPlayer().getMapId() / 10000) == 92503) {
pi.warpParty(pi.getPlayer().getMap().getId() + 100, 925030100, 925033804); var restMapId = pi.getPlayer().getMap().getId() + 100;
var mapId = pi.getPlayer().getMap().getId();
for(var i = 0; i < 5; i++) {
var chrlist = pi.getMap(mapId - 100 * i).getAllPlayers();
var pIter = chrlist.iterator();
while (pIter.hasNext()) {
var chr = pIter.next();
for(var j = i; j >= 0; j--) {
chr.message("You received " + chr.addDojoPointsByMap(mapId - 100 * j) + " training points. Your total training points score is now " + chr.getDojoPoints() + ".");
}
chr.changeMap(restMapId, 0);
}
}
} else { } else {
pi.getPlayer().message("You received " + pi.getPlayer().addDojoPointsByMap(pi.getMapId()) + " training points. Your total training points score is now " + pi.getPlayer().getDojoPoints() + ".");
pi.warp(pi.getPlayer().getMap().getId() + 100, 0); pi.warp(pi.getPlayer().getMap().getId() + 100, 0);
} }
} else { } else {
pi.getPlayer().message("You received " + pi.getPlayer().addDojoPointsByMap(pi.getMapId()) + " training points. Your total training points score is now " + pi.getPlayer().getDojoPoints() + ".");
pi.warp(pi.getPlayer().getMap().getId() + 100, 0); pi.warp(pi.getPlayer().getMap().getId() + 100, 0);
} }
} else { } else {
+6
View File
@@ -26,6 +26,12 @@
function enter(pi) { function enter(pi) {
var maps = [108000600, 108000601, 108000602]; var maps = [108000600, 108000601, 108000602];
if(pi.isQuestStarted(20201) || pi.isQuestStarted(20202) || pi.isQuestStarted(20203) || pi.isQuestStarted(20204) || pi.isQuestStarted(20205)) { if(pi.isQuestStarted(20201) || pi.isQuestStarted(20202) || pi.isQuestStarted(20203) || pi.isQuestStarted(20204) || pi.isQuestStarted(20205)) {
pi.removeAll(4032096);
pi.removeAll(4032097);
pi.removeAll(4032098);
pi.removeAll(4032099);
pi.removeAll(4032100);
var rand = Math.floor(Math.random() * maps.length); var rand = Math.floor(Math.random() * maps.length);
pi.warp(maps[rand], 0); pi.warp(maps[rand], 0);
return true; return true;
+21 -4
View File
@@ -2,15 +2,32 @@ function enter(pi) {
if(pi.getPlayer().getMapId() == 130030001){ if(pi.getPlayer().getMapId() == 130030001){
if(pi.isQuestStarted(20010)){ if(pi.isQuestStarted(20010)){
pi.warp(130030002, 0); pi.warp(130030002, 0);
return true;
} else { } else {
pi.message("Please click on the NPC first to receive a quest."); pi.message("Please click on the NPC first to receive a quest.");
} }
} else if(pi.getPlayer().getMapId() == 130030002){ } else if(pi.getPlayer().getMapId() == 130030002){
pi.warp(130030003, 0); if(pi.isQuestCompleted(20011)){
pi.warp(130030003, 0);
return true;
} else {
pi.message("Please complete the required quest before proceeding.");
}
} else if(pi.getPlayer().getMapId() == 130030003){ } else if(pi.getPlayer().getMapId() == 130030003){
pi.warp(130030004, 0); if(pi.isQuestCompleted(20012)){
pi.warp(130030004, 0);
return true;
} else {
pi.message("Please complete the required quest before proceeding.");
}
} else if(pi.getPlayer().getMapId() == 130030004){ } else if(pi.getPlayer().getMapId() == 130030004){
pi.warp(130030005, 0); if(pi.isQuestCompleted(20013)){
pi.warp(130030005, 0);
return true;
} else {
pi.message("Please complete the required quest before proceeding.");
}
} }
return true;
return false;
} }
+1 -1
View File
@@ -24,7 +24,7 @@ function start(mode, type, selection) {
if (status == 0) { if (status == 0) {
qm.sendNext("You have finally become a Knight-in-Training. I'd like to give you a mission right away, but you still look miles away from even being able to handle a task on your own. Are you sure you can even go to Victoria Island like this?"); qm.sendNext("You have finally become a Knight-in-Training. I'd like to give you a mission right away, but you still look miles away from even being able to handle a task on your own. Are you sure you can even go to Victoria Island like this?");
} else if (status == 1) { } else if (status == 1) {
qm.askAcceptDecline("It's up to you to head over to Victoria Island, but a Knight-in-Training that can't take care of one's self in battles is likely to cause harm to the Empress's impeccable reputation. As the Head Tactician of this island, I can't let that happen, period. I want you to keep training until the right time comes."); qm.sendAcceptDecline("It's up to you to head over to Victoria Island, but a Knight-in-Training that can't take care of one's self in battles is likely to cause harm to the Empress's impeccable reputation. As the Head Tactician of this island, I can't let that happen, period. I want you to keep training until the right time comes.");
} else if (status == 2) { } else if (status == 2) {
qm.forceCompleteQuest(); qm.forceCompleteQuest();
qm.sendNext("#p1102000#, the Training Instructor, will help you train into a serviceable knight. Once you reach Level 13, I'll assign you a mission or two. So until then, keep training."); qm.sendNext("#p1102000#, the Training Instructor, will help you train into a serviceable knight. Once you reach Level 13, I'll assign you a mission or two. So until then, keep training.");
+1 -1
View File
@@ -64,7 +64,7 @@ function end(mode, type, selection) {
status--; status--;
if (status == 0) { if (status == 0) {
if(qm.getPlayer().getItemQuantity(1902017, false) == 0) { if(!qm.haveItemWithId(1902017, false)) {
qm.sendNext("You will have to unequip the wolf first before going for the evolution."); qm.sendNext("You will have to unequip the wolf first before going for the evolution.");
qm.dispose(); qm.dispose();
return; return;
+1 -1
View File
@@ -28,7 +28,7 @@
*/ */
function end(mode, type, selection) { function end(mode, type, selection) {
if(qm.haveItem(4001159, 25) && qm.haveItem(4001160, 25) && qm.getPlayer().getItemQuantity(1122010, true) == 0) { if(qm.haveItem(4001159, 25) && qm.haveItem(4001160, 25) && !qm.haveItemWithId(1122010, true)) {
if(qm.canHold(1122010)) { if(qm.canHold(1122010)) {
qm.gainItem(4001159, -25); qm.gainItem(4001159, -25);
qm.gainItem(4001160, -25); qm.gainItem(4001160, -25);
+13 -8
View File
@@ -497,10 +497,10 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return null; return null;
} }
public int addDojoPointsByMap() { public int addDojoPointsByMap(int mapid) {
int pts = 0; int pts = 0;
if (dojoPoints < 17000) { if (dojoPoints < 17000) {
pts = 1 + ((getMap().getId() - 1) / 100 % 100) / 6; pts = 1 + ((mapid - 1) / 100 % 100) / 6;
if (!getDojoParty()) { if (!getDojoParty()) {
pts++; pts++;
} }
@@ -1589,7 +1589,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
public int countItem(int itemid) { public int countItem(int itemid) {
return inventory[ii.getInventoryType(itemid).ordinal()].countById(itemid); return inventory[ItemConstants.getInventoryType(itemid).ordinal()].countById(itemid);
} }
public boolean canHold(int itemid) { public boolean canHold(int itemid) {
@@ -1604,7 +1604,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return true; return true;
} }
return getInventory(ii.getInventoryType(itemid)).getNextFreeSlot() > -1; return getInventory(ItemConstants.getInventoryType(itemid)).getNextFreeSlot() > -1;
} }
public void decreaseBattleshipHp(int decrease) { public void decreaseBattleshipHp(int decrease) {
@@ -3800,8 +3800,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return itemEffect; return itemEffect;
} }
public boolean haveItemWithId(int itemid, boolean checkEquipped) {
return (inventory[ItemConstants.getInventoryType(itemid).ordinal()].findById(itemid) != null) ||
(checkEquipped && inventory[MapleInventoryType.EQUIPPED.ordinal()].findById(itemid) != null);
}
public int getItemQuantity(int itemid, boolean checkEquipped) { public int getItemQuantity(int itemid, boolean checkEquipped) {
int possesed = inventory[ii.getInventoryType(itemid).ordinal()].countById(itemid); int possesed = inventory[ItemConstants.getInventoryType(itemid).ordinal()].countById(itemid);
if (checkEquipped) { if (checkEquipped) {
possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid); possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid);
} }
@@ -3809,7 +3814,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
public int getCleanItemQuantity(int itemid, boolean checkEquipped) { public int getCleanItemQuantity(int itemid, boolean checkEquipped) {
int possesed = inventory[ii.getInventoryType(itemid).ordinal()].countNotOwnedById(itemid); int possesed = inventory[ItemConstants.getInventoryType(itemid).ordinal()].countNotOwnedById(itemid);
if (checkEquipped) { if (checkEquipped) {
possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countNotOwnedById(itemid); possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countNotOwnedById(itemid);
} }
@@ -4697,7 +4702,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
public boolean hasEmptySlot(int itemId) { public boolean hasEmptySlot(int itemId) {
return getInventory(ii.getInventoryType(itemId)).getNextFreeSlot() > -1; return getInventory(ItemConstants.getInventoryType(itemId)).getNextFreeSlot() > -1;
} }
public boolean hasEmptySlot(byte invType) { public boolean hasEmptySlot(byte invType) {
@@ -5767,7 +5772,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} }
if (possesed > 0) { if (possesed > 0) {
message("You have used a safety charm, so your EXP points have not been decreased."); message("You have used a safety charm, so your EXP points have not been decreased.");
MapleInventoryManipulator.removeById(client, ii.getInventoryType(charmID[i]), charmID[i], 1, true, false); MapleInventoryManipulator.removeById(client, ItemConstants.getInventoryType(charmID[i]), charmID[i], 1, true, false);
} else if (mapid > 925020000 && mapid < 925030000) { } else if (mapid > 925020000 && mapid < 925030000) {
this.dojoStage = 0; this.dojoStage = 0;
} else if (mapid > 980000100 && mapid < 980000700) { } else if (mapid > 980000100 && mapid < 980000700) {
+7 -3
View File
@@ -345,7 +345,7 @@ public class Commands {
public static boolean executeHeavenMsCommandLv0(Channel cserv, Server srv, MapleClient c, String[] sub) { //Player public static boolean executeHeavenMsCommandLv0(Channel cserv, Server srv, MapleClient c, String[] sub) { //Player
MapleCharacter player = c.getPlayer(); MapleCharacter player = c.getPlayer();
switch(sub[0]) { switch(sub[0]) {
case "help": case "help":
case "commands": case "commands":
case "playercommands": case "playercommands":
@@ -1158,7 +1158,7 @@ public class Commands {
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), -1, flag, -1); MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), -1, flag, -1);
} else { } else {
Item toDrop; Item toDrop;
if (MapleItemInformationProvider.getInstance().getInventoryType(itemId) == MapleInventoryType.EQUIP) { if (ItemConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
toDrop = MapleItemInformationProvider.getInstance().getEquipById(itemId); toDrop = MapleItemInformationProvider.getInstance().getEquipById(itemId);
} else { } else {
toDrop = new Item(itemId, (short) 0, quantity); toDrop = new Item(itemId, (short) 0, quantity);
@@ -1813,6 +1813,10 @@ public class Commands {
} }
break; break;
case "energy":
System.out.println(c.getPlayer().getDojoEnergy());
break;
case "maxenergy": case "maxenergy":
c.getPlayer().setDojoEnergy(10000); c.getPlayer().setDojoEnergy(10000);
c.announce(MaplePacketCreator.getEnergy("energy", 10000)); c.announce(MaplePacketCreator.getEnergy("energy", 10000));
@@ -2162,7 +2166,7 @@ public class Commands {
short multiply = Short.parseShort(sub[2]); short multiply = Short.parseShort(sub[2]);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemid); MapleInventoryType type = ItemConstants.getInventoryType(itemid);
if (type.equals(MapleInventoryType.EQUIP)) { if (type.equals(MapleInventoryType.EQUIP)) {
Item it = ii.getEquipById(itemid); Item it = ii.getEquipById(itemid);
it.setOwner(player.getName()); it.setOwner(player.getName());
+2 -2
View File
@@ -120,10 +120,10 @@ public class Equip extends Item {
} }
@Override @Override
public byte getType() { public byte getItemType() {
return 1; return 1;
} }
public byte getUpgradeSlots() { public byte getUpgradeSlots() {
return upgradeSlots; return upgradeSlots;
} }
+6 -1
View File
@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package client.inventory; package client.inventory;
import constants.ItemConstants;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@@ -93,7 +94,11 @@ public class Item implements Comparable<Item> {
return quantity; return quantity;
} }
public byte getType() { public MapleInventoryType getInventoryType() {
return ItemConstants.getInventoryType(id);
}
public byte getItemType() { // 1: equip, 3: pet, 2: other
if (getPetId() > -1) { if (getPetId() > -1) {
return 3; return 3;
} }
+1 -1
View File
@@ -133,7 +133,7 @@ public enum ItemFactory {
items.add(new Pair<>(item, mit)); items.add(new Pair<>(item, mit));
} }
} }
rs.close(); rs.close();
ps.close(); ps.close();
con.close(); con.close();
+3 -3
View File
@@ -367,7 +367,7 @@ public class MapleInventory implements Iterable<Item> {
} }
public static boolean checkSpot(MapleCharacter chr, Item item) { public static boolean checkSpot(MapleCharacter chr, Item item) {
if (chr.getInventory(MapleInventoryType.getByType(item.getType())).isFull()) return false; if (chr.getInventory(item.getInventoryType()).isFull()) return false;
return true; return true;
} }
@@ -437,7 +437,7 @@ public class MapleInventory implements Iterable<Item> {
} }
public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed) { public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed) {
// assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0. //assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0 and item list to be checked is a legal one.
Map<Long, Short> rcvItems = new LinkedHashMap<>(); Map<Long, Short> rcvItems = new LinkedHashMap<>();
Map<Long, Byte> rcvTypes = new LinkedHashMap<>(); Map<Long, Byte> rcvTypes = new LinkedHashMap<>();
@@ -493,7 +493,7 @@ public class MapleInventory implements Iterable<Item> {
boolean isRing = false; boolean isRing = false;
Equip equip = null; Equip equip = null;
for (Item item : list()) { for (Item item : list()) {
if (item.getType() == MapleInventoryType.EQUIP.getType()) { if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
equip = (Equip) item; equip = (Equip) item;
isRing = equip.getRingId() > -1; isRing = equip.getRingId() > -1;
} }
+1 -3
View File
@@ -1,7 +1,5 @@
package client.inventory; package client.inventory;
import constants.ItemConstants;
/** /**
* *
* @author kevin * @author kevin
@@ -28,7 +26,7 @@ public class ModifyInventory {
} }
public final int getInventoryType() { public final int getInventoryType() {
return ItemConstants.getInventoryType(item.getItemId()).getType(); return item.getInventoryType().type;
} }
public final short getPosition() { public final short getPosition() {
+3 -3
View File
@@ -152,7 +152,7 @@ public class GameConstants {
} }
public static boolean isPqSkill(final int skill) { public static boolean isPqSkill(final int skill) {
return skill >= 20001013 && skill <= 20000018 || skill % 10000000 == 1020 || skill == 10000013 || skill % 10000000 >= 1009 && skill % 10000000 <= 1011; return (skill >= 20000014 && skill <= 20000018) || skill == 10000013 || skill == 20001013 || (skill % 10000000 >= 1009 && skill % 10000000 <= 1011) || skill % 10000000 == 1020;
} }
public static boolean bannedBindSkills(final int skill) { public static boolean bannedBindSkills(final int skill) {
@@ -185,14 +185,14 @@ public class GameConstants {
} }
public static boolean isDojo(int mapid) { public static boolean isDojo(int mapid) {
return mapid >= 925020100 && mapid <= 925023814; return mapid >= 925020000 && mapid < 925040000;
} }
public static boolean isPyramid(int mapid) { public static boolean isPyramid(int mapid) {
return mapid >= 926010010 & mapid <= 930010000; return mapid >= 926010010 & mapid <= 930010000;
} }
public static boolean isPQSkillMap(int mapid) { public static boolean isPqSkillMap(int mapid) {
return isDojo(mapid) || isPyramid(mapid); return isDojo(mapid) || isPyramid(mapid);
} }
+15 -3
View File
@@ -22,6 +22,8 @@
package constants; package constants;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import java.util.HashMap;
import java.util.Map;
/** /**
* *
@@ -29,6 +31,8 @@ import client.inventory.MapleInventoryType;
* @author Ronan * @author Ronan
*/ */
public final class ItemConstants { public final class ItemConstants {
protected static Map<Integer, MapleInventoryType> inventoryTypeCache = new HashMap<>();
public final static int LOCK = 0x01; public final static int LOCK = 0x01;
public final static int SPIKES = 0x02; public final static int SPIKES = 0x02;
public final static int COLD = 0x04; public final static int COLD = 0x04;
@@ -141,11 +145,19 @@ public final class ItemConstants {
} }
public static MapleInventoryType getInventoryType(final int itemId) { public static MapleInventoryType getInventoryType(final int itemId) {
if (inventoryTypeCache.containsKey(itemId)) {
return inventoryTypeCache.get(itemId);
}
MapleInventoryType ret = MapleInventoryType.UNDEFINED;
final byte type = (byte) (itemId / 1000000); final byte type = (byte) (itemId / 1000000);
if (type < 1 || type > 5) { if (type >= 1 && type <= 5) {
return MapleInventoryType.UNDEFINED; ret = MapleInventoryType.getByType(type);
} }
return MapleInventoryType.getByType(type);
inventoryTypeCache.put(itemId, ret);
return ret;
} }
public static boolean isMakerReagent(int itemId) { public static boolean isMakerReagent(int itemId) {
+3 -1
View File
@@ -59,6 +59,7 @@ public class ServerConstants {
public static final boolean USE_AUTOSAVE = true; //Enables server autosaving feature (saves characters to DB each 1 hour). public static final boolean USE_AUTOSAVE = true; //Enables server autosaving feature (saves characters to DB each 1 hour).
public static final boolean USE_SERVER_AUTOASSIGNER = true; //Server-builtin autoassigner, uses algorithm based on distributing AP accordingly with required secondary stat on equipments. public static final boolean USE_SERVER_AUTOASSIGNER = true; //Server-builtin autoassigner, uses algorithm based on distributing AP accordingly with required secondary stat on equipments.
public static final boolean USE_REFRESH_RANK_MOVE = true; public static final boolean USE_REFRESH_RANK_MOVE = true;
public static final boolean USE_ENFORCE_HPMP_SWAP = false; //Forces players to reuse stats (via AP Resetting) located on HP/MP pool only inside the HP/MP stats.
public static final boolean USE_ENFORCE_MOB_LEVEL_RANGE = true; //Players N levels below the killed mob will gain no experience from defeating it. public static final boolean USE_ENFORCE_MOB_LEVEL_RANGE = true; //Players N levels below the killed mob will gain no experience from defeating it.
public static final boolean USE_ENFORCE_JOB_LEVEL_RANGE = false;//Caps the player level on the minimum required to advance their current jobs. public static final boolean USE_ENFORCE_JOB_LEVEL_RANGE = false;//Caps the player level on the minimum required to advance their current jobs.
public static final boolean USE_ENFORCE_OWL_SUGGESTIONS = false;//Forces the Owl of Minerva to always display the defined item array on GameConstants.OWL_DATA instead of those featured by the players. public static final boolean USE_ENFORCE_OWL_SUGGESTIONS = false;//Forces the Owl of Minerva to always display the defined item array on GameConstants.OWL_DATA instead of those featured by the players.
@@ -131,7 +132,8 @@ public class ServerConstants {
public static final byte CHAIR_EXTRA_HEAL_HP = 70; //Each chair extra heal proc increasing HP. public static final byte CHAIR_EXTRA_HEAL_HP = 70; //Each chair extra heal proc increasing HP.
public static final byte CHAIR_EXTRA_HEAL_MP = 42; //Each chair extra heal proc increasing MP. public static final byte CHAIR_EXTRA_HEAL_MP = 42; //Each chair extra heal proc increasing MP.
//Pet Auto-Pot Recovery Rates //Pet Auto-Pot Configuration
public static final boolean USE_EQUIPS_ON_AUTOPOT = true; //Player MaxHP and MaxMP check values on autopot handler will be updated by the HP/MP bonuses on equipped items.
public static final double PET_AUTOHP_RATIO = 0.99; //Will automatically consume potions until given ratio of the MaxHP/MaxMP is reached. public static final double PET_AUTOHP_RATIO = 0.99; //Will automatically consume potions until given ratio of the MaxHP/MaxMP is reached.
public static final double PET_AUTOMP_RATIO = 0.99; public static final double PET_AUTOMP_RATIO = 0.99;
+2 -2
View File
@@ -5,7 +5,7 @@
package dropspider; package dropspider;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import server.MapleItemInformationProvider; import constants.ItemConstants;
/** /**
* *
@@ -29,7 +29,7 @@ public class DropEntry {
} }
private int calculateChance(int item_id) { private int calculateChance(int item_id) {
MapleInventoryType mit = MapleItemInformationProvider.getInstance().getInventoryType(item_id); MapleInventoryType mit = ItemConstants.getInventoryType(item_id);
boolean boss = DataTool.isBoss(monster_id); boolean boss = DataTool.isBoss(monster_id);
int number = (item_id / 1000) % 1000; int number = (item_id / 1000) % 1000;
switch (mit) { switch (mit) {
@@ -121,14 +121,10 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
if (mySkill == null) { if (mySkill == null) {
mySkill = SkillFactory.getSkill(GameConstants.getHiddenSkill(skill)); mySkill = SkillFactory.getSkill(GameConstants.getHiddenSkill(skill));
} }
int skillLevel = chr.getSkillLevel(mySkill); int skillLevel = chr.getSkillLevel(mySkill);
if (mySkill.getId() % 10000000 == 1020) { if(skillLevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(mySkill.getId())) skillLevel = 1;
if (chr.getPartyQuest() instanceof Pyramid) {
if (((Pyramid) chr.getPartyQuest()).useSkill()) {
skillLevel = 1;
}
}
}
if (skillLevel == 0) { if (skillLevel == 0) {
return null; return null;
} }
@@ -515,9 +511,12 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
ret.skill = lea.readInt(); ret.skill = lea.readInt();
ret.ranged = ranged; ret.ranged = ranged;
ret.magic = magic; ret.magic = magic;
if (ret.skill > 0) { if (ret.skill > 0) {
ret.skilllevel = chr.getSkillLevel(ret.skill); ret.skilllevel = chr.getSkillLevel(ret.skill);
if(ret.skilllevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(ret.skill)) ret.skilllevel = 1;
} }
if (ret.skill == Evan.ICE_BREATH || ret.skill == Evan.FIRE_BREATH || ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB) { if (ret.skill == Evan.ICE_BREATH || ret.skill == Evan.FIRE_BREATH || ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB) {
ret.charge = lea.readInt(); ret.charge = lea.readInt();
} else { } else {
@@ -685,19 +684,21 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
boolean canCrit = false; boolean canCrit = false;
if(chr.getJob().isA((MapleJob.BOWMAN)) || chr.getJob().isA(MapleJob.THIEF) || chr.getJob().isA(MapleJob.NIGHTWALKER1) || chr.getJob().isA(MapleJob.WINDARCHER1) || chr.getJob() == MapleJob.ARAN3 || chr.getJob() == MapleJob.ARAN4 || chr.getJob() == MapleJob.MARAUDER || chr.getJob() == MapleJob.BUCCANEER) { if(chr.getJob().isA((MapleJob.BOWMAN)) || chr.getJob().isA(MapleJob.THIEF) || chr.getJob().isA(MapleJob.NIGHTWALKER1) || chr.getJob().isA(MapleJob.WINDARCHER1) || chr.getJob() == MapleJob.ARAN3 || chr.getJob() == MapleJob.ARAN4 || chr.getJob() == MapleJob.MARAUDER || chr.getJob() == MapleJob.BUCCANEER) {
canCrit = true;
}
if(chr.getBuffEffect(MapleBuffStat.SHARP_EYES) != null) {
// Any class that has sharp eyes can crit. Also, since it stacks with normal crit go ahead
// and calc it in.
canCrit = true; canCrit = true;
calcDmgMax *= 1.4;
} }
boolean shadowPartner = false; if(chr.getBuffEffect(MapleBuffStat.SHARP_EYES) != null) {
if(chr.getBuffEffect(MapleBuffStat.SHADOWPARTNER) != null) // Any class that has sharp eyes can crit. Also, since it stacks with normal crit go ahead
shadowPartner = true; // and calc it in.
canCrit = true;
calcDmgMax *= 1.4;
}
boolean shadowPartner = false;
if(chr.getBuffEffect(MapleBuffStat.SHADOWPARTNER) != null) {
shadowPartner = true;
}
if(ret.skill != 0) { if(ret.skill != 0) {
int fixed = ret.getAttackEffect(chr, SkillFactory.getSkill(ret.skill)).getFixDamage(); int fixed = ret.getAttackEffect(chr, SkillFactory.getSkill(ret.skill)).getFixDamage();
@@ -56,7 +56,7 @@ public final class BBSOperationHandler extends AbstractMaplePacketHandler {
String text = correctLength(slea.readMapleAsciiString(), 600); String text = correctLength(slea.readMapleAsciiString(), 600);
int icon = slea.readInt(); int icon = slea.readInt();
if (icon >= 0x64 && icon <= 0x6a) { if (icon >= 0x64 && icon <= 0x6a) {
if (c.getPlayer().getItemQuantity(5290000 + icon - 0x64, false) > 0) { if (c.getPlayer().haveItemWithId(5290000 + icon - 0x64, false)) {
return; return;
} }
} else if (icon < 0 || icon > 3) { } else if (icon < 0 || icon > 3) {
@@ -37,7 +37,6 @@ import server.CashShop;
import server.CashShop.CashItem; import server.CashShop.CashItem;
import server.CashShop.CashItemFactory; import server.CashShop.CashItemFactory;
import server.MapleInventoryManipulator; import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import tools.FilePrinter; import tools.FilePrinter;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
@@ -197,7 +196,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} }
if (chr.getInventory(MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId())).addItem(item) != -1) { if (chr.getInventory(item.getInventoryType()).addItem(item) != -1) {
cs.removeFromInventory(item); cs.removeFromInventory(item);
c.announce(MaplePacketCreator.takeFromCashInventory(item)); c.announce(MaplePacketCreator.takeFromCashInventory(item));
@@ -80,7 +80,7 @@ public final class ChangeMapHandler extends AbstractMaplePacketHandler {
} }
if (executeStandardPath) { if (executeStandardPath) {
MapleMap to = chr.getMap(); MapleMap to = chr.getMap();
if (wheel && chr.getItemQuantity(5510000, false) > 0) { if (wheel && chr.haveItemWithId(5510000, false)) {
MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, 5510000, 1, true, false); MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, 5510000, 1, true, false);
chr.announce(MaplePacketCreator.showWheelsLeft(chr.getItemQuantity(5510000, false))); chr.announce(MaplePacketCreator.showWheelsLeft(chr.getItemQuantity(5510000, false)));
} else { } else {
@@ -81,10 +81,10 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
c.getPlayer().addStat(4, 1); c.getPlayer().addStat(4, 1);
break; break;
case 2048: // HP case 2048: // HP
addHP(c.getPlayer(), addHP(c)); addHP(c.getPlayer(), addHP(c, usedAPReset));
break; break;
case 8192: // MP case 8192: // MP
addMP(c.getPlayer(), addMP(c)); addMP(c.getPlayer(), addMP(c, usedAPReset));
break; break;
default: default:
c.announce(MaplePacketCreator.updatePlayerStats(MaplePacketCreator.EMPTY_STATUPDATE, true, c.getPlayer())); c.announce(MaplePacketCreator.updatePlayerStats(MaplePacketCreator.EMPTY_STATUPDATE, true, c.getPlayer()));
@@ -93,7 +93,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
return true; return true;
} }
private static int addHP(MapleClient c) { private static int addHP(MapleClient c, boolean usedAPReset) {
MapleCharacter player = c.getPlayer(); MapleCharacter player = c.getPlayer();
MapleJob job = player.getJob(); MapleJob job = player.getJob();
int MaxHP = player.getMaxHp(); int MaxHP = player.getMaxHp();
@@ -101,22 +101,24 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
return MaxHP; return MaxHP;
} }
return MaxHP + calcHpChange(player, job, false); return MaxHP + calcHpChange(player, job, usedAPReset);
} }
public static int calcHpChange(MapleCharacter player, MapleJob job, boolean usedAPReset) { public static int calcHpChange(MapleCharacter player, MapleJob job, boolean usedAPReset) {
int MaxHP = 0; int MaxHP = 0;
if (job.isA(MapleJob.WARRIOR) || job.isA(MapleJob.DAWNWARRIOR1)) { if (job.isA(MapleJob.WARRIOR) || job.isA(MapleJob.DAWNWARRIOR1)) {
Skill increaseHP = SkillFactory.getSkill(job.isA(MapleJob.DAWNWARRIOR1) ? DawnWarrior.MAX_HP_INCREASE : Warrior.IMPROVED_MAXHP); if(!usedAPReset) {
int sLvl = player.getSkillLevel(increaseHP); Skill increaseHP = SkillFactory.getSkill(job.isA(MapleJob.DAWNWARRIOR1) ? DawnWarrior.MAX_HP_INCREASE : Warrior.IMPROVED_MAXHP);
int sLvl = player.getSkillLevel(increaseHP);
if(sLvl > 0)
MaxHP += increaseHP.getEffect(sLvl).getY();
if(sLvl > 0)
MaxHP += increaseHP.getEffect(sLvl).getY();
}
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 18; MaxHP += 20;
} else { } else {
MaxHP += Randomizer.rand(18, 22); MaxHP += Randomizer.rand(18, 22);
} }
@@ -126,7 +128,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
} else if(job.isA(MapleJob.ARAN1)) { } else if(job.isA(MapleJob.ARAN1)) {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 26; MaxHP += 20;
} else { } else {
MaxHP += Randomizer.rand(26, 30); MaxHP += Randomizer.rand(26, 30);
} }
@@ -136,7 +138,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
} else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) { } else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 5; MaxHP += 6;
} else { } else {
MaxHP += Randomizer.rand(5, 9); MaxHP += Randomizer.rand(5, 9);
} }
@@ -146,7 +148,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
} else if (job.isA(MapleJob.THIEF) || job.isA(MapleJob.NIGHTWALKER1)) { } else if (job.isA(MapleJob.THIEF) || job.isA(MapleJob.NIGHTWALKER1)) {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 14; MaxHP += 16;
} else { } else {
MaxHP += Randomizer.rand(14, 18); MaxHP += Randomizer.rand(14, 18);
} }
@@ -156,7 +158,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
} else if(job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.WINDARCHER1)) { } else if(job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.WINDARCHER1)) {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 14; MaxHP += 16;
} else { } else {
MaxHP += Randomizer.rand(14, 18); MaxHP += Randomizer.rand(14, 18);
} }
@@ -164,15 +166,17 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
MaxHP += 16; MaxHP += 16;
} }
} else if (job.isA(MapleJob.PIRATE) || job.isA(MapleJob.THUNDERBREAKER1)) { } else if (job.isA(MapleJob.PIRATE) || job.isA(MapleJob.THUNDERBREAKER1)) {
Skill increaseHP = SkillFactory.getSkill(Brawler.IMPROVE_MAX_HP); if(!usedAPReset) {
int sLvl = player.getSkillLevel(increaseHP); Skill increaseHP = SkillFactory.getSkill(Brawler.IMPROVE_MAX_HP);
int sLvl = player.getSkillLevel(increaseHP);
if(sLvl > 0)
MaxHP += increaseHP.getEffect(sLvl).getY();
if(sLvl > 0)
MaxHP += increaseHP.getEffect(sLvl).getY();
}
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if (usedAPReset) { if (usedAPReset) {
MaxHP += 16; MaxHP += 18;
} else { } else {
MaxHP += Randomizer.rand(16, 20); MaxHP += Randomizer.rand(16, 20);
} }
@@ -188,10 +192,11 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
MaxHP += 10; MaxHP += 10;
} }
} }
return MaxHP; return MaxHP;
} }
private static int addMP(MapleClient c) { private static int addMP(MapleClient c, boolean usedAPReset) {
MapleCharacter player = c.getPlayer(); MapleCharacter player = c.getPlayer();
int MaxMP = player.getMaxMp(); int MaxMP = player.getMaxMp();
MapleJob job = player.getJob(); MapleJob job = player.getJob();
@@ -199,7 +204,7 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
return MaxMP; return MaxMP;
} }
return MaxMP + calcMpChange(player, job, false); return MaxMP + calcMpChange(player, job, usedAPReset);
} }
public static int calcMpChange(MapleCharacter player, MapleJob job, boolean usedAPReset) { public static int calcMpChange(MapleCharacter player, MapleJob job, boolean usedAPReset) {
@@ -209,26 +214,26 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(2, 4) + (player.getInt() / 10)); MaxMP += (Randomizer.rand(2, 4) + (player.getInt() / 10));
} } else {
else { MaxMP += 2;
MaxMP += (2 + (player.getInt() / 10));
} }
} else { } else {
MaxMP += 3; MaxMP += 3;
} }
} else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) { } else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) {
Skill increaseMP = SkillFactory.getSkill(job.isA(MapleJob.BLAZEWIZARD1) ? BlazeWizard.INCREASING_MAX_MP : Magician.IMPROVED_MAX_MP_INCREASE); if(!usedAPReset) {
int sLvl = player.getSkillLevel(increaseMP); Skill increaseMP = SkillFactory.getSkill(job.isA(MapleJob.BLAZEWIZARD1) ? BlazeWizard.INCREASING_MAX_MP : Magician.IMPROVED_MAX_MP_INCREASE);
int sLvl = player.getSkillLevel(increaseMP);
if(sLvl > 0)
MaxMP += increaseMP.getEffect(sLvl).getY();
if(sLvl > 0)
MaxMP += increaseMP.getEffect(sLvl).getY();
}
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(12, 16) + (player.getInt() / 20)); MaxMP += (Randomizer.rand(12, 16) + (player.getInt() / 20));
} } else {
else { MaxMP += 18;
MaxMP += (12 + (player.getInt() / 20));
} }
} else { } else {
MaxMP += 18; MaxMP += 18;
@@ -237,9 +242,8 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(6, 8) + (player.getInt() / 10)); MaxMP += (Randomizer.rand(6, 8) + (player.getInt() / 10));
} } else {
else { MaxMP += 10;
MaxMP += (6 + (player.getInt() / 10));
} }
} else { } else {
MaxMP += 10; MaxMP += 10;
@@ -248,9 +252,8 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(6, 8) + (player.getInt() / 10)); MaxMP += (Randomizer.rand(6, 8) + (player.getInt() / 10));
} } else {
else { MaxMP += 10;
MaxMP += (6 + (player.getInt() / 10));
} }
} else { } else {
MaxMP += 10; MaxMP += 10;
@@ -259,9 +262,8 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(7, 9) + (player.getInt() / 10)); MaxMP += (Randomizer.rand(7, 9) + (player.getInt() / 10));
} } else {
else { MaxMP += 14;
MaxMP += (7 + (player.getInt() / 10));
} }
} else { } else {
MaxMP += 14; MaxMP += 14;
@@ -270,14 +272,14 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) { if(ServerConstants.USE_RANDOMIZE_HPMP_GAIN) {
if(!usedAPReset) { if(!usedAPReset) {
MaxMP += (Randomizer.rand(4, 6) + (player.getInt() / 10)); MaxMP += (Randomizer.rand(4, 6) + (player.getInt() / 10));
} } else {
else { MaxMP += 6;
MaxMP += (4 + (player.getInt() / 10));
} }
} else { } else {
MaxMP += 6; MaxMP += 6;
} }
} }
return MaxMP; return MaxMP;
} }
@@ -294,4 +296,44 @@ public final class DistributeAPHandler extends AbstractMaplePacketHandler {
player.setMaxMp(MaxMP); player.setMaxMp(MaxMP);
player.updateSingleStat(MapleStat.MAXMP, MaxMP); player.updateSingleStat(MapleStat.MAXMP, MaxMP);
} }
public static int takeHp(MapleCharacter player, MapleJob job) {
int MaxHP = 0;
if (job.isA(MapleJob.WARRIOR) || job.isA(MapleJob.DAWNWARRIOR1) || job.isA(MapleJob.ARAN1)) {
MaxHP += 54;
} else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) {
MaxHP += 10;
} else if (job.isA(MapleJob.THIEF) || job.isA(MapleJob.NIGHTWALKER1)) {
MaxHP += 20;
} else if(job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.WINDARCHER1)) {
MaxHP += 20;
} else if (job.isA(MapleJob.PIRATE) || job.isA(MapleJob.THUNDERBREAKER1)) {
MaxHP += 42;
} else {
MaxHP += 12;
}
return MaxHP;
}
public static int takeMp(MapleCharacter player, MapleJob job) {
int MaxMP = 0;
if (job.isA(MapleJob.WARRIOR) || job.isA(MapleJob.DAWNWARRIOR1) || job.isA(MapleJob.ARAN1)) {
MaxMP += 4;
} else if (job.isA(MapleJob.MAGICIAN) || job.isA(MapleJob.BLAZEWIZARD1)) {
MaxMP += 31;
} else if (job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.WINDARCHER1)) {
MaxMP += 12;
} else if(job.isA(MapleJob.THIEF) || job.isA(MapleJob.NIGHTWALKER1)) {
MaxMP += 12;
} else if (job.isA(MapleJob.PIRATE) || job.isA(MapleJob.THUNDERBREAKER1)) {
MaxMP += 16;
} else {
MaxMP += 8;
}
return MaxMP;
}
} }
@@ -47,7 +47,7 @@ public final class DistributeSPHandler extends AbstractMaplePacketHandler {
MapleCharacter player = c.getPlayer(); MapleCharacter player = c.getPlayer();
int remainingSp = player.getRemainingSpBySkill(GameConstants.getSkillBook(skillid/10000)); int remainingSp = player.getRemainingSpBySkill(GameConstants.getSkillBook(skillid/10000));
boolean isBeginnerSkill = false; boolean isBeginnerSkill = false;
if ((!GameConstants.isPQSkillMap(player.getMapId()) && GameConstants.isPqSkill(skillid)) || (!player.isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, player.getJob().getId()) && !player.isGM())) { 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."); 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.\r\n");
c.disconnect(true, false); c.disconnect(true, false);
@@ -42,6 +42,7 @@ import net.AbstractMaplePacketHandler;
import net.server.channel.Channel; import net.server.channel.Channel;
import server.DueyPackages; import server.DueyPackages;
import server.MapleInventoryManipulator; import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import tools.DatabaseConnection; import tools.DatabaseConnection;
import tools.FilePrinter; import tools.FilePrinter;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
@@ -54,12 +55,22 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
TOSERVER_REMOVE_PACKAGE(0x05), TOSERVER_REMOVE_PACKAGE(0x05),
TOSERVER_CLOSE_DUEY(0x07), TOSERVER_CLOSE_DUEY(0x07),
TOCLIENT_OPEN_DUEY(0x08), TOCLIENT_OPEN_DUEY(0x08),
TOCLIENT_NOT_ENOUGH_MESOS(0x0A), TOCLIENT_SEND_ENABLE_ACTIONS(0x09),
TOCLIENT_NAME_DOES_NOT_EXIST(0x0C), TOCLIENT_SEND_NOT_ENOUGH_MESOS(0x0A),
TOCLIENT_SAMEACC_ERROR(0x0D), TOCLIENT_SEND_INCORRECT_REQUEST(0x0B),
TOCLIENT_SUCCESSFULLY_SENT(0x12), TOCLIENT_SEND_NAME_DOES_NOT_EXIST(0x0C),
TOCLIENT_SUCCESSFUL_MSG(0x17), TOCLIENT_SEND_SAMEACC_ERROR(0x0D),
TOCLIENT_PACKAGE_MSG(0x1B); // Ending byte; 4 if received. 3 if delete. TOCLIENT_SEND_RECEIVER_STORAGE_FULL(0x0E),
TOCLIENT_SEND_RECEIVER_UNABLE_TO_RECV(0x0F),
TOCLIENT_SEND_RECEIVER_STORAGE_WITH_UNIQUE(0x10),
TOCLIENT_SEND_MESO_LIMIT(0x11),
TOCLIENT_SEND_SUCCESSFULLY_SENT(0x12),
TOCLIENT_RECV_UNKNOWN_ERROR(0x13),
TOCLIENT_RECV_ENABLE_ACTIONS(0x14),
TOCLIENT_RECV_NO_FREE_SLOTS(0x15),
TOCLIENT_RECV_RECEIVER_WITH_UNIQUE(0x16),
TOCLIENT_RECV_SUCCESSFUL_MSG(0x17),
TOCLIENT_RECV_PACKAGE_MSG(0x1B);
final byte code; final byte code;
private Actions(int code) { private Actions(int code) {
@@ -75,9 +86,6 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
try { try {
PreparedStatement ps; PreparedStatement ps;
String text = "SELECT id,accountid FROM characters WHERE name = ?"; String text = "SELECT id,accountid FROM characters WHERE name = ?";
if (accountid) {
text = "SELECT id,accountid FROM characters WHERE name = ?";
}
Connection con = DatabaseConnection.getConnection(); Connection con = DatabaseConnection.getConnection();
ps = con.prepareStatement(text); ps = con.prepareStatement(text);
ps.setString(1, name); ps.setString(1, name);
@@ -115,9 +123,7 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
int mesos = slea.readInt(); int mesos = slea.readInt();
String recipient = slea.readMapleAsciiString(); String recipient = slea.readMapleAsciiString();
System.out.println(mesos + " " + fee + " " + getFee(mesos) + "/" + amount + " " + Integer.MAX_VALUE); if (mesos < 0 || ((long) mesos + fee + getFee(mesos)) > Integer.MAX_VALUE || (amount < 1 && mesos == 0)) {
if (mesos < 0 || (long) mesos > Integer.MAX_VALUE || ((long) mesos + fee + getFee(mesos)) > Integer.MAX_VALUE || (amount < 1 && mesos == 0)) {
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with duey."); 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 + "\r\n");
c.disconnect(true, false); c.disconnect(true, false);
@@ -129,23 +135,20 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
int accid = getAccIdFromCNAME(recipient, true); int accid = getAccIdFromCNAME(recipient, true);
if (accid != -1) { if (accid != -1) {
if (accid != c.getAccID()) { if (accid != c.getAccID()) {
c.getPlayer().gainMeso(-finalcost, false);
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SUCCESSFULLY_SENT.getCode()));
send = true; send = true;
} else { } else {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SAMEACC_ERROR.getCode())); c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_SAMEACC_ERROR.getCode()));
} }
} else { } else {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_NAME_DOES_NOT_EXIST.getCode())); c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_NAME_DOES_NOT_EXIST.getCode()));
} }
} else { } else {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_NOT_ENOUGH_MESOS.getCode())); c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_NOT_ENOUGH_MESOS.getCode()));
} }
boolean recipientOn = false;
MapleClient rClient = null; MapleClient rClient = null;
int channel = c.getWorldServer().find(recipient); int channel = c.getWorldServer().find(recipient);
if (channel > -1) { if (channel > -1) {
recipientOn = true;
Channel rcserv = c.getWorldServer().getChannel(channel); Channel rcserv = c.getWorldServer().getChannel(channel);
rClient = rcserv.getPlayerStorage().getCharacterByName(recipient).getClient(); rClient = rcserv.getPlayerStorage().getCharacterByName(recipient).getClient();
} }
@@ -154,21 +157,31 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
MapleInventoryType inv = MapleInventoryType.getByType(inventId); MapleInventoryType inv = MapleInventoryType.getByType(inventId);
Item item = c.getPlayer().getInventory(inv).getItem(itemPos); Item item = c.getPlayer().getInventory(inv).getItem(itemPos);
if (item != null && c.getPlayer().getItemQuantity(item.getItemId(), false) >= amount) { if (item != null && c.getPlayer().getItemQuantity(item.getItemId(), false) >= amount) {
c.getPlayer().gainMeso(-finalcost, false);
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_SUCCESSFULLY_SENT.getCode()));
if (ItemConstants.isRechargable(item.getItemId())) { if (ItemConstants.isRechargable(item.getItemId())) {
MapleInventoryManipulator.removeFromSlot(c, inv, itemPos, item.getQuantity(), true); MapleInventoryManipulator.removeFromSlot(c, inv, itemPos, item.getQuantity(), true);
} else { } else {
MapleInventoryManipulator.removeFromSlot(c, inv, itemPos, amount, true, false); MapleInventoryManipulator.removeFromSlot(c, inv, itemPos, amount, true, false);
} }
addItemToDB(item, amount, mesos, c.getPlayer().getName(), getAccIdFromCNAME(recipient, false)); addItemToDB(item, amount, mesos, c.getPlayer().getName(), getAccIdFromCNAME(recipient, false));
} else { } else {
if (item != null) c.getPlayer().dropMessage(1, "You must assign up to " + c.getPlayer().getItemQuantity(item.getItemId(), false) + " of that item to send."); if (item != null) {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_INCORRECT_REQUEST.getCode()));
}
return; return;
} }
} else { } else {
c.getPlayer().gainMeso(-finalcost, false);
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_SEND_SUCCESSFULLY_SENT.getCode()));
addMesoToDB(mesos, c.getPlayer().getName(), getAccIdFromCNAME(recipient, false)); addMesoToDB(mesos, c.getPlayer().getName(), getAccIdFromCNAME(recipient, false));
} }
if (recipientOn && rClient != null) {
rClient.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_PACKAGE_MSG.getCode())); if (rClient != null && rClient.isLoggedIn() && !rClient.getPlayer().isAwayFromWorld()) {
showDueyNotification(rClient, rClient.getPlayer());
} }
} }
} else if (operation == Actions.TOSERVER_REMOVE_PACKAGE.getCode()) { } else if (operation == Actions.TOSERVER_REMOVE_PACKAGE.getCode()) {
@@ -199,15 +212,20 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
} }
dp = dueypack; dp = dueypack;
if(dp == null) { if(dp == null) {
System.out.println("Error: Null Duey package!"); c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_RECV_UNKNOWN_ERROR.getCode()));
c.announce(MaplePacketCreator.enableActions()); FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to receive package from duey with id " + packageid + "\r\n");
return; return;
} }
if (dp.getItem() != null) { if (dp.getItem() != null) {
if (!MapleInventoryManipulator.checkSpace(c, dp.getItem().getItemId(), dp.getItem().getQuantity(), dp.getItem().getOwner())) { if (!MapleInventoryManipulator.checkSpace(c, dp.getItem().getItemId(), dp.getItem().getQuantity(), dp.getItem().getOwner())) {
c.getPlayer().dropMessage(1, "Your inventory is full"); int itemid = dp.getItem().getItemId();
c.announce(MaplePacketCreator.enableActions()); if(MapleItemInformationProvider.getInstance().isPickupRestricted(itemid) && c.getPlayer().getInventory(ItemConstants.getInventoryType(itemid)).findById(itemid) != null) {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_RECV_RECEIVER_WITH_UNIQUE.getCode()));
} else {
c.announce(MaplePacketCreator.sendDueyMSG(Actions.TOCLIENT_RECV_NO_FREE_SLOTS.getCode()));
}
return; return;
} else { } else {
MapleInventoryManipulator.addFromDrop(c, dp.getItem(), false); MapleInventoryManipulator.addFromDrop(c, dp.getItem(), false);
@@ -252,13 +270,13 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
ps.setInt(6, 3); ps.setInt(6, 3);
ps.executeUpdate(); ps.executeUpdate();
} else { } else {
ps.setInt(6, item.getType()); ps.setInt(6, item.getItemType());
ps.executeUpdate(); ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) { try (ResultSet rs = ps.getGeneratedKeys()) {
rs.next(); rs.next();
PreparedStatement ps2; PreparedStatement ps2;
if (item.getType() == 1) { // equips if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
ps2 = con.prepareStatement("INSERT INTO dueyitems (PackageId, itemid, quantity, upgradeslots, level, str, dex, `int`, luk, hp, mp, watk, matk, wdef, mdef, acc, avoid, hands, speed, jump, owner) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); ps2 = con.prepareStatement("INSERT INTO dueyitems (PackageId, itemid, quantity, upgradeslots, level, str, dex, `int`, luk, hp, mp, watk, matk, wdef, mdef, acc, avoid, hands, speed, jump, owner) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
Equip eq = (Equip) item; Equip eq = (Equip) item;
ps2.setInt(2, eq.getItemId()); ps2.setInt(2, eq.getItemId());
@@ -411,4 +429,50 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
return null; return null;
} }
} }
private static void showDueyNotification(MapleClient c, MapleCharacter player) {
Connection con = null;
PreparedStatement ps = null;
PreparedStatement pss = null;
ResultSet rs = null;
try {
con = DatabaseConnection.getConnection();
ps = con.prepareStatement("SELECT Mesos FROM dueypackages WHERE RecieverId = ? and Checked = 1");
ps.setInt(1, player.getId());
rs = ps.executeQuery();
if (rs.next()) {
try {
Connection con2 = DatabaseConnection.getConnection();
pss = con2.prepareStatement("UPDATE dueypackages SET Checked = 0 where RecieverId = ?");
pss.setInt(1, player.getId());
pss.executeUpdate();
pss.close();
con2.close();
} catch (SQLException e) {
e.printStackTrace();
}
c.announce(MaplePacketCreator.sendDueyNotification(false));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pss != null) {
pss.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
} }
@@ -22,17 +22,18 @@
package net.server.channel.handlers; package net.server.channel.handlers;
import client.MapleClient; import client.MapleClient;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
public final class FaceExpressionHandler extends AbstractMaplePacketHandler { public final class FaceExpressionHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
int emote = slea.readInt(); int emote = slea.readInt();
if (emote > 7) { if (emote > 7) {
int emoteid = 5159992 + emote; int emoteid = 5159992 + emote;
if (c.getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(emoteid)).findById(emoteid) == null) { if (c.getPlayer().getInventory(ItemConstants.getInventoryType(emoteid)).findById(emoteid) == null) {
return; return;
} }
} }
@@ -44,6 +44,7 @@ import client.MapleClient;
import client.inventory.Equip; import client.inventory.Equip;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ItemConstants;
public final class MTSHandler extends AbstractMaplePacketHandler { public final class MTSHandler extends AbstractMaplePacketHandler {
@@ -98,7 +99,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
if (quantity < 0 || price < 110 || c.getPlayer().getItemQuantity(itemid, false) < quantity) { if (quantity < 0 || price < 110 || c.getPlayer().getItemQuantity(itemid, false) < quantity) {
return; return;
} }
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(itemid); MapleInventoryType type = ItemConstants.getInventoryType(itemid);
Item i = c.getPlayer().getInventory(type).getItem(slot).copy(); Item i = c.getPlayer().getInventory(type).getItem(slot).copy();
if (i != null && c.getPlayer().getMeso() >= 5000) { if (i != null && c.getPlayer().getMeso() >= 5000) {
Connection con = null; Connection con = null;
@@ -155,7 +156,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
} else { } else {
date += day + ""; date += day + "";
} }
if (i.getType() == 2) { if (!i.getInventoryType().equals(MapleInventoryType.EQUIP)) {
Item item = (Item) i; Item item = (Item) i;
ps = con.prepareStatement("INSERT INTO mts_items (tab, type, itemid, quantity, seller, price, owner, sellername, sell_ends) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); ps = con.prepareStatement("INSERT INTO mts_items (tab, type, itemid, quantity, seller, price, owner, sellername, sell_ends) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
ps.setInt(1, 1); ps.setInt(1, 1);
@@ -294,7 +295,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
if (rs.getInt("type") != 1) { if (rs.getInt("type") != 1) {
Item ii = new Item(rs.getInt("itemid"), (short) 0, (short) rs.getInt("quantity")); Item ii = new Item(rs.getInt("itemid"), (short) 0, (short) rs.getInt("quantity"));
ii.setOwner(rs.getString("owner")); ii.setOwner(rs.getString("owner"));
ii.setPosition(c.getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(rs.getInt("itemid"))).getNextFreeSlot()); ii.setPosition(c.getPlayer().getInventory(ItemConstants.getInventoryType(rs.getInt("itemid"))).getNextFreeSlot());
i = ii.copy(); i = ii.copy();
} else { } else {
Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1); Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1);
@@ -319,7 +320,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
equip.setLevel((byte) rs.getInt("level")); equip.setLevel((byte) rs.getInt("level"));
equip.setVicious((byte) rs.getInt("vicious")); equip.setVicious((byte) rs.getInt("vicious"));
equip.setFlag((byte) rs.getInt("flag")); equip.setFlag((byte) rs.getInt("flag"));
equip.setPosition(c.getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(rs.getInt("itemid"))).getNextFreeSlot()); equip.setPosition(c.getPlayer().getInventory(ItemConstants.getInventoryType(rs.getInt("itemid"))).getNextFreeSlot());
i = equip.copy(); i = equip.copy();
} }
try (PreparedStatement pse = con.prepareStatement("DELETE FROM mts_items WHERE id = ? AND seller = ? AND transfer = 1")) { try (PreparedStatement pse = con.prepareStatement("DELETE FROM mts_items WHERE id = ? AND seller = ? AND transfer = 1")) {
@@ -384,7 +384,7 @@ public final class MakerSkillHandler extends AbstractMaplePacketHandler {
private static boolean hasItems(MapleClient c, MakerItemCreateEntry recipe) { private static boolean hasItems(MapleClient c, MakerItemCreateEntry recipe) {
for (Pair<Integer, Integer> p : recipe.getReqItems()) { for (Pair<Integer, Integer> p : recipe.getReqItems()) {
int itemId = p.getLeft(); int itemId = p.getLeft();
if (c.getPlayer().getInventory(ii.getInventoryType(itemId)).countById(itemId) < p.getRight()) { if (c.getPlayer().getInventory(ItemConstants.getInventoryType(itemId)).countById(itemId) < p.getRight()) {
return false; return false;
} }
} }
@@ -31,7 +31,8 @@ import client.MapleClient;
* *
* @author Matze * @author Matze
*/ */
public final class MesoDropHandler extends AbstractMaplePacketHandler {//FIX public final class MesoDropHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter player = c.getPlayer(); MapleCharacter player = c.getPlayer();
if (!player.isAlive()) { if (!player.isAlive()) {
@@ -23,8 +23,8 @@ package net.server.channel.handlers;
import client.MapleClient; import client.MapleClient;
import client.autoban.AutobanFactory; import client.autoban.AutobanFactory;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import server.MapleItemInformationProvider;
import tools.FilePrinter; import tools.FilePrinter;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
@@ -50,7 +50,7 @@ public final class NPCShopHandler extends AbstractMaplePacketHandler {
short slot = slea.readShort(); short slot = slea.readShort();
int itemId = slea.readInt(); int itemId = slea.readInt();
short quantity = slea.readShort(); short quantity = slea.readShort();
c.getPlayer().getShop().sell(c, MapleItemInformationProvider.getInstance().getInventoryType(itemId), slot, quantity); c.getPlayer().getShop().sell(c, ItemConstants.getInventoryType(itemId), slot, quantity);
} else if (bmode == 2) { // recharge ;) } else if (bmode == 2) { // recharge ;)
byte slot = (byte) slea.readShort(); byte slot = (byte) slea.readShort();
c.getPlayer().getShop().recharge(c, slot); c.getPlayer().getShop().recharge(c, slot);
@@ -31,7 +31,6 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import net.server.Server; import net.server.Server;
import server.MapleItemInformationProvider;
import tools.DatabaseConnection; import tools.DatabaseConnection;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
@@ -147,7 +146,7 @@ public final class NewYearCardHandler extends AbstractMaplePacketHandler {
private static int getValidNewYearCardStatus(int itemid, MapleCharacter player, short slot) { private static int getValidNewYearCardStatus(int itemid, MapleCharacter player, short slot) {
if(!ItemConstants.isNewYearCardUse(itemid)) return 0x14; if(!ItemConstants.isNewYearCardUse(itemid)) return 0x14;
Item it = player.getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemid)).getItem(slot); Item it = player.getInventory(ItemConstants.getInventoryType(itemid)).getItem(slot);
return (it != null && it.getItemId() == itemid) ? 0 : 0x12; return (it != null && it.getItemId() == itemid) ? 0 : 0x12;
} }
} }
@@ -1,8 +1,6 @@
/* /*
This file is part of the OdinMS Maple Story Server This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> Copyleft (L) 2017 RonanLana
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as it under the terms of the GNU Affero General Public License as
@@ -22,6 +20,8 @@
package net.server.channel.handlers; package net.server.channel.handlers;
import client.MapleClient; import client.MapleClient;
import client.MapleCharacter;
import client.inventory.Equip;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
@@ -32,6 +32,10 @@ import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
import constants.ServerConstants; import constants.ServerConstants;
/**
*
* @author Ronan
*/
public final class PetAutoPotHandler extends AbstractMaplePacketHandler { public final class PetAutoPotHandler extends AbstractMaplePacketHandler {
@Override @Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
@@ -39,12 +43,28 @@ public final class PetAutoPotHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} }
MapleCharacter chr = c.getPlayer();
short maxHp = 0, maxMp = 0;
if(ServerConstants.USE_EQUIPS_ON_AUTOPOT) {
for(Item i : c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).list()) {
Equip e = (Equip) i;
maxHp += e.getHp();
maxMp += e.getMp();
}
}
maxHp = (short) Math.min(chr.getMaxHp() + maxHp, 30000);
maxMp = (short) Math.min(chr.getMaxMp() + maxMp, 30000);
slea.readByte(); slea.readByte();
slea.readLong(); slea.readLong();
slea.readInt(); slea.readInt();
short slot = slea.readShort(); short slot = slea.readShort();
int itemId = slea.readInt(); int itemId = slea.readInt();
Item toUse = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot); Item toUse = chr.getInventory(MapleInventoryType.USE).getItem(slot);
if(toUse != null) { if(toUse != null) {
MapleStatEffect stat = MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()); MapleStatEffect stat = MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId());
@@ -56,11 +76,15 @@ public final class PetAutoPotHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} }
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false); MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
//stat = MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()); stat.applyTo(chr);
stat.applyTo(c.getPlayer());
} while(((stat.getHp() > 0 && c.getPlayer().getHp() < ServerConstants.PET_AUTOHP_RATIO * c.getPlayer().getMaxHp()) || (stat.getMp() > 0 && c.getPlayer().getMp() < ServerConstants.PET_AUTOMP_RATIO * c.getPlayer().getMaxMp())) && toUse.getQuantity() > 0); //System.out.println();
//System.out.println("hp: " + stat.getHp() + " player hp " + c.getPlayer().getHp() + " maxhp " + maxHp);
//System.out.println("mp: " + stat.getMp() + " player mp " + c.getPlayer().getMp() + " maxmp " + maxMp);
//System.out.println("redo? " + (((stat.getHp() > 0 && c.getPlayer().getHp() < ServerConstants.PET_AUTOHP_RATIO * maxHp) || (stat.getMp() > 0 && c.getPlayer().getMp() < ServerConstants.PET_AUTOMP_RATIO * maxMp)) && toUse.getQuantity() > 0));
} while(((stat.getHp() > 0 && chr.getHp() < ServerConstants.PET_AUTOHP_RATIO * maxHp) || (stat.getMp() > 0 && chr.getMp() < ServerConstants.PET_AUTOMP_RATIO * maxMp)) && toUse.getQuantity() > 0);
} }
} }
} }
@@ -114,48 +114,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = getLocalStartTimes(buffs); List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = getLocalStartTimes(buffs);
player.silentGiveBuffs(timedBuffs); player.silentGiveBuffs(timedBuffs);
} }
Connection con = null;
PreparedStatement ps = null;
PreparedStatement pss = null;
ResultSet rs = null;
try {
con = DatabaseConnection.getConnection();
ps = con.prepareStatement("SELECT Mesos FROM dueypackages WHERE RecieverId = ? and Checked = 1");
ps.setInt(1, player.getId());
rs = ps.executeQuery();
if (rs.next()) {
try {
Connection con2 = DatabaseConnection.getConnection();
pss = con2.prepareStatement("UPDATE dueypackages SET Checked = 0 where RecieverId = ?");
pss.setInt(1, player.getId());
pss.executeUpdate();
pss.close();
con2.close();
} catch (SQLException e) {
e.printStackTrace();
}
c.announce(MaplePacketCreator.sendDueyMSG((byte) 0x1B));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pss != null) {
pss.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
c.announce(MaplePacketCreator.getCharInfo(player)); c.announce(MaplePacketCreator.getCharInfo(player));
if (!player.isHidden()) { if (!player.isHidden()) {
player.toggleHide(true); player.toggleHide(true);
@@ -286,6 +245,8 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
} }
showDueyNotification(c, player);
if (player.getMap().getHPDec() > 0) player.resetHpDecreaseTask(); if (player.getMap().getHPDec() > 0) player.resetHpDecreaseTask();
player.resetPlayerRates(); player.resetPlayerRates();
@@ -296,7 +257,53 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
player.receivePartyMemberHP(); player.receivePartyMemberHP();
} }
private List<Pair<Long, PlayerBuffValueHolder>> getLocalStartTimes(List<PlayerBuffValueHolder> lpbvl) { private static void showDueyNotification(MapleClient c, MapleCharacter player) {
Connection con = null;
PreparedStatement ps = null;
PreparedStatement pss = null;
ResultSet rs = null;
try {
con = DatabaseConnection.getConnection();
ps = con.prepareStatement("SELECT Mesos FROM dueypackages WHERE RecieverId = ? and Checked = 1");
ps.setInt(1, player.getId());
rs = ps.executeQuery();
if (rs.next()) {
try {
Connection con2 = DatabaseConnection.getConnection();
pss = con2.prepareStatement("UPDATE dueypackages SET Checked = 0 where RecieverId = ?");
pss.setInt(1, player.getId());
pss.executeUpdate();
pss.close();
con2.close();
} catch (SQLException e) {
e.printStackTrace();
}
c.announce(MaplePacketCreator.sendDueyNotification(false));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pss != null) {
pss.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
private static List<Pair<Long, PlayerBuffValueHolder>> getLocalStartTimes(List<PlayerBuffValueHolder> lpbvl) {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = new ArrayList<>(); List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = new ArrayList<>();
long curtime = System.currentTimeMillis(); long curtime = System.currentTimeMillis();
@@ -23,9 +23,9 @@ package net.server.channel.handlers;
import client.MapleClient; import client.MapleClient;
import client.autoban.AutobanFactory; import client.autoban.AutobanFactory;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import scripting.npc.NPCScriptManager; import scripting.npc.NPCScriptManager;
import server.MapleItemInformationProvider;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
/** /**
@@ -33,6 +33,7 @@ import tools.data.input.SeekableLittleEndianAccessor;
* @author Generic * @author Generic
*/ */
public final class RemoteGachaponHandler extends AbstractMaplePacketHandler { public final class RemoteGachaponHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
int ticket = slea.readInt(); int ticket = slea.readInt();
int gacha = slea.readInt(); int gacha = slea.readInt();
@@ -44,7 +45,7 @@ public final class RemoteGachaponHandler extends AbstractMaplePacketHandler {
AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with mode: " + gacha); AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with mode: " + gacha);
c.disconnect(false, false); c.disconnect(false, false);
return; return;
} else if (c.getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(ticket)).countById(ticket) < 1) { } else if (c.getPlayer().getInventory(ItemConstants.getInventoryType(ticket)).countById(ticket) < 1) {
AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler without a ticket."); AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler without a ticket.");
c.disconnect(false, false); c.disconnect(false, false);
return; return;
@@ -23,6 +23,7 @@ package net.server.channel.handlers;
import client.MapleClient; import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import scripting.item.ItemScriptManager; import scripting.item.ItemScriptManager;
import server.MapleItemInformationProvider; import server.MapleItemInformationProvider;
@@ -44,7 +45,7 @@ public final class ScriptedItemHandler extends AbstractMaplePacketHandler {
scriptedItem info = ii.getScriptedItemInfo(itemId); scriptedItem info = ii.getScriptedItemInfo(itemId);
if (info == null) return; if (info == null) return;
ItemScriptManager ism = ItemScriptManager.getInstance(); ItemScriptManager ism = ItemScriptManager.getInstance();
Item item = c.getPlayer().getInventory(ii.getInventoryType(itemId)).getItem(itemSlot); Item item = c.getPlayer().getInventory(ItemConstants.getInventoryType(itemId)).getItem(itemSlot);
if (item == null || item.getItemId() != itemId || item.getQuantity() < 1 || !ism.scriptExists(info.getScript())) { if (item == null || item.getItemId() != itemId || item.getQuantity() < 1 || !ism.scriptExists(info.getScript())) {
return; return;
} }
@@ -45,7 +45,6 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
@Override @Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer(); MapleCharacter chr = c.getPlayer();
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
byte mode = slea.readByte(); byte mode = slea.readByte();
final MapleStorage storage = chr.getStorage(); final MapleStorage storage = chr.getStorage();
@@ -66,7 +65,7 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
slot = storage.getSlot(MapleInventoryType.getByType(type), slot); slot = storage.getSlot(MapleInventoryType.getByType(type), slot);
Item item = storage.getItem(slot); Item item = storage.getItem(slot);
if (item != null) { if (item != null) {
if (MapleItemInformationProvider.getInstance().isPickupRestricted(item.getItemId()) && chr.getItemQuantity(item.getItemId(), true) > 0) { if (MapleItemInformationProvider.getInstance().isPickupRestricted(item.getItemId()) && chr.haveItemWithId(item.getItemId(), true)) {
c.announce(MaplePacketCreator.getStorageError((byte) 0x0C)); c.announce(MaplePacketCreator.getStorageError((byte) 0x0C));
return; return;
} }
@@ -86,7 +85,7 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
item.setFlag((byte) (item.getFlag() ^ ItemConstants.KARMA)); //items with scissors of karma used on them are reset once traded item.setFlag((byte) (item.getFlag() ^ ItemConstants.KARMA)); //items with scissors of karma used on them are reset once traded
} }
MapleInventoryManipulator.addFromDrop(c, item, false); MapleInventoryManipulator.addFromDrop(c, item, false);
storage.sendTakenOut(c, ii.getInventoryType(item.getItemId())); storage.sendTakenOut(c, item.getInventoryType());
} else { } else {
c.announce(MaplePacketCreator.getStorageError((byte) 0x0A)); c.announce(MaplePacketCreator.getStorageError((byte) 0x0A));
} }
@@ -95,7 +94,7 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
short slot = slea.readShort(); short slot = slea.readShort();
int itemId = slea.readInt(); int itemId = slea.readInt();
short quantity = slea.readShort(); short quantity = slea.readShort();
MapleInventoryType slotType = ii.getInventoryType(itemId); MapleInventoryType slotType = ItemConstants.getInventoryType(itemId);
MapleInventory Inv = chr.getInventory(slotType); MapleInventory Inv = chr.getInventory(slotType);
if (slot < 1 || slot > Inv.getSlotLimit()) { //player inv starts at one 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."); AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
@@ -115,7 +114,7 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
if (chr.getMeso() < meso) { if (chr.getMeso() < meso) {
c.announce(MaplePacketCreator.getStorageError((byte) 0x0B)); c.announce(MaplePacketCreator.getStorageError((byte) 0x0B));
} else { } else {
MapleInventoryType type = ii.getInventoryType(itemId); MapleInventoryType type = ItemConstants.getInventoryType(itemId);
Item item = chr.getInventory(type).getItem(slot).copy(); Item item = chr.getInventory(type).getItem(slot).copy();
if (item.getItemId() == itemId && (item.getQuantity() >= quantity || ItemConstants.isRechargable(itemId))) { if (item.getItemId() == itemId && (item.getQuantity() >= quantity || ItemConstants.isRechargable(itemId))) {
if (ItemConstants.isRechargable(itemId)) { if (ItemConstants.isRechargable(itemId)) {
@@ -125,7 +124,7 @@ public final class StorageHandler extends AbstractMaplePacketHandler {
MapleInventoryManipulator.removeFromSlot(c, type, slot, quantity, false); MapleInventoryManipulator.removeFromSlot(c, type, slot, quantity, false);
item.setQuantity(quantity); item.setQuantity(quantity);
storage.store(item); storage.store(item);
storage.sendStored(c, ii.getInventoryType(itemId)); storage.sendStored(c, ItemConstants.getInventoryType(itemId));
String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId()); 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() + ")\r\n");
} }
@@ -31,6 +31,7 @@ import client.inventory.MapleInventoryType;
import client.status.MonsterStatus; import client.status.MonsterStatus;
import client.status.MonsterStatusEffect; import client.status.MonsterStatusEffect;
import constants.GameConstants; import constants.GameConstants;
import constants.ItemConstants;
import constants.ServerConstants; import constants.ServerConstants;
import constants.skills.Aran; import constants.skills.Aran;
import constants.skills.Corsair; import constants.skills.Corsair;
@@ -42,7 +43,6 @@ import java.util.List;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import server.MapleInventoryManipulator; import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleStatEffect; import server.MapleStatEffect;
import server.life.MapleLifeFactory.loseItem; import server.life.MapleLifeFactory.loseItem;
import server.life.MapleMonster; import server.life.MapleMonster;
@@ -104,7 +104,7 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
byte d = 1; byte d = 1;
Point pos = new Point(0, player.getPosition().y); Point pos = new Point(0, player.getPosition().y);
for (loseItem loseItem : loseItems) { for (loseItem loseItem : loseItems) {
type = MapleItemInformationProvider.getInstance().getInventoryType(loseItem.getId()); type = ItemConstants.getInventoryType(loseItem.getId());
for (byte b = 0; b < loseItem.getX(); b++) {//LOL? for (byte b = 0; b < loseItem.getX(); b++) {//LOL?
if (Randomizer.nextInt(101) >= loseItem.getChance()) { if (Randomizer.nextInt(101) >= loseItem.getChance()) {
if (player.haveItem(loseItem.getId())) { if (player.haveItem(loseItem.getId())) {
@@ -137,13 +137,20 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
player.addStat(4, -1); player.addStat(4, -1);
break; break;
case 2048: // HP case 2048: // HP
if (APTo != 8192) { if(ServerConstants.USE_ENFORCE_HPMP_SWAP) {
c.getPlayer().message("You can only swap HP ability points to MP."); if (APTo != 8192) {
c.getPlayer().message("You can only swap HP ability points to MP.");
c.announce(MaplePacketCreator.enableActions());
return;
}
}
if (player.getHpMpApUsed() < 1) {
c.getPlayer().message("You don't have enough HPMP stat points to spend on AP Reset.");
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} }
int hp = player.getHp(); int hp = player.getMaxHp();
int level_ = player.getLevel(); int level_ = player.getLevel();
boolean canWash_ = true; boolean canWash_ = true;
@@ -157,7 +164,8 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
return; return;
} }
int hplose = -DistributeAPHandler.calcHpChange(player, player.getJob(), true); player.setHpMpApUsed(player.getHpMpApUsed() - 1);
int hplose = -DistributeAPHandler.takeHp(player, player.getJob());
int nextHp = Math.max(1, player.getHp() + hplose), nextMaxHp = Math.max(50, player.getMaxHp() + hplose); int nextHp = Math.max(1, player.getHp() + hplose), nextMaxHp = Math.max(50, player.getMaxHp() + hplose);
player.setHp(nextHp); player.setHp(nextHp);
@@ -167,12 +175,20 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
break; break;
case 8192: // MP case 8192: // MP
if (APTo != 2048) { if(ServerConstants.USE_ENFORCE_HPMP_SWAP) {
c.getPlayer().message("You can only swap MP ability points to HP."); if (APTo != 2048) {
c.getPlayer().message("You can only swap MP ability points to HP.");
c.announce(MaplePacketCreator.enableActions());
return;
}
}
if (player.getHpMpApUsed() < 1) {
c.getPlayer().message("You don't have enough HPMP stat points to spend on AP Reset.");
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} }
int mp = player.getMp();
int mp = player.getMaxMp();
int level = player.getLevel(); int level = player.getLevel();
MapleJob job = player.getJob(); MapleJob job = player.getJob();
@@ -193,13 +209,15 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
return; return;
} }
int mplose = -DistributeAPHandler.calcMpChange(player, job, true); player.setHpMpApUsed(player.getHpMpApUsed() - 1);
int mplose = -DistributeAPHandler.takeMp(player, job);
int nextMp = Math.max(0, player.getMp() + mplose), nextMaxMp = Math.max(5, player.getMaxMp() + mplose); int nextMp = Math.max(0, player.getMp() + mplose), nextMaxMp = Math.max(5, player.getMaxMp() + mplose);
player.setHp(nextMp); player.setMp(nextMp);
player.setMaxHp(nextMaxMp); player.setMaxMp(nextMaxMp);
statupdate.add(new Pair<>(MapleStat.HP, nextMp)); statupdate.add(new Pair<>(MapleStat.MP, nextMp));
statupdate.add(new Pair<>(MapleStat.MAXHP, nextMaxMp)); statupdate.add(new Pair<>(MapleStat.MAXMP, nextMaxMp));
break; break;
default: default:
c.announce(MaplePacketCreator.updatePlayerStats(MaplePacketCreator.EMPTY_STATUPDATE, true, c.getPlayer())); c.announce(MaplePacketCreator.updatePlayerStats(MaplePacketCreator.EMPTY_STATUPDATE, true, c.getPlayer()));
@@ -328,7 +346,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
if (item == null) //hack if (item == null) //hack
{ {
return; return;
} else if (ii.isDropRestricted(item.getItemId())) { //Lol? } else if (((item.getFlag() & ItemConstants.UNTRADEABLE) == ItemConstants.UNTRADEABLE) || ii.isDropRestricted(item.getItemId())) {
player.dropMessage(1, "You cannot trade this item."); player.dropMessage(1, "You cannot trade this item.");
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
@@ -352,7 +370,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} }
remove(c, itemId); remove(c, itemId);
} else if (itemType == 508) { //graduation banner } else if (itemType == 508) { //graduation banner
slea.readMapleAsciiString(); // message, sepearated by 0A for lines slea.readMapleAsciiString(); // message, separated by 0A for lines
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
} else if (itemType == 509) { } else if (itemType == 509) {
String sendTo = slea.readMapleAsciiString(); String sendTo = slea.readMapleAsciiString();
@@ -25,9 +25,9 @@ import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import client.autoban.AutobanManager; import client.autoban.AutobanManager;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import server.MapleInventoryManipulator; import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.life.MapleMonster; import server.life.MapleMonster;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
@@ -37,6 +37,7 @@ import tools.data.input.SeekableLittleEndianAccessor;
* @author kevintjuh93 * @author kevintjuh93
*/ */
public final class UseCatchItemHandler extends AbstractMaplePacketHandler { public final class UseCatchItemHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer(); MapleCharacter chr = c.getPlayer();
AutobanManager abm = chr.getAutobanManager(); AutobanManager abm = chr.getAutobanManager();
@@ -46,7 +47,7 @@ public final class UseCatchItemHandler extends AbstractMaplePacketHandler {
int monsterid = slea.readInt(); int monsterid = slea.readInt();
MapleMonster mob = chr.getMap().getMonsterByOid(monsterid); MapleMonster mob = chr.getMap().getMonsterByOid(monsterid);
if (chr.getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemId)).countById(itemId) <= 0) { if (chr.getInventory(ItemConstants.getInventoryType(itemId)).countById(itemId) <= 0) {
return; return;
} }
if (mob == null) { if (mob == null) {
@@ -8,8 +8,8 @@ import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import net.AbstractMaplePacketHandler; import net.AbstractMaplePacketHandler;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor;
@@ -29,7 +29,7 @@ public class WeddingHandler extends AbstractMaplePacketHandler {
short slot = slea.readShort(); short slot = slea.readShort();
int itemid = slea.readInt(); int itemid = slea.readInt();
short quantity = slea.readShort(); short quantity = slea.readShort();
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(itemid); MapleInventoryType type = ItemConstants.getInventoryType(itemid);
Item item = chr.getInventory(type).getItem(slot); Item item = chr.getInventory(type).getItem(slot);
if (itemid == item.getItemId() && quantity <= item.getQuantity()) { if (itemid == item.getItemId() && quantity <= item.getQuantity()) {
c.announce(MaplePacketCreator.addItemToWeddingRegistry(chr, item)); c.announce(MaplePacketCreator.addItemToWeddingRegistry(chr, item));
+2 -2
View File
@@ -822,7 +822,7 @@ public class World {
for(Map.Entry<Integer, Byte> dp: deployedPets.entrySet()) { for(Map.Entry<Integer, Byte> dp: deployedPets.entrySet()) {
MapleCharacter chr = this.getPlayerStorage().getCharacterById(dp.getKey() / 4); MapleCharacter chr = this.getPlayerStorage().getCharacterById(dp.getKey() / 4);
if(chr == null || !chr.isLoggedin()) continue; if(chr == null || !chr.isLoggedin() || chr.isAwayFromWorld()) continue;
Byte dpVal = (byte)(dp.getValue() + 1); Byte dpVal = (byte)(dp.getValue() + 1);
if(dpVal == ServerConstants.PET_EXHAUST_COUNT) { if(dpVal == ServerConstants.PET_EXHAUST_COUNT) {
@@ -880,7 +880,7 @@ public class World {
for(Map.Entry<Integer, Byte> dp: deployedMounts.entrySet()) { for(Map.Entry<Integer, Byte> dp: deployedMounts.entrySet()) {
MapleCharacter chr = this.getPlayerStorage().getCharacterById(dp.getKey()); MapleCharacter chr = this.getPlayerStorage().getCharacterById(dp.getKey());
if(chr == null || !chr.isLoggedin()) continue; if(chr == null || !chr.isLoggedin() || chr.isAwayFromWorld()) continue;
Byte dpVal = (byte)(dp.getValue() + 1); Byte dpVal = (byte)(dp.getValue() + 1);
if(dpVal == ServerConstants.MOUNT_EXHAUST_COUNT) { if(dpVal == ServerConstants.MOUNT_EXHAUST_COUNT) {
+19 -12
View File
@@ -46,7 +46,6 @@ import server.life.MobSkillFactory;
import server.maps.MapleMap; import server.maps.MapleMap;
import server.maps.MapleMapObject; import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType; import server.maps.MapleMapObjectType;
import server.maps.MapleMiniDungeon;
import server.partyquest.PartyQuest; import server.partyquest.PartyQuest;
import server.partyquest.Pyramid; import server.partyquest.Pyramid;
import server.quest.MapleQuest; import server.quest.MapleQuest;
@@ -202,6 +201,14 @@ public class AbstractPlayerInteraction {
return getPlayer().getItemQuantity(itemid, false); return getPlayer().getItemQuantity(itemid, false);
} }
public boolean haveItemWithId(int itemid) {
return haveItemWithId(itemid, false);
}
public boolean haveItemWithId(int itemid, boolean checkEquipped) {
return getPlayer().haveItemWithId(itemid, checkEquipped);
}
public boolean canHold(int itemid) { public boolean canHold(int itemid) {
return canHold(itemid, 1); return canHold(itemid, 1);
} }
@@ -227,7 +234,7 @@ public class AbstractPlayerInteraction {
List<Pair<Item, MapleInventoryType>> addedItems = new LinkedList<>(); List<Pair<Item, MapleInventoryType>> addedItems = new LinkedList<>();
for(int i = 0; i < size; i++) { for(int i = 0; i < size; i++) {
Item it = new Item(itemids.get(i), (short) 0, quantity.get(i).shortValue()); Item it = new Item(itemids.get(i), (short) 0, quantity.get(i).shortValue());
addedItems.add(new Pair<>(it, MapleItemInformationProvider.getInstance().getInventoryType(itemids.get(i)))); addedItems.add(new Pair<>(it, ItemConstants.getInventoryType(itemids.get(i))));
} }
return MapleInventory.checkSpots(c.getPlayer(), addedItems); return MapleInventory.checkSpots(c.getPlayer(), addedItems);
@@ -447,7 +454,7 @@ public class AbstractPlayerInteraction {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.getInventoryType(id).equals(MapleInventoryType.EQUIP)) { if (ItemConstants.getInventoryType(id).equals(MapleInventoryType.EQUIP)) {
item = ii.getEquipById(id); item = ii.getEquipById(id);
if(item != null) { if(item != null) {
@@ -459,7 +466,7 @@ public class AbstractPlayerInteraction {
if(!(c.getPlayer().isGM() && ServerConstants.USE_PERFECT_GM_SCROLL)) { if(!(c.getPlayer().isGM() && ServerConstants.USE_PERFECT_GM_SCROLL)) {
eqp.setUpgradeSlots((byte)(eqp.getUpgradeSlots() + 1)); eqp.setUpgradeSlots((byte)(eqp.getUpgradeSlots() + 1));
} }
item = MapleItemInformationProvider.getInstance().scrollEquipWithId(item, 2049100, true, 0, c.getPlayer().isGM()); item = MapleItemInformationProvider.getInstance().scrollEquipWithId(item, 2049100, true, 2049100, c.getPlayer().isGM());
} }
} }
} else { } else {
@@ -472,10 +479,10 @@ public class AbstractPlayerInteraction {
item.setPetId(petId); item.setPetId(petId);
if (!MapleInventoryManipulator.checkSpace(c, id, quantity, "")) { if (!MapleInventoryManipulator.checkSpace(c, id, quantity, "")) {
c.getPlayer().dropMessage(1, "Your inventory is full. Please remove an item from your " + ii.getInventoryType(id).name() + " inventory."); c.getPlayer().dropMessage(1, "Your inventory is full. Please remove an item from your " + ItemConstants.getInventoryType(id).name() + " inventory.");
return null; return null;
} }
if (ii.getInventoryType(id).equals(MapleInventoryType.EQUIP) && !ItemConstants.isRechargable(item.getItemId())) { if (ItemConstants.getInventoryType(id) == MapleInventoryType.EQUIP) {
if (randomStats) { if (randomStats) {
item = ii.randomizeStats((Equip) item); item = ii.randomizeStats((Equip) item);
MapleInventoryManipulator.addFromDrop(c, ii.randomizeStats((Equip) item), false, petId); MapleInventoryManipulator.addFromDrop(c, ii.randomizeStats((Equip) item), false, petId);
@@ -486,7 +493,7 @@ public class AbstractPlayerInteraction {
MapleInventoryManipulator.addFromDrop(c, item, false, petId); MapleInventoryManipulator.addFromDrop(c, item, false, petId);
} }
} else { } else {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false); MapleInventoryManipulator.removeById(c, ItemConstants.getInventoryType(id), id, -quantity, true, false);
} }
if (showMessage) { if (showMessage) {
c.announce(MaplePacketCreator.getShowItemGain(id, quantity, true)); c.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
@@ -604,7 +611,7 @@ public class AbstractPlayerInteraction {
if (quantity >= 0) { if (quantity >= 0) {
MapleInventoryManipulator.addById(cl, id, quantity); MapleInventoryManipulator.addById(cl, id, quantity);
} else { } else {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false); MapleInventoryManipulator.removeById(cl, ItemConstants.getInventoryType(id), id, -quantity, true, false);
} }
cl.announce(MaplePacketCreator.getShowItemGain(id, quantity, true)); cl.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
} }
@@ -683,11 +690,11 @@ public class AbstractPlayerInteraction {
public void removeFromParty(int id, List<MapleCharacter> party) { public void removeFromParty(int id, List<MapleCharacter> party) {
for (MapleCharacter chr : party) { for (MapleCharacter chr : party) {
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(id); MapleInventoryType type = ItemConstants.getInventoryType(id);
MapleInventory iv = chr.getInventory(type); MapleInventory iv = chr.getInventory(type);
int possesed = iv.countById(id); int possesed = iv.countById(id);
if (possesed > 0) { if (possesed > 0) {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possesed, true, false); MapleInventoryManipulator.removeById(c, ItemConstants.getInventoryType(id), id, possesed, true, false);
chr.announce(MaplePacketCreator.getShowItemGain(id, (short) -possesed, true)); chr.announce(MaplePacketCreator.getShowItemGain(id, (short) -possesed, true));
} }
} }
@@ -698,10 +705,10 @@ public class AbstractPlayerInteraction {
} }
public void removeAll(int id, MapleClient cl) { public void removeAll(int id, MapleClient cl) {
MapleInventoryType invType = MapleItemInformationProvider.getInstance().getInventoryType(id); MapleInventoryType invType = ItemConstants.getInventoryType(id);
int possessed = cl.getPlayer().getInventory(invType).countById(id); int possessed = cl.getPlayer().getInventory(invType).countById(id);
if (possessed > 0) { if (possessed > 0) {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possessed, true, false); MapleInventoryManipulator.removeById(cl, ItemConstants.getInventoryType(id), id, possessed, true, false);
cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -possessed, true)); cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -possessed, true));
} }
@@ -55,6 +55,7 @@ import client.SkillFactory;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.ItemFactory; import client.inventory.ItemFactory;
import client.inventory.MaplePet; import client.inventory.MaplePet;
import constants.ItemConstants;
/** /**
* *
@@ -301,7 +302,7 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
} }
public int itemQuantity(int itemid) { public int itemQuantity(int itemid) {
return getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemid)).countById(itemid); return getPlayer().getInventory(ItemConstants.getInventoryType(itemid)).countById(itemid);
} }
public void displayGuildRanks() { public void displayGuildRanks() {
@@ -26,6 +26,7 @@ import client.MapleClient;
import client.inventory.Equip; import client.inventory.Equip;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import java.awt.Point; import java.awt.Point;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
@@ -130,6 +131,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
dropPos.x -= (12 * numItems); dropPos.x -= (12 * numItems);
if(!delayed) { if(!delayed) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (ReactorDropEntry d : items) { for (ReactorDropEntry d : items) {
if (d.itemId == 0) { if (d.itemId == 0) {
int range = maxMeso - minMeso; int range = maxMeso - minMeso;
@@ -138,8 +141,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
reactor.getMap().spawnMesoDrop(mesoDrop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), reactor, client.getPlayer(), false, (byte) 2); reactor.getMap().spawnMesoDrop(mesoDrop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), reactor, client.getPlayer(), false, (byte) 2);
} else { } else {
Item drop; Item drop;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) { if (ItemConstants.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) {
drop = new Item(d.itemId, (short) 0, (short) 1); drop = new Item(d.itemId, (short) 0, (short) 1);
} else { } else {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
@@ -171,10 +174,11 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
r.getMap().spawnMesoDrop(mesoDrop, r.getMap().calcDropPos(dropPos, r.getPosition()), r, chr, false, (byte) 2); r.getMap().spawnMesoDrop(mesoDrop, r.getMap().calcDropPos(dropPos, r.getPosition()), r, chr, false, (byte) 2);
} else { } else {
Item drop; Item drop;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) { if (ItemConstants.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) {
drop = new Item(d.itemId, (short) 0, (short) 1); drop = new Item(d.itemId, (short) 0, (short) 1);
} else { } else {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
} }
+5 -6
View File
@@ -89,7 +89,6 @@ public class CashShop {
} }
public Item toItem() { public Item toItem() {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item item; Item item;
int petid = -1; int petid = -1;
@@ -97,8 +96,8 @@ public class CashShop {
if (ItemConstants.isPet(itemId)) if (ItemConstants.isPet(itemId))
petid = MaplePet.createPet(itemId); petid = MaplePet.createPet(itemId);
if (ii.getInventoryType(itemId).equals(MapleInventoryType.EQUIP)) { if (ItemConstants.getInventoryType(itemId).equals(MapleInventoryType.EQUIP)) {
item = ii.getEquipById(itemId); item = MapleItemInformationProvider.getInstance().getEquipById(itemId);
} else { } else {
item = new Item(itemId, (byte) 0, count, petid); item = new Item(itemId, (byte) 0, count, petid);
} }
@@ -353,7 +352,7 @@ public class CashShop {
boolean isRing = false; boolean isRing = false;
Equip equip = null; Equip equip = null;
for (Item item : getInventory()) { for (Item item : getInventory()) {
if (item.getType() == 1) { if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
equip = (Equip) item; equip = (Equip) item;
isRing = equip.getRingId() > -1; isRing = equip.getRingId() > -1;
} }
@@ -440,7 +439,7 @@ public class CashShop {
Item item = cItem.toItem(); Item item = cItem.toItem();
Equip equip = null; Equip equip = null;
item.setGiftFrom(rs.getString("from")); item.setGiftFrom(rs.getString("from"));
if (item.getType() == MapleInventoryType.EQUIP.getType()) { if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
equip = (Equip) item; equip = (Equip) item;
equip.setRingId(rs.getInt("ringid")); equip.setRingId(rs.getInt("ringid"));
gifts.add(new Pair<Item, String>(equip, rs.getString("message"))); gifts.add(new Pair<Item, String>(equip, rs.getString("message")));
@@ -491,7 +490,7 @@ public class CashShop {
List<Item> inv = getInventory(); List<Item> inv = getInventory();
for (Item item : inv) { for (Item item : inv) {
itemsWithType.add(new Pair<>(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId()))); itemsWithType.add(new Pair<>(item, item.getInventoryType()));
} }
factory.saveItems(itemsWithType, accountId, con); factory.saveItems(itemsWithType, accountId, con);
+20 -5
View File
@@ -22,6 +22,7 @@
package server; package server;
import client.MapleBuffStat; import client.MapleBuffStat;
import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.Equip; import client.inventory.Equip;
import client.inventory.Item; import client.inventory.Item;
@@ -65,7 +66,7 @@ public class MapleInventoryManipulator {
public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid, byte flag, long expiration) { public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid, byte flag, long expiration) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemId); MapleInventoryType type = ItemConstants.getInventoryType(itemId);
if (!type.equals(MapleInventoryType.EQUIP)) { if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemId); short slotMax = ii.getSlotMax(c, itemId);
List<Item> existing = c.getPlayer().getInventory(type).listById(itemId); List<Item> existing = c.getPlayer().getInventory(type).listById(itemId);
@@ -155,8 +156,8 @@ public class MapleInventoryManipulator {
public static boolean addFromDrop(MapleClient c, Item item, boolean show, int petId) { public static boolean addFromDrop(MapleClient c, Item item, boolean show, int petId) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(item.getItemId()); MapleInventoryType type = item.getInventoryType();
if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().getItemQuantity(item.getItemId(), true) > 0) { if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().haveItemWithId(item.getItemId(), true)) {
c.announce(MaplePacketCreator.getInventoryFull()); c.announce(MaplePacketCreator.getInventoryFull());
c.announce(MaplePacketCreator.showItemUnavailable()); c.announce(MaplePacketCreator.showItemUnavailable());
return false; return false;
@@ -230,9 +231,18 @@ public class MapleInventoryManipulator {
return true; return true;
} }
private static boolean haveItemWithId(MapleInventory inv, int itemid) {
return inv.findById(itemid) != null;
}
public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) { public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemid); MapleInventoryType type = ItemConstants.getInventoryType(itemid);
if(ii.isPickupRestricted(itemid) && haveItemWithId(c.getPlayer().getInventory(type), itemid)) {
return false;
}
if (!type.equals(MapleInventoryType.EQUIP)) { if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid); short slotMax = ii.getSlotMax(c, itemid);
List<Item> existing = c.getPlayer().getInventory(type).listById(itemid); List<Item> existing = c.getPlayer().getInventory(type).listById(itemid);
@@ -273,7 +283,12 @@ public class MapleInventoryManipulator {
int returnValue; int returnValue;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemid); MapleInventoryType type = ItemConstants.getInventoryType(itemid);
if(ii.isPickupRestricted(itemid) && haveItemWithId(c.getPlayer().getInventory(type), itemid)) {
return 0;
}
if (!type.equals(MapleInventoryType.EQUIP)) { if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid); short slotMax = ii.getSlotMax(c, itemid);
if (!ItemConstants.isRechargable(itemid)) { if (!ItemConstants.isRechargable(itemid)) {
+4 -7
View File
@@ -138,12 +138,7 @@ public class MapleItemInformationProvider {
return instance; return instance;
} }
public MapleInventoryType getInventoryType(int itemId) { // public MapleInventoryType getInventoryType(int itemId) {
final byte type = (byte) (itemId / 1000000);
if (type < 1 || type > 5) {
return MapleInventoryType.UNDEFINED;
}
return MapleInventoryType.getByType(type);
// if (inventoryTypeCache.containsKey(itemId)) { // if (inventoryTypeCache.containsKey(itemId)) {
// return inventoryTypeCache.get(itemId); // return inventoryTypeCache.get(itemId);
// } // }
@@ -176,7 +171,7 @@ public class MapleItemInformationProvider {
// ret = MapleInventoryType.UNDEFINED; // ret = MapleInventoryType.UNDEFINED;
// inventoryTypeCache.put(itemId, ret); // inventoryTypeCache.put(itemId, ret);
// return ret; // return ret;
} // }
public List<Pair<Integer, String>> getAllItems() { public List<Pair<Integer, String>> getAllItems() {
if (!itemNameCache.isEmpty()) { if (!itemNameCache.isEmpty()) {
@@ -879,6 +874,8 @@ public class MapleItemInformationProvider {
prop = 30.0; prop = 30.0;
} else if (vegaItemId == 5610001) { } else if (vegaItemId == 5610001) {
prop = 90.0; prop = 90.0;
} else if (vegaItemId == 2049100) {
prop = 100.0;
} }
if(assertGM || rollSuccessChance(prop)) { if(assertGM || rollSuccessChance(prop)) {
+1 -1
View File
@@ -743,7 +743,7 @@ public class MapleStatEffect {
applyto.getClient().announce(MaplePacketCreator.enableActions()); applyto.getClient().announce(MaplePacketCreator.enableActions());
return false; return false;
} }
MapleInventoryManipulator.removeById(applyto.getClient(), MapleItemInformationProvider.getInstance().getInventoryType(itemCon), itemCon, itemConNo, false, true); MapleInventoryManipulator.removeById(applyto.getClient(), ItemConstants.getInventoryType(itemCon), itemCon, itemConNo, false, true);
} }
} }
List<Pair<MapleStat, Integer>> hpmpupdate = new ArrayList<>(2); List<Pair<MapleStat, Integer>> hpmpupdate = new ArrayList<>(2);
+6 -9
View File
@@ -138,7 +138,7 @@ public class MapleStorage {
List<Item> list = getItems(); List<Item> list = getItems();
for (Item item : list) { for (Item item : list) {
itemsWithType.add(new Pair<>(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId()))); itemsWithType.add(new Pair<>(item, item.getInventoryType()));
} }
ItemFactory.STORAGE.saveItems(itemsWithType, id, con); ItemFactory.STORAGE.saveItems(itemsWithType, id, con);
@@ -163,7 +163,7 @@ public class MapleStorage {
try { try {
ret = items.remove(slot); ret = items.remove(slot);
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(ret.getItemId()); MapleInventoryType type = ret.getInventoryType();
typeItems.put(type, new ArrayList<>(filterItems(type))); typeItems.put(type, new ArrayList<>(filterItems(type)));
} finally { } finally {
lock.unlock(); lock.unlock();
@@ -177,7 +177,7 @@ public class MapleStorage {
try { try {
items.add(item); items.add(item);
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId()); MapleInventoryType type = item.getInventoryType();
typeItems.put(type, new ArrayList<>(filterItems(type))); typeItems.put(type, new ArrayList<>(filterItems(type)));
} finally { } finally {
lock.unlock(); lock.unlock();
@@ -196,10 +196,9 @@ public class MapleStorage {
private List<Item> filterItems(MapleInventoryType type) { private List<Item> filterItems(MapleInventoryType type) {
List<Item> storageItems = getItems(); List<Item> storageItems = getItems();
List<Item> ret = new LinkedList<>(); List<Item> ret = new LinkedList<>();
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (Item item : storageItems) { for (Item item : storageItems) {
if (ii.getInventoryType(item.getItemId()) == type) { if (item.getInventoryType() == type) {
ret.add(item); ret.add(item);
} }
} }
@@ -232,16 +231,14 @@ public class MapleStorage {
} }
*/ */
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
lock.lock(); lock.lock();
try { try {
Collections.sort(items, new Comparator<Item>() { Collections.sort(items, new Comparator<Item>() {
@Override @Override
public int compare(Item o1, Item o2) { public int compare(Item o1, Item o2) {
if (ii.getInventoryType(o1.getItemId()).getType() < ii.getInventoryType(o2.getItemId()).getType()) { if (o1.getInventoryType().getType() < o2.getInventoryType().getType()) {
return -1; return -1;
} else if (ii.getInventoryType(o1.getItemId()) == ii.getInventoryType(o2.getItemId())) { } else if (o1.getInventoryType() == o2.getInventoryType()) {
return 0; return 0;
} }
return 1; return 1;
+1 -1
View File
@@ -194,7 +194,7 @@ public class MapleTrade {
private boolean fitsInInventory() { private boolean fitsInInventory() {
List<Pair<Item, MapleInventoryType>> tradeItems = new LinkedList<>(); List<Pair<Item, MapleInventoryType>> tradeItems = new LinkedList<>();
for (Item item : exchangeItems) { for (Item item : exchangeItems) {
tradeItems.add(new Pair(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId()))); tradeItems.add(new Pair(item, item.getInventoryType()));
} }
return MapleInventory.checkSpotsAndOwnership(chr, tradeItems); return MapleInventory.checkSpotsAndOwnership(chr, tradeItems);
+23 -52
View File
@@ -25,6 +25,7 @@ import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.ItemFactory; import client.inventory.ItemFactory;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import com.mysql.jdbc.Statement; import com.mysql.jdbc.Statement;
import constants.ItemConstants; import constants.ItemConstants;
@@ -163,6 +164,10 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
} }
} }
private static boolean canBuy(MapleClient c, Item newItem) {
return MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && MapleInventoryManipulator.addFromDrop(c, newItem, false);
}
public void buy(MapleClient c, int item, short quantity) { public void buy(MapleClient c, int item, short quantity) {
synchronized (items) { synchronized (items) {
MaplePlayerShopItem pItem = items.get(item); MaplePlayerShopItem pItem = items.get(item);
@@ -175,7 +180,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
if (quantity < 1 || pItem.getBundles() < 1 || !pItem.isExist() || pItem.getBundles() < quantity) { if (quantity < 1 || pItem.getBundles() < 1 || !pItem.isExist() || pItem.getBundles() < quantity) {
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} else if (newItem.getType() == 1 && newItem.getQuantity() > 1) { } else if (newItem.getInventoryType().equals(MapleInventoryType.EQUIP) && newItem.getQuantity() > 1) {
c.announce(MaplePacketCreator.enableActions()); c.announce(MaplePacketCreator.enableActions());
return; return;
} else if (!pItem.isExist()) { } else if (!pItem.isExist()) {
@@ -185,8 +190,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE); int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE);
if (c.getPlayer().getMeso() >= price) { if (c.getPlayer().getMeso() >= price) {
if (MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner())) { if (canBuy(c, newItem)) {
MapleInventoryManipulator.addFromDrop(c, newItem, false);
c.getPlayer().gainMeso(-price, false); c.getPlayer().gainMeso(-price, false);
announceItemSold(newItem, price); // idea thanks to vcoc announceItemSold(newItem, price); // idea thanks to vcoc
@@ -216,7 +220,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
} }
} }
} else { } else {
c.getPlayer().dropMessage(1, "Your inventory is full. Please clear a slot before buying this item."); c.getPlayer().dropMessage(1, "Your inventory is full. Please clean a slot before buying this item.");
} }
} else { } else {
c.getPlayer().dropMessage(1, "You do not have enough mesos."); c.getPlayer().dropMessage(1, "You do not have enough mesos.");
@@ -231,11 +235,10 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
private void announceItemSold(Item item, int mesos) { private void announceItemSold(Item item, int mesos) {
String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : ""; String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : "";
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleCharacter player = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(ownerId); MapleCharacter player = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(ownerId);
if(player != null && player.isLoggedin() && !player.isAwayFromWorld()) { if(player != null && player.isLoggedin() && !player.isAwayFromWorld()) {
player.dropMessage(6, "[HIRED MERCHANT] Item '" + ii.getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos."); player.dropMessage(6, "[HIRED MERCHANT] Item '" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
} }
} }
@@ -296,10 +299,12 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
List<MaplePlayerShopItem> copyItems = getItems(); List<MaplePlayerShopItem> copyItems = getItems();
if (check(c.getPlayer(), copyItems) && !timeout) { if (check(c.getPlayer(), copyItems) && !timeout) {
for (MaplePlayerShopItem mpsi : copyItems) { for (MaplePlayerShopItem mpsi : copyItems) {
if (mpsi.isExist() && (mpsi.getItem().getType() == MapleInventoryType.EQUIP.getType())) { if(mpsi.isExist()) {
MapleInventoryManipulator.addFromDrop(c, mpsi.getItem(), false); if (mpsi.getItem().getInventoryType().equals(MapleInventoryType.EQUIP)) {
} else if (mpsi.isExist()) { MapleInventoryManipulator.addFromDrop(c, mpsi.getItem(), false);
MapleInventoryManipulator.addById(c, mpsi.getItem().getItemId(), (short) (mpsi.getBundles() * mpsi.getItem().getQuantity()), null, -1, mpsi.getItem().getFlag(), mpsi.getItem().getExpiration()); } else {
MapleInventoryManipulator.addById(c, mpsi.getItem().getItemId(), (short) (mpsi.getBundles() * mpsi.getItem().getQuantity()), null, -1, mpsi.getItem().getFlag(), mpsi.getItem().getExpiration());
}
} }
} }
@@ -465,7 +470,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
newItem.setQuantity((short) (pItems.getItem().getQuantity())); newItem.setQuantity((short) (pItems.getItem().getQuantity()));
} }
if (newBundle > 0) { if (newBundle > 0) {
itemsWithType.add(new Pair<>(newItem, MapleInventoryType.getByType(newItem.getType()))); itemsWithType.add(new Pair<>(newItem, newItem.getInventoryType()));
bundles.add(newBundle); bundles.add(newBundle);
} }
} }
@@ -476,49 +481,15 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
} }
private static boolean check(MapleCharacter chr, List<MaplePlayerShopItem> items) { private static boolean check(MapleCharacter chr, List<MaplePlayerShopItem> items) {
byte eq = 0, use = 0, setup = 0, etc = 0, cash = 0; List<Pair<Item, MapleInventoryType>> li = new ArrayList<>();
List<MapleInventoryType> li = new LinkedList<>();
for (MaplePlayerShopItem item : items) { for (MaplePlayerShopItem item : items) {
final MapleInventoryType invtype = MapleItemInformationProvider.getInstance().getInventoryType(item.getItem().getItemId()); Item it = item.getItem().copy();
if (!li.contains(invtype)) { it.setQuantity((short)(it.getQuantity() * item.getBundles()));
li.add(invtype);
} li.add(new Pair<>(it, it.getInventoryType()));
if (invtype == MapleInventoryType.EQUIP) {
eq++;
} else if (invtype == MapleInventoryType.USE) {
use++;
} else if (invtype == MapleInventoryType.SETUP) {
setup++;
} else if (invtype == MapleInventoryType.ETC) {
etc++;
} else if (invtype == MapleInventoryType.CASH) {
cash++;
}
} }
for (MapleInventoryType mit : li) {
if (mit == MapleInventoryType.EQUIP) { return MapleInventory.checkSpotsAndOwnership(chr, li);
if (chr.getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() <= eq) {
return false;
}
} else if (mit == MapleInventoryType.USE) {
if (chr.getInventory(MapleInventoryType.USE).getNumFreeSlot() <= use) {
return false;
}
} else if (mit == MapleInventoryType.SETUP) {
if (chr.getInventory(MapleInventoryType.SETUP).getNumFreeSlot() <= setup) {
return false;
}
} else if (mit == MapleInventoryType.ETC) {
if (chr.getInventory(MapleInventoryType.ETC).getNumFreeSlot() <= etc) {
return false;
}
} else if (mit == MapleInventoryType.CASH) {
if (chr.getInventory(MapleInventoryType.CASH).getNumFreeSlot() <= cash) {
return false;
}
}
}
return true;
} }
public int getChannel() { public int getChannel() {
+65 -22
View File
@@ -560,27 +560,28 @@ public class MapleMap {
return new Pair(getRoundedCoordinate(angle), Integer.valueOf((int)distn)); return new Pair(getRoundedCoordinate(angle), Integer.valueOf((int)distn));
} }
private void dropFromMonster(final MapleCharacter chr, final MapleMonster mob) { private static void sortDropEntries(List<MonsterDropEntry> from, List<MonsterDropEntry> item, List<MonsterDropEntry> quest) {
if (mob.dropsDisabled() || !dropsOn) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
return;
for(MonsterDropEntry mde : from) {
if(mde.itemId == 0 || !ii.isQuestItem(mde.itemId)) {
item.add(mde);
} else {
quest.add(mde);
}
} }
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); }
final byte droptype = (byte) (mob.getStats().isExplosiveReward() ? 3 : mob.getStats().isFfaLoot() ? 2 : chr.getParty() != null ? 1 : 0);
final int mobpos = mob.getPosition().x; private byte dropItemsFromMonsterOnMap(List<MonsterDropEntry> dropEntry, Point pos, byte d, int chRate, byte droptype, int mobpos, MapleCharacter chr, MapleMonster mob) {
int chRate = chr.getDropRate(); if(dropEntry.isEmpty()) {
Item idrop; return d;
byte d = 1;
Point pos = new Point(0, mob.getPosition().y);
MonsterStatusEffect stati = mob.getStati(MonsterStatus.SHOWDOWN);
if (stati != null) {
chRate *= (stati.getStati().get(MonsterStatus.SHOWDOWN).doubleValue() / 100.0 + 1.0);
} }
final MapleMonsterInformationProvider mi = MapleMonsterInformationProvider.getInstance();
final List<MonsterDropEntry> dropEntry = new ArrayList<>(mi.retrieveDrop(mob.getId()));
Collections.shuffle(dropEntry); Collections.shuffle(dropEntry);
Item idrop;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (final MonsterDropEntry de : dropEntry) { for (final MonsterDropEntry de : dropEntry) {
if (Randomizer.nextInt(999999) < de.chance * chRate) { if (Randomizer.nextInt(999999) < de.chance * chRate) {
if (droptype == 3) { if (droptype == 3) {
@@ -611,8 +612,16 @@ public class MapleMap {
d++; d++;
} }
} }
final List<MonsterGlobalDropEntry> globalEntry = mi.getGlobalDrop();
// Global Drops return d;
}
private byte dropGlobalItemsFromMonsterOnMap(List<MonsterGlobalDropEntry> globalEntry, Point pos, byte d, byte droptype, int mobpos, MapleCharacter chr, MapleMonster mob) {
Collections.shuffle(globalEntry);
Item idrop;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (final MonsterGlobalDropEntry de : globalEntry) { for (final MonsterGlobalDropEntry de : globalEntry) {
if (Randomizer.nextInt(999999) < de.chance) { if (Randomizer.nextInt(999999) < de.chance) {
if (droptype == 3) { if (droptype == 3) {
@@ -631,6 +640,40 @@ public class MapleMap {
} }
} }
} }
return d;
}
private void dropFromMonster(final MapleCharacter chr, final MapleMonster mob) {
if (mob.dropsDisabled() || !dropsOn) {
return;
}
final byte droptype = (byte) (mob.getStats().isExplosiveReward() ? 3 : mob.getStats().isFfaLoot() ? 2 : chr.getParty() != null ? 1 : 0);
final int mobpos = mob.getPosition().x;
int chRate = chr.getDropRate();
byte d = 1;
Point pos = new Point(0, mob.getPosition().y);
MonsterStatusEffect stati = mob.getStati(MonsterStatus.SHOWDOWN);
if (stati != null) {
chRate *= (stati.getStati().get(MonsterStatus.SHOWDOWN).doubleValue() / 100.0 + 1.0);
}
final MapleMonsterInformationProvider mi = MapleMonsterInformationProvider.getInstance();
final List<MonsterDropEntry> dropEntry = new ArrayList<>();
final List<MonsterDropEntry> questEntry = new ArrayList<>();
sortDropEntries(mi.retrieveDrop(mob.getId()), dropEntry, questEntry);
// Normal Drops
d = dropItemsFromMonsterOnMap(dropEntry, pos, d, chRate, droptype, mobpos, chr, mob);
// Global Drops
final List<MonsterGlobalDropEntry> globalEntry = mi.getGlobalDrop();
d = dropGlobalItemsFromMonsterOnMap(globalEntry, pos, d, droptype, mobpos, chr, mob);
// Quest Drops
dropItemsFromMonsterOnMap(questEntry, pos, d, chRate, droptype, mobpos, chr, mob);
} }
public void dropFromReactor(final MapleCharacter chr, final MapleReactor reactor, Item drop, Point dropPos, short questid) { public void dropFromReactor(final MapleCharacter chr, final MapleReactor reactor, Item drop, Point dropPos, short questid) {
@@ -1852,7 +1895,7 @@ public class MapleMap {
final Item drop; final Item drop;
int randomedId = list.get(i); int randomedId = list.get(i);
if (ii.getInventoryType(randomedId) != MapleInventoryType.EQUIP) { if (ItemConstants.getInventoryType(randomedId) != MapleInventoryType.EQUIP) {
drop = new Item(randomedId, (short) 0, (short) (rnd.nextInt(copies) + minCopies)); drop = new Item(randomedId, (short) 0, (short) (rnd.nextInt(copies) + minCopies));
} else { } else {
drop = ii.randomizeStats((Equip) ii.getEquipById(randomedId)); drop = ii.randomizeStats((Equip) ii.getEquipById(randomedId));
@@ -2567,7 +2610,7 @@ public class MapleMap {
} }
public void setMapPointBoundings(int px, int py, int h, int w) { public void setMapPointBoundings(int px, int py, int h, int w) {
mapArea.setBounds(px + 7, py, w - 14, h); mapArea.setBounds(px + 45, py, w - 90, h);
} }
public void setMapLineBoundings(int vrTop, int vrBottom, int vrLeft, int vrRight) { public void setMapLineBoundings(int vrTop, int vrBottom, int vrLeft, int vrRight) {
+3
View File
@@ -144,6 +144,9 @@ public class MapleMapFactory {
bounds[3] = MapleDataTool.getInt(minimapData.getChildByPath("width")); bounds[3] = MapleDataTool.getInt(minimapData.getChildByPath("width"));
map.setMapPointBoundings(bounds[0], bounds[1], bounds[2], bounds[3]); map.setMapPointBoundings(bounds[0], bounds[1], bounds[2], bounds[3]);
} else {
int dist = (1 << 18);
map.setMapPointBoundings(-dist / 2, -dist / 2, dist, dist);
} }
} else { } else {
bounds[2] = MapleDataTool.getInt(infoData.getChildByPath("VRLeft")); bounds[2] = MapleDataTool.getInt(infoData.getChildByPath("VRLeft"));
+8 -4
View File
@@ -24,6 +24,7 @@ package server.maps;
import client.MapleCharacter; import client.MapleCharacter;
import client.MapleClient; import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
@@ -187,6 +188,10 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
} }
} }
private static boolean canBuy(MapleClient c, Item newItem) {
return MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && MapleInventoryManipulator.addFromDrop(c, newItem, false);
}
/** /**
* no warnings for now o.o * no warnings for now o.o
* @param c * @param c
@@ -201,14 +206,14 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
newItem.setQuantity(newItem.getQuantity()); newItem.setQuantity(newItem.getQuantity());
if (quantity < 1 || pItem.getBundles() < 1 || newItem.getQuantity() > pItem.getBundles() || !pItem.isExist()) { if (quantity < 1 || pItem.getBundles() < 1 || newItem.getQuantity() > pItem.getBundles() || !pItem.isExist()) {
return; return;
} else if (newItem.getType() == 1 && newItem.getQuantity() > 1) { } else if (newItem.getInventoryType().equals(MapleInventoryType.EQUIP) && newItem.getQuantity() > 1) {
return; return;
} }
synchronized (c.getPlayer()) { synchronized (c.getPlayer()) {
int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE); int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE);
if (c.getPlayer().getMeso() >= price) { if (c.getPlayer().getMeso() >= price) {
if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) { if (canBuy(c, newItem)) {
c.getPlayer().gainMeso(-price, false); c.getPlayer().gainMeso(-price, false);
announceItemSold(newItem, price); // idea thanks to vcoc announceItemSold(newItem, price); // idea thanks to vcoc
@@ -235,9 +240,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
private void announceItemSold(Item item, int mesos) { private void announceItemSold(Item item, int mesos) {
String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : ""; String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : "";
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
owner.dropMessage(6, "[PLAYER SHOP] Item '" + ii.getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos."); owner.dropMessage(6, "[PLAYER SHOP] Item '" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
} }
public void broadcastToVisitors(final byte[] packet) { public void broadcastToVisitors(final byte[] packet) {
+3 -6
View File
@@ -26,6 +26,7 @@ import client.MapleClient;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventory; import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@@ -34,7 +35,6 @@ import java.util.List;
import provider.MapleData; import provider.MapleData;
import provider.MapleDataTool; import provider.MapleDataTool;
import server.MapleInventoryManipulator; import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.quest.MapleQuest; import server.quest.MapleQuest;
import server.quest.MapleQuestActionType; import server.quest.MapleQuestActionType;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
@@ -92,7 +92,6 @@ public class ItemAction extends MapleQuestAction {
List<Pair<Integer, Integer>> takeItem = new LinkedList<>(); List<Pair<Integer, Integer>> takeItem = new LinkedList<>();
List<Pair<Integer, Integer>> giveItem = new LinkedList<>(); List<Pair<Integer, Integer>> giveItem = new LinkedList<>();
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
int props = 0, rndProps = 0, accProps = 0; int props = 0, rndProps = 0, accProps = 0;
for(ItemData item : items) { for(ItemData item : items) {
if(item.getProp() != null && item.getProp() != -1 && canGetItem(item, chr)) { if(item.getProp() != null && item.getProp() != -1 && canGetItem(item, chr)) {
@@ -133,7 +132,7 @@ public class ItemAction extends MapleQuestAction {
// must take all needed items before giving others // must take all needed items before giving others
for(Pair<Integer, Integer> iEntry: takeItem) { for(Pair<Integer, Integer> iEntry: takeItem) {
MapleInventoryType type = ii.getInventoryType(iEntry.getLeft()); MapleInventoryType type = ItemConstants.getInventoryType(iEntry.getLeft());
int quantity = iEntry.getRight() * -1; // Invert int quantity = iEntry.getRight() * -1; // Invert
if(type.equals(MapleInventoryType.EQUIP)) { if(type.equals(MapleInventoryType.EQUIP)) {
if(chr.getInventory(type).countById(iEntry.getLeft()) < quantity) { if(chr.getInventory(type).countById(iEntry.getLeft()) < quantity) {
@@ -157,8 +156,6 @@ public class ItemAction extends MapleQuestAction {
@Override @Override
public boolean check(MapleCharacter chr, Integer extSelection) { public boolean check(MapleCharacter chr, Integer extSelection) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
List<Pair<Item, MapleInventoryType>> gainList = new LinkedList<>(); List<Pair<Item, MapleInventoryType>> gainList = new LinkedList<>();
List<Pair<Item, MapleInventoryType>> selectList = new LinkedList<>(); List<Pair<Item, MapleInventoryType>> selectList = new LinkedList<>();
List<Pair<Item, MapleInventoryType>> randomList = new LinkedList<>(); List<Pair<Item, MapleInventoryType>> randomList = new LinkedList<>();
@@ -171,7 +168,7 @@ public class ItemAction extends MapleQuestAction {
continue; continue;
} }
MapleInventoryType type = ii.getInventoryType(item.getId()); MapleInventoryType type = ItemConstants.getInventoryType(item.getId());
if(item.getProp() != null) { if(item.getProp() != null) {
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount()); Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
@@ -32,6 +32,7 @@ import server.quest.MapleQuestRequirementType;
import client.MapleCharacter; import client.MapleCharacter;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ItemConstants;
/** /**
* *
@@ -64,7 +65,7 @@ public class ItemRequirement extends MapleQuestRequirement {
int countNeeded = items.get(itemId); int countNeeded = items.get(itemId);
int count = 0; int count = 0;
MapleInventoryType iType = ii.getInventoryType(itemId); MapleInventoryType iType = ItemConstants.getInventoryType(itemId);
if (iType.equals(MapleInventoryType.UNDEFINED)) { if (iType.equals(MapleInventoryType.UNDEFINED)) {
return false; return false;
+3 -1
View File
@@ -22,7 +22,9 @@ public class DatabaseConnection {
if(ds != null) { if(ds != null) {
try { try {
return ds.getConnection(); return ds.getConnection();
} catch (SQLException sqle) {} } catch (SQLException sqle) {
sqle.printStackTrace();
}
} }
int denies = 0; int denies = 0;
+14 -4
View File
@@ -361,7 +361,8 @@ public class MaplePacketCreator {
boolean isRing = false; boolean isRing = false;
Equip equip = null; Equip equip = null;
short pos = item.getPosition(); short pos = item.getPosition();
if (item.getType() == 1) { byte itemType = item.getItemType();
if (itemType == 1) {
equip = (Equip) item; equip = (Equip) item;
isRing = equip.getRingId() > -1; isRing = equip.getRingId() > -1;
} }
@@ -375,7 +376,7 @@ public class MaplePacketCreator {
mplew.write(pos); mplew.write(pos);
} }
} }
mplew.write(item.getType()); mplew.write(itemType);
mplew.writeInt(item.getItemId()); mplew.writeInt(item.getItemId());
mplew.writeBool(isCash); mplew.writeBool(isCash);
if (isCash) { if (isCash) {
@@ -5081,7 +5082,7 @@ public class MaplePacketCreator {
} }
public static byte[] owlOfMinerva(MapleClient c, int itemid, List<Pair<MaplePlayerShopItem, AbstractMapleMapObject>> hmsAvailable) { public static byte[] owlOfMinerva(MapleClient c, int itemid, List<Pair<MaplePlayerShopItem, AbstractMapleMapObject>> hmsAvailable) {
byte itemType = MapleItemInformationProvider.getInstance().getInventoryType(itemid).getType(); byte itemType = ItemConstants.getInventoryType(itemid).getType();
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.SHOP_SCANNER_RESULT.getValue()); // header. mplew.writeShort(SendOpcode.SHOP_SCANNER_RESULT.getValue()); // header.
@@ -6425,6 +6426,15 @@ public class MaplePacketCreator {
return mplew.getPacket(); return mplew.getPacket();
} }
public static byte[] sendDueyNotification(boolean quickDelivery) {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.PARCEL.getValue());
mplew.write(0x1B);
mplew.writeBool(quickDelivery); // 0 : package received, 1 : quick delivery package
return mplew.getPacket();
}
public static byte[] sendDueyMSG(byte operation) { public static byte[] sendDueyMSG(byte operation) {
return sendDuey(operation, null); return sendDuey(operation, null);
} }
@@ -6865,7 +6875,7 @@ public class MaplePacketCreator {
boolean isGift = giftMessage != null; boolean isGift = giftMessage != null;
boolean isRing = false; boolean isRing = false;
Equip equip = null; Equip equip = null;
if (item.getType() == 1) { if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
equip = (Equip) item; equip = (Equip) item;
isRing = equip.getRingId() > -1; isRing = equip.getRingId() > -1;
} }
+1 -1
View File
@@ -5997,7 +5997,7 @@
<string name="mapName" value="Memory Lane4"/> <string name="mapName" value="Memory Lane4"/>
</imgdir> </imgdir>
<imgdir name="270010410"> <imgdir name="270010410">
<string name="streetName" value="Memory Keeper"/> <string name="streetName" value="Time Lane"/>
<string name="mapName" value="Resting Spot of Memory4"/> <string name="mapName" value="Resting Spot of Memory4"/>
</imgdir> </imgdir>
<imgdir name="270010500"> <imgdir name="270010500">