Files
sweetgum-server/scripts/event/PinkBeanBattle.js
ronancpl a4973b8254 Autopot & Steal patch + Friendly mob drops + Portal update fix
Adjusted pet autopot to use temporary variables instead of the current player's HP, MP. This seems to have solved a race condition issue where the pet would instantly use up all the pots of the assigned itemid the player had on the inventory.
Steal now uses the effective chance it is supposed to use.
Reworked Steal so that it determines which item to drop accordingly with the drop rates of each available item. It won't drop Quest nor Party Quest items.
Reworked friendly mob drops to act on the same way common mobs drops items.
Fixed issues with scripted portals introduced on the Portal Soundeffect update patch. There is expected to have no more syntax errors on the portal scripts.
Improved quality of the strings used on the Expedition scripts.
New command: reach. Warps the caller to the area where the targeted player is.
2018-02-20 18:37:32 -03:00

264 lines
7.4 KiB
JavaScript

/**
* @author: Ronan
* @event: Pink Bean Battle
*/
importPackage(Packages.server.life);
importPackage(Packages.client.inventory);
var isPq = true;
var minPlayers = 6, maxPlayers = 30;
var minLevel = 120, maxLevel = 255;
var entryMap = 270050100;
var exitMap = 270050300;
var recruitMap = 270050000;
var clearMap = 270050300;
var minMapId = 270050100;
var maxMapId = 270050300;
var eventTime = 100; // 100 minutes
var lobbyRange = [0, 0];
function init() {
setEventRequirements();
}
function setLobbyRange() {
return lobbyRange;
}
function setEventRequirements() {
var reqStr = "";
reqStr += "\r\n Number of players: ";
if(maxPlayers - minPlayers >= 1) reqStr += minPlayers + " ~ " + maxPlayers;
else reqStr += minPlayers;
reqStr += "\r\n Level range: ";
if(maxLevel - minLevel >= 1) reqStr += minLevel + " ~ " + maxLevel;
else reqStr += minLevel;
reqStr += "\r\n Time limit: ";
reqStr += eventTime + " minutes";
em.setProperty("party", reqStr);
}
function setEventExclusives(eim) {
var itemSet = [];
eim.setExclusiveItems(itemSet);
}
function setEventRewards(eim) {
var itemSet, itemQty, evLevel, expStages, mesoStages;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
mesoStages = []; //bonus meso given on CLEAR stage signal
eim.setEventClearStageMeso(mesoStages);
}
function afterSetup(eim) {
eim.dropMessage(5, "The first wave will start within 15 seconds, prepare yourselves.");
eim.schedule("startWave", 15 * 1000);
}
function setup(channel) {
var eim = em.newInstance("PinkBean" + channel);
eim.setProperty("canJoin", 1);
eim.setProperty("defeatedBoss", 0);
eim.setProperty("fallenPlayers", 0);
eim.setProperty("stage", 1);
eim.setProperty("channel", channel);
var level = 1;
eim.getInstanceMap(270050100).resetPQ(level);
eim.getInstanceMap(270050200).resetPQ(level);
eim.getInstanceMap(270050300).resetPQ(level);
var mob = MapleLifeFactory.getMonster(8820000);
mob.disableDrops();
eim.getInstanceMap(270050100).spawnMonsterOnGroundBelow(mob, new java.awt.Point(0, -42));
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function playerEntry(eim, player) {
eim.dropMessage(5, "[Expedition] " + player.getName() + " has entered the map.");
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.dropMessage(5, "[Expedition] Either the leader has quit the expedition or there is no longer the minimum number of members required to continue it.");
eim.unregisterPlayer(player);
end(eim);
}
else {
eim.dropMessage(5, "[Expedition] " + player.getName() + " has left the expedition.");
eim.unregisterPlayer(player);
}
}
}
function changedLeader(eim, leader) {}
function playerDead(eim, player) {
var count = eim.getIntProperty("fallenPlayers");
count = count + 1;
eim.setIntProperty("fallenPlayers", count);
if(count == 5) {
eim.dropMessage(5, "[Expedition] Too many players have fallen, Pink Bean is now deemed undefeatable; the expedition is over.");
end(eim);
} else if(count == 4) {
eim.dropMessage(5, "[Expedition] Pink Bean is growing stronger than ever, last stand mode everyone!");
} else if(count == 3) {
eim.dropMessage(5, "[Expedition] Casualty count is starting to get out of control. Battle with care.");
}
}
function playerRevive(eim, player) {
return true;
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.dropMessage(5, "[Expedition] Either the leader has quit the expedition or there is no longer the minimum number of members required to continue it.");
eim.unregisterPlayer(player);
end(eim);
}
else {
eim.dropMessage(5, "[Expedition] " + player.getName() + " has left the expedition.");
eim.unregisterPlayer(player);
}
}
function leftParty (eim, player) {}
function disbandParty (eim) {}
function monsterValue(eim, mobId) {
return 1;
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function end(eim) {
var party = eim.getPlayers();
for (var i = 0; i < party.size(); i++) {
playerExit(eim, party.get(i));
}
eim.dispose();
}
function giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isPinkBean(mob) {
var mobid = mob.getId();
return (mobid == 8820001);
}
function isJrBoss(mob) {
var mobid = mob.getId();
return (mobid >= 8820002 && mobid <= 8820006);
}
function noJrBossesLeft(map) {
return map.countMonster(8820002, 8820006) == 0;
}
function spawnJrBoss(mobObj, gotKilled) {
if(gotKilled) {
spawnid = mobObj.getId() + 17;
} else {
mobObj.getMap().killMonster(mobObj.getId());
spawnid = mobObj.getId() - 17;
}
var mob = MapleLifeFactory.getMonster(spawnid);
mobObj.getMap().spawnMonsterOnGroundBelow(mob, mobObj.getPosition());
}
function monsterKilled(mob, eim) {
if(isPinkBean(mob)) {
eim.setIntProperty("defeatedBoss", 1);
eim.showClearEffect(mob.getMap().getId());
mob.getMap().killAllMonsters();
eim.clearPQ();
var ch = eim.getIntProperty("channel");
mob.getMap().broadcastPinkBeanVictory(ch);
} else if(isJrBoss(mob)) {
if(noJrBossesLeft(mob.getMap())) {
var stage = eim.getIntProperty("stage");
if(stage == 5) {
var iid = 4001193;
var itemObj = new Item(iid, 0, 1);
var mapObj = eim.getMapFactory().getMap(270050100);
var reactObj = mapObj.getReactorById(2708000);
var dropper = eim.getPlayers().get(0);
mapObj.spawnItemDrop(dropper, dropper, itemObj, reactObj.getPosition(), true, true);
eim.dropMessage(6, "With the last of its guardians fallen, Pink Bean loses its invulnerability. The real fight starts now!");
} else {
stage++;
eim.setIntProperty("stage", stage);
eim.dropMessage(5, "The next wave will start within 15 seconds, prepare yourselves.");
eim.schedule("startWave", 15 * 1000);
}
}
}
}
function startWave(eim) {
var mapObj = eim.getMapInstance(270050100);
var stage = eim.getProperty("stage");
for(var i = 1; i <= stage; i++) {
spawnJrBoss(mapObj.getMonsterById(8820019 + (i % 5)), false);
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}