New PQ: Boss Rush PQ + Ellin/PiratePQ bug fixes

Introducing Boss Rush PQ. Corrected a few issues regarding rewardings in
PiratePQ and EllinPQ and implemented a standardized way to script PQs.
This commit is contained in:
ronancpl
2017-04-25 11:55:44 -03:00
parent 828a8a02a2
commit 939b214fb5
66 changed files with 16104 additions and 44622 deletions
File diff suppressed because it is too large Load Diff
+7 -1
View File
@@ -169,4 +169,10 @@ Atualiza
22 Abril 2017,
Várias correções envolvendo concorrências em propriedades do MapleCharacter.
Adição de constante USE_EQUIPMNT_LVLUP: dá pra nivelar qualquer equip até o nível desejado.
Algumas correções em quests no cliente e no servidor.
Algumas correções em quests no cliente e no servidor.
Correção de bug que gerava client stuck para Outlaw, quando chamava 2 summons e mudava de mapa.
23 - 25 Abril 2017,
Introdução de métodos que auxiliam na normalização dos scripts para PQs.
Nova PQ: Boss Rush PQ.
Correção de situações nas PQs Ellin e Pirate.
+17 -6
View File
@@ -3,13 +3,24 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/BeholderHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/inventory/Equip.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/world/MapleParty.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/PlayerLoggedinHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/scripting/event/EventManager.java</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/portal/davy_next4.js</file>
<file>file:/C:/Nexon/MapleSolaxia/src/server/maps/MapleMapObjectType.java</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/portal/party6_out.js</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/event/Ellin.js</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/event/PiratePQ.js</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/command/Commands.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/MapleCharacter.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/tools/MaplePacketCreator.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/constants/ServerConstants.java</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/portal/party6_stage.js</file>
<file>file:/C:/Nexon/MapleSolaxia/src/scripting/event/EventInstanceManager.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/world/MaplePartyCharacter.java</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/reactor/3008000.js</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/MapleJob.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/scripting/AbstractPlayerInteraction.java</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/npc/world0/9000037.js</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/npc/world0/2094002.js</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/event/BossRushPQ.js</file>
<file>file:/C:/Nexon/MapleSolaxia/scripts/npc/world0/2060009.js</file>
<file>file:/C:/Nexon/MapleSolaxia/src/server/maps/MapleMap.java</file>
</group>
</open-files>
+153
View File
@@ -0,0 +1,153 @@
var isPq = true;
var minPlayers = 1, maxPlayers = 6;
var minLevel = 1, maxLevel = 200;
var entryMap = 970030100;
var exitMap = 970030000;
var recruitMap = 970030000;
var clearMap = 970030000;
function init() {
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
function getEligibleParty(party) { //selects, from the given party, the team that is allowed to attempt this event
var eligible = [];
var hasLeader = false;
if(party.size() > 0) {
var partyList = party.toArray();
for(var i = 0; i < party.size(); i++) {
var ch = partyList[i];
if(ch.getMapId() == recruitMap && ch.getLevel() >= minLevel && ch.getLevel() <= maxLevel) {
if(ch.isLeader()) hasLeader = true;
eligible.push(ch);
}
}
}
if(!(hasLeader && eligible.length >= minPlayers && eligible.length <= maxPlayers)) eligible = [];
return eligible;
}
function setup(level, leaderid) {
em.setProperty("state", "1");
em.setProperty("leader", "true");
var eim = em.newInstance("BossRush" + leaderid);
em.setProperty("level", level);
eim.startEventTimer(45 * 60000); //45 mins
return eim;
}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function removePlayer(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < 970030001 || mapid > 970042711) {
var party = eim.getPlayers();
if (eim.isLeader(player) || party.size() <= minPlayers) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
var party = eim.getPlayers();
if (eim.isLeader(player) || party.size() <= minPlayers) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
var party = eim.getPlayers();
if (eim.isLeader(player) || party.size() <= minPlayers) {
eim.unregisterPlayer(player);
end(eim);
}
else
removePlayer(eim, player);
}
function leftParty(eim, player) {
var party = eim.getPlayers();
if (party.size() <= minPlayers)
end(eim);
else
playerExit(eim, player);
}
function disbandParty(eim) {
end(eim);
}
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 playerClear(eim, player, toMap) {
eim.unregisterPlayer(player);
if(toMap != null) player.changeMap(toMap);
else player.changeMap(clearMap, 0);
}
function complete(eim, toMap) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerClear(eim, party.get(i), toMap);
}
eim.dispose();
}
function clearPQ(eim, toMap) {
complete(eim, toMap);
}
function monsterKilled(mob, eim) {}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {
em.cancelSchedule();
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
+1 -1
View File
@@ -164,7 +164,7 @@ function playerExit(eim, player) {
eim.broadcastPlayerMsg(5, "[Expedition] " + player.getName() + " has left the map.");
eim.unregisterPlayer(player);
if (eim.disposeIfPlayerBelow(0, 0)) {
if (eim.disposeIfPlayerBelow(minPlayers, 610030010)) {
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
+43 -6
View File
@@ -1,15 +1,37 @@
importPackage(Packages.client.inventory);
importPackage(Packages.tools);
var minPlayers = 2;
var isPq = true;
var minPlayers = 4, maxPlayers = 6;
var minLevel = 44, maxLevel = 55;
var entryMap = 930000000;
var exitMap = 930000800;
var recruitMap = 300030100;
var clearMap = 930000800;
function init() {
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
function getEligibleParty(party) { //selects, from the given party, the team that is allowed to attempt this event
var eligible = [];
var hasLeader = false;
if(party.size() > 0) {
var partyList = party.toArray();
for(var i = 0; i < party.size(); i++) {
var ch = partyList[i];
if(ch.getMapId() == recruitMap && ch.getLevel() >= minLevel && ch.getLevel() <= maxLevel && ch.getJob().getId() / 1000 == 0) { //only adventurers
if(ch.isLeader()) hasLeader = true;
eligible.push(ch);
}
}
}
if(!(hasLeader && eligible.length >= minPlayers && eligible.length <= maxPlayers)) eligible = [];
return eligible;
}
function setup(level, leaderid) {
em.setProperty("state", "1");
em.setProperty("leader", "true");
@@ -119,8 +141,23 @@ function end(eim) {
eim.dispose();
}
function clearPQ(eim) {
end(eim);
function playerClear(eim, player, toMap) {
eim.unregisterPlayer(player);
if(toMap != null) player.changeMap(toMap);
else player.changeMap(clearMap, 0);
}
function complete(eim, toMap) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerClear(eim, party.get(i), toMap);
}
eim.dispose();
}
function clearPQ(eim, toMap) {
complete(eim, toMap);
}
function monsterKilled(mob, eim) {}
+44 -4
View File
@@ -1,13 +1,37 @@
var isPq = true;
var minPlayers = 1;
var minPlayers = 3, maxPlayers = 6;
var minLevel = 55, maxLevel = 100;
var entryMap = 925100000;
var exitMap = 925100700;
var recruitMap = 251010404;
var clearMap = 925100600;
function init() {
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
function getEligibleParty(party) { //selects, from the given party, the team that is allowed to attempt this event
var eligible = [];
var hasLeader = false;
if(party.size() > 0) {
var partyList = party.toArray();
for(var i = 0; i < party.size(); i++) {
var ch = partyList[i];
if(ch.getMapId() == recruitMap && ch.getLevel() >= minLevel && ch.getLevel() <= maxLevel) {
if(ch.isLeader()) hasLeader = true;
eligible.push(ch);
}
}
}
if(!(hasLeader && eligible.length >= minPlayers && eligible.length <= maxPlayers)) eligible = [];
return eligible;
}
function setup(level, leaderid) {
em.setProperty("state", "1");
em.setProperty("leader", "true");
@@ -119,7 +143,7 @@ function changedMap(eim, player, mapid) {
if (mapid < 925100000 || mapid > 925100500) {
eim.unregisterPlayer(player);
if (eim.disposeIfPlayerBelow(0, 0)) {
if (eim.disposeIfPlayerBelow(minPlayers, exitMap)) {
em.setProperty("state", "0");
em.setProperty("leader", "true");
}
@@ -129,6 +153,7 @@ function changedMap(eim, player, mapid) {
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
var party = eim.getPlayers();
if (eim.isLeader(player) || party.size() <= minPlayers) { // Check for party leader
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++)
@@ -188,8 +213,23 @@ function end(eim) {
eim.dispose();
}
function clearPQ(eim) {
end(eim);
function playerClear(eim, player, toMap) {
eim.unregisterPlayer(player);
if(toMap != null) player.changeMap(toMap);
else player.changeMap(clearMap, 0);
}
function complete(eim, toMap) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerClear(eim, party.get(i), toMap);
}
eim.dispose();
}
function clearPQ(eim, toMap) {
complete(eim, toMap);
}
function monsterKilled(mob, eim) {}
+3 -1
View File
@@ -2,6 +2,8 @@
* 4th Job Snipe / Concentration
*/
var minPlayers = 1;
function init() {
em.setProperty("started", "false");
}
@@ -42,7 +44,7 @@ function changedMap(eim, player, mapid) {
if (mapid != 910500000) {
eim.unregisterPlayer(player);
if (eim.disposeIfPlayerBelow(0, 0)) {
if (eim.disposeIfPlayerBelow(minPlayers, 105090200)) {
em.setProperty("started", "false");
}
}
+1 -1
View File
@@ -19,5 +19,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -19,5 +19,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -19,5 +19,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -19,5 +19,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -19,5 +19,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -9,5 +9,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+61 -86
View File
@@ -1,99 +1,74 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <[email protected]>
Matthias Butz <[email protected]>
Jan Christian Meyer <[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License 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: Guon
* @map: 251010404 - Over the Pirate Ship
* @func: Pirate PQ
*/
var status = 0;
var minLevel = 55;
var maxLevel = 100;
var minPlayers = 2;
var maxPlayers = 6;
var minLevel = 1;
var maxLevel = 200;
var minPartySize = 1;
var maxPartySize = 6;
function start() {
status = -1;
action(1, 0, 0);
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if (status == 0) {
if (cm.getParty() == null) {
cm.sendOk("Please come back to me after you've formed a party.");
if (mode == -1) {
cm.dispose();
return;
}
if (!cm.isLeader()) {
cm.sendSimple("You are not the party leader.");
cm.dispose();
} else {
var party = cm.getParty().getMembers();
var mapId = cm.getPlayer().getMapId();
var next = true;
var levelValid = 0;
var inMap = 0;
if (party.size() < minPlayers || party.size() > maxPlayers)
next = false;
else {
for (var i = 0; i < party.size() && next; i++) {
if ((party.get(i).getLevel() >= minLevel) && (party.get(i).getLevel() <= maxLevel)) {
levelValid += 1;
if (party.get(i).getMapId() == mapId)
inMap += 1;
}
}
if (levelValid < minPlayers || inMap < minPlayers)
next = false;
}
if (next) {
var em = cm.getEventManager("PiratePQ");
if (em == null) {
cm.sendOk("PiratePQ does not work.");
} else {
if (mode == 0 && status == 0) {
cm.dispose();
}
else {
em.startInstance(cm.getParty(),cm.getPlayer().getMap(), 1);
party = cm.getParty().getMembers();
}
cm.dispose();
return;
}
else {
cm.sendOk("Your party is not a party of 2 to 6 members between level " + minLevel + " and " + maxLevel + ". Make sure all your members are present and qualified to participate in this quest.");
cm.dispose();
if (mode == 1)
status++;
else
status--;
if (status == 0) {
cm.sendSimple("#b<Party Quest: Pirate PQ>#k\r\n\r\nHelp! My son has been kidnapped and is bound on the hands of the fearful #rLord Pirate#k. I need your help... Would you please assemble or join a team to save him? Have your #bparty leader#k talk to me or make yourself a party.#b\r\n#L0#I want to participate in the party quest.\r\n#L1#I want to find party members.\r\n#L2#I would like to hear more details.");
} else if (status == 1) {
if (selection == 0) {
if (cm.getParty() == null) {
cm.sendOk("You can participate in the party quest only if you are in a party.");
cm.dispose();
} else if(!cm.isLeader()) {
cm.sendOk("Your party leader must talk to me to start this party quest.");
cm.dispose();
} else {
var em = cm.getEventManager("PiratePQ");
if(em == null) {
cm.sendOk("The Pirate PQ has encountered an error.");
cm.dispose();
}
var eli = em.getEligibleParty(cm.getParty());
if(eli.size() > 0) {
var prop = em.getProperty("state");
if (prop != null && prop.equals("0")) {
em.startInstance(cm.getParty(), cm.getPlayer().getMap(), 1);
cm.dispose();
} else {
cm.sendOk("Another party has already entered the #rParty Quest#k in this channel. Please try another channel, or wait for the current party to finish.");
cm.dispose();
}
}
else {
cm.sendOk("You cannot start this party quest yet, because either your party is not in the range size, some of your party members are not eligible to attempt it or they are not in this map. If you're having trouble finding party members, try Party Search.");
cm.dispose();
}
}
} else if (selection == 1) {
cm.sendOk("Try using a Super Megaphone or asking your buddies or guild to join!");
cm.dispose();
} else {
cm.sendOk("#b<Party Quest: Pirate PQ>#k\r\nIn this PQ, your mission is to progressively make your way through the ship, taking on all pirates and baddies in your path. Reaching the #rLord Pirate#k, depending on how many great chests you opened on the stages before, the boss will reveal himself even more powerful, so stay alert. Said chests, if opened, gives many extra rewards to your crew, it's worth a shot! Good luck.");
cm.dispose();
}
}
}
}
else {
cm.sendOk("PiratePQ does not exist.");
cm.dispose();
}
}
}
}
+73 -63
View File
@@ -28,68 +28,78 @@ function start() {
}
function action(mode, type, selection) {
if (mode == 1)
status++;
else
status--;
if (status == 0) {
cm.removeAll(4001117);
cm.removeAll(4001120);
cm.removeAll(4001121);
cm.removeAll(4001122);
cm.sendSimple("#b#L0#Get me out of here.#l\r\n#L1#Give me Pirate Hat.#l#k");
} else if (status == 1) {
if (selection == 0) {
if (!cm.canHold(4001129, 1)) {
cm.sendOk("Please make room in ETC.");
cm.dispose();
return;
}
cm.gainItem(4001129, 1);
cm.warp(251010404,0);
} else { //TODO JUMP
if (cm.haveItem(1003267, 1)) {
cm.sendOk("You have the best hat.");
} else if (cm.haveItem(1002573, 1)) {
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1003267,1)) {
cm.gainItem(1002573, -1);
cm.gainItem(4001129, -20);
cm.gainItem(1003267,1);
cm.sendOk("I have given you the hat.");
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if (status == 0) {
cm.removeAll(4001117);
cm.removeAll(4001120);
cm.removeAll(4001121);
cm.removeAll(4001122);
cm.sendSimple("Thank you for saving me! How can I help you?\r\n#b#L0#Get me out of here.\r\n#L1#Give me Pirate Hat.");
} else if (status == 1) {
if (selection == 0) {
if (!cm.canHold(4001129, 1)) {
cm.sendOk("Please make room in ETC.");
cm.dispose();
return;
}
cm.gainItem(4001129, 1);
cm.warp(251010404,0);
} else {
if (cm.haveItem(1003267, 1)) {
cm.sendOk("You have the best hat.");
} else if (cm.haveItem(1002573, 1)) {
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1003267,1)) {
cm.gainItem(1002573, -1);
cm.gainItem(4001129, -20);
cm.gainItem(1003267,1);
cm.sendOk("I have given you the hat.");
} else {
cm.sendOk("Please make room in your EQUIP inventory before receiving the hat.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
} else if (cm.haveItem(1002572, 1)) {
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1002573,1)) {
cm.gainItem(1002572, -1);
cm.gainItem(4001129, -20);
cm.gainItem(1002573,1);
cm.sendOk("I have given you the hat.");
} else {
cm.sendOk("Please make room in your EQUIP inventory before receiving the hat.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
} else {
cm.sendOk("Please make room.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
} else if (cm.haveItem(1002572, 1)) {
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1002573,1)) {
cm.gainItem(1002572, -1);
cm.gainItem(4001129, -20);
cm.gainItem(1002573,1);
cm.sendOk("I have given you the hat.");
} else {
cm.sendOk("Please make room.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
} else {
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1002572,1)) {
cm.gainItem(4001129, -20);
cm.gainItem(1002572,1);
cm.sendOk("I have given you the hat.");
} else {
cm.sendOk("Please make room.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
}
}
cm.dispose();
}
if (cm.haveItem(4001129, 20)) {
if (cm.canHold(1002572,1)) {
cm.gainItem(4001129, -20);
cm.gainItem(1002572,1);
cm.sendOk("I have given you the hat.");
} else {
cm.sendOk("Please make room in your EQUIP inventory before receiving the hat.");
}
} else {
cm.sendOk("You need 20 #t4001129# to get the next hat.");
}
}
}
cm.dispose();
}
}
}
+38 -38
View File
@@ -35,16 +35,16 @@ function action(mode, type, selection) {
}
switch(cm.getPlayer().getMapId()) {
case 925100000:
cm.sendNext("We are heading into the Pirate Ship now! To get in, we must destroy all the monsters guarding it.");
cm.dispose();
break;
cm.sendNext("We are heading into the Pirate Ship now! To get in, we must destroy all the monsters guarding it.");
cm.dispose();
break;
case 925100100:
var emp = em.getProperty("stage2");
if (emp == null) {
var emp = em.getProperty("stage2");
if (emp == null) {
em.setProperty("stage2", "0");
emp = "0";
}
if (emp.equals("0")) {
}
if (emp.equals("0")) {
if (cm.haveItem(4001120,20)) {
cm.sendNext("Excellent! Now hunt me 20 Rising Medals.");
cm.gainItem(4001120,-20);
@@ -54,7 +54,7 @@ function action(mode, type, selection) {
cm.sendNext("We are heading into the Pirate Ship now! To get in, we must qualify ourselves as noble pirates. Hunt me 20 Rookie Medals.");
if(cm.countMonster() < 1) cm.getPlayer().getMap().spawnAllMonsterIdFromMapSpawnList(9300114, level, true);
}
} else if (emp.equals("1")) {
} else if (emp.equals("1")) {
if (cm.haveItem(4001121,20)) {
cm.sendNext("Excellent! Now hunt me 20 Veteran Medals.");
cm.gainItem(4001121,-20);
@@ -64,7 +64,7 @@ function action(mode, type, selection) {
cm.sendNext("We are heading into the Pirate Ship now! To get in, we must qualify ourselves as noble pirates. Hunt me 20 Rising Medals.");
if(cm.countMonster() < 1) cm.getPlayer().getMap().spawnAllMonsterIdFromMapSpawnList(9300115, level, true);
}
} else if (emp.equals("2")) {
} else if (emp.equals("2")) {
if (cm.haveItem(4001122,20)) {
cm.sendNext("Excellent! Now let us go.");
cm.gainItem(4001122,-20);
@@ -74,56 +74,56 @@ function action(mode, type, selection) {
cm.sendNext("We are heading into the Pirate Ship now! To get in, we must qualify ourselves as noble pirates. Hunt me 20 Veteran Medals.");
if(cm.countMonster() < 1) cm.getPlayer().getMap().spawnAllMonsterIdFromMapSpawnList(9300116, level, true);
}
} else {
} else {
cm.sendNext("The next stage has opened. GO!");
}
cm.dispose();
break;
}
cm.dispose();
break;
case 925100200:
case 925100300:
cm.sendNext("To assault the pirate ship, we must destroy the guards first.");
cm.dispose();
break;
cm.sendNext("To assault the pirate ship, we must destroy the guards first.");
cm.dispose();
break;
case 925100201:
if (cm.getMap().getMonsters().size() == 0) {
if (cm.getMap().getMonsters().size() == 0) {
cm.sendNext("Excellent.");
if (em.getProperty("stage2a") == "0") {
cm.getMap().setReactorState();
em.setProperty("stage2a", "1");
}
} else {
} else {
cm.sendNext("These bellflowers are in hiding. We must liberate them.");
}
cm.dispose();
break;
}
cm.dispose();
break;
case 925100301:
if (cm.getMap().getMonsters().size() == 0) {
if (cm.getMap().getMonsters().size() == 0) {
cm.sendNext("Excellent.");
if (em.getProperty("stage3a").equals("0")) {
cm.getMap().setReactorState();
em.setProperty("stage3a", "1");
}
} else {
} else {
cm.sendNext("These bellflowers are in hiding. We must liberate them.");
}
cm.dispose();
break;
}
cm.dispose();
break;
case 925100202:
case 925100302:
cm.sendNext("These are the Captains and Krus which devote their whole life to Lord Pirate. Kill them as you see fit.");
cm.dispose();
break;
cm.sendNext("These are the Captains and Krus which devote their whole life to Lord Pirate. Kill them as you see fit.");
cm.dispose();
break;
case 925100400:
cm.sendNext("These are the sources of the ship's power. We must seal it by using the Old Metal Keys on the doors!");
cm.dispose();
break;
cm.sendNext("These are the sources of the ship's power. We must seal it by using the Old Metal Keys on the doors!");
cm.dispose();
break;
case 925100500:
if (cm.getMap().getMonsters().size() == 0) {
cm.warpParty(925100600);
} else {
if (cm.getMap().getMonsters().size() == 0) {
cm.clearPQ(925100600);
} else {
cm.sendNext("Defeat all monsters! Even Lord Pirate's minions!");
}
cm.dispose();
break;
}
cm.dispose();
break;
}
}
+101 -70
View File
@@ -1,77 +1,108 @@
var status = -1;
var minPlayers = 0;
/**
* @author: Ronan
* @npc: Ellin
* @map: 300030100 - Deep Fairy Forest
* @func: Ellin PQ
*/
var minLevel = 44, maxLevel = 170;
var status = 0;
var minLevel = 1;
var maxLevel = 200;
var minPartySize = 1;
var maxPartySize = 6;
function start() {
action(1,0,0);
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
if (status == 0) {
cm.dispose();
}
status--;
}
if (status == 0) {
cm.sendSimple("#b#L0#Give me Altaire Earrings.#l\r\n#L1#Give me Glittering Altaire Earrings.#l\r\n#L3#Give me Brilliant Altaire Earrings.#l\r\n#L2#Attempt Forest of Poison Haze.#l#k");
} else if (status == 1) {
if (selection == 0) {
if (!cm.haveItem(1032060) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032060,1);
cm.gainItem(4001198, -10);
} else {
cm.sendOk("You either have Altair Earrings already or you do not have 10 Altair Fragments");
}
} else if (selection == 1){
if (cm.haveItem(1032060) && !cm.haveItem(1032061) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032060,-1);
cm.gainItem(1032061, 1);
cm.gainItem(4001198, -10);
} else {
cm.sendOk("You either don't have Altair Earrings already or you do not have 10 Altair Fragments");
}
} else if (selection == 1){
if (cm.haveItem(1032061) && !cm.haveItem(1032101) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032061,-1);
cm.gainItem(1032101, 1);
cm.gainItem(4001198, -10);
} else {
cm.sendOk("You either don't have Glittering Altair Earrings already or you do not have 10 Altair Fragments");
}
} else if (selection == 2) {
if (cm.getPlayer().getParty() == null || !cm.isLeader()) {
cm.sendOk("The leader of the party must be here.");
} else {
var party = cm.getPlayer().getParty().getMembers();
var mapId = cm.getPlayer().getMapId();
var next = true;
var size = 0;
var it = party.iterator();
while (it.hasNext()) {
var cPlayer = it.next();
var ccPlayer = cm.getPlayer().getMap().getCharacterById(cPlayer.getId());
if (ccPlayer == null || ccPlayer.getLevel() < minLevel || ccPlayer.getLevel() > maxLevel) {
next = false;
break;
}
size += (ccPlayer.isGM() ? 4 : 1);
}
if (next && size >= minPlayers) {
var em = cm.getEventManager("Ellin");
if (em == null) {
cm.sendOk("Please try again later.");
} else {
em.startInstance(cm.getPlayer().getParty(), cm.getPlayer().getMap(), 1); //common level only
}
} else {
cm.sendOk("All 2+ members of your party must be here and between level " + minLevel + " and " + maxLevel + ".");
}
}
}
cm.dispose();
}
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if (status == 0) {
cm.sendSimple("#b<Party Quest: Ellin PQ>#k\r\n\r\nWould you like to assemble or join a team to solve the puzzles of the #bForest of Poison Haze#k? Have your #bparty leader#k talk to me or make yourself a party.#b\r\n#L0#I want to participate in the party quest.\r\n#L1#I want to find party members.\r\n#L2#I would like to hear more details.\r\n#L3#I would like to reclaim a prize.");
} else if (status == 1) {
if (selection == 0) {
if (cm.getParty() == null) {
cm.sendOk("You can participate in the party quest only if you are in a party.");
cm.dispose();
} else if(!cm.isLeader()) {
cm.sendOk("Your party leader must talk to me to start this party quest.");
cm.dispose();
} else {
var em = cm.getEventManager("Ellin");
if(em == null) {
cm.sendOk("The Ellin PQ has encountered an error.");
cm.dispose();
}
var eli = em.getEligibleParty(cm.getParty());
if(eli.size() > 0) {
var prop = em.getProperty("state");
if (prop != null && prop.equals("0")) {
em.startInstance(cm.getParty(), cm.getPlayer().getMap(), 1);
cm.dispose();
} else {
cm.sendOk("Another party has already entered the #rParty Quest#k in this channel. Please try another channel, or wait for the current party to finish.");
cm.dispose();
}
}
else {
cm.sendOk("You cannot start this party quest yet, because either your party is not in the range size, some of your party members are not eligible to attempt it or they are not in this map. If you're having trouble finding party members, try Party Search.");
cm.dispose();
}
}
} else if (selection == 1) {
cm.sendOk("Try using a Super Megaphone or asking your buddies or guild to join!");
cm.dispose();
} else if (selection == 2) {
cm.sendOk("#b<Party Quest: Ellin PQ>#k\r\nIn this PQ, your mission is to progressively make your way through the woods, taking on all baddies in your path, solving many puzzles you encounter and rallying yourselves to take the best of teamwork to overcome time limits and powerful creatures. Clearing the final boss, your team have a chance to obtain a marble that, #bwhen dropped by the fountain at the exit map#k, will guarantee the team extra prizes. Good luck.");
cm.dispose();
}
else {
cm.sendSimple("So, what prize do you want to obtain?\r\n#b#L0#Give me Altaire Earrings.\r\n#L1#Give me Glittering Altaire Earrings.\r\n#L2#Give me Brilliant Altaire Earrings");
}
} else if (status == 2) {
if (selection == 0) {
if (!cm.haveItem(1032060) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032060,1);
cm.gainItem(4001198, -10);
cm.dispose();
} else {
cm.sendOk("You either have Altair Earrings already or you do not have 10 Altair Fragments.");
cm.dispose();
}
} else if (selection == 1){
if (cm.haveItem(1032060) && !cm.haveItem(1032061) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032060,-1);
cm.gainItem(1032061, 1);
cm.gainItem(4001198, -10);
cm.dispose();
} else {
cm.sendOk("You either don't have Altair Earrings already or you do not have 10 Altair Fragments.");
cm.dispose();
}
} else if (selection == 2){
if (cm.haveItem(1032061) && !cm.haveItem(1032101) && cm.haveItem(4001198, 10)) {
cm.gainItem(1032061,-1);
cm.gainItem(1032101, 1);
cm.gainItem(4001198, -10);
cm.dispose();
} else {
cm.sendOk("You either don't have Glittering Altair Earrings already or you do not have 10 Altair Fragments.");
cm.dispose();
}
}
}
}
}
+87
View File
@@ -0,0 +1,87 @@
/**
* @author: Ronan
* @npc: Agent Meow
* @map: 970030000 - Hidden Street - Exclusive Training Center
* @func: Boss Rush PQ
*/
var status = 0;
var minLevel = 1;
var maxLevel = 200;
var minPartySize = 1;
var maxPartySize = 6;
var state;
function start() {
status = -1;
state = (cm.getMapId() >= 970030001 && cm.getMapId() <= 970042711) ? 1 : 0;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if (status == 0) {
if(state) {
cm.sendYesNo("Do you wish to abandon this event?");
}
else {
cm.sendSimple("#b<Party Quest: Boss Rush>#k\r\n\r\nWould you like to collaborate with party members to complete the expedition, or are you brave enough to take it on all by yourself? Have your #bparty leader#k talk to me or make yourself a party.#b\r\n#L0#I want to participate in the party quest.\r\n#L1#I want to find party members.\r\n#L2#I would like to hear more details.");
}
} else if (status == 1) {
if(state) {
cm.warp(970030000);
cm.dispose();
}
else {
if (selection == 0) {
if (cm.getParty() == null) {
cm.sendOk("You can participate in the party quest only if you are in a party.");
cm.dispose();
} else if(!cm.isLeader()) {
cm.sendOk("Your party leader must talk to me to start this party quest.");
cm.dispose();
} else {
var em = cm.getEventManager("BossRushPQ");
if(em == null) {
cm.sendOk("The Boss Rush PQ has encountered an error.");
cm.dispose();
}
var eli = em.getEligibleParty(cm.getParty());
if(eli.size() > 0) {
var prop = em.getProperty("state");
if (prop != null && prop.equals("0")) {
em.startInstance(cm.getParty(), cm.getPlayer().getMap(), 1);
cm.dispose();
} else {
cm.sendOk("Another party has already entered the #rParty Quest#k in this channel. Please try another channel, or wait for the current party to finish.");
cm.dispose();
}
}
else {
cm.sendOk("You cannot start this party quest yet, because either your party is not in the range size, some of your party members are not eligible to attempt it or they are not in this map. If you're having trouble finding party members, try Party Search.");
cm.dispose();
}
}
} else if (selection == 1) {
cm.sendOk("Try using a Super Megaphone or asking your buddies or guild to join!");
cm.dispose();
} else {
cm.sendOk("#b<Party Quest: Boss Rush PQ>#k\r\nBrave adventurers from all over the places travels here to test their skills and abilities in combat, as they face even more powerful bosses from MapleStory. Join forces with fellow adventurers or face all the burden by yourself and receive all the glory, it is up to you. REWARDS are given accordingly to how far the adventurers reach and extra prizes may are given to a random member of the party, all attributed at the end of an expedition.");
cm.dispose();
}
}
}
}
}
+58
View File
@@ -0,0 +1,58 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <[email protected]>
Matthias Butz <[email protected]>
Jan Christian Meyer <[email protected]>
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/>.
*/
/* 9010021 - Wolf Spirit Ryko
BossRushPQ recruiter
@author Ronan
*/
var status;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode < 0)
cm.dispose();
else {
if (mode == 1)
status++;
else
status--;
if (status == 0) {
cm.sendNext("Heed me, human. I hail from a distant plane and came to this world to take a glimpse on the power level of the best of the dwellers of this world.");
} else if(status == 1) {
cm.sendNext("Oh, don't get me wrong, our civilization are of the type that makes researches for the sake of science, we have no regards for domination or disturbances whatsoever.");
} else if(status == 2) {
cm.sendNext("These contests involve #bsequential boss fights#k, with some resting spots between some sections. This will require some strategy time and enough supplies at hand, as these are not common fights.");
} else if(status == 3) {
cm.sendAcceptDecline("If you feel you are powerful enough, you can join others like you at where we are hosting the contests of power. ... So, what is your decision? Will you come to where the contests are being held right now?");
} else if(status == 4) {
cm.sendOk("Very well. Remember, there you can assemble a team or take on the fightings on your own, it's up to you. Good luck!");
} else if(status == 5) {
cm.warp(970030000);
cm.dispose();
}
}
}
+1 -1
View File
@@ -258,5 +258,5 @@ function randX() {
function spawnMob(id, x, y, map) {
var mob = Packages.server.life.MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new Packages.java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new Packages.java.awt.Point(x, y));
}
+2 -2
View File
@@ -15,11 +15,11 @@ function enter(pi) {
boss.changeDifficulty(level, true);
pi.getMap(925100500).spawnMonster(boss);
pi.getMap(925100500).spawnMonsterOnGroundBelow(boss, new java.awt.Point(777, 140));
pi.warpParty(925100500); //next
return(true);
} else {
pi.playerMessage(5, "The leader must be here");
pi.playerMessage(5, "The leader must be here.");
return(false);
}
} else {
+1 -1
View File
@@ -42,5 +42,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -38,5 +38,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+1 -1
View File
@@ -44,5 +44,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+14 -6
View File
@@ -1,9 +1,17 @@
function enter(pi) {
if ((pi.getMap().getMonsters().size() == 0 || pi.getMap().getMonsterById(9300183) != null) && (pi.getMap().getReactorByName("") == null || pi.getMap().getReactorByName("").getState() == 1)) {
pi.warp(930000800,0);
return true;
} else {
pi.playerMessage(5, "Please eliminate the Poison Golem.");
if ((pi.getMap().getMonsters().size() == 0 || pi.getMap().getMonsterById(9300183) != null) && (pi.getMap().getReactorByName("") == null || pi.getMap().getReactorByName("").getState() == 1)) {
if(pi.isLeader()) {
pi.clearPQ(930000800);
return true;
}
else {
pi.playerMessage(5, "Wait for the leader to pass through the portal.");
return false;
}
} else {
pi.playerMessage(5, "Please eliminate the Poison Golem.");
return false;
}
}
}
+41
View File
@@ -0,0 +1,41 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <[email protected]>
Matthias Butz <[email protected]>
Jan Christian Meyer <[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License 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/>.
*/
/*
BossRushPQ - Next Stage
@author Ronan
*/
function enter(pi) {
if(pi.getMap().getMonsters().size() == 0) {
var nextStage;
if(pi.getMapId() % 5 == 0) nextStage = pi.getMapId() + 100;
else nextStage = 970030001 + (pi.getMapId() - 970030100 / 500);
pi.warp(nextStage);
return true;
}
else {
pi.getPlayer().dropMessage(6, "Defeat all monsters before proceeding to the next stage.");
return false;
}
}
+4
View File
@@ -0,0 +1,4 @@
function enter(pi) {
pi.warp(100000000,0);
return true;
}
+1 -1
View File
@@ -74,5 +74,5 @@ function spawnMob(x, y, id, map) {
return;
var mob = MapleLifeFactory.getMonster(id);
map.spawnMonsterOnGroudBelow(mob, new java.awt.Point(x, y));
map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(x, y));
}
+3 -3
View File
@@ -25,9 +25,9 @@
*/
function act() {
var eim = rm.getPlayer().getEventInstance();
var now = parseInt(eim.getProperty("openedChests"));
var em = rm.getPlayer().getEventInstance().getEm();
var now = parseInt(em.getProperty("openedChests"));
var nextNum = now + 1;
eim.setProperty("openedChests", nextNum);
em.setProperty("openedChests", nextNum.toString());
rm.dropItems(true, 1, 50, 100, 15);
}
+16 -3
View File
@@ -1,3 +1,16 @@
function act() {
rm.givePartyExp(52000, rm.getPlayer().getPartyMembers());
}
/**
* @author: Ronan
* @reactor: Water Fountain
* @map: 930000800 - Forest of Poison Haze - Outer Forest Exit
* @func: Water Fountain
*/
function hit() {
var players = rm.getMap().getAllPlayers().toArray();
for(var i = 0; i < players.length; i++) {
rm.giveCharacterExp(52000, players[i]);
}
}
function act() {} //do nothing
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ function act() {
rm.mapMessage(6, "Protect the Moon Bunny!!!");
var map = em.getMapInstance(rm.getReactor().getMap().getId());
map.allowSummonState(true);
map.spawnMonsterOnGroudBelow(9300061, -183, -433);
map.spawnMonsterOnGroundBelow(9300061, -183, -433);
}
}
}
-1
View File
@@ -8543,7 +8543,6 @@ INSERT IGNORE INTO `temp_data` (`id`, `dropperid`, `itemid`, `minimum_quantity`,
(8331, 8220001, 4000048, 1, 1, 0, 600000),
(8332, 8220001, 4000049, 1, 1, 0, 600000),
(8333, 8220001, 4000051, 1, 1, 0, 600000),
(8334, 8220001, 4000257, 1, 1, 0, 600000),
(8335, 8220001, 4000021, 1, 1, 0, 500000),
(8336, 8220001, 4004002, 1, 1, 0, 100000),
(8337, 8220001, 4010004, 1, 1, 0, 90000),
+30 -6
View File
@@ -6682,9 +6682,9 @@
(4220000, 4000166, 1, 1, 0, 200000),
(4220001, 4000166, 1, 1, 0, 200000),
(9303014, 4000166, 1, 1, 0, 200000),
(4220000, 4032474, 1, 1, 0, 10000),
(4220001, 4032474, 1, 1, 0, 10000),
(9303014, 4032474, 1, 1, 0, 10000),
(4220000, 4032474, 1, 1, 0, 200000),
(4220001, 4032474, 1, 1, 0, 200000),
(9303014, 4032474, 1, 1, 0, 200000),
(4220000, 2000002, 1, 4, 0, 40000),
(4220001, 2000002, 1, 4, 0, 40000),
(9303014, 2000002, 1, 1, 0, 40000),
@@ -18794,11 +18794,14 @@
(9300107, 4031551, 1, 1, 3829, 40000),
(9300119, 4031551, 1, 1, 3829, 40000),
(9300119, 0, 801, 1199, 0, 400000),
(9300173, 4001161, 1, 1, 0, 200000);
(9300173, 4001161, 1, 1, 0, 200000),
(9500355, 2388015, 1, 1, 0, 24000),
(9500356, 2388032, 1, 1, 0, 24000),
(9500357, 2388016, 1, 1, 0, 24000);
# (dropperid, itemid, minqty, maxqty, questid, chance)
# delete item drops from Seruf shell
# delete item drops from Seruf in inactive form
DELETE FROM temp_data WHERE dropperid=4220001;
UPDATE IGNORE temp_data SET chance=700 WHERE itemid=1302056;
@@ -18868,7 +18871,6 @@
UPDATE drop_data SET questid=7777 WHERE itemid=4001359;
UPDATE drop_data SET questid=7777 WHERE itemid=4001342;
UPDATE drop_data SET questid=7777 WHERE itemid=4031906;
UPDATE drop_data SET questid=7777 WHERE itemid=4032474;
UPDATE drop_data SET chance=0 WHERE itemid=2050099;
UPDATE drop_data SET chance=40000 WHERE itemid=4031991;
UPDATE drop_data SET questid=6191 WHERE itemid=4031477;
@@ -18879,6 +18881,16 @@
UPDATE IGNORE drop_data SET itemid=1402011 WHERE itemid=1302056 AND dropperid < 8000000;
DELETE FROM drop_data WHERE itemid=1302056 AND dropperid < 8000000;
# remove belts dropping from mobs
DELETE FROM drop_data where itemid>=1132000 and itemid<=1132004;
# remove key of dimension dropping outside PQ
DELETE FROM drop_data where itemid=4001023 and dropperid!=9300012;
# remove every not-card drop from bosses out of their natural habitat
DELETE FROM drop_data WHERE dropperid >= 9300184 AND dropperid < 9300215 AND (itemid < 2380000 OR itemid >= 2390000);
DELETE FROM drop_data WHERE dropperid >= 9500337 AND dropperid < 9500364 AND (itemid < 2380000 OR itemid >= 2390000);
# update quest reactor items
UPDATE reactordrops SET questid=2086 WHERE itemid=4031165;
UPDATE reactordrops SET questid=3407 WHERE itemid=4031141;
@@ -18910,6 +18922,18 @@
(2512001, 4010007, 1, -1),
(2512001, 4020007, 1, -1),
(2512001, 4020008, 1, -1),
(2512001, 4010004, 1, -1),
(2512001, 4010005, 1, -1),
(2512001, 4010006, 1, -1),
(2512001, 4010007, 1, -1),
(2512001, 4020007, 1, -1),
(2512001, 4020008, 1, -1),
(2512001, 4010004, 1, -1),
(2512001, 4010005, 1, -1),
(2512001, 4010006, 1, -1),
(2512001, 4010007, 1, -1),
(2512001, 4020007, 1, -1),
(2512001, 4020008, 1, -1),
(2512001, 2020000, 3, -1),
(2512001, 2020001, 3, -1),
(2512001, 2020003, 3, -1),
File diff suppressed because it is too large Load Diff
-15
View File
@@ -1,15 +0,0 @@
#OBS.: este sql só deverá ser utilizado se for descoberto falhas de listagem de dados em
#AMBOS O SPIDER E OS DROPS ORIGINAIS!!!
UPDATE drop_data SET chance=10000 WHERE (itemid >= 2380000 AND itemid < 2390000) AND (chance= 1000);
INSERT INTO `drop_data` (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES
(120100, 2380002, 1, 1, 0, 10000),
(4230116, 2382042, 1, 1, 0, 10000),
(4230117, 2382055, 1, 1, 0, 10000),
(2230101, 4032399, 1, 1, 2251, 10000),
(100100, 4001352, 1, 1, 28205, 7000),
(100101, 4001352, 1, 1, 28205, 7000),
(120100, 4001352, 1, 1, 28205, 7000),
(130101, 4001352, 1, 1, 28205, 7000),
(1210100, 4001352, 1, 1, 28205, 7000);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -1,4 +1,6 @@
These SQL files must be executed IN ORDER to set up:
---- MapleSolaxiaV2 MySQL Database ----
These SQL files must be executed IN ORDER to set up the database:
- db_database.sql
- db_drops.sql
- db_shopupdate.sql (optional)
+35 -61
View File
@@ -48,8 +48,6 @@ import java.util.Set;
//import java.util.TimeZone;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock;
import java.util.regex.Pattern;
import net.server.PlayerBuffValueHolder;
@@ -272,13 +270,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
private PartyQuest partyQuest = null;
private boolean loggedIn = false;
private MapleDragon dragon = null;
private boolean useCS = false; //chaos scroll upon crafting item.
private boolean useCS; //chaos scroll upon crafting item.
private long useDuey;
private long petLootCd;
private int newWarpMap = -1;
private Lock sLock = new ReentrantLock(true);
private MapleCharacter() {
useCS = false;
setStance(0);
inventory = new MapleInventory[MapleInventoryType.values().length];
savedLocations = new SavedLocation[SavedLocationType.values().length];
@@ -553,14 +552,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return MaxMP;
}
public void addSummon(int id, MapleSummon summon) {
sLock.lock();
try {
summons.put(id, summon);
} finally {
sLock.unlock();
}
summons.put(id, summon);
}
public void addVisibleMapObject(MapleMapObject mo) {
@@ -1091,16 +1085,22 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return target;
}
// for use ONLY inside OnUserEnter map scripts that requires players changing map even before entering it.
// for use ONLY inside OnUserEnter map scripts that requires a player to change map while still moving between maps.
public void warpAhead(int map) {
newWarpMap = map;
}
private void eventChangedMap(int map) {
if (getEventInstance() != null) getEventInstance().changedMap(MapleCharacter.this, map);
}
public void changeMap(int map) {
changeMap(map, 0);
}
public void changeMap(int map, int portal) {
eventChangedMap(map);
MapleMap warpMap;
if (getEventInstance() != null) {
warpMap = getEventInstance().getMapInstance(map);
@@ -1112,6 +1112,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public void changeMap(int map, String portal) {
eventChangedMap(map);
MapleMap warpMap;
if (getEventInstance() != null) {
warpMap = getEventInstance().getMapInstance(map);
@@ -1123,6 +1125,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public void changeMap(int map, MaplePortal portal) {
eventChangedMap(map);
MapleMap warpMap;
if (getEventInstance() != null) {
warpMap = getEventInstance().getMapInstance(map);
@@ -1369,27 +1373,22 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
} else if (stat == MapleBuffStat.SUMMON || stat == MapleBuffStat.PUPPET) {
int summonId = mbsvh.effect.getSourceId();
sLock.lock();
try {
MapleSummon summon = summons.get(summonId);
if (summon != null) {
getMap().broadcastMessage(MaplePacketCreator.removeSummon(summon, true), summon.getPosition());
getMap().removeMapObject(summon);
removeVisibleMapObject(summon);
summons.remove(summonId);
MapleSummon summon = summons.get(summonId);
if (summon != null) {
getMap().broadcastMessage(MaplePacketCreator.removeSummon(summon, true), summon.getPosition());
getMap().removeMapObject(summon);
removeVisibleMapObject(summon);
summons.remove(summonId);
}
if (summon.getSkill() == DarkKnight.BEHOLDER) {
if (beholderHealingSchedule != null) {
beholderHealingSchedule.cancel(false);
beholderHealingSchedule = null;
}
if (summon.getSkill() == DarkKnight.BEHOLDER) {
if (beholderHealingSchedule != null) {
beholderHealingSchedule.cancel(false);
beholderHealingSchedule = null;
}
if (beholderBuffSchedule != null) {
beholderBuffSchedule.cancel(false);
beholderBuffSchedule = null;
}
if (beholderBuffSchedule != null) {
beholderBuffSchedule.cancel(false);
beholderBuffSchedule = null;
}
} finally {
sLock.unlock();
}
} else if (stat == MapleBuffStat.DRAGONBLOOD) {
dragonBloodSchedule.cancel(false);
@@ -2530,48 +2529,23 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public Collection<MapleSummon> getSummonsValues() {
sLock.lock();
try {
return summons.values();
} finally {
sLock.unlock();
}
return summons.values();
}
public void clearSummons() {
sLock.lock();
try {
summons.clear();
} finally {
sLock.unlock();
}
summons.clear();
}
public MapleSummon getSummonByKey(int id) {
sLock.lock();
try {
return summons.get(id);
} finally {
sLock.unlock();
}
return summons.get(id);
}
public boolean isSummonsEmpty() {
sLock.lock();
try {
return summons.isEmpty();
} finally {
sLock.unlock();
}
return summons.isEmpty();
}
public boolean containsSummon(MapleSummon summon) {
sLock.lock();
try {
return summons.containsValue(summon);
} finally {
sLock.unlock();
}
return summons.containsValue(summon);
}
public int getTotalStr() {
+15 -9
View File
@@ -333,6 +333,12 @@ public class Commands {
player.message("@whodrops <item name>: Displays monsters that drop an item given an item name.");
player.message("@uptime: Shows how long Solaxia has been online.");
player.message("@bosshp: Displays the remaining HP of the bosses on your map.");
if(ServerConstants.USE_DEBUG) {
player.message("@debugpos: Displays the coordinates on the map the player is currently located.");
player.message("@debugmapcount: Displays the current number of registered players in the map the player is located.");
player.message("@debugevent: Displays the name of the event in which the player is currently registered.");
player.message("@debugreactors: Displays current info for all reactors on the map the the player is currently located.");
}
break;
case "time":
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@@ -652,7 +658,7 @@ public class Commands {
case "debugevent":
if(ServerConstants.USE_DEBUG) {
if(player.getEventInstance() == null) player.dropMessage("Player currently not in a event.");
if(player.getEventInstance() == null) player.dropMessage("Player currently not in an event.");
else player.dropMessage("Current event name: " + player.getEventInstance().getName() + ".");
}
break;
@@ -700,18 +706,18 @@ public class Commands {
}
if (sub.length > 2) {
for (int i = 0; i < Integer.parseInt(sub[2]); i++) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
}
} else {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
}
} else if (sub[0].equals("bomb")) {
if (sub.length > 1){
MapleCharacter victim = c.getWorldServer().getPlayerStorage().getCharacterByName(sub[1]);
victim.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(9300166), victim.getPosition());
victim.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300166), victim.getPosition());
Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, player.getName() + " used !bomb on " + victim.getName()));
} else {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(9300166), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300166), player.getPosition());
}
} else if (sub[0].equals("mutemap")) {
if(player.getMap().isMuted()) {
@@ -1189,9 +1195,9 @@ public class Commands {
}
player.dropMessage("There are a total of " + total + " players online.");
} else if (sub[0].equals("pap")) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8500001), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8500001), player.getPosition());
} else if (sub[0].equals("pianus")) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8510000), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8510000), player.getPosition());
} else if (sub[0].equalsIgnoreCase("search")) {
StringBuilder sb = new StringBuilder();
if (sub.length > 2) {
@@ -1338,7 +1344,7 @@ public class Commands {
}
break;
case "horntail":
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8810026), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8810026), player.getPosition());
break;
case "packet":
player.getMap().broadcastMessage(MaplePacketCreator.customPacket(joinStringFrom(sub, 1)));
@@ -1490,7 +1496,7 @@ public class Commands {
case "zakum":
player.getMap().spawnFakeMonsterOnGroundBelow(MapleLifeFactory.getMonster(8800000), player.getPosition());
for (int x = 8800003; x < 8800011; x++) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(x), player.getPosition());
player.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(x), player.getPosition());
}
break;
case "clearquestcache":
+5 -5
View File
@@ -9,11 +9,11 @@ public class ServerConstants {
public static String[] WORLD_NAMES = {"Scania", "Bera", "Broa", "Windia", "Khaini", "Bellocan", "Mardia", "Kradia", "Yellonde", "Demethos", "Galicia", "El Nido", "Zenith", "Arcenia", "Kastia", "Judis", "Plana", "Kalluna", "Stius", "Croa", "Medere"};
// Login Configuration
public static final int CHANNEL_LOAD = 100;//Players per channel
public static final long RANKING_INTERVAL = 60 * 60 * 1000;//60 minutes, 3600000
public static final int CHANNEL_LOAD = 100; //Players per channel
public static final long RANKING_INTERVAL = 60 * 60 * 1000; //60 minutes, 3600000
public static final boolean ENABLE_PIC = false;
//Event Configuration
public static final boolean PERFECT_PITCH = true; //for lvl 30 or above, each lvlup player gains 1 perfect pitch.
public static final boolean PERFECT_PITCH = true; //for lvl 30 or above, each lvlup player gains 1 perfect pitch.
// IP Configuration
public static String HOST;
//Database Configuration
@@ -25,7 +25,7 @@ public class ServerConstants {
public static boolean SHUTDOWNHOOK;
//Gameplay Configurations
public static final boolean USE_MAXRANGE = true; //will send and receive packets from all events of a map, rather than those of only view range.
public static final boolean USE_DEBUG = true;
public static final boolean USE_DEBUG = true; //will enable some text prints and new commands in the client oriented for debugging.
public static final boolean USE_MTS = false;
public static final boolean USE_FAMILY_SYSTEM = false;
public static final boolean USE_DUEY = true;
@@ -57,7 +57,7 @@ public class ServerConstants {
public static final double PET_AUTOHP_RATIO = 0.99; //will automatically consume potions until given ratio of the MaxHP/MaxMP is reached.
public static final double PET_AUTOMP_RATIO = 0.99;
//Should bosses use 1HP,1MP attacks in dojo?
//Should bosses really use 1HP,1MP attacks in dojo?
public static final boolean USE_DEADLY_DOJO = false;
//Rates
@@ -56,7 +56,7 @@ public final class AdminCommandHandler extends AbstractMaplePacketHandler {
for (int z = 0; z < toSpawn.length; z++) {
int[] toSpawnChild = toSpawn[z];
if (Randomizer.nextInt(101) <= toSpawnChild[1]) {
c.getPlayer().getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(toSpawnChild[0]), c.getPlayer().getPosition());
c.getPlayer().getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(toSpawnChild[0]), c.getPlayer().getPosition());
}
}
c.announce(MaplePacketCreator.enableActions());
@@ -143,7 +143,7 @@ public final class AdminCommandHandler extends AbstractMaplePacketHandler {
int mobId = slea.readInt();
int quantity = slea.readInt();
for (int i = 0; i < quantity; i++) {
c.getPlayer().getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(mobId), c.getPlayer().getPosition());
c.getPlayer().getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), c.getPlayer().getPosition());
}
break;
case 0x18: // Maple & Mobhp
@@ -55,7 +55,7 @@ public final class UseSummonBag extends AbstractMaplePacketHandler {
for (int z = 0; z < toSpawn.length; z++) {
int[] toSpawnChild = toSpawn[z];
if (Randomizer.nextInt(101) <= toSpawnChild[1]) {
c.getPlayer().getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(toSpawnChild[0]), c.getPlayer().getPosition());
c.getPlayer().getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(toSpawnChild[0]), c.getPlayer().getPosition());
}
}
}
+15 -1
View File
@@ -29,6 +29,7 @@ import java.util.List;
public class MapleParty {
private MaplePartyCharacter leader;
private List<MaplePartyCharacter> members = new LinkedList<MaplePartyCharacter>();
private List<MaplePartyCharacter> pqMembers = null;
private int id;
public MapleParty(int id, MaplePartyCharacter chrfor) {
@@ -74,6 +75,19 @@ public class MapleParty {
return Collections.unmodifiableList(members);
}
public List<MaplePartyCharacter> getPartyMembers() {
return members;
}
// used whenever entering PQs: will draw every party member that can attempt a target PQ while ingnoring those unfit.
public Collection<MaplePartyCharacter> getEligibleMembers() {
return Collections.unmodifiableList(pqMembers);
}
public void setEligibleMembers(List<MaplePartyCharacter> eliParty) {
pqMembers = eliParty;
}
public int getId() {
return id;
}
@@ -85,7 +99,7 @@ public class MapleParty {
public MaplePartyCharacter getLeader() {
return leader;
}
@Override
public int hashCode() {
final int prime = 31;
@@ -79,6 +79,10 @@ public class MaplePartyCharacter {
public void setChannel(int channel) {
this.channel = channel;
}
public boolean isLeader() {
return getPlayer().isPartyLeader();
}
public boolean isOnline() {
return online;
+18 -6
View File
@@ -93,15 +93,15 @@ public class AbstractPlayerInteraction {
}
public void warp(int map) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(0));
getPlayer().changeMap(map, 0);
}
public void warp(int map, int portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
getPlayer().changeMap(map, portal);
}
public void warp(int map, String portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
getPlayer().changeMap(map, portal);
}
public void warpMap(int map) {
@@ -161,6 +161,15 @@ public class AbstractPlayerInteraction {
public EventManager getEventManager(String event) {
return getClient().getEventManager(event);
}
public void clearPQ(int toMap) {
clearPQ(getWarpMap(toMap));
}
public void clearPQ(MapleMap toMap) {
if(getPlayer().getEventInstance() != null)
getPlayer().getEventInstance().getEm().clearPQ(getPlayer().getEventInstance(), toMap);
}
public MapleInventory getInventory(MapleInventoryType type) {
return getPlayer().getInventory(type);
@@ -556,14 +565,17 @@ public class AbstractPlayerInteraction {
}
}
}
public void giveCharacterExp(int amount, MapleCharacter chr) {
chr.gainExp((amount * chr.getExpRate()), true, true);
}
public void givePartyExp(int amount, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
chr.gainExp((amount * chr.getExpRate()), true, true);
giveCharacterExp(amount, chr);
}
}
public void givePartyExp(String PQ) {
givePartyExp(PQ, true);
}
+32 -2
View File
@@ -83,6 +83,28 @@ public class EventInstanceManager {
public EventManager getEm() {
return em;
}
public void giveEventPlayersExp(int gain) {
giveEventPlayersExp(gain, -1);
}
public void giveEventPlayersExp(int gain, int mapId) {
rL.lock();
try {
if(mapId == -1) {
for(MapleCharacter mc: chars) {
mc.gainExp(gain * mc.getExpRate(), true, true);
}
}
else {
for(MapleCharacter mc: chars) {
if(mc.getMapId() == mapId) mc.gainExp(gain * mc.getExpRate(), true, true);
}
}
} finally {
rL.unlock();
}
}
public void registerPlayer(MapleCharacter chr) {
if (chr == null || !chr.isLoggedin()){
@@ -141,7 +163,7 @@ public class EventInstanceManager {
}
public void registerParty(MapleParty party, MapleMap map) {
for (MaplePartyCharacter pc : party.getMembers()) {
for (MaplePartyCharacter pc : party.getEligibleMembers()) {
MapleCharacter c = map.getCharacterById(pc.getId());
registerPlayer(c);
}
@@ -197,6 +219,14 @@ public class EventInstanceManager {
ex.printStackTrace();
}
}
public void changedMap(MapleCharacter chr, int mapId) {
try {
em.getIv().invokeFunction("changedMap", this, chr, mapId);
} catch (ScriptException | NoSuchMethodException ex) {
ex.printStackTrace();
}
}
public void monsterKilled(MapleMonster mob) {
mobs.remove(mob);
@@ -418,7 +448,7 @@ public class EventInstanceManager {
rL.lock();
try {
if (chars != null && chars.size() <= size) {
if (chars != null && chars.size() < size) {
for (MapleCharacter chr : chars) {
if (chr == null) {
continue;
+36 -1
View File
@@ -35,6 +35,7 @@ import javax.script.ScriptException;
import net.server.channel.Channel;
import net.server.world.MapleParty;
import net.server.world.MaplePartyCharacter;
import server.TimerManager;
import server.expeditions.MapleExpedition;
import server.maps.MapleMap;
@@ -42,6 +43,10 @@ import server.life.MapleMonster;
import server.life.MapleLifeFactory;
import client.MapleCharacter;
import java.util.LinkedList;
import java.util.List;
import java.util.ArrayList;
import java.lang.reflect.Array;
/**
*
@@ -86,7 +91,8 @@ public class EventManager {
}
public void cancelSchedule() {
schedule.cancel(true);
if(schedule != null)
schedule.cancel(true);
}
public ScheduledFuture<?> scheduleAtTimestamp(final String methodName, long timestamp) {
@@ -173,6 +179,7 @@ public class EventManager {
try {
EventInstanceManager eim = (EventInstanceManager) (iv.invokeFunction("setup", (Object) null));
eim.registerParty(party, map);
party.setEligibleMembers(null);
} catch (ScriptException | NoSuchMethodException ex) {
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
}
@@ -183,6 +190,7 @@ public class EventManager {
try {
EventInstanceManager eim = (EventInstanceManager) (iv.invokeFunction("setup", difficulty, party.getLeader().getId()));
eim.registerParty(party, map);
party.setEligibleMembers(null);
} catch (ScriptException | NoSuchMethodException ex) {
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
}
@@ -198,6 +206,33 @@ public class EventManager {
}
}
public List<MaplePartyCharacter> getEligibleParty(MapleParty party) {
if (party == null) {
return(new ArrayList<>());
}
try {
Object p = iv.invokeFunction("getEligibleParty", party.getPartyMembers());
if(p != null) {
List<MaplePartyCharacter> lmpc = new ArrayList<>((List<MaplePartyCharacter>) p);
party.setEligibleMembers(lmpc);
return lmpc;
}
} catch (ScriptException | NoSuchMethodException ex) {
ex.printStackTrace();
}
return(new ArrayList<>());
}
public void clearPQ(EventInstanceManager eim, MapleMap toMap) {
try {
iv.invokeFunction("clearPQ", eim, toMap);
} catch (ScriptException | NoSuchMethodException ex) {
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
public MapleMonster getMonster(int mid) {
return(MapleLifeFactory.getMonster(mid));
}
@@ -218,7 +218,7 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
ex.printStackTrace();
}
}
public int getMeso() {
return getPlayer().getMeso();
}
@@ -92,7 +92,7 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
int range = maxMeso - minMeso;
int displayDrop = (int) (Math.random() * range) + minMeso;
int mesoDrop = (displayDrop * client.getWorldServer().getMesoRate());
reactor.getMap().spawnMesoDrop(mesoDrop, dropPos, reactor, client.getPlayer(), false, (byte) 0);
reactor.getMap().spawnMesoDrop(mesoDrop, dropPos, reactor, client.getPlayer(), false, (byte) 2);
} else {
Item drop;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
@@ -129,7 +129,7 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
private void spawnMonster(int id, int qty, Point pos) {
for (int i = 0; i < qty; i++) {
reactor.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(id), pos);
reactor.getMap().spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(id), pos);
}
}
@@ -47,6 +47,23 @@ public class ReactorScriptManager extends AbstractScriptManager {
public synchronized static ReactorScriptManager getInstance() {
return instance;
}
public void onHit(MapleClient c, MapleReactor reactor) {
try {
ReactorActionManager rm = new ReactorActionManager(c, reactor);
Invocable iv = getInvocable("reactor/" + reactor.getId() + ".js", c);
if (iv == null) {
return;
}
engine.put("rm", rm);
iv.invokeFunction("hit");
} catch(final NoSuchMethodException e) {
//do nothing, hit is OPTIONAL
}
catch (final ScriptException | NullPointerException e) {
FilePrinter.printError(FilePrinter.REACTOR + reactor.getId() + ".txt", e);
}
}
public void act(MapleClient c, MapleReactor reactor) {
try {
+4 -6
View File
@@ -1001,15 +1001,11 @@ public class MapleMap {
return null;
}
public void spawnMonsterOnGroudBelow(int id, int x, int y) {
public void spawnMonsterOnGroundBelow(int id, int x, int y) {
MapleMonster mob = MapleLifeFactory.getMonster(id);
spawnMonsterOnGroundBelow(mob, new Point(x, y));
}
public void spawnMonsterOnGroudBelow(MapleMonster mob, Point pos) {
spawnMonsterOnGroundBelow(mob, pos);
}
public void spawnMonsterOnGroundBelow(MapleMonster mob, Point pos) {
Point spos = new Point(pos.x, pos.y - 1);
spos = calcPointBelow(spos);
@@ -1642,13 +1638,15 @@ public class MapleMap {
}
chr.leaveMap();
chr.cancelMapTimeLimitTask();
for (MapleSummon summon : chr.getSummonsValues()) {
for (MapleSummon summon : new ArrayList<>(chr.getSummonsValues())) {
if (summon.isStationary()) {
chr.cancelBuffStats(MapleBuffStat.PUPPET);
} else {
removeMapObject(summon);
}
}
if (chr.getDragon() != null) {
removeMapObject(chr.getDragon());
if (chr.isHidden()) {
+2 -2
View File
@@ -174,8 +174,9 @@ public class MapleReactor extends AbstractMapleMapObject {
return;
}
if(ServerConstants.USE_DEBUG == true) c.getPlayer().dropMessage(5, "Hitted REACTOR " + this.getId() + " with POS " + charPos + " , STANCE " + stance + " , SkillID " + skillid + " , STATE " + stats.getType(state) + " STATESIZE " + stats.getStateSize(state));
int reactorType = stats.getType(state);
ReactorScriptManager.getInstance().onHit(c, this);
int reactorType = stats.getType(state);
if (reactorType < 999 && reactorType != -1) {//type 2 = only hit from right (kerning swamp plants), 00 is air left 02 is ground left
if (!(reactorType == 2 && (stance == 0 || stance == 2))) { //get next state
for (byte b = 0; b < stats.getStateSize(state); b++) {//YAY?
@@ -212,7 +213,6 @@ public class MapleReactor extends AbstractMapleMapObject {
map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
ReactorScriptManager.getInstance().act(c, this);
setShouldCollect(true);
System.out.println("ehh");
}
} catch(Exception e) {
e.printStackTrace();
+1 -1
View File
@@ -47,7 +47,7 @@ public class ExpAction extends MapleQuestAction {
@Override
public void run(MapleCharacter chr, Integer extSelection) {
if (chr.isBeginnerJob()) {
if (chr.isBeginnerJob() && chr.getLevel() < 10) {
chr.gainExp(exp, true, true);
} else {
chr.gainExp(exp * chr.getExpRate(), true, true);
+1 -2
View File
@@ -14516,8 +14516,7 @@
<canvas name="iconRaw" width="31" height="28">
<vector name="origin" x="-1" y="30"/>
</canvas>
<int name="price" value="1"/>
<int name="quest" value="1"/>
<int name="price" value="1500"/>
</imgdir>
</imgdir>
<imgdir name="04032475">
+2 -2
View File
@@ -39069,8 +39069,8 @@
<imgdir name="1">
<imgdir name="item">
<imgdir name="0">
<int name="id" value="4000257"/>
<int name="count" value="-50"/>
<int name="id" value="4032474"/>
<int name="count" value="-5"/>
</imgdir>
<imgdir name="1">
<int name="id" value="4000046"/>
+2 -2
View File
@@ -62702,8 +62702,8 @@
<int name="npc" value="2041017"/>
<imgdir name="item">
<imgdir name="0">
<int name="id" value="4000257"/>
<int name="count" value="50"/>
<int name="id" value="4032474"/>
<int name="count" value="5"/>
</imgdir>
<imgdir name="1">
<int name="id" value="4000046"/>
+249 -259
View File
@@ -5946,26 +5946,25 @@
<int name="13" value="2000002" />
<int name="14" value="2000003" />
<int name="15" value="2000004" />
<int name="16" value="2022066" />
<int name="17" value="2040321" />
<int name="18" value="2040804" />
<int name="19" value="2040925" />
<int name="20" value="2040933" />
<int name="21" value="2043019" />
<int name="22" value="2043110" />
<int name="23" value="2044602" />
<int name="24" value="2383013" />
<int name="25" value="4000021" />
<int name="26" value="4000048" />
<int name="27" value="4003005" />
<int name="28" value="4004002" />
<int name="29" value="4007000" />
<int name="30" value="4007001" />
<int name="31" value="4007002" />
<int name="32" value="4010002" />
<int name="33" value="4020001" />
<int name="34" value="4130010" />
<int name="35" value="4130011" />
<int name="16" value="2040321" />
<int name="17" value="2040804" />
<int name="18" value="2040925" />
<int name="19" value="2040933" />
<int name="20" value="2043019" />
<int name="21" value="2043110" />
<int name="22" value="2044602" />
<int name="23" value="2383013" />
<int name="24" value="4000021" />
<int name="25" value="4000048" />
<int name="26" value="4003005" />
<int name="27" value="4004002" />
<int name="28" value="4007000" />
<int name="29" value="4007001" />
<int name="30" value="4007002" />
<int name="31" value="4010002" />
<int name="32" value="4020001" />
<int name="33" value="4130010" />
<int name="34" value="4130011" />
</imgdir>
<string name="episode" value="Lv. : 50\nForm : Mammal\n\nA small yeti often spotted in the snowfield of Ossyria near El Nath. Is made to live in cold climates and can therefore withstand strong Ice Attribute Attacks while being vulnerable to Fire Attribute Attacks. Its small frame and slow movement makes it an easy target, but beware, as many a travellers have been badly injured by this cute little creature. The Jr. Yeti is capable of transforming into a giant yeti as well so watch out! " />
</imgdir>
@@ -6445,26 +6444,25 @@
<int name="9" value="1082010" />
<int name="10" value="1082067" />
<int name="11" value="1092010" />
<int name="12" value="1302056" />
<int name="13" value="1402011" />
<int name="14" value="1412007" />
<int name="15" value="1432040" />
<int name="16" value="2000002" />
<int name="17" value="2000004" />
<int name="18" value="2002010" />
<int name="19" value="2043017" />
<int name="20" value="2044602" />
<int name="21" value="2060000" />
<int name="22" value="2061000" />
<int name="23" value="2383026" />
<int name="24" value="4000126" />
<int name="25" value="4004000" />
<int name="26" value="4010006" />
<int name="27" value="4011007" />
<int name="28" value="4020001" />
<int name="29" value="4020007" />
<int name="30" value="4130004" />
<int name="31" value="4130013" />
<int name="12" value="1402011" />
<int name="13" value="1412007" />
<int name="14" value="1432040" />
<int name="15" value="2000002" />
<int name="16" value="2000004" />
<int name="17" value="2002010" />
<int name="18" value="2043017" />
<int name="19" value="2044602" />
<int name="20" value="2060000" />
<int name="21" value="2061000" />
<int name="22" value="2383026" />
<int name="23" value="4000126" />
<int name="24" value="4004000" />
<int name="25" value="4010006" />
<int name="26" value="4011007" />
<int name="27" value="4020001" />
<int name="28" value="4020007" />
<int name="29" value="4130004" />
<int name="30" value="4130013" />
</imgdir>
<string name="episode" value=" Lv. : 54\nForm : Enchanted\nSpecial Trait : -50% Fire Attribute Damage. Sanctity Attribute Attacks Repellent.\n\nA powerful weapon secretly built by the Mateon aliens to attack the earth. It has been built to support the small and weak Mateons, and it is equipped with multiple explosive missiles. The Omega Sector has sent over a special troop to battle against MT-09." />
</imgdir>
@@ -6484,32 +6482,31 @@
<int name="6" value="1082081" />
<int name="7" value="1082201" />
<int name="8" value="1092045" />
<int name="9" value="1132001" />
<int name="10" value="1432006" />
<int name="11" value="1472055" />
<int name="12" value="2000002" />
<int name="13" value="2000003" />
<int name="14" value="2040031" />
<int name="15" value="2040033" />
<int name="16" value="2040515" />
<int name="17" value="2043701" />
<int name="18" value="2043801" />
<int name="19" value="2049100" />
<int name="20" value="2049101" />
<int name="21" value="2330002" />
<int name="22" value="2383035" />
<int name="23" value="4000021" />
<int name="24" value="4000283" />
<int name="25" value="4000284" />
<int name="26" value="4003005" />
<int name="27" value="4004002" />
<int name="28" value="4004004" />
<int name="29" value="4010005" />
<int name="30" value="4020004" />
<int name="31" value="4020007" />
<int name="32" value="4130000" />
<int name="33" value="4130009" />
<int name="34" value="4130021" />
<int name="9" value="1432006" />
<int name="10" value="1472055" />
<int name="11" value="2000002" />
<int name="12" value="2000003" />
<int name="13" value="2040031" />
<int name="14" value="2040033" />
<int name="15" value="2040515" />
<int name="16" value="2043701" />
<int name="17" value="2043801" />
<int name="18" value="2049100" />
<int name="19" value="2049101" />
<int name="20" value="2330002" />
<int name="21" value="2383035" />
<int name="22" value="4000021" />
<int name="23" value="4000283" />
<int name="24" value="4000284" />
<int name="25" value="4003005" />
<int name="26" value="4004002" />
<int name="27" value="4004004" />
<int name="28" value="4010005" />
<int name="29" value="4020004" />
<int name="30" value="4020007" />
<int name="31" value="4130000" />
<int name="32" value="4130009" />
<int name="33" value="4130021" />
</imgdir>
<string name="episode" value=" Lv. : 56\nForm : Mammal\n\nA type of bear that lives near Mu Lung. Although it's only a bear, it has a heartfelt desire to become a virtuous master, hence devoting much of its energy in training. While it diligently trains in its practice uniform, it sometimes fails to suppress its animalistic instinct and attacks the passersby." />
</imgdir>
@@ -7517,68 +7514,67 @@
</imgdir>
<imgdir name="reward">
<int name="0" value="1302011" />
<int name="1" value="1302056" />
<int name="2" value="1312009" />
<int name="3" value="1322018" />
<int name="4" value="1332015" />
<int name="5" value="1332017" />
<int name="6" value="1372014" />
<int name="7" value="1372033" />
<int name="8" value="1382007" />
<int name="9" value="1402011" />
<int name="10" value="1412007" />
<int name="11" value="1422009" />
<int name="12" value="1432006" />
<int name="13" value="1442010" />
<int name="14" value="1452004" />
<int name="15" value="1462008" />
<int name="16" value="1472025" />
<int name="17" value="1482008" />
<int name="18" value="1492008" />
<int name="19" value="1492022" />
<int name="20" value="2000002" />
<int name="21" value="2000003" />
<int name="22" value="2002002" />
<int name="23" value="2002003" />
<int name="24" value="2040302" />
<int name="25" value="2040401" />
<int name="26" value="2040502" />
<int name="27" value="2040516" />
<int name="28" value="2040614" />
<int name="29" value="2040627" />
<int name="30" value="2040704" />
<int name="31" value="2040804" />
<int name="32" value="2040825" />
<int name="33" value="2040827" />
<int name="34" value="2040933" />
<int name="35" value="2040935" />
<int name="36" value="2041002" />
<int name="37" value="2041013" />
<int name="38" value="2041016" />
<int name="39" value="2041046" />
<int name="40" value="2043201" />
<int name="41" value="2043701" />
<int name="42" value="2043802" />
<int name="43" value="2044114" />
<int name="44" value="2044116" />
<int name="45" value="2044201" />
<int name="46" value="2044301" />
<int name="47" value="2044502" />
<int name="48" value="2044801" />
<int name="49" value="2044803" />
<int name="50" value="2044807" />
<int name="51" value="2044902" />
<int name="52" value="2044904" />
<int name="53" value="2060000" />
<int name="54" value="2061000" />
<int name="55" value="2388005" />
<int name="56" value="4000113" />
<int name="57" value="4000114" />
<int name="58" value="4000115" />
<int name="59" value="4004001" />
<int name="60" value="4010003" />
<int name="61" value="4020006" />
<int name="62" value="4031991" />
<int name="1" value="1312009" />
<int name="2" value="1322018" />
<int name="3" value="1332015" />
<int name="4" value="1332017" />
<int name="5" value="1372014" />
<int name="6" value="1372033" />
<int name="7" value="1382007" />
<int name="8" value="1402011" />
<int name="9" value="1412007" />
<int name="10" value="1422009" />
<int name="11" value="1432006" />
<int name="12" value="1442010" />
<int name="13" value="1452004" />
<int name="14" value="1462008" />
<int name="15" value="1472025" />
<int name="16" value="1482008" />
<int name="17" value="1492008" />
<int name="18" value="1492022" />
<int name="19" value="2000002" />
<int name="20" value="2000003" />
<int name="21" value="2002002" />
<int name="22" value="2002003" />
<int name="23" value="2040302" />
<int name="24" value="2040401" />
<int name="25" value="2040502" />
<int name="26" value="2040516" />
<int name="27" value="2040614" />
<int name="28" value="2040627" />
<int name="29" value="2040704" />
<int name="30" value="2040804" />
<int name="31" value="2040825" />
<int name="32" value="2040827" />
<int name="33" value="2040933" />
<int name="34" value="2040935" />
<int name="35" value="2041002" />
<int name="36" value="2041013" />
<int name="37" value="2041016" />
<int name="38" value="2041046" />
<int name="39" value="2043201" />
<int name="40" value="2043701" />
<int name="41" value="2043802" />
<int name="42" value="2044114" />
<int name="43" value="2044116" />
<int name="44" value="2044201" />
<int name="45" value="2044301" />
<int name="46" value="2044502" />
<int name="47" value="2044801" />
<int name="48" value="2044803" />
<int name="49" value="2044807" />
<int name="50" value="2044902" />
<int name="51" value="2044904" />
<int name="52" value="2060000" />
<int name="53" value="2061000" />
<int name="54" value="2388005" />
<int name="55" value="4000113" />
<int name="56" value="4000114" />
<int name="57" value="4000115" />
<int name="58" value="4004001" />
<int name="59" value="4010003" />
<int name="60" value="4020006" />
<int name="61" value="4031991" />
</imgdir>
<string name="episode" value=" Lv. : 59\nForm : Enchanted\n\nThe ghost of the past that originated from the deserted land in Ludibrium. It was brought back to life due to the Dimensional Schism, and has been a follower of Papulatus ever since, pestering anyone that attempts to go near the lowest level of the Clocktower. It appears in the form of an owl clock, and it tries to cling onto the past by turning back the time. " />
</imgdir>
@@ -8276,25 +8272,24 @@
<int name="7" value="1072090" />
<int name="8" value="1082066" />
<int name="9" value="1102015" />
<int name="10" value="1132003" />
<int name="11" value="1322054" />
<int name="12" value="1472032" />
<int name="13" value="2000004" />
<int name="14" value="2000006" />
<int name="15" value="2040622" />
<int name="16" value="2043112" />
<int name="17" value="2044014" />
<int name="18" value="2070005" />
<int name="19" value="2383047" />
<int name="20" value="4000021" />
<int name="21" value="4000283" />
<int name="22" value="4000285" />
<int name="23" value="4003005" />
<int name="24" value="4010005" />
<int name="25" value="4020007" />
<int name="26" value="4130002" />
<int name="27" value="4130005" />
<int name="28" value="4130013" />
<int name="10" value="1322054" />
<int name="11" value="1472032" />
<int name="12" value="2000004" />
<int name="13" value="2000006" />
<int name="14" value="2040622" />
<int name="15" value="2043112" />
<int name="16" value="2044014" />
<int name="17" value="2070005" />
<int name="18" value="2383047" />
<int name="19" value="4000021" />
<int name="20" value="4000283" />
<int name="21" value="4000285" />
<int name="22" value="4003005" />
<int name="23" value="4010005" />
<int name="24" value="4020007" />
<int name="25" value="4130002" />
<int name="26" value="4130005" />
<int name="27" value="4130013" />
</imgdir>
<string name="episode" value=" Lv. : 60\nForm : Mammal\nSpecial Trait : -50% Fire Attribute Damage. -50% Ice Attribute Damage. Vulnerable to Sanctity Attribute Attacks.\n\nA type of bear that lives near Mu Lung. Although it is just a bear, it sincerely desires to become a virtuous master; hence, it is always wearing its training uniform, completely immersed in training. It has features similar to those of humans, but no one knows whether that is because it is close to becoming a virtuous master or because that's just one of this monster's special traits." />
</imgdir>
@@ -8315,31 +8310,30 @@
<int name="7" value="1060092" />
<int name="8" value="1060095" />
<int name="9" value="1082062" />
<int name="10" value="1302056" />
<int name="11" value="1332055" />
<int name="12" value="1382039" />
<int name="13" value="1402003" />
<int name="14" value="1402011" />
<int name="15" value="1452022" />
<int name="16" value="2000002" />
<int name="17" value="2000004" />
<int name="18" value="2000006" />
<int name="19" value="2040301" />
<int name="20" value="2040421" />
<int name="21" value="2043001" />
<int name="22" value="2044802" />
<int name="23" value="2049000" />
<int name="24" value="2330003" />
<int name="25" value="2384008" />
<int name="26" value="4000021" />
<int name="27" value="4000295" />
<int name="28" value="4003005" />
<int name="29" value="4004000" />
<int name="30" value="4007007" />
<int name="31" value="4010006" />
<int name="32" value="4020004" />
<int name="33" value="4130000" />
<int name="34" value="4130012" />
<int name="10" value="1332055" />
<int name="11" value="1382039" />
<int name="12" value="1402003" />
<int name="13" value="1402011" />
<int name="14" value="1452022" />
<int name="15" value="2000002" />
<int name="16" value="2000004" />
<int name="17" value="2000006" />
<int name="18" value="2040301" />
<int name="19" value="2040421" />
<int name="20" value="2043001" />
<int name="21" value="2044802" />
<int name="22" value="2049000" />
<int name="23" value="2330003" />
<int name="24" value="2384008" />
<int name="25" value="4000021" />
<int name="26" value="4000295" />
<int name="27" value="4003005" />
<int name="28" value="4004000" />
<int name="29" value="4007007" />
<int name="30" value="4010006" />
<int name="31" value="4020004" />
<int name="32" value="4130000" />
<int name="33" value="4130012" />
</imgdir>
<string name="episode" value=" Lv. : 64\nForm : Reptile\n\nA monster alligator that lives in the swampy regions near the Herb Town. It enjoys the company of small animals, so it is often seen carrying a little bird on its head and a baby Bellflower Root on its back. It does not attack unless provoked, but it turns into a ferocious monster when attacked." />
</imgdir>
@@ -9423,27 +9417,26 @@
<int name="12" value="1072165" />
<int name="13" value="1082105" />
<int name="14" value="1082108" />
<int name="15" value="1302056" />
<int name="16" value="1312009" />
<int name="17" value="1332015" />
<int name="18" value="1372015" />
<int name="19" value="1372016" />
<int name="20" value="1402011" />
<int name="21" value="1412011" />
<int name="22" value="1422014" />
<int name="23" value="1492009" />
<int name="24" value="2000004" />
<int name="25" value="2000006" />
<int name="26" value="2040618" />
<int name="27" value="2041021" />
<int name="28" value="2044301" />
<int name="29" value="2050000" />
<int name="30" value="2384026" />
<int name="31" value="4000079" />
<int name="32" value="4010004" />
<int name="33" value="4020007" />
<int name="34" value="4130002" />
<int name="35" value="4130003" />
<int name="15" value="1312009" />
<int name="16" value="1332015" />
<int name="17" value="1372015" />
<int name="18" value="1372016" />
<int name="19" value="1402011" />
<int name="20" value="1412011" />
<int name="21" value="1422014" />
<int name="22" value="1492009" />
<int name="23" value="2000004" />
<int name="24" value="2000006" />
<int name="25" value="2040618" />
<int name="26" value="2041021" />
<int name="27" value="2044301" />
<int name="28" value="2050000" />
<int name="29" value="2384026" />
<int name="30" value="4000079" />
<int name="31" value="4010004" />
<int name="32" value="4020007" />
<int name="33" value="4130002" />
<int name="34" value="4130003" />
</imgdir>
<string name="episode" value=" Lv. : 72\nForm : Mammal\n\nA monster born in an ocean of lava in a cave. With its reddish eyes, monstrous teeth, and spiky collar, Cerebes threatens its enemies although it only uses melee attacks. When Cerebes evolves into Bain, however, it will use powerful attacks of fire attribute, so beware. " />
</imgdir>
@@ -10381,68 +10374,66 @@
</imgdir>
<imgdir name="reward">
<int name="0" value="1032021" />
<int name="1" value="1132001" />
<int name="2" value="1132003" />
<int name="3" value="1302012" />
<int name="4" value="1312010" />
<int name="5" value="1322019" />
<int name="6" value="1332018" />
<int name="7" value="1372015" />
<int name="8" value="1382010" />
<int name="9" value="1402012" />
<int name="10" value="1412008" />
<int name="11" value="1422010" />
<int name="12" value="1432007" />
<int name="13" value="1442008" />
<int name="14" value="1452011" />
<int name="15" value="1462009" />
<int name="16" value="1472029" />
<int name="17" value="1482009" />
<int name="18" value="1492009" />
<int name="19" value="2000002" />
<int name="20" value="2000003" />
<int name="21" value="2002004" />
<int name="22" value="2002011" />
<int name="23" value="2022142" />
<int name="24" value="2040004" />
<int name="25" value="2040005" />
<int name="26" value="2040025" />
<int name="27" value="2040514" />
<int name="28" value="2040705" />
<int name="29" value="2040805" />
<int name="30" value="2040825" />
<int name="31" value="2040901" />
<int name="32" value="2041001" />
<int name="33" value="2041010" />
<int name="34" value="2041022" />
<int name="35" value="2041043" />
<int name="36" value="2043019" />
<int name="37" value="2043101" />
<int name="38" value="2043301" />
<int name="39" value="2043801" />
<int name="40" value="2044014" />
<int name="41" value="2044101" />
<int name="42" value="2044312" />
<int name="43" value="2044412" />
<int name="44" value="2044501" />
<int name="45" value="2044601" />
<int name="46" value="2044801" />
<int name="47" value="2044803" />
<int name="48" value="2048005" />
<int name="49" value="2049100" />
<int name="50" value="2049101" />
<int name="51" value="2060001" />
<int name="52" value="2061001" />
<int name="53" value="2070004" />
<int name="54" value="2388010" />
<int name="55" value="4000021" />
<int name="56" value="4000283" />
<int name="57" value="4000284" />
<int name="58" value="4000285" />
<int name="59" value="4004000" />
<int name="60" value="4010001" />
<int name="61" value="4010004" />
<int name="62" value="4020006" />
<int name="1" value="1302012" />
<int name="2" value="1312010" />
<int name="3" value="1322019" />
<int name="4" value="1332018" />
<int name="5" value="1372015" />
<int name="6" value="1382010" />
<int name="7" value="1402012" />
<int name="8" value="1412008" />
<int name="9" value="1422010" />
<int name="10" value="1432007" />
<int name="11" value="1442008" />
<int name="12" value="1452011" />
<int name="13" value="1462009" />
<int name="14" value="1472029" />
<int name="15" value="1482009" />
<int name="16" value="1492009" />
<int name="17" value="2000002" />
<int name="18" value="2000003" />
<int name="19" value="2002004" />
<int name="20" value="2002011" />
<int name="21" value="2022142" />
<int name="22" value="2040004" />
<int name="23" value="2040005" />
<int name="24" value="2040025" />
<int name="25" value="2040514" />
<int name="26" value="2040705" />
<int name="27" value="2040805" />
<int name="28" value="2040825" />
<int name="29" value="2040901" />
<int name="30" value="2041001" />
<int name="31" value="2041010" />
<int name="32" value="2041022" />
<int name="33" value="2041043" />
<int name="34" value="2043019" />
<int name="35" value="2043101" />
<int name="36" value="2043301" />
<int name="37" value="2043801" />
<int name="38" value="2044014" />
<int name="39" value="2044101" />
<int name="40" value="2044312" />
<int name="41" value="2044412" />
<int name="42" value="2044501" />
<int name="43" value="2044601" />
<int name="44" value="2044801" />
<int name="45" value="2044803" />
<int name="46" value="2048005" />
<int name="47" value="2049100" />
<int name="48" value="2049101" />
<int name="49" value="2060001" />
<int name="50" value="2061001" />
<int name="51" value="2070004" />
<int name="52" value="2388010" />
<int name="53" value="4000021" />
<int name="54" value="4000283" />
<int name="55" value="4000284" />
<int name="56" value="4000285" />
<int name="57" value="4004000" />
<int name="58" value="4010001" />
<int name="59" value="4010004" />
<int name="60" value="4020006" />
</imgdir>
<string name="episode" value=" Lv. : 71\nForm : Mammal\n\nAn apprentice of Mu Lung who had once trained to become a virtuous master, until it harmed a lot of people under the magic spell of the Priest Cat. It has, since then, chosen the path of penance, although it still occasionally harms people due to the lingering spell. Its physique of a trainee and its magic render this monster a difficult enemy to defeat." />
</imgdir>
@@ -13241,10 +13232,9 @@
<int name="49" value="4000048" />
<int name="50" value="4000049" />
<int name="51" value="4000051" />
<int name="52" value="4000257" />
<int name="53" value="4004002" />
<int name="54" value="4010004" />
<int name="55" value="4020004" />
<int name="52" value="4004002" />
<int name="53" value="4010004" />
<int name="54" value="4020004" />
</imgdir>
<string name="episode" value=" Lv. : 90\nForm : Mammal\n\nAccording to legend, this Snowman was born between a human and a Snow Spirit. It has the soul of a human but was born with the appearance of a monster which caused him much grief growing up as he was constantly taunted by other humans. The Snow Spirit, who watched Snowman's sad situation, froze up an entire mountain range for Snowman and called it El Nath. Snowman doesn't like humans and hence stays away from them as much as possible, but he'd never attack a human first on his own. However, it will mercilessly attack anyone who breaks the Fragment of the Snow Spirit." />
</imgdir>