Neo City + Revamped EllinPQ + New Release

Fixed Neo City area, now playable.
Overhauled the EllinPQ mechanics, such as the "CLEAR" effect when passing maps, and some bug fixes along the way.
Refactored a lot of out-of-place classes and properly renamed a few others through the project.
Updated readme and licenses through the source, preparing the stage for the new release.
This commit is contained in:
ronancpl
2017-11-29 00:57:50 -02:00
parent 46924812b0
commit 85a81b9bf9
163 changed files with 17125 additions and 14961 deletions

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
@@ -51,7 +52,7 @@ function action(mode, type, selection) {
function generateSelectionMenu(array) { // nice tool for generating a string for the sendSimple functionality
var menu = "";
for (var i = 0; i < array.length; i++) {
menu += "#L" + i + "#" + array[i] + "l\r\n";
menu += "#L" + i + "#" + array[i] + "#l\r\n";
}
return menu;
}

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -74,6 +74,8 @@ function setup(level, lobbyid) {
var eim = em.newInstance("Ellin" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("statusStg4", 0);
eim.getInstanceMap(930000000).resetPQ(level);
eim.getInstanceMap(930000100).resetPQ(level);
eim.getInstanceMap(930000200).resetPQ(level);
@@ -179,11 +181,27 @@ function end(eim) {
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
eim.warpEventTeam(930000800);
}
function monsterKilled(mob, eim) {}
function isPoisonGolem(mob) {
var mobid = mob.getId();
return (mobid == 9300182);
}
function monsterKilled(mob, eim, hasKiller) {
var map = mob.getMap();
if(isPoisonGolem(mob)) {
eim.showClearEffect(map.getId());
eim.clearPQ();
} else if(map.countMonsters() == 0) {
var stage = ((map.getId() % 1000) / 100);
if(stage == 1 || (stage == 4 && !hasKiller)) {
eim.showClearEffect(map.getId());
}
}
}
function allMonstersDead(eim) {}

View File

@@ -0,0 +1,98 @@
var minPlayers = 1;
var timeLimit = 15; //15 minutes
var eventTimer = 1000 * 60 * timeLimit;
var exitMap = 240070000;
var eventMap = 240070010;
function init(){}
function setup(difficulty, lobbyId){
var eim = em.newInstance("Nex_" + lobbyId);
eim.setIntProperty("nex", lobbyId);
eim.getInstanceMap(eventMap + 10 * lobbyId).resetFully();
eim.getInstanceMap(eventMap + 10 * lobbyId).allowSummonState(false);
respawn(eim);
eim.startEventTimer(eventTimer);
return eim;
}
function afterSetup(eim){}
function respawn(eim){}
function playerEntry(eim, player){
var cave = eim.getMapInstance(eventMap + 10 * eim.getIntProperty("nex"));
player.changeMap(cave);
}
function scheduledTimeout(eim){
var party = eim.getPlayers();
for(var i = 0; i < party.size(); i++)
playerExit(eim, party.get(i));
eim.dispose();
}
function playerRevive(eim, player){
player.setHp(50);
player.setStance(0);
eim.unregisterPlayer(player);
player.changeMap(exitMap);
return false;
}
function playerDead(eim, player){}
function playerDisconnected(eim, player){
var party = eim.getPlayers();
for(var i = 0; i < party.size(); i++){
if(party.get(i).equals(player))
removePlayer(eim, player);
else
playerExit(eim, party.get(i));
}
eim.dispose();
}
function monsterValue(eim, mobId){
return -1;
}
function leftParty(eim, player){}
function disbandParty(eim){}
function playerUnregistered(eim, player){}
function playerExit(eim, player){
eim.unregisterPlayer(player);
player.changeMap(exitMap);
}
function changedMap(eim, player, mapId){
if(mapId != (eventMap + 10 * eim.getIntProperty("nex"))){
removePlayer(eim, player);
eim.stopEventTimer();
eim.setEventCleared();
eim.dispose();
}
}
function removePlayer(eim, player){
eim.unregisterPlayer(player);
player.getMap().removePlayer(player);
player.setMap(exitMap);
}
function cancelSchedule(){}
function dispose(){}
function clearPQ(eim){}
function monsterKilled(mob, eim){}
function allMonstersDead(eim){}

210
scripts/event/TD_Battle1.js Normal file
View File

@@ -0,0 +1,210 @@
/**
* @author: Ronan
* @event: Vs Bergamot
*/
var isPq = true;
var minPlayers = 2, maxPlayers = 6;
var minLevel = 70, maxLevel = 255;
var entryMap = 240070203;
var exitMap = 240070202;
var recruitMap = 240070202;
var clearMap = 240070202;
var minMapId = 240070203;
var maxMapId = 240070203;
var tdBossId = 7220005;
var eventTime = 10; // 10 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;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
}
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, lobbyid) {
var eim = em.newInstance("TDBoss" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(240070203).resetPQ(level);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(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 giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isTDBoss(mob) {
var mobid = mob.getId();
return mobid == tdBossId;
}
function monsterKilled(mob, eim) {
if(isTDBoss(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}

210
scripts/event/TD_Battle2.js Normal file
View File

@@ -0,0 +1,210 @@
/**
* @author: Ronan
* @event: Vs Dunas
*/
var isPq = true;
var minPlayers = 2, maxPlayers = 6;
var minLevel = 70, maxLevel = 255;
var entryMap = 240070303;
var exitMap = 240070302;
var recruitMap = 240070302;
var clearMap = 240070302;
var minMapId = 240070303;
var maxMapId = 240070303;
var tdBossId = 8220010;
var eventTime = 10; // 10 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;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
}
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, lobbyid) {
var eim = em.newInstance("TDBoss" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(240070203).resetPQ(level);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(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 giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isTDBoss(mob) {
var mobid = mob.getId();
return mobid == tdBossId;
}
function monsterKilled(mob, eim) {
if(isTDBoss(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}

210
scripts/event/TD_Battle3.js Normal file
View File

@@ -0,0 +1,210 @@
/**
* @author: Ronan
* @event: Vs Aufheben
*/
var isPq = true;
var minPlayers = 2, maxPlayers = 6;
var minLevel = 70, maxLevel = 255;
var entryMap = 240070403;
var exitMap = 240070402;
var recruitMap = 240070402;
var clearMap = 240070402;
var minMapId = 240070403;
var maxMapId = 240070403;
var tdBossId = 8220011;
var eventTime = 15; // 15 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;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
}
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, lobbyid) {
var eim = em.newInstance("TDBoss" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(240070203).resetPQ(level);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(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 giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isTDBoss(mob) {
var mobid = mob.getId();
return mobid == tdBossId;
}
function monsterKilled(mob, eim) {
if(isTDBoss(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}

210
scripts/event/TD_Battle4.js Normal file
View File

@@ -0,0 +1,210 @@
/**
* @author: Ronan
* @event: Vs Oberon
*/
var isPq = true;
var minPlayers = 2, maxPlayers = 6;
var minLevel = 70, maxLevel = 255;
var entryMap = 240070503;
var exitMap = 240070502;
var recruitMap = 240070502;
var clearMap = 240070502;
var minMapId = 240070503;
var maxMapId = 240070503;
var tdBossId = 8220012;
var eventTime = 15; // 15 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;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
}
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, lobbyid) {
var eim = em.newInstance("TDBoss" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(240070203).resetPQ(level);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(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 giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isTDBoss(mob) {
var mobid = mob.getId();
return mobid == tdBossId;
}
function monsterKilled(mob, eim) {
if(isTDBoss(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}

210
scripts/event/TD_Battle5.js Normal file
View File

@@ -0,0 +1,210 @@
/**
* @author: Ronan
* @event: Vs Nibelung
*/
var isPq = true;
var minPlayers = 2, maxPlayers = 6;
var minLevel = 70, maxLevel = 255;
var entryMap = 240070603;
var exitMap = 240070602;
var recruitMap = 240070602;
var clearMap = 240070602;
var minMapId = 240070603;
var maxMapId = 240070603;
var tdBossId = 8220015;
var eventTime = 20; // 20 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;
evLevel = 1; //Rewards at clear PQ
itemSet = [];
itemQty = [];
eim.setEventRewards(evLevel, itemSet, itemQty);
expStages = []; //bonus exp given on CLEAR stage signal
eim.setEventClearStageExp(expStages);
}
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, lobbyid) {
var eim = em.newInstance("TDBoss" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(240070203).resetPQ(level);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {}
function playerEntry(eim, player) {
var map = eim.getMapInstance(entryMap);
player.changeMap(map, map.getPortal(0));
}
function scheduledTimeout(eim) {
end(eim);
}
function playerUnregistered(eim, player) {}
function playerExit(eim, player) {
eim.unregisterPlayer(player);
player.changeMap(exitMap, 0);
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
else
eim.unregisterPlayer(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 giveRandomEventReward(eim, player) {
eim.giveEventReward(player);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
}
function isTDBoss(mob) {
var mobid = mob.getId();
return mobid == tdBossId;
}
function monsterKilled(mob, eim) {
if(isTDBoss(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

49
scripts/npc/2082004.js Normal file
View File

@@ -0,0 +1,49 @@
/*
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Andy
Tera Forest Time Gate
*/
var status;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && type > 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
cm.sendOk("Hi, I am Andy, the time traveler from a not so distant future. I have come to avert the creation of machines by the greedy people of this time. They went berserk on my time and consumed everything to dust. I must stop it at any cost!");
cm.dispose();
}
}
}

95
scripts/npc/2083006.js Normal file
View File

@@ -0,0 +1,95 @@
/*
@Author Ronan
(Neo Tokyo Teleporter)
*/
var quests = [3719, 3724, 3730, 3736, 3742, 3748];
var array = ["Year 2021 - Average Town Entrance", "Year 2099 - Midnight Harbor Entrance", "Year 2215 - Bombed City Center Retail District", "Year 2216 - Ruined City Intersection", "Year 2230 - Dangerous Tower Lobby", "Year 2503 - Air Battleship Bow"/*, "Year 2227 - Dangerous City Intersection"*/];
var limit;
function start() {
if(!cm.isQuestCompleted(3718)) {
cm.sendOk("The time machine has not been activated yet.");
cm.dispose();
return;
}
for(limit = 0; limit < quests.length; limit++) {
if(!cm.isQuestCompleted(quests[limit])) {
break;
}
}
if(limit == 0) {
cm.sendOk("Prove your valor against the #bGuardian Nex#k before unlocking next Neo City maps.");
cm.dispose();
return;
}
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && type > 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
var menuSel = generateSelectionMenu(array, limit);
cm.sendSimple(menuSel);
} else if(status == 1) {
var mapid = 0;
switch (selection) {
case 0:
mapid = 240070100;
break;
case 1:
mapid = 240070200;
break;
case 2:
mapid = 240070300;
break;
case 3:
mapid = 240070400;
break;
case 4:
mapid = 240070500;
break;
case 5:
mapid = 240070600;
break;
/*case 6:
mapid = 683070400;
break;*/
}
if (mapid > 0) {
cm.warp(mapid, 1);
} else {
cm.sendOk("Complete your mission first.");
}
}
}
}
function generateSelectionMenu(array, limit) { // nice tool for generating a string for the sendSimple functionality
var menu = "";
var len = Math.min(limit, array.length);
for (var i = 0; i < len; i++) {
menu += "#L" + i + "#" + array[i] + "#l\r\n";
}
return menu;
}

View File

@@ -1,50 +1,130 @@
var status = -1;
/**
* @author: Ronan
* @npc: Ellin
* @map: Ellin PQ
* @func: Ellin PQ Coordinator
*/
var status = 0;
var mapid;
function start() {
action(1,0,0);
mapid = cm.getPlayer().getMapId();
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
status--;
}
switch(cm.getPlayer().getMapId()) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
var ellinStr = ellinMapMessage(mapid);
if(mapid == 930000000) {
cm.sendNext(ellinStr);
} else if(mapid == 930000300) {
var eim = cm.getEventInstance();
if(eim.getIntProperty("statusStg4") == 0) {
eim.showClearEffect(cm.getMap().getId());
eim.setIntProperty("statusStg4", 1);
}
cm.sendNext(ellinStr);
} else if(mapid == 930000400) {
if (cm.haveItem(4001169, 20)) {
if(cm.isEventLeader()) {
cm.sendNext("Oh you have brought them! We can now continue, shall we proceed?");
} else {
cm.sendOk("You have brought them, but you're not the leader! Please let the leader hand me the marbles...");
cm.dispose();
return;
}
} else {
if(cm.getEventInstance().gridCheck(cm.getPlayer()) != 1) {
cm.sendNext(ellinStr);
cm.getEventInstance().gridInsert(cm.getPlayer(), 1);
status = -1;
} else {
var mobs = cm.getMap().countMonsters();
if(mobs > 0) {
if (!cm.haveItem(2270004)) {
if(cm.canHold(2270004, 10)) {
cm.gainItem(2270004, 10);
cm.sendOk("Take 10 #t2270004#. First, #rweaken the #o9300174##k and, once it gets low health, use the item I gave you to capture them.");
cm.dispose();
return;
} else {
cm.sendOk("Please make space on your USE inventory before receiving the purifiers!");
cm.dispose();
return;
}
} else {
cm.sendYesNo(ellinStr + "\r\n\r\nIt may be you are #rwilling to quit#k? Please double-think it, maybe your partners are still trying this instance.");
}
} else {
cm.sendYesNo("You guys caught all the #o9300174#. Let the party leader hand all #b20 #t4001169##k to me to proceed." + "\r\n\r\nIt may be you are #rwilling to quit#k? Please double-think it, maybe your partners are still trying this instance.");
}
}
}
} else {
cm.sendYesNo(ellinStr + "\r\n\r\nIt may be you are #rwilling to quit#k? Please double-think it, maybe your partners are still trying this instance.");
}
} else if(status == 1) {
if(mapid == 930000000) {
} else if(mapid == 930000300) {
cm.getEventInstance().warpEventTeam(930000400);
} else if(mapid == 930000400) {
if(cm.haveItem(4001169, 20) && cm.isEventLeader()) {
cm.gainItem(4001169, -20);
cm.getEventInstance().warpEventTeam(930000500);
} else {
cm.warp(930000800);
}
} else {
cm.warp(930000800);
}
cm.dispose();
}
}
}
function ellinMapMessage(mapid) {
switch(mapid) {
case 930000000:
cm.sendNext("Welcome. Please enter the portal.");
break;
return "Welcome to the Forest of Poison Haze. Proceed by entering the portal.";
case 930000100:
cm.sendNext("We have to eliminate all these contaminated monsters!");
break;
return "The #b#o9300172##k have taken the area. We have to eliminate all these contaminated monsters to proceed further.";
case 930000200:
cm.sendNext("We have to eliminate all these contaminated reactors!");
break;
return "A great spine has blocked the way ahead. To remove this barrier we must retrieve the poison the #b#o9300173##k carries to deter the overgrown spine. However, the poison in natural state can't be handled, as it is way too concentrated. Use the #bfountain#k over there to dilute it.";
case 930000300:
cm.getEventInstance().warpEventTeam(930000400);
break;
return "Oh great, you have reached me. We can now proceed further inside the forest.";
case 930000400:
if (cm.haveItem(4001169,20)) {
cm.getEventInstance().warpEventTeam(930000500);
cm.gainItem(4001169,-20);
} else if (!cm.haveItem(2270004)) {
if(cm.canHold(2270004,10)) {
cm.gainItem(2270004,10);
cm.sendOk("Good luck in purifying these monsters!");
}
else {
cm.sendOk("Make space on your USE inventory before receiving the purifiers!");
}
} else {
cm.sendOk("We have to purify all these contaminated monsters! Get me 20 Monster Marbles from them!");
}
break;
return "The #b#o9300175##k took over this area. However they are not ordinary monsters, then regrow pretty fast, #rnormal weapon and magic does no harm to it#k at all. We have to purify all these contaminated monsters, using #b#t2270004##k! Let your group leader get me 20 Monster Marbles from them.";
case 930000600:
cm.sendNext("This is it! Place the Magic Stone on the Altar!");
break;
return "The root of all problems of the forest! Place the obtained Magic Stone on the Altar and prepare yourselves!";
case 930000700:
cm.warp(930000800,0);
break;
return "This is it, you guys did it! Thank you so much for purifying the forest!!";
}
cm.dispose();
}

View File

@@ -14,12 +14,12 @@ function action(mode, type, selection) {
status--;
}
if (status == 0) {
cm.sendYesNo("Would you like to get out?");
cm.sendYesNo("Would you like to exit this instance? Your party members may have to abandon it as well, so take that in mind.");
} else if (status == 1) {
cm.removeAll(4001163);
cm.removeAll(4001169);
cm.removeAll(2270004);
cm.warp(930000800,0);
cm.warp(930000800);
cm.dispose();
}
}

View File

@@ -5,19 +5,32 @@ function start() {
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
status--;
}
switch(cm.getPlayer().getMapId()) {
case 930000500:
if (!cm.haveItem(4001163)) {
cm.sendNext("Get me the Purple Stone of Magic from here.");
} else {
cm.getEventInstance().warpEventTeam(930000600);
}
break;
}
cm.dispose();
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && type > 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0) {
if(!cm.haveItem(4001163) || !cm.isEventLeader()) {
cm.sendYesNo("Let your party leader show me the Purple Stone of Magic from here.\r\n\r\nOr maybe you want to #rleave this forest#k? Leaving now means to abandon your partners here, take that in mind.");
} else {
cm.sendNext("Great, you have the Purple Stone of Magic. I shall show you guys #bthe path leading to the Stone Altar#k. Come this way.");
}
} else if(status == 1) {
if (!cm.haveItem(4001163)) {
cm.warp(930000800);
} else {
cm.getEventInstance().warpEventTeam(930000600);
}
cm.dispose();
}
}
}

View File

@@ -0,0 +1,32 @@
/* @author RonanLana */
function enter(pi) {
var stage = ((Math.floor(pi.getMapId() / 100)) % 10) - 1;
var em = pi.getEventManager("TD_Battle" + stage);
if(em == null) {
pi.playerMessage(5, "TD Battle " + stage + " encountered an unexpected error and is currently unavailable.");
return false;
}
if (pi.getParty() == null) {
pi.playerMessage(5, "You are currently not in a party, create one to attempt the boss.");
return false;
} else if(!pi.isLeader()) {
pi.playerMessage(5, "Your party leader must enter the portal to start the battle.");
return false;
} else {
var eli = em.getEligibleParty(pi.getParty());
if(eli.size() > 0) {
if(!em.startInstance(pi.getParty(), pi.getPlayer().getMap(), 1)) {
pi.playerMessage(5, "The battle against the boss has already begun, so you may not enter this place.");
return false;
}
}
else {
pi.playerMessage(5, "Your party must consist of at least 2 players to attempt the boss.");
return false;
}
return true;
}
}

View File

@@ -0,0 +1,4 @@
function enter(pi) {
pi.openNpc(2083006);
return false;
}

View File

@@ -0,0 +1,28 @@
function enter(pi) {
var nex = pi.getEventManager("GuardianNex");
if(nex == null) {
pi.message("Guardian Nex event encontered an error and is unavailable.");
return false;
}
var quests = [3719, 3724, 3730, 3736, 3742, 3748];
var mobs = [7120100, 7120101, 7120102, 8120100, 8120101, 8140510];
for(var i = 0; i < quests.length; i++) {
if (pi.isQuestActive(quests[i])) {
if(pi.getQuestProgress(quests[i], mobs[i]) != 0) {
pi.message("You already faced Nex. Complete your mission.");
return false;
}
if(!nex.startInstance(i, pi.getPlayer())) {
pi.message("Someone is already challenging Nex. Wait for them to finish before you enter.");
return false;
} else {
return true;
}
}
}
return false;
}

View File

@@ -1,15 +1,14 @@
function enter(pi) {
if ((pi.getMap().getMonsters().size() == 0 || pi.getMap().getMonsterById(9300183) != null) && (pi.getMap().getReactorByName("") == null || pi.getMap().getReactorByName("").getState() == 1)) {
var eim = pi.getEventInstance();
if (eim.isEventCleared()) {
if(pi.isEventLeader()) {
pi.getEventInstance().clearPQ();
eim.warpEventTeam(930000800);
return true;
}
else {
} 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;

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -1,5 +1,6 @@
/*
This file is part of the MapleSolaxiaV2 Maple Story Server
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
Copyleft (L) 2017 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as

View File

@@ -0,0 +1,30 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* @Author Ronan
*
* Neo City Trash Can
*/
function hit(){
rm.dropItems(true, 2, 5, 10, 1);
}

View File

@@ -0,0 +1,30 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* @Author Ronan
*
* Neo City Trash Can
*/
function hit(){
rm.dropItems(true, 2, 5, 10, 1);
}

View File

@@ -1,3 +1,4 @@
function act() {
rm.getEventInstance().showClearEffect(rm.getMap().getId());
rm.dropItems();
}

View File

@@ -0,0 +1,12 @@
/**
* @author: Ronan
* @reactor: Spine
* @map: 930000200 - Forest of Poison Haze - Deteriorated Forest
* @func: Water Fountain
*/
function act() {
if(rm.getReactor().getState() == 4) {
rm.getEventInstance().showClearEffect(rm.getMap().getId());
}
}