Item Raise + Gachapon Rework + Minigames & M. Magnet & M. Door patch

Fixed a glitch in inventory that would happen when trying to put items into storage.
Added "Item Raise" functionality.
Adjusted Party Search. Token sessions no longer expires due to no players found, rather are sent into a brief "inactivity" period.
Fixed Fredrick stored items not being properly erased after a character deletion.
Fixed skillbooks in stacked quantities not being useable.
New tool: MapleGachaponItemidRetriever. This tool parses the gachapon descriptor file (holding several item names, for several gachapons) and generates files for each defined gachapon with itemids of the loots.
Revised Mushroom Empire transition portals that interacts with scripted items (items now are useable through inventory, no longer being automatically removed from inventory upon crossing portals).
Fixed script "secretroom" always requiring a new key (quest reward) to access the inner rooms, which would make the room unreachable.
Reworked gachapons loots throughout the game. New loots are supposed to represent an old-school MapleSEA-like escalation of gachapon loots.
Fixed issues that would show up in the case null PIN/PIC gets checked.
Reworked skill Monster Magnet, no longer using "catch success rate" as a skill progression element. This fixes the skill disconnecting caster upon failure.
Revised Mystic Doors, no longer crashing players after the caster decides to cancel the buff moments after casting (during portal deploying effect in course).
Fixed portal access to Prime Minister crashing when trying to access on a party.
Refactored the several "startQuest/completeQuest" methods widely used in the many scripting managers. Methods that does essentially the same thing now are accessed from the superclass.
Fixed "rechargeable items" not being properly accounted for slots availability in inventory slot checking.
Fixed several issues of late within minigames.
Fixed minigames regarding double results when handling some rare scenarios.
Implemented "call for leave after finishing game" functionality of minigames.
This commit is contained in:
ronancpl
2019-06-01 21:12:40 -03:00
parent 89eca2995b
commit edb3920852
111 changed files with 6597 additions and 1943 deletions
+4
View File
@@ -55,6 +55,10 @@
/tools/MapleEventMethodFiller/dist/
/tools/MapleEventMethodFiller/nbproject/
/tools/MapleGachaponItemidRetriever/build/
/tools/MapleGachaponItemidRetriever/dist/
/tools/MapleGachaponItemidRetriever/nbproject/
/tools/MapleIdRetriever/build/
/tools/MapleIdRetriever/dist/
/tools/MapleIdRetriever/nbproject/
+14
View File
@@ -0,0 +1,14 @@
-- Thanks MikeyJacobs for prompting out minimum specs search for pre-BB MapleStory.
-- Minimum specs gathered thanks to AkatsukiLog, source: https://www.clubedohardware.com.br/forums/topic/1081421-maplestory-reinicia-meu-pc-direto-ajuda/
MapleStory pre-BB specs:
Minimum Requirement | Recommended Setting
OS: Windows XP or later | Windows XP or later
Processor: Pentium 4 or equivalent | Pentium Dual Core or equivalent
Memory: 1GB RAM | 1GB RAM
Hard Drive: At least 7GB of free space | At least 7GB of free space
Graphics: Video Card with 128MB or higher | GeForce FX5000 / ATI Radeon 9600 or higher (any video card with Shader model 2.0 or higher)
Sound: DirectX compatible sound card | DirectX compatible sound card
Network: Broadband internet connection | Broadband internet connection
+39 -3
View File
@@ -7,8 +7,8 @@
Abdula -> 9209000 *
CUSTOM NPC SHOPS (db_shopupdate.sql):
Asia -> 2082014 *
T-1337 -> 9201101 *
Asia -> 2082014
T-1337 -> 9201101
* : those won't get disabled when USE_ENABLE_CUSTOM_NPC_SCRIPTS = false
@@ -1871,4 +1871,40 @@ Implementado convite de Party Search sensível ao mapa onde os jogadores líder
Corrigido pets sendo indevidamente removido da DB ao realizar operações de retirada do inventário.
15 Maio 2019,
Revisado, via testes unitários, robustez dos registros/buscas de jogadores e fluidez do sistema de Party Search.
Revisado, via testes unitários, robustez dos registros/buscas de jogadores e fluidez do sistema de Party Search.
18 - 19 Maio 2019,
Corrigido glitch de inventário ao colocar itens no storage, problema que foi introduzido recentemente.
Finalmente aprendido como funciona a mecânica por trás dos nodos "infoEx/infoNumber" amplamente usado pelas quests! :D
Implementado sistema de "crescimento de itens" na fonte.
20 - 24 Maio 2019,
Ajustado "Party Search". Ao invés de expirar sessões de busca após N tentativas, líderes são colocados em espera por alguns minutos e podem voltar a buscar automaticamente mais tarde.
Corrigido itens armazenados no Fredrick não sendo deletados ao deletar personagem, acarretando em inconsistências com cid inexistente.
Corrigido livros de upgrade de skills stackados em quantidade maior que 1 não podendo ser utilizados.
Nova ferramenta: MapleGachaponItemidRetriever. A ferramenta lê o arquivo-receita com nomes de itens designados para os diversos gachapons do jogo e, analisando a tabela da DB "handbook" (descrito pela ferramenta MapleIdRetriever), gera diversos arquivos (um para cada gachapon) contendo os ids dos itens especificados (ou próprio nome do item, se não encontrado).
Revisado script itens da região de Mushroom Empire. Ao invés dos efeitos dos itens atuarem ao acessar portais, agora ao utilizar os próprios itens pelo inventário as regiões anteriormente inacessíveis se tornam exploráveis, seguindo a descrição dos mesmos.
Revisado transições em 2 mapas da região de Mushroom Empire (um deles agora podendo ser atravessado ao utilizar um ETC, como previsto). Ambas transições projetadas para atuar após uso dos itens designados.
Corrigido script "secretroom" sempre requerendo o ETC adquirido via questline, algo que tornava a área interna inacessível ao tentar fazê-la múltiplas vezes.
Reelaborado completamente sistema de loots dos gachapons. Nova lista de loots de cada cidade disponível tenta seguir conteúdos encontrados na Web, supostamente legítimos (vide fontes mencionadas no fonte).
Adicionado gachapons para El Nath e Ludibrium.
Corrigido presença de PIN e PIC nulos (modificado para strings vazias).
Corrigido skill "Monster Magnet" desconectando jogadores ao utilizá-la. Isso ocorria devido a um problema no lado-cliente ao "falhar" em capturar o mob. Nova skill foi remodelada para solucionar isso (além de MP e range, árvore de atributos varia por quantidade máxima de mobs).
26 Maio 2019,
Ajustado portal que acessa área do NPC Nein Spirit's Baby Dragon, para permitir acesso aos jogadores que concluem a rachadura do ovo, ao invés de somente após completar quest.
31 Maio 2019,
Implementado método/comando que permite visualizar itens que podem ser ganhos pelo gachapons.
Corrigido Mystic Doors crashando jogadores ao tentar cancelar o buff da skill excessivamente cedo.
Corrigido tentativa de acessar boss Prime Minister acarretando em exceções de nulos ao tentar entrar em party.
Corrigido evento de acesso ao boss Prime Minister não realizando disposes corretamente (assim que evento fica sem jogadores, após mudar de mapa, reviver, desconectar, etc).
Refatorado estruturas de "ignored" e "monitored" dos comandos, agora utilizando conjuntos e checagem de inteiros ao invés de nomes.
Refatorado referências aos métodos da família "startQuest" e "completeQuest", com funcionalidade repetida para diversas subclasses de AbstractPlayerInteraction.
01 Junho 2019,
Corrigido métodos de chegagem por espaço de inventários não avaliando corretamente quantidade de slots necessário para acomodar itens recarregáveis.
Corrigido minigames não retirando referências dos jogadores devidamente, problema que veio a ocorrer após atualizações recentes.
Implementado requisição de saída de minigames após fim de partida.
Corrigido possibilidade de minigames entregando mais de um resultado cada partida (jogadores podem decidir desistir em conjunto, somando pontos).
Corrigido negação de empate em minigame pelo outro jogador não permitindo o mesmo lançar um pedido de empate em sequência.
+1 -1
View File
@@ -1,4 +1,4 @@
Source: http://metropi.forumotion.net/t32-npc-scripting-guide-from-ragezone
Source: http://forum.ragezone.com/f428/add-npc-scripting-605225/
NPC Markups:
#b = Blue text.
+1 -1
View File
@@ -402,7 +402,7 @@
1402044 - Pumpkin Lantern - (no description)
1402045 - Tiger's Fang - (no description)
1402046 - Timeless Nibleheim - (no description)
1402048 - Raven's Wing - (no description)
1402048 - Raven's Wing - (no description)
1402049 - Night Raven's Wing - (no description)
1402050 - Dawn Raven's Wing - (no description)
1402051 - Dusk Raven's Wing - (no description)
+8 -8
View File
@@ -446,10 +446,10 @@
2040303 - Scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:30%, magic attack +5, INT+3, magic def. +1
2040304 - Dark scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:70%, magic attack +2, INT+1nIf failed, the item will be destroyed at a 50% rate.
2040305 - Dark scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:30%, magic attack +5, INT+3, magic def. +1nIf failed, the item will be destroyed at a 50% rate.
2040306 - Dark scroll for Earring for DEX - Improves DEX on ear accesrroy.\nSuccess rate: 70%. DEX + 2nIf failed, the item will be destroyed at a 50% rate.
2040306 - Dark scroll for Earring for DEX - Improves DEX on ear accessory.\nSuccess rate: 70%. DEX + 2nIf failed, the item will be destroyed at a 50% rate.
2040307 - Dark scroll for Earring for DEX - Improves DEX on ear accessorynSuccess rate: 30%. DEX + 3nIf failed, the item will be destroyed at a 50% rate.
2040308 - Dark Scroll for Earrings for DEF - Improves DEF on earringsnSuccess Rate 70%, weapon defense+1, magic defense+1nIf failed, the item will be destroyed at a 50% rate.
2040309 - Dark Scroll for Earrings for DEF - Improves DEF on earringsnSuccess Rate 30%, weapon defense+3, magic defense+3, accuracy+1nIf failed, the item will be destroyed at a 50% rate.
2040308 - Dark Scroll for Earring for DEF - Improves DEF on earringsnSuccess Rate 70%, weapon defense+1, magic defense+1nIf failed, the item will be destroyed at a 50% rate.
2040309 - Dark Scroll for Earring for DEF - Improves DEF on earringsnSuccess Rate 30%, weapon defense+3, magic defense+3, accuracy+1nIf failed, the item will be destroyed at a 50% rate.
2040310 - Scroll for Earring for DEF - Improves DEF on earrings.\nSuccess Rate 10%, weapon defense+3, magic defense+3, Accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell.
2040311 - Scroll for Earring for DEF - Improves DEF on earrings.\nSuccess Rate 60%, weapon defense+1, magic defense+1. The success rate of this scroll can be enhanced by Vega's Spell.
2040312 - Scroll for Earring for DEF - Improves DEF on earringsnSuccess Rate 100%, weapon defense+1
@@ -952,8 +952,8 @@
2070009 - Wooden Top - When thrown, it spins fast and flies at great speed. Once they are all used up, they need to be recharged.\nLevel Limit : 10, Attack + 19
2070010 - Icicle - Sharp icicles. Once they run out, they need to be recharged.rnLevel Limit : 10, Attack + 21
2070011 - Maple Throwing-Stars - Maple-shaped steel throwing-stars. Once they run out, they need to be recharged.rnLevel Limit : 10, Attack + 21
2070012 - Paper Fighter Plane - A paper plane that can be thrown at things. Once they run out, they need to be recharged. Attack +20
2070013 - Orange - A tasty orange that can be thrown at things. Attack + 20
2070012 - Paper Fighter Plane - A paper plane that can be thrown at things. Once they run out, they need to be recharged.\nAttack +20
2070013 - Orange - A tasty orange that can be thrown at things.\nAttack + 20
2070014 - Devil Rain Throwing Star - Throwing Star
2070015 - A Beginner Thief's Throwing Stars - These are steel throwing stars given by Dark Lord for Beginner Thieves. Unlike normal throwing stars, you can't recharge it. \nAttack + 15
2070016 - Crystal Ilbi Throwing-Stars - A throwing-star made of crystal. Once they run out, they need to be recharged. rnAttack + 29
@@ -1810,8 +1810,8 @@
2044812 - Scroll for Knuckles for ATT 15% - Improves ATT on Knuckles.\nSuccess Rate:15%, Weapon Att+5, STR+3, Weapon DEF+1
2044813 - Scroll for Knuckles for Accuracy 65% - Improves Accuracy on Knuckles.\nSuccess Rate:65%, Accuracy+3, DEX+2, Weapon Att+1
2044814 - Scroll for Knuckles for Accuracy 15% - Improves Accuracy on Knuckles.\nSuccess Rate:15%, Accuracy+5, DEX+3, Weapon Att+3
2044906 - Gun ATT Scroll 65% - Improves ATT on guns.\nSuccess Rate:65%, Weapon Att.+2, Accuracy+1
2044907 - Gun ATT Scroll 15% - Improves ATT on guns.\nSuccess Rate:15%, Weapon Att.+5, Accuracy+3, DEX+1
2044906 - Scroll for Gun for ATT 65% - Improves ATT on guns.\nSuccess Rate:65%, Weapon Att.+2, Accuracy+1
2044907 - Scroll for Gun for ATT 15% - Improves ATT on guns.\nSuccess Rate:15%, Weapon Att.+5, Accuracy+3, DEX+1
2049103 - Beach Sandals Scroll 100% - Used on limited-edition beach sandals, with the options of improving/decreasing the stats.\nSuccess rate:100%
2100073 - Mu Lung Dojo Summon Package3_Deo - Summon Deo
2100074 - Mu Lung Dojo Summon Package4_King Slime - Summon King Slime
@@ -2017,7 +2017,7 @@
2044015 - Scroll for Two-Handed Swords for ATT 10% - Improves ATT on Two-Handed Swords. nSuccess rate: 10%, Weapons ATT +5, STR +3, Weapons Defense +1
2049105 - [6th Anniversary] Dark Scroll for Gloves for ATT 70% - Improves ATT on Gloves. nSuccess rate: 70%, Weapons ATT +1nIf unsuccessful, item has a 50% chance of being destroyed.
2049106 - [6th Anniversary] Dark Scroll for Gloves for ATT 30% - Improves ATT on Gloves. nSucces rate: 30%, Weapons ATT +2nIf unsuccessful, item has an 80% chance of being destroyed.
2049107 - [6th Anniversary] Dark Scroll for Gloves for STR 70% [ - Improves STR on Gloves. nSuccess rate: 70%, Accuracy +2, STR +1nIf unsuccessful, item has a 50% chance of being destroyed.
2049107 - [6th Anniversary] Dark Scroll for Gloves for STR 70% - Improves STR on Gloves. nSuccess rate: 70%, Accuracy +2, STR +1nIf unsuccessful, item has a 50% chance of being destroyed.
2049108 - [6th Anniversary] Dark Scroll for Gloves for LUK 70% - Improves LUK on Gloves. nSuccess rate: 70%, Accuracy +2, LUK +1nIf unsuccessful, item has a 50% chance of being destroyed.
2049109 - [6th Anniversary] Dark Scroll for Gloves for INT 70% - Improves INT on Gloves. nSuccess rate: 70%, Accuracy +2, INT +1nIf unsuccessful, item has a 50% chance of being destroyed.
2049110 - [6th Anniversary] Dark Scroll for Gloves for DEX 70% - Improves DEX on Gloves. nSuccess rate: 70%, Accuracy +2, DEX +1nIf unsuccessful, item has a 50% chance of being destroyed.
+30 -14
View File
@@ -86,29 +86,38 @@ function scheduledTimeout(eim){
eim.dispose();
}
function playerRevive(eim, player){
player.respawn(eim, entryMap);
return false;
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDead(eim, player){}
function playerDisconnected(eim, player){
var party = eim.getPlayers();
for(var i = 0; i < party.size(); i++){
if(party.get(i).equals(player))
removePlayer(eim, player);
else
playerExit(eim, party.get(i));
}
eim.dispose();
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function monsterValue(eim, mobId){
return -1;
}
function end(eim) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerExit(eim, party.get(i));
}
eim.dispose();
}
function leftParty(eim, player){}
function disbandParty(eim){}
@@ -120,8 +129,15 @@ function playerExit(eim, player){
player.changeMap(exitMap, 2);
}
function changedMap(eim, chr, mapid) {
if(mapid < minMapId || mapid > maxMapId) playerExit(eim, chr);
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function removePlayer(eim, player){
+29 -13
View File
@@ -77,29 +77,38 @@ function scheduledTimeout(eim){
eim.dispose();
}
function playerRevive(eim, player){
player.respawn(eim, entryMap);
return false;
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDead(eim, player){}
function playerDisconnected(eim, player){
var party = eim.getPlayers();
for(var i = 0; i < party.size(); i++){
if(party.get(i).equals(player))
removePlayer(eim, player);
else
playerExit(eim, party.get(i));
}
eim.dispose();
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function monsterValue(eim, mobId){
return -1;
}
function end(eim) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerExit(eim, party.get(i));
}
eim.dispose();
}
function leftParty(eim, player){}
function disbandParty(eim){}
@@ -112,7 +121,14 @@ function playerExit(eim, player){
}
function changedMap(eim, chr, mapid) {
if(mapid < minMapId || mapid > maxMapId) playerExit(eim, chr);
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function removePlayer(eim, player){
+55
View File
@@ -0,0 +1,55 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2018 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) {
im.dispose();
} else {
if (mode == 0 && type > 0) {
im.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
if (im.getMapId() == 106020300) {
var portal = im.getMap().getPortal("obstacle");
if (portal != null && portal.getPosition().distance(im.getPlayer().getPosition()) < 210) {
if(!(im.isQuestStarted(100202) || im.isQuestCompleted(100202))) im.startQuest(100202);
im.removeAll(2430014);
im.message("You have used the Killer Mushroom Spore to open the way.");
}
}
im.dispose();
}
}
}
View File
+58
View File
@@ -0,0 +1,58 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2018 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) {
im.dispose();
} else {
if (mode == 0 && type > 0) {
im.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
if (im.getMapId() == 106020400 && im.isQuestActive(2324)) {
var player = im.getPlayer();
var portal = im.getMap().getPortal("right00");
if (portal != null && portal.getPosition().distance(player.getPosition()) < 210) {
player.gainExp(3300 * player.getExpRate());
im.forceCompleteQuest(2324);
im.removeAll(2430015);
im.playerMessage(5, "You have used the Thorn Remover to clear the path.");
}
}
im.dispose();
}
}
}
+6 -1
View File
@@ -59,7 +59,12 @@ function action(mode, type, selection) {
}
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) { // thanks Vcoc for finding out a need of reapproval from the masters for Zakum expeditions
cm.sendOk("Beware, for the power of olde has not been forgotten... ");
if (cm.getPlayer().getLevel() >= 50) { // thanks Z1peR for noticing not-so-clear unmet requirements message here.
cm.sendOk("Beware, for the power of olde has not been forgotten... If you seek to defeat #rZakum#k someday, earn the #bChief's Residence Council#k approval foremost and then #bface the trials#k, only then you will become eligible to fight.");
} else {
cm.sendOk("Beware, for the power of olde has not been forgotten...");
}
cm.dispose();
return;
}
@@ -39,7 +39,14 @@ function action(mode, type, selection) {
status--;
if(status == 0) {
cm.sendOk("We've already located the enemy's ultimate weapon! Follow along the ship's bow area ahead and you will find my sister #b#p2082013##k. Report to her for futher instructions on the mission.");
if (Packages.constants.ServerConstants.USE_ENABLE_CUSTOM_NPC_SCRIPT) {
cm.openShopNPC(2082014);
} else if (cm.isQuestStarted(3749)) {
cm.sendOk("We've already located the enemy's ultimate weapon! Follow along the ship's bow area ahead and you will find my sister #b#p2082013##k. Report to her for futher instructions on the mission.");
} else {
cm.sendDefault();
}
cm.dispose();
}
}
+4 -3
View File
@@ -4,11 +4,12 @@
*/
function start() {
if(Packages.server.MapleShopFactory.getInstance().getShop(9201101) != null) {
if (Packages.constants.ServerConstants.USE_ENABLE_CUSTOM_NPC_SCRIPT) {
cm.openShopNPC(9201101);
} else {
cm.sendOk("The patrol in New Leaf City is always ready. No creatures are able to break through to the city.");
//cm.sendOk("The patrol in New Leaf City is always ready. No creatures are able to break through to the city.");
cm.sendDefault();
}
cm.dispose();
}
+3
View File
@@ -60,6 +60,7 @@ function writeFeatureTab_Skills() {
addFeature("Maker skill features properly developed.");
addFeature("Chair Mastery - map chair boosts HP/MP rec.");
addFeature("Mu Lung Dojo skills functional.");
addFeature("Monster Magnet skill no longer crashes players.");
}
function writeFeatureTab_Quests() {
@@ -72,6 +73,7 @@ function writeFeatureTab_Quests() {
addFeature("Reviewed several 4th job skill questlines.");
addFeature("Rewarding system now looks up for item stacking.");
addFeature("3rd job quiz with all 40-question pool available.");
addFeature("Item raising functional.");
}
function writeFeatureTab_PlayerSocialNetwork() {
@@ -113,6 +115,7 @@ function writeFeatureTab_CashItems() {
addFeature("Reviewed an pet position issue within CASH inventory.");
addFeature("Reviewed fashion-related contents, almost GMS-like.");
addFeature("Plastic surgeons/stylists no longer stuck characters.");
addFeature("Reworked gachapon loots, website-lists lookalike.");
addFeature("Scroll for Spikes on Shoes.");
addFeature("Scroll for Cold Protection.");
addFeature("Vega's spell.");
+2 -2
View File
@@ -26,12 +26,12 @@
var status;
var ticketId = 5220000;
var mapName = ["Henesys", "Ellinia", "Perion", "Kerning City", "Sleepywood", "Mushroom Shrine", "Showa Spa (M)", "Showa Spa (F)", "New Leaf City", "Nautilus"];
var mapName = ["Henesys", "Ellinia", "Perion", "Kerning City", "Sleepywood", "Mushroom Shrine", "Showa Spa (M)", "Showa Spa (F)", "Ludibrium", "New Leaf City", "El Nath", "Nautilus"];
var curMapName = "";
function start() {
status = -1;
curMapName = mapName[(cm.getNpc() != 9100117 && cm.getNpc() != 9100109) ? (cm.getNpc() - 9100100) : cm.getNpc() == 9100109 ? 8 : 9];
curMapName = mapName[(cm.getNpc() != 9100117 && cm.getNpc() != 9100109) ? (cm.getNpc() - 9100100) : cm.getNpc() == 9100109 ? 9 : 11];
action(1, 0, 0);
}
+60
View File
@@ -0,0 +1,60 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2018 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/>.
*/
/**
* @author: Ronan
* @npc: Pio
* @func: Gachapon Loot Announcer
*/
var status;
var gachaMessages;
function start() {
gachaMessages = Packages.server.gachapon.MapleGachapon.Gachapon.getLootInfo();
gachas = Packages.server.gachapon.MapleGachapon.Gachapon.values();
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) {
var sendStr = "Hi, #r#p" + cm.getNpc() + "##k here! I'm announcing all obtainable loots from the Gachapons. Which Gachapon machine would you like to look?\r\n\r\n#b" + gachaMessages[0] + "#k";
cm.sendSimple(sendStr);
} else if(status == 1) {
var sendStr = "Loots from #b" + gachas[selection].name() + "#k:\r\n\r\n" + gachaMessages[selection + 1];
cm.sendPrev(sendStr);
} else if(status == 2) {
cm.dispose();
}
}
}
+19 -13
View File
@@ -22,17 +22,20 @@ function enter(pi) {
else if(pi.isQuestStarted(2332) && pi.hasItem(4032388)){
pi.forceCompleteQuest(2332, 1300002);
pi.getPlayer().message("You've found the princess!");
pi.giveCharacterExp(4400 * 1.5, pi.getPlayer());
pi.giveCharacterExp(4400, pi.getPlayer());
var em = pi.getEventManager("MK_PrimeMinister");
var party = pi.getPlayer().getParty();
if (party != null) {
if (em.startInstance(party, pi.getMap())) {
pi.playPortalSound();
return true;
} else {
pi.message("Another party is already challenging the boss in this channel.");
return false;
var eli = em.getEligibleParty(pi.getParty()); // thanks Conrad for pointing out missing eligible party declaration here
if(eli.size() > 0) {
if (em.startInstance(party, pi.getMap())) {
pi.playPortalSound();
return true;
} else {
pi.message("Another party is already challenging the boss in this channel.");
return false;
}
}
} else {
if (em.startInstance(pi.getPlayer())) { // thanks RedHat for noticing an issue here
@@ -49,12 +52,15 @@ function enter(pi) {
var party = pi.getPlayer().getParty();
if (party != null) {
if (em.startInstance(1, party, pi.getMap())) {
pi.playPortalSound();
return true;
} else {
pi.message("Another party is already challenging the boss in this channel.");
return false;
var eli = em.getEligibleParty(pi.getParty());
if(eli.size() > 0) {
if (em.startInstance(1, party, pi.getMap())) {
pi.playPortalSound();
return true;
} else {
pi.message("Another party is already challenging the boss in this channel.");
return false;
}
}
} else {
if (em.startInstance(pi.getPlayer())) {
+1 -1
View File
@@ -20,7 +20,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
function enter(pi) {
if(!pi.isQuestCompleted(3706)) {
if (!pi.isQuestStarted(100203)) { // thanks Conrad for suggesting grant players access to area with Nein Spirit's Baby Dragon after hatching egg
pi.playPortalSound(); pi.warp(240040611, "out00");
} else {
pi.playPortalSound(); pi.warp(240040612, "out00");
+3 -4
View File
@@ -1,13 +1,12 @@
function enter(pi) {
if(!pi.isQuestStarted(2335) || (pi.isQuestStarted(2335) && !pi.hasItem(4032405))){
if(!pi.isQuestCompleted(2335) && !(pi.isQuestStarted(2335) && pi.hasItem(4032405))){
pi.getPlayer().message("The door is locked securely. I will need a key if I want to go in there.");
return false;
}
if(pi.isQuestStarted(2335) && pi.hasItem(4032405)){
if(pi.isQuestStarted(2335)){
pi.forceCompleteQuest(2335, 1300002);
pi.giveCharacterExp(5000 * 1.5, pi.getPlayer());
pi.giveCharacterExp(5000, pi.getPlayer());
pi.gainItem(4032405, -1);
}
pi.playPortalSound();
+7 -10
View File
@@ -1,12 +1,9 @@
function enter(pi) {
if (pi.isQuestActive(2324)) {
var player = pi.getPlayer();
player.gainExp(3300 * player.getExpRate());
pi.forceCompleteQuest(2324);
pi.removeAll(2430015);
pi.playerMessage(5, "You have used the Thorn Remover to clear the path.");
}
pi.playPortalSound(); pi.warp(106020501,0);
return true;
if (pi.isQuestCompleted(2324)) {
pi.playPortalSound(); pi.warp(106020501,0);
return true;
} else {
pi.playerMessage(5, "The path ahead is covered with sprawling vine thorns, only a Thorn Remover to clear this out...");
return false;
}
}
+4 -9
View File
@@ -5,17 +5,12 @@
*/
function enter(pi){
if (pi.isQuestCompleted(2316)) {
if (pi.hasItem(2430014)) {
pi.gainItem(2430014, -1 * pi.getPlayer().getItemQuantity(2430014, false));
pi.message("You have used the Killer Mushroom Spore to open the way.");
}
if (pi.isQuestStarted(100202)) {
pi.playPortalSound(); pi.warp(106020400, 2);
return true;
} else if (pi.hasItem(2430015)) {
pi.gainItem(2430015, -1 * pi.getPlayer().getItemQuantity(2430015, false));
pi.message("You have used the Thorn Remover to clean the way.");
} else if (pi.hasItem(4000507)) {
pi.gainItem(4000507, -1);
pi.message("You have used a Poison Spore to pass through the barrier.");
pi.playPortalSound(); pi.warp(106020400, 2);
return true;
+1 -1
View File
@@ -8,7 +8,7 @@ var status = -1;
function start(mode, type, selection){
if(qm.hasItem(4032388) && !qm.isQuestStarted(2332)){
qm.forceStartQuest();
qm.getPlayer().showHint("I must find Violetta. (quest started)");
qm.getPlayer().showHint("I must find Violetta!! (#bquest started#k)");
}
qm.dispose();
}
+3
View File
@@ -18,6 +18,9 @@ function touch() {
function untouch() {}
function act() {
rm.message("With your latest efforts the egg has matured and cracked, thus born a radiant baby dragon.");
rm.startQuest(100203);
rm.spawnNpc(2081008);
rm.schedule("sendToHeaven", 12 * 1000);
}
+3 -3
View File
@@ -16,8 +16,8 @@ CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(13) NOT NULL DEFAULT '',
`password` varchar(128) NOT NULL DEFAULT '',
`pin` varchar(10) DEFAULT NULL,
`pic` varchar(26) DEFAULT NULL,
`pin` varchar(10) NOT NULL DEFAULT '',
`pic` varchar(26) NOT NULL DEFAULT '',
`loggedin` tinyint(4) NOT NULL DEFAULT '0',
`lastlogin` timestamp NULL DEFAULT NULL,
`createdat` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -9474,7 +9474,7 @@ INSERT IGNORE INTO `temp_data` (`dropperid`, `itemid`, `minimum_quantity`, `maxi
(3300001, 4130009, 1, 1, 0, 6000),
(3300001, 4130021, 1, 1, 0, 6000),
(3300001, 4000500, 1, 1, 0, 600000),
(3300001, 4000507, 1, 1, 0, 600000),
(3300001, 4000507, 1, 1, 0, 100000),
(3300001, 2044024, 1, 1, 0, 300),
(3300001, 2044116, 1, 1, 0, 300),
(3300001, 2382093, 1, 1, 0, 20000),
+1 -1
View File
@@ -2751,7 +2751,7 @@ USE `heavenms`;
(3300000, 1082046, 1, 1, 0, 700),
(3300000, 1002622, 1, 1, 0, 700),
(3300001, 4000500, 1, 1, 0, 200000),
(3300001, 4000507, 1, 1, 0, 200000),
(3300001, 4000507, 1, 1, 0, 100000),
(3300001, 4130021, 1, 1, 0, 3000),
(3300001, 2382093, 1, 1, 0, 20000),
(3300001, 2044701, 1, 1, 0, 750),
+75 -74
View File
@@ -182,80 +182,81 @@ INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES
(1337, 2100003, 1, 9),
(1337, 2100002, 1, 10),
(1337, 2100001, 1, 11),
(1337, 1002140, 1, 12),
(1337, 1042003, 1, 13),
(1337, 1062007, 1, 14),
(1337, 1322013, 1, 15),
(1337, 1072010, 1, 16),
(1337, 2022179, 1, 17),
(1337, 2022273, 1, 18),
(1337, 2041200, 1, 19),
(1337, 4006001, 1, 20),
(1337, 4001017, 1, 21),
(1337, 4031179, 1, 22),
(1337, 2070018, 1, 23),
(1337, 2060004, 1, 24),
(1337, 2061004, 1, 25),
(1337, 2330005, 1, 26),
(1337, 2332000, 1, 27),
(1337, 2331000, 1, 28),
(1337, 5072000, 1, 29),
(1337, 5390000, 1, 30),
(1337, 5390001, 1, 31),
(1337, 5390002, 1, 32),
(1337, 5390005, 1, 33),
(1337, 5390006, 1, 34),
(1337, 1492013, 1, 35),
(1337, 1482013, 1, 36),
(1337, 1452044, 1, 37),
(1337, 1472052, 1, 38),
(1337, 1462039, 1, 39),
(1337, 1332050, 1, 40),
(1337, 1312031, 1, 41),
(1337, 1322052, 1, 42),
(1337, 1302059, 1, 43),
(1337, 1442045, 1, 44),
(1337, 1432038, 1, 45),
(1337, 1382036, 1, 46),
(1337, 1412026, 1, 47),
(1337, 1422028, 1, 48),
(1337, 1402036, 1, 49),
(1337, 1372032, 1, 50),
(1337, 1122000, 1, 51),
(1337, 1082149, 1, 52),
(1337, 1912000, 1, 53),
(1337, 1902000, 1, 54),
(1337, 1902001, 1, 55),
(1337, 1902002, 1, 56),
(1337, 1912005, 1, 57),
(1337, 1902005, 1, 58),
(1337, 1902006, 1, 59),
(1337, 1902007, 1, 60),
(1337, 1912011, 1, 61),
(1337, 1902015, 1, 62),
(1337, 1902016, 1, 63),
(1337, 1902017, 1, 64),
(1337, 1902018, 1, 65),
(1337, 2044908, 1, 66),
(1337, 2044815, 1, 67),
(1337, 2044512, 1, 68),
(1337, 2044712, 1, 69),
(1337, 2044612, 1, 70),
(1337, 2043312, 1, 71),
(1337, 2043117, 1, 72),
(1337, 2043217, 1, 73),
(1337, 2043023, 1, 74),
(1337, 2044417, 1, 75),
(1337, 2044317, 1, 76),
(1337, 2043812, 1, 77),
(1337, 2044117, 1, 78),
(1337, 2044217, 1, 79),
(1337, 2044025, 1, 80),
(1337, 2043712, 1, 81),
(1337, 2340000, 1, 82),
(1337, 2040807, 1, 83),
(1337, 2210032, 1, 84),
(1337, 2050004, 1, 85);
(1337, 1002959, 1, 12),
(1337, 1002140, 1, 13),
(1337, 1042003, 1, 14),
(1337, 1062007, 1, 15),
(1337, 1322013, 1, 16),
(1337, 1072010, 1, 17),
(1337, 2022179, 1, 18),
(1337, 2022273, 1, 19),
(1337, 2041200, 1, 20),
(1337, 4006001, 1, 21),
(1337, 4001017, 1, 22),
(1337, 4031179, 1, 23),
(1337, 2070018, 1, 24),
(1337, 2060004, 1, 25),
(1337, 2061004, 1, 26),
(1337, 2330005, 1, 27),
(1337, 2332000, 1, 28),
(1337, 2331000, 1, 29),
(1337, 5072000, 1, 30),
(1337, 5390000, 1, 31),
(1337, 5390001, 1, 32),
(1337, 5390002, 1, 33),
(1337, 5390005, 1, 34),
(1337, 5390006, 1, 35),
(1337, 1492013, 1, 36),
(1337, 1482013, 1, 37),
(1337, 1452044, 1, 38),
(1337, 1472052, 1, 39),
(1337, 1462039, 1, 40),
(1337, 1332050, 1, 41),
(1337, 1312031, 1, 42),
(1337, 1322052, 1, 43),
(1337, 1302059, 1, 44),
(1337, 1442045, 1, 45),
(1337, 1432038, 1, 46),
(1337, 1382036, 1, 47),
(1337, 1412026, 1, 48),
(1337, 1422028, 1, 49),
(1337, 1402036, 1, 50),
(1337, 1372032, 1, 51),
(1337, 1122000, 1, 52),
(1337, 1082149, 1, 53),
(1337, 1912000, 1, 54),
(1337, 1902000, 1, 55),
(1337, 1902001, 1, 56),
(1337, 1902002, 1, 57),
(1337, 1912005, 1, 58),
(1337, 1902005, 1, 59),
(1337, 1902006, 1, 60),
(1337, 1902007, 1, 61),
(1337, 1912011, 1, 62),
(1337, 1902015, 1, 63),
(1337, 1902016, 1, 64),
(1337, 1902017, 1, 65),
(1337, 1902018, 1, 66),
(1337, 2044908, 1, 67),
(1337, 2044815, 1, 68),
(1337, 2044512, 1, 69),
(1337, 2044712, 1, 70),
(1337, 2044612, 1, 71),
(1337, 2043312, 1, 72),
(1337, 2043117, 1, 73),
(1337, 2043217, 1, 74),
(1337, 2043023, 1, 75),
(1337, 2044417, 1, 76),
(1337, 2044317, 1, 77),
(1337, 2043812, 1, 78),
(1337, 2044117, 1, 79),
(1337, 2044217, 1, 80),
(1337, 2044025, 1, 81),
(1337, 2043712, 1, 82),
(1337, 2340000, 1, 83),
(1337, 2040807, 1, 84),
(1337, 2210032, 1, 85),
(1337, 2050004, 1, 86);
-- Thanks to DietStory v1.02 dev team
INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `pitch`, `position`) VALUES
+10 -45
View File
@@ -206,7 +206,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
private transient int localstr, localdex, localluk, localint_, localmagic, localwatk;
private transient int equipmaxhp, equipmaxmp, equipstr, equipdex, equipluk, equipint_, equipmagic, equipwatk, localchairhp, localchairmp;
private int localchairrate;
private boolean hidden, equipchanged = true, canDoor = true, berserk, hasMerchant, hasSandboxItem = false, whiteChat = false, canRecvPartySearchInvite = true;
private boolean hidden, equipchanged = true, berserk, hasMerchant, hasSandboxItem = false, whiteChat = false, canRecvPartySearchInvite = true;
private boolean equippedMesoMagnet = false, equippedItemPouch = false, equippedPetItemIgnore = false;
private int linkedLevel = 0;
private String linkedName = null;
@@ -961,7 +961,8 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
}
public boolean canDoor() {
return canDoor;
MapleDoor door = getPlayerDoor();
return door == null || (door.isActive() && door.getElapsedDeployTime() > 5000);
}
public void setHasSandboxItem() {
@@ -2297,6 +2298,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
}
deleteQuestProgressWhereCharacterId(con, cid);
FredrickProcessor.removeFredrickLog(cid); // thanks maple006 for pointing out the player's Fredrick items are not being deleted at character deletion
try (PreparedStatement ps = con.prepareStatement("SELECT id FROM mts_cart WHERE cid = ?")) {
ps.setInt(1, cid);
@@ -2521,19 +2523,6 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
}, healInterval, healInterval);
}
public void disableDoorSpawn() {
canDoor = false;
Runnable r = new Runnable() {
@Override
public void run() {
canDoor = true;
}
};
client.getChannelServer().registerOverallAction(mapid, r, 5000);
}
public void disbandGuild() {
if (guildid < 1 || guildRank != 1) {
return;
@@ -3783,29 +3772,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
}
if (effect.isMagicDoor()) {
MapleDoor destroyDoor = removePartyDoor(false);
if (destroyDoor != null) {
destroyDoor.getTarget().removeMapObject(destroyDoor.getAreaDoor());
destroyDoor.getTown().removeMapObject(destroyDoor.getTownDoor());
for (MapleCharacter chr : destroyDoor.getTarget().getCharacters()) {
destroyDoor.getAreaDoor().sendDestroyData(chr.getClient());
}
Collection<MapleCharacter> townChars = destroyDoor.getTown().getCharacters();
for (MapleCharacter chr : townChars) {
destroyDoor.getTownDoor().sendDestroyData(chr.getClient());
}
if (destroyDoor.getTownPortal().getId() == 0x80) {
for (MapleCharacter chr : townChars) {
MapleDoor door = chr.getMainTownDoor();
if (door != null) {
destroyDoor.getTownDoor().sendSpawnData(chr.getClient());
}
}
}
}
MapleDoor.attemptRemoveDoor(this);
} else if (effect.isMapChair()) {
stopChairTask();
}
@@ -4559,7 +4526,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
silentPartyUpdateInternal(chrParty);
}
private MapleDoor removePartyDoor(boolean partyUpdate) {
public MapleDoor removePartyDoor(boolean partyUpdate) {
MapleDoor ret = null;
MapleParty chrParty;
@@ -5356,7 +5323,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
closeNpcShop();
closeTrade();
closePlayerShop();
closeMiniGame();
closeMiniGame(true);
closeHiredMerchant(false);
closePlayerMessenger();
@@ -5398,18 +5365,16 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
this.setPlayerShop(null);
}
public void closeMiniGame() {
public void closeMiniGame(boolean forceClose) {
MapleMiniGame game = this.getMiniGame();
if (game == null) {
return;
}
this.setMiniGame(null);
if (game.isOwner(this)) {
this.getMap().broadcastMessage(MaplePacketCreator.removeMinigameBox(this));
game.broadcastToVisitor(MaplePacketCreator.getMiniGameClose(3));
game.closeRoom(forceClose);
} else {
game.removeVisitor(this);
game.removeVisitor(forceClose, this);
}
}
+10 -4
View File
@@ -109,11 +109,11 @@ public class MapleClient {
private Map<String, ScriptEngine> engines = new HashMap<>();
private byte characterSlots = 3;
private byte loginattempt = 0;
private String pin = null;
private String pin = "";
private int pinattempt = 0;
private String pic = null;
private String hwid = null;
private String pic = "";
private int picattempt = 0;
private String hwid = null;
private byte csattempt = 0;
private byte gender = -1;
private boolean disconnecting = false;
@@ -480,6 +480,10 @@ public class MapleClient {
}
public boolean checkPin(String other) {
if (!(ServerConstants.ENABLE_PIN && !canBypassPin())) {
return true;
}
pinattempt++;
if (pinattempt > 5) {
MapleSessionCoordinator.getInstance().closeSession(session, false);
@@ -521,7 +525,7 @@ public class MapleClient {
if (picattempt > 5) {
MapleSessionCoordinator.getInstance().closeSession(session, false);
}
if (pic.equals(other)) {
if (pic.equals(other)) { // thanks ryantpayton (HeavenClient) for noticing null pics being checked here
picattempt = 0;
MapleLoginBypassCoordinator.getInstance().registerLoginBypassEntry(getNibbleHWID(), accId, true);
return true;
@@ -1485,6 +1489,8 @@ public class MapleClient {
player.getMap().removePlayer(player);
player.clearBanishPlayerData();
player.getClient().getChannelServer().removePlayer(player);
player.saveCharToDB();
player.getClient().updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION);
player.setSessionTransitionState();
+1 -1
View File
@@ -85,7 +85,7 @@ public enum AutobanFactory {
public void alert(MapleCharacter chr, String reason) {
if(ServerConstants.USE_AUTOBAN == true) {
if (chr != null && MapleLogger.ignored.contains(chr.getName())){
if (chr != null && MapleLogger.ignored.contains(chr.getId())){
return;
}
Server.getInstance().broadcastGMMessage((chr != null ? chr.getWorld() : 0), MaplePacketCreator.sendYellowTip((chr != null ? MapleCharacter.makeMapleReadable(chr.getName()) : "") + " caused " + this.name() + " " + reason));
+3 -3
View File
@@ -119,9 +119,9 @@ public class AutobanManager {
FilePrinter.print(FilePrinter.EXPLOITS, "Player " + chr + " was caught spamming TYPE " + type + " and has been disconnected.");
}
return;
} else {
this.timestamp[type] = time;
this.timestampcounter[type] = 0;
}
this.timestamp[type] = time;
this.timestampcounter[type] = 0;
}
}
+1
View File
@@ -259,6 +259,7 @@ public class CommandsExecutor {
addCommand("job", 2, JobCommand.class);
addCommand("unbug", 2, UnBugCommand.class);
addCommand("id", 2, IdCommand.class);
addCommand("gachalist", GachaListCommand.class);
commandsNameDesc.add(levelCommandsCursor);
}
@@ -0,0 +1,38 @@
/*
This file is part of the HeavenMS MapleStory Server, commands OdinMS-based
Copyleft (L) 2016 - 2018 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/>.
*/
package client.command.commands.gm2;
import client.MapleClient;
import client.command.Command;
/**
*
* @author Ronan
*/
public class GachaListCommand extends Command {
{
setDescription("");
}
@Override
public void execute(MapleClient c, String[] params) {
c.getAbstractPlayerInteraction().openNpc(10000, "gachaponInfo");
}
}
@@ -47,11 +47,11 @@ public class IgnoreCommand extends Command {
player.message("Player '" + params[0] + "' could not be found on this world.");
return;
}
boolean monitored_ = MapleLogger.ignored.contains(victim.getName());
boolean monitored_ = MapleLogger.ignored.contains(victim.getId());
if (monitored_) {
MapleLogger.ignored.remove(victim.getName());
MapleLogger.ignored.remove(victim.getId());
} else {
MapleLogger.ignored.add(victim.getName());
MapleLogger.ignored.add(victim.getId());
}
player.yellowMessage(victim.getName() + " is " + (!monitored_ ? "now being ignored." : "no longer being ignored."));
String message_ = player.getName() + (!monitored_ ? " has started ignoring " : " has stopped ignoring ") + victim.getName() + ".";
@@ -36,8 +36,8 @@ public class IgnoredCommand extends Command {
@Override
public void execute(MapleClient c, String[] params) {
MapleCharacter player = c.getPlayer();
for (String ign : MapleLogger.ignored) {
player.yellowMessage(ign + " is being ignored.");
for (Integer cid : MapleLogger.ignored) {
player.yellowMessage(MapleCharacter.getNameById(cid) + " is being ignored.");
}
}
}
@@ -47,14 +47,14 @@ public class MonitorCommand extends Command {
player.message("Player '" + params[0] + "' could not be found on this world.");
return;
}
boolean monitored = MapleLogger.monitored.contains(victim.getName());
boolean monitored = MapleLogger.monitored.contains(victim.getId());
if (monitored) {
MapleLogger.monitored.remove(victim.getName());
MapleLogger.monitored.remove(victim.getId());
} else {
MapleLogger.monitored.add(victim.getName());
MapleLogger.monitored.add(victim.getId());
}
player.yellowMessage(victim.getName() + " is " + (!monitored ? "now being monitored." : "no longer being monitored."));
String message = player.getName() + (!monitored ? " has started monitoring " : " has stopped monitoring ") + victim.getName() + ".";
player.yellowMessage(victim.getId() + " is " + (!monitored ? "now being monitored." : "no longer being monitored."));
String message = player.getName() + (!monitored ? " has started monitoring " : " has stopped monitoring ") + victim.getId() + ".";
Server.getInstance().broadcastGMMessage(c.getWorld(), MaplePacketCreator.serverNotice(5, message));
}
@@ -36,8 +36,8 @@ public class MonitorsCommand extends Command {
@Override
public void execute(MapleClient c, String[] params) {
MapleCharacter player = c.getPlayer();
for (String ign : MapleLogger.monitored) {
player.yellowMessage(ign + " is being monitored.");
for (Integer cid : MapleLogger.monitored) {
player.yellowMessage(MapleCharacter.getNameById(cid) + " is being monitored.");
}
}
}
+47 -27
View File
@@ -463,31 +463,41 @@ public class MapleInventory implements Iterable<Item> {
public static boolean checkSpots(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed, boolean useProofInv) {
// assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0.
Map<Integer, Short> rcvItems = new LinkedHashMap<>();
Map<Integer, List<Integer>> rcvItems = new LinkedHashMap<>();
Map<Integer, Byte> rcvTypes = new LinkedHashMap<>();
for (Pair<Item, MapleInventoryType> item : items) {
Integer itemId = item.left.getItemId();
Short qty = rcvItems.get(itemId);
List<Integer> qty = rcvItems.get(itemId);
if(qty == null) {
rcvItems.put(itemId, item.left.getQuantity());
List<Integer> itemQtyList = new LinkedList<>();
itemQtyList.add((int) item.left.getQuantity());
rcvItems.put(itemId, itemQtyList);
rcvTypes.put(itemId, item.right.getType());
} else {
rcvItems.put(itemId, (short)(qty + item.left.getQuantity()));
if (!ItemConstants.isRechargeable(itemId)) {
qty.set(0, qty.get(0) + item.left.getQuantity());
} else {
qty.add((int) item.left.getQuantity());
}
}
}
MapleClient c = chr.getClient();
for(Entry<Integer, Short> it: rcvItems.entrySet()) {
for(Entry<Integer, List<Integer>> it: rcvItems.entrySet()) {
int itemType = rcvTypes.get(it.getKey()) - 1;
int usedSlots = typesSlotsUsed.get(itemType);
int result = MapleInventoryManipulator.checkSpaceProgressively(c, it.getKey(), it.getValue(), "", usedSlots, useProofInv);
boolean hasSpace = ((result % 2) != 0);
if(!hasSpace) return false;
typesSlotsUsed.set(itemType, (result >> 1));
for (Integer itValue : it.getValue()) {
int usedSlots = typesSlotsUsed.get(itemType);
int result = MapleInventoryManipulator.checkSpaceProgressively(c, it.getKey(), itValue, "", usedSlots, useProofInv);
boolean hasSpace = ((result % 2) != 0);
if(!hasSpace) return false;
typesSlotsUsed.set(itemType, (result >> 1));
}
}
return true;
@@ -525,38 +535,48 @@ public class MapleInventory implements Iterable<Item> {
public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed, boolean useProofInv) {
//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, List<Integer>> rcvItems = new LinkedHashMap<>();
Map<Long, Byte> rcvTypes = new LinkedHashMap<>();
Map<Long, String> rcvOwners = new LinkedHashMap<>();
for (Pair<Item, MapleInventoryType> item : items) {
Long itemHash = hashKey(item.left.getItemId(), item.left.getOwner());
Short qty = rcvItems.get(itemHash);
List<Integer> qty = rcvItems.get(itemHash);
if(qty == null) {
rcvItems.put(itemHash, item.left.getQuantity());
List<Integer> itemQtyList = new LinkedList<>();
itemQtyList.add((int) item.left.getQuantity());
rcvItems.put(itemHash, itemQtyList);
rcvTypes.put(itemHash, item.right.getType());
rcvOwners.put(itemHash, item.left.getOwner());
} else {
rcvItems.put(itemHash, (short)(qty + item.left.getQuantity()));
// thanks BHB88 for pointing out an issue with rechargeable items being stacked on inventory check
if (!ItemConstants.isRechargeable(item.left.getItemId())) {
qty.set(0, qty.get(0) + item.left.getQuantity());
} else {
qty.add((int) item.left.getQuantity());
}
}
}
MapleClient c = chr.getClient();
for(Entry<Long, Short> it: rcvItems.entrySet()) {
for(Entry<Long, List<Integer>> it: rcvItems.entrySet()) {
int itemType = rcvTypes.get(it.getKey()) - 1;
int usedSlots = typesSlotsUsed.get(itemType);
int itemId = (int) (it.getKey() >> 32L);
Long itemId = it.getKey() >> 32L;
//System.out.print("inserting " + itemId.intValue() + " with type " + itemType + " qty " + it.getValue() + " owner '" + rcvOwners.get(it.getKey()) + "' current usedSlots:");
//for(Integer i : typesSlotsUsed) System.out.print(" " + i);
int result = MapleInventoryManipulator.checkSpaceProgressively(c, itemId.intValue(), it.getValue(), rcvOwners.get(it.getKey()), usedSlots, useProofInv);
boolean hasSpace = ((result % 2) != 0);
//System.out.print(" -> hasSpace: " + hasSpace + " RESULT : " + result + "\n");
if(!hasSpace) return false;
typesSlotsUsed.set(itemType, (result >> 1));
for (Integer itValue : it.getValue()) {
int usedSlots = typesSlotsUsed.get(itemType);
//System.out.print("inserting " + itemId.intValue() + " with type " + itemType + " qty " + it.getValue() + " owner '" + rcvOwners.get(it.getKey()) + "' current usedSlots:");
//for(Integer i : typesSlotsUsed) System.out.print(" " + i);
int result = MapleInventoryManipulator.checkSpaceProgressively(c, itemId, itValue, rcvOwners.get(it.getKey()), usedSlots, useProofInv);
boolean hasSpace = ((result % 2) != 0);
//System.out.print(" -> hasSpace: " + hasSpace + " RESULT : " + result + "\n");
if(!hasSpace) return false;
typesSlotsUsed.set(itemType, (result >> 1));
}
}
return true;
@@ -316,7 +316,11 @@ public class MapleInventoryManipulator {
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid);
List<Item> existing = inv.listById(itemid);
if (!ItemConstants.isRechargeable(itemid)) {
final int numSlotsNeeded;
if (ItemConstants.isRechargeable(itemid)) {
numSlotsNeeded = 1;
} else {
if (existing.size() > 0) // first update all existing slots to slotMax
{
for (Item eItem : existing) {
@@ -330,15 +334,14 @@ public class MapleInventoryManipulator {
}
}
}
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else {
numSlotsNeeded = 1;
}
}
final int numSlotsNeeded;
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else if (ItemConstants.isRechargeable(itemid)) {
numSlotsNeeded = 1;
} else {
numSlotsNeeded = 1;
}
return !inv.isFull(numSlotsNeeded - 1);
} else {
return !inv.isFull();
@@ -367,7 +370,11 @@ public class MapleInventoryManipulator {
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid);
if (!ItemConstants.isRechargeable(itemid)) {
final int numSlotsNeeded;
if (ItemConstants.isRechargeable(itemid)) {
numSlotsNeeded = 1;
} else {
List<Item> existing = inv.listById(itemid);
if (existing.size() > 0) // first update all existing slots to slotMax
@@ -383,14 +390,12 @@ public class MapleInventoryManipulator {
}
}
}
}
final int numSlotsNeeded;
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else if (ItemConstants.isRechargeable(itemid)) {
numSlotsNeeded = 1;
} else {
numSlotsNeeded = 1;
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else {
numSlotsNeeded = 1;
}
}
returnValue = ((numSlotsNeeded + usedSlots) << 1);
+1 -1
View File
@@ -100,7 +100,7 @@ public class FredrickProcessor {
return msg;
}
private static void removeFredrickLog(int cid) {
public static void removeFredrickLog(int cid) {
try {
Connection con = DatabaseConnection.getConnection();
removeFredrickLog(con, cid);
@@ -147,6 +147,7 @@ public class StorageProcessor {
chr.gainMeso(-storeFee, false, true, false);
item = item.copy(); // thanks Robin Schulz for pointing out an issue with stored items
MapleKarmaManipulator.toggleKarmaFlagToUntradeable(item);
item.setQuantity(quantity);
storage.store(item);
+2 -1
View File
@@ -37,7 +37,7 @@ public class ServerConstants {
public static final boolean AUTOMATIC_REGISTER = true; //Automatically register players when they login with a nonexistent username.
public static final boolean BCRYPT_MIGRATION = true; //Performs a migration from old SHA-1 and SHA-512 password to bcrypt.
public static final boolean COLLECTIVE_CHARSLOT = false; //Available character slots are contabilized globally rather than per world server.
public static final boolean DETERRED_MULTICLIENT = false; //Enables multi-client and suspicious remote IP detection on the login system.
public static final boolean DETERRED_MULTICLIENT = false; //Enables detection of multi-client and suspicious remote IP on the login system.
//Besides blocking logging in with several client sessions on the same machine, this also blocks suspicious login attempts for players that tries to login on an account using several diferent remote addresses.
@@ -98,6 +98,7 @@ public class ServerConstants {
public static final boolean USE_ENFORCE_UNMERCHABLE_PET = false; //Forces players to not sell pets via merchants. (since non-named pets gets dirty name and other possible DB-related issues)
public static final boolean USE_ENFORCE_MERCHANT_SAVE = true; //Forces automatic DB save on merchant owners, at every item movement on shop.
public static final boolean USE_ENFORCE_MDOOR_POSITION = false; //Forces mystic door to be spawned near spawnpoints.
public static final boolean USE_SPAWN_CLEAN_MDOOR = false; //Makes mystic doors to be spawned without deploy animation. This clears disconnecting issues that may happen when trying to cancel doors a couple seconds after deployment.
public static final boolean USE_SPAWN_LOOT_ON_ANIMATION = false;//Makes loot appear some time after the mob has been killed (following the mob death animation, instead of instantly).
public static final boolean USE_SPAWN_RELEVANT_LOOT = true; //Forces to only spawn loots that are collectable by the player or any of their party members.
public static final boolean USE_ERASE_PERMIT_ON_OPENSHOP = true;//Forces "shop permit" item to be consumed when player deploy his/her player shop.
+2 -1
View File
@@ -263,7 +263,8 @@ public final class PacketProcessor {
registerHandler(RecvOpcode.WATER_OF_LIFE, new UseWaterOfLifeHandler());
registerHandler(RecvOpcode.ADMIN_CHAT, new AdminChatHandler());
registerHandler(RecvOpcode.MOVE_DRAGON, new MoveDragonHandler());
registerHandler(RecvOpcode.USE_ITEMUI, new UseItemCanvasHandler());
registerHandler(RecvOpcode.OPEN_ITEMUI, new RaiseUIStateHandler());
registerHandler(RecvOpcode.USE_ITEMUI, new RaiseIncExpHandler());
}
}
}
+1 -4
View File
@@ -495,15 +495,12 @@ public class Server {
return true;
}
private void resetServerWorlds() {
private void resetServerWorlds() { // thanks maple006 for noticing proprietary lists assigned to null
wldWLock.lock();
try {
worlds.clear();
worlds = null;
channels.clear();
channels = null;
worldRecommendedList.clear();
worldRecommendedList = null;
} finally {
wldWLock.unlock();
}
@@ -94,7 +94,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler {
ANSWER_TIE(0x33),
GIVE_UP(0x34),
EXIT_AFTER_GAME(0x38),
CANCEL_EXIT(0x39),
CANCEL_EXIT_AFTER_GAME(0x39),
READY(0x3A),
UN_READY(0x3B),
EXPEL(0x3C),
@@ -344,7 +344,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler {
MapleTrade.cancelTrade(chr, MapleTrade.TradeResult.PARTNER_CANCEL);
} else {
chr.closePlayerShop();
chr.closeMiniGame();
chr.closeMiniGame(false);
chr.closeHiredMerchant(true);
}
} else if (mode == Action.OPEN_STORE.getCode() || mode == Action.OPEN_CASH.getCode()) {
@@ -608,8 +608,6 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler {
MaplePlayerShop shop = chr.getPlayerShop();
MapleHiredMerchant merchant = chr.getHiredMerchant();
if (shop != null && shop.isOwner(chr)) {
System.out.println(shopItem.getItem().getPet() + " " + shopItem.getItem().getPetId());
System.out.println(ivItem.getPet() + " " + ivItem.getPetId());
if (shop.isOpen() || !shop.addItem(shopItem)) { // thanks Vcoc for pointing an exploit with unlimited shop slots
c.announce(MaplePacketCreator.serverNotice(1, "You can't sell it anymore."));
return;
@@ -770,10 +768,20 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler {
MapleCharacter visitor = miniGame.getVisitor();
if(visitor != null) {
visitor.closeMiniGame();
visitor.announce(MaplePacketCreator.getMiniGameClose(5));
visitor.closeMiniGame(false);
visitor.announce(MaplePacketCreator.getMiniGameClose(true, 5));
}
}
} else if (mode == Action.EXIT_AFTER_GAME.getCode()) {
MapleMiniGame miniGame = chr.getMiniGame();
if(miniGame != null) {
miniGame.setQuitAfterGame(chr, true);
}
} else if (mode == Action.CANCEL_EXIT_AFTER_GAME.getCode()) {
MapleMiniGame miniGame = chr.getMiniGame();
if(miniGame != null) {
miniGame.setQuitAfterGame(chr, false);
}
}
} finally {
c.releaseClient();
@@ -0,0 +1,59 @@
package net.server.channel.handlers;
import java.util.Map;
import client.MapleClient;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import net.AbstractMaplePacketHandler;
import client.inventory.manipulator.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleItemInformationProvider.QuestConsItem;
import tools.data.input.SeekableLittleEndianAccessor;
/**
*
* @author Xari
* @author Ronan - added concurrency protection and quest progress limit
*/
public class RaiseIncExpHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
byte inventorytype = slea.readByte();//nItemIT
short slot = slea.readShort();//nSlotPosition
int itemid = slea.readInt();//nItemID
if (c.tryacquireClient()) {
try {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
QuestConsItem consItem = ii.getQuestConsumablesInfo(itemid);
if (consItem == null) {
return;
}
int questid = consItem.questid;
Map<Integer, Integer> consumables = consItem.items;
int consId;
MapleInventory inv = c.getPlayer().getInventory(MapleInventoryType.getByType(inventorytype));
inv.lockInventory();
try {
consId = inv.getItem(slot).getItemId();
if (!consumables.containsKey(consId) || !c.getPlayer().haveItem(consId)) {
return;
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.getByType(inventorytype), (short) slot, (short) 1, false, true);
} finally {
inv.unlockInventory();
}
int nextValue = Math.min(consumables.get(consId) + Integer.parseInt(c.getPlayer().getQuestInfo(questid)), consItem.exp * consItem.grade);
c.getPlayer().updateQuestInfo(questid, "" + nextValue);
} finally {
c.releaseClient();
}
}
}
}
@@ -0,0 +1,37 @@
package net.server.channel.handlers;
import client.MapleClient;
import client.MapleQuestStatus;
import net.AbstractMaplePacketHandler;
import server.quest.MapleQuest;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
/**
*
* @author Xari
*/
public class RaiseUIStateHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
int questid = slea.readShort();
if (c.tryacquireClient()) {
try {
MapleQuest quest = MapleQuest.getInstance(questid);
MapleQuestStatus mqs = c.getPlayer().getQuest(quest);
if (mqs.getStatus() == MapleQuestStatus.Status.NOT_STARTED) {
quest.forceStart(c.getPlayer(), 22000);
c.getPlayer().updateQuestInfo(quest.getId(), "0");
} else if (mqs.getStatus() == MapleQuestStatus.Status.STARTED) {
c.announce(MaplePacketCreator.updateQuest(mqs, false));
} else {
//c.announce(MaplePacketCreator.updateQuestInfo(mqs.getQuestID(), 22000, "0"));
}
} finally {
c.releaseClient();
}
}
}
}
@@ -26,6 +26,7 @@ import client.MapleClient;
import client.Skill;
import client.SkillFactory;
import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import java.util.Map;
import net.AbstractMaplePacketHandler;
@@ -41,38 +42,57 @@ public final class SkillBookHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.enableActions());
return;
}
slea.readInt();
short slot = (short) slea.readShort();
int itemId = slea.readInt();
boolean canuse;
boolean success = false;
int skill = 0;
int maxlevel = 0;
MapleCharacter player = c.getPlayer();
Item toUse = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
if (toUse != null && toUse.getQuantity() == 1) {
if (toUse.getItemId() != itemId) {
return;
}
Map<String, Integer> skilldata = MapleItemInformationProvider.getInstance().getSkillStats(toUse.getItemId(), c.getPlayer().getJob().getId());
boolean canuse;
boolean success = false;
int skill = 0;
int maxlevel = 0;
if (skilldata == null) {
return;
}
Skill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
if (skilldata.get("skillid") == 0) {
canuse = false;
} else if ((player.getSkillLevel(skill2) >= skilldata.get("reqSkillLevel") || skilldata.get("reqSkillLevel") == 0) && player.getMasterLevel(skill2) < skilldata.get("masterLevel")) {
canuse = true;
if (MapleItemInformationProvider.rollSuccessChance(skilldata.get("success"))) {
success = true;
player.changeSkillLevel(skill2, player.getSkillLevel(skill2), Math.max(skilldata.get("masterLevel"), player.getMasterLevel(skill2)), -1);
} else {
success = false;
//player.dropMessage("The skill book lights up, but the skill winds up as if nothing happened.");
if (c.tryacquireClient()) {
try {
MapleInventory inv = c.getPlayer().getInventory(MapleInventoryType.USE);
Item toUse = inv.getItem(slot);
if (toUse == null || toUse.getItemId() != itemId) {
return;
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
} else {
canuse = false;
Map<String, Integer> skilldata = MapleItemInformationProvider.getInstance().getSkillStats(toUse.getItemId(), c.getPlayer().getJob().getId());
if (skilldata == null) {
return;
}
Skill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
if (skilldata.get("skillid") == 0) {
canuse = false;
} else if ((player.getSkillLevel(skill2) >= skilldata.get("reqSkillLevel") || skilldata.get("reqSkillLevel") == 0) && player.getMasterLevel(skill2) < skilldata.get("masterLevel")) {
inv.lockInventory();
try {
Item used = inv.getItem(slot);
if (used != toUse || toUse.getQuantity() < 1) { // thanks ClouD for noticing skillbooks not being usable when stacked
return;
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
} finally {
inv.unlockInventory();
}
canuse = true;
if (MapleItemInformationProvider.rollSuccessChance(skilldata.get("success"))) {
success = true;
player.changeSkillLevel(skill2, player.getSkillLevel(skill2), Math.max(skilldata.get("masterLevel"), player.getMasterLevel(skill2)), -1);
} else {
success = false;
//player.dropMessage("The skill book lights up, but the skill winds up as if nothing happened.");
}
} else {
canuse = false;
}
} finally {
c.releaseClient();
}
// thanks Vcoc for noting skill book result not showing for all in area
@@ -101,6 +101,7 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
monster.aggroClearDamages();
monster.aggroMonsterDamage(chr, 1);
// thanks onechord for pointing out Magnet disconnecting the caster (issue would actually happen upon failing to catch mob)
monster.aggroSwitchController(chr, true);
}
}
@@ -133,12 +134,20 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
} else {
skill.getEffect(skillLevel).applyEchoOfHero(chr);
}
} else if(chr.canDoor()) {
//update door lists
chr.cancelMagicDoor();
skill.getEffect(skillLevel).applyTo(chr, pos);
} else {
chr.message("Please wait 5 seconds before casting Mystic Door again.");
if (c.tryacquireClient()) {
try {
if (chr.canDoor()) {
chr.cancelMagicDoor();
skill.getEffect(skillLevel).applyTo(chr, pos);
} else {
chr.message("Please wait 5 seconds before casting Mystic Door again.");
}
} finally {
c.releaseClient();
}
}
c.announce(MaplePacketCreator.enableActions());
}
} else {
@@ -130,7 +130,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
if (victim != null) {
MapleMap targetMap = victim.getMap();
if (!FieldLimit.CANNOTVIPROCK.check(targetMap.getFieldLimit()) && (targetMap.getForcedReturnId() == 999999999 || targetMap.getId() < 100000000)) {
if (victim.gmLevel() <= player.gmLevel()) {
if (!victim.isGM() || victim.gmLevel() <= player.gmLevel()) { // thanks Yoboes for noticing non-GM's being unreachable through rocks
player.forceChangeMap(targetMap, targetMap.findClosestPlayerSpawnpoint(victim.getPosition()));
success = true;
} else {
@@ -1,14 +0,0 @@
package net.server.channel.handlers;
import client.MapleClient;
import net.AbstractMaplePacketHandler;
import tools.data.input.SeekableLittleEndianAccessor;
import tools.MaplePacketCreator;
public final class UseItemCanvasHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.announce(MaplePacketCreator.enableActions());
}
}
@@ -64,6 +64,10 @@ public class MaplePartySearchCoordinator {
private Map<Integer, MapleCharacter> searchLeaders = new HashMap<>();
private Map<Integer, LeaderSearchMetadata> searchSettings = new HashMap<>();
private Map<MapleCharacter, LeaderSearchMetadata> timeoutLeaders = new HashMap<>();
private int updateCount = 0;
private static Map<Integer, Set<Integer>> mapNeighbors = fetchNeighbouringMaps();
private static Map<Integer, MapleJob> jobTable = instantiateJobTable();
@@ -245,11 +249,21 @@ public class MaplePartySearchCoordinator {
addQueueLeader(leader);
}
private void registerPartyLeader(MapleCharacter leader, LeaderSearchMetadata settings) {
if (searchLeaders.containsKey(leader.getId())) return;
searchSettings.put(leader.getId(), settings);
searchLeaders.put(leader.getId(), leader);
addQueueLeader(leader);
}
public void unregisterPartyLeader(MapleCharacter leader) {
MapleCharacter toRemove = searchLeaders.remove(leader.getId());
if (toRemove != null) {
removeQueueLeader(toRemove);
searchSettings.remove(leader.getId());
} else {
unregisterLongTermPartyLeader(leader);
}
}
@@ -307,6 +321,41 @@ public class MaplePartySearchCoordinator {
return new Pair<>(queuedLeaders, nextLeaders);
}
private void registerLongTermPartyLeaders(List<Pair<MapleCharacter, LeaderSearchMetadata>> recycledLeaders) {
leaderQueueRLock.lock();
try {
for (Pair<MapleCharacter, LeaderSearchMetadata> p : recycledLeaders) {
timeoutLeaders.put(p.getLeft(), p.getRight());
}
} finally {
leaderQueueRLock.unlock();
}
}
private void unregisterLongTermPartyLeader(MapleCharacter leader) {
leaderQueueRLock.lock();
try {
timeoutLeaders.remove(leader);
} finally {
leaderQueueRLock.unlock();
}
}
private void reinstateLongTermPartyLeaders() {
Map<MapleCharacter, LeaderSearchMetadata> timeoutLeadersCopy;
leaderQueueWLock.lock();
try {
timeoutLeadersCopy = new HashMap<>(timeoutLeaders);
timeoutLeaders.clear();
} finally {
leaderQueueWLock.unlock();
}
for (Entry<MapleCharacter, LeaderSearchMetadata> e : timeoutLeadersCopy.entrySet()) {
registerPartyLeader(e.getKey(), e.getValue());
}
}
public void runPartySearch() {
Pair<List<MapleCharacter>, List<MapleCharacter>> queuedLeaders = fetchQueuedLeaders();
@@ -356,10 +405,28 @@ public class MaplePartySearchCoordinator {
}
}
List<Pair<MapleCharacter, LeaderSearchMetadata>> recycledLeaders = new LinkedList<>();
for (MapleCharacter leader : expiredLeaders) {
if (leader.isLoggedinWorld()) leader.dropMessage(5, "Your Party Search token session expired, please stop your Party Search and retry again later.");
searchLeaders.remove(leader.getId());
searchSettings.remove(leader.getId());
LeaderSearchMetadata settings = searchSettings.remove(leader.getId());
if (leader.isLoggedinWorld()) {
if (settings != null) {
recycledLeaders.add(new Pair<>(leader, settings));
if (ServerConstants.USE_DEBUG && leader.isGM()) leader.dropMessage(5, "Your Party Search token session is now on waiting queue for up to 7 minutes, to get it working right away please stop your Party Search and retry again later.");
} else {
leader.dropMessage(5, "Your Party Search token session expired, please stop your Party Search and retry again later.");
}
}
}
if (!recycledLeaders.isEmpty()) {
registerLongTermPartyLeaders(recycledLeaders);
}
updateCount++;
if (updateCount % 77 == 0) {
reinstateLongTermPartyLeaders();
}
}
@@ -37,7 +37,7 @@ public final class AfterLoginHandler extends AbstractMaplePacketHandler {
c3 = slea.readByte();
}
if (c2 == 1 && c3 == 1) {
if (c.getPin() == null) {
if (c.getPin() == null || c.getPin().equals("")) {
c.announce(MaplePacketCreator.registerPin());
} else {
c.announce(MaplePacketCreator.requestPin());
@@ -457,6 +457,64 @@ public class AbstractPlayerInteraction {
getClient().announce(MaplePacketCreator.updateQuest(getPlayer().getQuest(MapleQuest.getInstance(qid)), false));
}
public boolean forceStartQuest(int id) {
return forceStartQuest(id, 9010000);
}
public boolean forceStartQuest(int id, int npc) {
return startQuest(id, npc);
}
public boolean forceCompleteQuest(int id) {
return forceCompleteQuest(id, 9010000);
}
public boolean forceCompleteQuest(int id, int npc) {
return completeQuest(id, npc);
}
public boolean startQuest(short id) {
return startQuest((int) id);
}
public boolean completeQuest(short id) {
return completeQuest((int) id);
}
public boolean startQuest(int id) {
return startQuest(id, 9010000);
}
public boolean completeQuest(int id) {
return completeQuest(id, 9010000);
}
public boolean startQuest(short id, int npcId) {
return startQuest((int) id, npcId);
}
public boolean completeQuest(short id, int npcId) {
return completeQuest((int) id, npcId);
}
public boolean startQuest(int id, int npcId) {
try {
return MapleQuest.getInstance(id).forceStart(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
return false;
}
}
public boolean completeQuest(int id, int npcId) {
try {
return MapleQuest.getInstance(id).forceComplete(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
return false;
}
}
public Item evolvePet(byte slot, int afterId) {
MaplePet evolved = null;
MaplePet target;
+37 -60
View File
@@ -63,9 +63,11 @@ import constants.LanguageConstants;
import net.server.PlayerStorage;
import net.server.channel.Channel;
import net.server.coordinator.matchchecker.MatchCheckerListenerFactory.MatchCheckerType;
import server.MapleMarriage;
import server.MapleSkillbookInformationProvider;
import server.MapleSkillbookInformationProvider.SkillBookEntry;
import server.TimerManager;
import server.life.MapleLifeFactory;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.expeditions.MapleExpedition;
@@ -77,10 +79,11 @@ import tools.packets.Wedding;
import java.awt.Point;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import server.MapleMarriage;
/**
*
@@ -95,6 +98,18 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
private boolean itemScript;
private List<MaplePartyCharacter> otherParty;
private static Map<Integer, String> npcDefaultTalks = new HashMap<>();
private static String getDefaultTalk(int npcid) {
String talk = npcDefaultTalks.get(npcid);
if (talk == null) {
talk = MapleLifeFactory.getNPCDefaultTalk(npcid);
npcDefaultTalks.put(npcid, talk);
}
return talk;
}
public NPCConversationManager(MapleClient c, int npc, String scriptName) {
this(c, npc, -1, scriptName, false);
}
@@ -154,6 +169,10 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
public void sendOk(String text) {
getClient().announce(MaplePacketCreator.getNPCTalk(npc, (byte) 0, text, "00 00", (byte) 0));
}
public void sendDefault() {
sendOk(getDefaultTalk(npc));
}
public void sendYesNo(String text) {
getClient().announce(MaplePacketCreator.getNPCTalk(npc, (byte) 1, text, "", (byte) 0));
@@ -236,76 +255,34 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
return getPlayer().getJob();
}
public void startQuest(short id) {
try {
MapleQuest.getInstance(id).forceStart(getPlayer(), npc);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
public void completeQuest(short id) {
try {
MapleQuest.getInstance(id).forceComplete(getPlayer(), npc);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
@Override
public boolean forceStartQuest(int id) {
return MapleQuest.getInstance(id).forceStart(getPlayer(), npc);
return forceStartQuest(id, npc);
}
@Override
public boolean forceCompleteQuest(int id) {
return MapleQuest.getInstance(id).forceComplete(getPlayer(), npc);
return forceCompleteQuest(id, npc);
}
public void startQuest(int id) {
try {
MapleQuest.getInstance(id).forceStart(getPlayer(), npc);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
public void completeQuest(int id) {
try {
MapleQuest.getInstance(id).forceComplete(getPlayer(), npc);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
public void startQuest(short id, int npcId) {
try {
MapleQuest.getInstance(id).forceStart(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
@Override
public boolean startQuest(short id) {
return startQuest((int) id);
}
public void startQuest(int id, int npcId) {
try {
MapleQuest.getInstance(id).forceStart(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
@Override
public boolean completeQuest(short id) {
return completeQuest((int) id);
}
public void completeQuest(short id, int npcId) {
try {
MapleQuest.getInstance(id).forceComplete(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
@Override
public boolean startQuest(int id) {
return startQuest(id, npc);
}
public void completeQuest(int id, int npcId) {
try {
MapleQuest.getInstance(id).forceComplete(getPlayer(), npcId);
} catch (NullPointerException ex) {
ex.printStackTrace();
}
@Override
public boolean completeQuest(int id) {
return completeQuest(id, npc);
}
public int getMeso() {
+2 -9
View File
@@ -92,14 +92,8 @@ public class NPCScriptManager extends AbstractScriptManager {
cms.put(c, cm);
Invocable iv = null;
iv = getInvocable("npc/" + filename + ".js", c);
NPCScriptManager npcsm = NPCScriptManager.getInstance();
if (iv == null || NPCScriptManager.getInstance() == null) {
c.getPlayer().dropMessage(1, npc + "");
cm.dispose();
return;
}
if (iv == null || npcsm == null) {
if (iv == null) {
c.getPlayer().dropMessage(1, npc + "");
cm.dispose();
return;
@@ -147,7 +141,7 @@ public class NPCScriptManager extends AbstractScriptManager {
iv = getInvocable("npc/" + npc + ".js", c);
cm.resetItemScript();
}
if (iv == null || NPCScriptManager.getInstance() == null) {
if (iv == null) {
dispose(c);
return false;
}
@@ -166,7 +160,6 @@ public class NPCScriptManager extends AbstractScriptManager {
} else {
c.announce(MaplePacketCreator.enableActions());
}
return true;
} catch (final UndeclaredThrowableException | ScriptException ute) {
FilePrinter.printError(FilePrinter.NPC + npc + ".txt", ute);
@@ -82,22 +82,6 @@ public class PortalPlayerInteraction extends AbstractPlayerInteraction {
return getPlayer().getLevel() >= 30;
}
public boolean forceStartQuest(int id) {
return forceStartQuest(id, 9010000);
}
public boolean forceStartQuest(int id, int npc) {
return MapleQuest.getInstance(id).forceStart(getPlayer(), npc);
}
public boolean forceCompleteQuest(int id) {
return forceCompleteQuest(id, 9010000);
}
public boolean forceCompleteQuest(int id, int npc) {
return MapleQuest.getInstance(id).forceComplete(getPlayer(), npc);
}
public void blockPortal() {
c.getPlayer().blockPortal(getPortal().getScriptName());
}
+45 -9
View File
@@ -136,6 +136,7 @@ public class MapleItemInformationProvider {
protected Map<Integer, Map<String, Integer>> skillUpgradeCache = new HashMap<>();
protected Map<Integer, MapleData> skillUpgradeInfoCache = new HashMap<>();
protected Map<Integer, Pair<Integer, Set<Integer>>> cashPetFoodCache = new HashMap<>();
protected Map<Integer, QuestConsItem> questItemConsCache = new HashMap<>();
private MapleItemInformationProvider() {
loadCardIdData();
@@ -1377,12 +1378,6 @@ public class MapleItemInformationProvider {
return partyquestItem;
}
public int getQuestIdFromItem(int itemId) {
MapleData data = getItemData(itemId);
int questItem = MapleDataTool.getIntConvert("info/quest", data, 0);
return questItem;
}
private void loadCardIdData() {
PreparedStatement ps = null;
ResultSet rs = null;
@@ -1436,9 +1431,10 @@ public class MapleItemInformationProvider {
if ((itemId / 10000) != 243) {
return null;
}
ScriptedItem script = new ScriptedItem(MapleDataTool.getInt("spec/npc", getItemData(itemId), 0),
MapleDataTool.getString("spec/script", getItemData(itemId), ""),
MapleDataTool.getInt("spec/runOnPickup", getItemData(itemId), 0) == 1);
MapleData itemInfo = getItemData(itemId);
ScriptedItem script = new ScriptedItem(MapleDataTool.getInt("spec/npc", itemInfo, 0),
MapleDataTool.getString("spec/script", itemInfo, ""),
MapleDataTool.getInt("spec/runOnPickup", itemInfo, 0) == 1);
scriptedItemCache.put(itemId, script);
return scriptedItemCache.get(itemId);
}
@@ -2121,6 +2117,35 @@ public class MapleItemInformationProvider {
return skillbook;
}
public final QuestConsItem getQuestConsumablesInfo(final int itemId) {
if (questItemConsCache.containsKey(itemId)) {
return questItemConsCache.get(itemId);
}
MapleData data = getItemData(itemId);
MapleData infoData = data.getChildByPath("info");
MapleData ciData = infoData.getChildByPath("consumeItem");
QuestConsItem qcItem = null;
if (ciData != null) {
qcItem = new QuestConsItem();
qcItem.exp = MapleDataTool.getInt("exp", infoData);
qcItem.grade = MapleDataTool.getInt("grade", infoData);
qcItem.questid = MapleDataTool.getInt("questId", infoData);
qcItem.items = new HashMap<>(2);
Map<Integer, Integer> cItems = qcItem.items;
for (MapleData ciItem : ciData.getChildren()) {
int itemid = MapleDataTool.getInt("0", ciItem);
int qty = MapleDataTool.getInt("1", ciItem);
cItems.put(itemid, qty);
}
}
questItemConsCache.put(itemId, qcItem);
return qcItem;
}
public class ScriptedItem {
@@ -2153,4 +2178,15 @@ public class MapleItemInformationProvider {
public short prob, quantity;
public String effect, worldmsg;
}
public static final class QuestConsItem {
public int questid, exp, grade;
public Map<Integer, Integer> items;
public Integer getItemRequirement(int itemid) {
return items.get(itemid);
}
}
}
-2
View File
@@ -1045,8 +1045,6 @@ public class MapleStatEffect {
door.getTarget().spawnDoor(door.getAreaDoor());
door.getTown().spawnDoor(door.getTownDoor());
applyto.disableDoorSpawn();
} else {
MapleInventoryManipulator.addFromDrop(applyto.getClient(), new Item(4006000, (short) 0, (short) 1), false);
+65
View File
@@ -0,0 +1,65 @@
package server.gachapon;
/**
*
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class ElNath extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
/* Scroll */
2041012, 2048003, 2043800, 2043301, 2040301, 2043101, 2043201, 2043001, 2044301, 2043801, 2044201, 2043701, 2044502,
2041011, 2041014, 2044602, 2043302, 2043202, 2043002, 2048005, 2044402, 2044302, 2043802, 2044102, 2044202, 2043702,
2044812,
/* Useable drop */
2000004, 2000005,
/* Common equipment */
1402010, 1032003, 1442013, 1432009, 1302022, 1302029, 1322021, 1302026, 1442017, 1322023, 1102011, 1032008, 1322026,
1442016, 1312000, 1032007, 1322025, 1322027, 1032020, 1442015, 1432017, 1302027, 1302049, 1372006, 1032022, 1032021,
1372004, 1332020, 1322007, 1032006, 1302028, 1322003, 1302007, 1092030, 1302021, 1322024, 1322012, 1032005, 1322022,
1032013, 1302025, 1302013, 1032017, 1032002, 1032001, 1302017, 1432018, 1442012, 1302000, 1032000, 1102013, 1442022,
1372005, 1442021, 1032009, 1302016,
/* Warrior equipment */
1442003, 1312007, 1402008, 1312008, 1412008, 1442009, 1302004, 1312006, 1442016, 1402012, 1302003, 1312005, 1432002,
1432001, 1302008, 1040030, 1402015, 1322015, 1432006, 1322002, 1302010, 1322017, 1402003, 1402006, 1322000, 1422001,
1442001, 1422004, 1412004, 1322009, 1322011, 1442000, 1412005, 1402002, 1432004, 1442010, 1422008, 1442007, 1422009,
1322019, 1412003, 1412007, 1302009, 1412000, 1322014, 1402001, 1402007, 1432005,
/* Magician equipment */
1382001, 1372007, 1382010, 1382007, 1372000, 1372003, 1382011, 1382006, 1382000,
/* Bowman equipment */
1452004, 1452000, 1452010, 1452015, 1452014, 1462012, 1462010, 1452017, 1462000, 1452008, 1452006, 1462006, 1452007,
1452002, 1402001,
/* Thief equipment */
1472006, 1472010, 1332022, 1332011, 1472015, 1472016, 1472023, 1472028, 1472022, 1472011, 1472026, 1332024, 1332009,
1472017, 1472013, 1472029, 1472021, 1332015, 1332031, 1332023, 1332004, 1472000, 1332019, 1472027, 1332018, 1472007,
1332012, 1332016, 1472024, 1332017, 1332003, 1472012, 1472014, 1472005, 1472018, 1472001,
/* Pirate equipment */
1072294, 1492009
};
}
@Override
public int[] getUncommonItems() {
return new int [] {2022439, 2040804, 2040805, 2340000};
}
@Override
public int[] getRareItems() {
return new int [] {2043803, 1102085};
}
}
+42 -80
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class Ellinia extends GachaponItems {
@@ -10,95 +13,54 @@ public class Ellinia extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int[] {
//warriorEquips = {
1082025, 1060028, 1051011, 1060016, 1051001,
1422001, 1002025, 1082000, 1302002, 1412012,
//magicianEquips = {
1002013, 1002016, 1002017, 1002034, 1002035,
1002036, 1002037, 1002038, 1002064, 1002065,
1002072, 1002073, 1002074, 1002075, 1002102,
1002103, 1002104, 1002105, 1002106, 1002141,
1002142, 1002143, 1002144, 1002145, 1002151,
1002152, 1002153, 1002154, 1002155, 1002215,
1002216, 1002217, 1002218, 1002242, 1002243,
1002244, 1002245, 1002246, 1002252, 1002253,
1002254, 1002271, 1002272, 1002273, 1002274,
1002363, 1002364, 1002365, 1002366, 1002398,
1002399, 1002400, 1002401, 1002579, 1002773,
1040004, 1040017, 1040018,
1040019, 1040020, 1041015, 1041016, 1041017,
1041018, 1041025, 1041026, 1041029, 1041030,
1041031, 1041041, 1041042, 1041043, 1041051,
1041052, 1041053, 1050001, 1050002, 1050003,
1050008, 1050009, 1050010, 1050023, 1050024,
1050025, 1050026, 1050027, 1050028, 1050029,
1050030, 1050031, 1050035, 1050036, 1050037,
1050038, 1050039, 1050045, 1050046, 1050047,
1050048, 1050049, 1050053, 1050054, 1050055,
1050056, 1050067, 1050068, 1050069, 1050070,
1050072, 1050073, 1050074, 1050092, 1050093,
1050094, 1050095, 1050102, 1050103, 1050104,
1050105, 1051003, 1051004, 1051005, 1051023,
1051024, 1051025, 1051026, 1051027, 1051030,
1051031, 1051032, 1051033, 1051034, 1051044,
1051045, 1051046, 1051047, 1051052, 1051053,
1051054, 1051055, 1051056, 1051057, 1051058,
1051094, 1051095, 1051096, 1051097, 1051101,
1051102, 1051103, 1051104, 1052076,
1060012, 1060013, 1060014, 1060015,
1061010, 1061011, 1061012, 1061013, 1061021,
1061022, 1061027, 1061028, 1061034, 1061035,
1061036, 1061047, 1061048, 1061049, 1072006,
1072019, 1072020, 1072021, 1072023, 1072024,
1072044, 1072045, 1072072, 1072073, 1072074,
1072075, 1072076, 1072077, 1072078, 1072089,
1072090, 1072091, 1072114, 1072115, 1072116,
1072117, 1072136, 1072137, 1072138, 1072139,
1072140, 1072141, 1072142, 1072143, 1072157,
1072158, 1072159, 1072160, 1072169, 1072177,
1072178, 1072179, 1072206, 1072207, 1072208,
1072209, 1072223, 1072224, 1072225, 1072226,
1072268, 1082019, 1082020,
1082021, 1082022, 1082026, 1082027, 1082028,
1082051, 1082052, 1082053, 1082054, 1082055,
1082056, 1082062, 1082063, 1082064, 1082080,
1082081, 1082082, 1082086, 1082087, 1082088,
1082098, 1082099, 1082100, 1082121, 1082122,
1082123, 1082131, 1082132, 1082133, 1082134,
1082151, 1082152, 1082153, 1082154, 1082164,
1092021, 1092029, 1092057,
1372000, 1372001, 1372002, 1372003, 1372004,
1372007, 1372008, 1372009, 1372010, 1372011,
1372012, 1372014, 1372015, 1372016, 1372032,
1382000, 1382001, 1382002, 1382003, 1382004,
1382005, 1382006, 1382007, 1382008, 1382010,
1382011, 1382014, 1382015, 1382016, 1382017,
1382018, 1382019, 1382035, 1382036, 1382037,
1382041, 1382053, 1382054, 1382055, 1382056,
1382060,
//bowmanEquips = {
1040003, 1462005, 1002157, 1002119, 1062002,
1062004, 1041083, 1061082, 1082017, 1041061,
//thiefEquips = {
1002174, 1040063, 1072108, 1082044, 1061071,
1060052, 1072029, 1472002, 1082031, 1060023,
//pirateEquips = {
/* Scroll */
2043302, 2040002, 2043102, 2043002, 2044402, 2044302, 2043802, 2044002, 2041017, 2044902,
/* Useable drop */
2000004, 2000005, 2022025, 2022026,
/* Common equipment */
1402010, 1442013, 1432009, 1002060, 1002063, 1322023, 1002042, 1050018, 1082147, 1002026, 1002392, 1062024, 1442016, 1322025,
1322027, 1302027, 1372006, 1302019, 1092022, 1302021, 1041004, 1002395, 1322024, 1082148, 1002012, 1322012, 1032028, 1102012,
1322022, 1051017, 1302013, 1082146, 1442014, 1302017, 1102013, 1102003, 1002041, 1002097, 1302016, 1082145,
/* Warrior equipment */
1412006, 1040029, 1040086, 1050005, 1060028, 1002059, 1060008, 1061088, 1402012, 1302003, 1432002, 1312011, 1302008, 1040030,
1002004, 1402015, 1322028, 1322015, 1432006, 1442006, 1322000, 1002085, 1002056, 1092013, 1002058, 1002050, 1060011, 1322009,
1322011, 1442000, 1051011, 1061016, 1060018, 1041024, 1061020, 1302005, 1402002, 1002030, 1092004, 1041023, 1422008, 1060009,
1051000, 1002021, 1442005, 1412003, 1412007, 1422007, 1302009, 1402000, 1402001, 1402007, 1432005,
/* Magician equipment */
1382001, 1002037, 1060014, 1040018, 1061027, 1050002, 1002152, 1051027, 1050035, 1050056, 1051047, 1051030, 1002274, 1050074,
1002218, 1002254, 1082088, 1382007, 1002013, 1082087, 1372008, 1382008, 1372002, 1372003, 1382011, 1382004, 1050047, 1040019,
1041041, 1061034, 1041051, 1051045, 1051024, 1082081, 1041030, 1040018, 1002073, 1382003, 1082086, 1382014, 1050055, 1050025,
1002155, 1060015,
/* Bowman equipment */
1452004, 1462003, 1060070, 1002118, 1061058, 1040003, 1002160, 1002121, 1040068, 1061063, 1040080, 1462004, 1041008, 1061006,
1061009, 1040022, 1002168, 1040067, 1060056, 1041054, 1041067, 1060063, 1002213, 1002119, 1462005, 1452001, 1462000, 1040025,
1002166, 1002161, 1040069, 1051039, 1452006, 1462006, 1452007, 1402001, 1041062,
/* Thief equipment */
1472010, 1472006, 1332011, 1472031, 1041048, 1472019, 1041095, 1040095, 1002128, 1061077, 1060025, 1041040, 1061033, 1472028,
1472022, 1472011, 1040096, 1062002, 1002129, 1472026, 1332009, 1060043, 1002249, 1472021, 1040084, 1332015, 1002173, 1002148,
1332004, 1332018, 1472009, 1061069, 1002176, 1041044, 1061037, 1060032, 1472020, 1040060, 1472018, 1332013, 1332002, 1402001,
/* Pirate equipment */
1002625, 1002616, 1482005, 1052098, 1482003,
1482001, 1492004, 1002622, 1492005, 1082195
};
};
}
@Override
public int[] getUncommonItems() {
return new int [] { 1372035, 1372036, 1372037, 1372038, 1372039,
1372040, 1372041, 1372042, 1382045, 1382046,
1382047, 1382048, 1382049, 1382050, 1382051,
1382052 };
return new int [] {1082149, 1002391, 1002419};
}
@Override
public int[] getRareItems() {
return new int [] {1382059, 1382057, 1072362, 1002791, 1052161, 1082240};
return new int [] {};
}
}
+19 -32
View File
@@ -3,6 +3,7 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Ronan - added ores, reworked global loots
*/
public class Global extends GachaponItems {
@@ -10,50 +11,36 @@ public class Global extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int[] {
/* Gloves */ 1082002, 1082147, 1082148, 1082146, 1082145, 1082150,
/* Capes */ 1102040, 1102043, 1102087, 1102079, 1102080, 1102081, 1102082, 1102083, 1102053, 1102054,
1102055, 1102056, 1102176, 1102177, 1102178, 1102179, 1102000, 1102001, 1102002, 1102003,
1102004, 1102011, 1102012, 1102013, 1102014, 1102015, 1102016, 1102017, 1102018, 1102021,
1102022, 1102023, 1102024, 1102026, 1102027, 1102028,
/* Tube Eqp */ 1322026, 1322025, 1322024, 1322022, 1322021,
/* Umbrellas */ 1302026, 1302027, 1302028, 1302017,
/* Snowboards */ 1442017, 1442016, 1442014, 1442012,
/* Skis */ 1432017, 1432016, 1432015,
/* Beginner Eqp */ 1442018, 1422011,
/* Potions */ 2000004, 2000005, 2001002, 2001001, 2020012, 2020013, 2020014, 2020015, 2022182, 2022245,
2022284, 2022285, 2022439,
/* Other Scrolls */ 2049000, 2049001, 2049002, 2041058, 2040727,
/* 10% Scrolls */ 2041002, 2040402, 2040702, 2040805, 2040026, 2040031, 2040318, 2040323, 2040328, 2040419,
2040422, 2040427, 2040534, 2040619, 2040622, 2040627, 2040825, 2040925, 2040928, 2040933,
2040016,
/* 60% Scrolls */ 2040001, 2040321, 2040425, 2040625, 2040931, 2048013, 2040025, 2040326, 2040532, 2040824,
2048010, 2040029, 2040418, 2040618, 2040924, 2048011, 2040317, 2040421, 2040621, 2040927,
2048012,
/* 100% Scrolls */ 2040923, 2040027, 2040417, 2040617, 2040000, 2040202, 2040400, 2040512, 2040700, 2040803,
2041000, 2041012, 2048000, 2040926, 2040316, 2040420, 2040620, 2040003, 2040207, 2040414,
2040515, 2040703, 2040818, 2041003, 2041015, 2048003, 2040929, 2040319, 2040423, 2040623,
2040102, 2040300, 2040500, 2040600, 2040706, 2040900, 2041006, 2041018, 2040024, 2040324,
2040530, 2040823, 2040107, 2040312, 2040503, 2040614, 2040800, 2040918, 2041009, 2041021
/* Potions */
2000004, 2000005, 2001002, 2001001, 2020012, 2020013, 2020014, 2020015,
/* Ores */
4004000, 4004001, 4004002, 4004003, 4004004,
4006000, 4006001,
4010000, 4010001, 4010002, 4010003, 4010004, 4010005, 4010006, 4010007,
4020000, 4020001, 4020002, 4020003, 4020004, 4020005, 4020006, 4020007, 4020008
};
}
@Override
public int[] getUncommonItems() {
return new int[] {
/* Capes */ 1102180,
/* Potions */ 2022179, 2022273, 2022282, 2022283,
/* Scrolls */ 2049003,
/* Skis */ 1432018
/* Potions */
2022179, 2022273, 2022282, 2022283, 2022285, 2022245, 2022182,
/* Scrolls */
2049003
};
}
@Override
public int[] getRareItems() {
return new int[] {
/* Gloves */ 1082149,
/* Capes */ 1102041, 1102042, 1102084, 1102085,
/* Scrolls */ 2049100, 2340000,
/* Chairs */ 3010046, 3010047
/* Scrolls */
2049100, 2340000,
/* Chairs */
3010063, 3010064
};
}
+39 -18
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class Henesys extends GachaponItems {
@@ -10,31 +13,49 @@ public class Henesys extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
/* Common Eqps */ 1432009, 1302022, 1322027, 1062000, 1002033, 1092022, 1302021, 1322009, 1002012, 1322012,
/* Warrior Eqps */ 1312007, 1002093, 1051016, 1040030, 1060009, 1060000, 1082025, 1402002, 1092000, 1072041,
/* Mage Equips */ 1051023, 1002035, 1061028, 1040019, 1002152, 1002155, 1041018, 1050031, 1002102, 1082028,
/* Bowman Equips */ 1002010, 1002057, 1002112, 1002113, 1002114, 1002115, 1002116, 1002117, 1002118, 1002119,
1002120, 1002121, 1002135, 1002136, 1002137, 1002138, 1002139, 1002156, 1002157, 1002158,
1002159, 1002160, 1002161, 1002162, 1002163, 1002164, 1002165, 1002166, 1002167, 1002168,
1002169, 1002170, 1002211, 1002212, 1002213, 1002214, 1002267, 1002268, 1002269, 1002270,
1002275, 1002276, 1002277, 1002278, 1002286, 1002287, 1002288, 1002289, 1002402, 1002403,
1002404, 1002405, 1002406, 1002407, 1002408, 1002580, 1002749
};
/* Scroll */
2040001, 2041002, 2040702, 2043802, 2040402, 2043702, 2044813,
/* Useable Drops */
2000004, 2000005, 2020012, 2030007,
/* Common equipment */
1432009, 1302022, 1322021, 1302026, 1442017, 1082147, 1102043, 1322026, 1442016, 1402012, 1322025, 1322027, 1302027,
1312012, 1062000, 1332020, 1302028, 1372002, 1002033, 1092022, 1302021, 1322009, 1322024, 1082148, 1002012, 1322012,
1322022, 1002020, 1302013, 1082146, 1442014, 1002096, 1302017, 1442012,
/* Warrior equipment */
1092011, 1092014, 1302003, 1432001, 1312011, 1002088, 1041020, 1322015, 1442004, 1422008, 1302056, 1432000, 1442005,
/* Magician equipment */
1382001, 1041053, 1041029, 1050053, 1051032, 1050073, 1061036, 1002253, 1002034, 1051025, 1050067, 1051052, 1002072,
1002144, 1051054, 1050069, 1372007, 1050056, 1050074, 1002254, 1002274, 1002218, 1051055, 1382010, 1002246, 1050039,
1382007, 1372000, 1002013, 1050072, 1002036, 1002244, 1372008, 1382008, 1382011, 1092021, 1051034, 1050047, 1040019,
1041031, 1051033, 1002153, 1002252, 1051024, 1051053, 1050068, 1382003, 1382006, 1050055, 1051031, 1050025, 1002155,
1002245, 1372001,
/* Bowman equipment */
1452004, 1452023, 1060057, 1432001, 1040071, 1002137, 1462009, 1452017, 1040025, 1041027, 1452005, 1452007, 1061057,
/* Thief equipment */
1472006, 1472019, 1060084, 1472028, 1472004, 1002179, 1082074, 1472029, 1040100, 1332015, 1432001, 1040097, 1060071,
1472007, 1472002, 1051009, 1041044, 1041003, 1332016, 1472020, 1332003,
/* Pirate equipment */
1002622, 1082204, 1082213, 1082198, 1002631, 1052122, 1482012, 1052131, 1482007, 1482004, 1072318, 1492007
};
}
@Override
public int[] getUncommonItems() {
return new int[] {
/* 110 Equips */ 1002547
};
return new int[] {2040805, 1102041, 1102042, 1442018};
}
@Override
public int[] getRareItems() {
return new int[] {
/* Reverse Eqps */ 1002792,
1462052, 1462053, 1462054, 1462055,
};
return new int[] {};
}
}
+37 -99
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class KerningCity extends GachaponItems {
@@ -10,112 +13,47 @@ public class KerningCity extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
//warriorEquips = {
1002023, 1082001, 1041084, 1060017, 1422008,
1402018, 1060019, 1072047, 1040009, 1060060,
//magicianEquips = {
1050029, 1072045, 1050028, 1372001, 1051024,
1061049, 1072091, 1041030, 1041042, 1002036,
//bowmanEquips = {
1072103, 1072034, 1072069, 1062004, 1082050,
1040003, 1061064, 1040074, 1061051, 1040079,
//thiefEquips = {
1002107, 1002108, 1002109, 1002110, 1002111,
1002122, 1002123, 1002124, 1002125, 1002126,
1002127, 1002128, 1002129, 1002130, 1002131,
1002146, 1002147, 1002148, 1002149, 1002150,
1002171, 1002172, 1002173, 1002174, 1002175,
1002176, 1002177, 1002178, 1002179, 1002180,
1002181, 1002182, 1002183, 1002184, 1002185,
1002207, 1002208, 1002209, 1002210, 1002247,
1002248, 1002249, 1002281, 1002282, 1002283,
1002284, 1002285, 1002323, 1002324, 1002325,
1002326, 1002327, 1002328, 1002329, 1002330,
1002380, 1002381, 1002382, 1002383, 1002550,
1002577, 1002656, 1002750,
1040031, 1040032, 1040033, 1040034, 1040035,
1040042, 1040043, 1040044, 1040048, 1040049,
1040050, 1040057, 1040058, 1040059, 1040060,
1040061, 1040062, 1040063, 1040082, 1040083,
1040084, 1040094, 1040095, 1040096, 1040097,
1040098, 1040099, 1040100, 1040105, 1040106,
1040107, 1040108, 1040109, 1040110, 1040115,
1040116, 1040117, 1040118, 1041003, 1041036,
1041037, 1041038, 1041039, 1041040, 1041044,
1041045, 1041047, 1041048, 1041049, 1041050,
1041057, 1041058, 1041059, 1041060, 1041074,
1041075, 1041076, 1041077, 1041078, 1041079,
1041080, 1041094, 1041095, 1041096, 1041100,
1041101, 1041102, 1041103, 1041105, 1041106,
1041107, 1041115, 1041116, 1041117, 1041118,
1050096, 1050097, 1050098, 1050099, 1051006,
1051007, 1051008, 1051009, 1051090, 1051091,
1051092, 1051093, 1052072, 1052163,
1060021, 1060022, 1060023, 1060024, 1060025,
1060031, 1060032, 1060033, 1060037, 1060038,
1060039, 1060043, 1060044, 1060045, 1060046,
1060050, 1060051, 1060052, 1060071, 1060072,
1060073, 1060083, 1060084, 1060085, 1060086,
1060087, 1060088, 1060089, 1060093, 1060094,
1060095, 1060097, 1060098, 1060099, 1060104,
1060105, 1060106, 1060107, 1061003, 1061029,
1061030, 1061031, 1061032, 1061033, 1061037,
1061038, 1061040, 1061041, 1061042, 1061043,
1061044, 1061045, 1061046, 1061053, 1061054,
1061055, 1061056, 1061069, 1061070, 1061071,
1061076, 1061077, 1061078, 1061079, 1061093,
1061094, 1061095, 1061099, 1061100, 1061101,
1061102, 1061104, 1061105, 1061106, 1061114,
1061115, 1061116, 1061117, 1072022, 1072028,
1072029, 1072030, 1072031, 1072032, 1072033,
1072035, 1072036, 1072065, 1072066, 1072070,
1072071, 1072084, 1072085, 1072086, 1072087,
1072104, 1072105, 1072106, 1072107, 1072108,
1072109, 1072110, 1072128, 1072129, 1072130,
1072131, 1072150, 1072151, 1072152, 1072161,
1072162, 1072163, 1072171, 1072172, 1072173,
1072174, 1072192, 1072193, 1072194, 1072195,
1072213, 1072214, 1072215, 1072216, 1072272,
1072346, 1082029, 1082030,
1082031, 1082032, 1082033, 1082034, 1082037,
1082038, 1082039, 1082042, 1082043, 1082044,
1082045, 1082046, 1082047, 1082065, 1082066,
1082067, 1082074, 1082075, 1082076, 1082092,
1082093, 1082094, 1082095, 1082096, 1082097,
1082118, 1082119, 1082120, 1082135, 1082136,
1082137, 1082138, 1082142, 1082143, 1082144,
1082167, 1082242, 1092018, 1092019,
1092020, 1302001,
1312002, 1332000, 1332001, 1332002, 1332003,
1332004, 1332011, 1332012, 1332013, 1332014,
1332015, 1332018, 1332023, 1332024, 1332027,
1332031, 1332050, 1332052, 1332054,
1332067, 1332068, 1332069, 1332070, 1332071,
1332072, 1332077,
1472000, 1472001, 1472002,
1472003, 1472004, 1472005, 1472006, 1472007,
1472008, 1472009, 1472010, 1472011, 1472012,
1472013, 1472014, 1472015, 1472016, 1472017,
1472018, 1472019, 1472020, 1472021, 1472022,
1472023, 1472024, 1472025, 1472026, 1472027,
1472028, 1472029, 1472031, 1472033, 1472051,
1472052,
1472069, 1472072, 1472074,
1472075,
///pirateEquips = {
1082192, 1072288, 1492003, 1052113, 1052104,
1492002, 1052095, 1492001, 1002613, 1492004,
};
/* Scroll */
2041016, 2043302, 2040902, 2044804, 2044906,
/* Useable drop */
2000004, 2000005, 2022025, 2022027,
/* Common equipment */
1442013, 1432009, 1322021, 1050018, 1002392, 1002394, 1442004, 1372002, 1002418, 1002033, 1092008,
1082148, 1062001, 1302017, 1032023, 1102013, 1102040, 1002041, 1002097,
/* Warrior equipment */
1332026, 1051010, 1432001, 1422005, 1332019, 1302010, 1002056, 1060011, 1322011, 1432004, 1002028,
1051000, 1442007, 1302002,
/* Magician equipment */
1002037, 1002034, 1082020, 1050039, 1372000, 1002215, 1051034, 1040019, 1061034, 1382003, 1382006,
1050025,
/* Bowman equipment */
1002118, 1061081, 1452011, 1462012, 1452006, 1452007,
/* Thief equipment */
1472010, 1472029, 1041048, 1041095, 1060031, 1061033, 1041049, 1472011, 1040096, 1472033, 1332026,
1051006, 1082074, 1472025, 1061106, 1040084, 1332015, 1472000, 1332019, 1002183, 1002209, 1092020,
1332029, 1092019, 1061099, 1060106, 1040032, 1040059, 1332003, 1040060, 1060046, 1472005, 1332027,
/* Pirate equipment */
1082192, 1072288, 1492003, 1052113, 1052104,
1492002, 1052095, 1492001, 1002613, 1492004
};
}
@Override
public int[] getUncommonItems() {
return new int[] {1472053, 1332064, 1092050, 1472054};
return new int[] {2040805, 1082149, 1102041};
}
@Override
public int[] getRareItems() {
return new int[] {1472073, 1092049, 1002793, 1332079, 1072364, 1472062, 1332078, 1332080};
return new int[] {};
}
}
+56
View File
@@ -0,0 +1,56 @@
package server.gachapon;
/**
*
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class Ludibrium extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
/* Scroll */
2048000, 2040601, 2041019, 2041007, 2041016, 2041022, 2041001, 2041010, 2041013, 2041004, 2044701, 2043301, 2040301, 2048004, 2048001, 2040901, 2040701, 2040704, 2040707, 2040602, 2041020, 2041008, 2041017, 2041023, 2041002, 2041011, 2041014, 2041005, 2044702, 2043302, 2040302, 2040002, 2044402, 2048005, 2048002, 2040702, 2040705, 2040708, 2044302, 2043802, 2040402, 2043702, 2044811,
/* Useable drop */
2000004, 2000005, 4006000, 4006001,
/* Common equipment */
1032003, 1432009, 1302022, 1302029, 1102014, 1102018, 1312014, 1302026, 1102015, 1032011, 1312013, 1032008, 1032019, 1032007, 1332030, 1032020, 1032004, 1302027, 1032022, 1312012, 1032021, 1032006, 1302028, 1322003, 1032016, 1032015, 1302024, 1092008, 1032018, 1302021, 1032014, 1332021, 1322012, 1032005, 1032013, 1102012, 1302025, 1302013, 1032002, 1032001, 1032012, 1302017, 1032010, 1402014, 1102017, 1102013, 1442021, 1032009,
/* Beginner equipment */
1332021, 1422011,
/* Warrior equipment */
1402017, 1422005, 1002023, 1332016, 1432005,
/* Magician equipment */
1002037, 1002034, 1002064, 1002038, 1002013, 1002036, 1382011, 1002035, 1002065, 1382014, 1372001,
/* Bowman equipment */
1452026, 1002162, 1002164, 1462018, 1002165, 1452014, 1002163, 1452012, 1002161, 1452009, 1462007,
/* Thief Equipment */
1332022, 1002175, 1002172, 1002174, 1040096, 1472033, 1002173, 1332054, 1472054, 1002171, 1332016,
/* Pirate equipment */
1002646
};
}
@Override
public int[] getUncommonItems() {
return new int [] {2040805, 1002419, 1442018};
}
@Override
public int[] getRareItems() {
return new int [] {};
}
}
+45 -3
View File
@@ -21,6 +21,7 @@
*/
package server.gachapon;
import server.MapleItemInformationProvider;
import tools.Randomizer;
/**
@@ -46,9 +47,11 @@ public class MapleGachapon {
MUSHROOM_SHRINE(9100105, 90, 8, 2, new MushroomShrine()),
SHOWA_SPA_MALE(9100106, 90, 8, 2, new ShowaSpaMale()),
SHOWA_SPA_FEMALE(9100107, 90, 8, 2, new ShowaSpaFemale()),
LUDIBRIUM(9100108, 90, 8, 2, new Ludibrium()),
NEW_LEAF_CITY(9100109, 90, 8, 2, new NewLeafCity()),
EL_NATH(9100110, 90, 8, 2, new ElNath()),
NAUTILUS_HARBOR(9100117, 90, 8, 2, new NautilusHarbor());
private static final Gachapon[] values = Gachapon.values();
private GachaponItems gachapon;
@@ -71,8 +74,9 @@ public class MapleGachapon {
return 2; //Rare
} else if (chance > common) {
return 1; //Uncommon
}
return 0; //Common
} else {
return 0; //Common
}
}
public int [] getItems(int tier){
@@ -94,6 +98,44 @@ public class MapleGachapon {
}
return null;
}
public static String[] getLootInfo() {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
String[] strList = new String[values.length + 1];
String menuStr = "";
int j = 0;
for (Gachapon gacha : values) {
menuStr += "#L" + j + "#" + gacha.name() + "#l\r\n";
j++;
String str = "";
for (int i = 0; i < 3; i++) {
int[] gachaItems = gacha.getItems(i);
if (gachaItems.length > 0) {
str += (" #rTier " + i + "#k:\r\n");
for (int itemid : gachaItems) {
String itemName = ii.getName(itemid);
if (itemName == null) {
itemName = "MISSING NAME #" + itemid;
}
str += (" " + itemName + "\r\n");
}
str += "\r\n";
}
}
str += "\r\n";
strList[j] = str;
}
strList[0] = menuStr;
return strList;
}
}
public MapleGachaponItem process(int npcId) {
+37 -19
View File
@@ -2,39 +2,57 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class MushroomShrine extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int []{
1382011, 1332024, 1302022, 1302021, 1462006, 1402009, 1402010, 1322012, 1312013, 1472008,
1432008, 1050100, 1051098,
};
return new int [] {
/* Scroll */
2040305, 2040306, 2040308, 2044604, 2041039, 2041037, 2041035, 2041034, 2041041, 2040608, 2040605, 2040604, 2040611,
2040610, 2040813, 2040808, 2043004, 2040017, 2040015, 2040011, 2040013, 2040405, 2040406, 2040410, 2040511, 2040509,
2040508, 2040519, 2040521, 2040108, 2040904, 2040908, 2043104, 2044104, 2043005, 2043004, 2043006, 2044004, 2044205,
2043304, 2040607, 2040715, 2040713, 2044305, 2044904,
/* Common equipment */
1102040, 1002392, 1432009, 1002393, 1002394, 1082147, 1082148, 1032028, 1002585, 1002586, 1432013, 1022047, 1322027,
1012056, 1432018,
/* Beginner equipment */
1072264, 1072262, 1072263,
/* Warrior equipment */
1060074, 1322002, 1002340, 1442004, 1402037, 1422008, 1050022,
/* Mage equipment */
1382037, 1060014, 1051026, 1050056, 1050029, 1051030, 1382036, 1372032, 1041015, 1382015, 1372008, 1382008,
/* Bowman equipment */
1452018, 1041068, 1462007,
/* Thief equipment */
1060052, 1472013, 1002180, 1002170, 1060073, 1060099,
/* Pirate equipment */
1492004, 1492012, 1482009, 1072303, 1002637, 1052107, 1082189, 1052116, 1072309
};
}
@Override
public int[] getUncommonItems() {
//All Scrolls
return new int [] {
2043015, 2043017, 2043019, 2044000, 2044001, 2044002, 2044004, 2044005, 2044010, 2044012,
2044014, 2043200, 2043201, 2043202, 2043204, 2043205, 2043210, 2043212, 2043214, 2044200,
2044201, 2044202, 2044204, 2044205, 2044210, 2044212, 2044214, 2044300, 2044301, 2044302,
2044304, 2044305, 2044310, 2044312, 2044314, 2044400, 2044401, 2044402, 2044404, 2044405,
2044410, 2044412, 2044414,
2043800, 2043801, 2043802, 2043804, 2043805, 2043700, 2043701, 2043702, 2043704, 2043705,
2044605, 2044604, 2044602, 2044601, 2044600, 2044505, 2044504, 2044502, 2044501, 2044500,
2044700, 2044701, 2044702, 2044704, 2044705, 2043300, 2043301, 2043302, 2043304, 2043305,
2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044807, 2044809, 2044900, 2044901,
2044902, 2044903, 2044904,
};
return new int [] {2040811, 2040810, 2040815, 1102041, 1102042, 1082149};
}
@Override
public int[] getRareItems() {
return new int [] {};
return new int [] {1102084, 3010019};
}
}
+44 -27
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate items
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class NautilusHarbor extends GachaponItems {
@@ -10,40 +13,54 @@ public class NautilusHarbor extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int[] {
/* Warrior Equips*/ 1060017, 1302008, 1002055, 1041064, 1072127, 1072047, 1072002, 1040028, 1072041, 1092000,
/* Mage Equips */ 1050010, 1072006, 1061022, 1051003, 1072074, 1050008, 1082053, 1051026, 1382015, 1002013,
/* Bowman Equips */ 1082048, 1041056, 1002157, 1462048, 1041054, 1061061, 1002161, 1002162, 1002158, 1002120,
/* Thief Equips */ 1040061, 1072031, 1051009, 1072036, 1002182, 1060073, 1472013, 1472009, 1002184, 1061055,
/* Pirate Equips */ 1002610, 1002616, 1002622, 1002628, 1002634, 1002640, 1002646, 1052095, 1052101, 1052107,
1052113, 1052119, 1052125, 1052131, 1072285, 1072291, 1072297, 1072303, 1072309, 1072315,
1082180, 1082186, 1082192, 1082198, 1082204, 1082210, 1482001, 1482003, 1482005, 1482007,
1482009, 1482011, 1492000, 1492002, 1492004, 1492006, 1492008, 1492010, 1492012, 1002613,
1002619, 1002625, 1002631, 1002637, 1002643, 1052098, 1052104, 1052110, 1052116, 1052122,
1052128, 1072288, 1072294, 1072300, 1072306, 1072312, 1072318, 1072338, 1082183, 1082189,
1082195, 1082201, 1082207, 1082213, 1482000, 1482002, 1482004, 1482006, 1482008, 1482010,
1482012, 1492001, 1492003, 1492005, 1492007, 1492009, 1492011,
/*KnucklerScrolls*/ 2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044806, 2044807, 2044808, 2044809,
/* Gun Scrolls */ 2044900, 2044901, 2044902, 2044903, 2044904,
/* Bullets */ 2330005, 2330004
};
/* Scroll */
2040605, 2040626, 2040609, 2040607, 2041029, 2041027, 2041031, 2041037, 2041033, 2041039, 2041041, 2041035,
2040809, 2040813, 2040015, 2040009, 2040011, 2040013, 2040509, 2040521, 2040519, 2040507, 2040905, 2040909,
2040907, 2040713, 2040715, 2040717, 2040405, 2040409, 2040407, 2040426, 2040303, 2040307, 2040309, 2044505,
2044705, 2044605, 2043305, 2043105, 2043205, 2043005, 2043007, 2044405, 2044305, 2043805, 2044105, 2044205,
2044005, 2043705, 2044901,
/* Useable drop */
2012000, 2000004, 2020008, 2000005, 2012002, 2101004, 2101005, 2101002, 2101003, 4006000,
/* Warrior equipment */
1092014, 1402017,
/* Magician equipment */
1002037, 1002034, 1002064, 1002038, 1382037, 1372000, 1002013, 1002035, 1002065, 1382000,
/* Bowman equipment */
1452018,
/* Thief equipment */
1472010, 1002175, 1472017, 1472025,
/* Pirate equipment */
1002610, 1002616, 1002622, 1002628, 1002634, 1002640, 1002646, 1052095, 1052101, 1052107,
1052113, 1052119, 1052125, 1052131, 1072285, 1072291, 1072297, 1072303, 1072309, 1072315,
1082180, 1082186, 1082192, 1082198, 1082204, 1082210, 1482001, 1482003, 1482005, 1482007,
1482009, 1482011, 1492000, 1492002, 1492004, 1492006, 1492008, 1492010, 1492012, 1002613,
1002619, 1002625, 1002631, 1002637, 1002643, 1052098, 1052104, 1052110, 1052116, 1052122,
1052128, 1072288, 1072294, 1072300, 1072306, 1072312, 1072318, 1072338, 1082183, 1082189,
1082195, 1082201, 1082207, 1082213, 1482000, 1482002, 1482004, 1482006, 1482008, 1482010,
1482012, 1492001, 1492003, 1492005, 1492007, 1492009, 1492011,
/* Knuckler Scrolls */
2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044806, 2044807, 2044808, 2044809,
/* Gun Scrolls */
2044900, 2044901, 2044902, 2044903, 2044904
};
}
@Override
public int[] getUncommonItems() {
return new int[] {
/* Pirate Equips */ 1072321, 1082216, 1482013, 1002649, 1052134, 1492013,
/* Mastery Books */ 2290097, 2290098, 2290099, 2290100, 2290101, 2290102, 2290103, 2290104, 2290105, 2290106,
2290107, 2290108, 2290110, 2290111, 2290111, 2290113, 2290114, 2290115, 2290116, 2290117,
2290118, 2290119, 2290120, 2290121, 2290122, 2290123, 2290124
};
return new int[] {2040811, 2040815, 2101001};
}
@Override
public int[] getRareItems() {
return new int[] {
/* Pirate Equips */ 1082243, 1482024, 1002794, 1052164, 1072365,
1482034, 1492025
};
return new int[] {};
}
}
+33 -44
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Ronan - parsed MapleSEA loots, thanks Vcoc for noticing somewhat unbalanced loots in NLC
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class NewLeafCity extends GachaponItems {
@@ -10,57 +13,43 @@ public class NewLeafCity extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int[] {
/* Warrior Equips*/ 1002338, 1002339, 1002340, 1002377, 1002378, 1002379, 1002528, 1002529, 1002530, 1002531,
1002532, 1040111, 1040112, 1040113, 1040120, 1040121, 1040122, 1041119, 1041120, 1041121,
1041122, 1041123, 1041124, 1050080, 1050081, 1050082, 1050083, 1051077, 1051078, 1051079,
1051080, 1060100, 1060101, 1060102, 1060109, 1060110, 1060111, 1061118, 1061119, 1061120,
1061121, 1061122, 1061123, 1072196, 1072197, 1072198, 1072210, 1072211, 1072212, 1072220,
1072221, 1072222, 1082114, 1082115, 1082116, 1082117, 1082128, 1082129, 1082130, 1082139,
1082140, 1082141, 1092023, 1092024, 1092025, 1092026, 1092027, 1092028, 1092036, 1092037,
1092038, 1092061, 1302018, 1302023, 1302056, 1312011, 1312015, 1312030, 1322020, 1322028,
1322029, 1322045, 1402004, 1402005, 1402015, 1402016, 1402035,
1412009, 1412010, 1412021, 1412040, 1422012, 1422013, 1422027, 1432010,
1432011, 1432030, 1432056, 1442019, 1442020, 1442044,
/* Mage Equips */ 1002271, 1002272, 1002273, 1002274, 1002363, 1002364, 1002365, 1002366, 1002398, 1002399,
1002400, 1002401, 1050072, 1050073, 1050074, 1050092, 1050093, 1050094, 1050095, 1050102,
1050103, 1050104, 1050105, 1051056, 1051057, 1051058, 1051094, 1051095, 1051096, 1051097,
1051101, 1051102, 1051103, 1051104, 1072177, 1072178, 1072179, 1072206, 1072207, 1072208,
1072209, 1072223, 1072224, 1072225, 1072226, 1082121, 1082122, 1082123, 1082131, 1082132,
1082133, 1082134, 1082151, 1082152, 1082153, 1082154, 1372009, 1372010, 1372016, 1382008,
1382010, 1382016, 1382035, 1382056, 1382060,
/* Bowman Equips */ 1002275, 1002276, 1002277, 1002275, 1002278, 1002402, 1002403, 1002404, 1002405, 1002406,
1002407, 1002408, 1050075, 1050076, 1050077, 1050078, 1050088, 1050089, 1050090, 1050091,
1050106, 1050107, 1050108, 1002275, 1051066, 1051067, 1051068, 1051069, 1051082, 1051083,
1051084, 1051085, 1051105, 1051106, 1051107, 1072182, 1072183, 1072184, 1072185, 1072203,
1072204, 1072205, 1072227, 1072228, 1072229, 1082109, 1082110, 1082111, 1082112, 1082125,
1082126, 1082127, 1082158, 1082159, 1082160, 1452012, 1452013, 1452014, 1452015, 1452017,
1452019, 1452020, 1452021, 1452025, 1452026, 1452060, 1462010, 1452017, 1462011, 1462012,
1462013, 1462015, 1462016, 1462017, 1462018, 1462021, 1462022, 1462049,
/* Thief Equips */ 1002323, 1002324, 1002325, 1002326, 1002327, 1002328, 1002329, 1002330, 1002380, 1002381,
1002382, 1002383, 1040108, 1040109, 1040110, 1040115, 1040117, 1040118, 1041105, 1041106,
1041107, 1041115, 1041116, 1041117, 1041118, 1050096, 1050097, 1050098, 1050099, 1051090,
1051091, 1051092, 1051093, 1060097, 1060098, 1060099, 1060104, 1060105, 1060106, 1060107,
1061104, 1061105, 1061106, 1061114, 1061115, 1061116, 1061117, 1072172, 1072173, 1072174,
1072192, 1072193, 1072194, 1072195, 1072213, 1072214, 1072215, 1072216, 1082118, 1082119,
1082120, 1082135, 1082136, 1082137, 1082138, 1082143, 1082144, 1092050, 1332023, 1332027,
1332052, 1332069, 1332072, 1472031, 1472033, 1472053,
/* Pirate Equips */ 1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207,
1082210, 1082213, 1482010, 1482011, 1002640, 1482012, 1492010, 1492011, 1492012
};
/* Scroll */
2040406, 2040408, 2040404, 2040411, 2040409, 2044405, 2040610, 2040607, 2040812, 2041039, 2041040, 2041034,
2041030, 2041037, 2043105, 2043304, 2040103, 2040605, 2040611, 2043004, 2043204, 2044204, 2044005, 2040521,
2040510, 2043304, 2040908, 2040904, 2040907, 2040809, 2040812, 2040014, 2040714, 2040712, 2044004, 2043705,
2044505, 2040519, 2040204, 2040104, 2040109, 2044704, 2040906, 2044304, 2043007, 2040307, 2040304, 2040309,
2040208, 2040209, 2044803,
/* Common equipment */
1102040, 1102086, 1082145, 1032027, 1082146, 1002395, 1002083, 1002392, 1002587, 1022047,
/* Warrior equipment */
1312002, 1432013, 1060030, 1422008, 1050022, 1050011, 1402013, 1402017, 1302012,
/* Mage equipment */
1002074, 1050029, 1040093, 1050056, 1050039, 1382008,
/* Bowman equipment */
1002159, 1061051, 1040023,
/* Thief equipment */
1061054, 1061106, 1002249, 1040084, 1060052, 1472054,
/* Pirate equipment */
1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207, 1082210, 1082213,
1482010, 1482011, 1002640, 1482012, 1492010, 1492011, 1492012
};
}
@Override
public int[] getUncommonItems() {
return new int[] {
2022179
};
return new int[] {2022284, 2040811, 2040815, 2040811, 1102041, 1102042, 1082149};
}
@Override
public int[] getRareItems() {
return new int[] {
2049100
};
return new int[] {};
}
}
+35 -115
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class Perion extends GachaponItems {
@@ -10,128 +13,45 @@ public class Perion extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
//warriorEquips = {
1002002, 1002003, 1002004, 1002005, 1002007,
1002009, 1002011, 1002021, 1002022, 1002023,
1002024, 1002025, 1002027, 1002028, 1002029,
1002030, 1002039, 1002040, 1002043, 1002044,
1002045, 1002046, 1002047, 1002048, 1002049,
1002050, 1002051, 1002052, 1002055, 1002056,
1002058, 1002059, 1002084, 1002085, 1002086,
1002087, 1002088, 1002091, 1002092, 1002093,
1002094, 1002095, 1002098, 1002099, 1002100,
1002101, 1002338, 1002339, 1002340, 1002377,
1002378, 1002379, 1002528, 1002529, 1002530,
1002531, 1002532, 1002551, 1002578,
1002790, 1040000, 1040009, 1040012, 1040015,
1040016, 1040021, 1040026, 1040028, 1040029,
1040030, 1040037, 1040038, 1040039, 1040040,
1040041, 1040085, 1040086, 1040087, 1040088,
1040089, 1040090, 1040091, 1040092, 1040093,
1040102, 1040103, 1040104, 1040111, 1040112,
1040113, 1040120, 1040121, 1040122, 1041014,
1041019, 1041020, 1041021, 1041022, 1041023,
1041024, 1041064, 1041084, 1041085, 1041086,
1041087, 1041088, 1041089, 1041091, 1041092,
1041093, 1041097, 1041098, 1041099, 1041119,
1041120, 1041121, 1041122, 1041123, 1041124,
1050000, 1050005, 1050006, 1050007, 1050011,
1050021, 1050022, 1050080, 1050081, 1050082,
1050083, 1051000, 1051001, 1051010, 1051011,
1051012, 1051013, 1051014, 1051015, 1051016,
1051077, 1051078, 1051079, 1051080, 1052075,
1052160, 1060000, 1060008, 1060009,
1060010, 1060011, 1060016, 1060017, 1060018,
1060019, 1060020, 1060027, 1060028, 1060029,
1060030, 1060060, 1060074, 1060075, 1060076,
1060077, 1060078, 1060079, 1060080, 1060081,
1060082, 1060090, 1060091, 1060092, 1060100,
1060101, 1060102, 1060109, 1060110, 1060111,
1061014, 1061015, 1061016, 1061017, 1061018,
1061019, 1061020, 1061023, 1061083, 1061084,
1061085, 1061086, 1061087, 1061088, 1061090,
1061091, 1061092, 1061096, 1061097, 1061098,
1061118, 1061119, 1061120, 1061121, 1061122,
1061123, 1072000, 1072002, 1072003, 1072007,
1072009, 1072011, 1072039, 1072040, 1072041,
1072046, 1072047, 1072050, 1072051, 1072052,
1072053, 1072112, 1072113, 1072126, 1072127,
1072132, 1072133, 1072134, 1072135, 1072147,
1072148, 1072149, 1072154, 1072155, 1072156,
1072168, 1072196, 1072197, 1072198, 1072210,
1072211, 1072212, 1072220, 1072221, 1072222,
1072273, 1082000, 1082001,
1082003, 1082004, 1082005, 1082006, 1082007,
1082008, 1082009, 1082010, 1082011, 1082023,
1082024, 1082025, 1082035, 1082036, 1082059,
1082060, 1082061, 1082103, 1082104, 1082105,
1082114, 1082115, 1082116, 1082117, 1082128,
1082129, 1082130, 1082139, 1082140, 1082141,
1082168, 1082218, 1082239, 1092000,
1092001, 1092002, 1092004, 1092005, 1092006,
1092007, 1092009, 1092010, 1092011, 1092012,
1092013, 1092014, 1092015, 1092016, 1092017,
1092023, 1092024, 1092025, 1092026, 1092027,
1092028, 1092036, 1092037, 1092038,
1092060, 1092061, 1302002, 1302004, 1302005,
1302008, 1302009, 1302010, 1302011, 1302012,
1302015, 1302018, 1302019, 1302023, 1302037,
1302056, 1302059, 1302068, 1302079,
1312001, 1312003, 1312005,
1312006, 1312007, 1312008, 1312009, 1312010,
1312011, 1312015, 1312016, 1312030, 1312031,
1322014, 1322015,
1322016, 1322017, 1322018, 1322019, 1322020,
1322028, 1322029, 1322045, 1322052, 1322059,
1322062, 1402000,
1402002, 1402003, 1402004, 1402005, 1402006,
1402007, 1402008, 1402011, 1402012, 1402015,
1402016, 1402017, 1402018, 1402035, 1402036,
1412000, 1412002,
1412003, 1412004, 1412005, 1412006, 1412007,
1412008, 1412009, 1412010, 1412012, 1412021,
1412026, 1412032, 1412040,
1422001, 1422002, 1422003, 1422005,
1422007, 1422008, 1422009, 1422010, 1422012,
1422013, 1422027, 1422028, 1422030, 1422031,
1422038, 1422044, 1432002, 1432003,
1432004, 1432005, 1432006, 1432007, 1432010,
1432011, 1432030, 1432038, 1432045,
1432048, 1432056, 1442001, 1442002,
1442003, 1442005, 1442006, 1442007, 1442008,
1442009, 1442010, 1442019, 1442020, 1442044,
1442045, 1442060, 1442067,
//magicianEquips = {
1002075, 1050035, 1002151, 1051023, 1072089,
1072115, 1072076, 1040018, 1382017, 1072072,
//bowmanEquips = {
1040011, 1041061, 1040076, 1040003, 1072059,
1082017, 1002114, 1041066, 1060057, 1040007,
//thiefEquips = {
1072032, 1472011, 1082037, 1040059, 1040084,
1040043, 1072085, 1040031, 1332031, 1082075,
//pirateEquips = {
1482001, 1492002, 1052113, 1002616, 1072294,
1492004, 1482006, 1082192, 1082189, 1082195,
};
/* Scrolls */
2044907, 2044802,
/* Useable drop */
2000004, 2000005,
/* Common equipment */
1402010, 1302022, 1002060, 1322021, 1082147, 1002006, 1002026, 1002392, 1322025, 1322027, 1102000, 1082150,
1332020, 1322007, 1302021, 1002395, 1082148, 1322012, 1302017, 1322010, 1032000, 1102013, 1002097,
/* Warrior equipment */
1322020, 1312007, 1312008, 1302004, 1312006, 1082036, 1082117, 1061088, 1302008, 1422005, 1002048, 1061087,
1302018, 1322017, 1422001, 1040103, 1060077, 1002022, 1002050, 1442000, 1432030, 1402037, 1092002, 1041092,
1050006, 1432004, 1061019, 1432000, 1060009, 1051000, 1002021, 1322014, 1432005,
/* Magician equipment */
1051032, 1040018, 1051027, 1372007, 1050049, 1002036, 1382012, 1002217, 1051033, 1382006, 1050048,
/* Bowman equipment */
1061061, 1060062, 1040075, 1462013, 1041065, 1452006,
/* Thief equipment */
1040095, 1060084, 1002182, 1041049, 1002247, 1332024, 1332009, 1060024, 1332015, 1041060, 1061032, 1041074,
1041003, 1332016, 1472020, 1332003, 1041059,
/* Pirate equipment */
1482001, 1492002, 1052113, 1002616, 1072294, 1492004, 1482006, 1082192, 1082189, 1082195
};
}
@Override
public int[] getUncommonItems() {
//All Scrolls
return new int [] {
2043000, 2043001, 2043002, 2043004, 2043005, 2043006, 2043007, 2043008, 2043009, 2043010,
2043015, 2043017, 2043019, 2044000, 2044001, 2044002, 2044004, 2044005, 2044010, 2044012,
2044014, 2043200, 2043201, 2043202, 2043204, 2043205, 2043210, 2043212, 2043214, 2044200,
2044201, 2044202, 2044204, 2044205, 2044210, 2044212, 2044214, 2044300, 2044301, 2044302,
2044304, 2044305, 2044310, 2044312, 2044314, 2044400, 2044401, 2044402, 2044404, 2044405,
2044410, 2044412, 2044414,
};
return new int [] {1082149, 1002391, 1002419, 1102041};
}
@Override
public int[] getRareItems() {
return new int [] {1402037, 1402049, 1072361, 1402048, 1402049, 1402050, 1402051};
return new int [] {};
}
}
+37 -4
View File
@@ -2,24 +2,57 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/06/gachapon-showa-towns-sauna-female-spa.html
*/
public class ShowaSpaFemale extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {};
return new int [] {
/* Scroll */
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2041309,
2044010, 2044803, 2044814, 2044904, 2044902, 2044901,
/* Useable drop */
2022016, 2000005, 2022025, 2022027,
/* Common equipment */
1402000, 1402013, 1002418, 1022047, 1082145, 1082147, 1082146, 1082178, 1082175,
/* Common setup */
3010073, 3010099,
/* Warrior equipment */
1422013, 1432030,
/* Magician equipment */
1372002, 1382003,
/* Bowman equipment */
1040023,
/* Thief equipment */
1332003, 1002209,
/* Pirate equipment */
1082198, 1082213, 1482007, 1492004, 1002646
};
}
@Override
public int[] getUncommonItems() {
return new int [] {};
return new int [] {2040916, 1102042};
}
@Override
public int[] getRareItems() {
return new int [] {1022082, 1022060};
return new int [] {};
}
}
+39 -4
View File
@@ -2,24 +2,59 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/05/gachapon-showa-towns-sauna.html
*/
public class ShowaSpaMale extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {};
return new int [] {
/* Scroll */
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2044902,
2044901, 2044811, 2044903, 2044804,
/* Useable drop */
2022016, 2000005, 2022025, 2022027,
/* Common equipment */
1332020, 1312004, 1332032, 1322023, 1322026, 1322022, 1322012, 1302014, 1302049, 1302017, 1332007, 1432009,
1432016, 1432017, 1432009, 1402013, 1402044, 1442014, 1442017, 1442016, 1442025, 1002418, 1082178, 1082179,
1082148, 1032027, 1032032, 1102028, 1102086,
/* Common setup */
3010073, 3010111,
/* Warrior equipment */
1412005, 1402048, 1402049, 1322011, 1302003, 1302004, 1302008,
/* Magician equipment */
1372000, 1372009, 1372001, 1372011, 1382006, 1382014,
/* Bowman equipment */
1452018, 1452006, 1452008, 1452005, 1462002, 1462007, 1462003, 1002169,
/* Thief equipment */
1472023, 1332012, 1332017, 1332022, 1332006, 1332029, 1040097,
/* Pirate equipment */
1052107, 1082204, 1072318, 1002637, 1482009, 1492007
};
}
@Override
public int[] getUncommonItems() {
return new int [] {};
return new int [] {2040916, 1102042};
}
@Override
public int[] getRareItems() {
return new int [] {1022082, 1022060};
return new int [] {};
}
}
+37 -84
View File
@@ -2,7 +2,10 @@ package server.gachapon;
/**
*
* @author Alan (SharpAceX)
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Ronan - parsed MapleSEA loots
*
* MapleSEA-like loots thanks to AyumiLove, src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
*/
public class Sleepywood extends GachaponItems {
@@ -10,97 +13,47 @@ public class Sleepywood extends GachaponItems {
@Override
public int[] getCommonItems() {
return new int [] {
//warriorEquips = {
1002022, 1002024, 1002028, 1002029, 1002030,
1002045, 1002046, 1002084, 1002085, 1002086,
1002091, 1002094, 1002095, 1002100, 1002101,
1040087, 1040088, 1040089, 1040090, 1040091,
1040092, 1040093, 1040102, 1040103, 1040104,
1041087, 1041088, 1041089, 1041091, 1041092,
1041093, 1041097, 1041098, 1041099, 1060076,
1060077, 1060078, 1060079, 1060080, 1060081,
1060082, 1060090, 1060091, 1060092, 1061086,
1061087, 1061088, 1061090, 1061091, 1061092,
1061096, 1061097, 1061098, 1072132, 1072133,
1072134, 1072135, 1072147, 1072148, 1072149,
1072154, 1072155, 1072156, 1082009, 1082010,
1082011, 1082059, 1082060, 1082061, 1082103,
1082104, 1082105, 1082218, 1092004, 1092009,
1092010, 1092011, 1092015, 1092016, 1092017,
1302010, 1302011, 1302012, 1302015, 1302019,
1302037, 1302079, 1312008, 1312009,
1312010, 1322017, 1322018, 1322019, 1322059,
1402003, 1402011, 1402012, 1402017, 1412003,
1412007, 1412008, 1412032, 1422005, 1422009,
1422010, 1432004, 1432006, 1432007, 1432045,
1442005, 1442008, 1442010, 1442060,
//magicianEquips = {
1002215, 1002216, 1002217, 1002218, 1002242,
1002243, 1002244, 1002245, 1002246, 1002252,
1002253, 1002254, 1050045, 1050046, 1050047,
1050048, 1050049, 1050053, 1050054, 1050055,
1050056, 1050067, 1050068, 1050069, 1050070,
1051030, 1051031, 1051032, 1051033, 1051034,
1051044, 1051045, 1051046, 1051047, 1051052,
1051053, 1051054, 1051055, 1072136, 1072137,
1072138, 1072139, 1072140, 1072141, 1072142,
1072143, 1072157, 1072158, 1072159, 1072160,
1082080, 1082081, 1082082, 1082086, 1082087,
1082088, 1082098, 1082099, 1082100, 1372007,
1372008, 1372011, 1372014, 1372015, 1372035,
1372036, 1372037, 1372038, 1382001, 1382006,
1382007, 1382011, 1382014, 1382041,
//bowmanEquips = {
1002211, 1002212, 1002213, 1002214, 1002267,
1002268, 1002269, 1002270, 1002286, 1002287,
1002288, 1002289, 1002749, 1050051, 1050052,
1050058, 1050059, 1050060, 1050061, 1050062,
1050063, 1050064, 1051037, 1051038, 1051039,
1051041, 1051042, 1051043, 1051062, 1051063,
1051064, 1051065, 1072122, 1072123, 1072124,
1072125, 1072144, 1072145, 1072146, 1072164,
1072165, 1072166, 1072167, 1072345, 1082083,
1082084, 1082085, 1082089, 1082090, 1082091,
1082106, 1082107, 1082108, 1452004, 1452008,
1452009, 1452010, 1452011, 1452018, 1452023,
1452052, 1462006, 1462007, 1462008, 1462009,
1462046,
//thiefEquips = {
1002207, 1002208, 1002209, 1002210, 1002247,
1002248, 1002249, 1002281, 1002282, 1002283,
1002284, 1002285, 1002656, 1002750, 1040094,
1040095, 1040096, 1040097, 1040098, 1040099,
1040100, 1040105, 1040106, 1040107, 1041077,
1041078, 1041079, 1041080, 1041094, 1041095,
1041096, 1041100, 1041101, 1041102, 1041103,
1060083, 1060084, 1060085, 1060086, 1060087,
1060088, 1060089, 1060093, 1060094, 1060095,
1061076, 1061077, 1061078, 1061079, 1061093,
1061094, 1061095, 1061099, 1061100, 1061101,
1061102, 1072128, 1072129, 1072130, 1072131,
1072150, 1072151, 1072152, 1072161, 1072162,
1072163, 1072346, 1082065, 1082066, 1082067,
1082092, 1082093, 1082094, 1082095, 1082096,
1082097, 1332003, 1332015, 1332018, 1332024,
1332054, 1332064, 1472018, 1472019, 1472020,
1472021, 1472022, 1472023, 1472024, 1472025,
1472026, 1472027, 1472028, 1472029, 1472054,
1472062,
//pirateEquips = {
1002631, 1002634, 1002637, 1052116, 1052119,
1052122, 1072303, 1072306, 1072309, 1082198,
1082201, 1082204, 1482007, 1482008, 1482009,
};
/* Scroll */
2048003, 2048000, 2040601, 2044501, 2041019, 2041016, 2041022, 2041010, 2041013, 2043301, 2040301, 2040801, 2040001,
2040004, 2043101, 2043201, 2043001, 2040504, 2040501, 2048004, 2048001, 2044401, 2040901, 2040701, 2040704, 2040707,
2044301, 2043801, 2044101, 2044201, 2044001, 2040602, 2044502, 2041020, 2041017, 2041023, 2041014, 2041005, 2044702,
2044602, 2043302, 2040302, 2040802, 2040005, 2043202, 2043002, 2040505, 2040502, 2048005, 2048002, 2044402, 2040902,
2040702, 2040705, 2040708, 2044302, 2043802, 2044202, 2044002, 2044801, 2044903, 2044814,
/* Useable drop */
2012000, 2012003, 2020007, 2000004, 2012001, 2020008, 2070006, 2020012, 2000005, 2030007, 2012002, 2002001, 2070005,
/* Common equipment */
1032003, 1432009, 1102014, 1102018, 1002392, 1322026, 1032022, 1312012, 1332020, 1092030, 1032016, 1032015, 1032014,
1322024, 1032013, 1322022, 1102016, 1032012, 1032023, 1402014, 1032000, 1102017,
/* Warrior equipment */
1402017, 1051010, 1432011, 1442006, 1322002, 1422004, 1432010, 1051011, 1060018, 1432000, 1422003, 1412003, 1422000,
/* Magician equipment */
1002034, 1002142, 1382010, 1002013, 1382008, 1382011, 1050047, 1002065,
/* Bowman equipment */
1452003, 1002165, 1040068, 1462013, 1462011, 1462012, 1061050, 1462010, 1002161,
/* Thief equipment */
1332022, 1002175, 1040042, 1472004, 1040057, 1332031, 1332023, 1332010, 1002171, 1060046,
/* Pirate equipment */
1002631, 1002634, 1002637, 1052116, 1052119, 1052122, 1072303, 1072306, 1072309, 1082198, 1082201, 1082204, 1482007,
1482008, 1482009
};
}
@Override
public int[] getUncommonItems() {
return new int [] {};
return new int [] {2040804, 2040817, 2040805, 2340000, 1082149, 1442018};
}
@Override
public int[] getRareItems() {
return new int [] {1302068, 2070007, 1022082, 1022058};
return new int [] {};
}
}
+4
View File
@@ -269,6 +269,10 @@ public class MapleLifeFactory {
public static MapleNPC getNPC(int nid) {
return new MapleNPC(nid, new MapleNPCStats(MapleDataTool.getString(nid + "/name", npcStringData, "MISSINGNO")));
}
public static String getNPCDefaultTalk(int nid) {
return MapleDataTool.getString(nid + "/d0", npcStringData, "(...)");
}
public static class BanishInfo {
+73
View File
@@ -22,6 +22,7 @@
package server.maps;
import java.awt.Point;
import java.util.Collection;
import tools.Pair;
import server.MaplePortal;
@@ -39,6 +40,8 @@ public class MapleDoor {
private MaplePortal townPortal;
private MapleMap target;
private Pair<String, Integer> posStatus = null;
private long deployTime;
private boolean active;
private MapleDoorObject townDoor;
private MapleDoorObject areaDoor;
@@ -55,6 +58,8 @@ public class MapleDoor {
if(posStatus == null) {
this.town = this.target.getReturnMap();
this.townPortal = getTownDoorPortal(owner.getDoorSlot());
this.deployTime = System.currentTimeMillis();
this.active = true;
if(townPortal != null) {
this.areaDoor = new MapleDoorObject(ownerId, town, target, townPortal.getId(), targetPosition, townPortal.getPosition());
@@ -83,6 +88,57 @@ public class MapleDoor {
}
}
private void broadcastRemoveDoor(MapleCharacter owner) {
MapleDoorObject areaDoor = this.getAreaDoor();
MapleDoorObject townDoor = this.getTownDoor();
MapleMap target = this.getTarget();
MapleMap town = this.getTown();
Collection<MapleCharacter> targetChars = target.getCharacters();
Collection<MapleCharacter> townChars = town.getCharacters();
target.removeMapObject(areaDoor);
town.removeMapObject(townDoor);
for (MapleCharacter chr : targetChars) {
areaDoor.sendDestroyData(chr.getClient());
}
for (MapleCharacter chr : townChars) {
townDoor.sendDestroyData(chr.getClient());
}
owner.removePartyDoor(false);
if (this.getTownPortal().getId() == 0x80) {
for (MapleCharacter chr : townChars) {
MapleDoor door = chr.getMainTownDoor();
if (door != null) {
townDoor.sendSpawnData(chr.getClient());
}
}
}
}
public static void attemptRemoveDoor(final MapleCharacter owner) {
final MapleDoor destroyDoor = owner.getPlayerDoor();
if (destroyDoor != null && destroyDoor.dispose()) {
long effectTimeLeft = 3000 - destroyDoor.getElapsedDeployTime(); // portal deployment effect duration
if (effectTimeLeft > 0) {
MapleMap town = destroyDoor.getTown();
town.getChannelServer().registerOverallAction(town.getId(), new Runnable() {
@Override
public void run() {
destroyDoor.broadcastRemoveDoor(owner); // thanks BHB88 for noticing doors crashing players when instantly cancelling buff
}
}, effectTimeLeft);
} else {
destroyDoor.broadcastRemoveDoor(owner);
}
}
}
private MaplePortal getTownDoorPortal(int doorid) {
return town.getDoorPortal(doorid);
}
@@ -114,4 +170,21 @@ public class MapleDoor {
public Pair<String, Integer> getDoorStatus() {
return posStatus;
}
public long getElapsedDeployTime() {
return System.currentTimeMillis() - deployTime;
}
private boolean dispose() {
if (active) {
active = false;
return true;
} else {
return false;
}
}
public boolean isActive() {
return active;
}
}
+12 -7
View File
@@ -100,15 +100,20 @@ public class MapleDoorObject extends AbstractMapleMapObject {
@Override
public void sendSpawnData(MapleClient client) {
sendSpawnData(client, true);
}
public void sendSpawnData(MapleClient client, boolean launched) {
MapleCharacter chr = client.getPlayer();
if (from.getId() == chr.getMapId()) {
MapleParty party = chr.getParty();
if (party != null && (ownerId == chr.getId() || party.getMemberById(ownerId) != null)) {
client.announce(MaplePacketCreator.partyPortal(this.getFrom().getId(), this.getTo().getId(), this.toPosition()));
if (this.getFrom().getId() == chr.getMapId()) {
if (chr.getParty() != null && (this.getOwnerId() == chr.getId() || chr.getParty().getMemberById(this.getOwnerId()) != null)) {
chr.announce(MaplePacketCreator.partyPortal(this.getFrom().getId(), this.getTo().getId(), this.toPosition()));
}
chr.announce(MaplePacketCreator.spawnPortal(this.getFrom().getId(), this.getTo().getId(), this.toPosition()));
if (!this.inTown()) {
chr.announce(MaplePacketCreator.spawnDoor(this.getOwnerId(), this.getPosition(), launched));
}
client.announce(MaplePacketCreator.spawnPortal(this.getFrom().getId(), this.getTo().getId(), this.toPosition()));
if(!this.inTown()) client.announce(MaplePacketCreator.spawnDoor(this.getOwnerId(), this.getPosition(), true));
}
}
+1 -1
View File
@@ -238,7 +238,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
}
}
private static boolean canBuy(MapleClient c, Item newItem) { // thanks xiaokelvin for noticing a leaked test code here
private static boolean canBuy(MapleClient c, Item newItem) { // thanks xiaokelvin (Conrad) for noticing a leaked test code here
return MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && MapleInventoryManipulator.addFromDrop(c, newItem, false);
}
+1 -12
View File
@@ -2131,18 +2131,7 @@ public class MapleMap {
spawnAndAddRangedMapObject(door, new DelayedPacketCreation() {
@Override
public void sendPackets(MapleClient c) {
if (door.getFrom().getId() == c.getPlayer().getMapId()) {
if (c.getPlayer().getParty() != null && (door.getOwnerId() == c.getPlayer().getId() || c.getPlayer().getParty().getMemberById(door.getOwnerId()) != null)) {
c.announce(MaplePacketCreator.partyPortal(door.getFrom().getId(), door.getTo().getId(), door.toPosition()));
}
c.announce(MaplePacketCreator.spawnPortal(door.getFrom().getId(), door.getTo().getId(), door.toPosition()));
if (!door.inTown()) {
c.announce(MaplePacketCreator.spawnDoor(door.getOwnerId(), door.getPosition(), false));
}
}
c.announce(MaplePacketCreator.enableActions());
door.sendSpawnData(c, false);
}
}, new SpawnCondition() {
@Override
+65 -6
View File
@@ -50,6 +50,7 @@ public class MapleMiniGame extends AbstractMapleMapObject {
private int firstslot = 0;
private int visitorpoints = 0, visitorscore = 0, visitorforfeits = 0, lastvisitor = -1;
private int ownerpoints = 0, ownerscore = 0, ownerforfeits = 0;
private boolean visitorquit, ownerquit;
private long nextavailabletie = 0;
private int matchestowin = 0;
@@ -112,10 +113,33 @@ public class MapleMiniGame extends AbstractMapleMapObject {
owner.getMap().broadcastMessage(MaplePacketCreator.addMatchCardBox(owner, 2, 0));
}
}
public void removeVisitor(MapleCharacter challenger) {
if (visitor == challenger) {
public void closeRoom(boolean forceClose) {
owner.getMap().broadcastMessage(MaplePacketCreator.removeMinigameBox(owner));
if (forceClose) {
this.broadcastToOwner(MaplePacketCreator.getMiniGameClose(false, 4));
}
this.broadcastToVisitor(MaplePacketCreator.getMiniGameClose(true, 3));
if (visitor != null) {
visitor.setMiniGame(null);
visitor = null;
}
owner.setMiniGame(null);
owner = null;
}
public void removeVisitor(boolean forceClose, MapleCharacter challenger) {
if (visitor == challenger) {
if (forceClose) {
visitor.announce(MaplePacketCreator.getMiniGameClose(true, 4));
}
challenger.setMiniGame(null);
visitor = null;
this.getOwner().getClient().announce(MaplePacketCreator.getMiniGameRemoveVisitor());
if (GameType == MiniGameType.OMOK) {
this.getOwner().getMap().broadcastMessage(MaplePacketCreator.addOmokBox(owner, 1, 0));
@@ -154,13 +178,37 @@ public class MapleMiniGame extends AbstractMapleMapObject {
this.getOwner().getMap().broadcastMessage(MaplePacketCreator.addOmokBox(owner, visitor != null ? 2 : 1, inprogress));
}
private synchronized boolean minigameMatchFinish() {
if (isMatchInProgress()) {
inprogress = 0;
return true;
} else {
return false;
}
}
private void minigameMatchFinished() {
inprogress = 0;
updateMiniGameBox();
if (ownerquit) {
owner.closeMiniGame(true);
} else if (visitorquit) {
visitor.closeMiniGame(true);
}
}
public void minigameMatchStarted() {
inprogress = 1;
ownerquit = false;
visitorquit = false;
}
public void setQuitAfterGame(MapleCharacter player, boolean quit) {
if (isOwner(player)) {
ownerquit = quit;
} else {
visitorquit = quit;
}
}
public boolean isMatchInProgress() {
@@ -177,33 +225,43 @@ public class MapleMiniGame extends AbstractMapleMapObject {
public boolean isTieDenied(MapleCharacter chr) {
if (this.isOwner(chr)) {
return ((inprogress >> 1) % 2) == 1;
} else {
return ((inprogress >> 2) % 2) == 1;
} else {
return ((inprogress >> 1) % 2) == 1;
}
}
public void minigameMatchOwnerWins(boolean forfeit) {
if (!minigameMatchFinish()) return;
owner.setMiniGamePoints(visitor, 1, this.isOmok());
if (visitorforfeits < 4 || !forfeit) ownerscore += 50;
visitorscore += (15 * (forfeit ? -1 : 1));
if (forfeit) visitorforfeits++;
this.broadcast(MaplePacketCreator.getMiniGameOwnerWin(this, forfeit));
minigameMatchFinished();
}
public void minigameMatchVisitorWins(boolean forfeit) {
if (!minigameMatchFinish()) return;
owner.setMiniGamePoints(visitor, 2, this.isOmok());
if (ownerforfeits < 4 || !forfeit) visitorscore += 50;
ownerscore += (15 * (forfeit ? -1 : 1));
if (forfeit) ownerforfeits++;
this.broadcast(MaplePacketCreator.getMiniGameVisitorWin(this, forfeit));
minigameMatchFinished();
}
public void minigameMatchDraw() {
if (!minigameMatchFinish()) return;
owner.setMiniGamePoints(visitor, 3, this.isOmok());
long timeNow = Server.getInstance().getCurrentTime();
@@ -215,6 +273,7 @@ public class MapleMiniGame extends AbstractMapleMapObject {
}
this.broadcast(MaplePacketCreator.getMiniGameTie(this));
minigameMatchFinished();
}
+9 -7
View File
@@ -20,10 +20,11 @@
*/
package tools;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import net.opcodes.RecvOpcode;
import client.MapleCharacter;
import client.MapleClient;
/**
@@ -34,14 +35,15 @@ import client.MapleClient;
public class MapleLogger {
public static List<String> monitored = new ArrayList<>();
public static List<String> ignored = new ArrayList<>();
public static Set<Integer> monitored = new HashSet<>();
public static Set<Integer> ignored = new HashSet<>();
public static void logRecv(MapleClient c, short packetId, Object message) {
if (c.getPlayer() == null){
MapleCharacter chr = c.getPlayer();
if (chr == null){
return;
}
if (!monitored.contains(c.getPlayer().getName())){
if (!monitored.contains(chr.getId())){
return;
}
RecvOpcode op = getOpcodeFromValue(packetId);
@@ -49,7 +51,7 @@ public class MapleLogger {
return;
}
String packet = op.toString() + "\r\n" + HexTool.toString((byte[]) message);
FilePrinter.printError(FilePrinter.PACKET_LOGS + c.getAccountName() + "-" + c.getPlayer().getName() + ".txt", packet);
FilePrinter.printError(FilePrinter.PACKET_LOGS + c.getAccountName() + "-" + chr.getName() + ".txt", packet);
}
private static final boolean isRecvBlocked(RecvOpcode op){
+6 -6
View File
@@ -719,7 +719,7 @@ public class MaplePacketCreator {
mplew.writeInt(1); // 1: Remove the "Select the world you want to play in"
mplew.write(ServerConstants.ENABLE_PIN && !c.canBypassPin() ? 0 : 1); // 0 = Pin-System Enabled, 1 = Disabled
mplew.write(ServerConstants.ENABLE_PIC && !c.canBypassPic() ? (c.getPic() == null ? 0 : 1) : 2); // 0 = Register PIC, 1 = Ask for PIC, 2 = Disabled
mplew.write(ServerConstants.ENABLE_PIC && !c.canBypassPic() ? (c.getPic() == null || c.getPic().equals("") ? 0 : 1) : 2); // 0 = Register PIC, 1 = Ask for PIC, 2 = Disabled
return mplew.getPacket();
}
@@ -905,7 +905,7 @@ public class MaplePacketCreator {
addCharEntry(mplew, chr, false);
}
mplew.write(ServerConstants.ENABLE_PIC && !c.canBypassPic() ? (c.getPic() == null ? 0 : 1) : 2);
mplew.write(ServerConstants.ENABLE_PIC && !c.canBypassPic() ? (c.getPic() == null || c.getPic().equals("") ? 0 : 1) : 2);
mplew.writeInt(ServerConstants.COLLECTIVE_CHARSLOT ? chars.size() + c.getAvailableCharacterSlots() : c.getCharacterSlots());
return mplew.getPacket();
}
@@ -5252,7 +5252,7 @@ public class MaplePacketCreator {
mplew.write(1);
return mplew.getPacket();
}
private static byte[] getMiniGameResult(MapleMiniGame game, int tie, int result, int forfeit) {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue());
@@ -5312,12 +5312,12 @@ public class MaplePacketCreator {
public static byte[] getMiniGameTie(MapleMiniGame game) {
return getMiniGameResult(game, 1, 3, 0);
}
public static byte[] getMiniGameClose(int type) {
public static byte[] getMiniGameClose(boolean visitor, int type) {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(5);
mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue());
mplew.write(PlayerInteractionHandler.Action.EXIT.getCode());
mplew.write(1);
mplew.writeBool(visitor);
mplew.write(type); /* 2 : CRASH 3 : The room has been closed 4 : You have left the room 5 : You have been expelled */
return mplew.getPacket();
}
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="MapleGachaponItemidRetriever" default="default" basedir=".">
<description>Builds, tests, and runs the project MapleGachaponItemidRetriever.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="MapleGachaponItemidRetriever-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,98 @@
Scroll:
2040605
2040626
2040609
2040607
2041029
2041027
2041031
2041037
2041033
2041039
2041041
2041035
2040811 - uncommon
2040809
2040813
2040815 - uncommon
2040015
2040009
2040011
2040013
2040509
2040521
2040519
2040507
2040905
2040909
2040907
2040713
2040715
2040717
2040405
2040409
2040407
2040426
2040303
2040307
2040309
2044505
2044705
2044605
2043305
2043105
2043205
2043005
2043007
2044405
2044305
2043805
2044105
2044205
2044005
2043705
Useable drop:
2012000
2000004 2000012 2002012 2022175 2022456
2020008
2000005 2000019 2002013 2022176 2022457
2012002
2101001 - uncommon
2101004
2101005
2101002
2101003
4006000
Warrior equipment:
1092014
1402017
Magician equipment:
1002037
1002034
1002064
1002038
1382037
1372000
1002013
1002035
1002065
1382000
Bowman equipment:
1452018
Thief equipment:
1472010 1472034 1472039 1472045
1002175
1472017
1472025 1472036 1472041 1472047
Pirate Scroll:
2044901
Pirate equipment:
1002637
@@ -0,0 +1,216 @@
Scroll:
2041012
2048003
[2043800 2043803 2043812 ]
2043301
2040301
[2040804 2040826 ]- uncommon
2043101
2043201
2043001
2044301
2043801
2044201
2043701
2044502
2041011
2041014
2044602
2043302
2040805 - uncommon
2043202
2043002
2048005
2044402
2044302
2043802
2044102
2044202
2043702
Useable drop:
2340000 - uncommon
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
Common equipment:
1402010
1032003
1442013
1432009
1302022
1302029
1322021
1302026
1442017
1322023
1102011
1032008 4031568
1322026
1442016
1312000
1032007
1322025
1322027
1032020
1442015
1432017
1302027
1302049
1372006
1032022
1032021
1372004
1332020
1322007
1032006
1302028
1322003 1702020
1302007
1092030
1302021
1322024
1322012
1032005
1322022
1032013
1302025
1302013
1032017
1032002
1032001
1302017
1432018
1442012
1302000
1032000
1102013
1442022
1372005
1442021
1032009
1302016
Warrior equipment:
1442003
1312007
1402008
1312008 1312018 1312022 1312026
1412008 1412015 1412019 1412024
1442009
1302004
1312006
1442016
1402012 1402022 1402027 1402033
1302003
1312005
1432002 1432019 1432024 1432031
1432001
1302008 1302038 1302043 1302050
1040030
1402015 1402023 1402028 1402034
1322015
1432006 1432021 1432026 1432033
1322002
1302010 1302039 1302044 1302051
1322017 1322036 1322041 1322047
1402003 1402020 1402025 1402031
1402006
1322000
1422001
1442001
1422004
1412004
1322009
1322011
1442000
1412005
1402002 1402019 1402024 1402030
1432004 1432020 1432025 1432032
1442010 1442032 1442036 1442041
1422008
1442007
1422009 1422016 1422020 1422024
1322019 1322038 1322043 1322049
1412003 1412013 1412017 1412022
1412007 1412014 1412018 1412023
1302009
1412000
1322014 1322035 1322040 1322046
1402001
1402007
1432005
Magician equipment:
1382001 1382020 1382025 1382030
1372007 1372019 1372023 1372028
1382010 1382023 1382028 1382033
1382007 1382022 1382027 1382032
1372000
1372003
1382011
1382006 1382021 1382026 1382031
1382000
Bowman equipment:
1452004 1452029 1452034 1452040
1452000
1452010
1452015 1452031 1452036 1452042
1452014
1462012
1462010
1452017
1462000 1462023 1462028 1462033
1452008 1452028 1452033 1452039
1452006
1462006
1452007
1452002
1402001
Thief equipment:
1472006
1472010 1472034 1472039 1472045
1332022
1332011
1472015
1472016
1472023
1472028
1472022
1472011
1472026
1332024
1332009
1472017
1472013
1472029 1472037 1472042 1472048
1472021 1472035 1472040 1472046
1332015 1332035 1332040 1332045
1332031
1332023 1332037 1332042 1332047
1332004
1472000
1332019
1472027
1332018 1332036 1332041 1332046
1472007
1332012 1332033 1332038 1332043
1332016
1472024
1332017
1332003 1332034 1332039 1332044
1472012
1472014
1472005
1472018
1472001
Pirate Scroll:
2044812
Pirate equipment:
1072294
1492009 1492018
@@ -0,0 +1,255 @@
Scroll:
2043302
2040002
2043102
2043002
2044402
2044302
2043802
2044002
2041017 2041053 2041016 2041052 2041015
Useable drop:
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
2022025
2022026
Common equipment:
1402010
1442013
1432009
1002060
1002063
1322023
1002042
1050018
1082147
1002026
1002392
1082149 - uncommon
1062024
1442016
1322025
1322027
1002391 - uncommon
1302027
1372006
1002419 - uncommon
1302019
1092022
1302021
1041004
1002395 1002448
1322024
1082148
1002012
1322012
1032028
1102012
1322022
1051017
1302013
1082146
1442014
1302017
1102013
1102003
1002041
1002097
1302016
1082145
Warrior equipment:
1412006
1040029 5000032
1040086
1050005
1060028
1002059
1060008
1061088
1402012 1402022 1402027 1402033
1302003
1432002 1432019 1432024 1432031
1312011 1312021 1312025 1312029
1302008 1302038 1302043 1302050
1040030
1002004
1402015 1402023 1402028 1402034
1322028 1322039 1322044 1322050
1322015
1432006 1432021 1432026 1432033
1442006
1322000
1002085
1002056
1092013
1002058
1002050
1060011
1322009
1322011
1442000
1051011
1061016
1060018
1041024
1061020
1302005
1402002 1402019 1402024 1402030
1002030
1092004
1041023
1422008
1060009
1051000
1002021
1442005 1442031 1442035 1442040
1412003 1412013 1412017 1412022
1412007 1412014 1412018 1412023
1422007
1302009
1402000
1402001
1402007
1432005
Magician equipment:
1382001 1382020 1382025 1382030
1002037
1060014
1040018
1061027
1050002
1002152
1051027
1050035
1050056
1051047
1051030
1002274
1050074
1002218
1002254
1082088
1382007 1382022 1382027 1382032
1002013
1082087
1372008
1382008 1382024 1382029 1382034
1372002
1372003
1382011
1382004
1050047
1040019
1041041
1061034
1041051
1051045
1051024
1082081
1041030
1040018
1002073
1382003
1082086
1382014 1702033
1050055
1050025
1002155
1060015
Bowman equipment:
1452004 1452029 1452034 1452040
1462003
1060070
1002118
1061058
1040003
1002160
1002121
1040068
1061063
1040080
1462004
1041008
1061006
1061009
1040022 1041032
1002168
1040067
1060056
1041054
1041067
1060063
1002213
1002119
1462005
1452001
1462000 1462023 1462028 1462033
1040025 1041033
1002166
1002161
1040069
1051039
1452006
1462006
1452007
1402001
1041062
Thief equipment:
1472010 1472034 1472039 1472045
1472006
1332011
1472031 1472038 1472043 1472049
1041048
1472019
1041095
1040095
1002128
1061077
1060025
1041040
1061033
1472028
1472022
1472011
1040096
1062002
1002129
1472026
1332009
1060043
1002249
1472021 1472035 1472040 1472046
1040084 1041076
1332015 1332035 1332040 1332045
1002173
1002148
1332004
1332018 1332036 1332041 1332046
1472009
1061069
1002176
1041044
1061037
1060032
1472020
1040060
1472018
1332013
1332002
1402001
Pirate Scroll:
2044902 2044907 2044904 2044901 2044906 2044903 [2044900 2044908 ]
Pirate equipment:
1052107
1082189
1052116
1072309
@@ -0,0 +1,174 @@
Scroll:
2040001
2041002
2040805 - uncommon
2040702
2043802
2040402
2043702
Useable Drops:
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
2020012
2030007
Common equipment:
1432009
1302022
1322021
1302026
1442017
1082147
1102043
1322026
1442016
1402012 1402022 1402027 1402033
1322025
1322027
1302027
1312012
1062000
1332020
1302028
1372002
1002033
1092022
1302021
1102041 - uncommon
1322009
1102042 - uncommon
1322024
1082148
1002012
1322012
1322022
1002020 1002454
1302013
1082146
1442014
1002096
1302017
1442012
Beginner equipment:
1442018 1442039 - uncommon
Warrior equipment:
1092011
1092014
1302003
1432001
1312011 1312021 1312025 1312029
1002088
1041020
1322015
1442004
1422008
1302056 1402011 1402021 1402026 1402032
1432000
1442005 1442031 1442035 1442040
Magician equipment:
1382001 1382020 1382025 1382030
1041053
1041029
1050053
1051032
1050073
1061036
1002253
1002034
1051025
1050067
1051052
1002072
1002144
1051054
1050069
1372007 1372019 1372023 1372028
1050056
1050074
1002254
1002274
1002218
1051055
1382010 1382023 1382028 1382033
1002246
1050039
1382007 1382022 1382027 1382032
1372000
1002013
1050072
1002036
1002244
1372008
1382008 1382024 1382029 1382034
1382011
1092021
1051034
1050047
1040019
1041031
1051033
1002153
1002252
1051024
1051053
1050068
1382003
1382006 1382021 1382026 1382031
1050055
1051031
1050025
1002155
1002245
1372001 1372018 1372022 1372027
Bowman equipment:
1452004 1452029 1452034 1452040
1452023 1702035
1060057
1432001
1040071
1002137
1462009 1462026 1462031 1462036
1452017
1040025 1041033
1041027
1452005 1452027 1452032 1452038
1452007
1061057
Thief equipment:
1472006
1472019
1060084
1472028
1472004
1002179
1082074
1472029 1472037 1472042 1472048
1040100
1332015 1332035 1332040 1332045
1432001
1040097
1060071
1472007
1472002
1051009
1041044
1041003
1332016
1472020
1332003 1332034 1332039 1332044
Pirate Scroll:
2044813
Pirate equipment:
1002622
1082204
1082213
1082198
@@ -0,0 +1,117 @@
Scroll:
2041016
2043302
2040805 - uncommon
2040902
Useable drop:
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
2022025
2022027
Common equipment:
1442013
1432009
1322021
1050018
1002392
1082149 - uncommon
1002394
1442004
1372002
1002418
1002033
1092008
1102041 - uncommon
1082148
1062001
1302017
1032023
1102013
1102040
1002041
1002097
Warrior equipment:
1332026
1051010
1432001
1422005 1422015 1422019 1422023
1332019
1302010 1302039 1302044 1302051
1002056
1060011
1322011
1432004 1432020 1432025 1432032
1002028
1051000
1442007
1302002
Magician equipment:
1002037
1002034
1082020
1050039
1372000
1002215
1051034
1040019
1061034
1382003
1382006 1382021 1382026 1382031
1050025
Bowman equipment:
1002118
1061081
1452011 1452030 1452035 1452041
1462012
1452006
1452007
Thief equipment:
1472010 1472034 1472039 1472045
1472029 1472037 1472042 1472048
1041048
1041095
1060031
1061033
1041049
1472011
1040096
1472033
1332026
1051006
1082074
1472025 1472036 1472041 1472047
1061106
1040084 1041076
1332015 1332035 1332040 1332045
1472000
1332019
1002183
1002209
1092020
1332029
1092019
1061099
1060106 1061116
1040032 1041036
1040059
1332003 1332034 1332039 1332044
1040060
1060046
1472005
1332027
Pirate Scroll:
2044804
2044906
Pirate equipment:
1482004 1482015
1072318
1492007 1492016
@@ -0,0 +1,113 @@
Scroll:
2040407 2040406
2040409 2040408
2040405 2040404
2040411 2040410
2040409 2040408
2044405 2044404
2040611 2040610
2040607 2040606
2040813 2040812
2041039 2041038
2041041 2041040
2041035 2041034
2041031 2041030
2041037 2041036
2043105 2043104
2043305 2043304
2040103 2040104
2040605 2040604
2040611 2040610
2043005 2043004
2043205 2043204
2044205 2044204
2044005 2044004
2040521
2040511 2040510
2043305 2043304
2040909 2040908
2040905 2040904
2040907 2040906
2040809 2040808
2040813 2040812
2040811 - uncommon
2040015 2040014
2040715 2040714
2040713 2040712
2044005 2044004
2043705 2043704
2044505 2044504
2040519 2040518
2040203 2040204
2040103 2040104
2040108 2040109
2044705 2044704
2040907 2040906
2040815 2040814 - uncommon
2044305 2044304
2043007 2043006
2040307
2040305 2040304
2040309 2040308
2040811 - uncommon
2040208
2040209
Useable drop:
Common equipment:
1102040
1102041 - uncommon
1102042 - uncommon
1102086
1082145
1032027
1082146
1002395 1002448
1002083
1002392
1082149 - uncommon
1002587
1022047
Beginner equipment:
Warrior equipment:
1312002
1432013
1060030
1422008
1050022
1050011
1402013
1402017
1302012 1302041 1302046 1302053
Mage equipment:
1002074
1050029
1040093
1050056
1050039
1382008 1382024 1382029 1382034
Bowman equipment:
1002159
1061051
1040023
Thief equipment:
1061054
1061106
1002249
1040084 1041076
1060052
1472054
Pirate Scroll:
2044803
Pirate equipment:
1482009 1482018
1072303
@@ -0,0 +1,159 @@
Scroll:
2048000
2040601
2041019
2041007
2041016
2041022
2041001
2041010
2041013
2041004
2044701
2043301
2040301
2048004
2048001
2040901
2040701
2040704
2040707
2040602
2041020
2041008
2041017
2041023
2041002
2041011
2041014
2041005
2044702
2043302
[2040302 2040330 ]
2040805 - uncommon
2040002
2044402
2048005
2048002
2040702
2040705
2040708
2044302
2043802
2040402
2043702
Useable drop:
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
4006000
4006001
Common equipment:
1032003
1432009
1302022
1302029
1102014
1102018
1312014
1302026
1102015
1032011 1041078
1312013
1032008 4031568
1032019
1032007
1332030
1032020
1032004
1302027
1032022
1312012
1032021
1032006
1302028
1322003 1702020
1002419 - uncommon
1032016
1032015
1302024
1092008
1032018
1302021
1032014
1332021
1322012
1032005
1032013
1102012
1302025
1302013
1032002
1032001
1032012
1302017
1032010
1402014
1102017
1102013
1442021
1032009
Beginner equipment:
1442018 1442039 - uncommon
1332021
1422011
Warrior equipment:
1402017
1422005 1422015 1422019 1422023
1002023
1332016
1432005
Magician equipment:
1002037
1002034
1002064
1002038
1002013
1002036
1382011
1002035
1002065
1382014 1702033
1372001 1372018 1372022 1372027
Bowman equipment:
1452026
1002162
1002164
1462018
1002165
1452014
1002163
1452012
1002161
1452009
1462007 1462024 1462029 1462034
Thief Equipment:
1332022
1002175
1002172
1002174
1040096
1472033
1002173
1332054
1472054
1002171
1332016
Pirate Scroll:
2044811
Pirate equipment:
1002646
@@ -0,0 +1,119 @@
Scroll:
2040305 2040304
2040306
2040309 2040308
2044604
2041039
2041037
2041035
2041034
2041041
2040608
2040605
2040604
2040611
2040610
2040811 - uncommon
2040810 - uncommon
2040813 2040812
2040815 2040814 - uncommon
2040809 2040808
2043004
2040017
2040015
2040011
2040013 2040012
2040405
2040407 2040406
2040411 2040410
2040511
2040509
2040508
2040519
2040521 2040520
2040108 2040109
2040904
2040909 2040908
2043105 2043104
2044105 2044104
2043005
2043004
2043007 2043006
2044005 2044004
2044205 2044204
2043305 2043304
2040607 2040606
2040715 2040714
2040713
2044305 2044304
Useable drop:
Common equipment:
1102041 - uncommon
1102042 - uncommon
1102040
1102084
1002392
1432009
1002393 1002903
1002394
1082149 - uncommon
1082147
1082148
1032028
1002585
1002586
1432013
1022047
1322027
1432018
Beginner equipment:
1072264
1072262
1072263
Warrior equipment:
1060074
1322002
1002340
1442004
1402037
1422008
1050022
Mage equipment:
1382037
1060014
1051026
1050056
1050029
1051030
1382036
1372032
1041015
1382015 3300001
1372008
1382008 1382024 1382029 1382034
Bowman equipment:
1452018
1041068
1462007 1462024 1462029 1462034
Thief equipment:
1060052
1472013
1002180
1002170
1060073 1061071
1060099
Pirate Scroll:
2044904
Pirate equipment:
1492004 1492015
1492012
@@ -0,0 +1,117 @@
Useable drop:
2000004 2000012 2002012 2022175 2022456
2000005 2000019 2002013 2022176 2022457
Common equipment:
1402010
1302022
1002060
1322021
1082147
1002006
1002026
1002392
1082149 - uncommon
1322025
1322027
1002391 - uncommon
1102000
1082150
1332020
1322007
1002419 - uncommon
1302021
1102041 - uncommon
1002395 1002448
1082148
1322012
1302017
1322010
1032000
1102013
1002097
Warrior equipment:
1322020
1312007
1312008 1312018 1312022 1312026
1302004
1312006
1082036
1082117
1061088
1302008 1302038 1302043 1302050
1422005 1422015 1422019 1422023
1002048
1061087
1302018 1302042 1302047 1302054
1322017 1322036 1322041 1322047
1422001
1040103
1060077
1002022
1002050
1442000
1432030
1402037
1092002
1041092
1050006
1432004 1432020 1432025 1432032
1061019
1432000
1060009
1051000
1002021
1322014 1322035 1322040 1322046
1432005
Magician equipment:
1051032
1040018
1051027
1372007 1372019 1372023 1372028
1050049
1002036
1382012
1002217
1051033
1382006 1382021 1382026 1382031
1050048
Bowman equipment:
1061061
1060062
1040075
1462013 1462027 1462032 1462037
1041065
1452006
Thief equipment:
1040095
1060084
1002182
1041049
1002247
1332024
1332009
1060024
1332015 1332035 1332040 1332045
1041060
1061032
1041074
1041003
1332016
1472020
1332003 1332034 1332039 1332044
1041059
Pirate Scroll:
2044907
2044802 2044804 2044801 2044803 [2044800 2044815 ]
Pirate equipment:
1002631
1052122
1482012
@@ -0,0 +1,69 @@
Scroll:
2048005
2048002
2043202
2044602
2043214
2041307
2040916 - uncommon
2041035
2044104
2044505
2044305
2043304
2041309
2044010
Useable drop:
2022016
2000005 2000019 2002013 2022176 2022457
2022025
2022027
Common equipment:
1402000
1402013
1002418
1022047
1102042 - uncommon
1082145
1082147
1082146
1082178
1082175
Common setup:
3010073
3010099
Beginner equipment:
Warrior equipment:
1422013
1432030
Magician equipment:
1372002
1382003
Bowman equipment:
1040023
Thief equipment:
1332003 1332034 1332039 1332044
1002209
Pirate Scroll:
2044803
2044814
2044904
2044902
2044901
Pirate equipment:
1082198
1082213
1482007 1482016
1492004 1492015
1002646
@@ -0,0 +1,109 @@
Scroll:
2048005
2048002
2043202
2044602
2043214
2041307
2040916 - uncommon
2041035
2044104
2044505
2044305
2043304
Useable drop:
2022016
2000005 2000019 2002013 2022176 2022457
2022025
2022027
Common equipment:
1332020
1312004
1332032 5010034 9250053
1322023
1322026
1322022
1322012
1302014
1302049
1302017
1332007
1432009
1432016
1432017
1432009
1402013
1402044
1442014
1442017
1442016
1442025
1002418
1082178
1082179
1082148
1032027
1032032
1102028
1102086
1102042 - uncommon
Common setup:
3010073
3010111
Beginner equipment:
Warrior equipment:
1412005
1402048
1402049
1322011
1302003
1302004
1302008 1302038 1302043 1302050
Magician equipment:
1372000
1372009
1372001 1372018 1372022 1372027
1372011 1702032
1382006 1382021 1382026 1382031
1382014 1702033
Bowman equipment:
1452018
1452006
1452008 1452028 1452033 1452039
1452005 1452027 1452032 1452038
1462002
1462007 1462024 1462029 1462034
1462003
1002169
Thief equipment:
1472023
1332012 1332033 1332038 1332043
1332017
1332022
1332006
1332029
1040097
Pirate Scroll:
2044902
2044901
2044811
2044903
2044804
Pirate equipment:
1052107
1082204
1072318
1002637
1482009 1482018
1492007 1492016
@@ -0,0 +1,165 @@
Scroll:
2048003
2048000
2040601
2044501
2041019
2041016
2041022
2041010
2041013
2043301
2040301
[2040804 2040826 ]- uncommon
2040801
2040817 - uncommon
2040001
2040004
2043101
2043201
2043001
2040504
2040501
2048004
2048001
2044401
2040901
2040701
2040704
2040707
2044301
2043801
2044101
2044201
2044001
2040602
2044502
2041020
2041017
2041023
2041014
2041005
2044702
2044602
2043302
[2040302 2040330 ]
2040805 - uncommon
2040802
2040005
2043202
2043002
2040505
2040502
2048005
2048002
2044402
2040902
2040702
2040705
2040708
2044302
2043802
2044202
2044002
Useable drop:
2340000 - uncommon
2012000
2012003
2020007
2000004 2000012 2002012 2022175 2022456
2012001
2020008
2070006
2020012
2000005 2000019 2002013 2022176 2022457
2030007
2012002
2002001
2070005
Common equipment:
1032003
1432009
1102014
1102018
1002392
1082149 - uncommon
1322026
1032022
1312012
1332020
1092030
1032016
1032015
1032014
1322024
1032013
1322022
1102016
1032012
1032023
1402014
1032000
1102017
Beginner equipment:
1442018 1442039 - uncommon
Warrior equipment:
1402017
1051010
1432011
1442006
1322002
1422004
1432010 1432023 1432028 1432035
1051011
1060018
1432000
1422003
1412003 1412013 1412017 1412022
1422000
Magician equipment:
1002034
1002142
1382010 1382023 1382028 1382033
1002013
1382008 1382024 1382029 1382034
1382011
1050047
1002065
Bowman equipment:
1452003
1002165
1040068
1462013 1462027 1462032 1462037
1462011
1462012
1061050
1462010
1002161
Thief equipment:
1332022
1002175
1040042
1472004
1040057
1332031
1332023 1332037 1332042 1332047
1332010
1002171
1060046
Pirate Scroll:
2044801
2044903
2044814
Pirate equipment:
1052131
1482007 1482016
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
@@ -0,0 +1,375 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2018 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/>.
*/
package maplegachaponitemidretriever;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author RonanLana
*
* This application reads metadata for the gachapons found on the "gachapon_items.txt"
* recipe file, then checks up the Handbook DB (installed through MapleIdRetriever)
* and translates the item names from the recipe file into their respective itemids.
* The translated itemids are then stored in specific gachapon files inside the
* "lib/gachapons" folder.
*
* Estimated parse time: 1 minute
*/
public class MapleGachaponItemidRetriever {
static String host = "jdbc:mysql://localhost:3306/heavenms";
static String driver = "com.mysql.jdbc.Driver";
static String username = "root";
static String password = "";
static Connection con = null;
static InputStreamReader fileReader = null;
static BufferedReader bufferedReader = null;
static PrintWriter printWriter = null;
// ------- SET-UP section arguments --------
static String directoryName = "./handbook/";
// ------- SEARCH section arguments --------
static String inputName = "lib/gachapon_items.txt";
static String outputPath = "lib/gachapons/";
static Pattern p = Pattern.compile("(\\d*)%");
static int[] scrollsChances = new int[]{10, 15, 30, 60, 65, 70, 100};
static Map<GachaponScroll, List<Integer>> scrollItemids = new HashMap<>();
private static void insertGachaponScrollItemid(Integer id, String name, String description, boolean both) {
GachaponScroll gachaScroll = getGachaponScroll(name, description, both);
List<Integer> list = scrollItemids.get(gachaScroll);
if (list == null) {
list = new LinkedList<>();
scrollItemids.put(gachaScroll, list);
}
list.add(id);
}
private static void loadHandbookUseNames() throws SQLException {
PreparedStatement ps = con.prepareStatement("SELECT * FROM `handbook` WHERE `id` >= 2040000 AND `id` < 2050000 ORDER BY `id` ASC;");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
Integer id = rs.getInt("id");
String name = rs.getString("name");
if (isUpgradeScroll(name)) {
String description = rs.getString("description");
insertGachaponScrollItemid(id, name, description, false);
insertGachaponScrollItemid(id, name, description, true);
}
}
rs.close();
ps.close();
/*
for (Entry<GachaponScroll, List<Integer>> e : scrollItemids.entrySet()) {
System.out.println(e);
}
System.out.println("------------");
*/
}
private static class GachaponScroll {
private String header;
private String target;
private String buff;
private int prop;
private GachaponScroll(GachaponScroll from, int prop) {
this.header = from.header;
this.target = from.target;
this.buff = from.buff;
this.prop = prop;
}
private GachaponScroll(String name, String description, boolean both) {
String[] params = name.split(" for ");
if (params.length < 3) {
return;
}
String header = both ? "scroll" : " " + params[0];
String target = params[1];
int prop = 0;
String buff = params[2];
Matcher m = p.matcher(buff);
if (m.find()) {
prop = Integer.valueOf(m.group(1));
buff = buff.substring(0, m.start() - 1).trim();
} else {
m = p.matcher(description);
if (m.find()) {
prop = Integer.valueOf(m.group(1));
}
}
int idx = buff.indexOf(" ("); // remove percentage & dots from name checking
if (idx > -1) {
buff = buff.substring(0, idx);
}
buff = buff.replace(".", "");
this.header = header;
this.target = target;
this.buff = buff;
this.prop = prop;
}
@Override
public int hashCode() {
int result = (int) (prop ^ (prop >>> 32));
result = 31 * result + (header != null ? header.hashCode() : 0);
result = 31 * result + (target != null ? target.hashCode() : 0);
result = 31 * result + (buff != null ? buff.hashCode() : 0);
return result;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GachaponScroll sc = (GachaponScroll) o;
if (header != null ? !header.equals(sc.header) : sc.header != null) return false;
if (target != null ? !target.equals(sc.target) : sc.target != null) return false;
if (buff != null ? !buff.equals(sc.buff) : sc.buff != null) return false;
if (prop != sc.prop) return false;
return true;
}
@Override
public String toString() {
return header + " for " + target + " for " + buff + " - " + prop + "%";
}
}
private static String getGachaponScrollResults(String line, boolean both) {
String str = "";
List<GachaponScroll> gachaScrollList;
GachaponScroll gachaScroll = getGachaponScroll(line, "", both);
if (gachaScroll.prop != 0) {
gachaScrollList = Collections.singletonList(gachaScroll);
} else {
gachaScrollList = new ArrayList<>(scrollsChances.length);
for (int prop : scrollsChances) {
gachaScrollList.add(new GachaponScroll(gachaScroll, prop));
}
}
for (GachaponScroll gs : gachaScrollList) {
List<Integer> gachaItemids = scrollItemids.get(gs);
if (gachaItemids != null) {
String listStr = "";
for (Integer id : gachaItemids) {
listStr += id.toString();
listStr += " ";
}
if (gachaItemids.size() > 1) {
str += "[" + listStr + "]";
} else {
str += listStr;
}
}
}
return str;
}
private static GachaponScroll getGachaponScroll(String name, String description, boolean both) {
name = name.toLowerCase();
name = name.replace("for acc ", "for accuracy ");
name = name.replace("blunt weapon", "bw");
name = name.replace("eye eqp.", "eye accessory");
name = name.replace("face eqp.", "face accessory");
name = name.replace("for attack", "for att");
name = name.replace("1-handed", "one-handed");
name = name.replace("2-handed", "two-handed");
return new GachaponScroll(name, description, both);
}
private static boolean isUpgradeScroll(String name) {
return name.matches("^(([D|d]ark )?[S|s]croll for).*");
}
private static void fetchLineOnMapleHandbook(String line, String rarity) throws SQLException {
String str = "";
if (!isUpgradeScroll(line)) {
PreparedStatement ps = con.prepareStatement("SELECT `id` FROM `handbook` WHERE `name` LIKE ? COLLATE latin1_general_ci ORDER BY `id` ASC;");
ps.setString(1, line);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
Integer id = rs.getInt("id");
str += id.toString();
str += " ";
}
rs.close();
ps.close();
} else {
str += getGachaponScrollResults(line, false);
if (str.isEmpty()) {
str += getGachaponScrollResults(line, true);
if (str.isEmpty()) {
System.out.println("NONE for '" + line + "' : " + getGachaponScroll(line, "", false));
}
}
}
if (str.isEmpty()) {
str += line;
}
if (rarity != null) {
str += ("- " + rarity);
}
printWriter.println(str);
}
private static void fetchDataOnMapleHandbook() throws SQLException {
String line;
try {
fileReader = new InputStreamReader(new FileInputStream(inputName), "UTF-8");
bufferedReader = new BufferedReader(fileReader);
int skip = 0;
boolean lineHeader = false;
while((line = bufferedReader.readLine()) != null) {
if (skip > 0) {
skip--;
if (lineHeader) {
if (!line.isEmpty()) {
lineHeader = false;
printWriter.println();
printWriter.println(line + ":");
}
}
} else if (line.isEmpty()) {
printWriter.println("");
} else if (line.startsWith("Gachapon ")) {
String s[] = line.split("� ");
String gachaponName = s[s.length - 1];
gachaponName = gachaponName.replace(" ", "_");
gachaponName = gachaponName.toLowerCase();
if (printWriter != null) printWriter.close();
printWriter = new PrintWriter(outputPath + gachaponName + ".txt", "UTF-8");
skip = 2;
lineHeader = true;
} else if (line.startsWith(".")) {
skip = 1;
lineHeader = true;
} else {
line = line.replace("�", "'");
for (String item : line.split("\\s\\|\\s")) {
item = item.trim();
if (!item.contentEquals("n/a")) {
String[] itemInfo = item.split(" - ");
fetchLineOnMapleHandbook(itemInfo[0], itemInfo.length > 1 ? itemInfo[1] : null);
}
}
}
}
if (printWriter != null) printWriter.close();
bufferedReader.close();
fileReader.close();
}
catch(FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
catch(IOException ex) {
System.out.println(ex.getMessage());
}
}
public static void main(String[] args) {
try {
Class.forName(driver).newInstance();
con = DriverManager.getConnection(host, username, password);
loadHandbookUseNames();
fetchDataOnMapleHandbook();
con.close();
}
catch(SQLException e) {
System.out.println("Error: invalid SQL syntax");
System.out.println(e.getMessage());
}
catch(ClassNotFoundException e) {
System.out.println("Error: could not find class");
System.out.println(e.getMessage());
}
catch(InstantiationException | IllegalAccessException e) {
System.out.println("Error: instantiation failure");
System.out.println(e.getMessage());
}
}
}
Binary file not shown.
@@ -82,10 +82,10 @@ public class MapleIdRetriever {
}
private static void parseMapleHandbookLine(String line) throws SQLException {
String[] tokens = line.split(" - ");
String[] tokens = line.split(" - ", 3);
if(tokens.length > 1) {
PreparedStatement ps = con.prepareStatement("INSERT INTO `handbook` (`id`, `name`) VALUES (?, ?)");
PreparedStatement ps = con.prepareStatement("INSERT INTO `handbook` (`id`, `name`, `description`) VALUES (?, ?, ?)");
try {
ps.setInt(1, Integer.parseInt(tokens[0]));
} catch (NumberFormatException npe) { // odd...
@@ -93,7 +93,10 @@ public class MapleIdRetriever {
ps.setInt(1, Integer.parseInt(num));
}
ps.setString(2, tokens[1]);
ps.setString(3, tokens.length > 2 ? tokens[2] : "");
ps.execute();
ps.close();
}
}
@@ -124,14 +127,17 @@ public class MapleIdRetriever {
private static void setupSqlTable() throws SQLException {
PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS `handbook`;");
ps.execute();
ps.close();
ps = con.prepareStatement("CREATE TABLE `handbook` ("
+ "`key` int(10) unsigned NOT NULL AUTO_INCREMENT,"
+ "`id` int(10) DEFAULT NULL,"
+ "`name` varchar(200) DEFAULT NULL,"
+ "`description` varchar(1000) DEFAULT '',"
+ "PRIMARY KEY (`key`)"
+ ") ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;");
ps.execute();
ps.close();
}
private static void parseMapleHandbook() throws SQLException {
@@ -175,6 +181,9 @@ public class MapleIdRetriever {
str += " ";
}
rs.close();
ps.close();
printWriter.println(str);
}

Some files were not shown because too many files have changed in this diff Show More