Mob aggro overhaul + STR-DEX autoassign patch + Guild & Pl. Store fix

Reviewed Monster Magnet skill effect on mobs, now properly showing up to other players.
Reworked concurrency protection on login handler, now properly synchronizing requests for the same accountId.
Reviewed an expedition issue with attempting to send packets on loggedoff players. Expeditions no longer holds a character object list of its own, rather finding players through their id on the world storage.
Added stat requirement definition as first message on 1st job NPCs.
Fixed an issue with area triggered NPC conversations not getting properly disposed.
Reviewed "launch.bat", internally referencing Java7 engine. Assuming it has been installed in the default directory on the system, it's no longer necessary to set precedence on PATH for it.
Fixed need for "reapproval from the 3rd job instructors" to attempt Zakum once more.
Reviewed goto command. Non-GM's no longer has access to area maps, only towns.
Implemented a new server flag for enforcing base rates (server rate: 1x) on players level 10 or lower.
Fixed player guild tooltips not being properly marshalled to others on the map, at the event of several guild actions.
Reviewed event system allowing creation of same-name events, potentially leading to null EIM problems.
Refactored some locks on MapleCharacter, potentially solving a deadlock case within expiring/forfeiting quest methods.
Implemented a major overhaul on mob aggro system, now updating player aggro in real-time based on their latest DPS. Properly refactored and encapsulated aggro mechanics.
Fixed NPE on disposing events with alive mobs.
Added server-side birthday check handling when opening player shops or merchants having cash items in store.
Fixed player shop tooltip not finishing properly when shop owner closes store with visitors still in there.
Fixed forceChangeMap method not warping players to the designated event map (rather sending them to the starting event map).
Reviewed "summon" command, now using forceChangeMap, also changing channels if needed.
Reworked HeavenMS autoassigner: STR-based classes now ups a bit more DEX than before, since its a vital attribute for accuracy on their actions.
Added meso ceil check on player transactions. Trades now gets suspended if the max amount is reached.
Implemented server-side item limit check on player shops and merchants.
Fixed an exploit with merchants, on where players would be able to save the selling item on DB before taking from inventory.
This commit is contained in:
ronancpl
2019-01-31 00:49:15 -02:00
parent 98be29b088
commit efc8884e19
101 changed files with 17235 additions and 16461 deletions

View File

@@ -46,12 +46,7 @@ function start() {
} else {
if (cm.getJobId() == 0) {
actionx["1stJob"] = true;
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType))
cm.sendNext("So you decided to become a #rBowman#k?");
else {
cm.sendOk("Train a bit more until you reach #blevel 10, " + cm.getFirstJobStatRequirement(jobType) + "#k and I can show you the way of the #rBowman#k.");
cm.dispose();
}
cm.sendNext("So you decided to become a #rbowman#k? There are some standards to meet, y'know... #bYour level should be at least 10, with at least " + cm.getFirstJobStatRequirement(jobType) + "#k. Let's see."); // thanks Vcoc for noticing a need to state and check requirements on first job adv starting message
} else if (cm.getLevel() >= 30 && cm.getJobId() == 300) {
actionx["2ndJob"] = true;
if (cm.haveItem(4031012))
@@ -79,8 +74,13 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == 0 && type != 1)
if (mode == -1 && selection == -1) {
cm.dispose();
return;
} else if (mode == 0 && type != 1) {
status -= 2;
}
if (status == -1){
start();
return;
@@ -116,10 +116,15 @@ function action(mode, type, selection) {
}
if (actionx["1stJob"]){
if (status == 0)
cm.sendNextPrev("It is an important and final choice. You will not be able to turn back.");
else if (status == 1){
if (cm.canHold(1452051) && cm.canHold(2060000)){
if (status == 0) {
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType)) {
cm.sendNextPrev("It is an important and final choice. You will not be able to turn back.");
} else {
cm.sendOk("Train a bit more until you reach the base requirements and I can show you the way of the #rBowman#k.");
cm.dispose();
}
} else if (status == 1){
if (cm.canHold(1452051) && cm.canHold(2070000)){
if (cm.getJobId() == 0){
cm.changeJobById(300);
cm.gainItem(1452051, 1);

View File

@@ -8,7 +8,7 @@ function action(mode, type, selection) {
if (mode == 0 && type == 0) {
status--;
} else if (mode == -1) {
qm.dispose();
cm.dispose();
return;
} else {
status++;

View File

@@ -47,12 +47,7 @@ function start() {
} else {
if (cm.getJobId() == 0) {
actionx["1stJob"] = true;
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType))
cm.sendNext("Do you want to become a Warrior? You need to meet some criteria in order to do so.#b You should be at least in level 10, with at least 35 in STR#k. Let's see...");
else {
cm.sendOk("Train a bit more until you reach #blevel 10, " + cm.getFirstJobStatRequirement(jobType) + "#k and I can show you the way of the #rWarrior#k.");
cm.dispose();
}
cm.sendNext("Do you want to become a #rwarrior#k? You need to meet some criteria in order to do so.#b You should be at least in level 10, and at least " + cm.getFirstJobStatRequirement(jobType) + "#k. Let's see..."); // thanks Vcoc for noticing a need to state and check requirements on first job adv starting message
} else if (cm.getLevel() >= 30 && cm.getJobId() == 100) {
actionx["2ndJob"] = true;
if (cm.haveItem(4031012))
@@ -80,8 +75,13 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == 0 && type != 1)
if (mode == -1 && selection == -1) {
cm.dispose();
return;
} else if (mode == 0 && type != 1) {
status -= 2;
}
if (status == -1){
start();
return;
@@ -117,9 +117,14 @@ function action(mode, type, selection) {
}
if (actionx["1stJob"]){
if (status == 0)
cm.sendNextPrev("It is an important and final choice. You will not be able to turn back.");
else if (status == 1){
if (status == 0) {
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType)) {
cm.sendNextPrev("It is an important and final choice. You will not be able to turn back.");
} else {
cm.sendOk("Train a bit more until you reach the base requirements and I can show you the way of the #rWarrior#k.");
cm.dispose();
}
} else if (status == 1){
if (cm.canHold(1302077)){
if (cm.getJobId() == 0){
cm.changeJobById(100);

View File

@@ -47,12 +47,7 @@ function start() {
} else {
if (cm.getJobId() == 0) {
actionx["1stJob"] = true;
if (cm.getLevel() >= 8 && cm.canGetFirstJob(jobType))
cm.sendNext("Want to be a magician? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 8#k, with getting INT as your top priority. Let's see.");
else {
cm.sendOk("Train a bit more until you reach #blevel 8, " + cm.getFirstJobStatRequirement(jobType) + "#k and I can show you the way of the #rMagician#k.");
cm.dispose();
}
cm.sendNext("Want to be a #rmagician#k? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 8#k, with getting " + cm.getFirstJobStatRequirement(jobType) + " as your top priority. Let's see."); // thanks Vcoc for noticing a need to state and check requirements on first job adv starting message
} else if (cm.getLevel() >= 30 && cm.getJobId() == 200) {
actionx["2ndJob"] = true;
if (cm.haveItem(4031012))
@@ -80,8 +75,13 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == 0 && type == 0)
if (mode == -1 && selection == -1) {
cm.dispose();
return;
} else if (mode == 0 && type == 0) {
status -= 2;
}
if (status == -1){
start();
return;
@@ -117,9 +117,14 @@ function action(mode, type, selection) {
}
if (actionx["1stJob"]){
if (status == 0)
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little sinister mind, and... yeah... so, what do you think? Wanna be the Magician?");
else if (status == 1){
if (status == 0) {
if (cm.getLevel() >= 8 && cm.canGetFirstJob(jobType)) {
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little sinister mind, and... yeah... so, what do you think? Wanna be the Magician?");
} else {
cm.sendOk("Train a bit more until you reach the base requirements and I can show you the way of the #rMagician#k.");
cm.dispose();
}
} else if (status == 1){
if (cm.canHold(1372043)){
if (cm.getJobId() == 0){
cm.changeJobById(200);

View File

@@ -46,12 +46,7 @@ function start() {
} else {
if (cm.getJobId() == 0) {
actionx["1stJob"] = true;
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType))
cm.sendNext("Want to be a thief? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 10, with your DEX over 25#k. Let's see.");
else {
cm.sendOk("Train a bit more until you reach #blevel 10, " + cm.getFirstJobStatRequirement(jobType) + "#k and I can show you the way of the #rThief#k.");
cm.dispose();
}
cm.sendNext("Want to be a #rthief#k? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 10, with at least your " + cm.getFirstJobStatRequirement(jobType) + "#k. Let's see."); // thanks Vcoc for noticing a need to state and check requirements on first job adv starting message
} else if (cm.getLevel() >= 30 && cm.getJobId() == 400) {
actionx["2ndJob"] = true;
if (cm.haveItem(4031012))
@@ -81,8 +76,13 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == 0 && type != 1)
if (mode == -1 && selection == -1) {
cm.dispose();
return;
} else if (mode == 0 && type != 1) {
status -= 2;
}
if (status == -1){
start();
return;
@@ -118,14 +118,20 @@ function action(mode, type, selection) {
}
if (actionx["1stJob"]){
if (status == 0)
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little sinister mind, and... yeah... so, what do you think? Wanna be the Rogue?");
else if (status == 1){
if (cm.canHold(2070000) && cm.canHold(1472061)){
if (status == 0) {
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType))
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little sinister mind, and... yeah... so, what do you think? Wanna be the Rogue?");
else {
cm.sendOk("Train a bit more until you reach the base requirements and I can show you the way of the #rThief#k.");
cm.dispose();
}
} else if (status == 1){
if (cm.canHold(2070000) && cm.canHoldAll([1472061, 1332063])){
if (cm.getJobId() == 0){
cm.changeJobById(400);
cm.gainItem(2070000, 500);
cm.gainItem(2070015, 500);
cm.gainItem(1472061, 1);
cm.gainItem(1332063, 1);
cm.resetStats();
}
cm.sendNext("Alright, from here out, you are a part of us! You'll be living the life of a wanderer at ..., but just be patient as soon, you'll be living the high life. Alright, it ain't much, but I'll give you some of my abilities... HAAAHHH!!!");

View File

@@ -29,6 +29,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.BALROG_NORMAL;
@@ -68,7 +69,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -120,7 +121,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -129,13 +131,13 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -170,7 +172,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -77,12 +77,7 @@ function start() {
} else {
if (cm.getJobId() == 0) {
actionx["1stJob"] = true;
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType))
cm.sendNext("Want to be a pirate? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 10#k. Let's see.");
else {
cm.sendOk("Train a bit more until you reach #blevel 10, " + cm.getFirstJobStatRequirement(jobType) + "#k and I can show you the way of the #rPirate#k.");
cm.dispose();
}
cm.sendNext("Want to be a #rpirate#k? There are some standards to meet. because we can't just accept EVERYONE in... #bYour level should be at least 10, with " + cm.getFirstJobStatRequirement(jobType) + " minimum#k. Let's see."); // thanks Vcoc for noticing a need to state and check requirements on first job adv starting message
} else if (cm.getLevel() >= 30 && cm.getJobId() == 500) {
actionx["2ndJob"] = true;
if (cm.isQuestCompleted(2191) || cm.isQuestCompleted(2192))
@@ -107,8 +102,13 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == 0 && type != 1)
if (mode == -1 && selection == -1) {
cm.dispose();
return;
} else if (mode == 0 && type != 1) {
status -= 2;
}
if (status == -1){
start();
return;
@@ -161,10 +161,15 @@ function action(mode, type, selection) {
}
if (actionx["1stJob"]){
if (status == 0)
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little slang, and... yeah... so, what do you think? Wanna be the Pirate?");
else if (status == 1){
if (cm.canHold(2070000) && cm.canHold(1472061)){
if (status == 0) {
if (cm.getLevel() >= 10 && cm.canGetFirstJob(jobType)) {
cm.sendYesNo("Oh...! You look like someone that can definitely be a part of us... all you need is a little slang, and... yeah... so, what do you think? Wanna be the Pirate?");
} else {
cm.sendOk("Train a bit more until you reach the base requirements and I can show you the way of the #rPirate#k.");
cm.dispose();
}
} else if (status == 1){
if (cm.canHold(2070000) && cm.canHoldAll([1482000, 1492000])){
if (cm.getJobId() == 0){
cm.changeJobById(500);
cm.gainItem(1492000, 1);

View File

@@ -141,7 +141,7 @@ function action(mode, type, selection){
} else {
if (cm.getPlayer().getLevel() >= 50){
cm.sendNext("Ok, go.");
if(!cm.isQuestStarted(100200)) cm.startQuest(100200);
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) cm.startQuest(100200);
if(Packages.constants.ServerConstants.USE_ENABLE_SOLO_EXPEDITIONS && !cm.isQuestCompleted(100201)) cm.completeQuest(100201);
}else
cm.sendNext("You're weak.");

View File

@@ -113,7 +113,7 @@ function action(mode, type, selection){
} else {
if (cm.getPlayer().getLevel() >= 50){
cm.sendNext("Ok, go.");
if(!cm.isQuestStarted(100200)) cm.startQuest(100200);
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) cm.startQuest(100200);
if(Packages.constants.ServerConstants.USE_ENABLE_SOLO_EXPEDITIONS && !cm.isQuestCompleted(100201)) cm.completeQuest(100201);
}else
cm.sendNext("You're weak.");

View File

@@ -114,7 +114,7 @@ function action(mode, type, selection){
} else {
if (cm.getPlayer().getLevel() >= 50){
cm.sendNext("Ok, go.");
if(!cm.isQuestStarted(100200)) cm.startQuest(100200);
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) cm.startQuest(100200);
if(Packages.constants.ServerConstants.USE_ENABLE_SOLO_EXPEDITIONS && !cm.isQuestCompleted(100201)) cm.completeQuest(100201);
}else
cm.sendNext("You're weak.");

View File

@@ -113,7 +113,7 @@ function action(mode, type, selection){
} else {
if (cm.getPlayer().getLevel() >= 50){
cm.sendNext("Ok, go.");
if(!cm.isQuestStarted(100200)) cm.startQuest(100200);
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) cm.startQuest(100200);
if(Packages.constants.ServerConstants.USE_ENABLE_SOLO_EXPEDITIONS && !cm.isQuestCompleted(100201)) cm.completeQuest(100201);
}else
cm.sendNext("You're weak.");

View File

@@ -112,7 +112,7 @@ function action(mode, type, selection){
} else {
if (cm.getPlayer().getLevel() >= 50){
cm.sendNext("Ok, go.");
if(!cm.isQuestStarted(100200)) cm.startQuest(100200);
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) cm.startQuest(100200);
if(Packages.constants.ServerConstants.USE_ENABLE_SOLO_EXPEDITIONS && !cm.isQuestCompleted(100201)) cm.completeQuest(100201);
}else
cm.sendNext("You're weak.");

View File

@@ -32,14 +32,14 @@ var questionTree = [
//Questions Related to ITEMS
["Which of following monsters got CORRECT item corresponding to the monster?", ["Royal cactus - Needle", "Wild Boar - Boar fang", "Lazy Buffy - Buffy hat", "Chipmunk - Nut", "Stirge - Stirge's wing"], 4],
["Which of following monsters got WRONG item corresponding to the monster?", ["Greatest Oldies - Greatest oldies", "Nependeath - Nependeath's leaf", "Ghost stump - Seedling", "Sparker - Seal tooth", "Miner Zombie - Zombie's lost tooth"], 1],
["In GM Event, how many FRUIT CAKE you can get as reward?", ["20", "200", "5", "25", "100"], 2],
//["In GM Event, how many FRUIT CAKE you can get as reward?", ["20", "200", "5", "25", "100"], 2],
["Which of following potions got CORRECT info.?", ["Warrior Elixir - Attack +5 for 3 minutes", "Pure Water - Recover 700 MP", "Cake - Recover 150 HP & MP", "Salad - Recover 300 MP", "Pizza - Recover 400 HP"], 4],
["Which of following potions got WRONG info.?", ["Mana Elixir - Recover 300 MP", "Tonic - Cures state of weakness", "Apple - Recover 30 HP", "Sunrise Dew - Recover 3000 MP", "Ramen - Recover 1000 HP"], 3],
//Questions Related to MONSTERS
["Green Mushroom, Tree Stump, Bubbling, Axe Stump, Octopus, which is highest level of all?", ["Tree Stump", "Bubbling", "Axe Stump", "Octopus", "Green Mushroom"], 2],
["Which monster will be seen during the ship trip to Orbis/Ellinia?", ["Werewolf", "Slime", "Crimson Balrog", "Zakum", "Star Pixie"], 2],
["Maple Island doesn't have which following monsters?", ["Green Mushroom", "Blue Snail", "Orange Mushroom", "Red Snail", "Pig"], 0],
["Maple Island doesn't have which following monsters?", ["Shroom", "Blue Snail", "Slime", "Red Snail", "Pig"], 4], // to get conformant with website answers, thanks to Vcoc
["Which monster is not at Victoria Island and Sleepywood?", ["Evil Eye", "Sentinel", "Jr. Balrog", "Ghost Stump", "Snail"], 1],
["El Nath doesn't have which following monsters?", ["Dark Yeti", "Dark Ligator", "Yeti & Pepe", "Bain", "Coolie Zombie"], 1],
["Which of following monsters can fly?", ["Malady", "Ligator", "Cold Eye", "Meerkat", "Alishar"], 0],

View File

@@ -58,7 +58,7 @@ function action(mode, type, selection) {
return;
}
if(!cm.isQuestStarted(100200)) {
if(!(cm.isQuestStarted(100200) || cm.isQuestCompleted(100200))) { // thanks Vcoc for finding out a need of reapproval from the masters for Zakum expeditions
cm.sendOk("Beware, for the power of olde has not been forgotten... ");
cm.dispose();
return;

View File

@@ -29,6 +29,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.ZAKUM;
@@ -69,7 +70,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -121,7 +122,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -130,14 +132,14 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -172,7 +174,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -29,6 +29,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.HORNTAIL;
@@ -67,7 +68,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -113,7 +114,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -122,14 +124,14 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -164,7 +166,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -31,6 +31,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.PINKBEAN;
@@ -70,7 +71,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -116,7 +117,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -125,14 +127,14 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -167,7 +169,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -28,6 +28,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.SHOWA;
@@ -68,7 +69,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -120,7 +121,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -129,14 +131,14 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -171,7 +173,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -61,7 +61,7 @@ function action(mode, type, selection) {
} else if (status == 1) {
if (selection == 0) {
if (cm.haveItem(4031424)) {
if (cm.isMarried()) {
if (cm.getPlayer().isMarried()) { // thanks MedicOP for solving an issue here
if(cm.getInventory(2).getNextFreeSlot() >= 0) {
var rand = Math.floor(Math.random() * bgPrizes.length);
cm.gainItem(bgPrizes[rand][0], bgPrizes[rand][1]);

View File

@@ -29,6 +29,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var cwkpq = MapleExpeditionType.CWKPQ;
@@ -64,7 +65,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -104,7 +105,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -113,13 +115,13 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = cwkpq.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -154,7 +156,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -29,6 +29,7 @@ importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var expedMembers;
var player;
var em;
var exped = MapleExpeditionType.SCARGA;
@@ -69,7 +70,7 @@ function action(mode, type, selection) {
status = 2;
} else if (expedition.isRegistering()) { //If the expedition is registering
if (expedition.contains(player)) { //If you're in it but it hasn't started, be patient
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin the expedition.");
cm.sendOk("You have already registered for the expedition. Please wait for #r" + expedition.getLeader().getName() + "#k to begin it.");
cm.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
@@ -121,7 +122,8 @@ function action(mode, type, selection) {
cm.dispose();
return;
}
var size = expedition.getMembers().size();
expedMembers = expedition.getMemberList();
var size = expedMembers.size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
@@ -130,13 +132,13 @@ function action(mode, type, selection) {
var text = "The following members make up your expedition (Click on them to expel them):\r\n";
text += "\r\n\t\t1." + expedition.getLeader().getName();
for (var i = 1; i < size; i++) {
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedition.getMembers().get(i).getName() + "#l\n";
text += "\r\n#b#L" + (i + 1) + "#" + (i + 1) + ". " + expedMembers.get(i).getValue() + "#l\n";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
var size = expedition.getMemberList().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
@@ -171,7 +173,7 @@ function action(mode, type, selection) {
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
var banned = expedMembers.get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();

View File

@@ -77,6 +77,7 @@ function writeFeatureTab_PlayerSocialNetwork() {
addFeature("P. members' HPBar accounts HP gain on equips.");
addFeature("Thoroughly reviewed P. Shops and H. Merchants.");
addFeature("Transactions on Merchs instantly announced to owner.");
addFeature("Proper meso space check on player transactions.");
addFeature("Game minirooms with functional pw system.");
addFeature("Proper item pickup cooldown on non-owned items.");
addFeature("Improved ranking system, with daily movement.");
@@ -121,6 +122,7 @@ function writeFeatureTab_MonstersMapsReactors() {
addFeature("Added meso drop data for many missing mobs.");
addFeature("Monsterbook displays updated drop data info.");
addFeature("Every skill/mastery book is now obtainable.");
addFeature("Enhanced aggro system: real-time DPS aggro detection.");
addFeature("Mobs now can drop more than one of the same equip.");
addFeature("Mobs only drop items collectable by the player/party.");
addFeature("Mobs shouldn't fall from foothold too often now.");
@@ -146,6 +148,7 @@ function writeFeatureTab_MonstersMapsReactors() {
addFeature("Added world maps for M. Castle, W. Tour & Ellin areas.");
addFeature("Added W. Tour & Masteria continents in the world map.");
addFeature("Reviewed several issues with W. Map tooltips & links.");
addFeature("Continent separated global drops.");
addFeature("Giant Cake boss drops s. bags and Maple items.");
}

View File

@@ -24,7 +24,7 @@
*/
function enter(pi) {
if (!pi.isQuestStarted(100200)) {
if (!(pi.isQuestStarted(100200) || pi.isQuestCompleted(100200))) {
pi.getPlayer().dropMessage(5,"You need approval from the masters to battle. You may not attempt the boss right now.");
return false;
}

View File

@@ -27,6 +27,12 @@ function end(mode, type, selection) {
return;
}
if (!(qm.canHoldAll([1302077, 1142066]))) {
qm.sendOk("Make some room in your inventory and talk back to me.");
qm.dispose();
return;
}
qm.sendNext("I have just molded your body to make it perfect for a Dawn Warrior. If you wish to become more powerful, use Stat Window (S) to raise the appropriate stats. If you aren't sure what to raise, just click on #bAuto#k.");
if (qm.getPlayer().getJob().getId() != 1100) {
qm.gainItem(1302077, 1);

View File

@@ -27,6 +27,12 @@ function end(mode, type, selection) {
return;
}
if (!(qm.canHoldAll([1372043, 1142066]))) {
qm.sendOk("Make some room in your inventory and talk back to me.");
qm.dispose();
return;
}
qm.sendNext("I have just molded your body to make it perfect for a Blaze Wizard. If you wish to become more powerful, use Stat Window (S) to raise the appropriate stats. If you aren't sure what to raise, just click on #bAuto#k.");
if (qm.getPlayer().getJob().getId() != 1200) {
qm.gainItem(1372043, 1);

View File

@@ -27,6 +27,12 @@ function end(mode, type, selection) {
return;
}
if (!(qm.canHoldAll([1452051, 1142066]) && qm.canHold(2070000))) {
qm.sendOk("Make some room in your inventory and talk back to me.");
qm.dispose();
return;
}
qm.sendNext("I have just molded your body to make it perfect for a Wind Archer. If you wish to become more powerful, use Stat Window (S) to raise the appropriate stats. If you aren't sure what to raise, just click on #bAuto#k.");
if (qm.getPlayer().getJob().getId() != 1300) {
qm.gainItem(2060000, 2000);

View File

@@ -27,11 +27,16 @@ function end(mode, type, selection) {
return;
}
if (!(qm.canHoldAll([1472061, 1142066]) && qm.canHold(2070000))) {
qm.sendOk("Make some room in your inventory and talk back to me.");
qm.dispose();
return;
}
qm.sendNext("I have just molded your body to make it perfect for a Night Walker. If you wish to become more powerful, use Stat Window (S) to raise the appropriate stats. If you aren't sure what to raise, just click on #bAuto#k.");
if (qm.getPlayer().getJob().getId() != 1400) {
qm.gainItem(1472061, 1);
qm.gainItem(2070015, 800);
qm.gainItem(2070015, 800);
qm.gainItem(2070000, 800);
qm.gainItem(1142066, 1);
qm.changeJob(MapleJob.NIGHTWALKER1);
qm.getPlayer().resetStats();

View File

@@ -27,6 +27,12 @@ function end(mode, type, selection) {
return;
}
if (!(qm.canHoldAll([1482014, 1142066]))) {
qm.sendOk("Make some room in your inventory and talk back to me.");
qm.dispose();
return;
}
qm.sendNext("I have just molded your body to make it perfect for a Thunder Breaker. If you wish to become more powerful, use Stat Window (S) to raise the appropriate stats. If you aren't sure what to raise, just click on #bAuto#k.");
if (qm.getPlayer().getJob().getId() != 1500) {
qm.gainItem(1482014, 1);

View File

@@ -39,7 +39,7 @@ function start(mode, type, selection) {
} else if (status == 1) {
if (qm.getPlayer().getJob().getId() == 2000) {
if(!qm.canHold(1142129)) {
cm.sendOk("Wow, your #bequip#k inventory is full. You need to make at least 1 empty slot to complete this quest.");
qm.sendOk("Wow, your #bequip#k inventory is full. You need to make at least 1 empty slot to complete this quest.");
qm.dispose();
return;
}

View File

@@ -59,7 +59,7 @@ function end(mode, type, selection) {
else if (status == 8) {
if(!qm.isQuestCompleted(21201)) {
if(!qm.canHold(1142130)) {
cm.sendOk("Wow, your #bequip#k inventory is full. I need you to make at least 1 empty slot to complete this quest.");
qm.sendOk("Wow, your #bequip#k inventory is full. I need you to make at least 1 empty slot to complete this quest."); // thanks MedicOP for finding an issue here
qm.dispose();
return;
}

View File

@@ -39,7 +39,7 @@ function end(mode, type, selection) {
} else if (status == 2) {
if(!qm.isQuestCompleted(21302)) {
if(!qm.canHold(1142131)) {
cm.sendOk("Wow, your #bequip#k inventory is full. I need you to make at least 1 empty slot to complete this quest.");
qm.sendOk("Wow, your #bequip#k inventory is full. I need you to make at least 1 empty slot to complete this quest.");
qm.dispose();
return;
}