Reactor drops & Looting & Mob HP overhaul + TreasurePQ

Modified coupon rates buff icon to not show up as expirable.
Reactor drops now also drops quest items at the border of the dropped items.
Added themed drop data for the Cake boss.
Reworked the Balrog expedition.
Added quest script for the Assassinate skill.
Fixed looting system blocking the killer's party from retrieving a loot until the FFA timeout.
Fixed a deadlock with the MapleMap class.
Refactored damage/heal contabilization on mobs.
Fixed issues with HT and status-based damage, providing weird issues with mob HP.
New PQ: TreasurePQ, for level 140+.
This commit is contained in:
ronancpl
2018-03-05 21:23:50 -03:00
parent f40a7fa2f8
commit bbd2debc08
78 changed files with 24220 additions and 21963 deletions
+3 -3
View File
@@ -22,13 +22,12 @@ Feature list:
PQs:
* HPQ/KPQ/LPQ/LMPQ/OPQ/EllinPQ/PiratePQ/MagatiaPQ/HorntailPQ/AmoriaPQ.
* HPQ/KPQ/LPQ/LMPQ/OPQ/EllinPQ/PiratePQ/MagatiaPQ/HorntailPQ/AmoriaPQ/TreasurePQ.
* CWKPQ as Expedition-based event.
* Expeditions: Scarga/Horntail/Showa/Zakum/Pinkbean.
* Expeditions: Scarga/Horntail/Showa/Balrog/Zakum/Pinkbean.
* GuildPQ 100% + Guild queue with multi-lobby systems available.
* Brand-new PQs: BossRushPQ, CafePQ.
* Mu Lung Dojo.
* BalrogPQ semi-functional.
* Capt. Latanica remade as an event (parties can now fight the boss).
Skills:
@@ -76,6 +75,7 @@ Monsters, Maps & Reactors:
* PQs, Taxis and other event-driven situations warps players at random spawnpoints, GMS-like.
* Some reactors (PQ bonus boxes) now sprays items on the map, instead of dropping everything at once.
* Updated Crimsonwood, World Tour, Nihal Desert and Neo City, enabling quest completion and game progression in these areas.
* Giant Cake (anniversary-themed boss) drops Maple equipments, Maple scrolls, summoning bags and many more interesting items.
PQ potentials:
+18 -2
View File
@@ -17,7 +17,7 @@ Inclui constante SCROLL_CHANCE_RATE: repete resultados na tentativa de scrolls.
Inclui constantes ADD_SLOTS_BY_LEVEL + ADD_RATES_BY_LEVEL: muda rates do gameplay de um personagem com a evolucao dele.
Alterei APs podendo aumentar ate 32767.
Corrigi alguns XMLs dos mapas de Omega Sector, tinham ordem dos portais invertidas.
AUTOBAN eh uma constante setavel do server agora.
AUTOBAN eh uma constante setável do server agora.
17 Julho 2015,
Adaptei todos os scripts de 2nd job adv. Nao testado ainda!
@@ -805,4 +805,20 @@ Novo comando: reach. Transporta o usuário do comando a um ponto próximo ao jog
20 Fevereiro 2018,
Corrigido skill Steal não agindo corretamente. Ratio de drops agora segue conformante ao determinado pelas chances de sair cada item (itens comuns cairão com mais frequência).
Modificado skill Steal para não dropar mais itens de PQ nem de quest.
Modificado skill Steal para não dropar mais itens de PQ nem de quest.
22 - 24 Fevereiro 2018,
Modificado atributo "time" dos buffs de rate cupons para ser não-expirável a curto prazo.
Melhorado drops de itens de reatores agora centralizando e não deixando "espaços vazios" (ocupados por itens de quest não-visíveis pelo jogador).
Corrigido portal mal-posicionado em Herb Town.
Adicionado drop data para Giant Cake.
Implementado expedição Balrog.
01 - 05 Março 2018,
Implementado missão da skill Assassinate.
Resolvido bug com jogador em party tendo que esperar um tempo antes de pegar loot.
Resolvido problemas com loots não diferenciando partyids de playerids, além de permitir exploits para ações de pickup dos jogadores e autoloot de pets.
Resolvido caso de deadlock no MapleMap (uso de broadcastMessage, que usa chrLock, após adquirido objectLock).
Refatorado dano/cura em mobs, agora encapsulando atomicamente as mudanças de HP. Resolvido também problemas de acesso concorrente quanto a isso.
Resolvido problemas com HT e danos de status poison, bagunçando as contabilizações de HP de vez em quando.
Nova PQ: TreasurePQ, level 140+, acessível via portal em NLC.
+1 -1
View File
@@ -2175,10 +2175,10 @@ etc
680100001 - Maple 7th Day Market - Maple 7th Day Market
680100002 - Maple 7th Day Market - Maple 7th Day Market
680100003 - Maple 7th Day Market - Maple 7th Day Market
674030300 - Treasure Dungeon - (no map name)
674030000 - Initiation - (no map name)
674030100 - Entrance to MV's Lair - (no map name)
674030200 - The Lair of MV - (no map name)
674030300 - Treasure Dungeon - (no map name)
910020000 - Hidden Street - Nest of a Baby Bird
910100000 - Hidden Street - The Cursed Forest
910100001 - Hidden Street - The Cursed Forest
+4 -4
View File
@@ -580,10 +580,10 @@
2040717 - Dark scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:30%, speed+3nIf failed, the item will be destroyed at a 50% rate.
2040718 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:65%, avoidability+2, accuracy+1
2040719 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:15%, avoidability+5, accuracy+3, speed+1
2040720 - Scroll for Jump for DEX - Improves jump on shoes.\nSuccess rate:65%, jump+2, DEX+1
2040721 - Scroll for Jump for DEX - Improves jump on shoes.\nSuccess rate:15%, jump+5, DEX+3, speed+1
2040722 - Scroll for Speed for DEX - Improves speed on shoes.\nSuccess rate:65%, speed+2
2040723 - Scroll for Speed for DEX - Improves speed on shoes.\nSuccess rate:15%, speed+3
2040720 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:65%, jump+2, DEX+1
2040721 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:15%, jump+5, DEX+3, speed+1
2040722 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:65%, speed+2
2040723 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:15%, speed+3
2040727 - Scroll for Spikes on Shoes 10% - Adds traction to the shoes, which prevents the shoes from slipping on slippery surface.\nSuccess rate:10%, Does not affect the number of upgrades available. The success rate of this scroll can be enhanced by Vega's Spell.
2040800 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate:100%, accurcacy +1
2040801 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate: 60%, accuracy+2, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell.
View File
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* REACTORID.js: sample text
*/
function act() {
}
+258
View File
@@ -0,0 +1,258 @@
/**
* @author: Ronan
* @event: Vs Balrog
*/
importPackage(Packages.server.life);
var isPq = true;
var minPlayers = 6, maxPlayers = 30;
var minLevel = 50, maxLevel = 255;
var entryMap = 105100300;
var exitMap = 105100100;
var recruitMap = 105100100;
var clearMap = 105100301;
var minMapId = 105100300;
var maxMapId = 105100301;
var minMobId = 8830000;
var maxMobId = 8830006;
var bossMobId = 8830003;
var eventTime = 60; // 60 minutes
var releaseClawTime = 1;
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("Balrog" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(105100300).resetPQ(level);
eim.getInstanceMap(105100301).resetPQ(level);
eim.schedule("releaseLeftClaw", releaseClawTime * 60000);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {
spawnBalrog(eim);
}
function respawnStages(eim) {}
function releaseLeftClaw(eim) {
eim.getInstanceMap(entryMap).killMonster(8830006);
}
function spawnBalrog(eim) {
var mapObj = eim.getInstanceMap(entryMap);
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830000), new Packages.java.awt.Point(412, 258));
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830002), new Packages.java.awt.Point(412, 258));
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830006), new Packages.java.awt.Point(412, 258));
}
function spawnSealedBalrog(eim) {
eim.getInstanceMap(entryMap).spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830003), new Packages.java.awt.Point(412, 258));
}
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 playerLeft(eim, player) {
if(!eim.isEventCleared()) {
playerExit(eim, player);
}
}
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)) {
end(eim);
}
else
playerLeft(eim, player);
}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
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 isUnsealedBalrog(mob) {
var balrogid = mob.getId() - 8830000;
return balrogid >= 0 && balrogid <= 2;
}
function isBalrogBody(mob) {
return mob.getId() == minMobId;
}
function monsterKilled(mob, eim) {
if(isUnsealedBalrog(mob)) {
var count = eim.getIntProperty("boss");
if(count == 2) {
eim.showClearEffect();
eim.clearPQ();
mob.getMap().broadcastBalrogVictory(eim.getLeader().getName());
} else {
eim.setIntProperty("boss", count + 1);
}
if(isBalrogBody(mob)) {
eim.schedule("spawnSealedBalrog", 10 * 1000);
}
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}
+258
View File
@@ -0,0 +1,258 @@
/**
* @author: Ronan
* @event: Vs Balrog
*/
importPackage(Packages.server.life);
var isPq = true;
var minPlayers = 3, maxPlayers = 30;
var minLevel = 50, maxLevel = 255;
var entryMap = 105100400;
var exitMap = 105100100;
var recruitMap = 105100100;
var clearMap = 105100401;
var minMapId = 105100400;
var maxMapId = 105100401;
var minMobId = 8830007;
var maxMobId = 8830013;
var bossMobId = 8830010;
var eventTime = 60; // 60 minutes
var releaseClawTime = 1;
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("Balrog" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("boss", "0");
eim.getInstanceMap(105100400).resetPQ(level);
eim.getInstanceMap(105100401).resetPQ(level);
eim.schedule("releaseLeftClaw", releaseClawTime * 60000);
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {
spawnBalrog(eim);
}
function respawnStages(eim) {}
function releaseLeftClaw(eim) {
eim.getInstanceMap(entryMap).killMonster(8830013);
}
function spawnBalrog(eim) {
var mapObj = eim.getInstanceMap(entryMap);
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830007), new Packages.java.awt.Point(412, 258));
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830009), new Packages.java.awt.Point(412, 258));
mapObj.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830013), new Packages.java.awt.Point(412, 258));
}
function spawnSealedBalrog(eim) {
eim.getInstanceMap(entryMap).spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8830010), new Packages.java.awt.Point(412, 258));
}
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 playerLeft(eim, player) {
if(!eim.isEventCleared()) {
playerExit(eim, player);
}
}
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)) {
end(eim);
}
else
playerLeft(eim, player);
}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
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 isUnsealedBalrog(mob) {
var balrogid = mob.getId() - 8830007;
return balrogid >= 0 && balrogid <= 2;
}
function isBalrogBody(mob) {
return mob.getId() == minMobId;
}
function monsterKilled(mob, eim) {
if(isUnsealedBalrog(mob)) {
var count = eim.getIntProperty("boss");
if(count == 2) {
eim.showClearEffect();
eim.clearPQ();
mob.getMap().broadcastBalrogVictory(eim.getLeader().getName());
} else {
eim.setIntProperty("boss", count + 1);
}
if(isBalrogBody(mob)) {
eim.schedule("spawnSealedBalrog", 10 * 1000);
}
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}
+225
View File
@@ -0,0 +1,225 @@
/**
* @author: Ronan
* @event: Treasure PQ
*/
var isPq = true;
var minPlayers = 4, maxPlayers = 6;
var minLevel = 140, maxLevel = 255;
var entryMap = 674030000;
var exitMap = 674030100;
var recruitMap = 674030100;
var clearMap = 674030300;
var minMapId = 674030000;
var maxMapId = 674030300;
var eventTime = 45; // 45 minutes
var bonusTime = 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 = [4032118];
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 = [60000, 100000]; //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("Treasure" + lobbyid);
eim.setProperty("level", level);
eim.setProperty("statusStg1", "0");
eim.getInstanceMap(674030000).shuffleReactors();
respawnStages(eim);
eim.startEventTimer(eventTime * 60000);
setEventRewards(eim);
setEventExclusives(eim);
return eim;
}
function afterSetup(eim) {}
function respawnStages(eim) {
eim.getMapInstance(674030000).instanceMapRespawn();
eim.schedule("respawnStages", 15 * 1000);
}
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 playerLeft(eim, player) {
if(!eim.isEventCleared()) {
playerExit(eim, player);
}
}
function changedMap(eim, player, mapid) {
if (mapid < minMapId || mapid > maxMapId || mapid == 674030100) {
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 || mapid == 674030100)) {
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)) {
end(eim);
}
else
playerLeft(eim, player);
}
function disbandParty(eim) {
if (!eim.isEventCleared()) {
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 warpBonus(eim) {
eim.startEventTimer(bonusTime * 60000);
eim.warpEventTeam(674030300);
}
function clearPQ(eim) {
eim.stopEventTimer();
eim.setEventCleared();
eim.schedule("warpBonus", 10 * 1000);
}
function isMV(mob) {
var mobid = mob.getId();
return (mobid == 9400589);
}
function monsterKilled(mob, eim) {
if(isMV(mob)) {
eim.showClearEffect();
eim.clearPQ();
}
}
function allMonstersDead(eim) {}
function cancelSchedule() {}
function dispose(eim) {}
@@ -1,13 +0,0 @@
importPackage(Packages.server.life);
importPackage(Packages.tools);
importPackage(Packages.server.events);
function start(ms) {
try {
ms.getPlayer().resetEnteredScript();
ms.getPlayer().getClient().getSession().write(MaplePacketCreator.getClock(BalrogPQ.getSecondsLeft())); // 60 mins(1hr)
BalrogPQ.spawnBalrog(1, ms.getPlayer());
} catch(err) {
ms.getPlayer().dropMessage(err);
}
}
+1 -1
View File
@@ -41,7 +41,7 @@ function action(mode, type, selection) {
if (mode == -1){
cm.dispose();
return;
}else if(mode == 0) {
} else if (mode == 0) {
cm.sendOk("This town also has a lot to offer. Find us if and when you feel the need to go to the Ant Tunnel Park.");
cm.dispose();
return;
+4 -2
View File
@@ -39,10 +39,12 @@ function start() {
function action(mode, type, selection) {
status++;
if (mode == -1){
if(mode == 0)
cm.sendNext("This town also has a lot to offer. Find us if and when you feel the need to go to the Ant Tunnel Park.");
cm.dispose();
return;
} else if (mode == 0) {
cm.sendOk("This town also has a lot to offer. Find us if and when you feel the need to go to the Ant Tunnel Park.");
cm.dispose();
return;
}
if (status == 1) {
cm.sendYesNo(cm.getJobId() == 0 ? "We have a special 90% discount for beginners. The Ant Tunnel is located deep inside in the dungeon that's placed at the center of the Victoria Island, where the 24 Hr Mobile Store is. Would you like to go there for #b1,000 mesos#k?" : "The regular fee applies for all non-beginners. The Ant Tunnel is located deep inside in the dungeon that's placed at the center of the Victoria Island, where 24 Hr Mobile Store is. Would you like to go there for #b10,000 mesos#k?");
+174 -43
View File
@@ -1,55 +1,186 @@
importPackage(Packages.server.events);
var status = 0;
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <[email protected]>
Matthias Butz <[email protected]>
Jan Christian Meyer <[email protected]>
function start(){
status = 0;
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License version 3
as published by the Free Software Foundation. You may not use, modify
or distribute this program under any other version of the
GNU Affero General Public License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
*
*@author Ronan
*/
importPackage(Packages.server.expeditions);
importPackage(Packages.tools);
importPackage(Packages.scripting.event);
var status = 0;
var expedition;
var player;
var em;
var exped = MapleExpeditionType.BALROG_NORMAL;
var expedName = "Balrog";
var expedBoss = "Balrog";
var expedMap = "Balrog's Tomb";
var list = "What would you like to do?#b\r\n\r\n#L1#View current Expedition members#l\r\n#L2#Start the fight!#l\r\n#L3#Stop the expedition.#l";
function start() {
action(1, 0, 0);
}
function action(mode, type, selection){
if(mode <= 0){
function action(mode, type, selection) {
player = cm.getPlayer();
expedition = cm.getExpedition(exped);
em = cm.getEventManager("BalrogBattle");
if (mode == -1) {
cm.dispose();
} else if(status == 0){
cm.sendNext("Hi there. I am #b#nMu Young#n#k, the temple Keeper.");
status++;
} else if(BalrogPQ.partyLeader == "undefined"){
if(status == 1){
var text = "This temple is currently under siege by the Balrog troops. We currently do not know who gave the orders. " +
"For a few weeks now, the #e#b Order of the Altair#n#k has been sending mercenaries, but they were eliminated every time." +
" So, traveler, would you like to try your luck at defeating this unspeakable horror? \r\n\r\n " +
"#L0#Yes. Please register me as party leader\r\n#L1#What is the #eOrder of the Altair?";
cm.sendSimple(text);
status++;
} else if(selection == 0){
if(cm.getPlayer().getLevel() >= 70){
BalrogPQ.partyLeader = cm.getPlayer().getName();
cm.sendOk("Success. Your name has been registered and you may enter the battlefield. Come speak to me when you're ready!");
cm.getPlayer().getMap().broadcastMessage(Packages.tools.MaplePacketCreator.serverNotice(0, cm.getPlayer().getName() + " is currently fighting the balrog on CH" + cm.getPlayer().getClient().getChannel() + ". To join, do @balrogpq."))
BalrogPQ.open(cm.getPlayer());
cm.dispose();
} else if(cm.getPlayer().getLevel() < 70){
cm.sendOk("You must be at least level 70 to even consider battling the monster.");
cm.dispose();
}
} else if(selection == 1){
cm.sendOk("The Order of the Altair is a group of elite mercenaries that oversee the world's economy and battle operations. It was founded 40 years ago right after Black Mage was defeated in hopes of forseeing the next possible attack.");
cm.dispose();
} else if(status == 3){
cm.warp(105100300, 0);
} else {
if (mode == 0) {
cm.dispose();
return;
}
} else {
if(status == 1){
cm.sendYesNo(BalrogPQ.partyLeader + "'s party is currently battling the Balrog. Would you like to assist?");
status++;
} else if(status == 2){
if(cm.getPlayer().getLevel() > 60 && cm.getPlayer().getClient().getChannel() == BalrogPQ.channel){
cm.warp(105100300, 0);
if (status == 0) {
if (player.getLevel() < exped.getMinLevel() && player.getLevel() > exped.getMaxLevel()) { //Don't fit requirement
cm.sendOk("You do not meet the criteria to battle " + expedBoss + "!");
cm.dispose();
} else {
cm.sendOk("You may not battle the balrog when you are below Lv60! \r\n\r\n Or maybe you are not on the right channel.. Try CH" + BalrogPQ.channel + ".");
} else if (expedition == null) { //Start an expedition
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;
} 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.dispose();
} else { //If you aren't in it, you're going to get added
cm.sendOk(expedition.addMember(cm.getPlayer()));
cm.dispose();
}
} else if (expedition.isInProgress()) { //Only if the expedition is in progress
if (expedition.contains(player)) { //If you're registered, warp you in
var eim = em.getInstance(expedName + player.getClient().getChannel());
if(eim.getIntProperty("canJoin") == 1) {
eim.registerPlayer(player);
} else {
cm.sendOk("Your expedition already started the battle against " + expedBoss + ". Lets pray for those brave souls.");
}
cm.dispose();
} else { //If you're not in by now, tough luck
cm.sendOk("Another expedition has taken the initiative to challenge " + expedBoss + ", lets pray for those brave souls.");
cm.dispose();
}
}
} else if (status == 1) {
if (selection == 1) {
expedition = cm.getExpedition(exped);
if(expedition != null) {
cm.sendOk("Someone already taken the initiative to be the leader of the expedition. Try joining them!");
cm.dispose();
return;
}
cm.createExpedition(exped);
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!");
cm.dispose();
return;
} else if (selection == 2) {
cm.sendOk("Sure, not everyone's up to challenging " + expedBoss + ".");
cm.dispose();
return;
} else {
cm.sendSimple("Hi there. I am #b#nMu Young#n#k, the temple Keeper. This temple is currently under siege by the Balrog troops. We currently do not know who gave the orders. " +
"For a few weeks now, the #e#b Order of the Altair#n#k has been sending mercenaries, but they were eliminated every time." +
" So, traveler, would you like to try your luck at defeating this unspeakable horror?\r\n #L1#What is the #eOrder of the Altair?");
status = 10;
}
} else if (status == 2) {
if (selection == 1) {
if (expedition == null) {
cm.sendOk("The expedition could not be loaded.");
cm.dispose();
return;
}
var size = expedition.getMembers().size();
if (size == 1) {
cm.sendOk("You are the only member of the expedition.");
cm.dispose();
return;
}
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";
}
cm.sendSimple(text);
status = 6;
} else if (selection == 2) {
var min = exped.getMinSize();
var size = expedition.getMembers().size();
if (size < min) {
cm.sendOk("You need at least " + min + " players registered in your expedition.");
cm.dispose();
return;
}
cm.sendOk("The expedition will begin and you will now be escorted to the #b" + expedMap + "#k.");
status = 4;
} else if (selection == 3) {
player.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, expedition.getLeader().getName() + " has ended the expedition."));
cm.endExpedition(expedition);
cm.sendOk("The expedition has now ended. Sometimes the best strategy is to run away.");
cm.dispose();
return;
}
} else if (status == 4) {
if (em == null) {
cm.sendOk("The event could not be initialized, please report this on the forum.");
cm.dispose();
return;
}
em.setProperty("leader", player.getName());
em.setProperty("channel", player.getClient().getChannel());
if(!em.startInstance(expedition)) {
cm.sendOk("Another expedition has taken the initiative to challenge " + expedBoss + ", lets pray for those brave souls.");
cm.dispose();
return;
}
cm.dispose();
return;
} else if (status == 6) {
if (selection > 0) {
var banned = expedition.getMembers().get(selection - 1);
expedition.ban(banned);
cm.sendOk("You have banned " + banned.getName() + " from the expedition.");
cm.dispose();
} else {
cm.sendSimple(list);
status = 2;
}
} else if (status == 10) {
cm.sendOk("The Order of the Altair is a group of elite mercenaries that oversee the world's economy and battle operations. It was founded 40 years ago right after Black Mage was defeated in hopes of forseeing the next possible attack.");
cm.dispose();
}
}
}
}
+35 -37
View File
@@ -1,41 +1,39 @@
importPackage(Packages.server.events);
var status = 0;
var dispose = false;
function start(){
action(1, 0, 0);
var status;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection){
if(mode <= 0){
cm.dispose();
return;
} else if(status == 0){
if(cm.getPlayer().getMap().getMonsters().size() == 0){
cm.sendOk("Wow! You defeated the balrog.");
dispose = true;
cm.getPlayer().getClient().getChannelServer().broadcastPacket(Packages.tools.MaplePacketCreator.serverNotice(0, BalrogPQ.partyLeader + "'s party has successfully defeated the Balrog! Praise to them, they finished with " + cm.getPlayer().getMap().getCharacters().size() + " players."));
status++;
} else if(cm.getPlayer().getMap().getCharacters().size() > 1){
cm.sendYesNo("Are you really going to leave this battle and leave your fellow travelers to die?");
dispose = false;
status++;
} else if(cm.getPlayer().getMap().getCharacters().size() <= 1){
cm.sendYesNo("If you're a coward, you will leave.");
dispose = true;
status++;
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
cm.sendYesNo("So you are really going to leave?");
status++;
if (mode == 0 && type > 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if(status == 0){
if(cm.getEventInstance().isEventCleared()) {
cm.sendOk("Wow! You defeated the balrog.");
} else if(cm.getPlayer().getMap().getCharacters().size() > 1) {
cm.sendYesNo("Are you really going to leave this battle and leave your fellow travelers to die?");
} else {
cm.sendYesNo("If you're a coward, you will leave.");
}
} else if(status == 1){
if(cm.getEventInstance().isEventCleared()) {
cm.warp(cm.getMapId() == 105100300 ? 105100301 : 105100401);
} else {
cm.warp(105100100);
}
cm.dispose();
}
}
} else if(status == 1){
if(dispose){
cm.getPlayer().getMap().killAllMonsters();
BalrogPQ.partyLeader = "undefined";
BalrogPQ.balrogSpawned = false;
BalrogPQ.close();
}
cm.warp(105100100);
cm.dispose();
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ var payment = false;
var atHerbTown = false;
function start() {
if(cm.getPlayer().getMap().getId() == 251000100)atHerbTown = true;
if(cm.getPlayer().getMap().getId() == 251000100) atHerbTown = true;
if (cm.haveItem(4031242)){
if(atHerbTown)
+1 -1
View File
@@ -42,7 +42,7 @@ function action(mode, type, selection) {
if(selection == 0) {
cm.sendSimple("You don't seem to be from out town. How can I help you?#L0##bI would like some #t4031346#.#k#l");
} else {
cm.sendNext("Under developing...");
cm.sendNext("Under development...");
cm.dispose();
}
} else if(status == 2) {
+19 -4
View File
@@ -21,6 +21,7 @@
*/
var status = 0;
var goToMansion = false;
var fee = 15000;
function start() {
status = -1;
@@ -37,7 +38,7 @@ function action(mode, type, selection) {
status++;
if (cm.getPlayer().getMapId() == 682000000) {
if (status == 0)
cm.sendSimple("Where to, boss? \r\n#L0#New Leaf City#l\r\n#L1#Haunted Mansion#l");
cm.sendSimple("Where to, boss? \r\n#b#L0#New Leaf City (" + fee + " mesos)#l\r\n#L1#Haunted Mansion#l#k");
else if (status == 1) {
if (selection == 0)
cm.sendYesNo("You want to go to New Leaf City?");
@@ -46,14 +47,28 @@ function action(mode, type, selection) {
cm.sendYesNo("You're sure you want to enter the Mansion?");
}
} else if (status == 2) {
cm.warp(goToMansion ? 682000100 : 600000000, 0);
if(goToMansion) {
cm.warp(682000100, 0);
} else if(cm.getMeso() >= fee) {
cm.gainMeso(-fee);
cm.warp(600000000);
} else {
cm.sendOk("Hey, what are you trying to pull on? You don't have enough meso to pay the fee.");
}
cm.dispose();
}
} else {
if (status == 0) {
cm.sendYesNo("Would you like to go to the Haunted Mansion?");
cm.sendYesNo("Would you like to go to the #bHaunted Mansion#k? The fee is " + fee + " mesos.");
} else if (status == 1) {
cm.warp(682000000, 0);
if(cm.getMeso() >= fee) {
cm.gainMeso(-fee);
cm.warp(682000000, 0);
} else {
cm.sendOk("Hey, what are you trying to pull on? You don't have enough meso to pay the fee.");
}
cm.dispose();
}
}
+1 -1
View File
@@ -86,7 +86,7 @@ function action(mode, type, selection) {
}
}
cm.sendOk(sendStr);
cm.sendSimple(sendStr);
cm.dispose();
}
}
+67
View File
@@ -0,0 +1,67 @@
/**
* @author: Ronan
* @npc: Charles
* @func: Treasure PQ
*/
var status = 0;
var em = null;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == -1) {
cm.dispose();
} else {
if (mode == 0 && status == 0) {
cm.dispose();
return;
}
if (mode == 1)
status++;
else
status--;
if (status == 0) {
em = cm.getEventManager("TreasurePQ");
if(em == null) {
cm.sendOk("The Treasure PQ has encountered an error.");
cm.dispose();
return;
}
cm.sendSimple("#e#b<Party Quest: MV's Lair>\r\n#k#n" + em.getProperty("party") + "\r\n\r\nYou can't go any further because of the extremely dangerous creatures lying ahead. Would you like to collaborate with party members to complete the quest? If so, please have your #bparty leader#k talk to me.#b\r\n#L0#I want to participate in the party quest.\r\n#L1#I want to find party members.\r\n#L2#I would like to hear more details.");
} else if (status == 1) {
if (selection == 0) {
if (cm.getParty() == null) {
cm.sendOk("You can participate in the party quest only if you are in a party.");
cm.dispose();
} else if(!cm.isLeader()) {
cm.sendOk("Your party leader must talk to me to start this party quest.");
cm.dispose();
} else {
var eli = em.getEligibleParty(cm.getParty());
if(eli.size() > 0) {
if(!em.startInstance(cm.getParty(), cm.getPlayer().getMap(), 1)) {
cm.sendOk("Another party has already entered the #rParty Quest#k in this channel. Please try another channel, or wait for the current party to finish.");
}
}
else {
cm.sendOk("You cannot start this party quest yet, because either your party is not in the range size, some of your party members are not eligible to attempt it or they are not in this map. If you're having trouble finding party members, try Party Search.");
}
cm.dispose();
}
} else if (selection == 1) {
cm.sendOk("Try using a Super Megaphone or asking your buddies or guild to join!");
cm.dispose();
} else {
cm.sendOk("#e#b<Party Quest: MV's Lair>#k#n\r\nMV appeared once more, disrupting the welfare of the people of New Leaf City. Join forces with other maplers to fend off this sudden attack. After defeating MV and his minions, fetch your prizes at MV's treasure room.");
cm.dispose();
}
}
}
}
+59
View File
@@ -0,0 +1,59 @@
/*
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/>.
*/
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) {
var mapid = cm.getMapId();
if(mapid == 674030100) {
cm.sendNext("Hi, I'm #p9220019#.");
cm.dispose();
return;
} else if(mapid == 674030300) {
cm.sendNext("Hi there, #h0#. This is the MV's treasure room. Use the time you have here to do whatever you want, there are a lot of things to uncover here, actually. Or else you can use the portal here to #rgo back#k to the entrance.");
cm.dispose();
return;
}
cm.sendYesNo("Are you sure you want to return? By returning now you are leaving your partners behind, do you really want to do it?");
} else if(status == 1) {
cm.warp(674030100);
cm.dispose();
}
}
}
+68
View File
@@ -0,0 +1,68 @@
/*
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/>.
*/
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) {
if(!cm.isEventLeader()) {
cm.sendNext("Please let your party leader talk to me for further instructions to proceed to the next stage.");
cm.dispose();
return;
}
var eim = cm.getEventInstance();
if(cm.haveItem(4032118, 15)) {
cm.gainItem(4032118, -15);
eim.setIntProperty("statusStg1", 1);
eim.showClearEffect();
cm.sendNext("You got the letters, great! Now, you can proceed to the room MV is through this tunnel. Be prepared!");
cm.dispose();
} else {
if(eim.getIntProperty("statusStg1") == 1) {
cm.sendNext("Go through this tunnel for the boss battle.");
} else {
cm.sendNext("Please hand me #r15 secret letters#k.");
}
cm.dispose();
}
}
}
}
+4
View File
@@ -0,0 +1,4 @@
function enter(pi) {
pi.playPortalSound(); pi.warp(674030100,"in00");
return true;
}
+4
View File
@@ -0,0 +1,4 @@
function enter(pi) {
pi.playPortalSound(); pi.warp(600000000,"yn00");
return true;
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
function enter(pi) {
if(pi.getEventInstance().getIntProperty("statusStg1") == 1) {
pi.playPortalSound(); pi.warp(674030200, 0);
return true;
} else {
pi.message("The tunnel is currently blocked.");
return false;
}
}
+23
View File
@@ -0,0 +1,23 @@
/*
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/>.
*/
function enter(pi) {
pi.warp(674030000, 0);
return true;
}
+2 -2
View File
@@ -1,5 +1,5 @@
function enter(pi) {
pi.saveLocation("MIRROR");
pi.playPortalSound(); pi.warp(926010000, 0);
pi.getPlayer().saveLocation("MIRROR");
pi.playPortalSound(); pi.warp(926010000, 4);
return true;
}
+5 -1
View File
@@ -23,6 +23,10 @@ Author: kevintjuh93
*/
function enter(pi) {
pi.playPortalSound(); pi.warp(pi.getPlayer().getSavedLocation("MIRROR"));
var mapid = pi.getPlayer().getSavedLocation("MIRROR");
pi.playPortalSound();
if(mapid == 260020500) pi.warp(mapid, 3);
else pi.warp(mapid);
return true;
}
+2 -2
View File
@@ -21,10 +21,10 @@
*/
/**
* @author BubblesDev v83 (Moogra)
* @purpose Warps to the Junior Balrog map for the Rush Skill.
* @purpose Warps to the Relic map for the Assassinate Skill.
*/
function enter(pi) {
if(pi.isQuestStarted(6202)) {
if(pi.isQuestStarted(6201)) {
if(pi.getWarpMap(910200000).countPlayers() == 0) {
pi.resetMapObjects(910200000);
pi.playPortalSound(); pi.warp(910200000, 0);
+1 -1
View File
@@ -35,7 +35,7 @@ function start(mode, type, selection) {
status--;
if (status == 0) {
qm.sendNext("(As you peek into the shattered statue, you might have found a clue about what happened. Better talk with #rScadur#k about this.)");
qm.sendNext("(As you peek into the shattered statue, you might have found a clue about what happened. Better talk to #rScadur#k about this.)");
qm.forceCompleteQuest();
qm.dispose();
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1020000.js: relic room next floor
*/
function act() {
rm.warp(910200000, "pt00");
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1020001.js: relic room next floor
*/
function act() {
rm.warp(910200000, "pt01");
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1020002.js: relic room next floor
*/
function act() {
rm.warp(910200000, "pt02");
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1021000.js: relic room fail
*/
function act() {
rm.spawnMonster(9300091);
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1021001.js: relic room fail
*/
function act() {
rm.spawnMonster(9300091);
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1021002.js: relic room fail
*/
function act() {
rm.spawnMonster(9300091);
}
+28
View File
@@ -0,0 +1,28 @@
/*
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/>.
*/
/* @Author Ronan
*
* 1022000.js: relic complete
*/
function act() {
rm.dropItems();
}
+1 -1
View File
@@ -1,3 +1,3 @@
function act() {
rm.dropItems();
rm.sprayItems(true, 1, 500, 1000, 15);
}
+1 -1
View File
@@ -1,3 +1,3 @@
function act() {
rm.dropItems();
rm.sprayItems(true, 1, 500, 1000, 15);
}
+23
View File
@@ -0,0 +1,23 @@
/*
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/>.
*/
function act() {
rm.spawnMonster(9400589);
}
+23
View File
@@ -0,0 +1,23 @@
/*
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/>.
*/
function act() {
rm.dropItems();
}
+23
View File
@@ -0,0 +1,23 @@
/*
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/>.
*/
function act() {
rm.sprayItems(true, 1, 5, 25, 15);
}
+46 -46
View File
@@ -9896,7 +9896,7 @@ INSERT IGNORE INTO `temp_data` (`id`, `dropperid`, `itemid`, `minimum_quantity`,
(9674, 5150000, 2383043, 1, 1, 0, 1000),
(9675, 6130100, 2383044, 1, 1, 0, 1000),
(9676, 6130103, 2383045, 1, 1, 0, 1000),
(9677, 6130201, 2383046, 1, 1, 0, 1000),
(9677, 6130202, 2383046, 1, 1, 0, 20000),
(9678, 6130203, 2383047, 1, 1, 0, 1000),
(9679, 5090000, 2383048, 1, 1, 0, 25000),
(9680, 5090001, 2383049, 1, 1, 0, 25000),
@@ -10416,10 +10416,10 @@ INSERT IGNORE INTO `temp_data` (`id`, `dropperid`, `itemid`, `minimum_quantity`,
(10194, 8500002, 4031196, 1, 1, 0, 1000000),
(10195, 8500002, 4031196, 1, 1, 0, 187500),
(10196, 8500002, 4031196, 1, 1, 0, 125000),
(10197, 3000006, 4031209, 1, 1, 0, 500000),
(10198, 2230109, 4031209, 1, 1, 0, 500000),
(10199, 2230200, 4031209, 1, 1, 0, 500000),
(10200, 3230104, 4031209, 1, 1, 0, 500000),
(10197, 3000006, 4031209, 1, 1, 3072, 500000),
(10198, 2230109, 4031209, 1, 1, 3072, 500000),
(10199, 2230200, 4031209, 1, 1, 3072, 500000),
(10200, 3230104, 4031209, 1, 1, 3072, 500000),
(10201, 3230306, 4031159, 1, 1, 2074, 500000),
(10202, 9500400, 4031224, 1, 1, 3607, 1000000),
(10203, 9500400, 4031223, 1, 1, 3607, 1000000),
@@ -16168,7 +16168,7 @@ INSERT INTO `monstercarddata` (`id`, `cardid`, `mobid`) VALUES
(152, 2383043, 5150000),
(153, 2383044, 6130100),
(154, 2383045, 6130103),
(155, 2383046, 6130201),
(155, 2383046, 6130202),
(156, 2383047, 6130203),
(157, 2383048, 5090000),
(158, 2383049, 5090001),
@@ -16591,7 +16591,7 @@ INSERT INTO `reactordrops` (`reactordropid`, `reactorid`, `itemid`, `chance`, `q
(41, 2212004, 4031116, 2, -1),
(42, 2212004, 2000001, 2, -1),
(43, 2212005, 4031136, 8, 3439),
(44, 2222000, 4031231, 2, -1),
(44, 2222000, 4031231, 2, 3620),
(45, 2222000, 4031258, 2, -1),
(46, 2222000, 2000002, 3, -1),
(47, 2302000, 2000001, 3, -1),
@@ -16667,7 +16667,7 @@ INSERT INTO `reactordrops` (`reactordropid`, `reactorid`, `itemid`, `chance`, `q
(117, 1302000, 4032267, 1, 20013),
(118, 1052000, 4031471, 1, 6153),
(119, 2112015, 2280000, 1, -1),
(120, 1022000, 4031452, 1, -1),
(120, 1022000, 4031452, 1, 6201),
(121, 2202003, 4001022, 1, -1),
(122, 2201001, 4001022, 1, -1),
(123, 1402000, 4032309, 1, 21013),
@@ -16728,44 +16728,44 @@ INSERT INTO `reactordrops` (`reactordropid`, `reactorid`, `itemid`, `chance`, `q
(178, 1052001, 1412039, 3, -1),
(179, 1052001, 1422042, 3, -1),
(180, 1052001, 1422043, 3, -1),
(181, 1052002, 1072375, 3, -1),
(182, 1052002, 1072376, 3, -1),
(183, 1052002, 2040728, 3, -1),
(184, 1052002, 2040729, 3, -1),
(185, 1052002, 2040730, 3, -1),
(186, 1052002, 2040731, 3, -1),
(187, 1052002, 2040732, 3, -1),
(188, 1052002, 2040733, 3, -1),
(189, 1052002, 2040734, 3, -1),
(190, 1052002, 2040735, 3, -1),
(191, 1052002, 2040736, 3, -1),
(192, 1052002, 2040737, 3, -1),
(193, 1052002, 2040738, 3, -1),
(194, 1052002, 2040739, 3, -1),
(195, 1052002, 1302112, 3, -1),
(196, 1052002, 1302113, 3, -1),
(197, 1052002, 1312042, 3, -1),
(198, 1052002, 1312043, 3, -1),
(199, 1052002, 1322068, 3, -1),
(200, 1052002, 1322069, 3, -1),
(201, 1052002, 1332084, 3, -1),
(202, 1052002, 1332085, 3, -1),
(203, 1052002, 1332086, 3, -1),
(204, 1052002, 1332087, 3, -1),
(205, 1052002, 1342019, 3, -1),
(206, 1052002, 1342020, 3, -1),
(207, 1052002, 1372050, 3, -1),
(208, 1052002, 1372051, 3, -1),
(209, 1052002, 1382066, 3, -1),
(210, 1052002, 1382067, 3, -1),
(211, 1052002, 1402056, 3, -1),
(212, 1052002, 1402057, 3, -1),
(213, 1052002, 1402058, 3, -1),
(214, 1052002, 1402059, 3, -1),
(215, 1052002, 1412038, 3, -1),
(216, 1052002, 1412039, 3, -1),
(217, 1052002, 1422042, 3, -1),
(218, 1052002, 1422043, 3, -1),
(181, 1052002, 1072375, 5, -1),
(182, 1052002, 1072376, 5, -1),
(183, 1052002, 2040728, 5, -1),
(184, 1052002, 2040729, 5, -1),
(185, 1052002, 2040730, 5, -1),
(186, 1052002, 2040731, 5, -1),
(187, 1052002, 2040732, 5, -1),
(188, 1052002, 2040733, 5, -1),
(189, 1052002, 2040734, 5, -1),
(190, 1052002, 2040735, 5, -1),
(191, 1052002, 2040736, 5, -1),
(192, 1052002, 2040737, 5, -1),
(193, 1052002, 2040738, 5, -1),
(194, 1052002, 2040739, 5, -1),
(195, 1052002, 1302112, 5, -1),
(196, 1052002, 1302113, 5, -1),
(197, 1052002, 1312042, 5, -1),
(198, 1052002, 1312043, 5, -1),
(199, 1052002, 1322068, 5, -1),
(200, 1052002, 1322069, 5, -1),
(201, 1052002, 1332084, 5, -1),
(202, 1052002, 1332085, 5, -1),
(203, 1052002, 1332086, 5, -1),
(204, 1052002, 1332087, 5, -1),
(205, 1052002, 1342019, 5, -1),
(206, 1052002, 1342020, 5, -1),
(207, 1052002, 1372050, 5, -1),
(208, 1052002, 1372051, 5, -1),
(209, 1052002, 1382066, 5, -1),
(210, 1052002, 1382067, 5, -1),
(211, 1052002, 1402056, 5, -1),
(212, 1052002, 1402057, 5, -1),
(213, 1052002, 1402058, 5, -1),
(214, 1052002, 1402059, 5, -1),
(215, 1052002, 1412038, 5, -1),
(216, 1052002, 1412039, 5, -1),
(217, 1052002, 1422042, 5, -1),
(218, 1052002, 1422043, 5, -1),
(219, 1002008, 4032452, 1, 22502),
(220, 6102001, 4001260, 1, -1),
(221, 6102002, 1472051, 25, -1),
+307 -22
View File
@@ -2261,8 +2261,8 @@ USE `heavenms`;
(2230104, 1082043, 1, 1, 0, 700),
(2230104, 1332010, 1, 1, 0, 700),
(2230104, 1052104, 1, 1, 0, 700),
(2230109, 4031209, 1, 1, 0, 7000),
(9410016, 4031209, 1, 1, 0, 7000),
(2230109, 4031209, 1, 1, 3072, 7000),
(9410016, 4031209, 1, 1, 3072, 7000),
(2230109, 4131010, 1, 1, 0, 3000),
(9410016, 4131010, 1, 1, 0, 3000),
(2230109, 2000002, 1, 1, 0, 40000),
@@ -2308,7 +2308,7 @@ USE `heavenms`;
(2230109, 1002619, 1, 1, 0, 700),
(9410016, 1002619, 1, 1, 0, 700),
(2230200, 4000165, 1, 1, 0, 200000),
(2230200, 4031209, 1, 1, 0, 7000),
(2230200, 4031209, 1, 1, 3072, 7000),
(2230200, 4006000, 1, 1, 0, 7000),
(2230200, 2000001, 1, 1, 0, 40000),
(2230200, 2040501, 1, 1, 0, 750),
@@ -2642,7 +2642,7 @@ USE `heavenms`;
(9400247, 1492004, 1, 1, 0, 700),
(9500107, 1492004, 1, 1, 0, 700),
(3000006, 4000166, 1, 1, 0, 200000),
(3000006, 4031209, 1, 1, 0, 7000),
(3000006, 4031209, 1, 1, 3072, 7000),
(3000006, 4131003, 1, 1, 0, 3000),
(3000006, 2000002, 1, 1, 0, 40000),
(3000006, 2000003, 1, 1, 0, 40000),
@@ -2958,7 +2958,7 @@ USE `heavenms`;
(3210100, 1002178, 1, 1, 0, 700),
(3210100, 1052107, 1, 1, 0, 700),
(3230104, 4000167, 1, 1, 0, 200000),
(3230104, 4031209, 1, 1, 0, 7000),
(3230104, 4031209, 1, 1, 3072, 7000),
(3230104, 4030012, 1, 1, 0, 10000),
(3230104, 2000002, 1, 1, 0, 40000),
(3230104, 2022040, 1, 1, 0, 3000),
@@ -4473,8 +4473,8 @@ USE `heavenms`;
(3230303, 1482005, 1, 1, 0, 700),
(3230405, 4000154, 1, 1, 0, 200000),
(9410020, 4000154, 1, 1, 0, 200000),
(3230405, 4031209, 1, 1, 0, 7000),
(9410020, 4031209, 1, 1, 0, 7000),
(3230405, 4031209, 1, 1, 3072, 7000),
(9410020, 4031209, 1, 1, 3072, 7000),
(3230405, 2002005, 1, 1, 0, 10000),
(9410020, 2002005, 1, 1, 0, 10000),
(3230405, 2022040, 1, 1, 0, 3000),
@@ -5135,8 +5135,8 @@ USE `heavenms`;
(9300233, 1052113, 1, 1, 0, 700),
(4230200, 4000158, 1, 1, 0, 200000),
(9410018, 4000158, 1, 1, 0, 200000),
(4230200, 4031209, 1, 1, 0, 7000),
(9410018, 4031209, 1, 1, 0, 7000),
(4230200, 4031209, 1, 1, 3072, 7000),
(9410018, 4031209, 1, 1, 3072, 7000),
(4230200, 2022040, 1, 1, 0, 3000),
(9410018, 2022040, 1, 1, 0, 3000),
(4230200, 2040707, 1, 1, 0, 750),
@@ -5167,8 +5167,8 @@ USE `heavenms`;
(9410018, 1072110, 1, 1, 0, 700),
(4230200, 1472014, 1, 1, 0, 700),
(9410018, 1472014, 1, 1, 0, 700),
(4230201, 4031209, 1, 1, 0, 7000),
(4230201, 2022040, 1, 1, 0, 3000),
(4230201, 4031209, 1, 1, 3072, 7000),
(4230201, 2022040, 1, 1, 3072, 3000),
(4230201, 2000002, 1, 1, 0, 40000),
(4230201, 2000003, 1, 1, 0, 40000),
(4230201, 2002004, 1, 1, 0, 10000),
@@ -5815,9 +5815,9 @@ USE `heavenms`;
(4230124, 4000157, 1, 1, 0, 200000),
(9300090, 4000157, 1, 1, 0, 200000),
(9420501, 4000157, 1, 1, 0, 200000),
(4230124, 4031209, 1, 1, 0, 7000),
(9300090, 4031209, 1, 1, 0, 7000),
(9420501, 4031209, 1, 1, 0, 7000),
(4230124, 4031209, 1, 1, 3072, 7000),
(9300090, 4031209, 1, 1, 3072, 7000),
(9420501, 4031209, 1, 1, 3072, 7000),
(4230124, 4030012, 1, 1, 0, 10000),
(9300090, 4030012, 1, 1, 0, 10000),
(9420501, 4030012, 1, 1, 0, 10000),
@@ -6047,7 +6047,7 @@ USE `heavenms`;
(4230108, 1472018, 1, 1, 0, 700),
(4230123, 4000156, 1, 1, 0, 200000),
(4230123, 4000157, 1, 1, 0, 200000),
(4230123, 4031209, 1, 1, 0, 7000),
(4230123, 4031209, 1, 1, 3072, 7000),
(4230123, 4030012, 1, 1, 0, 10000),
(4230123, 4003004, 1, 1, 0, 7000),
(4230123, 4130015, 1, 1, 0, 3000),
@@ -10055,7 +10055,6 @@ USE `heavenms`;
(6130202, 2040004, 1, 1, 0, 750),
(6130202, 2040501, 1, 1, 0, 750),
(6130202, 2040401, 1, 1, 0, 750),
(6130202, 2383046, 1, 1, 0, 20000),
(6130202, 4004002, 1, 1, 0, 3000),
(6130202, 4010001, 1, 1, 0, 7000),
(6130202, 4020008, 1, 1, 0, 7000),
@@ -19559,7 +19558,6 @@ USE `heavenms`;
(9400583, 2041030, 1, 1, 0, 5000),
(9400583, 4006000, 1, 1, 0, 20000),
(9400583, 2070005, 1, 1, 0, 400),
(9400583, 1042013, 1, 1, 0, 2000),
(9400583, 1002391, 1, 1, 0, 2000),
(9400583, 1302096, 1, 1, 0, 2000),
(9400583, 1041099, 1, 1, 0, 2000),
@@ -19770,8 +19768,8 @@ USE `heavenms`;
(1120100, 4001361, 1, 1, 28250, 70000),
(2230110, 4032146, 1, 1, 20722, 40000),
(2230111, 4032147, 1, 1, 20723, 40000),
(9300378, 4001272, 1, 1, 0, 400000),
(9300378, 4032324, 1, 1, 21736, 40000),
(9300347, 4001272, 1, 1, 0, 400000),
(9300347, 4032324, 1, 1, 21736, 40000),
(9300344, 4032322, 1, 1, 21731, 999999),
(3400008, 1302008, 1, 1, 0, 8500),
(3400008, 1412004, 1, 1, 0, 8500),
@@ -20024,7 +20022,86 @@ USE `heavenms`;
(7220002, 4031789, 1, 1, 3844, 999999),
(9300102, 4031507, 1, 1, 6002, 999999),
(9300061, 4001101, 1, 1, 0, 999999),
(9300093, 4031495, 1, 1, 6192, 999999);
(9300093, 4031495, 1, 1, 6192, 999999),
(8830007, 1302112, 1, 1, 0, 4000),
(8830007, 1302113, 1, 1, 0, 4000),
(8830007, 1312042, 1, 1, 0, 4000),
(8830007, 1312043, 1, 1, 0, 4000),
(8830007, 1322068, 1, 1, 0, 4000),
(8830007, 1322069, 1, 1, 0, 4000),
(8830007, 1332084, 1, 1, 0, 3000),
(8830007, 1332085, 1, 1, 0, 3000),
(8830007, 1332086, 1, 1, 0, 3000),
(8830007, 1332087, 1, 1, 0, 3000),
(8830007, 1372050, 1, 1, 0, 4000),
(8830007, 1382066, 1, 1, 0, 4000),
(8830007, 1382067, 1, 1, 0, 4000),
(8830007, 1402056, 1, 1, 0, 4000),
(8830007, 1402057, 1, 1, 0, 4000),
(8830007, 1402058, 1, 1, 0, 4000),
(8830007, 1402059, 1, 1, 0, 4000),
(8830007, 1412038, 1, 1, 0, 4000),
(8830007, 1412039, 1, 1, 0, 4000),
(8830007, 1422042, 1, 1, 0, 4000),
(8830007, 1422043, 1, 1, 0, 4000),
(8830007, 1432054, 1, 1, 0, 3000),
(8830007, 1432055, 1, 1, 0, 3000),
(8830007, 1442074, 1, 1, 0, 4000),
(8830007, 1442075, 1, 1, 0, 4000),
(8830007, 1452066, 1, 1, 0, 3000),
(8830007, 1452067, 1, 1, 0, 3000),
(8830007, 1452068, 1, 1, 0, 3000),
(8830007, 1452069, 1, 1, 0, 3000),
(8830007, 1452070, 1, 1, 0, 3000),
(8830007, 1462059, 1, 1, 0, 3000),
(8830007, 1462060, 1, 1, 0, 3000),
(8830007, 1462061, 1, 1, 0, 3000),
(8830007, 1462062, 1, 1, 0, 3000),
(8830007, 1462063, 1, 1, 0, 3000),
(8830007, 1472083, 1, 1, 0, 3000),
(8830007, 1472084, 1, 1, 0, 3000),
(8830007, 1482031, 1, 1, 0, 3000),
(8830007, 1482032, 1, 1, 0, 3000),
(8830007, 1492035, 1, 1, 0, 3000),
(8830007, 1492036, 1, 1, 0, 3000),
(8830007, 2000004, 1, 1, 0, 999999),
(8830007, 2000005, 1, 1, 0, 999999),
(8830007, 2000006, 1, 1, 0, 999999),
(8830007, 2030000, 1, 1, 0, 100000),
(8830007, 2050004, 1, 1, 0, 300000),
(8830007, 2020001, 1, 1, 0, 100000),
(8830007, 2020000, 1, 1, 0, 100000),
(8830007, 2000002, 1, 1, 0, 100000),
(8830007, 2020005, 1, 1, 0, 100000),
(8830007, 2020003, 1, 1, 0, 100000),
(8830007, 2020009, 1, 1, 0, 100000),
(8830007, 2020006, 1, 1, 0, 100000),
(8830007, 2020007, 1, 1, 0, 100000),
(8830007, 2022000, 1, 1, 0, 100000),
(8830007, 2020010, 1, 1, 0, 100000),
(8830007, 2001000, 1, 1, 0, 100000),
(8830007, 2001002, 1, 1, 0, 100000),
(8830007, 2020012, 1, 1, 0, 100000),
(8830007, 2020013, 1, 1, 0, 999999),
(8830007, 2020014, 1, 1, 0, 100000),
(8830007, 2020015, 1, 1, 0, 999999),
(8830007, 2049100, 1, 1, 0, 2000),
(8830007, 2049000, 1, 1, 0, 1000),
(8830007, 2040739, 1, 1, 0, 2000),
(8830007, 1072376, 1, 1, 0, 6000),
(8830007, 4001261, 1, 1, 0, 400000),
(8830007, 2330005, 1, 1, 0, 3000),
(8830007, 1382068, 1, 1, 0, 5000),
(8830007, 1402062, 1, 1, 0, 5000),
(8830007, 1472086, 1, 1, 0, 3000),
(8830007, 1442078, 1, 1, 0, 5000),
(8830007, 1452071, 1, 1, 0, 3000),
(8830007, 1492037, 1, 1, 0, 3000),
(8830007, 2388055, 1, 1, 0, 25000),
(9400748, 1002858, 1, 1, 0, 40000),
(9400748, 1002859, 1, 1, 0, 40000),
(9400748, 1002860, 1, 1, 0, 40000),
(9400748, 1002861, 1, 1, 0, 80000);
# (dropperid, itemid, minqty, maxqty, questid, chance)
@@ -20315,7 +20392,7 @@ USE `heavenms`;
UPDATE IGNORE temp_data SET questid=0 WHERE dropperid=2022354;
UPDATE IGNORE temp_data SET chance=600000 WHERE itemid=4000058;
#update USE drops that were supposed to be ETC
# update USE drops that were supposed to be ETC
INSERT IGNORE INTO temp_data (dropperid, itemid, minimum_quantity, maximum_quantity, questid, chance)
SELECT dropperid, 4001006, 1, 1, 0, 10000
FROM temp_data
@@ -20326,6 +20403,169 @@ USE `heavenms`;
FROM temp_data
WHERE itemid = 2011000; #Poisonous Mushroom
# add Giant Cake anniversary-themed drops
INSERT IGNORE INTO temp_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES
(9400606, 1012098, 1, 1, 0, 120000),
(9400606, 1012101, 1, 1, 0, 120000),
(9400606, 1012102, 1, 1, 0, 120000),
(9400606, 1012103, 1, 1, 0, 120000),
(9400606, 1032040, 1, 1, 0, 120000),
(9400606, 1032041, 1, 1, 0, 120000),
(9400606, 1032042, 1, 1, 0, 120000),
(9400606, 1002508, 1, 1, 0, 120000),
(9400606, 1002509, 1, 1, 0, 120000),
(9400606, 1002510, 1, 1, 0, 120000),
(9400606, 1002511, 1, 1, 0, 120000),
(9400606, 1002758, 1, 1, 0, 120000),
(9400606, 1102166, 1, 1, 0, 120000),
(9400606, 1102167, 1, 1, 0, 120000),
(9400606, 1102168, 1, 1, 0, 120000),
(9400606, 1082252, 1, 1, 0, 120000),
(9400606, 1092030, 1, 1, 0, 120000),
(9400606, 1092045, 1, 1, 0, 120000),
(9400606, 1092046, 1, 1, 0, 120000),
(9400606, 1092047, 1, 1, 0, 120000),
(9400606, 1302020, 1, 1, 0, 120000),
(9400606, 1302030, 1, 1, 0, 120000),
(9400606, 1302033, 1, 1, 0, 120000),
(9400606, 1302058, 1, 1, 0, 120000),
(9400606, 1302065, 1, 1, 0, 120000),
(9400606, 1312032, 1, 1, 0, 120000),
(9400606, 1322054, 1, 1, 0, 120000),
(9400606, 1332025, 1, 1, 0, 120000),
(9400606, 1332055, 1, 1, 0, 120000),
(9400606, 1332056, 1, 1, 0, 120000),
(9400606, 1372034, 1, 1, 0, 120000),
(9400606, 1382009, 1, 1, 0, 120000),
(9400606, 1382012, 1, 1, 0, 120000),
(9400606, 1382039, 1, 1, 0, 120000),
(9400606, 1402039, 1, 1, 0, 120000),
(9400606, 1412011, 1, 1, 0, 120000),
(9400606, 1412027, 1, 1, 0, 120000),
(9400606, 1422014, 1, 1, 0, 120000),
(9400606, 1422029, 1, 1, 0, 120000),
(9400606, 1432012, 1, 1, 0, 120000),
(9400606, 1432040, 1, 1, 0, 120000),
(9400606, 1442024, 1, 1, 0, 120000),
(9400606, 1442030, 1, 1, 0, 120000),
(9400606, 1442051, 1, 1, 0, 120000),
(9400606, 1452016, 1, 1, 0, 120000),
(9400606, 1452022, 1, 1, 0, 120000),
(9400606, 1452045, 1, 1, 0, 120000),
(9400606, 1462014, 1, 1, 0, 120000),
(9400606, 1462019, 1, 1, 0, 120000),
(9400606, 1462040, 1, 1, 0, 120000),
(9400606, 1472030, 1, 1, 0, 120000),
(9400606, 1472032, 1, 1, 0, 120000),
(9400606, 1472055, 1, 1, 0, 120000),
(9400606, 1482020, 1, 1, 0, 120000),
(9400606, 1482021, 1, 1, 0, 120000),
(9400606, 1482022, 1, 1, 0, 120000),
(9400606, 1492020, 1, 1, 0, 120000),
(9400606, 1492021, 1, 1, 0, 120000),
(9400606, 1492022, 1, 1, 0, 120000),
(9400606, 2020002, 1, 3, 0, 600000),
(9400606, 2010005, 1, 1, 0, 120000),
(9400606, 2010006, 1, 1, 0, 120000),
(9400606, 2012001, 1, 1, 0, 120000),
(9400606, 2020003, 1, 3, 0, 600000),
(9400606, 2020004, 1, 3, 0, 600000),
(9400606, 2020005, 1, 3, 0, 600000),
(9400606, 2020006, 1, 3, 0, 600000),
(9400606, 2020009, 1, 3, 0, 600000),
(9400606, 2020010, 1, 3, 0, 600000),
(9400606, 2020011, 1, 3, 0, 600000),
(9400606, 2020012, 1, 3, 0, 600000),
(9400606, 2020013, 1, 3, 0, 600000),
(9400606, 2020014, 1, 3, 0, 600000),
(9400606, 2020015, 1, 3, 0, 600000),
(9400606, 2020016, 1, 3, 0, 600000),
(9400606, 2020017, 1, 3, 0, 600000),
(9400606, 2020018, 1, 3, 0, 600000),
(9400606, 2020019, 1, 3, 0, 600000),
(9400606, 2020022, 1, 3, 0, 600000),
(9400606, 2020023, 1, 3, 0, 600000),
(9400606, 2020024, 1, 3, 0, 600000),
(9400606, 2020025, 1, 3, 0, 600000),
(9400606, 2020026, 1, 3, 0, 600000),
(9400606, 2020027, 1, 3, 0, 600000),
(9400606, 2020028, 1, 3, 0, 600000),
(9400606, 2020032, 1, 3, 0, 600000),
(9400606, 2022004, 1, 3, 0, 600000),
(9400606, 2022005, 1, 3, 0, 600000),
(9400606, 2022006, 1, 3, 0, 600000),
(9400606, 2022015, 1, 3, 0, 600000),
(9400606, 2022016, 1, 3, 0, 600000),
(9400606, 2022031, 1, 3, 0, 600000),
(9400606, 2022043, 1, 3, 0, 600000),
(9400606, 2022044, 1, 3, 0, 600000),
(9400606, 2022045, 1, 3, 0, 600000),
(9400606, 2022047, 1, 3, 0, 600000),
(9400606, 2022058, 1, 3, 0, 600000),
(9400606, 2022068, 1, 3, 0, 600000),
(9400606, 2022069, 1, 3, 0, 600000),
(9400606, 2022071, 1, 3, 0, 600000),
(9400606, 2022072, 1, 3, 0, 600000),
(9400606, 2022075, 1, 3, 0, 600000),
(9400606, 2022079, 1, 3, 0, 600000),
(9400606, 2022117, 1, 3, 0, 600000),
(9400606, 2022189, 1, 3, 0, 600000),
(9400606, 2022190, 1, 3, 0, 600000),
(9400606, 2022191, 1, 3, 0, 600000),
(9400606, 2022195, 1, 3, 0, 600000),
(9400606, 2022276, 1, 3, 0, 600000),
(9400606, 2022310, 1, 3, 0, 600000),
(9400606, 2040315, 2, 3, 0, 200000),
(9400606, 2040912, 2, 3, 0, 200000),
(9400606, 2041059, 2, 3, 0, 200000),
(9400606, 2041060, 2, 3, 0, 200000),
(9400606, 2041061, 2, 3, 0, 200000),
(9400606, 2041062, 2, 3, 0, 200000),
(9400606, 2043013, 2, 3, 0, 200000),
(9400606, 2043108, 2, 3, 0, 200000),
(9400606, 2043208, 2, 3, 0, 200000),
(9400606, 2043308, 2, 3, 0, 200000),
(9400606, 2043708, 2, 3, 0, 200000),
(9400606, 2043808, 2, 3, 0, 200000),
(9400606, 2044008, 2, 3, 0, 200000),
(9400606, 2044108, 2, 3, 0, 200000),
(9400606, 2044208, 2, 3, 0, 200000),
(9400606, 2044308, 2, 3, 0, 200000),
(9400606, 2044408, 2, 3, 0, 200000),
(9400606, 2044508, 2, 3, 0, 200000),
(9400606, 2044608, 2, 3, 0, 200000),
(9400606, 2044708, 2, 3, 0, 200000),
(9400606, 2044810, 2, 3, 0, 200000),
(9400606, 2044905, 2, 3, 0, 200000),
(9400606, 2100120, 1, 2, 0, 120000),
(9400606, 2100121, 1, 2, 0, 120000),
(9400606, 2101023, 1, 2, 0, 120000),
(9400606, 2101000, 1, 2, 0, 120000),
(9400606, 2101001, 1, 2, 0, 120000),
(9400606, 2101013, 1, 2, 0, 120000),
(9400606, 2101110, 1, 2, 0, 120000),
(9400606, 3010025, 1, 1, 0, 120000),
(9400606, 4003000, 7, 14, 0, 400000),
(9400606, 4011000, 1, 1, 0, 240000),
(9400606, 4011001, 1, 1, 0, 240000),
(9400606, 4011002, 1, 1, 0, 240000),
(9400606, 4011003, 1, 1, 0, 240000),
(9400606, 4011004, 1, 1, 0, 240000),
(9400606, 4011005, 1, 1, 0, 240000),
(9400606, 4011006, 1, 1, 0, 240000),
(9400606, 4011008, 1, 1, 0, 240000),
(9400606, 4021000, 1, 1, 0, 240000),
(9400606, 4021001, 1, 1, 0, 240000),
(9400606, 4021002, 1, 1, 0, 240000),
(9400606, 4021003, 1, 1, 0, 240000),
(9400606, 4021004, 1, 1, 0, 240000),
(9400606, 4021005, 1, 1, 0, 240000),
(9400606, 4021006, 1, 1, 0, 240000),
(9400606, 4021007, 1, 1, 0, 240000),
(9400606, 4021008, 1, 1, 0, 240000),
(9400606, 4031348, 1, 1, 0, 100000),
(9400606, 0, 25000, 30000, 0, 600000);
CREATE TABLE IF NOT EXISTS `drop_data` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`dropperid` int(11) NOT NULL,
@@ -21637,7 +21877,52 @@ USE `heavenms`;
(2402008, 4032512, 5, 3720),
(2602000, 4031574, 1, 3935),
(2619000, 4031709, 1, 3310),
(2612005, 4031798, 1, 3366);
(2612005, 4031798, 1, 3366),
(6741015, 4032118, 1, -1),
(6742014, 2041100, 2, -1),
(6742014, 2041103, 2, -1),
(6742014, 2041106, 2, -1),
(6742014, 2041109, 2, -1),
(6742014, 2022278, 2, -1),
(6742014, 2022103, 2, -1),
(6742014, 2022098, 2, -1),
(6742014, 2022097, 2, -1),
(6742014, 2022055, 2, -1),
(6742014, 2022056, 2, -1),
(6742014, 2022063, 5, -1),
(6742014, 2022064, 5, -1),
(6742014, 2040803, 5, -1),
(6742014, 2040818, 5, -1),
(6742014, 2040909, 5, -1),
(6742014, 2049000, 5, -1),
(6742014, 2022014, 5, -1),
(6742014, 2022016, 5, -1),
(6742014, 2022020, 5, -1),
(6742014, 2022021, 5, -1),
(6742014, 2022024, 5, -1),
(6742014, 2022026, 5, -1),
(6742014, 2040823, 5, -1),
(6742014, 2022185, 5, -1),
(6742014, 1122001, 10, -1),
(6742014, 1122002, 25, -1),
(6742014, 1122003, 10, -1),
(6742014, 1122004, 15, -1),
(6742014, 1122005, 25, -1),
(6742014, 1122006, 15, -1),
(6742014, 1002527, 10, -1),
(6742014, 1442026, 10, -1),
(6742014, 1332053, 15, -1),
(6742014, 1102046, 15, -1),
(6742014, 1102047, 15, -1),
(6742014, 1102048, 15, -1),
(6742014, 1132005, 15, -1),
(6742014, 1132006, 25, -1),
(6742014, 1112407, 25, -1),
(6742014, 1112408, 25, -1),
(6742014, 1132007, 40, -1),
(6742014, 1132008, 40, -1),
(6742014, 1082223, 50, -1),
(6742014, 1132009, 50, -1);
# adding wish tickets on APQ boxes
INSERT INTO `reactordrops` (`reactorid`, `itemid`, `chance`, `questid`) VALUES
+9 -6
View File
@@ -1476,7 +1476,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if (ob instanceof MapleMapItem) {
MapleMapItem mapitem = (MapleMapItem) ob;
if(System.currentTimeMillis() - mapitem.getDropTime() < 900) {
if(System.currentTimeMillis() - mapitem.getDropTime() < 900 || !mapitem.canBePickedBy(this)) {
client.announce(MaplePacketCreator.enableActions());
return;
}
@@ -5629,8 +5629,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
i = i.replace("rn", "Rn");
i = i.replace("vv", "Vv");
i = i.replace("VV", "Vv");
return i;
}
private static class MapleBuffStatValueHolder {
@@ -7452,11 +7452,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
announce(MaplePacketCreator.updateQuestInfo((short) quest.getQuest().getId(), quest.getNpc()));
} else if (quest.getStatus().equals(MapleQuestStatus.Status.COMPLETED)) {
quest_fame += 1;
if(ServerConstants.FAME_GAIN_BY_QUEST > 0)
fameGainByQuest();
short questid = quest.getQuest().getId();
if(questid != 3637) {
quest_fame += 1;
if(ServerConstants.FAME_GAIN_BY_QUEST > 0)
fameGainByQuest();
}
announce(MaplePacketCreator.completeQuest((short) quest.getQuest().getId(), quest.getCompletionTime()));
announce(MaplePacketCreator.completeQuest(questid, quest.getCompletionTime()));
} else if (quest.getStatus().equals(MapleQuestStatus.Status.NOT_STARTED)) {
announce(MaplePacketCreator.updateQuest(quest, false));
if (quest.getQuest().getInfoNumber() > 0) {
+4 -8
View File
@@ -1844,8 +1844,9 @@ public class Commands {
break;
case "killall":
List<MapleMapObject> monsters = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
MapleMap map = player.getMap();
List<MapleMapObject> monsters = map.getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
for (MapleMapObject monstermo : monsters) {
monster = (MapleMonster) monstermo;
if (!monster.getStats().isFriendly()) {
@@ -2287,12 +2288,7 @@ public class Commands {
case "itemvac":
List<MapleMapObject> list = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM));
for (MapleMapObject item : list) {
MapleMapItem mapItem = (MapleMapItem) item;
int ownerId = mapItem.getOwner();
if(ownerId <= 0 || player.getId() == ownerId || player.isPartyMember(ownerId) || System.currentTimeMillis() - mapItem.getDropTime() >= 15 * 1000) {
player.pickupItem(item);
}
player.pickupItem(item);
}
break;
@@ -2352,7 +2348,7 @@ public class Commands {
if(newHp < 0) newHp = Integer.MAX_VALUE;
monster.getStats().setHp(newHp);
monster.setHp(newHp);
monster.setStartingHp(newHp);
}
player.getMap().spawnMonsterOnGroundBelow(monster, player.getPosition());
@@ -39,6 +39,7 @@ import constants.ServerConstants;
* @author Ronan
*/
public final class PetLootHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
if(System.currentTimeMillis() - chr.getPetLootCd() < ServerConstants.PET_LOOT_UPON_ATTACK) {
@@ -660,6 +660,7 @@ public class EventInstanceManager {
cancelSchedule();
killCount.clear();
mapIds.clear();
disposeExpedition();
+46 -25
View File
@@ -28,8 +28,7 @@ import client.inventory.Item;
import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import java.awt.Point;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
@@ -107,33 +106,19 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
public void dropItems(boolean delayed, int posX, int posY, boolean meso, int mesoChance, final int minMeso, final int maxMeso, int minItems) {
if(c.getPlayer() == null) return;
List<ReactorDropEntry> chances = getDropChances();
List<ReactorDropEntry> items = new LinkedList<>();
int numItems = 0;
if (meso && Math.random() < (1 / (double) mesoChance)) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
}
Iterator<ReactorDropEntry> iter = chances.iterator();
while (iter.hasNext()) {
ReactorDropEntry d = iter.next();
if (Math.random() < (c.getPlayer().getDropRate() / (double) d.chance)) {
numItems++;
items.add(d);
}
}
while (items.size() < minItems) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
numItems++;
}
java.util.Collections.shuffle(items);
List<ReactorDropEntry> items = generateDropList(getDropChances(), c.getPlayer().getDropRate(), meso, mesoChance, minItems);
if(items.size() % 2 == 0) posX -= 12;
final Point dropPos = new Point(posX, posY);
dropPos.x -= (12 * numItems);
if(!delayed) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
byte p = 1;
for (ReactorDropEntry d : items) {
dropPos.x = (int) (posX + ((p % 2 == 0) ? (25 * ((p + 1) / 2)) : -(25 * (p / 2))));
p++;
if (d.itemId == 0) {
int range = maxMeso - minMeso;
int displayDrop = (int) (Math.random() * range) + minMeso;
@@ -148,9 +133,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
}
reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short)d.questid);
reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short) d.questid);
}
dropPos.x += 25;
}
} else {
final MapleCharacter chr = client.getPlayer();
@@ -158,6 +142,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
final List<ReactorDropEntry> dropItems = items;
final int worldMesoRate = client.getWorldServer().getMesoRate();
dropPos.x -= (12 * items.size());
sprayTask = TimerManager.getInstance().register(new Runnable() {
@Override
public void run() {
@@ -182,7 +168,7 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
}
r.getMap().dropFromReactor(getPlayer(), r, drop, dropPos, (short)d.questid);
r.getMap().dropFromReactor(getPlayer(), r, drop, dropPos, (short) d.questid);
}
dropPos.x += 25;
@@ -194,6 +180,41 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
private List<ReactorDropEntry> getDropChances() {
return ReactorScriptManager.getInstance().getDrops(reactor.getId());
}
private static List<ReactorDropEntry> generateDropList(List<ReactorDropEntry> drops, int dropRate, boolean meso, int mesoChance, int minItems) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
List<ReactorDropEntry> items = new ArrayList<>();
List<ReactorDropEntry> questItems = new ArrayList<>();
int numItems = 0;
if (meso && Math.random() < (1 / (double) mesoChance)) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
}
for(ReactorDropEntry mde : drops) {
if (Math.random() < (dropRate / (double) mde.chance)) {
if(!ii.isQuestItem(mde.itemId)) {
items.add(mde);
} else {
questItems.add(mde);
}
numItems++;
}
}
while (numItems < minItems) {
items.add(new ReactorDropEntry(0, mesoChance, -1));
numItems++;
}
java.util.Collections.shuffle(items);
java.util.Collections.shuffle(questItems);
items.addAll(questItems);
return items;
}
public void spawnMonster(int id) {
spawnMonster(id, 1, getPosition());
-112
View File
@@ -1,112 +0,0 @@
package server.events;
import client.MapleCharacter;
import java.util.*;
import server.life.MapleLifeFactory;
import java.awt.Point;
import server.maps.MapleMap;
import server.TimerManager;
/**
*
* @author FateJiki
* @Mapid 105100300
*/
public class BalrogPQ {
public static final int[] EasyBalrogParts = {8830002, 8830003, 8830000};
public static final int[] HardBalrogParts = {8830000, 8830001, 8830002};
public static List<MapleCharacter> candidates = new ArrayList<>();
public static boolean hasStarted = false;
public static String partyLeader = "undefined";
public static boolean balrogSpawned = false;
public static long timeStamp = 0;
public static byte channel = 1;
public static void addCandidate(MapleCharacter chr){
synchronized(candidates){
candidates.add(chr);
}
}
public static void warpAllCandidates(){
synchronized(candidates){
for(MapleCharacter c : candidates){
c.changeMap(105100300);
}
}
}
public static boolean isFull(MapleCharacter chr){
return chr.getClient().getChannelServer().getMapFactory().getMap(105100300).getCharacters().size() > 0;
}
public static void warpIn(MapleCharacter chr){
if(hasStarted){
chr.changeMap(105100300);
}
}
public static void scheduleChecks(MapleMap map){
final MapleMap fmap = map;
TimerManager tMan = TimerManager.getInstance();
tMan.schedule(new Runnable(){
@Override
public void run(){
for(MapleCharacter chrs : fmap.getCharacters()){
chrs.changeMap(105100100);
chrs.message("You did not defeat the balrog in time..");
close();
}
}
} , 60 * 60 * 1000);
tMan.schedule(new Runnable(){
@Override
public void run(){
if(fmap.getCharacters().size() <= 3){
if(fmap.getCharacters().size() > 0){
for(MapleCharacter chrs : fmap.getCharacters()){
chrs.message("[The Order]: What? You're down to that many mercenaries? I need to get you out of there.");
chrs.changeMap(105100100);
}
}
fmap.killAllMonsters();
close();
}
}
} , 60 * 1000);
}
public static void open(MapleCharacter chr){
channel = (byte)chr.getClient().getChannel();
hasStarted = true;
timeStamp = System.currentTimeMillis();
scheduleChecks(chr.getClient().getChannelServer().getMapFactory().getMap(105100300));
}
public static int getSecondsLeft(){ // assuming the thing lasts 60 minutes
int hour = 60 * 60; // 3600 seconds = 1hr
long elapsed = System.currentTimeMillis() - timeStamp;
int secondsLeft = (int)(hour - (elapsed / 1000));
return secondsLeft;
}
public static void close(){
hasStarted = false;
balrogSpawned = false;
partyLeader = "undefined";
synchronized(candidates){
candidates.clear();
}
timeStamp = 0;
}
public static void spawnBalrog(int mode, MapleCharacter chr){
if(!balrogSpawned){
for(int i = 0; i < HardBalrogParts.length; i++){
chr.getClient().getChannelServer().getMapFactory().getMap(105100300).spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(HardBalrogParts[i]), new Point(412, 258));
balrogSpawned = true;
}
} else {
// DO NUFFIN'
}
}
}
+94 -42
View File
@@ -132,8 +132,12 @@ public class MapleMonster extends AbstractLoadedMapleLife {
public int getHp() {
return hp.get();
}
public void setHp(int hp) {
public void addHp(int hp) {
this.hp.addAndGet(hp);
}
public void setStartingHp(int hp) {
this.hp.set(hp);
}
@@ -208,28 +212,37 @@ public class MapleMonster extends AbstractLoadedMapleLife {
return stats.getTagBgColor();
}
/**
*
* @param from the player that dealt the damage
* @param damage
*/
public synchronized void damage(MapleCharacter from, int damage) { // may be pointless synchronization
if (!isAlive()) {
return;
}
public void setHpZero() { // force HP = 0
applyAndGetHpDamage(Integer.MAX_VALUE, false);
}
public synchronized Integer applyAndGetHpDamage(int delta, boolean stayAlive) {
int curHp = hp.get();
int trueDamage = Math.min(curHp, damage); // since magic happens otherwise B^)
if(ServerConstants.USE_DEBUG == true) from.dropMessage(5, "Hitted MOB " + this.getId() + ", OID " + this.getObjectId());
dispatchMonsterDamaged(from, trueDamage);
hp.set(curHp - trueDamage);
if (!takenDamage.containsKey(from.getId())) {
takenDamage.put(from.getId(), new AtomicInteger(trueDamage));
} else {
takenDamage.get(from.getId()).addAndGet(trueDamage);
if (curHp <= 0) { // this monster is already dead
return null;
}
if(delta >= 0) {
if(stayAlive) curHp--;
int trueDamage = Math.min(curHp, delta);
hp.addAndGet(-trueDamage);
return trueDamage;
} else {
int trueHeal = -delta;
int hp2Heal = curHp + trueHeal;
int maxHp = getMaxHp();
if (hp2Heal > maxHp) {
trueHeal -= (hp2Heal - maxHp);
}
hp.addAndGet(trueHeal);
return trueHeal;
}
}
public void broadcastMobHpBar(MapleCharacter from) {
if (hasBossHPBar()) {
from.setPlayerAggro(this.hashCode());
from.getMap().broadcastBossHpMessage(this, this.hashCode(), makeBossHPBarPacket(), getPosition());
@@ -248,26 +261,45 @@ public class MapleMonster extends AbstractLoadedMapleLife {
}
}
}
/**
*
* @param from the player that dealt the damage
* @param damage
*/
public synchronized void damage(MapleCharacter from, int damage, boolean stayAlive) {
Integer trueDamage = applyAndGetHpDamage(damage, stayAlive);
if (trueDamage == null) {
return;
}
if(ServerConstants.USE_DEBUG) from.dropMessage(5, "Hitted MOB " + this.getId() + ", OID " + this.getObjectId());
dispatchMonsterDamaged(from, trueDamage);
if (!takenDamage.containsKey(from.getId())) {
takenDamage.put(from.getId(), new AtomicInteger(trueDamage));
} else {
takenDamage.get(from.getId()).addAndGet(trueDamage);
}
broadcastMobHpBar(from);
}
public void heal(int hp, int mp) {
int hpHealed = hp;
int hp2Heal = getHp() + hp;
int mp2Heal = getMp() + mp;
Integer hpHealed = applyAndGetHpDamage(-hp, false);
if(hpHealed == null) return;
int maxHp = getMaxHp();
int mp2Heal = getMp() + mp;
int maxMp = getMaxMp();
if (hp2Heal >= maxHp) {
hpHealed = hp2Heal - maxHp;
hp2Heal = maxHp;
}
if (mp2Heal >= maxMp) {
mp2Heal = maxMp;
}
setHp(hp2Heal);
setMp(mp2Heal);
getMap().broadcastMessage(MaplePacketCreator.healMonster(getObjectId(), hp));
if(hp > 0) getMap().broadcastMessage(MaplePacketCreator.healMonster(getObjectId(), hp));
maxHpPlusHeal.addAndGet(hpHealed);
dispatchMonsterHealed(hpHealed);
}
public boolean isAttackedBy(MapleCharacter chr) {
@@ -471,7 +503,25 @@ public class MapleMonster extends AbstractLoadedMapleLife {
reviveMap.spawnMonster(mob);
if(mob.getId() >= 8810010 && mob.getId() <= 8810017 && reviveMap.isHorntailDefeated()) {
for(int i = 8810018; i >= 8810010; i--)
boolean htKilled = false;
MapleMonster ht = reviveMap.getMonsterById(8810018);
if(ht != null) {
ht.lockMonster();
try {
htKilled = ht.isAlive();
ht.setHpZero();
} finally {
ht.unlockMonster();
}
if(htKilled) {
reviveMap.killMonster(ht, killer, true);
ht.broadcastMobHpBar(killer);
}
}
for(int i = 8810017; i >= 8810010; i--)
reviveMap.killMonster(reviveMap.getMonsterById(i), killer, true);
}
}
@@ -506,6 +556,12 @@ public class MapleMonster extends AbstractLoadedMapleLife {
listener.monsterDamaged(from, trueDmg);
}
}
private void dispatchMonsterHealed(int trueHeal) {
for (MonsterListener listener : listeners.toArray(new MonsterListener[listeners.size()])) {
listener.monsterHealed(trueHeal);
}
}
// should only really be used to determine drop owner
private int getHighestDamagerId() {
@@ -837,10 +893,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
final Skill skill = SkillFactory.getSkill(status.getSkill().getId());
final byte level = from.getSkillLevel(skill);
final int damage = (int) ((from.getStr() + from.getLuk()) * (1.5 + (level * 0.05)) * skill.getEffect(level).getDamage());
/*if (getHp() - damage <= 1) { make hp 1 betch
damage = getHp() - (getHp() - 1);
}*/
status.setValue(MonsterStatus.NINJA_AMBUSH, Integer.valueOf(damage));
animationTime = broadcastStatusEffect(status);
status.setDamageSchedule(timerManager.register(new DamageTask(damage, from, status, cancelTask, 2), 1000, 1000));
@@ -1092,20 +1145,19 @@ public class MapleMonster extends AbstractLoadedMapleLife {
@Override
public void run() {
int curHp = hp.get();
if(curHp <= 0) return;
if(curHp <= 1) return;
int damage = dealDamage;
if (damage >= curHp) {
damage = curHp - 1;
if (type == 1 || type == 2) {
map.broadcastMessage(MaplePacketCreator.damageMonster(getObjectId(), damage), getPosition());
cancelTask.run();
status.getCancelTask().cancel(false);
}
}
if (curHp > 1 && damage > 0) {
damage(chr, damage);
if (type == 1) {
if (damage > 0) {
damage(chr, damage, true);
if (type == 1 || type == 2) {
map.broadcastMessage(MaplePacketCreator.damageMonster(getObjectId(), damage), getPosition());
}
}
+1
View File
@@ -5,4 +5,5 @@ public interface MonsterListener {
public void monsterKilled(int aniTime);
public void monsterDamaged(MapleCharacter from, int trueDmg);
public void monsterHealed(int trueHeal);
}
+3
View File
@@ -93,6 +93,9 @@ public class SpawnPoint {
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {}
@Override
public void monsterHealed(int trueHeal) {}
});
if (mobTime == 0) {
nextPossibleSpawn = System.currentTimeMillis() + mobInterval;
+66 -39
View File
@@ -254,6 +254,7 @@ public class MapleMap {
}
public void setReactorState() {
chrRLock.lock();
objectRLock.lock();
try {
for (MapleMapObject o : mapobjects.values()) {
@@ -272,6 +273,7 @@ public class MapleMap {
}
} finally {
objectRLock.unlock();
chrRLock.unlock();
}
}
@@ -564,7 +566,7 @@ public class MapleMap {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for(MonsterDropEntry mde : from) {
if(mde.itemId == 0 || !ii.isQuestItem(mde.itemId)) {
if(!ii.isQuestItem(mde.itemId)) {
item.add(mde);
} else {
quest.add(mde);
@@ -585,9 +587,9 @@ public class MapleMap {
for (final MonsterDropEntry de : dropEntry) {
if (Randomizer.nextInt(999999) < (long) de.chance * chRate) {
if (droptype == 3) {
pos.x = (int) (mobpos + (d % 2 == 0 ? (40 * (d + 1) / 2) : -(40 * (d / 2))));
pos.x = (int) (mobpos + ((d % 2 == 0) ? (40 * ((d + 1) / 2)) : -(40 * (d / 2))));
} else {
pos.x = (int) (mobpos + ((d % 2 == 0) ? (25 * (d + 1) / 2) : -(25 * (d / 2))));
pos.x = (int) (mobpos + ((d % 2 == 0) ? (25 * ((d + 1) / 2)) : -(25 * (d / 2))));
}
if (de.itemId == 0) { // meso
int mesos = Randomizer.nextInt(de.Maximum - de.Minimum) + de.Minimum;
@@ -1014,21 +1016,10 @@ public class MapleMap {
*/
if (damage > 0) {
monster.damage(chr, damage);
monster.damage(chr, damage, false);
if (!monster.isAlive()) { // monster just died
killed = true;
}
} else if (monster.getId() >= 8810002 && monster.getId() <= 8810009) {
for (MapleMapObject object : chr.getMap().getMapObjects()) {
MapleMonster mons = chr.getMap().getMonsterByOid(object.getObjectId());
if (mons != null) {
if (monster.isAlive() && (monster.getId() >= 8810010 && monster.getId() <= 8810017)) {
if (mons.getId() == 8810018) {
killMonster(mons, chr, true);
}
}
}
}
}
} finally {
monster.unlockMonster();
@@ -1055,6 +1046,14 @@ public class MapleMap {
return mobs;
}
public void broadcastBalrogVictory(String leaderName) {
for (Channel cserv : Server.getInstance().getWorld(world).getChannels()) {
for (MapleCharacter player : cserv.getPlayerStorage().getAllCharacters()) {
player.dropMessage(6, "[VICTORY] " + leaderName + "'s party has successfully defeated the Balrog! Praise to them, they finished with " + countAlivePlayers() + " players alive.");
}
}
}
public void broadcastHorntailVictory() {
for (Channel cserv : Server.getInstance().getWorld(world).getChannels()) {
for (MapleCharacter player : cserv.getPlayerStorage().getAllCharacters()) {
@@ -1088,8 +1087,9 @@ public class MapleMap {
if (chr == null) {
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
monster.setHpZero();
removeMapObject(monster);
monster.dispatchMonsterKilled(false);
broadcastMessage(MaplePacketCreator.killMonster(monster.getObjectId(), animation), monster.getPosition());
return;
@@ -1118,10 +1118,9 @@ public class MapleMap {
}
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
//if (monster.getStats().selfDestruction() == null) {//FUU BOMBS D:
monster.setHpZero();
removeMapObject(monster);
//}
if (monster.getCP() > 0 && chr.getCarnival() != null) {
chr.getCarnivalParty().addCP(chr, monster.getCP());
chr.announce(MaplePacketCreator.updateCP(chr.getCP(), chr.getObtainedCP()));
@@ -1141,8 +1140,10 @@ public class MapleMap {
}
}
if (makeZakReal) {
MapleMap map = chr.getMap();
for (MapleMapObject object : objects) {
MapleMonster mons = chr.getMap().getMonsterByOid(object.getObjectId());
MapleMonster mons = map.getMonsterByOid(object.getObjectId());
if (mons != null) {
if (mons.getId() == 8800000) {
makeMonsterReal(mons);
@@ -1178,12 +1179,12 @@ public class MapleMap {
this.killMonster(mob, (MapleCharacter) getPlayers().get(0), false);
}
public void killMonster(int monsId) {
public void killMonster(int mobId) {
List<MapleMapObject> mmoL = new LinkedList(getMapObjects());
for (MapleMapObject mmo : mmoL) {
if (mmo instanceof MapleMonster) {
if (((MapleMonster) mmo).getId() == monsId) {
if (((MapleMonster) mmo).getId() == mobId) {
this.killMonster((MapleMonster) mmo, (MapleCharacter) getPlayers().get(0), false);
}
}
@@ -1205,9 +1206,12 @@ public class MapleMap {
if (monster.getStats().isFriendly()) {
continue;
}
spawnedMonstersOnMap.decrementAndGet();
monster.setHp(0);
monster.setHpZero();
removeMapObject(monster);
monster.dispatchMonsterKilled(false);
}
}
@@ -1415,10 +1419,10 @@ public class MapleMap {
}
}
public Collection<MapleMapObject> getMapObjects() {
public List<MapleMapObject> getMapObjects() {
objectRLock.lock();
try {
return Collections.unmodifiableCollection(mapobjects.values());
return new LinkedList(mapobjects.values());
}
finally {
objectRLock.unlock();
@@ -1446,7 +1450,8 @@ public class MapleMap {
public void destroyNPC(int npcid) {
List<MapleMapObject> npcs = getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.NPC));
chrRLock.lock();
objectWLock.lock();
try {
for (MapleMapObject obj : npcs) {
@@ -1459,6 +1464,7 @@ public class MapleMap {
}
} finally {
objectWLock.unlock();
chrRLock.unlock();
}
}
@@ -1582,7 +1588,7 @@ public class MapleMap {
if (m.getId() == 9300061) {
MapleMap.this.riceCakes++;
MapleMap.this.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + (MapleMap.this.riceCakes)));
MapleMap.this.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny made rice cake number " + (MapleMap.this.riceCakes) + "."));
}
dropFromFriendlyMonster(chr, m);
@@ -3240,11 +3246,10 @@ public class MapleMap {
}
public void clearDrops(MapleCharacter player) {
List<MapleMapObject> items = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM));
for (MapleMapObject i : items) {
for (MapleMapObject i : getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM))) {
droppedItemCount.decrementAndGet();
player.getMap().removeMapObject(i);
player.getMap().broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, player.getId()));
removeMapObject(i);
this.broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, player.getId()));
}
}
@@ -3436,6 +3441,7 @@ public class MapleMap {
}
public void toggleHiddenNPC(int id) {
chrRLock.lock();
objectRLock.lock();
try {
for (MapleMapObject obj : mapobjects.values()) {
@@ -3452,6 +3458,7 @@ public class MapleMap {
}
} finally {
objectRLock.unlock();
chrRLock.unlock();
}
}
@@ -3531,23 +3538,43 @@ public class MapleMap {
TimerManager.getInstance().schedule(new Runnable() {
@Override
public void run() {
for (int x = 8810002; x <= 8810009; x++) {
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(x), targetPoint);
}
final MapleMonster ht = MapleLifeFactory.getMonster(8810018);
ht.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(8810018), targetPoint);
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.addHp(trueDmg);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(-trueHeal);
}
});
spawnMonsterOnGroundBelow(ht, targetPoint);
final MapleMonster ht = getMonsterById(8810018);
for(int mobId = 8810002; mobId <= 8810009; mobId++) {
getMonsterById(mobId).addListener(new MonsterListener() {
for (int x = 8810002; x <= 8810009; x++) {
MapleMonster m = MapleLifeFactory.getMonster(x);
m.addListener(new MonsterListener() {
@Override
public void monsterKilled(int aniTime) {}
@Override
public void monsterDamaged(MapleCharacter from, int trueDmg) {
ht.damage(from, trueDmg);
ht.applyAndGetHpDamage(trueDmg, true);
ht.broadcastMobHpBar(from);
}
@Override
public void monsterHealed(int trueHeal) {
ht.addHp(trueHeal);
}
});
spawnMonsterOnGroundBelow(m, targetPoint);
}
}
+10 -2
View File
@@ -379,13 +379,21 @@ public class MapleMapFactory {
} else if (mapid >= 677000000 && mapid < 677100000) {
builder.append("Episode1GL");
} else if (mapid >= 670000000 && mapid < 682000000) {
builder.append("weddingGL");
if((mapid >= 674030000 && mapid < 674040000) || (mapid >= 680100000 && mapid < 680200000)) {
builder.append("etc");
} else {
builder.append("weddingGL");
}
} else if (mapid >= 682000000 && mapid < 683000000) {
builder.append("HalloweenGL");
} else if (mapid >= 683000000 && mapid < 684000000) {
builder.append("event");
} else if (mapid >= 800000000 && mapid < 900000000) {
builder.append("jp");
if((mapid >= 889100000 && mapid < 889200000)) {
builder.append("etc");
} else {
builder.append("jp");
}
} else {
builder.append("etc");
}
+31 -6
View File
@@ -33,7 +33,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
protected MapleClient ownerClient;
protected Item item;
protected MapleMapObject dropper;
protected int character_ownerid, meso, questid = -1;
protected int character_ownerid, party_ownerid, meso, questid = -1;
protected byte type;
protected boolean pickedUp = false, playerDrop;
protected long dropTime;
@@ -43,7 +43,8 @@ public class MapleMapItem extends AbstractMapleMapObject {
setPosition(position);
this.item = item;
this.dropper = dropper;
this.character_ownerid = owner.getId();
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.ownerClient = owner.getClient();
this.meso = 0;
this.type = type;
@@ -54,7 +55,8 @@ public class MapleMapItem extends AbstractMapleMapObject {
setPosition(position);
this.item = item;
this.dropper = dropper;
this.character_ownerid = owner.getParty() == null ? owner.getId() : owner.getPartyId();
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.ownerClient = owner.getClient();
this.meso = 0;
this.type = type;
@@ -66,8 +68,9 @@ public class MapleMapItem extends AbstractMapleMapObject {
setPosition(position);
this.item = null;
this.dropper = dropper;
this.character_ownerid = owner.getParty() == null ? owner.getId() : owner.getPartyId();
this.ownerClient = owner.getClient();
this.character_ownerid = owner.getId();
this.party_ownerid = owner.getPartyId();
this.ownerClient = owner.getClient();
this.meso = meso;
this.type = type;
this.playerDrop = playerDrop;
@@ -90,10 +93,32 @@ public class MapleMapItem extends AbstractMapleMapObject {
return dropper;
}
public final int getOwner() {
public final int getOwnerId() {
return character_ownerid;
}
public final boolean canBePickedBy(MapleCharacter chr) {
if (character_ownerid <= 0) return true;
if (party_ownerid == -1) {
if (chr.getId() == character_ownerid) {
return true;
} else if (chr.isPartyMember(character_ownerid)) {
party_ownerid = chr.getPartyId();
return true;
}
} else {
if (chr.getPartyId() == party_ownerid) {
return true;
} else if (chr.getId() == character_ownerid) {
party_ownerid = chr.getPartyId();
return true;
}
}
return System.currentTimeMillis() - dropTime >= 15 * 1000;
}
public final MapleClient getOwnerClient() {
return (ownerClient.isLoggedIn() && !ownerClient.getPlayer().isAwayFromWorld()) ? ownerClient : null;
}
+9 -7
View File
@@ -1711,10 +1711,10 @@ public class MaplePacketCreator {
mplew.writeInt(drop.getObjectId());
mplew.writeBool(drop.getMeso() > 0); // 1 mesos, 0 item, 2 and above all item meso bag,
mplew.writeInt(drop.getItemId()); // drop object ID
mplew.writeInt(drop.getOwner()); // owner charid/paryid :)
mplew.writeInt(drop.getOwnerId()); // owner charid/partyid :)
mplew.write(drop.getDropType()); // 0 = timeout for non-owner, 1 = timeout for non-owner's party, 2 = FFA, 3 = explosive/FFA
mplew.writePos(dropto);
mplew.writeInt(drop.getDropType() == 0 ? drop.getOwner() : 0); //test
mplew.writeInt(drop.getDropType() == 0 ? drop.getOwnerId() : 0); //test
if (mod != 2) {
mplew.writePos(dropfrom);
@@ -6668,12 +6668,14 @@ public class MaplePacketCreator {
mplew.writeInt(mob.getObjectId());
mplew.write(1); // direction ?
mplew.writeInt(damage);
int remainingHp = mob.getHp() - damage;
if (remainingHp <= 1) {
remainingHp = 0;
mob.getMap().removeMapObject(mob);
mob.applyAndGetHpDamage(damage, false);
int remainingHp = mob.getHp();
if(remainingHp <= 0) {
remainingHp = 0;
mob.getMap().removeMapObject(mob);
}
mob.setHp(remainingHp);
mplew.writeInt(remainingHp);
mplew.writeInt(mob.getMaxHp());
return mplew.getPacket();
+30 -30
View File
@@ -22,7 +22,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -46,7 +46,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -70,7 +70,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -94,7 +94,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -118,7 +118,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -142,7 +142,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -163,7 +163,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -184,7 +184,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -205,7 +205,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -226,7 +226,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -247,7 +247,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -273,7 +273,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -299,7 +299,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -325,7 +325,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -351,7 +351,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -377,7 +377,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -401,7 +401,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -422,7 +422,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -448,7 +448,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -472,7 +472,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -493,7 +493,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -519,7 +519,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -543,7 +543,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -564,7 +564,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="1"/>
</imgdir>
</imgdir>
@@ -590,7 +590,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="2"/>
</imgdir>
</imgdir>
@@ -616,7 +616,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="3"/>
</imgdir>
</imgdir>
@@ -642,7 +642,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="3"/>
</imgdir>
</imgdir>
@@ -668,7 +668,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="3"/>
</imgdir>
</imgdir>
@@ -695,7 +695,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="3"/>
</imgdir>
</imgdir>
@@ -722,7 +722,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="172800000"/>
<int name="time" value="2147483647"/>
<int name="expR" value="4"/>
</imgdir>
</imgdir>
+10 -10
View File
@@ -22,7 +22,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="1"/>
</imgdir>
</imgdir>
@@ -48,7 +48,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -74,7 +74,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -100,7 +100,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -126,7 +126,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -152,7 +152,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -178,7 +178,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -204,7 +204,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -230,7 +230,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="2"/>
</imgdir>
</imgdir>
@@ -256,7 +256,7 @@
</imgdir>
</imgdir>
<imgdir name="spec">
<int name="time" value="2100000"/>
<int name="time" value="2147483647"/>
<int name="drpR" value="3"/>
</imgdir>
</imgdir>
+2
View File
@@ -2769,6 +2769,7 @@
<vector name="origin" x="-9" y="31"/>
</canvas>
<int name="price" value="1"/>
<int name="quest" value="1"/>
</imgdir>
</imgdir>
<imgdir name="04031210">
@@ -11404,6 +11405,7 @@
<vector name="origin" x="-1" y="32"/>
</canvas>
<int name="price" value="1"/>
<int name="pquest" value="1"/>
</imgdir>
</imgdir>
<imgdir name="04032119">
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+17 -14
View File
@@ -2,20 +2,20 @@
<imgdir name="9400589.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="30"/>
<int name="maxHP" value="400000"/>
<int name="maxMP" value="200"/>
<int name="level" value="180"/>
<int name="maxHP" value="17000000"/>
<int name="maxMP" value="2000"/>
<int name="speed" value="-10"/>
<int name="PADamage" value="150"/>
<int name="PDDamage" value="500"/>
<int name="MADamage" value="20"/>
<int name="MDDamage" value="450"/>
<int name="acc" value="1000"/>
<int name="eva" value="10"/>
<int name="exp" value="500"/>
<int name="PADamage" value="650"/>
<int name="PDDamage" value="1000"/>
<int name="MADamage" value="780"/>
<int name="MDDamage" value="1100"/>
<int name="acc" value="300"/>
<int name="eva" value="50"/>
<int name="exp" value="60000"/>
<int name="undead" value="0"/>
<int name="pushed" value="3000"/>
<int name="hpRecovery" value="2000"/>
<int name="pushed" value="42000"/>
<int name="hpRecovery" value="20000"/>
<int name="boss" value="1"/>
<float name="fs" value="20.0"/>
<int name="summonType" value="2"/>
@@ -27,6 +27,9 @@
<int name="effectAfter" value="900"/>
</imgdir>
</imgdir>
<int name="HPgaugeHide" value="1"/>
<int name="hpTagBgcolor" value="5"/>
<int name="hpTagColor" value="1"/>
</imgdir>
<imgdir name="move">
<canvas name="0" width="287" height="259">
@@ -250,7 +253,7 @@
<int name="effectAfter" value="0"/>
<int name="attackAfter" value="1380"/>
<int name="jumpAttack" value="1"/>
<int name="PADamage" value="180"/>
<int name="PADamage" value="700"/>
<int name="knockback" value="1"/>
<int name="tremble" value="1"/>
</imgdir>
@@ -407,7 +410,7 @@
<int name="type" value="0"/>
<int name="effectAfter" value="0"/>
<int name="attackAfter" value="2250"/>
<int name="PADamage" value="200"/>
<int name="PADamage" value="620"/>
<int name="tremble" value="1"/>
</imgdir>
<canvas name="0" width="287" height="255">
+12 -12
View File
@@ -2,20 +2,20 @@
<imgdir name="9400739.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="8"/>
<int name="maxHP" value="2000"/>
<int name="maxMP" value="100"/>
<int name="level" value="140"/>
<int name="maxHP" value="200000"/>
<int name="maxMP" value="1000"/>
<int name="speed" value="20"/>
<int name="PADamage" value="100"/>
<int name="PDDamage" value="100"/>
<int name="MADamage" value="10"/>
<int name="MDDamage" value="70"/>
<int name="acc" value="1000"/>
<int name="eva" value="15"/>
<string name="exp" value="50"/>
<int name="PADamage" value="200"/>
<int name="PDDamage" value="1000"/>
<int name="MADamage" value="400"/>
<int name="MDDamage" value="500"/>
<int name="acc" value="210"/>
<int name="eva" value="45"/>
<string name="exp" value="5000"/>
<int name="undead" value="0"/>
<int name="pushed" value="500"/>
<int name="hpRecovery" value="10"/>
<int name="pushed" value="5000"/>
<int name="hpRecovery" value="1000"/>
<int name="boss" value="0"/>
<float name="fs" value="20.0"/>
<int name="summonType" value="0"/>
+12 -12
View File
@@ -2,20 +2,20 @@
<imgdir name="9400740.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="8"/>
<int name="maxHP" value="2000"/>
<int name="maxMP" value="100"/>
<int name="level" value="140"/>
<int name="maxHP" value="200000"/>
<int name="maxMP" value="1000"/>
<int name="speed" value="50"/>
<int name="PADamage" value="100"/>
<int name="PDDamage" value="100"/>
<int name="MADamage" value="10"/>
<int name="MDDamage" value="75"/>
<int name="acc" value="1000"/>
<int name="eva" value="20"/>
<string name="exp" value="50"/>
<int name="PADamage" value="400"/>
<int name="PDDamage" value="500"/>
<int name="MADamage" value="200"/>
<int name="MDDamage" value="1000"/>
<int name="acc" value="210"/>
<int name="eva" value="50"/>
<string name="exp" value="5000"/>
<int name="undead" value="0"/>
<int name="pushed" value="300"/>
<int name="hpRecovery" value="20"/>
<int name="pushed" value="3000"/>
<int name="hpRecovery" value="2000"/>
<int name="boss" value="0"/>
<float name="fs" value="20.0"/>
<int name="summonType" value="1"/>
+9 -9
View File
@@ -2,19 +2,19 @@
<imgdir name="9400741.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="1200"/>
<int name="level" value="140"/>
<int name="maxHP" value="120000"/>
<int name="maxMP" value="0"/>
<int name="speed" value="20"/>
<int name="PADamage" value="60"/>
<int name="PDDamage" value="85"/>
<int name="PADamage" value="420"/>
<int name="PDDamage" value="650"/>
<int name="MADamage" value="0"/>
<int name="MDDamage" value="95"/>
<int name="acc" value="60"/>
<int name="eva" value="9"/>
<int name="exp" value="50"/>
<int name="MDDamage" value="500"/>
<int name="acc" value="180"/>
<int name="eva" value="30"/>
<int name="exp" value="5000"/>
<int name="undead" value="1"/>
<int name="pushed" value="50"/>
<int name="pushed" value="5000"/>
<float name="fs" value="10.0"/>
<int name="summonType" value="1"/>
<string name="elemAttr" value="H3"/>
+9 -9
View File
@@ -2,19 +2,19 @@
<imgdir name="9400742.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="1400"/>
<int name="level" value="140"/>
<int name="maxHP" value="140000"/>
<int name="maxMP" value="0"/>
<int name="speed" value="20"/>
<int name="PADamage" value="65"/>
<int name="PDDamage" value="90"/>
<int name="PADamage" value="440"/>
<int name="PDDamage" value="770"/>
<int name="MADamage" value="0"/>
<int name="MDDamage" value="98"/>
<int name="acc" value="65"/>
<int name="eva" value="9"/>
<int name="exp" value="60"/>
<int name="MDDamage" value="700"/>
<int name="acc" value="180"/>
<int name="eva" value="30"/>
<int name="exp" value="6000"/>
<int name="undead" value="1"/>
<int name="pushed" value="50"/>
<int name="pushed" value="5000"/>
<float name="fs" value="10.0"/>
<int name="summonType" value="1"/>
<string name="elemAttr" value="H3"/>
+10 -10
View File
@@ -2,16 +2,16 @@
<imgdir name="9400743.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="1600"/>
<int name="maxMP" value="30"/>
<int name="level" value="140"/>
<int name="maxHP" value="160000"/>
<int name="maxMP" value="300"/>
<int name="speed" value="15"/>
<int name="PADamage" value="80"/>
<int name="PDDamage" value="80"/>
<int name="MADamage" value="75"/>
<int name="MDDamage" value="55"/>
<int name="acc" value="80"/>
<int name="eva" value="10"/>
<int name="PADamage" value="500"/>
<int name="PDDamage" value="700"/>
<int name="MADamage" value="160"/>
<int name="MDDamage" value="800"/>
<int name="acc" value="300"/>
<int name="eva" value="35"/>
<int name="exp" value="70"/>
<int name="undead" value="0"/>
<int name="pushed" value="1"/>
@@ -154,7 +154,7 @@
</imgdir>
<int name="type" value="0"/>
<int name="attackAfter" value="840"/>
<string name="PADamage" value="150"/>
<string name="PADamage" value="550"/>
</imgdir>
<canvas name="0" width="90" height="50">
<vector name="origin" x="36" y="50"/>
+13 -13
View File
@@ -2,20 +2,20 @@
<imgdir name="9400744.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="100000"/>
<int name="maxMP" value="500"/>
<int name="level" value="168"/>
<int name="maxHP" value="10000000"/>
<int name="maxMP" value="5000"/>
<int name="flySpeed" value="10"/>
<int name="PADamage" value="100"/>
<int name="PDDamage" value="400"/>
<int name="MADamage" value="200"/>
<int name="MDDamage" value="400"/>
<int name="acc" value="90"/>
<int name="PADamage" value="750"/>
<int name="PDDamage" value="600"/>
<int name="MADamage" value="700"/>
<int name="MDDamage" value="800"/>
<int name="acc" value="190"/>
<int name="eva" value="20"/>
<int name="exp" value="2500"/>
<int name="exp" value="250000"/>
<int name="undead" value="0"/>
<int name="pushed" value="2000"/>
<int name="hpRecovery" value="100"/>
<int name="pushed" value="20000"/>
<int name="hpRecovery" value="10000"/>
<int name="mpRecovery" value="5"/>
<string name="elemAttr" value="S1H3"/>
<int name="boss" value="1"/>
@@ -163,7 +163,7 @@
</canvas>
</imgdir>
<int name="type" value="2"/>
<int name="conMP" value="2"/>
<int name="conMP" value="40"/>
<int name="attackAfter" value="400"/>
<int name="magic" value="1"/>
</imgdir>
@@ -345,7 +345,7 @@
<uol name="8" value="1"/>
</imgdir>
<int name="type" value="0"/>
<int name="conMP" value="2"/>
<int name="conMP" value="40"/>
<int name="effectAfter" value="0"/>
<int name="attackAfter" value="720"/>
<int name="magic" value="1"/>
+14 -14
View File
@@ -2,20 +2,20 @@
<imgdir name="9400745.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="50000"/>
<int name="maxMP" value="500"/>
<int name="level" value="160"/>
<int name="maxHP" value="5000000"/>
<int name="maxMP" value="5000"/>
<int name="speed" value="-20"/>
<int name="PADamage" value="90"/>
<int name="PDDamage" value="220"/>
<int name="MADamage" value="150"/>
<int name="PADamage" value="700"/>
<int name="PDDamage" value="880"/>
<int name="MADamage" value="550"/>
<int name="MDDamage" value="220"/>
<int name="acc" value="75"/>
<int name="eva" value="15"/>
<int name="exp" value="1000"/>
<int name="acc" value="180"/>
<int name="eva" value="55"/>
<int name="exp" value="100000"/>
<int name="undead" value="0"/>
<int name="pushed" value="1500"/>
<int name="hpRecovery" value="50"/>
<int name="pushed" value="15000"/>
<int name="hpRecovery" value="5000"/>
<int name="mpRecovery" value="5"/>
<string name="elemAttr" value="S1H3"/>
<int name="boss" value="1"/>
@@ -187,7 +187,7 @@
</canvas>
</imgdir>
<int name="type" value="1"/>
<int name="conMP" value="2"/>
<int name="conMP" value="40"/>
<int name="effectAfter" value="700"/>
<int name="attackAfter" value="1300"/>
<int name="magic" value="1"/>
@@ -356,7 +356,7 @@
</canvas>
</imgdir>
<int name="type" value="2"/>
<int name="conMP" value="2"/>
<int name="conMP" value="40"/>
<int name="effectAfter" value="100"/>
<int name="attackAfter" value="400"/>
<int name="magic" value="1"/>
@@ -463,7 +463,7 @@
</canvas>
</imgdir>
<int name="type" value="0"/>
<int name="conMP" value="2"/>
<int name="conMP" value="40"/>
<int name="effectAfter" value="500"/>
<int name="attackAfter" value="400"/>
<int name="magic" value="1"/>
+11 -11
View File
@@ -2,19 +2,19 @@
<imgdir name="9400746.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="20000"/>
<int name="maxMP" value="100"/>
<int name="level" value="170"/>
<int name="maxHP" value="2000000"/>
<int name="maxMP" value="1000"/>
<int name="speed" value="-60"/>
<int name="PADamage" value="85"/>
<int name="PDDamage" value="200"/>
<int name="PADamage" value="650"/>
<int name="PDDamage" value="800"/>
<int name="MADamage" value="0"/>
<int name="MDDamage" value="250"/>
<int name="acc" value="140"/>
<int name="eva" value="23"/>
<int name="exp" value="300"/>
<int name="MDDamage" value="750"/>
<int name="acc" value="200"/>
<int name="eva" value="56"/>
<int name="exp" value="30000"/>
<int name="undead" value="0"/>
<int name="pushed" value="2500"/>
<int name="pushed" value="25000"/>
<string name="elemAttr" value="I2F2L2S2"/>
<int name="boss" value="1"/>
<float name="fs" value="10.0"/>
@@ -146,7 +146,7 @@
</imgdir>
<int name="type" value="1"/>
<int name="attackAfter" value="720"/>
<int name="PADamage" value="135"/>
<int name="PADamage" value="560"/>
</imgdir>
<canvas name="0" width="123" height="107">
<vector name="origin" x="61" y="107"/>
+12 -12
View File
@@ -2,19 +2,19 @@
<imgdir name="9400747.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="45000"/>
<int name="maxMP" value="190"/>
<int name="level" value="170"/>
<int name="maxHP" value="4500000"/>
<int name="maxMP" value="1900"/>
<int name="speed" value="-20"/>
<int name="PADamage" value="80"/>
<int name="PDDamage" value="100"/>
<int name="MADamage" value="80"/>
<int name="MDDamage" value="100"/>
<int name="acc" value="70"/>
<int name="eva" value="15"/>
<int name="exp" value="250"/>
<int name="PADamage" value="700"/>
<int name="PDDamage" value="750"/>
<int name="MADamage" value="650"/>
<int name="MDDamage" value="500"/>
<int name="acc" value="210"/>
<int name="eva" value="70"/>
<int name="exp" value="25000"/>
<int name="undead" value="0"/>
<int name="pushed" value="1000"/>
<int name="pushed" value="10000"/>
<string name="elemAttr" value="F2I3"/>
<int name="boss" value="1"/>
<float name="fs" value="10.0"/>
@@ -141,7 +141,7 @@
</canvas>
</imgdir>
<int name="type" value="2"/>
<int name="conMP" value="3"/>
<int name="conMP" value="50"/>
<int name="attackAfter" value="665"/>
<int name="bulletSpeed" value="200"/>
<string name="elemAttr" value="F"/>
+17 -14
View File
@@ -2,20 +2,9 @@
<imgdir name="9400748.img">
<imgdir name="info">
<int name="bodyAttack" value="1"/>
<int name="level" value="10"/>
<int name="maxHP" value="400000"/>
<int name="maxMP" value="100"/>
<int name="speed" value="-10"/>
<int name="PADamage" value="150"/>
<int name="PDDamage" value="500"/>
<int name="MADamage" value="20"/>
<int name="MDDamage" value="450"/>
<int name="acc" value="1000"/>
<int name="eva" value="10"/>
<int name="exp" value="1000"/>
<int name="undead" value="0"/>
<int name="pushed" value="3000"/>
<int name="hpRecovery" value="2000"/>
<int name="hpRecovery" value="20000"/>
<int name="boss" value="1"/>
<float name="fs" value="20.0"/>
<int name="summonType" value="2"/>
@@ -27,6 +16,20 @@
<int name="effectAfter" value="900"/>
</imgdir>
</imgdir>
<int name="acc" value="270"/>
<int name="eva" value="50"/>
<int name="exp" value="60000"/>
<int name="level" value="180"/>
<int name="MADamage" value="780"/>
<int name="maxHP" value="17000000"/>
<int name="maxMP" value="2000"/>
<int name="MDDamage" value="1100"/>
<int name="PADamage" value="650"/>
<int name="PDDamage" value="1000"/>
<int name="pushed" value="42000"/>
<int name="HPgaugeHide" value="1"/>
<int name="hpTagBgcolor" value="5"/>
<int name="hpTagColor" value="1"/>
</imgdir>
<imgdir name="move">
<canvas name="0" width="287" height="259">
@@ -250,7 +253,7 @@
<int name="effectAfter" value="0"/>
<int name="attackAfter" value="1380"/>
<int name="jumpAttack" value="1"/>
<int name="PADamage" value="180"/>
<int name="PADamage" value="720"/>
<int name="knockback" value="1"/>
<int name="tremble" value="1"/>
</imgdir>
@@ -407,7 +410,7 @@
<int name="type" value="0"/>
<int name="effectAfter" value="0"/>
<int name="attackAfter" value="2250"/>
<int name="PADamage" value="200"/>
<int name="PADamage" value="640"/>
<int name="tremble" value="1"/>
</imgdir>
<canvas name="0" width="287" height="255">
+1 -1
View File
@@ -10,7 +10,7 @@
<int name="PDDamage" value="90"/>
<int name="MADamage" value="0"/>
<int name="MDDamage" value="90"/>
<int name="acc" value="75"/>
<int name="acc" value="300"/>
<int name="eva" value="12"/>
<int name="exp" value="120"/>
<int name="undead" value="0"/>
+4 -4
View File
@@ -2312,19 +2312,19 @@
<string name="desc" value="Improves dexterity on shoes.\nSuccess rate:15%, avoidability+5, accuracy+3, speed+1"/>
</imgdir>
<imgdir name="2040720">
<string name="name" value="Scroll for Jump for DEX"/>
<string name="name" value="Scroll for Shoes for Jump"/>
<string name="desc" value="Improves jump on shoes.\nSuccess rate:65%, jump+2, DEX+1"/>
</imgdir>
<imgdir name="2040721">
<string name="name" value="Scroll for Jump for DEX"/>
<string name="name" value="Scroll for Shoes for Jump"/>
<string name="desc" value="Improves jump on shoes.\nSuccess rate:15%, jump+5, DEX+3, speed+1"/>
</imgdir>
<imgdir name="2040722">
<string name="name" value="Scroll for Speed for DEX"/>
<string name="name" value="Scroll for Shoes for Speed"/>
<string name="desc" value="Improves speed on shoes.\nSuccess rate:65%, speed+2"/>
</imgdir>
<imgdir name="2040723">
<string name="name" value="Scroll for Speed for DEX"/>
<string name="name" value="Scroll for Shoes for Speed"/>
<string name="desc" value="Improves speed on shoes.\nSuccess rate:15%, speed+3"/>
</imgdir>
<imgdir name="2040727">
+7 -3
View File
@@ -8660,16 +8660,19 @@
</imgdir>
<imgdir name="674030300">
<string name="streetName" value="Treasure Dungeon"/>
<string name="mapName" value="Treasure Dungeon"/>
</imgdir>
<imgdir name="914090011">
<string name="streetName" value="Aran Tuto"/>
<string name="mapName" value="Aran Tuto 2"/>
</imgdir>
<imgdir name="674030100">
<string name="streetName" value="Entrance to MV&apos;s Lair"/>
<string name="streetName" value="Treasure Dungeon"/>
<string name="mapName" value="Entrance to MV&apos;s Lair"/>
</imgdir>
<imgdir name="674030200">
<string name="streetName" value="The Lair of MV"/>
<string name="streetName" value="Treasure Dungeon"/>
<string name="mapName" value="The Lair of MV"/>
</imgdir>
<imgdir name="910020000">
<string name="streetName" value="Hidden Street"/>
@@ -17304,7 +17307,8 @@
<string name="mapName" value="Aran Tuto 4"/>
</imgdir>
<imgdir name="674030000">
<string name="streetName" value="Initiation"/>
<string name="streetName" value="Treasure Dungeon"/>
<string name="mapName" value="Initiation"/>
</imgdir>
</imgdir>
<imgdir name="singapore">
+8
View File
@@ -10246,10 +10246,18 @@
<int name="delay" value="500"/>
<vector name="origin" x="0" y="0"/>
</canvas>
<canvas name="9400748" width="25" height="25">
<int name="delay" value="500"/>
<vector name="origin" x="0" y="0"/>
</canvas>
<canvas name="2220000" width="25" height="25">
<int name="delay" value="500"/>
<vector name="origin" x="0" y="0"/>
</canvas>
<canvas name="9400589" width="25" height="25">
<int name="delay" value="500"/>
<vector name="origin" x="0" y="0"/>
</canvas>
</imgdir>
<imgdir name="Gage">
<imgdir name="1">