Quest Item Restore + Packets w/ Timezone + Item/Exp-dec Field Limits

Fixed leaders being able to create expeditions even though the already passed the day limit.
Fixed overflow case in calculated max value of skills.
Implemented item expiration from DB after the due date.
Refactored item flags using byte-length instead of short.
Added FieldLimit checks for disappearing item drops and no EXP deduction in limited areas.
Added "Quest Item Restore" functionality.
Implemented item flag auto-instantiation when generating items.
Added gate state update in Papulatus lobby area.
Fixed a recent issue regarding bounding box calculation of AoE player skills.
Implemented minidungeon close, to occur as soon as the party leader leaves the area.
Refactored HenesysPQ attributed out of the MapleMap object, now they should be available from the respective event script.
Fixed friendly mobs not dropping item periodically, a recent issue after tweaking the loot system.
Fixed Papulatus expedition closing after the exped leader leaves or a minimum of player required to start is no longer there.
Fixed several expeditions closing after performing party operations, such as "change party leader".
Reviewed expected max damage calculation for summons, which would not work properly in several occasions.
Normalized timezone from packets sent to client, now using the same timezone defined from the server flags.
Fixed certain scenarios in CPQ that would happen within the stage between the "challenge accepted" and ingress in the battlefield.
Revised credits script.
Added GM checks in the autoban method.
This commit is contained in:
ronancpl
2019-07-15 20:22:39 -03:00
parent 0228d4e176
commit ab5cec7f33
73 changed files with 1200 additions and 393 deletions

View File

@@ -179,12 +179,7 @@ function changedMap(eim, player, mapid) {
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function changedLeader(eim, leader) {}
function playerDead(eim, player) {}
@@ -206,19 +201,9 @@ function playerDisconnected(eim, player) {
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isExpeditionTeamLackingNow(false, minPlayers, player)) {
end(eim);
}
else
playerLeft(eim, player);
}
function leftParty(eim, player) {}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
end(eim);
}
}
function disbandParty(eim) {}
function monsterValue(eim, mobId) {
return 1;

View File

@@ -179,12 +179,7 @@ function changedMap(eim, player, mapid) {
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function changedLeader(eim, leader) {}
function playerDead(eim, player) {}
@@ -206,19 +201,9 @@ function playerDisconnected(eim, player) {
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isExpeditionTeamLackingNow(false, minPlayers, player)) {
end(eim);
}
else
playerLeft(eim, player);
}
function leftParty(eim, player) {}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
end(eim);
}
}
function disbandParty(eim) {}
function monsterValue(eim, mobId) {
return 1;

View File

@@ -105,6 +105,8 @@ function setup(level, lobbyid) {
var eim = em.newInstance("Henesys" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("stage", "0");
eim.setProperty("bunnyCake", "0");
eim.setProperty("bunnyDamage", "0");
eim.getInstanceMap(910010000).resetPQ(level);
eim.getInstanceMap(910010000).allowSummonState(false);
@@ -243,6 +245,25 @@ function friendlyKilled(mob, eim) {
}
}
function friendlyItemDrop(eim, mob) {
if (mob.getId() == 9300061) {
var cakes = eim.getIntProperty("bunnyCake") + 1;
eim.setIntProperty("bunnyCake", cakes);
mob.getMap().broadcastMessage(Packages.tools.MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + cakes + "."));
}
}
function friendlyDamaged(eim, mob) {
if (mob.getId() == 9300061) {
var bunnyDamage = eim.getIntProperty("bunnyDamaged") + 1;
if (bunnyDamage > 5) {
broadcastMessage(Packages.tools.MaplePacketCreator.serverNotice(6, "The Moon Bunny is feeling sick. Please protect it so it can make delicious rice cakes."));
eim.setIntProperty("bunnyDamaged", 0);
}
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}

View File

@@ -115,7 +115,9 @@ function setup(level, lobbyid) {
return eim;
}
function afterSetup(eim) {}
function afterSetup(eim) {
updateGateState(1);
}
function respawnStages(eim) {}
@@ -143,7 +145,7 @@ function playerLeft(eim, player) {
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
@@ -152,17 +154,12 @@ function changedMap(eim, player, mapid) {
}
}
function changedLeader(eim, leader) {
var mapid = leader.getMapId();
if (!eim.isEventCleared() && (mapid < minMapId || mapid > maxMapId)) {
end(eim);
}
}
function changedLeader(eim, leader) {}
function playerDead(eim, player) {}
function playerRevive(eim, player) { // player presses ok on the death pop up.
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
@@ -171,7 +168,7 @@ function playerRevive(eim, player) { // player presses ok on the death pop up.
}
function playerDisconnected(eim, player) {
if (eim.isEventTeamLackingNow(true, minPlayers, player)) {
if (eim.isExpeditionTeamLackingNow(true, minPlayers, player)) {
eim.unregisterPlayer(player);
end(eim);
}
@@ -179,19 +176,9 @@ function playerDisconnected(eim, player) {
eim.unregisterPlayer(player);
}
function leftParty(eim, player) {
if (eim.isEventTeamLackingNow(false, minPlayers, player)) {
end(eim);
}
else
playerLeft(eim, player);
}
function leftParty(eim, player) {}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
end(eim);
}
}
function disbandParty(eim) {}
function monsterValue(eim, mobId) {
return 1;
@@ -213,6 +200,7 @@ function giveRandomEventReward(eim, player) {
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
updateGateState(0);
}
function isPapulatus(mob) {
@@ -231,5 +219,14 @@ function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}
function updateGateState(newState) { // thanks Conrad for noticing missing gate update
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208001).forceHitReactor(newState);
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208002).forceHitReactor(newState);
em.getChannelServer().getMapFactory().getMap(220080000).getReactorById(2208003).forceHitReactor(newState);
}
function dispose(eim) {
if (!eim.isEventCleared()) {
updateGateState(0);
}
}

View File

@@ -86,7 +86,7 @@ function setEventRewards(eim) {
}
function afterSetup(eim) {
em.getChannelServer().getMapFactory().getMap(211042300).getReactorById(2118002).forceHitReactor(1);
updateGateState(1);
}
function setup(channel) {
@@ -190,7 +190,7 @@ function giveRandomEventReward(eim, player) {
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
em.getChannelServer().getMapFactory().getMap(211042300).getReactorById(2118002).forceHitReactor(0);
updateGateState(0);
}
function isZakum(mob) {
@@ -212,8 +212,12 @@ function allMonstersDead(eim) {}
function cancelSchedule() {}
function updateGateState(newState) { // thanks Conrad for noticing missing gate update
em.getChannelServer().getMapFactory().getMap(211042300).getReactorById(2118002).forceHitReactor(newState);
}
function dispose(eim) {
if (!eim.isEventCleared()) {
em.getChannelServer().getMapFactory().getMap(211042300).getReactorById(2118002).forceHitReactor(0);
updateGateState(0);
}
}

View File

@@ -65,8 +65,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l\r\n\#L3#I would like to see info about this expedition...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -99,8 +104,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -66,8 +66,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) { // thanks Conrad for noticing exped leaders being able to still manage in-progress expeds
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -106,8 +111,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -32,12 +32,19 @@ function start() {
cm.sendOk("Thanks for saving the pork.");
}
else if(cm.isQuestStarted(6002)) {
var em = cm.getEventManager("3rdJob_mount");
if (em == null)
cm.sendOk("Sorry, but 3rd job advancement (mount) is closed.");
else {
if (!em.startInstance(cm.getPlayer())) {
cm.sendOk("There is currently someone in this map, come back later.");
if (cm.haveItem(4031507, 5) && cm.haveItem(4031508,5)) {
cm.sendOk("Thanks for saving the pork.");
} else {
var em = cm.getEventManager("3rdJob_mount");
if (em == null)
cm.sendOk("Sorry, but 3rd job advancement (mount) is closed.");
else {
if (em.startInstance(cm.getPlayer())) {
cm.removeAll(4031507);
cm.removeAll(4031508);
} else {
cm.sendOk("There is currently someone in this map, come back later.");
}
}
}
}

View File

@@ -64,8 +64,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -98,8 +103,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -134,9 +134,12 @@ function enterArena(arenaPlayers) {
return;
} else if (expedicao == null) {
if (arenaPlayers != -1) {
if (cm.createExpedition(exped, true, 0, arenaPlayers)) {
var res = cm.createExpedition(exped, true, 0, arenaPlayers);
if (res == 0) {
cm.warp(map, 0);
cm.getPlayer().dropMessage("Your arena was created successfully. Wait for people to join the battle.");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -67,8 +67,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -101,8 +106,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -20,9 +20,12 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
var status = -1;
var completed;
function start() {
if (cm.haveItem(4031508, 5) && cm.haveItem(4031507,5)) {
completed = cm.haveItem(4031508, 5) && cm.haveItem(4031507,5);
if (completed) {
cm.sendNext("Wow~ You have succeeded in collecting 5 of each #b#t4031508##k and #b#t4031507##k. Okay then, I will send you to Zoo. Please talk to me again when you get there.");
} else {
cm.sendYesNo("You haven't completed the requirements. Are you sure you want to leave?");
@@ -36,9 +39,15 @@ function action(mode, type, selection){
return;
}
if(status == 0) cm.sendOk("Well okay, I will send you back.");
else {
cm.getEventInstance().clearPQ();
if(status == 0) {
cm.sendOk("Well okay, I will send you back.");
} else {
if (completed) {
cm.getEventInstance().clearPQ();
} else {
cm.warp(923010100);
}
cm.dispose();
}
}

View File

@@ -65,8 +65,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -105,8 +110,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -61,8 +61,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Party Quest: Crimsonwood Keep>\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to attempt the #rCrimsonwood Keep Party Quest#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -89,8 +94,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(cwkpq)) {
var res = cm.createExpedition(cwkpq);
if (res == 0) {
cm.sendOk("The #rCrimsonwood Keep Party Quest Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -66,8 +66,13 @@ function action(mode, type, selection) {
cm.sendSimple("#e#b<Expedition: " + expedName + ">\r\n#k#n" + em.getProperty("party") + "\r\n\r\nWould you like to assemble a team to take on #r" + expedBoss + "#k?\r\n#b#L1#Lets get this going!#l\r\n\#L2#No, I think I'll wait a bit...#l");
status = 1;
} else if (expedition.isLeader(player)) { //If you're the leader, manage the exped
cm.sendSimple(list);
status = 2;
if (expedition.isInProgress()) {
cm.sendOk("Your expedition is already in progress, for those who remain battling lets pray for those brave souls.");
cm.dispose();
} else {
cm.sendSimple(list);
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 it.");
@@ -106,8 +111,11 @@ function action(mode, type, selection) {
return;
}
if (cm.createExpedition(exped)) {
var res = cm.createExpedition(exped);
if (res == 0) {
cm.sendOk("The #r" + expedBoss + " Expedition#k has been created.\r\n\r\nTalk to me again to view the current team, or start the fight!");
} else if (res > 0) {
cm.sendOk("Sorry, you've already reached the quota of attempts for this expedition! Try again another day...");
} else {
cm.sendOk("An unexpected error has occurred when starting the expedition, please try again later.");
}

View File

@@ -40,6 +40,12 @@ var facenew = Array();
var colors = Array();
var price = 100000;
function pushIfItemExists(array, itemid) {
if ((itemid = cm.getCosmeticItem(itemid)) != -1 && !cm.isCosmeticEquipped(itemid)) { // thanks Conrad for noticing NPC crashing the player when trying to display inexistent cosmetics
array.push(itemid);
}
}
function start() {
if(cm.getPlayer().gmLevel() < 1) {
cm.sendOk("Hey wassup?");
@@ -67,21 +73,21 @@ function action(mode, type, selection) {
cm.sendStyle("Pick one?", skin);
else if (selection == 1 || selection == 5) {
for each(var i in selection == 1 ? hair : fhair)
hairnew.push(i);
pushIfItemExists(hairnew, i);
cm.sendStyle("Pick one?", hairnew);
} else if (selection == 2) {
var baseHair = parseInt(cm.getPlayer().getHair() / 10) * 10;
for(var k = 0; k < 8; k++)
haircolor.push(baseHair + k);
pushIfItemExists(haircolor, baseHair + k);
cm.sendStyle("Pick one?", haircolor);
} else if (selection == 3 || selection == 6) {
for each(var j in selection == 3 ? face : fface)
facenew.push(j);
pushIfItemExists(facenew, j);
cm.sendStyle("Pick one?", facenew);
} else if (selection == 4) {
var baseFace = parseInt(cm.getPlayer().getFace() / 1000) * 1000 + parseInt(cm.getPlayer().getFace() % 100);
for(var i = 0; i < 9; i++)
colors.push(baseFace + (i*100));
pushIfItemExists(colors, baseFace + (i*100));
cm.sendStyle("Pick one?", colors);
}
} else {

View File

@@ -13,7 +13,7 @@ var name_cursor, role_cursor;
// new server names are to be appended at the start of the name stack, building up the chronology.
// make sure the server names are lexicograffically equivalent to their correspondent function.
var servers = ["HeavenMS", "MapleSolaxia", "MoopleDEV", "MetroMS", "BubblesDEV", "ThePackII", "OdinMS", "Contributors"];
var servers = ["HeavenMS", "MapleSolaxia", "MoopleDEV", "MetroMS", "BubblesDEV", "OdinMS", "Contributors"];
var servers_history = [];
function addPerson(name, role) {
@@ -41,7 +41,7 @@ function writeServerStaff_HeavenMS() {
addPerson("Masterrulax", "Contributor");
addPerson("MedicOP", "Adjunct Developer");
setHistory(2015, 2018);
setHistory(2015, 2019);
}
function writeServerStaff_MapleSolaxia() {
@@ -58,26 +58,28 @@ function writeServerStaff_MapleSolaxia() {
}
function writeServerStaff_MoopleDEV() {
addPerson("conan513", "Administrator");
addPerson("kevintjuh93", "Developer");
addPerson("hindie93", "Contributor");
addPerson("JuniarZ-", "Contributor");
setHistory(2010, 2012);
}
function writeServerStaff_MetroMS() {
addPerson("Moogra", "Developer");
addPerson("David!", "Developer");
addPerson("XxOsirisxX", "Contributor");
addPerson("Generic", "Contributor");
setHistory(2009, 2010);
}
function writeServerStaff_BubblesDEV() {
addPerson("Deagan", "Administrator");
addPerson("XxOsirisxX", "Developer");
setHistory(2009, 2009);
}
function writeServerStaff_ThePackII() {
addPerson("Hofer", "Developer");
addPerson("David!", "Developer");
addPerson("Moogra", "Developer");
setHistory(2008, 2009);
addPerson("XxOsirisxX", "Contributor");
addPerson("MrMysterious", "Contributor");
setHistory(2009, 2009);
}
function writeServerStaff_OdinMS() {
@@ -86,6 +88,7 @@ function writeServerStaff_OdinMS() {
addPerson("Patrick", "Developer");
addPerson("Matze", "Developer");
addPerson("Vimes", "Developer");
setHistory(2007, 2008);
}