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:
@@ -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/
|
||||
|
||||
@@ -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
@@ -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
@@ -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.
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,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();
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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[] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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[] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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[] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 [] {};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
||||
+375
@@ -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
Reference in New Issue
Block a user