Using HikariCP + Pet issues + Dojo skills
As Suggested by Alex-0000, migrated from DBCP to HikariCP (uses less external JARs and got a cleaner code overall). Fixed some issues regarding pets, such as evolving or hatching from egg. Added dojo skills and fixed energy bar. Added missing upgrade books on drop data.
This commit is contained in:
1 parent
99062b1bb3
commit
001125ccdb
105 files changed
+3565
-1301
No files matched your search
@@ -1,4 +1,4 @@
|
|||||||
#Wed, 23 Aug 2017 17:38:01 -0300
|
#Fri, 25 Aug 2017 21:04:38 -0300
|
||||||
|
|
||||||
|
|
||||||
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=
|
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -22,6 +22,7 @@ PQs:
|
|||||||
* Expeditions: Scarga/Horntail/Showa/Zakum/Pinkbean 100%.
|
* Expeditions: Scarga/Horntail/Showa/Zakum/Pinkbean 100%.
|
||||||
* GuildPQ 100% + Guild queue with multi-lobby systems available.
|
* GuildPQ 100% + Guild queue with multi-lobby systems available.
|
||||||
* Brand-new PQ: Boss Rush PQ 100%.
|
* Brand-new PQ: Boss Rush PQ 100%.
|
||||||
|
* Mu Lung Dojo 100%.
|
||||||
* BalrogPQ semi-functional.
|
* BalrogPQ semi-functional.
|
||||||
* Capt. Latanica remade as an event (parties can now fight the boss).
|
* Capt. Latanica remade as an event (parties can now fight the boss).
|
||||||
|
|
||||||
@@ -55,6 +56,7 @@ Server potentials:
|
|||||||
* Every monsterbook card is now droppable by overworld mobs.
|
* Every monsterbook card is now droppable by overworld mobs.
|
||||||
* Monsterbook displays drop data info conformant with the underlying DB (needs custom wz). See more on the MobBookUpdate feature.
|
* Monsterbook displays drop data info conformant with the underlying DB (needs custom wz). See more on the MobBookUpdate feature.
|
||||||
* Mastery book announcer displaying droppers of needed books of a player, read underlying DB.
|
* Mastery book announcer displaying droppers of needed books of a player, read underlying DB.
|
||||||
|
* Every skill/mastery book is now droppable by mobs.
|
||||||
* Inventory auto-gather and auto-sorting feature.
|
* Inventory auto-gather and auto-sorting feature.
|
||||||
* Enhanced AP auto-assigner: exactly matches AP with the needed for the player's current level, surplus assigned to the primary attribute.
|
* Enhanced AP auto-assigner: exactly matches AP with the needed for the player's current level, surplus assigned to the primary attribute.
|
||||||
* Added Boss HP Bar for dozens of bosses (needs provided custom wz).
|
* Added Boss HP Bar for dozens of bosses (needs provided custom wz).
|
||||||
|
|||||||
@@ -0,0 +1,453 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import packet.creators.CarnivalPackets;
|
||||||
|
import packet.creators.PacketCreator;
|
||||||
|
import client.player.Player;
|
||||||
|
import server.life.MapleLifeFactory;
|
||||||
|
import server.life.MapleMonster;
|
||||||
|
import server.life.MobSkill;
|
||||||
|
import server.life.MobSkillFactory;
|
||||||
|
import server.life.SpawnPoint;
|
||||||
|
import server.life.Spawns;
|
||||||
|
import server.maps.Field;
|
||||||
|
import server.maps.FieldObject;
|
||||||
|
import server.maps.FieldObjectType;
|
||||||
|
import server.maps.reactors.MapleReactor;
|
||||||
|
import server.maps.reactors.MapleReactorFactory;
|
||||||
|
import server.partyquest.mcpq.MCField.MCTeam;
|
||||||
|
import static server.partyquest.mcpq.MCField.MCTeam.RED;
|
||||||
|
import server.partyquest.mcpq.MCWZData.MCGuardianGenPos;
|
||||||
|
import server.partyquest.mcpq.MCWZData.MCMobGenPos;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps track of guardians and spawns in MCPQ.
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCBattlefield {
|
||||||
|
|
||||||
|
private Field map;
|
||||||
|
private MCWZData wzData;
|
||||||
|
private int numGuardiansSpawned = 0;
|
||||||
|
private int numMonstersSpawned = 0;
|
||||||
|
// These map Guardian IDs (aka codes for status) to the guardian position.
|
||||||
|
private Map<Integer, MCWZData.MCGuardianGenPos> redGuardianIdToPos = new HashMap<>();
|
||||||
|
private Map<Integer, MCWZData.MCGuardianGenPos> blueGuardianIdToPos = new HashMap<>();
|
||||||
|
// These map Reactor Object IDs to guardian objects.
|
||||||
|
private Map<Integer, MCGuardian> redReactors = new HashMap<>();
|
||||||
|
private Map<Integer, MCGuardian> blueReactors = new HashMap<>();
|
||||||
|
// used for divided maps
|
||||||
|
// we use an arraylist here for easier random element lookup.
|
||||||
|
private List<MCWZData.MCGuardianGenPos> originalRedGuardianSpawns = new ArrayList<>();
|
||||||
|
private List<MCWZData.MCGuardianGenPos> originalBlueGuardianSpawns = new ArrayList<>();
|
||||||
|
// used for undivided map
|
||||||
|
private List<MCWZData.MCGuardianGenPos> originalGuardianSpawns = new ArrayList<>();
|
||||||
|
|
||||||
|
// used for divided maps
|
||||||
|
// we use an arraylist here for easier random element lookup.
|
||||||
|
private List<MCWZData.MCMobGenPos> originalRedSpawns = new ArrayList<>();
|
||||||
|
private List<MCWZData.MCMobGenPos> originalBlueSpawns = new ArrayList<>();
|
||||||
|
// use for undivided map
|
||||||
|
private List<MCWZData.MCMobGenPos> originalUnifiedSpawns = new ArrayList<>();
|
||||||
|
|
||||||
|
private List<SpawnPoint> originalSpawns = new ArrayList<>();
|
||||||
|
private List<SpawnPoint> addedSpawns = new ArrayList<>();
|
||||||
|
|
||||||
|
public MCBattlefield(Field battleInstance) {
|
||||||
|
this.map = battleInstance;
|
||||||
|
fetchCarnivalData();
|
||||||
|
getOriginalSpawnPoints();
|
||||||
|
populateGuardianSpawns();
|
||||||
|
populateMobSpawns();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchCarnivalData() {
|
||||||
|
wzData = this.map.getMCPQData();
|
||||||
|
if (wzData == null) {
|
||||||
|
MCTracker.log("[MCPQ] Fetching carnival failed for map " + map.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getOriginalSpawnPoints() {
|
||||||
|
for (Spawns sp : this.map.getSpawnPoints()) {
|
||||||
|
originalSpawns.add((SpawnPoint) sp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateGuardianSpawns() {
|
||||||
|
for (MCWZData.MCGuardianGenPos gpos : wzData.guardianGenPosList) {
|
||||||
|
switch (gpos.team) {
|
||||||
|
case 0:
|
||||||
|
originalRedGuardianSpawns.add(gpos);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
originalBlueGuardianSpawns.add(gpos);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
originalGuardianSpawns.add(gpos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateMobSpawns() {
|
||||||
|
for (MCWZData.MCMobGenPos mpos : wzData.mobGenPosList) {
|
||||||
|
switch (mpos.team) {
|
||||||
|
case 0:
|
||||||
|
originalRedSpawns.add(mpos);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
originalBlueSpawns.add(mpos);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
originalUnifiedSpawns.add(mpos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSpawn(Player chr, int num) {
|
||||||
|
if (numMonstersSpawned > wzData.mobGenMax) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MCWZData.MCSummonMob mobToSummon = wzData.summons.get(num);
|
||||||
|
MCWZData.MCMobGenPos spawnPos = getRandomSpawnPos(chr.getMCPQTeam());
|
||||||
|
|
||||||
|
MCField.MCTeam team = chr.getMCPQTeam();
|
||||||
|
if (spawnPos == null) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spendCp = mobToSummon.spendCP;
|
||||||
|
if (spendCp > chr.getAvailableCP()) {
|
||||||
|
readdSpawn(spawnPos, team);
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chr.getMCPQField().loseCP(chr, spendCp);
|
||||||
|
this.map.broadcastMessage(CarnivalPackets.PlayerSummoned(MonsterCarnival.TAB_SPAWNS, num, chr.getName()));
|
||||||
|
numMonstersSpawned++; // TODO: AtomicInteger this
|
||||||
|
|
||||||
|
MapleMonster monster = MapleLifeFactory.getMonster(mobToSummon.id);
|
||||||
|
Point pos = new Point(spawnPos.x, spawnPos.y);
|
||||||
|
SpawnPoint sp = new SpawnPoint(monster, pos, mobToSummon.mobTime, chr.getTeam());
|
||||||
|
|
||||||
|
addedSpawns.add(sp);
|
||||||
|
updateMonsterBuffs();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void useSkill(Player chr, int num) {
|
||||||
|
if (!wzData.skills.containsKey(num)) {
|
||||||
|
MCTracker.log("Attempting to use a null skill.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int realSkill = wzData.skills.get(num);
|
||||||
|
MCSkill skill = MCSkillFactory.getMCSkill(realSkill);
|
||||||
|
// TODO: add skill cooldowns
|
||||||
|
|
||||||
|
int spendCp = skill.getSpendCP();
|
||||||
|
if (spendCp > chr.getAvailableCP()) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MCParty teamToApply = chr.getMCPQParty().getEnemy();
|
||||||
|
boolean success = teamToApply.applyMCSkill(skill);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
chr.getMCPQField().loseCP(chr, spendCp);
|
||||||
|
map.broadcastMessage(CarnivalPackets.PlayerSummoned(MonsterCarnival.TAB_DEBUFF, num, chr.getName()));
|
||||||
|
} else {
|
||||||
|
chr.getClient().getSession().write(CarnivalPackets.CarnivalMessage(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readdSpawn(MCWZData.MCMobGenPos pos, MCField.MCTeam team) {
|
||||||
|
List<MCWZData.MCMobGenPos> lst = null;
|
||||||
|
if (this.wzData.mapDivided) {
|
||||||
|
if (null == team) {
|
||||||
|
return;
|
||||||
|
} else switch (team) {
|
||||||
|
case RED:
|
||||||
|
lst = originalRedSpawns;
|
||||||
|
break;
|
||||||
|
case BLUE:
|
||||||
|
lst = originalBlueSpawns;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lst = originalUnifiedSpawns;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lst == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lst.add(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void spawnGuardian(Player chr, int num) {
|
||||||
|
if (numGuardiansSpawned > wzData.guardianGenMax) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int guardianId = wzData.guardians.get(num);
|
||||||
|
MCGuardian guardian = MCSkillFactory.getMCGuardian(guardianId);
|
||||||
|
if (guardian == null) {
|
||||||
|
MCTracker.log("Attempting to spawn invalid guardian.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MCField.MCTeam team = chr.getMCPQTeam();
|
||||||
|
if (team == MCField.MCTeam.RED) {
|
||||||
|
if (redGuardianIdToPos.containsKey(guardianId)) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(4));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (team == MCField.MCTeam.BLUE) {
|
||||||
|
if (blueGuardianIdToPos.containsKey(guardianId)) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(4));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int spendCp = guardian.getSpendCP();
|
||||||
|
if (spendCp > chr.getAvailableCP()) {
|
||||||
|
chr.getClient().announce(CarnivalPackets.CarnivalMessage(1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chr.getMCPQField().loseCP(chr, spendCp);
|
||||||
|
this.map.broadcastMessage(CarnivalPackets.PlayerSummoned(MonsterCarnival.TAB_GUARDIAN, num, chr.getName()));
|
||||||
|
numGuardiansSpawned++; // TODO: AtomicInteger this
|
||||||
|
MCWZData.MCGuardianGenPos genPos = getRandomGuardianPos(team);
|
||||||
|
Point spawnPos = new Point(genPos.x, genPos.y);
|
||||||
|
|
||||||
|
MapleReactor reactor;
|
||||||
|
if (null == team) {
|
||||||
|
return;
|
||||||
|
} else switch (team) {
|
||||||
|
case RED:
|
||||||
|
reactor = new MapleReactor(MapleReactorFactory.getReactor(MonsterCarnival.GUARDIAN_RED), MonsterCarnival.GUARDIAN_RED);
|
||||||
|
reactor.setPosition(spawnPos);
|
||||||
|
redGuardianIdToPos.put(num, genPos);
|
||||||
|
break;
|
||||||
|
case BLUE:
|
||||||
|
reactor = new MapleReactor(MapleReactorFactory.getReactor(MonsterCarnival.GUARDIAN_BLUE), MonsterCarnival.GUARDIAN_BLUE);
|
||||||
|
reactor.setPosition(spawnPos);
|
||||||
|
blueGuardianIdToPos.put(num, genPos);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
reactor.setDelay(-1);
|
||||||
|
map.spawnReactor(reactor);
|
||||||
|
|
||||||
|
if (team == MCField.MCTeam.RED) {
|
||||||
|
redReactors.put(reactor.getObjectId(), MCSkillFactory.getMCGuardian(num));
|
||||||
|
} else {
|
||||||
|
blueReactors.put(reactor.getObjectId(), MCSkillFactory.getMCGuardian(num));
|
||||||
|
}
|
||||||
|
|
||||||
|
map.setReactorState(reactor, (byte) 1);
|
||||||
|
updateMonsterBuffs();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onGuardianHit(Player chr, MapleReactor reactor) {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("STATE: " + reactor.getState());
|
||||||
|
}
|
||||||
|
MCField.MCTeam team = chr.getMCPQTeam();
|
||||||
|
if (team == MCField.MCTeam.RED && reactor.getId() == MonsterCarnival.GUARDIAN_RED) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (team == MCField.MCTeam.BLUE && reactor.getId() == MonsterCarnival.GUARDIAN_BLUE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
reactor.setState((byte) (reactor.getState() + 1));
|
||||||
|
map.broadcastMessage(PacketCreator.TriggerReactor(reactor, reactor.getState()));
|
||||||
|
|
||||||
|
if (reactor.getState() > 3) {
|
||||||
|
int reactorObjId = reactor.getObjectId();
|
||||||
|
map.destroyReactor(reactorObjId);
|
||||||
|
|
||||||
|
MCGuardian guard;
|
||||||
|
MCWZData.MCGuardianGenPos guardianGenPos;
|
||||||
|
if (team == MCField.MCTeam.RED) {
|
||||||
|
guard = blueReactors.remove(reactorObjId);
|
||||||
|
guardianGenPos = blueGuardianIdToPos.remove(guard.getType());
|
||||||
|
} else {
|
||||||
|
guard = redReactors.remove(reactorObjId);
|
||||||
|
guardianGenPos = redGuardianIdToPos.remove(guard.getType());
|
||||||
|
}
|
||||||
|
numGuardiansSpawned--;
|
||||||
|
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("Removing reactor with x = " + guardianGenPos.x);
|
||||||
|
}
|
||||||
|
if (wzData.mapDivided) {
|
||||||
|
if (team == MCField.MCTeam.RED) {
|
||||||
|
originalBlueGuardianSpawns.add(guardianGenPos);
|
||||||
|
} else {
|
||||||
|
originalRedGuardianSpawns.add(guardianGenPos);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
originalGuardianSpawns.add(guardianGenPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("Attempting to remove buff " + guard.getName());
|
||||||
|
}
|
||||||
|
updateMonsterBuffs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private MCGuardianGenPos getRandomGuardianPos(MCTeam team) {
|
||||||
|
if (this.wzData.mapDivided) {
|
||||||
|
if (null == team) {
|
||||||
|
return null;
|
||||||
|
} else switch (team) {
|
||||||
|
case RED: {
|
||||||
|
int randIndex = (int) Math.floor(Math.random() * this.originalRedGuardianSpawns.size());
|
||||||
|
return originalRedGuardianSpawns.remove(randIndex);
|
||||||
|
}
|
||||||
|
case BLUE: {
|
||||||
|
int randIndex = (int) Math.floor(Math.random() * this.originalBlueGuardianSpawns.size());
|
||||||
|
return originalBlueGuardianSpawns.remove(randIndex);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int randIndex = (int) Math.floor(Math.random() * this.originalGuardianSpawns.size());
|
||||||
|
return originalGuardianSpawns.remove(randIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private MCMobGenPos getRandomSpawnPos(MCTeam team) {
|
||||||
|
List<MCMobGenPos> lst = null;
|
||||||
|
if (this.wzData.mapDivided) {
|
||||||
|
if (null == team) {
|
||||||
|
return null;
|
||||||
|
} else switch (team) {
|
||||||
|
case RED:
|
||||||
|
lst = originalRedSpawns;
|
||||||
|
break;
|
||||||
|
case BLUE:
|
||||||
|
lst = originalBlueSpawns;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lst = originalUnifiedSpawns;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lst == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (lst.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int randIndex = (int) Math.floor(Math.random() * lst.size());
|
||||||
|
return lst.remove(randIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMonsterBuffs() {
|
||||||
|
List<MCGuardian> redGuardians = new ArrayList<>();
|
||||||
|
List<MCGuardian> blueGuardians = new ArrayList<>();
|
||||||
|
|
||||||
|
for (MCGuardian g : this.redReactors.values()) {
|
||||||
|
redGuardians.add(g);
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("update buff red " + g.getMobSkillID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (MCGuardian g : this.blueReactors.values()) {
|
||||||
|
blueGuardians.add(g);
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("update buff blue " + g.getMobSkillID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (FieldObject mmo : map.getAllMonsters()) {
|
||||||
|
if (mmo.getType() == FieldObjectType.MONSTER) {
|
||||||
|
MapleMonster mob = ((MapleMonster) mmo);
|
||||||
|
mob.dispel();
|
||||||
|
|
||||||
|
if (mob.getTeam() == MCField.MCTeam.RED.code) {
|
||||||
|
applyGuardians(mob, redGuardians);
|
||||||
|
} else if (mob.getTeam() == MCField.MCTeam.BLUE.code) {
|
||||||
|
applyGuardians(mob, blueGuardians);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Attempting to give guardians to mob without team.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void giveMonsterBuffs(MapleMonster mob) {
|
||||||
|
List<MCGuardian> redGuardians = new ArrayList<>();
|
||||||
|
List<MCGuardian> blueGuardians = new ArrayList<>();
|
||||||
|
|
||||||
|
for (MCGuardian g : this.redReactors.values()) {
|
||||||
|
redGuardians.add(g);
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("update buff red " + g.getMobSkillID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (MCGuardian g : this.blueReactors.values()) {
|
||||||
|
blueGuardians.add(g);
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("update buff blue " + g.getMobSkillID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mob.getTeam() == MCField.MCTeam.RED.code) {
|
||||||
|
applyGuardians(mob, redGuardians);
|
||||||
|
} else if (mob.getTeam() == MCField.MCTeam.BLUE.code) {
|
||||||
|
applyGuardians(mob, blueGuardians);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Attempting to give guardians to mob without team.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyGuardians(MapleMonster mob, List<MCGuardian> guardians) {
|
||||||
|
for (MCGuardian g : guardians) {
|
||||||
|
MobSkill sk = MobSkillFactory.getMobSkill(g.getMobSkillID(), g.getLevel());
|
||||||
|
sk.applyEffect(null, mob, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void spawningTask() {
|
||||||
|
for (SpawnPoint sp : originalSpawns) {
|
||||||
|
if (sp.shouldSpawn()) {
|
||||||
|
MapleMonster mob = sp.spawnMonster(this.map);
|
||||||
|
giveMonsterBuffs(mob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (SpawnPoint sp : addedSpawns) {
|
||||||
|
if (sp.shouldSpawn()) {
|
||||||
|
MapleMonster mob = sp.spawnMonster(this.map);
|
||||||
|
giveMonsterBuffs(mob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,850 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import handling.channel.ChannelServer;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ScheduledFuture;
|
||||||
|
import packet.creators.CarnivalPackets;
|
||||||
|
import packet.creators.EffectPackets;
|
||||||
|
import packet.creators.PacketCreator;
|
||||||
|
import packet.transfer.write.OutPacket;
|
||||||
|
import client.player.Player;
|
||||||
|
import server.MapleStatEffect;
|
||||||
|
import server.itens.MapleItemInformationProvider;
|
||||||
|
import server.maps.Field;
|
||||||
|
import server.maps.FieldItem;
|
||||||
|
import server.maps.reactors.MapleReactor;
|
||||||
|
import server.maps.portal.Portal;
|
||||||
|
import tools.TimerTools.EventTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps track of a specific field (1-6). Handles all packet broadcasting, etc.
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCField {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Different teams for MCPQ.
|
||||||
|
*/
|
||||||
|
public enum MCTeam {
|
||||||
|
RED(0),
|
||||||
|
BLUE(1),
|
||||||
|
NONE(-1);
|
||||||
|
public final int code;
|
||||||
|
|
||||||
|
MCTeam(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getEnemyTeamCode() {
|
||||||
|
return Math.abs(this.code - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the current state of the field.
|
||||||
|
*/
|
||||||
|
public enum MCState {
|
||||||
|
LOBBY,
|
||||||
|
BATTLE,
|
||||||
|
END;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keys to access different map instances relating to this field.
|
||||||
|
*/
|
||||||
|
public enum MCMaps {
|
||||||
|
LOBBY(0),
|
||||||
|
BATTLEFIELD(1),
|
||||||
|
RESURRECT(2),
|
||||||
|
VICTORY(3),
|
||||||
|
DEFEAT(4),
|
||||||
|
NONE(-1);
|
||||||
|
private final int code;
|
||||||
|
|
||||||
|
MCMaps(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MCMaps getByCode(int code) {
|
||||||
|
for (MCMaps m : values()) {
|
||||||
|
if (m.code == code) {
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int arena;
|
||||||
|
private ChannelServer cserv;
|
||||||
|
private MCParty red, blue;
|
||||||
|
private List<MCParty> requests = new ArrayList<>();
|
||||||
|
private MCState state;
|
||||||
|
private Map<MCMaps, Field> mapInstances = new HashMap<>();
|
||||||
|
private long startTime;
|
||||||
|
private MCBattlefield battlefield;
|
||||||
|
|
||||||
|
// Timer Tasks
|
||||||
|
private ScheduledFuture<?> acceptRequestsTask, validateRoomTask, startBattleTask,
|
||||||
|
validateBattleTask, runBattleTask, endBattleTask,
|
||||||
|
spawnMonstersTask;
|
||||||
|
|
||||||
|
public MCField(int arena, ChannelServer cserv, MCParty red, MCParty blue) {
|
||||||
|
this.arena = arena;
|
||||||
|
this.cserv = cserv;
|
||||||
|
this.red = red;
|
||||||
|
this.blue = blue;
|
||||||
|
this.state = MCState.LOBBY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFull() {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this.red != null && this.blue != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean needsRequest() {
|
||||||
|
return this.red != null && this.blue == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the state of the field, warping out players and resetting tasks.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m warpPlayers Warp out players or not
|
||||||
|
* @param warpPlayers
|
||||||
|
*/
|
||||||
|
public void deregister(boolean warpPlayers) {
|
||||||
|
if (warpPlayers) {
|
||||||
|
if (this.red != null) {
|
||||||
|
this.red.deregisterPlayers();
|
||||||
|
}
|
||||||
|
if (this.blue != null) {
|
||||||
|
this.blue.deregisterPlayers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.red = null;
|
||||||
|
this.blue = null;
|
||||||
|
this.requests.clear();
|
||||||
|
this.state = MCState.LOBBY;
|
||||||
|
|
||||||
|
if (this.acceptRequestsTask != null) {
|
||||||
|
this.acceptRequestsTask.cancel(true);
|
||||||
|
this.acceptRequestsTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.validateRoomTask != null) {
|
||||||
|
this.validateRoomTask.cancel(true);
|
||||||
|
this.validateRoomTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.startBattleTask != null) {
|
||||||
|
this.startBattleTask.cancel(true);
|
||||||
|
this.startBattleTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.endBattleTask != null) {
|
||||||
|
this.endBattleTask.cancel(true);
|
||||||
|
this.endBattleTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.runBattleTask != null) {
|
||||||
|
this.runBattleTask.cancel(true);
|
||||||
|
this.runBattleTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.validateBattleTask != null) {
|
||||||
|
this.validateBattleTask.cancel(true);
|
||||||
|
this.validateBattleTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.spawnMonstersTask != null) {
|
||||||
|
this.spawnMonstersTask.cancel(true);
|
||||||
|
this.spawnMonstersTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MCMaps mapType : MCMaps.values()) {
|
||||||
|
this.mapInstances.remove(mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MCParty getRed() {
|
||||||
|
return red;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MCParty getBlue() {
|
||||||
|
return blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void announce(OutPacket pkt) {
|
||||||
|
if (this.red != null) {
|
||||||
|
red.broadcast(pkt);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Trying to announce packet to red when it is null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.blue != null) {
|
||||||
|
blue.broadcast(pkt);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Trying to announce packet to blue when it is null.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a string representing the status of this room for the Spiegelmann NPC.
|
||||||
|
* [MENTION=850422]return[/MENTION] String representing the room's status.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getStatus() {
|
||||||
|
if (isFull()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (this.state != MCState.LOBBY) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String waitingParty = "";
|
||||||
|
if (this.red != null) {
|
||||||
|
String fmt = " <Party Size: %d, Average Level: %d>";
|
||||||
|
waitingParty = String.format(fmt, this.red.getSize(), this.red.getAverageLevel());
|
||||||
|
}
|
||||||
|
String fmt = "#L%d#Carnival Field %d%s#l\r\n";
|
||||||
|
return String.format(fmt, this.arena, this.arena, waitingParty);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to register a party in this field. If success, then all players in the party
|
||||||
|
* will be warped to the waiting lobby. All players in the party will also have relevant
|
||||||
|
* CPQ information assigned to them.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m party The party to register.
|
||||||
|
*/
|
||||||
|
public void register(MCParty party, MCTeam team) {
|
||||||
|
if (this.red == null && team == MCTeam.RED) {
|
||||||
|
party.setTeam(team);
|
||||||
|
this.red = party;
|
||||||
|
} else if (this.blue == null && team == MCTeam.BLUE) {
|
||||||
|
party.setTeam(team);
|
||||||
|
this.blue = party;
|
||||||
|
} else {
|
||||||
|
MCTracker.log("Attempting to register party when team is already set.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
party.setField(this);
|
||||||
|
party.updatePlayers();
|
||||||
|
party.warp(MCMaps.LOBBY);
|
||||||
|
onPartyRegistered(party, team);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a challenge to the party in this field.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m party The party requesting a challenge.
|
||||||
|
*/
|
||||||
|
public void request(MCParty party) {
|
||||||
|
if (this.red == null) {
|
||||||
|
MCTracker.log("Attempting to request when waiting team is null.");
|
||||||
|
this.deregister(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
requests.add(party);
|
||||||
|
this.red.notice("[MCPQ] A challenge has arrived! Click on the Assistant in your room to view it.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a challenge from a team.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m index Index of team in requests.
|
||||||
|
* [MENTION=850422]return[/MENTION] 1 if the challenge was accepted successfully, 0 otherwise.
|
||||||
|
*/
|
||||||
|
public int acceptRequest(int index) {
|
||||||
|
MCParty toAccept = this.requests.get(index);
|
||||||
|
register(toAccept, MCTeam.BLUE);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for pending requests.
|
||||||
|
*
|
||||||
|
* [MENTION=850422]return[/MENTION] True if there are pending requests.
|
||||||
|
*/
|
||||||
|
public boolean hasPendingRequests() {
|
||||||
|
return requests.size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a pending list of requests, formatted for use in a NPC. Also cleans up the requests,
|
||||||
|
* getting rid of MCParties that no longer exist.
|
||||||
|
*
|
||||||
|
* [MENTION=850422]return[/MENTION] Formatted list of requests for NPC.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getNPCRequestString() {
|
||||||
|
StringBuilder sb = new StringBuilder("Here is the list of pending requests:\r\n\r\n#b");
|
||||||
|
for (MCParty pty : requests) {
|
||||||
|
if (!pty.exists()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sb.append("#L").append(requests.indexOf(pty)).append("#");
|
||||||
|
String fmt = "<Party Size: %d, Average Level: %d>";
|
||||||
|
fmt = String.format(fmt, pty.getSize(), pty.getAverageLevel());
|
||||||
|
sb.append(fmt);
|
||||||
|
sb.append("#l\r\n");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a R3 minute waiting timer in the lobby for teams to accept requests.
|
||||||
|
* If the timer completes the countdown, teams are deregistered and sent back to the lobby.
|
||||||
|
*/
|
||||||
|
private void startLobbyTask(MCParty host) {
|
||||||
|
host.clock(MonsterCarnival.TIME_LOBBYWAIT);
|
||||||
|
this.acceptRequestsTask = EventTimer.getInstance().schedule(new AcceptingRequestsTask(this, host), 1000 * MonsterCarnival.TIME_LOBBYWAIT); // 3 minutes
|
||||||
|
this.validateRoomTask = EventTimer.getInstance().register(new ValidateLobbyTask(this), 1000, 1000); // repeat every second
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handling for when a team registers.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m party Party that registers.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m team Team of party.
|
||||||
|
*/
|
||||||
|
private void onPartyRegistered(MCParty party, MCTeam team) {
|
||||||
|
if (team == MCTeam.RED) {
|
||||||
|
startLobbyTask(party);
|
||||||
|
}
|
||||||
|
if (team == MCTeam.BLUE) { // both teams are in
|
||||||
|
this.validateRoomTask.cancel(true);
|
||||||
|
this.acceptRequestsTask.cancel(true);
|
||||||
|
blue.clock(10);
|
||||||
|
red.clock(10);
|
||||||
|
|
||||||
|
this.startBattleTask = EventTimer.getInstance().schedule(new GoBattlefieldTask(this), 1000 * 10); // 10 seconds
|
||||||
|
|
||||||
|
red.notice("[MCPQ] The Carnival PQ will start in 10 seconds!");
|
||||||
|
blue.notice("[MCPQ] The Carnival PQ will start in 10 seconds!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warps both parties in the field to the battlefield map.
|
||||||
|
*/
|
||||||
|
private void goBattle() {
|
||||||
|
Field map = getMap(MCMaps.BATTLEFIELD);
|
||||||
|
if (MonsterCarnival.DEBUG)
|
||||||
|
System.out.println("warping to battle " + map + " " + map.getId());
|
||||||
|
if (red != null) {
|
||||||
|
red.warp(map, "red00");
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Trying to warp red party when it is null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blue != null) {
|
||||||
|
blue.warp(map, "blue00");
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Trying to warp blue party when it is null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
red.clock(MonsterCarnival.TIME_PREBATTLE);
|
||||||
|
blue.clock(MonsterCarnival.TIME_PREBATTLE);
|
||||||
|
|
||||||
|
red.notice("[MCPQ] The battle will start in 10 seconds!");
|
||||||
|
blue.notice("[MCPQ] The battle will start in 10 seconds!");
|
||||||
|
|
||||||
|
startBattleTask = EventTimer.getInstance().schedule(new BeginCarnivalTask(this), 1000 * MonsterCarnival.TIME_PREBATTLE); // 10 seconds
|
||||||
|
|
||||||
|
validateBattleTask = EventTimer.getInstance().register(new ValidateBattlefieldTask(this), 1000, 500); // check every second
|
||||||
|
|
||||||
|
battlefield = new MCBattlefield(getMap(MCMaps.BATTLEFIELD));
|
||||||
|
|
||||||
|
red.setEnemy(blue);
|
||||||
|
blue.setEnemy(red);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void beginCarnival() {
|
||||||
|
red.clock(MonsterCarnival.TIME_BATTLE);
|
||||||
|
blue.clock(MonsterCarnival.TIME_BATTLE);
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
getMap(MCMaps.BATTLEFIELD).broadcastMessage(PacketCreator.ServerNotice(6, "[MCPQ] You have 10 minutes to kill monsters!"));
|
||||||
|
|
||||||
|
endBattleTask = EventTimer.getInstance().schedule(new EndBattleTask(this), 1000 * MonsterCarnival.TIME_BATTLE);
|
||||||
|
spawnMonstersTask = EventTimer.getInstance().register(new SpawnTask(this.battlefield), 1000 * 5);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endBattle(MCParty winner, MCParty loser) {
|
||||||
|
endBattle(winner, loser, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endBattle(MCParty winner, MCParty loser, boolean abnormal) {
|
||||||
|
// TODO: Abnormal win codes to prevent exploits
|
||||||
|
|
||||||
|
validateBattleTask.cancel(true);
|
||||||
|
spawnMonstersTask.cancel(true);
|
||||||
|
|
||||||
|
MCWZData cpqData = this.getMap(MCMaps.BATTLEFIELD).getMCPQData();
|
||||||
|
String effectWin = cpqData.effectWin;
|
||||||
|
String effectLose = cpqData.effectLose;
|
||||||
|
String soundWin = cpqData.soundWin;
|
||||||
|
String soundLose = cpqData.soundLose;
|
||||||
|
|
||||||
|
winner.broadcast(EffectPackets.ShowEffect(effectWin));
|
||||||
|
winner.broadcast(EffectPackets.PlaySound(soundWin));
|
||||||
|
loser.broadcast(EffectPackets.ShowEffect(effectLose));
|
||||||
|
loser.broadcast(EffectPackets.PlaySound(soundLose));
|
||||||
|
|
||||||
|
this.getMap(MCMaps.BATTLEFIELD).killAllMonsters(false);
|
||||||
|
this.getMap(MCMaps.BATTLEFIELD).clearDrops();
|
||||||
|
this.deregister(false);
|
||||||
|
|
||||||
|
EventTimer.getInstance().schedule(new WarpEndBattleTask(this, winner, loser), 1000 * 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles CP gain and packet updates when a monster is killed.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m chr Character that kills the monster.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m cp CP gained.
|
||||||
|
*/
|
||||||
|
public void monsterKilled(Player chr, int cp) {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
// System.out.println(chr.getName() + " killed for +" + cp + " CP");
|
||||||
|
}
|
||||||
|
// TODO: Personal stats for CP gain
|
||||||
|
this.gainCP(chr, cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles game logic and packet broadcasting for CP gain.
|
||||||
|
* Broadcasts personal CP update to chr, and broadcasts party CP update
|
||||||
|
* to the entire field.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m chr Character that gains CP.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m cp CP gained.
|
||||||
|
*/
|
||||||
|
public void gainCP(Player chr, int cp) {
|
||||||
|
if (cp < 0) {
|
||||||
|
MCTracker.log("[MCPQ] Adding negative CP.");
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("Adding negative CP: stacktrace");
|
||||||
|
new Exception().printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MCParty pty = chr.getMCPQParty();
|
||||||
|
chr.gainCP(cp);
|
||||||
|
pty.gainCP(cp);
|
||||||
|
chr.getClient().announce(CarnivalPackets.UpdatePersonalCP(chr));
|
||||||
|
this.announce(CarnivalPackets.UpdatePartyCP(pty));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subtracts from available CP while leaving total CP untouched.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m chr Character that loses CP.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m cp CP lost (should be positive number).
|
||||||
|
*/
|
||||||
|
public void loseCP(Player chr, int cp) {
|
||||||
|
if (cp < 0) {
|
||||||
|
MCTracker.log("[MCPQ] Losing negative CP.");
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
System.out.println("Adding negative CP: stacktrace");
|
||||||
|
new Exception().printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MCParty pty = chr.getMCPQParty();
|
||||||
|
chr.loseCP(cp);
|
||||||
|
pty.loseCP(cp);
|
||||||
|
chr.getClient().announce(CarnivalPackets.UpdatePersonalCP(chr));
|
||||||
|
this.announce(CarnivalPackets.UpdatePartyCP(pty));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles a player looting an item.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m player Player that picked up the object.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m mapitem Object picked up.
|
||||||
|
*
|
||||||
|
* [MENTION=850422]return[/MENTION] True if pickup was successful, false otherwise.
|
||||||
|
*/
|
||||||
|
public boolean onItemPickup(Player player, FieldItem mapitem) {
|
||||||
|
if (mapitem == null) {
|
||||||
|
MCTracker.log("[MCPQ] Attempting to loot null object.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int itemid = mapitem.getItem().getItemId();
|
||||||
|
if (!MonsterCarnival.isCPQConsumeItem(itemid)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MCParty pty = player.getMCPQParty();
|
||||||
|
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||||
|
MapleStatEffect itemEffect = ii.getItemEffect(itemid);
|
||||||
|
if (!itemEffect.isConsumeOnPickup()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemEffect.isParty()) {
|
||||||
|
for (Player chr : pty.getMembers()) {
|
||||||
|
if (chr.getStat().getCurrentHp() > 0) {
|
||||||
|
itemEffect.applyTo(chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // Single Target Item
|
||||||
|
itemEffect.applyTo(player);
|
||||||
|
}
|
||||||
|
// Status items
|
||||||
|
if (itemEffect.getNuffSkill() != -1) {
|
||||||
|
MCSkill debuff = MCSkillFactory.getMCSkill(itemEffect.getNuffSkill());
|
||||||
|
if (debuff == null) {
|
||||||
|
MCTracker.log("[MCPQ] debuff skill is null " + itemEffect.getNuffSkill());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pty.getEnemy().applyMCSkill(debuff);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemEffect.getCP() > 0) {
|
||||||
|
this.gainCP(player, itemEffect.getCP());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerRespawn(Player player) {
|
||||||
|
int cpLoss = Math.min(player.getAvailableCP(), MonsterCarnival.CP_LOSS_ON_DEATH);
|
||||||
|
this.announce(CarnivalPackets.PlayerDiedMessage(player, cpLoss));
|
||||||
|
this.loseCP(player, cpLoss);
|
||||||
|
player.getStat().addMPHP(30000, 30000);
|
||||||
|
player.changeMap(this.getMap(MCMaps.RESURRECT), this.getMap(MCMaps.RESURRECT).getPortal(0));
|
||||||
|
player.getClient().getSession().write(PacketCreator.GetClock(getTimeRemaining()));
|
||||||
|
player.getClient().getSession().write(CarnivalPackets.StartMonsterCarnival(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerDisconnected(Player player) {
|
||||||
|
MCParty pty = player.getMCPQParty();
|
||||||
|
if (pty != null) {
|
||||||
|
pty.removePlayer(player);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Attempting to run player disconnect event when party is null for character " + player.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onAddSpawn(Player chr, int num) {
|
||||||
|
if (this.battlefield != null) {
|
||||||
|
battlefield.addSpawn(chr, num);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Summoning guardian with null battlefield.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onUseSkill(Player chr, int num) {
|
||||||
|
if (this.battlefield != null) {
|
||||||
|
battlefield.useSkill(chr, num);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Summoning guardian with null battlefield.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onGuardianSummon(Player chr, int num) {
|
||||||
|
if (this.battlefield != null) {
|
||||||
|
battlefield.spawnGuardian(chr, num);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Summoning guardian with null battlefield.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onGuardianHit(Player chr, MapleReactor reactor) {
|
||||||
|
if (this.battlefield != null) {
|
||||||
|
battlefield.onGuardianHit(chr, reactor);
|
||||||
|
} else {
|
||||||
|
MCTracker.log("[MCPQ] Hitting reactor with null battlefield.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onRevive(Player player) {
|
||||||
|
MCTeam team = player.getMCPQTeam();
|
||||||
|
Portal portal;
|
||||||
|
if (team == MCTeam.RED) {
|
||||||
|
portal = getMap(MCMaps.BATTLEFIELD).getPortal("red_revive");
|
||||||
|
} else {
|
||||||
|
portal = getMap(MCMaps.BATTLEFIELD).getPortal("blue_revive");
|
||||||
|
}
|
||||||
|
|
||||||
|
player.changeMap(getMap(MCMaps.BATTLEFIELD), portal);
|
||||||
|
player.getClient().getSession().write(PacketCreator.GetClock(getTimeRemaining()));
|
||||||
|
player.getClient().getSession().write(CarnivalPackets.StartMonsterCarnival(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTimeRemaining() {
|
||||||
|
// TODO: add support for setting an explicit endTime instead of using the hack with MonsterCarnival variables
|
||||||
|
return (int) ((startTime + 1000 * MonsterCarnival.TIME_BATTLE) - System.currentTimeMillis()) / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Map Instances
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the map instance for a requested map. Creates a new map instance if unavailable.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m type Map instance to return.
|
||||||
|
* [MENTION=850422]return[/MENTION] The instanced map.
|
||||||
|
*/
|
||||||
|
public Field getMap(MCMaps type) {
|
||||||
|
if (this.mapInstances.containsKey(type)) {
|
||||||
|
return this.mapInstances.get(type);
|
||||||
|
}
|
||||||
|
return createInstanceMap(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to create an instanced map, based on the type passed in. Also creates a mapping in
|
||||||
|
* this.mapInstances.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m type Type of map to generate.
|
||||||
|
* [MENTION=850422]return[/MENTION] MapleMap for the instanced map if type is supported, otherwise null.
|
||||||
|
*/
|
||||||
|
private Field createInstanceMap(MCMaps type) {
|
||||||
|
int mapid = -1;
|
||||||
|
switch (type) {
|
||||||
|
case LOBBY:
|
||||||
|
mapid = MonsterCarnival.getLobbyMap(this.arena);
|
||||||
|
break;
|
||||||
|
case BATTLEFIELD:
|
||||||
|
mapid = MonsterCarnival.getBattleFieldMap(this.arena);
|
||||||
|
break;
|
||||||
|
case RESURRECT:
|
||||||
|
mapid = MonsterCarnival.getResurrectionMap(this.arena);
|
||||||
|
break;
|
||||||
|
case VICTORY:
|
||||||
|
mapid = MonsterCarnival.getVictoriousMap(this.arena);
|
||||||
|
break;
|
||||||
|
case DEFEAT:
|
||||||
|
mapid = MonsterCarnival.getDefeatedMap(this.arena);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mapid == -1) return null;
|
||||||
|
Field mapInstance = this.cserv.getMapFactory().instanceMap(mapid, true, true);
|
||||||
|
this.mapInstances.put(type, mapInstance);
|
||||||
|
return mapInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timer Tasks
|
||||||
|
|
||||||
|
public class ValidateLobbyTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timer task to ensure all players are on the right field.
|
||||||
|
* If anything is wrong with the parties, the field is deregistered.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m field Field to run the validation task on.
|
||||||
|
* @param field
|
||||||
|
*/
|
||||||
|
public ValidateLobbyTask(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (this.field.red == null) {
|
||||||
|
this.field.deregister(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (Player c : field.red.getMembers()) {
|
||||||
|
if (c.getMap() != field.getMap(MCMaps.LOBBY)) {
|
||||||
|
this.field.deregister(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.field.blue != null) {
|
||||||
|
for (Player c : field.blue.getMembers()) {
|
||||||
|
if (c.getMap() != field.getMap(MCMaps.LOBBY)) {
|
||||||
|
this.field.deregister(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ValidateBattlefieldTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timer task to ensure all players are on the right field.
|
||||||
|
* If anything is wrong with the parties, the field is deregistered.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m field Field to run the validation task on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public ValidateBattlefieldTask(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (this.field.red == null || field.red.getSize() == 0) {
|
||||||
|
MCTracker.log("[MCPQ] Red team null when validating battlefield");
|
||||||
|
field.endBattle(blue, red);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Collection<Player> members = Collections.unmodifiableCollection(field.red.getMembers());
|
||||||
|
for (Player c : members) {
|
||||||
|
if (c.getMap() != field.getMap(MCMaps.BATTLEFIELD) && c.getMap() != field.getMap(MCMaps.RESURRECT)) {
|
||||||
|
this.field.announce(CarnivalPackets.CarnivalLeave(MCTeam.RED.code, c.getName()));
|
||||||
|
red.removePlayer(c); // TODO: fix concurrent modification
|
||||||
|
}
|
||||||
|
if (c.getMap() == field.getMap(MCMaps.BATTLEFIELD) && !c.isAlive()) {
|
||||||
|
this.field.onPlayerRespawn(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.field.blue == null || field.blue.getSize() == 0) {
|
||||||
|
MCTracker.log("[MCPQ] Blue team null when validating battlefield");
|
||||||
|
field.endBattle(red, blue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
members = Collections.unmodifiableCollection(field.blue.getMembers());
|
||||||
|
for (Player c : members) {
|
||||||
|
if (c.getMap() != field.getMap(MCMaps.BATTLEFIELD) && c.getMap() != field.getMap(MCMaps.RESURRECT)) {
|
||||||
|
this.field.announce(CarnivalPackets.CarnivalLeave(MCTeam.BLUE.code, c.getName()));
|
||||||
|
blue.removePlayer(c);
|
||||||
|
}
|
||||||
|
if (c.getMap() == field.getMap(MCMaps.BATTLEFIELD) && !c.isAlive()) {
|
||||||
|
this.field.onPlayerRespawn(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AcceptingRequestsTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
private final MCParty host;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs a task that counts down for 3 minutes, then warps the hosting party out.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m field Field to accept requests on.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m host Hosting party that will be warped out if they do not accept a request
|
||||||
|
* within 3 minutes.
|
||||||
|
*/
|
||||||
|
public AcceptingRequestsTask(MCField field, MCParty host) {
|
||||||
|
this.field = field;
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Collection<Player> chrs = this.host.getMembers();
|
||||||
|
for (Player c : chrs) {
|
||||||
|
c.changeMap(MonsterCarnival.MAP_LOBBY);
|
||||||
|
}
|
||||||
|
this.field.deregister(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GoBattlefieldTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
|
||||||
|
public GoBattlefieldTask(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
field.goBattle();
|
||||||
|
|
||||||
|
field.red.startBattle();
|
||||||
|
field.blue.startBattle();
|
||||||
|
|
||||||
|
field.state = MCState.BATTLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BeginCarnivalTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
|
||||||
|
public BeginCarnivalTask(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Field map = field.getMap(MCMaps.BATTLEFIELD);
|
||||||
|
map.beginSpawning();
|
||||||
|
field.beginCarnival();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* I have no idea why this doesn't work normally :/ */
|
||||||
|
public class SpawnTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCBattlefield battleMap;
|
||||||
|
|
||||||
|
public SpawnTask(MCBattlefield field) {
|
||||||
|
this.battleMap = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// TODO: adjust spawn rates based on cp
|
||||||
|
battleMap.spawningTask();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EndBattleTask implements Runnable {
|
||||||
|
private final MCField field;
|
||||||
|
|
||||||
|
public EndBattleTask(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
MCParty winner, loser;
|
||||||
|
if (field.red.getTotalCP() > field.blue.getTotalCP()) {
|
||||||
|
winner = field.red;
|
||||||
|
loser = field.blue;
|
||||||
|
} else if (field.red.getTotalCP() < field.blue.getTotalCP()) {
|
||||||
|
winner = field.blue;
|
||||||
|
loser = field.red;
|
||||||
|
} else {
|
||||||
|
// if tied: random chance
|
||||||
|
// TODO: proper extension of time
|
||||||
|
if (Math.random() < .5) {
|
||||||
|
winner = field.red;
|
||||||
|
loser = field.blue;
|
||||||
|
} else {
|
||||||
|
winner = field.blue;
|
||||||
|
loser = field.red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
field.state = MCState.END;
|
||||||
|
field.endBattle(winner, loser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class WarpEndBattleTask implements Runnable {
|
||||||
|
|
||||||
|
private final MCField field;
|
||||||
|
private final MCParty winner, loser;
|
||||||
|
|
||||||
|
public WarpEndBattleTask(MCField field, MCParty winner, MCParty loser) {
|
||||||
|
this.field = field;
|
||||||
|
this.winner = winner;
|
||||||
|
this.loser = loser;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
winner.warp(field.getMap(MCMaps.VICTORY));
|
||||||
|
loser.warp(field.getMap(MCMaps.DEFEAT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object representing MCGuardian in Skill.wz/MCGuardian.img.
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MCGuardian {
|
||||||
|
private final int type, spendCP, mobSkillID, level;
|
||||||
|
private String name, desc;
|
||||||
|
|
||||||
|
public MCGuardian(int type, int spendCP, int mobSkillID, int level) {
|
||||||
|
this.type = type;
|
||||||
|
this.mobSkillID = mobSkillID;
|
||||||
|
this.level = level;
|
||||||
|
this.spendCP = spendCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSpendCP() {
|
||||||
|
return spendCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMobSkillID() {
|
||||||
|
return mobSkillID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLevel() {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDesc(String desc) {
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,315 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import community.MapleParty;
|
||||||
|
import community.MaplePartyCharacter;
|
||||||
|
import handling.channel.ChannelServer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import packet.creators.CarnivalPackets;
|
||||||
|
import packet.creators.PacketCreator;
|
||||||
|
import packet.transfer.write.OutPacket;
|
||||||
|
import client.player.Player;
|
||||||
|
import client.player.buffs.Disease;
|
||||||
|
import server.life.MobSkill;
|
||||||
|
import server.life.MobSkillFactory;
|
||||||
|
import server.maps.Field;
|
||||||
|
import server.partyquest.mcpq.MCField.MCTeam;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sammy Guergachi <sguergachi at gmail.com>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Provides an interface for Monster Carnival-specific party methods and variables.
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCParty {
|
||||||
|
|
||||||
|
private MapleParty party;
|
||||||
|
private List<Player> characters = new ArrayList<>();
|
||||||
|
private int availCP = 0;
|
||||||
|
private int totalCP = 0;
|
||||||
|
private MCField.MCTeam team = MCField.MCTeam.NONE;
|
||||||
|
private MCField field;
|
||||||
|
private MCParty enemy;
|
||||||
|
|
||||||
|
public MCParty(MapleParty party) {
|
||||||
|
this.party = party;
|
||||||
|
for (MaplePartyCharacter chr : party.getMembers()) {
|
||||||
|
if (!chr.isOnline()) continue;
|
||||||
|
Player c = ChannelServer.getInstance(chr.getChannel()).getPlayerStorage().getCharacterById(chr.getId());
|
||||||
|
|
||||||
|
characters.add(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return this.characters.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the underlying MapleParty still exists in the same way it did when it was created.
|
||||||
|
* That is, if there were no players who left the party.
|
||||||
|
*
|
||||||
|
* [MENTION=850422]return[/MENTION] True if the underlying MapleParty still exists in its original format.
|
||||||
|
*/
|
||||||
|
public boolean exists() {
|
||||||
|
Collection<Player> members = getMembers();
|
||||||
|
for (Player chr : members) {
|
||||||
|
if (chr.getParty() == null || chr.getParty() != this.party) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAverageLevel() {
|
||||||
|
int sum = 0, num = 0;
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
sum += chr.getLevel();
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
return sum / num;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkLevels() {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
int lv = chr.getLevel();
|
||||||
|
if (lv < MonsterCarnival.MIN_LEVEL || lv > MonsterCarnival.MAX_LEVEL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkChannels() {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
if (chr.getClient().getChannel() != party.getLeader().getChannel()) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkMaps() {
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
if (chr.getMapId() != MonsterCarnival.MAP_LOBBY) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warp(int map) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.changeMap(map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warp(Field map) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.changeMap(map, map.getPortal(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warp(Field map, String portal) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.changeMap(map, map.getPortal(portal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warp(MCField.MCMaps type) {
|
||||||
|
Field m = this.field.getMap(type);
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.changeMap(m, m.getPortal(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clock(int secs) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.getClient().announce(PacketCreator.GetClock(secs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notice(String msg) {
|
||||||
|
broadcast(PacketCreator.ServerNotice(6, msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void broadcast(OutPacket pkt) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
chr.getClient().announce(pkt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets MCPQTeam, MCPQParty, and MCPQField for a given character.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m chr Character to update.
|
||||||
|
*/
|
||||||
|
public void updatePlayer(Player chr) {
|
||||||
|
chr.setMCPQTeam(this.team);
|
||||||
|
chr.setMCPQParty(this);
|
||||||
|
chr.setMCPQField(this.field);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets MCPQTeam, MCPQParty, and MCPQ field for all characters in the party.
|
||||||
|
* Unlike deregisterPlayers, this method does NOT warp players to the lobby map.
|
||||||
|
*/
|
||||||
|
public void updatePlayers() {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
this.updatePlayer(chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets MCPQ variables for a given character.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m chr Character to reset.
|
||||||
|
*/
|
||||||
|
public static void deregisterPlayer(Player chr) {
|
||||||
|
chr.setMCPQTeam(MCTeam.NONE);
|
||||||
|
chr.setMCPQParty(null);
|
||||||
|
chr.setMCPQField(null);
|
||||||
|
|
||||||
|
chr.setAvailableCP(0);
|
||||||
|
chr.setTotalCP(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets MCPQ variables for all characters in the party.
|
||||||
|
* Unlike updatePlayers, this method DOES warp players to the lobby map.
|
||||||
|
*/
|
||||||
|
public void deregisterPlayers() {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
MCParty.deregisterPlayer(chr);
|
||||||
|
chr.changeMap(MonsterCarnival.MAP_EXIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removePlayer(Player chr) {
|
||||||
|
characters.remove(chr);
|
||||||
|
deregisterPlayer(chr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startBattle() {
|
||||||
|
for (Player chr : characters) {
|
||||||
|
chr.getClient().getSession().write(CarnivalPackets.StartMonsterCarnival(chr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses some amount of available CP.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m use A positive integer to be subtracted from available CP.
|
||||||
|
*/
|
||||||
|
public void loseCP(int use) {
|
||||||
|
// TODO: locks?
|
||||||
|
if (use < 0) {
|
||||||
|
System.err.println("Attempting to use negative CP.");
|
||||||
|
}
|
||||||
|
this.availCP -= use;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void gainCP(int gain) {
|
||||||
|
// TODO: locks?
|
||||||
|
this.availCP += gain;
|
||||||
|
this.totalCP += gain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MCParty getEnemy() {
|
||||||
|
return enemy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnemy(MCParty enemy) {
|
||||||
|
this.enemy = enemy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies a MCSkill to the entire team. This is used on the team's own players
|
||||||
|
* because it is called when the enemy team uses a debuff/cube of darkness.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m skill Skill to apply.
|
||||||
|
* [MENTION=850422]return[/MENTION] True if skill was applied, false otherwise.
|
||||||
|
*/
|
||||||
|
public boolean applyMCSkill(MCSkill skill) {
|
||||||
|
MobSkill s = MobSkillFactory.getMobSkill(skill.getMobSkillID(), skill.getLevel());
|
||||||
|
Disease disease = Disease.getType(skill.getMobSkillID());
|
||||||
|
if (disease == null) {
|
||||||
|
disease = Disease.DARKNESS;
|
||||||
|
s = MobSkillFactory.getMobSkill(121, 6); // HACK: darkness
|
||||||
|
} else if (disease == Disease.POISON) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only target players on the battlefield map.
|
||||||
|
if (skill.getTarget() == 2) {
|
||||||
|
for (Player chr : getMembers()) {
|
||||||
|
if (MonsterCarnival.isBattlefieldMap(chr.getMapId())) {
|
||||||
|
chr.giveDebuff(disease, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (getRandomMember() != null) {
|
||||||
|
getRandomMember().giveDebuff(disease, 1, 30000L, disease.getDisease(), 1);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setField(MCField field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTeam(MCTeam newTeam) {
|
||||||
|
this.team = newTeam;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MCTeam getTeam() {
|
||||||
|
return team;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a collection of online members in the party.
|
||||||
|
* [MENTION=850422]return[/MENTION] Online MCParty members.
|
||||||
|
*/
|
||||||
|
public Collection<Player> getMembers() {
|
||||||
|
return this.characters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getRandomMember() {
|
||||||
|
List<Player> chrsOnMap = new ArrayList<>();
|
||||||
|
for (Player chr : this.characters) {
|
||||||
|
if (MonsterCarnival.isBattlefieldMap(chr.getMapId())) {
|
||||||
|
chrsOnMap.add(chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (chrsOnMap.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return chrsOnMap.get(new Random().nextInt(chrsOnMap.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAvailableCP() {
|
||||||
|
return availCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalCP() {
|
||||||
|
return totalCP;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object representing MCSkill in Skill.wz/MCSkill.img.
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCSkill {
|
||||||
|
private final int id, target, mobSkillID, level, spendCP;
|
||||||
|
private String name, desc;
|
||||||
|
|
||||||
|
public MCSkill(int id, int target, int mobSkillID, int level, int spendCP) {
|
||||||
|
this.id = id;
|
||||||
|
this.target = target;
|
||||||
|
this.mobSkillID = mobSkillID;
|
||||||
|
this.level = level;
|
||||||
|
this.spendCP = spendCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTarget() {
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMobSkillID() {
|
||||||
|
return mobSkillID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLevel() {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSpendCP() {
|
||||||
|
return spendCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDesc(String desc) {
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
import provider.MapleData;
|
||||||
|
import provider.MapleDataProvider;
|
||||||
|
import provider.MapleDataProviderFactory;
|
||||||
|
import provider.MapleDataTool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sammy Guergachi <sguergachi at gmail.com>
|
||||||
|
*/
|
||||||
|
public class MCSkillFactory {
|
||||||
|
|
||||||
|
private static Map<Integer, MCSkill> mcSkills = new HashMap<>();
|
||||||
|
private static Map<Integer, MCGuardian> mcGuardians = new HashMap<>();
|
||||||
|
private static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Skill.wz"));
|
||||||
|
private static MapleData mcSkillRoot = dataSource.getData("MCSkill.img");
|
||||||
|
private static MapleData mcGuardianRoot = dataSource.getData("MCGuardian.img");
|
||||||
|
private static ReentrantReadWriteLock skillLock = new ReentrantReadWriteLock();
|
||||||
|
private static ReentrantReadWriteLock guardianLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
public static MCSkill getMCSkill(int skillId) {
|
||||||
|
skillLock.readLock().lock();
|
||||||
|
try {
|
||||||
|
MCSkill ret = mcSkills.get(skillId);
|
||||||
|
if (ret != null) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
skillLock.readLock().unlock();
|
||||||
|
}
|
||||||
|
skillLock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
MCSkill ret;
|
||||||
|
ret = mcSkills.get(skillId);
|
||||||
|
if (ret == null) {
|
||||||
|
MapleData skillData = mcSkillRoot.getChildByPath(String.valueOf(skillId));
|
||||||
|
if (skillData != null) {
|
||||||
|
int target = MapleDataTool.getInt("target", skillData, 0);
|
||||||
|
int spendCP = MapleDataTool.getInt("spendCP", skillData, 0);
|
||||||
|
int mobSkillID = MapleDataTool.getInt("mobSkillID", skillData, 0);
|
||||||
|
int level = MapleDataTool.getInt("level", skillData, 0);
|
||||||
|
ret = new MCSkill(skillId, target, mobSkillID, level, spendCP);
|
||||||
|
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
String name = MapleDataTool.getString("name", skillData, "");
|
||||||
|
String desc = MapleDataTool.getString("desc", skillData, "");
|
||||||
|
ret.setName(name);
|
||||||
|
ret.setDesc(desc);
|
||||||
|
}
|
||||||
|
mcSkills.put(skillId, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
} finally {
|
||||||
|
skillLock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MCGuardian getMCGuardian(int id) {
|
||||||
|
guardianLock.readLock().lock();
|
||||||
|
try {
|
||||||
|
MCGuardian ret = mcGuardians.get(id);
|
||||||
|
if (ret != null) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
guardianLock.readLock().unlock();
|
||||||
|
}
|
||||||
|
guardianLock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
MCGuardian ret;
|
||||||
|
ret = mcGuardians.get(id);
|
||||||
|
if (ret == null) {
|
||||||
|
MapleData skillData = mcGuardianRoot.getChildByPath(String.valueOf(id));
|
||||||
|
if (skillData != null) {
|
||||||
|
int type = MapleDataTool.getInt("type", skillData, 0);
|
||||||
|
int spendCP = MapleDataTool.getInt("spendCP", skillData, 0);
|
||||||
|
int mobSkillID = MapleDataTool.getInt("mobSkillID", skillData, 0);
|
||||||
|
int level = MapleDataTool.getInt("level", skillData, 0);
|
||||||
|
ret = new MCGuardian(type, spendCP, mobSkillID, level);
|
||||||
|
|
||||||
|
if (MonsterCarnival.DEBUG) {
|
||||||
|
String name = MapleDataTool.getString("name", skillData, "");
|
||||||
|
String desc = MapleDataTool.getString("desc", skillData, "");
|
||||||
|
ret.setName(name);
|
||||||
|
ret.setDesc(desc);
|
||||||
|
}
|
||||||
|
mcGuardians.put(type, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
} finally {
|
||||||
|
guardianLock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs various errors and also keeps data on Carnival PQ runs.
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCTracker {
|
||||||
|
|
||||||
|
static org.slf4j.Logger log = LoggerFactory.getLogger(MCTracker.class);
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// Add field-specific info
|
||||||
|
// Add methods for calls from different files
|
||||||
|
// Maybe write own version of FilePrinter?
|
||||||
|
|
||||||
|
static final String PATH = "Reports/MCPQ.txt";
|
||||||
|
|
||||||
|
public static void log(String msg) {
|
||||||
|
System.out.println(msg);
|
||||||
|
log.debug(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import provider.MapleData;
|
||||||
|
import provider.MapleDataTool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Representation of the data tree inside of the Map.wz file.
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MCWZData {
|
||||||
|
|
||||||
|
public List<MCMobGenPos> mobGenPosList = new ArrayList<>();
|
||||||
|
public List<MCGuardianGenPos> guardianGenPosList = new ArrayList<>();
|
||||||
|
public Map<Integer, MCSummonMob> summons = new HashMap<>();
|
||||||
|
public Map<Integer, Integer> skills = new HashMap<>();
|
||||||
|
public Map<Integer, Integer> guardians = new HashMap<>();
|
||||||
|
|
||||||
|
public String effectWin, effectLose, soundWin, soundLose;
|
||||||
|
public int rewardMapWin, rewardMapLose;
|
||||||
|
|
||||||
|
public int mobGenMax, guardianGenMax;
|
||||||
|
public boolean mapDivided;
|
||||||
|
public int deathCP;
|
||||||
|
public int reactorRed, reactorBlue;
|
||||||
|
|
||||||
|
public MCWZData(MapleData src) {
|
||||||
|
parse(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void parse(MapleData src) {
|
||||||
|
populateMobGenPos(src.getChildByPath("mobGenPos"));
|
||||||
|
populateSummonMobs(src.getChildByPath("mob"));
|
||||||
|
effectWin = MapleDataTool.getString("effectWin", src);
|
||||||
|
effectLose = MapleDataTool.getString("effectLose", src);
|
||||||
|
soundWin = MapleDataTool.getString("soundWin", src);
|
||||||
|
soundLose = MapleDataTool.getString("soundLose", src);
|
||||||
|
|
||||||
|
rewardMapWin = MapleDataTool.getInt("rewardMapWin", src);
|
||||||
|
rewardMapLose = MapleDataTool.getInt("rewardMapLose", src);
|
||||||
|
|
||||||
|
populateSkills(src.getChildByPath("skill"));
|
||||||
|
populateGuardianGenPos(src.getChildByPath("guardianGenPos"));
|
||||||
|
populateGuardians(src.getChildByPath("guardian"));
|
||||||
|
|
||||||
|
mobGenMax = MapleDataTool.getInt("mobGenMax", src, 20); // HACK: 20 default
|
||||||
|
guardianGenMax = MapleDataTool.getInt("guardianGenMax", src, 20); // HACK: 20 default
|
||||||
|
|
||||||
|
mapDivided = MapleDataTool.getInt("mapDivided", src) > 0;
|
||||||
|
|
||||||
|
deathCP = MapleDataTool.getInt("deathCP", src);
|
||||||
|
reactorRed = MapleDataTool.getInt("reactorRed", src);
|
||||||
|
reactorBlue = MapleDataTool.getInt("reactorBlue", src);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateMobGenPos(MapleData src) {
|
||||||
|
for (MapleData n : src) {
|
||||||
|
MCMobGenPos nn = new MCMobGenPos(MapleDataTool.getInt("x", n, 0),
|
||||||
|
MapleDataTool.getInt("y", n, 0),
|
||||||
|
MapleDataTool.getInt("fh", n, 0),
|
||||||
|
MapleDataTool.getInt("cy", n, 0),
|
||||||
|
MapleDataTool.getInt("team", n, -1));
|
||||||
|
mobGenPosList.add(nn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateSummonMobs(MapleData src) {
|
||||||
|
for (MapleData n : src) {
|
||||||
|
int id = Integer.parseInt(n.getName());
|
||||||
|
MCSummonMob mcs = new MCSummonMob(
|
||||||
|
MapleDataTool.getInt("id", n, 0),
|
||||||
|
MapleDataTool.getInt("spendCP", n, 0),
|
||||||
|
MapleDataTool.getInt("mobTime", n, 0)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.summons.put(id, mcs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateSkills(MapleData src) {
|
||||||
|
for (MapleData n : src) {
|
||||||
|
int key = Integer.parseInt(n.getName());
|
||||||
|
int val = MapleDataTool.getInt(n);
|
||||||
|
|
||||||
|
skills.put(key, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateGuardianGenPos(MapleData src) {
|
||||||
|
for (MapleData n : src) {
|
||||||
|
MCGuardianGenPos nn = new MCGuardianGenPos(MapleDataTool.getInt("x", n, 0),
|
||||||
|
MapleDataTool.getInt("y", n, 0),
|
||||||
|
MapleDataTool.getInt("f", n, 0),
|
||||||
|
MapleDataTool.getInt("team", n, -1));
|
||||||
|
guardianGenPosList.add(nn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateGuardians(MapleData src) {
|
||||||
|
for (MapleData n : src) {
|
||||||
|
int key = Integer.parseInt(n.getName());
|
||||||
|
int val = MapleDataTool.getInt(n);
|
||||||
|
|
||||||
|
guardians.put(key, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MCMobGenPos {
|
||||||
|
|
||||||
|
public final int x, y, fh, cy, team;
|
||||||
|
|
||||||
|
private MCMobGenPos(int x, int y, int fh, int cy, int team) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.fh = fh;
|
||||||
|
this.cy = cy;
|
||||||
|
this.team = team;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MCGuardianGenPos {
|
||||||
|
|
||||||
|
public final int x, y, f, team;
|
||||||
|
|
||||||
|
private MCGuardianGenPos(int x, int y, int f, int team) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.f = f;
|
||||||
|
this.team = team;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MCSummonMob {
|
||||||
|
|
||||||
|
public final int id, spendCP, mobTime;
|
||||||
|
|
||||||
|
private MCSummonMob(int id, int spendCP, int mobTime) {
|
||||||
|
this.id = id;
|
||||||
|
this.spendCP = spendCP;
|
||||||
|
this.mobTime = mobTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package server.partyquest.mcpq;
|
||||||
|
|
||||||
|
import community.MapleParty;
|
||||||
|
import handling.channel.ChannelServer;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import client.player.Player;
|
||||||
|
import client.player.buffs.Disease;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Sammy Guergachi <sguergachi at gmail.com>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Processes game logic for Monster Carnival PQ.
|
||||||
|
*
|
||||||
|
* TODO: Display IGNs/Jobs/Level in Pending Requests
|
||||||
|
* TODO: fix reactor handling and make it less hacky
|
||||||
|
* TODO: fix cube of darkness and make it less hacky
|
||||||
|
*
|
||||||
|
* @author s4nta
|
||||||
|
*/
|
||||||
|
public class MonsterCarnival {
|
||||||
|
|
||||||
|
// Logger
|
||||||
|
static org.slf4j.Logger log = LoggerFactory.getLogger(MonsterCarnival.class);
|
||||||
|
|
||||||
|
// Map of channel to a MonsterCarnival instance.
|
||||||
|
private static final HashMap<Integer, MonsterCarnival> instances = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the MonsterCarnival instance for a channel. Creates a new one and maps it
|
||||||
|
* if it does not exist.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m channel Channel to check for.
|
||||||
|
* [MENTION=850422]return[/MENTION] MonsterCarnival instance for a channel.
|
||||||
|
* @param channel
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static MonsterCarnival getMonsterCarnival(int channel) {
|
||||||
|
// TODO: synchronization?
|
||||||
|
if (channel < 1 || channel > 20) {
|
||||||
|
log.warn("Attempting to get a Monster Carnival instance for invalid channel.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (instances.containsKey(channel)) {
|
||||||
|
return instances.get(channel);
|
||||||
|
}
|
||||||
|
ChannelServer cserv = ChannelServer.getInstance(channel);
|
||||||
|
if (cserv == null) {
|
||||||
|
log.error("ChannelServer instance for channel " + channel + " is null.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MonsterCarnival inst = new MonsterCarnival(cserv);
|
||||||
|
instances.put(channel, inst);
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instance variables
|
||||||
|
private ChannelServer cserv;
|
||||||
|
private Map<Integer, MCField> fields = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for a MonsterCarnival instance.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m cserv Channel server for this instance.
|
||||||
|
*/
|
||||||
|
public MonsterCarnival(ChannelServer cserv) {
|
||||||
|
this.cserv = cserv;
|
||||||
|
this.initFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes empty fields for the instance.
|
||||||
|
*/
|
||||||
|
private void initFields() {
|
||||||
|
for (int i = 1; i <= NUM_FIELDS; i++) {
|
||||||
|
fields.put(i, new MCField(i, this.cserv, null, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the field with a specified ID.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m id ID of field to retrieve.
|
||||||
|
* [MENTION=850422]return[/MENTION]
|
||||||
|
*/
|
||||||
|
public MCField getField(int id) {
|
||||||
|
if (id >= 1 && id <= NUM_FIELDS) {
|
||||||
|
return fields.get(id);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a party can join a field or not.
|
||||||
|
*
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m pty Party to register.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m room Room to join.
|
||||||
|
* [MENTION=850422]return[/MENTION] Different code based on status. OK if successful.
|
||||||
|
*/
|
||||||
|
public int registerStatus(MapleParty pty, int room) {
|
||||||
|
if (!isValidField(room)) {
|
||||||
|
return STATUS_FIELD_INVALID;
|
||||||
|
}
|
||||||
|
MCField field = this.getField(room);
|
||||||
|
if (field.isFull()) {
|
||||||
|
return STATUS_FIELD_FULL;
|
||||||
|
}
|
||||||
|
MCParty party = new MCParty(pty);
|
||||||
|
if (!sizeCheck(party.getSize(), room)) {
|
||||||
|
return STATUS_PARTY_SIZE;
|
||||||
|
}
|
||||||
|
boolean levelCheck = party.checkLevels();
|
||||||
|
if (!levelCheck) {
|
||||||
|
return STATUS_PARTY_LEVEL;
|
||||||
|
}
|
||||||
|
boolean chanCheck = party.checkChannels();
|
||||||
|
if (!chanCheck) {
|
||||||
|
return STATUS_PARTY_MISSING;
|
||||||
|
}
|
||||||
|
boolean mapCheck = party.checkMaps();
|
||||||
|
if (!mapCheck) {
|
||||||
|
return STATUS_PARTY_MISSING;
|
||||||
|
}
|
||||||
|
if (field.needsRequest()) {
|
||||||
|
return STATUS_REQUEST;
|
||||||
|
}
|
||||||
|
return STATUS_PROCEED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new MCParty based on a regular MapleParty object.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m pty Party to base off of.
|
||||||
|
* [MENTION=850422]return[/MENTION] Newly created MCParty.
|
||||||
|
*/
|
||||||
|
public MCParty createParty(MapleParty pty) {
|
||||||
|
return new MCParty(pty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetPlayer(Player chr) {
|
||||||
|
MCParty.deregisterPlayer(chr);
|
||||||
|
chr.changeMap(MAP_LOBBY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a String containing information about lobby waiting rooms.
|
||||||
|
*
|
||||||
|
* [MENTION=850422]return[/MENTION] String containing lobby information formatted for NPC.
|
||||||
|
*/
|
||||||
|
public String getNPCAvailableFields() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("Welcome to the #bCarnival PQ#k! Rooms 1-4 can hold 2-4 people, and rooms 5-6 can hold 3-6.\r\n#b");
|
||||||
|
for (int i = 1; i <= NUM_FIELDS; i++) {
|
||||||
|
MCField field = this.fields.get(i);
|
||||||
|
sb.append(field.getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference Information
|
||||||
|
|
||||||
|
// Game Constants
|
||||||
|
public static final int CP_LOSS_ON_DEATH = 10;
|
||||||
|
public static final int TIME_PREBATTLE = 10;
|
||||||
|
public static final int TIME_BATTLE = 600;
|
||||||
|
public static final int TIME_LOBBYWAIT = 180;
|
||||||
|
|
||||||
|
public static final int TAB_SPAWNS = 0;
|
||||||
|
public static final int TAB_DEBUFF = 1;
|
||||||
|
public static final int TAB_GUARDIAN = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a random debuff for (Mini) Cube of Darkness.
|
||||||
|
* [MENTION=850422]return[/MENTION] Random MapleDisease.
|
||||||
|
*/
|
||||||
|
public static Disease getRandomDebuff() {
|
||||||
|
return DEBUFFS[new Random().nextInt(DEBUFFS.length)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks party size. Information from hidden-street MCPQ page.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m size Size of the party.
|
||||||
|
* [MENTION=2000183830]para[/MENTION]m field Field to check for.
|
||||||
|
* [MENTION=850422]return[/MENTION] True if party size is okay, False otherwise.
|
||||||
|
*/
|
||||||
|
public static final boolean sizeCheck(int size, int field) {
|
||||||
|
if (DEBUG) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
switch (field) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
// return size >= 2 && size <= 4;
|
||||||
|
return size >= 1 && size <= 4;
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
// return size >= 3 && size <= 6;
|
||||||
|
return size >= 1 && size <= 6;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isValidField(int field) {
|
||||||
|
return field >= 1 && field <= 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int getLobbyMap(int field) {
|
||||||
|
if (field < 1 || field > NUM_FIELDS) {
|
||||||
|
log.warn("Attempting to get lobby map for invalid field.");
|
||||||
|
return MAP_EXIT;
|
||||||
|
}
|
||||||
|
return 980000000 + field * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isLobbyMap(int mapid) {
|
||||||
|
switch (mapid) {
|
||||||
|
case 980000100:
|
||||||
|
case 980000200:
|
||||||
|
case 980000300:
|
||||||
|
case 980000400:
|
||||||
|
case 980000500:
|
||||||
|
case 980000600:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int getBattleFieldMap(int field) {
|
||||||
|
if (field < 1 || field > NUM_FIELDS) {
|
||||||
|
log.warn("Attempting to get battlefield map for invalid field.");
|
||||||
|
return MAP_EXIT;
|
||||||
|
}
|
||||||
|
return 980000000 + field * 100 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isBattlefieldMap(int mapid) {
|
||||||
|
switch (mapid) {
|
||||||
|
case 980000101:
|
||||||
|
case 980000201:
|
||||||
|
case 980000301:
|
||||||
|
case 980000401:
|
||||||
|
case 980000501:
|
||||||
|
case 980000601:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int getResurrectionMap(int field) {
|
||||||
|
if (field < 1 || field > NUM_FIELDS) {
|
||||||
|
log.warn("Attempting to get resurrection map for invalid field.");
|
||||||
|
return MAP_EXIT;
|
||||||
|
}
|
||||||
|
return 980000000 + field * 100 + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int getVictoriousMap(int field) {
|
||||||
|
if (field < 1 || field > NUM_FIELDS) {
|
||||||
|
log.warn("Attempting to get victory map for invalid field.");
|
||||||
|
return MAP_EXIT;
|
||||||
|
}
|
||||||
|
return 980000000 + field * 100 + 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int getDefeatedMap(int field) {
|
||||||
|
if (field < 1 || field > NUM_FIELDS) {
|
||||||
|
log.warn("Attempting to get defeat map for invalid field.");
|
||||||
|
return MAP_EXIT;
|
||||||
|
}
|
||||||
|
return 980000000 + field * 100 + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean isCPQConsumeItem(int itemid) {
|
||||||
|
switch (itemid) {
|
||||||
|
case ITEM_CP_1:
|
||||||
|
case ITEM_CP_2:
|
||||||
|
case ITEM_CP_3:
|
||||||
|
case ITEM_PTY_ELIX:
|
||||||
|
case ITEM_PTY_PELIX:
|
||||||
|
case ITEM_PTY_ALLC:
|
||||||
|
case ITEM_MINICUBE:
|
||||||
|
case ITEM_DARKCUBE:
|
||||||
|
case ITEM_STUNNER:
|
||||||
|
case ITEM_IND_WHITE:
|
||||||
|
case ITEM_IND_MANA:
|
||||||
|
case ITEM_IND_ELIX:
|
||||||
|
case ITEM_IND_PELIX:
|
||||||
|
case ITEM_IND_ALLC:
|
||||||
|
case ITEM_PTY_MANA:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error Codes
|
||||||
|
// Note: These would be in an enum, but since these will be used in a NPC, they are not.
|
||||||
|
public static final int STATUS_FIELD_FULL = 0;
|
||||||
|
public static final int STATUS_PARTY_SIZE = 1;
|
||||||
|
public static final int STATUS_PARTY_LEVEL = 2;
|
||||||
|
public static final int STATUS_PARTY_MISSING = 3;
|
||||||
|
public static final int STATUS_FIELD_INVALID = 4;
|
||||||
|
public static final int STATUS_REQUEST = 98;
|
||||||
|
public static final int STATUS_PROCEED = 99;
|
||||||
|
|
||||||
|
// Maps
|
||||||
|
public static final int MAP_LOBBY = 980000000;
|
||||||
|
public static final int MAP_EXIT = 980000010;
|
||||||
|
|
||||||
|
// NPCs
|
||||||
|
public static final int NPC_LOBBY = 2042000;
|
||||||
|
public static final int NPC_ENTER = 2042001; // Warp in from outside
|
||||||
|
public static final int NPC_INFO = 2042002;
|
||||||
|
public static final int NPC_ASST_RED = 2042003;
|
||||||
|
public static final int NPC_ASST_BLUE = 2042004;
|
||||||
|
|
||||||
|
// Items
|
||||||
|
public static final int ITEM_CP_1 = 2022157;
|
||||||
|
public static final int ITEM_CP_2 = 2022158;
|
||||||
|
public static final int ITEM_CP_3 = 2022159;
|
||||||
|
public static final int ITEM_PTY_MANA = 2022160;
|
||||||
|
public static final int ITEM_PTY_ELIX = 2022161;
|
||||||
|
public static final int ITEM_PTY_PELIX = 2022162;
|
||||||
|
public static final int ITEM_PTY_ALLC = 2022163;
|
||||||
|
public static final int ITEM_MINICUBE = 2022164;
|
||||||
|
public static final int ITEM_DARKCUBE = 2022165;
|
||||||
|
public static final int ITEM_STUNNER = 2022166;
|
||||||
|
public static final int ITEM_IND_WHITE = 2022174;
|
||||||
|
public static final int ITEM_IND_ELIX = 2022175;
|
||||||
|
public static final int ITEM_IND_PELIX = 2022176;
|
||||||
|
public static final int ITEM_IND_MANA = 2022177;
|
||||||
|
public static final int ITEM_IND_ALLC = 2022178;
|
||||||
|
|
||||||
|
// Guardians
|
||||||
|
public static final int GUARDIAN_RED = 9980000;
|
||||||
|
public static final int GUARDIAN_BLUE = 9980001;
|
||||||
|
|
||||||
|
// Debuffs
|
||||||
|
public static final Disease[] DEBUFFS = {Disease.STUN, Disease.DARKNESS, Disease.WEAKEN}; // intentionally leave out a few
|
||||||
|
|
||||||
|
// Miscellaneous
|
||||||
|
public static final int MIN_LEVEL = 30;
|
||||||
|
public static final int MAX_LEVEL = 50;
|
||||||
|
public static final int NUM_FIELDS = 6;
|
||||||
|
|
||||||
|
// Debug
|
||||||
|
public static final boolean DEBUG = false;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Extra classes for Monster Carnival. Can possibly be used for implementing MCPQ.
|
||||||
@@ -476,3 +476,9 @@ Mais drop data e HPBar em bosses.
|
|||||||
23 Agosto 2017,
|
23 Agosto 2017,
|
||||||
Consertado problema com overflow ao scrollar equips resultando em equips com stats negativos.
|
Consertado problema com overflow ao scrollar equips resultando em equips com stats negativos.
|
||||||
Consertado pets não expirando corretamente (possivelmente crashando o cliente se no meio do jogo).
|
Consertado pets não expirando corretamente (possivelmente crashando o cliente se no meio do jogo).
|
||||||
|
|
||||||
|
24 - 25 Agosto 2017,
|
||||||
|
Acesso à DB usando HikariCP (melhor ganho em desempenho e código mais enxuto).
|
||||||
|
Resolvido bugs com hatch egg e evolvePet.
|
||||||
|
Adicionado energy bar e skills funcionais no Dojo.
|
||||||
|
Consertado cash pet food retirando stats de mount em Character Info.
|
||||||
@@ -31,7 +31,6 @@ ToDo / Missing features list:
|
|||||||
- Ariant Party Quest
|
- Ariant Party Quest
|
||||||
- Monster Carnival 1/2 Party Quest
|
- Monster Carnival 1/2 Party Quest
|
||||||
- Nett's Pyramid Party Quest
|
- Nett's Pyramid Party Quest
|
||||||
- Dojo bar and skills combo (Bamboo Rain, Invincibility and Power Explosion)
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,27 +3,8 @@
|
|||||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="1"/>
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="1"/>
|
||||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||||
<group>
|
<group>
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/MaplePet.java</file>
|
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/GameConstants.java</file>
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/command/Commands.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/Item.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/PacketProcessor.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/AbstractPlayerInteraction.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java</file>
|
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java</file>
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/SpawnPetHandler.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/quest/2230.js</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleItemInformationProvider.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/MaplePacketCreator.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/MapleInventory.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/Equip.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/ItemRewardHandler.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/ItemMoveHandler.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/NPC%20Base.js</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/Randomizer.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleRing.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleQuestStatus.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventInstanceManager.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleInventoryManipulator.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/npc/NPCConversationManager.java</file>
|
|
||||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java</file>
|
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java</file>
|
||||||
</group>
|
</group>
|
||||||
</open-files>
|
</open-files>
|
||||||
|
|||||||
@@ -28,8 +28,7 @@ dist.jar=${dist.dir}/MapleSolaxia.jar
|
|||||||
dist.javadoc.dir=${dist.dir}/javadoc
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
endorsed.classpath=
|
endorsed.classpath=
|
||||||
excludes=
|
excludes=
|
||||||
file.reference.commons-dbcp2-2.1.1.jar=cores/commons-dbcp2-2.1.1.jar
|
file.reference.HikariCP-java7-2.4.12.jar=cores/HikariCP-java7-2.4.12.jar
|
||||||
file.reference.commons-pool2-2.4.2.jar=cores/commons-pool2-2.4.2.jar
|
|
||||||
file.reference.MapleSolaxia-src=src
|
file.reference.MapleSolaxia-src=src
|
||||||
file.reference.mina-core-2.0.7.jar=C:\\Users\\Tyler\\Desktop\\MoopleDev\\dist\\mina-core-2.0.7.jar
|
file.reference.mina-core-2.0.7.jar=C:\\Users\\Tyler\\Desktop\\MoopleDev\\dist\\mina-core-2.0.7.jar
|
||||||
file.reference.mysql-connector-java-bin.jar=C:\\Users\\Tyler\\Desktop\\MoopleDev\\dist\\mysql-connector-java-bin.jar
|
file.reference.mysql-connector-java-bin.jar=C:\\Users\\Tyler\\Desktop\\MoopleDev\\dist\\mysql-connector-java-bin.jar
|
||||||
@@ -44,8 +43,7 @@ javac.classpath=\
|
|||||||
${file.reference.mysql-connector-java-bin.jar}:\
|
${file.reference.mysql-connector-java-bin.jar}:\
|
||||||
${file.reference.slf4j-api-1.6.6.jar}:\
|
${file.reference.slf4j-api-1.6.6.jar}:\
|
||||||
${file.reference.slf4j-jdk14-1.7.5.jar}:\
|
${file.reference.slf4j-jdk14-1.7.5.jar}:\
|
||||||
${file.reference.commons-dbcp2-2.1.1.jar}:\
|
${file.reference.HikariCP-java7-2.4.12.jar}
|
||||||
${file.reference.commons-pool2-2.4.2.jar}
|
|
||||||
# Space-separated list of extra javac options
|
# Space-separated list of extra javac options
|
||||||
javac.compilerargs=
|
javac.compilerargs=
|
||||||
javac.deprecation=false
|
javac.deprecation=false
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ importPackage(Packages.server.life);
|
|||||||
var closeTime = 50 * 1000; //The time to close the gate
|
var closeTime = 50 * 1000; //The time to close the gate
|
||||||
var beginTime = 60 * 1000; //The time to begin the ride
|
var beginTime = 60 * 1000; //The time to begin the ride
|
||||||
var rideTime = 120 * 1000; //The time that require move to destination
|
var rideTime = 120 * 1000; //The time that require move to destination
|
||||||
var invasionTime = 30 * 1000; //The time to balrog ship approach
|
var invasionStartTime = 30 * 1000; //The time to balrog ship approach
|
||||||
|
var invasionDelayTime = 15 * 1000; //The time to balrog ship approach
|
||||||
var invasionDelay = 5 * 1000; //The time that spawn balrog
|
var invasionDelay = 5 * 1000; //The time that spawn balrog
|
||||||
var Orbis_btf;
|
var Orbis_btf;
|
||||||
var Boat_to_Orbis;
|
var Boat_to_Orbis;
|
||||||
@@ -56,7 +57,7 @@ function takeoff() {
|
|||||||
|
|
||||||
em.setProperty("docked","false");
|
em.setProperty("docked","false");
|
||||||
|
|
||||||
em.schedule("approach", invasionTime);
|
if(Math.random() < 0.42) em.schedule("approach", (invasionStartTime + (Math.random() * invasionDelayTime)));
|
||||||
em.schedule("arrived", rideTime);
|
em.schedule("arrived", rideTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+18
-9
@@ -24,24 +24,32 @@
|
|||||||
Map(s): Victoria Road : Henesys Park (100000200)
|
Map(s): Victoria Road : Henesys Park (100000200)
|
||||||
Description: Pet Master
|
Description: Pet Master
|
||||||
*/
|
*/
|
||||||
var status = -1;
|
var status = -2;
|
||||||
var sel;
|
var sel;
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
cm.sendNext("Hmm... are you raising one of my kids by any chance? I perfected a spell that uses Water of Life to blow life into a doll. People call it the #bPet#k. If you have one with you, feel free to ask me questions.");
|
status = -2
|
||||||
|
action(1, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
function action(mode, type, selection) {
|
function action(mode, type, selection) {
|
||||||
status++;
|
|
||||||
if (mode != 1) {
|
if (mode == -1) {
|
||||||
if(mode == 0 && status >= 2)
|
cm.dispose();
|
||||||
status -= 2;
|
} else {
|
||||||
else{
|
if (mode == 0 && type > 0) {
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (mode == 1)
|
||||||
|
status++;
|
||||||
|
else
|
||||||
|
status--;
|
||||||
|
|
||||||
|
if(status == -1) {
|
||||||
|
cm.sendNext("Hmm... are you raising one of my kids by any chance? I perfected a spell that uses Water of Life to blow life into a doll. People call it the #bPet#k. If you have one with you, feel free to ask me questions.");
|
||||||
}
|
}
|
||||||
if (status == 0)
|
else if (status == 0)
|
||||||
cm.sendSimple("What do you want to know more of?#b\r\n#L0#Tell me more about Pets.#l\r\n#L1#How do I raise Pets?#l\r\n#L2#Do Pets die too?#l\r\n#L3#What are the commands for Brown and Black Kitty?#l\r\n#L4#What are the commands for Brown Puppy?#l\r\n#L5#What are the commands for Pink and White Bunny?#l\r\n#L6#What are the commands for Mini Kargo?#l\r\n#L7#What are the commands for Rudolph and Dasher?#l\r\n#L8#What are the commands for Black Pig?#l\r\n#L9#What are the commands for Panda?#l\r\n#L10#What are the commands for Husky?#l\r\n#L11#What are the commands for Dino Boy and Dino Girl?#l\r\n#L12#What are the commands for Monkey?#l\r\n#L13#What are the commands for Turkey?#l\r\n#L14#What are the commands for White Tiger?#l\r\n#L15#What are the commands for Penguin?#l\r\n#L16#What are the commands for Golden Pig?#l\r\n#L17#What are the commands for Robot?#l\r\n#L18#What are the commands for Mini Yeti?#l\r\n#L19#What are the commands for Jr. Balrog?#l\r\n#L20#What are the commands for Baby Dragon?#l\r\n#L21#What are the commands for Green/Red/Blue Dragon?#l\r\n#L22#What are the commands for Black Dragon?#l\r\n#L23#What are the commands for Jr. Reaper?#l\r\n#L24#What are the commands for Porcupine?#l\r\n#L25#What are the commands for Snowman?#l\r\n#L26#What are the commands for Skunk?#l\r\n#L27#Please teach me about transferring pet ability points.#l");
|
cm.sendSimple("What do you want to know more of?#b\r\n#L0#Tell me more about Pets.#l\r\n#L1#How do I raise Pets?#l\r\n#L2#Do Pets die too?#l\r\n#L3#What are the commands for Brown and Black Kitty?#l\r\n#L4#What are the commands for Brown Puppy?#l\r\n#L5#What are the commands for Pink and White Bunny?#l\r\n#L6#What are the commands for Mini Kargo?#l\r\n#L7#What are the commands for Rudolph and Dasher?#l\r\n#L8#What are the commands for Black Pig?#l\r\n#L9#What are the commands for Panda?#l\r\n#L10#What are the commands for Husky?#l\r\n#L11#What are the commands for Dino Boy and Dino Girl?#l\r\n#L12#What are the commands for Monkey?#l\r\n#L13#What are the commands for Turkey?#l\r\n#L14#What are the commands for White Tiger?#l\r\n#L15#What are the commands for Penguin?#l\r\n#L16#What are the commands for Golden Pig?#l\r\n#L17#What are the commands for Robot?#l\r\n#L18#What are the commands for Mini Yeti?#l\r\n#L19#What are the commands for Jr. Balrog?#l\r\n#L20#What are the commands for Baby Dragon?#l\r\n#L21#What are the commands for Green/Red/Blue Dragon?#l\r\n#L22#What are the commands for Black Dragon?#l\r\n#L23#What are the commands for Jr. Reaper?#l\r\n#L24#What are the commands for Porcupine?#l\r\n#L25#What are the commands for Snowman?#l\r\n#L26#What are the commands for Skunk?#l\r\n#L27#Please teach me about transferring pet ability points.#l");
|
||||||
else if (status == 1) {
|
else if (status == 1) {
|
||||||
sel = selection;
|
sel = selection;
|
||||||
@@ -140,6 +148,7 @@ function action(mode, type, selection) {
|
|||||||
cm.sendNextPrev("Oh yes! Pets can't eat the normal human food. Instead my disciple #bDoofus#k sells #bPet Food#k at the Henesys Market so if you need food for your pet, find Henesys. It'll be a good idea to buy the food in advance and feed the pet before it gets really hungry.");
|
cm.sendNextPrev("Oh yes! Pets can't eat the normal human food. Instead my disciple #bDoofus#k sells #bPet Food#k at the Henesys Market so if you need food for your pet, find Henesys. It'll be a good idea to buy the food in advance and feed the pet before it gets really hungry.");
|
||||||
} else if (status == 5)
|
} else if (status == 5)
|
||||||
cm.sendNextPrev("Oh, and if you don't feed the pet for a long period of time, it goes back home by itself. You can take it out of its home and feed it but it's not really good for the pet's health, so try feeding him on a regular basis so it doesn't go down to that level, alright? I think this will do.");
|
cm.sendNextPrev("Oh, and if you don't feed the pet for a long period of time, it goes back home by itself. You can take it out of its home and feed it but it's not really good for the pet's health, so try feeding him on a regular basis so it doesn't go down to that level, alright? I think this will do.");
|
||||||
else if (status == 6)
|
else
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+17
-17
@@ -12,7 +12,7 @@
|
|||||||
importPackage(Packages.client);
|
importPackage(Packages.client);
|
||||||
importPackage(Packages.server);
|
importPackage(Packages.server);
|
||||||
|
|
||||||
var status = 0;
|
var status;
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
status = -1;
|
status = -1;
|
||||||
@@ -23,7 +23,7 @@ function action(mode, type, selection) {
|
|||||||
if (mode == -1) {
|
if (mode == -1) {
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
} else {
|
} else {
|
||||||
if (mode == 0) {
|
if (mode == 0 && type > 0) {
|
||||||
cm.sendOk("Alright, see you next time.");
|
cm.sendOk("Alright, see you next time.");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
return;
|
return;
|
||||||
@@ -32,21 +32,22 @@ function action(mode, type, selection) {
|
|||||||
status++;
|
status++;
|
||||||
else
|
else
|
||||||
status--;
|
status--;
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
cm.sendYesNo("I am Mar the Fairy. If you have a dragon at level 15 or higher and a rock of evolution. I can evolve your dragon. If you are lucky, you may even get a black one! Would you like me to do so?");
|
cm.sendYesNo("I am Mar the Fairy. If you have a dragon at level 15 or higher and a rock of evolution, I can evolve your dragon. If you are lucky, you may even get a black one! Would you like me to do so?");
|
||||||
} else if (status == 1) {
|
} else if (status == 1) {
|
||||||
if (cm.haveItem(5000028, 1)) {
|
if (cm.haveItem(5000028, 1)) {
|
||||||
cm.gainItem(5000028, -1);
|
cm.gainItem(5000028, -1);
|
||||||
cm.gainItem(5000029, 1);
|
cm.gainItem(5000029, 1);
|
||||||
cm.sendOk("I don't know how you got that egg, but it has hatched, apparently!");
|
cm.sendOk("I don't know how you got that egg, but it has hatched, apparently!");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
} else if (cm.getChar().getPet() == null) {
|
} else if (cm.getPlayer().getPet(0) == null) {
|
||||||
cm.sendOk("Make sure your pet is equipped.");
|
cm.sendOk("Make sure your pet is equipped on slot 1.");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
} else if (cm.getChar().getPet().getItemId() < 5000029 || cm.getChar().getPet().getItemId() > 5000033 || !cm.haveItem(5380000,1)) {
|
} else if (cm.getPlayer().getPet(0).getItemId() < 5000029 || cm.getPlayer().getPet(0).getItemId() > 5000033 || !cm.haveItem(5380000,1)) {
|
||||||
cm.sendOk("You do not meet the requirements. You need #i5380000##t5380000#, as well as either one of #d#i5000029##t5000029##k, #g#i5000030##t5000030##k, #r#i5000031##t5000031##k, #b#i5000032##t5000032##k, or #e#i5000033##t5000033##n equipped. Please come back when you do.");
|
cm.sendOk("You do not meet the requirements. You need #i5380000##t5380000#, as well as either one of #d#i5000029##t5000029##k, #g#i5000030##t5000030##k, #r#i5000031##t5000031##k, #b#i5000032##t5000032##k, or #e#i5000033##t5000033##n equipped on slot 1. Please come back when you do.");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
} else if (cm.getChar().getPet().getLevel() < 15) {
|
} else if (cm.getPlayer().getPet(0).getLevel() < 15) {
|
||||||
cm.sendOk("Your pet must be level 15 or above to evolve.");
|
cm.sendOk("Your pet must be level 15 or above to evolve.");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
} else if (cm.haveItem(5000029,2) || cm.haveItem(5000030,2) || cm.haveItem(5000031,2) || cm.haveItem(5000032,2) || cm.haveItem(5000033,2)) {
|
} else if (cm.haveItem(5000029,2) || cm.haveItem(5000030,2) || cm.haveItem(5000031,2) || cm.haveItem(5000032,2) || cm.haveItem(5000033,2)) {
|
||||||
@@ -61,15 +62,16 @@ function action(mode, type, selection) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i == 3) {
|
if(i == 3) {
|
||||||
cm.getPlayer().message("Pet could not be evolved.");
|
cm.sendOk("You either don't have a pet dragon ready to evolve or you lack #b#t5380000##k.");
|
||||||
|
cm.dispose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var id = cm.getPlayer().getPet().getItemId();
|
var id = cm.getPlayer().getPet(i).getItemId();
|
||||||
var name = cm.getPlayer().getPet().getName();
|
//var name = cm.getPlayer().getPet(i).getName();
|
||||||
var level = cm.getPlayer().getPet().getLevel();
|
//var level = cm.getPlayer().getPet(i).getLevel();
|
||||||
var closeness = cm.getPlayer().getPet().getCloseness();
|
//var closeness = cm.getPlayer().getPet(i).getCloseness();
|
||||||
var fullness = cm.getPlayer().getPet().getFullness();
|
//var fullness = cm.getPlayer().getPet(i).getFullness();
|
||||||
//MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
//MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||||
if (id < 5000029 || id > 5000033) {
|
if (id < 5000029 || id > 5000033) {
|
||||||
cm.sendOk("Something wrong, try again.");
|
cm.sendOk("Something wrong, try again.");
|
||||||
@@ -94,10 +96,8 @@ function action(mode, type, selection) {
|
|||||||
name = MapleItemInformationProvider.getInstance().getName(after);
|
name = MapleItemInformationProvider.getInstance().getName(after);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
//cm.unequipPet(cm.getC());
|
|
||||||
cm.getPlayer().unequipAllPets(); //IMPORTANT, you can bug/crash yourself if you don't unequip the pet to be deleted
|
|
||||||
cm.gainItem(5380000, -1);
|
cm.gainItem(5380000, -1);
|
||||||
qm.evolvePet(i, after);
|
cm.evolvePet(i, after);
|
||||||
|
|
||||||
cm.sendOk("Your dragon has now evolved!! It used to be a #i" + id + "##t" + id + "#, and now it's a #i" + after + "##t" + after + "#!");
|
cm.sendOk("Your dragon has now evolved!! It used to be a #i" + id + "##t" + id + "#, and now it's a #i" + after + "##t" + after + "#!");
|
||||||
cm.dispose();
|
cm.dispose();
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ function writeSolaxiaCommandsLv3() { //GM
|
|||||||
addCommand("expeds", "");
|
addCommand("expeds", "");
|
||||||
addCommand("kill", "");
|
addCommand("kill", "");
|
||||||
addCommand("seed", "");
|
addCommand("seed", "");
|
||||||
|
addCommand("maxenergy", "");
|
||||||
addCommand("killall", "");
|
addCommand("killall", "");
|
||||||
addCommand("notice", "");
|
addCommand("notice", "");
|
||||||
addCommand("rip", "");
|
addCommand("rip", "");
|
||||||
|
|||||||
+25
-2
@@ -19706,7 +19706,6 @@ USE `maplesolaxia`;
|
|||||||
(6090004, 0, 1000, 1100, 0, 400000),
|
(6090004, 0, 1000, 1100, 0, 400000),
|
||||||
(5090000, 0, 800, 920, 0, 400000),
|
(5090000, 0, 800, 920, 0, 400000),
|
||||||
(5090001, 0, 1700, 1750, 0, 400000),
|
(5090001, 0, 1700, 1750, 0, 400000),
|
||||||
|
|
||||||
(7090000, 1402015, 1, 1, 0, 8500),
|
(7090000, 1402015, 1, 1, 0, 8500),
|
||||||
(7090000, 1092016, 1, 1, 0, 8500),
|
(7090000, 1092016, 1, 1, 0, 8500),
|
||||||
(7090000, 1382039, 1, 1, 0, 8500),
|
(7090000, 1382039, 1, 1, 0, 8500),
|
||||||
@@ -19746,7 +19745,31 @@ USE `maplesolaxia`;
|
|||||||
(8090000, 2044809, 1, 1, 0, 4500),
|
(8090000, 2044809, 1, 1, 0, 4500),
|
||||||
(8090000, 2022130, 1, 1, 0, 200000),
|
(8090000, 2022130, 1, 1, 0, 200000),
|
||||||
(8090000, 2022191, 1, 1, 0, 200000),
|
(8090000, 2022191, 1, 1, 0, 200000),
|
||||||
(8090000, 0, 1000, 1100, 0, 400000);
|
(8090000, 0, 1000, 1100, 0, 400000),
|
||||||
|
(9400549, 2290045, 1, 1, 0, 4000),
|
||||||
|
(8160000, 2290081, 1, 1, 0, 4000),
|
||||||
|
(9400575, 2290087, 1, 1, 0, 4000),
|
||||||
|
(8170000, 2290109, 1, 1, 0, 4000),
|
||||||
|
(8160000, 2290045, 1, 1, 0, 4000),
|
||||||
|
(9400575, 2290081, 1, 1, 0, 4000),
|
||||||
|
(8170000, 2290087, 1, 1, 0, 4000),
|
||||||
|
(9400549, 2290109, 1, 1, 0, 4000),
|
||||||
|
(8090000, 2290045, 1, 1, 0, 4000),
|
||||||
|
(8220002, 2290081, 1, 1, 0, 4000),
|
||||||
|
(7090000, 2290087, 1, 1, 0, 4000),
|
||||||
|
(8220009, 2290109, 1, 1, 0, 4000),
|
||||||
|
(8190003, 2290045, 1, 1, 0, 4000),
|
||||||
|
(9400582, 2290081, 1, 1, 0, 4000),
|
||||||
|
(9400580, 2290087, 1, 1, 0, 4000),
|
||||||
|
(8200008, 2290109, 1, 1, 0, 4000),
|
||||||
|
(9400120, 2290045, 1, 1, 0, 10000),
|
||||||
|
(9400300, 2290081, 1, 1, 0, 10000),
|
||||||
|
(9400121, 2290087, 1, 1, 0, 10000),
|
||||||
|
(9400014, 2290109, 1, 1, 0, 10000),
|
||||||
|
(9400300, 2290045, 1, 1, 0, 10000),
|
||||||
|
(9400121, 2290081, 1, 1, 0, 10000),
|
||||||
|
(9400014, 2290087, 1, 1, 0, 10000),
|
||||||
|
(9400120, 2290109, 1, 1, 0, 10000);
|
||||||
|
|
||||||
# (dropperid, itemid, minqty, maxqty, questid, chance)
|
# (dropperid, itemid, minqty, maxqty, questid, chance)
|
||||||
|
|
||||||
|
|||||||
@@ -153,16 +153,6 @@ import server.maps.MapleMapItem;
|
|||||||
public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||||
private static final String LEVEL_200 = "[Congrats] %s has reached Level 200! Congratulate %s on such an amazing achievement!";
|
private static final String LEVEL_200 = "[Congrats] %s has reached Level 200! Congratulate %s on such an amazing achievement!";
|
||||||
|
|
||||||
// MapleStory default keyset
|
|
||||||
private static final int[] DEFAULT_KEY = {18, 65, 2, 23, 3, 4, 5, 6, 16, 17, 19, 25, 26, 27, 31, 34, 35, 37, 38, 40, 43, 44, 45, 46, 50, 56, 59, 60, 61, 62, 63, 64, 57, 48, 29, 7, 24, 33, 41, 39};
|
|
||||||
private static final int[] DEFAULT_TYPE = {4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 5, 6, 6, 6, 6, 6, 6, 5, 4, 5, 4, 4, 4, 4, 4};
|
|
||||||
private static final int[] DEFAULT_ACTION = {0, 106, 10, 1, 12, 13, 18, 24, 8, 5, 4, 19, 14, 15, 2, 17, 11, 3, 20, 16, 9, 50, 51, 6, 7, 53, 100, 101, 102, 103, 104, 105, 54, 22, 52, 21, 25, 26, 23, 27};
|
|
||||||
|
|
||||||
// MapleSolaxiaV2 custom keyset
|
|
||||||
private static final int[] CUSTOM_KEY = {2, 3, 4, 5, 31, 56, 59, 32, 42, 6, 17, 29, 30, 41, 50, 60, 61, 62, 63, 64, 65, 16, 7, 8};
|
|
||||||
private static final int[] CUSTOM_TYPE = {4, 4, 4, 4, 5, 5, 6, 5, 5, 4, 4, 4, 5, 4, 4, 6, 6, 6, 6, 6, 6, 4, 4, 4};
|
|
||||||
private static final int[] CUSTOM_ACTION = {1, 0, 3, 2, 53, 54, 100, 52, 51, 19, 5, 9, 50, 7, 22, 101, 102, 103, 104, 105, 106, 8, 17, 26};
|
|
||||||
|
|
||||||
private static final String[] BLOCKED_NAMES = {"admin", "owner", "moderator", "intern", "donor", "administrator", "help", "helper", "alert", "notice", "maplestory", "Solaxia", "fuck", "wizet", "fucking", "negro", "fuk", "fuc", "penis", "pussy", "asshole", "gay",
|
private static final String[] BLOCKED_NAMES = {"admin", "owner", "moderator", "intern", "donor", "administrator", "help", "helper", "alert", "notice", "maplestory", "Solaxia", "fuck", "wizet", "fucking", "negro", "fuk", "fuc", "penis", "pussy", "asshole", "gay",
|
||||||
"nigger", "homo", "suck", "cum", "shit", "shitty", "condom", "security", "official", "rape", "nigga", "sex", "tit", "boner", "orgy", "clit", "asshole", "fatass", "bitch", "support", "gamemaster", "cock", "gaay", "gm",
|
"nigger", "homo", "suck", "cum", "shit", "shitty", "condom", "security", "official", "rape", "nigga", "sex", "tit", "boner", "orgy", "clit", "asshole", "fatass", "bitch", "support", "gamemaster", "cock", "gaay", "gm",
|
||||||
"operate", "master", "sysop", "party", "GameMaster", "community", "message", "event", "test", "meso", "Scania", "renewal", "yata", "AsiaSoft", "henesys"};
|
"operate", "master", "sysop", "party", "GameMaster", "community", "message", "event", "test", "meso", "Scania", "renewal", "yata", "AsiaSoft", "henesys"};
|
||||||
@@ -380,14 +370,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
|||||||
int[] selectedAction;
|
int[] selectedAction;
|
||||||
|
|
||||||
if(ServerConstants.USE_CUSTOM_KEYSET) {
|
if(ServerConstants.USE_CUSTOM_KEYSET) {
|
||||||
selectedKey = CUSTOM_KEY;
|
selectedKey = GameConstants.getCustomKey(true);
|
||||||
selectedType = CUSTOM_TYPE;
|
selectedType = GameConstants.getCustomType(true);
|
||||||
selectedAction = CUSTOM_ACTION;
|
selectedAction = GameConstants.getCustomAction(true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
selectedKey = DEFAULT_KEY;
|
selectedKey = GameConstants.getCustomKey(false);
|
||||||
selectedType = DEFAULT_TYPE;
|
selectedType = GameConstants.getCustomType(false);
|
||||||
selectedAction = DEFAULT_ACTION;
|
selectedAction = GameConstants.getCustomAction(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < selectedKey.length; i++) {
|
for (int i = 0; i < selectedKey.length; i++) {
|
||||||
@@ -5297,14 +5287,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
|||||||
int[] selectedAction;
|
int[] selectedAction;
|
||||||
|
|
||||||
if(ServerConstants.USE_CUSTOM_KEYSET) {
|
if(ServerConstants.USE_CUSTOM_KEYSET) {
|
||||||
selectedKey = CUSTOM_KEY;
|
selectedKey = GameConstants.getCustomKey(true);
|
||||||
selectedType = CUSTOM_TYPE;
|
selectedType = GameConstants.getCustomType(true);
|
||||||
selectedAction = CUSTOM_ACTION;
|
selectedAction = GameConstants.getCustomAction(true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
selectedKey = DEFAULT_KEY;
|
selectedKey = GameConstants.getCustomKey(false);
|
||||||
selectedType = DEFAULT_TYPE;
|
selectedType = GameConstants.getCustomType(false);
|
||||||
selectedAction = DEFAULT_ACTION;
|
selectedAction = GameConstants.getCustomAction(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ps = con.prepareStatement("INSERT INTO keymap (characterid, `key`, `type`, `action`) VALUES (?, ?, ?, ?)");
|
ps = con.prepareStatement("INSERT INTO keymap (characterid, `key`, `type`, `action`) VALUES (?, ?, ?, ?)");
|
||||||
@@ -5736,7 +5726,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setDojoEnergy(int x) {
|
public void setDojoEnergy(int x) {
|
||||||
this.dojoEnergy = x;
|
this.dojoEnergy = Math.min(x, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDojoPoints(int x) {
|
public void setDojoPoints(int x) {
|
||||||
|
|||||||
@@ -1656,6 +1656,12 @@ public class Commands {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "maxenergy":
|
||||||
|
c.getPlayer().setDojoEnergy(10000);
|
||||||
|
c.announce(MaplePacketCreator.getEnergy("energy", 10000));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
|
break;
|
||||||
|
|
||||||
case "killall":
|
case "killall":
|
||||||
List<MapleMapObject> monsters = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
|
List<MapleMapObject> monsters = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
|
||||||
MapleMap map = player.getMap();
|
MapleMap map = player.getMap();
|
||||||
@@ -1976,7 +1982,6 @@ public class Commands {
|
|||||||
|
|
||||||
public static boolean executeSolaxiaCommandLv4(Channel cserv, Server srv, MapleClient c, String[] sub) { //SuperGM
|
public static boolean executeSolaxiaCommandLv4(Channel cserv, Server srv, MapleClient c, String[] sub) { //SuperGM
|
||||||
MapleCharacter player = c.getPlayer();
|
MapleCharacter player = c.getPlayer();
|
||||||
MapleCharacter victim;
|
|
||||||
|
|
||||||
switch(sub[0]) {
|
switch(sub[0]) {
|
||||||
case "servermessage":
|
case "servermessage":
|
||||||
|
|||||||
@@ -81,6 +81,19 @@ public class MaplePet extends Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteFromDb() {
|
||||||
|
try {
|
||||||
|
Connection con = DatabaseConnection.getConnection();
|
||||||
|
PreparedStatement ps = con.prepareStatement("DELETE FROM pets WHERE `petid` = ?");
|
||||||
|
ps.setInt(1, this.getUniqueId());
|
||||||
|
ps.executeUpdate();
|
||||||
|
ps.close();
|
||||||
|
con.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void saveToDb() {
|
public void saveToDb() {
|
||||||
try {
|
try {
|
||||||
Connection con = DatabaseConnection.getConnection();
|
Connection con = DatabaseConnection.getConnection();
|
||||||
@@ -210,6 +223,7 @@ public class MaplePet extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
owner.getMap().broadcastMessage(MaplePacketCreator.commandResponse(owner.getId(), slot, type, enjoyed));
|
owner.getMap().broadcastMessage(MaplePacketCreator.commandResponse(owner.getId(), slot, type, enjoyed));
|
||||||
|
if(owner.getMount() != null) owner.getMap().broadcastMessage(MaplePacketCreator.updateMount(owner.getId(), owner.getMount(), false));
|
||||||
saveToDb();
|
saveToDb();
|
||||||
|
|
||||||
Item petz = owner.getInventory(MapleInventoryType.CASH).getItem(getPosition());
|
Item petz = owner.getInventory(MapleInventoryType.CASH).getItem(getPosition());
|
||||||
|
|||||||
@@ -12,18 +12,40 @@ public class GameConstants {
|
|||||||
private static final int[] MESO_RATE_GAIN = {1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105};
|
private static final int[] MESO_RATE_GAIN = {1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105};
|
||||||
private static final int[] EXP_RATE_GAIN = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610}; //fibonacci :3
|
private static final int[] EXP_RATE_GAIN = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610}; //fibonacci :3
|
||||||
|
|
||||||
public static int getPlayerBonusMesoRate(int slot) {
|
|
||||||
return(MESO_RATE_GAIN[slot]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPlayerBonusDropRate(int slot) {
|
public static int getPlayerBonusDropRate(int slot) {
|
||||||
return(DROP_RATE_GAIN[slot]);
|
return(DROP_RATE_GAIN[slot]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getPlayerBonusMesoRate(int slot) {
|
||||||
|
return(MESO_RATE_GAIN[slot]);
|
||||||
|
}
|
||||||
|
|
||||||
public static int getPlayerBonusExpRate(int slot) {
|
public static int getPlayerBonusExpRate(int slot) {
|
||||||
return(EXP_RATE_GAIN[slot]);
|
return(EXP_RATE_GAIN[slot]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MapleStory default keyset
|
||||||
|
private static final int[] DEFAULT_KEY = {18, 65, 2, 23, 3, 4, 5, 6, 16, 17, 19, 25, 26, 27, 31, 34, 35, 37, 38, 40, 43, 44, 45, 46, 50, 56, 59, 60, 61, 62, 63, 64, 57, 48, 29, 7, 24, 33, 41, 39};
|
||||||
|
private static final int[] DEFAULT_TYPE = {4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 5, 6, 6, 6, 6, 6, 6, 5, 4, 5, 4, 4, 4, 4, 4};
|
||||||
|
private static final int[] DEFAULT_ACTION = {0, 106, 10, 1, 12, 13, 18, 24, 8, 5, 4, 19, 14, 15, 2, 17, 11, 3, 20, 16, 9, 50, 51, 6, 7, 53, 100, 101, 102, 103, 104, 105, 54, 22, 52, 21, 25, 26, 23, 27};
|
||||||
|
|
||||||
|
// MapleSolaxiaV2 custom keyset
|
||||||
|
private static final int[] CUSTOM_KEY = {2, 3, 4, 5, 31, 56, 59, 32, 42, 6, 17, 29, 30, 41, 50, 60, 61, 62, 63, 64, 65, 16, 7, 9, 13, 8};
|
||||||
|
private static final int[] CUSTOM_TYPE = {4, 4, 4, 4, 5, 5, 6, 5, 5, 4, 4, 4, 5, 4, 4, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4};
|
||||||
|
private static final int[] CUSTOM_ACTION = {1, 0, 3, 2, 53, 54, 100, 52, 51, 19, 5, 9, 50, 7, 22, 101, 102, 103, 104, 105, 106, 8, 17, 26, 20, 4};
|
||||||
|
|
||||||
|
public static int[] getCustomKey(boolean customKeyset) {
|
||||||
|
return(customKeyset ? CUSTOM_KEY : DEFAULT_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] getCustomType(boolean customKeyset) {
|
||||||
|
return(customKeyset ? CUSTOM_TYPE : DEFAULT_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] getCustomAction(boolean customKeyset) {
|
||||||
|
return(customKeyset ? CUSTOM_ACTION : DEFAULT_ACTION);
|
||||||
|
}
|
||||||
|
|
||||||
private static final int[] mobHpVal = {0, 15, 20, 25, 35, 50, 65, 80, 95, 110, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350,
|
private static final int[] mobHpVal = {0, 15, 20, 25, 35, 50, 65, 80, 95, 110, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350,
|
||||||
375, 405, 435, 465, 495, 525, 580, 650, 720, 790, 900, 990, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800,
|
375, 405, 435, 465, 495, 525, 580, 650, 720, 790, 900, 990, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800,
|
||||||
1900, 2000, 2100, 2200, 2300, 2400, 2520, 2640, 2760, 2880, 3000, 3200, 3400, 3600, 3800, 4000, 4300, 4600, 4900, 5200,
|
1900, 2000, 2100, 2200, 2300, 2400, 2520, 2640, 2760, 2880, 3000, 3200, 3400, 3600, 3800, 4000, 4300, 4600, 4900, 5200,
|
||||||
@@ -115,6 +137,10 @@ public class GameConstants {
|
|||||||
return skill >= 9001000 && skill <= 9101008 || skill >= 8001000 && skill <= 8001001;
|
return skill >= 9001000 && skill <= 9101008 || skill >= 8001000 && skill <= 8001001;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isBossRush(int mapid) {
|
||||||
|
return mapid >= 970030100 && mapid <= 970042711;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isDojo(int mapid) {
|
public static boolean isDojo(int mapid) {
|
||||||
return mapid >= 925020100 && mapid <= 925023814;
|
return mapid >= 925020100 && mapid <= 925023814;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class ServerConstants {
|
|||||||
public static String DB_URL = "";
|
public static String DB_URL = "";
|
||||||
public static String DB_USER = "";
|
public static String DB_USER = "";
|
||||||
public static String DB_PASS = "";
|
public static String DB_PASS = "";
|
||||||
public static final short DB_EXPERIMENTAL_POOLS = 4; //[EXPERIMENTAL] Installs a set number of database drivers/pools to hub connections. Set 0 to default.
|
public static final boolean DB_EXPERIMENTAL_POOL = true; //[EXPERIMENTAL] Installs a connection pool to hub DB connections. Set false to default.
|
||||||
|
|
||||||
//World And Version
|
//World And Version
|
||||||
public static short VERSION = 83;
|
public static short VERSION = 83;
|
||||||
@@ -30,7 +30,7 @@ public class ServerConstants {
|
|||||||
public static boolean JAVA_8;
|
public static boolean JAVA_8;
|
||||||
public static boolean SHUTDOWNHOOK;
|
public static boolean SHUTDOWNHOOK;
|
||||||
|
|
||||||
//Gameplay Configuration
|
//Server Flags
|
||||||
public static final boolean USE_CUSTOM_KEYSET = true; //Enables auto-setup of the MapleSolaxiaV2's custom keybindings when creating characters.
|
public static final boolean USE_CUSTOM_KEYSET = true; //Enables auto-setup of the MapleSolaxiaV2's custom keybindings when creating characters.
|
||||||
public static final boolean USE_MAXRANGE_ECHO_OF_HERO = true;
|
public static final boolean USE_MAXRANGE_ECHO_OF_HERO = true;
|
||||||
public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range.
|
public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range.
|
||||||
@@ -46,11 +46,19 @@ public class ServerConstants {
|
|||||||
public static final boolean USE_AUTOBAN = false; //Commands the server to detect infractors automatically.
|
public static final boolean USE_AUTOBAN = false; //Commands the server to detect infractors automatically.
|
||||||
public static final boolean USE_ANOTHER_AUTOASSIGN = true; //Based on distributing AP accordingly to required secondary stat on equipments.
|
public static final boolean USE_ANOTHER_AUTOASSIGN = true; //Based on distributing AP accordingly to required secondary stat on equipments.
|
||||||
public static final boolean USE_REFRESH_RANK_MOVE = true;
|
public static final boolean USE_REFRESH_RANK_MOVE = true;
|
||||||
public static final boolean USE_PERFECT_PITCH = true; //For lvl 30 or above, each lvlup player gains 1 perfect pitch.
|
|
||||||
public static final boolean USE_PERMISSIVE_BUFFS = false; //WARNING: Allows players that does not have increased certain buff-type skills to use it's effect. Used mainly on buff-cast commands, however making this active may generate a source for possible client-edited exploits.
|
public static final boolean USE_PERMISSIVE_BUFFS = false; //WARNING: Allows players that does not have increased certain buff-type skills to use it's effect. Used mainly on buff-cast commands, however making this active may generate a source for possible client-edited exploits.
|
||||||
public static final boolean USE_ENFORCE_MDOOR_POSITION = true; //Forces mystic door to be spawned near spawnpoints. (since things bugs out other way, and this helps players locate the door faster)
|
public static final boolean USE_ENFORCE_MDOOR_POSITION = true; //Forces mystic door to be spawned near spawnpoints. (since things bugs out other way, and this helps players locate the door faster)
|
||||||
public static final boolean USE_ERASE_UNTRADEABLE_DROP = true; //Forces flagged untradeable items to disappear when dropped.
|
public static final boolean USE_ERASE_UNTRADEABLE_DROP = true; //Forces flagged untradeable items to disappear when dropped.
|
||||||
|
|
||||||
|
//Server Rates And Experience
|
||||||
|
public static final int EXP_RATE = 10;
|
||||||
|
public static final int MESO_RATE = 10;
|
||||||
|
public static final int DROP_RATE = 10;
|
||||||
|
public static final int BOSS_DROP_RATE = 20;
|
||||||
|
public static final int PARTY_EXPERIENCE_MOD = 1; //Change for event stuff.
|
||||||
|
public static final double EQUIP_EXPERIENCE_MOD = 10.0; //Rate for equipment exp needed, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2).
|
||||||
|
public static final double PQ_BONUS_EXP_MOD = 0.5;
|
||||||
|
|
||||||
public static final int MAX_AP = 20000; //Max AP allotted on the auto-assigner.
|
public static final int MAX_AP = 20000; //Max AP allotted on the auto-assigner.
|
||||||
public static final int MAX_EVENT_LEVELS = 8; //Event has different levels of rewarding system.
|
public static final int MAX_EVENT_LEVELS = 8; //Event has different levels of rewarding system.
|
||||||
public static final long BLOCK_NPC_RACE_CONDT = (long)(0.5 * 1000); //Time the player client must wait before reopening a conversation with an NPC.
|
public static final long BLOCK_NPC_RACE_CONDT = (long)(0.5 * 1000); //Time the player client must wait before reopening a conversation with an NPC.
|
||||||
@@ -61,16 +69,26 @@ public class ServerConstants {
|
|||||||
public static final int ITEM_MONITOR_TIME = 5 * 60 * 1000; //Interval between item monitoring task on maps, which checks for dangling item objects on the map item history.
|
public static final int ITEM_MONITOR_TIME = 5 * 60 * 1000; //Interval between item monitoring task on maps, which checks for dangling item objects on the map item history.
|
||||||
public static final int ITEM_LIMIT_ON_MAP = 250; //Max number of items allowed on a map.
|
public static final int ITEM_LIMIT_ON_MAP = 250; //Max number of items allowed on a map.
|
||||||
|
|
||||||
//Some Gameplay Enhancing Configuration
|
//Some Gameplay Enhancing Configurations
|
||||||
|
//Scroll Configuration
|
||||||
public static final boolean USE_PERFECT_SCROLLING = true; //Scrolls doesn't use slots upon failure.
|
public static final boolean USE_PERFECT_SCROLLING = true; //Scrolls doesn't use slots upon failure.
|
||||||
public static final boolean USE_ENHANCED_CHSCROLL = true; //Equips even more powerful with chaos upgrade.
|
public static final boolean USE_ENHANCED_CHSCROLL = true; //Equips even more powerful with chaos upgrade.
|
||||||
public static final boolean USE_ENHANCED_CRAFTING = true; //Applys chaos scroll on every equip crafted.
|
public static final boolean USE_ENHANCED_CRAFTING = true; //Applys chaos scroll on every equip crafted.
|
||||||
|
|
||||||
|
//Beginner Skills Configuration
|
||||||
public static final boolean USE_ULTRA_NIMBLE_FEET = true; //Haste-like speed & jump upgrade.
|
public static final boolean USE_ULTRA_NIMBLE_FEET = true; //Haste-like speed & jump upgrade.
|
||||||
public static final boolean USE_ULTRA_RECOVERY = true; //Massive recovery amounts overtime.
|
public static final boolean USE_ULTRA_RECOVERY = true; //Massive recovery amounts overtime.
|
||||||
public static final boolean USE_ULTRA_THREE_SNAILS = true; //Massive damage on shell toss.
|
public static final boolean USE_ULTRA_THREE_SNAILS = true; //Massive damage on shell toss.
|
||||||
|
|
||||||
|
//Character Configuration
|
||||||
public static final boolean USE_ADD_SLOTS_BY_LEVEL = true; //Slots are added each 20 levels.
|
public static final boolean USE_ADD_SLOTS_BY_LEVEL = true; //Slots are added each 20 levels.
|
||||||
public static final boolean USE_ADD_RATES_BY_LEVEL = true; //Rates are added each 20 levels.
|
public static final boolean USE_ADD_RATES_BY_LEVEL = true; //Rates are added each 20 levels.
|
||||||
public static final boolean USE_STACK_COUPON_RATES = true; //Multiple coupons effects builds up together.
|
public static final boolean USE_STACK_COUPON_RATES = true; //Multiple coupons effects builds up together.
|
||||||
|
public static final boolean USE_PERFECT_PITCH = true; //For lvl 30 or above, each lvlup grants player 1 perfect pitch.
|
||||||
|
public static final int FAME_GAIN_BY_QUEST = 4; //Fame gain each N quest completes, set 0 to disable.
|
||||||
|
public static final int SCROLL_CHANCE_RATE = 10; //Number of rolls for success on a scroll, set 0 for default.
|
||||||
|
|
||||||
|
//Equipment Configuration
|
||||||
public static final boolean USE_EQUIPMNT_LVLUP_SLOTS = true;//Equips can upgrade slots at level up.
|
public static final boolean USE_EQUIPMNT_LVLUP_SLOTS = true;//Equips can upgrade slots at level up.
|
||||||
public static final boolean USE_EQUIPMNT_LVLUP_POWER = true;//Enable more powerful stats upgrades at equip level up.
|
public static final boolean USE_EQUIPMNT_LVLUP_POWER = true;//Enable more powerful stats upgrades at equip level up.
|
||||||
public static final boolean USE_SPIKES_AVOID_BANISH = true; //Shoes equipped with spikes blocks mobs from banishing wearer.
|
public static final boolean USE_SPIKES_AVOID_BANISH = true; //Shoes equipped with spikes blocks mobs from banishing wearer.
|
||||||
@@ -80,8 +98,6 @@ public class ServerConstants {
|
|||||||
public static final int USE_EQUIPMNT_LVLUP = 7; //All equips lvlup at max level of N, set 1 to disable.
|
public static final int USE_EQUIPMNT_LVLUP = 7; //All equips lvlup at max level of N, set 1 to disable.
|
||||||
public static final byte CHAIR_EXTRA_HEAL_HP = 70; //Each chair extra heal proc increasing HP.
|
public static final byte CHAIR_EXTRA_HEAL_HP = 70; //Each chair extra heal proc increasing HP.
|
||||||
public static final byte CHAIR_EXTRA_HEAL_MP = 42; //Each chair extra heal proc increasing MP.
|
public static final byte CHAIR_EXTRA_HEAL_MP = 42; //Each chair extra heal proc increasing MP.
|
||||||
public static final int FAME_GAIN_BY_QUEST = 4; //Fame gain each N quest completes, set 0 to disable.
|
|
||||||
public static final int SCROLL_CHANCE_RATE = 10; //Number of rolls for success on a scroll, set 0 for default.
|
|
||||||
|
|
||||||
//Pet Auto-Pot Recovery Rates
|
//Pet Auto-Pot Recovery Rates
|
||||||
public static final double PET_AUTOHP_RATIO = 0.99; //Will automatically consume potions until given ratio of the MaxHP/MaxMP is reached.
|
public static final double PET_AUTOHP_RATIO = 0.99; //Will automatically consume potions until given ratio of the MaxHP/MaxMP is reached.
|
||||||
@@ -89,20 +105,13 @@ public class ServerConstants {
|
|||||||
|
|
||||||
//Dojo Configuration
|
//Dojo Configuration
|
||||||
public static final boolean USE_DEADLY_DOJO = false; //Should bosses really use 1HP,1MP attacks in dojo?
|
public static final boolean USE_DEADLY_DOJO = false; //Should bosses really use 1HP,1MP attacks in dojo?
|
||||||
|
public static final int DOJO_ENERGY_ATK = 100; //Dojo energy gain when deal attack
|
||||||
|
public static final int DOJO_ENERGY_DMG = 20; //Dojo energy gain when recv attack
|
||||||
|
|
||||||
//Pet Hungry Configuration
|
//Pet Hunger Configuration
|
||||||
public static final boolean PETS_NEVER_HUNGRY = false; //If true, pets and mounts will never grow hungry.
|
public static final boolean PETS_NEVER_HUNGRY = false; //If true, pets and mounts will never grow hungry.
|
||||||
public static final boolean GM_PETS_NEVER_HUNGRY = true; //If true, pets and mounts owned by GMs will never grow hungry.
|
public static final boolean GM_PETS_NEVER_HUNGRY = true; //If true, pets and mounts owned by GMs will never grow hungry.
|
||||||
|
|
||||||
//Rates And Experience
|
|
||||||
public static final int EXP_RATE = 10;
|
|
||||||
public static final int MESO_RATE = 10;
|
|
||||||
public static final int DROP_RATE = 10;
|
|
||||||
public static final int BOSS_DROP_RATE = 20;
|
|
||||||
public static final int PARTY_EXPERIENCE_MOD = 1; //Change for event stuff.
|
|
||||||
public static final double EQUIP_EXPERIENCE_MOD = 10.0; //Rate for equipment exp needed, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2).
|
|
||||||
public static final double PQ_BONUS_EXP_MOD = 0.5;
|
|
||||||
|
|
||||||
//Event End Timestamp
|
//Event End Timestamp
|
||||||
public static final long EVENT_END_TIMESTAMP = 1428897600000L;
|
public static final long EVENT_END_TIMESTAMP = 1428897600000L;
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class Beginner {
|
|||||||
public static final int ECHO_OF_HERO = 1005;
|
public static final int ECHO_OF_HERO = 1005;
|
||||||
public static final int BAMBOO_RAIN = 1009;
|
public static final int BAMBOO_RAIN = 1009;
|
||||||
public static final int INVINCIBLE_BARRIER = 1010;
|
public static final int INVINCIBLE_BARRIER = 1010;
|
||||||
public static final int BERSERK_FURY = 1011;
|
public static final int POWER_EXPLOSION = 1011;
|
||||||
public static final int SPACESHIP = 1013;
|
public static final int SPACESHIP = 1013;
|
||||||
public static final int SPACE_DASH = 1014;
|
public static final int SPACE_DASH = 1014;
|
||||||
public static final int YETI_MOUNT1 = 1017;
|
public static final int YETI_MOUNT1 = 1017;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class Evan {
|
|||||||
public static final int MAKER = 20011007;
|
public static final int MAKER = 20011007;
|
||||||
public static final int BAMBOO_THRUST = 20011009;
|
public static final int BAMBOO_THRUST = 20011009;
|
||||||
public static final int INVINCIBLE_BARRIER = 20011010;
|
public static final int INVINCIBLE_BARRIER = 20011010;
|
||||||
public static final int BERSERK_FURY = 20011011;
|
public static final int POWER_EXPLOSION = 20011011;
|
||||||
// EVAN2
|
// EVAN2
|
||||||
public static final int DRAGON_SOUL = 22000000;
|
public static final int DRAGON_SOUL = 22000000;
|
||||||
public static final int MAGIC_MISSILE = 22001001;
|
public static final int MAGIC_MISSILE = 22001001;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ public class Legend {
|
|||||||
public static final int MAKER = 20001007;
|
public static final int MAKER = 20001007;
|
||||||
public static final int BAMBOO_THRUST = 20001009;
|
public static final int BAMBOO_THRUST = 20001009;
|
||||||
public static final int INVICIBLE_BARRIER = 20001010;
|
public static final int INVICIBLE_BARRIER = 20001010;
|
||||||
|
public static final int POWER_EXPLOSION = 20011011;
|
||||||
public static final int METEO_SHOWER = 20001011;
|
public static final int METEO_SHOWER = 20001011;
|
||||||
public static final int BLESSING_OF_THE_FAIRY = 20000012;
|
public static final int BLESSING_OF_THE_FAIRY = 20000012;
|
||||||
public static final int TUTORIAL_SKILL1 = 20000014;
|
public static final int TUTORIAL_SKILL1 = 20000014;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class Noblesse {
|
|||||||
public static final int MAKER = 10001007;
|
public static final int MAKER = 10001007;
|
||||||
public static final int BAMBOO_RAIN = 10001009;
|
public static final int BAMBOO_RAIN = 10001009;
|
||||||
public static final int INVINCIBLE_BARRIER = 10001010;
|
public static final int INVINCIBLE_BARRIER = 10001010;
|
||||||
public static final int BERSERK_FURY = 10001011;
|
public static final int POWER_EXPLOSION = 10001011;
|
||||||
public static final int SPACESHIP = 1001014;
|
public static final int SPACESHIP = 1001014;
|
||||||
public static final int SPACE_DASH = 1001015;
|
public static final int SPACE_DASH = 1001015;
|
||||||
public static final int YETI_MOUNT1 = 10001019;
|
public static final int YETI_MOUNT1 = 10001019;
|
||||||
|
|||||||
@@ -68,6 +68,14 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c.getPlayer().getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging
|
||||||
|
return;
|
||||||
|
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||||
|
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||||
|
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
|
}
|
||||||
|
|
||||||
player.getMap().broadcastMessage(player, MaplePacketCreator.closeRangeAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true);
|
player.getMap().broadcastMessage(player, MaplePacketCreator.closeRangeAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true);
|
||||||
int numFinisherOrbs = 0;
|
int numFinisherOrbs = 0;
|
||||||
Integer comboBuff = player.getBuffedValue(MapleBuffStat.COMBO);
|
Integer comboBuff = player.getBuffedValue(MapleBuffStat.COMBO);
|
||||||
@@ -152,7 +160,16 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
|
|||||||
if (numFinisherOrbs == 0 && GameConstants.isFinisherSkill(attack.skill)) {
|
if (numFinisherOrbs == 0 && GameConstants.isFinisherSkill(attack.skill)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (attack.skill > 0) {
|
if (attack.skill % 10000000 == 1009) { // bamboo
|
||||||
|
if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.setDojoEnergy(0);
|
||||||
|
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||||
|
c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset."));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
|
} else if (attack.skill > 0) {
|
||||||
Skill skill = SkillFactory.getSkill(attack.skill);
|
Skill skill = SkillFactory.getSkill(attack.skill);
|
||||||
MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill));
|
MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill));
|
||||||
if (effect_.getCooldown() > 0) {
|
if (effect_.getCooldown() > 0) {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import client.MapleCharacter.CancelCooldownAction;
|
|||||||
import client.MapleClient;
|
import client.MapleClient;
|
||||||
import client.Skill;
|
import client.Skill;
|
||||||
import client.SkillFactory;
|
import client.SkillFactory;
|
||||||
|
import constants.ServerConstants;
|
||||||
import constants.skills.Bishop;
|
import constants.skills.Bishop;
|
||||||
import constants.skills.Evan;
|
import constants.skills.Evan;
|
||||||
import constants.skills.FPArchMage;
|
import constants.skills.FPArchMage;
|
||||||
@@ -58,6 +59,12 @@ public final class MagicDamageHandler extends AbstractDealDamageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||||
|
player.setDojoEnergy(player.getDojoEnergy() + + ServerConstants.DOJO_ENERGY_ATK);
|
||||||
|
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
|
}
|
||||||
|
|
||||||
int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1;
|
int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1;
|
||||||
byte[] packet = MaplePacketCreator.magicAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display);
|
byte[] packet = MaplePacketCreator.magicAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display);
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public final class PetCommandHandler extends AbstractMaplePacketHandler {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
chr.getMap().broadcastMessage(MaplePacketCreator.commandResponse(chr.getId(), petIndex, command, false));
|
chr.getMap().broadcastMessage(MaplePacketCreator.commandResponse(chr.getId(), petIndex, command, false));
|
||||||
|
if(chr.getMount() != null) chr.getMap().broadcastMessage(MaplePacketCreator.updateMount(chr.getId(), chr.getMount(), false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,6 +39,7 @@ import client.inventory.MapleInventory;
|
|||||||
import client.inventory.MapleInventoryType;
|
import client.inventory.MapleInventoryType;
|
||||||
import client.inventory.MapleWeaponType;
|
import client.inventory.MapleWeaponType;
|
||||||
import constants.ItemConstants;
|
import constants.ItemConstants;
|
||||||
|
import constants.ServerConstants;
|
||||||
import constants.skills.Aran;
|
import constants.skills.Aran;
|
||||||
import constants.skills.Buccaneer;
|
import constants.skills.Buccaneer;
|
||||||
import constants.skills.NightLord;
|
import constants.skills.NightLord;
|
||||||
@@ -70,6 +71,12 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||||
|
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||||
|
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
|
}
|
||||||
|
|
||||||
if (attack.skill == Buccaneer.ENERGY_ORB || attack.skill == ThunderBreaker.SPARK || attack.skill == Shadower.TAUNT || attack.skill == NightLord.TAUNT) {
|
if (attack.skill == Buccaneer.ENERGY_ORB || attack.skill == ThunderBreaker.SPARK || attack.skill == Shadower.TAUNT || attack.skill == NightLord.TAUNT) {
|
||||||
player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
||||||
applyAttack(attack, player, 1);
|
applyAttack(attack, player, 1);
|
||||||
|
|||||||
@@ -66,19 +66,11 @@ public final class SpawnPetHandler extends AbstractMaplePacketHandler {
|
|||||||
if (petId == -1) {
|
if (petId == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
Connection con = DatabaseConnection.getConnection();
|
|
||||||
PreparedStatement ps = con.prepareStatement("DELETE FROM pets WHERE `petid` = ?");
|
|
||||||
ps.setInt(1, pet.getUniqueId());
|
|
||||||
ps.executeUpdate();
|
|
||||||
ps.close();
|
|
||||||
con.close();
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
long expiration = chr.getInventory(MapleInventoryType.CASH).getItem(slot).getExpiration();
|
long expiration = chr.getInventory(MapleInventoryType.CASH).getItem(slot).getExpiration();
|
||||||
MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, petid, (short) 1, false, false);
|
MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, petid, (short) 1, false, false);
|
||||||
MapleInventoryManipulator.addById(c, evolveid, (short) 1, null, petId, expiration);
|
MapleInventoryManipulator.addById(c, evolveid, (short) 1, null, petId, expiration);
|
||||||
|
pet.deleteFromDb();
|
||||||
|
|
||||||
c.announce(MaplePacketCreator.enableActions());
|
c.announce(MaplePacketCreator.enableActions());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,9 +69,13 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
|
|||||||
Skill skill = SkillFactory.getSkill(skillid);
|
Skill skill = SkillFactory.getSkill(skillid);
|
||||||
int skillLevel = chr.getSkillLevel(skill);
|
int skillLevel = chr.getSkillLevel(skill);
|
||||||
if (skillid % 10000000 == 1010 || skillid % 10000000 == 1011) {
|
if (skillid % 10000000 == 1010 || skillid % 10000000 == 1011) {
|
||||||
|
if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||||
|
return;
|
||||||
|
}
|
||||||
skillLevel = 1;
|
skillLevel = 1;
|
||||||
chr.setDojoEnergy(0);
|
c.getPlayer().setDojoEnergy(0);
|
||||||
c.announce(MaplePacketCreator.getEnergy("energy", 0));
|
c.announce(MaplePacketCreator.getEnergy("energy", c.getPlayer().getDojoEnergy()));
|
||||||
|
c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset."));
|
||||||
}
|
}
|
||||||
if (skillLevel == 0 || skillLevel != __skillLevel) return;
|
if (skillLevel == 0 || skillLevel != __skillLevel) return;
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import client.inventory.Item;
|
|||||||
import client.inventory.MapleInventoryType;
|
import client.inventory.MapleInventoryType;
|
||||||
import client.status.MonsterStatus;
|
import client.status.MonsterStatus;
|
||||||
import client.status.MonsterStatusEffect;
|
import client.status.MonsterStatusEffect;
|
||||||
|
import constants.GameConstants;
|
||||||
import constants.ServerConstants;
|
import constants.ServerConstants;
|
||||||
import constants.skills.Aran;
|
import constants.skills.Aran;
|
||||||
import constants.skills.Corsair;
|
import constants.skills.Corsair;
|
||||||
@@ -232,9 +233,10 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
|
|||||||
map.broadcastGMMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
map.broadcastGMMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
||||||
player.checkBerserk(false);
|
player.checkBerserk(false);
|
||||||
}
|
}
|
||||||
if (map.getId() >= 925020000 && map.getId() < 925030000) {
|
if (GameConstants.isDojo(map.getId())) {
|
||||||
player.setDojoEnergy(player.isGM() ? 300 : player.getDojoEnergy() < 300 ? player.getDojoEnergy() + 1 : 0); //Fking gm's
|
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_DMG);
|
||||||
player.getClient().announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||||
|
System.out.println("gauge " + player.getDojoEnergy());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (MapleCharacter chr : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :)
|
for (MapleCharacter chr : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :)
|
||||||
|
|||||||
@@ -431,7 +431,7 @@ public class AbstractPlayerInteraction {
|
|||||||
evolved.setStance(0);
|
evolved.setStance(0);
|
||||||
evolved.setSummoned(true);
|
evolved.setSummoned(true);
|
||||||
|
|
||||||
evolved.setName(from.getName());
|
evolved.setName(from.getName().compareTo(MapleItemInformationProvider.getInstance().getName(from.getItemId())) != 0 ? from.getName() : MapleItemInformationProvider.getInstance().getName(id));
|
||||||
evolved.setCloseness(from.getCloseness());
|
evolved.setCloseness(from.getCloseness());
|
||||||
evolved.setFullness(from.getFullness());
|
evolved.setFullness(from.getFullness());
|
||||||
evolved.setLevel(from.getLevel());
|
evolved.setLevel(from.getLevel());
|
||||||
|
|||||||
@@ -336,11 +336,6 @@ public class MapleStatEffect {
|
|||||||
case Legend.BALROG_MOUNT:
|
case Legend.BALROG_MOUNT:
|
||||||
statups.add(new Pair<>(MapleBuffStat.MONSTER_RIDING, Integer.valueOf(sourceid)));
|
statups.add(new Pair<>(MapleBuffStat.MONSTER_RIDING, Integer.valueOf(sourceid)));
|
||||||
break;
|
break;
|
||||||
case Beginner.BERSERK_FURY:
|
|
||||||
case Noblesse.BERSERK_FURY:
|
|
||||||
case Evan.BERSERK_FURY:
|
|
||||||
statups.add(new Pair<>(MapleBuffStat.BERSERK_FURY, Integer.valueOf(1)));
|
|
||||||
break;
|
|
||||||
case Beginner.INVINCIBLE_BARRIER:
|
case Beginner.INVINCIBLE_BARRIER:
|
||||||
case Noblesse.INVINCIBLE_BARRIER:
|
case Noblesse.INVINCIBLE_BARRIER:
|
||||||
case Legend.INVICIBLE_BARRIER:
|
case Legend.INVICIBLE_BARRIER:
|
||||||
@@ -520,6 +515,9 @@ public class MapleStatEffect {
|
|||||||
case NightWalker.CLAW_BOOSTER:
|
case NightWalker.CLAW_BOOSTER:
|
||||||
case ThunderBreaker.KNUCKLER_BOOSTER:
|
case ThunderBreaker.KNUCKLER_BOOSTER:
|
||||||
case Evan.MAGIC_BOOSTER:
|
case Evan.MAGIC_BOOSTER:
|
||||||
|
case Beginner.POWER_EXPLOSION:
|
||||||
|
case Noblesse.POWER_EXPLOSION:
|
||||||
|
case Legend.POWER_EXPLOSION:
|
||||||
statups.add(new Pair<>(MapleBuffStat.BOOSTER, Integer.valueOf(x)));
|
statups.add(new Pair<>(MapleBuffStat.BOOSTER, Integer.valueOf(x)));
|
||||||
break;
|
break;
|
||||||
case Hero.MAPLE_WARRIOR:
|
case Hero.MAPLE_WARRIOR:
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import java.util.List;
|
|||||||
import client.MapleCharacter;
|
import client.MapleCharacter;
|
||||||
import client.MapleDisease;
|
import client.MapleDisease;
|
||||||
import client.status.MonsterStatus;
|
import client.status.MonsterStatus;
|
||||||
|
import constants.GameConstants;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import tools.Randomizer;
|
import tools.Randomizer;
|
||||||
@@ -224,6 +225,9 @@ public class MobSkill {
|
|||||||
if (monster.getMap().getSpawnedMonstersOnMap() < 80) {
|
if (monster.getMap().getSpawnedMonstersOnMap() < 80) {
|
||||||
for (Integer mobId : getSummons()) {
|
for (Integer mobId : getSummons()) {
|
||||||
MapleMonster toSpawn = MapleLifeFactory.getMonster(mobId);
|
MapleMonster toSpawn = MapleLifeFactory.getMonster(mobId);
|
||||||
|
if(toSpawn != null) {
|
||||||
|
if(GameConstants.isBossRush(monster.getMap().getId())) toSpawn.disableDrops(); // no littering on BRPQ pls
|
||||||
|
|
||||||
toSpawn.setPosition(monster.getPosition());
|
toSpawn.setPosition(monster.getPosition());
|
||||||
int ypos, xpos;
|
int ypos, xpos;
|
||||||
xpos = (int) monster.getPosition().getX();
|
xpos = (int) monster.getPosition().getX();
|
||||||
@@ -270,7 +274,7 @@ public class MobSkill {
|
|||||||
} else {
|
} else {
|
||||||
monster.getMap().spawnMonsterWithEffect(toSpawn, getSpawnEffect(), toSpawn.getPosition());
|
monster.getMap().spawnMonsterWithEffect(toSpawn, getSpawnEffect(), toSpawn.getPosition());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -3,12 +3,8 @@ package tools;
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Properties;
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
import org.apache.commons.dbcp2.ConnectionFactory;
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
|
|
||||||
import org.apache.commons.dbcp2.PoolableConnectionFactory;
|
|
||||||
import org.apache.commons.dbcp2.PoolingDriver;
|
|
||||||
import org.apache.commons.pool2.impl.GenericObjectPool;
|
|
||||||
|
|
||||||
import constants.ServerConstants;
|
import constants.ServerConstants;
|
||||||
|
|
||||||
@@ -18,56 +14,37 @@ import constants.ServerConstants;
|
|||||||
* @author Ronan (some connection pool to this beautiful code)
|
* @author Ronan (some connection pool to this beautiful code)
|
||||||
*/
|
*/
|
||||||
public class DatabaseConnection {
|
public class DatabaseConnection {
|
||||||
private static Properties prop;
|
private static HikariDataSource ds;
|
||||||
|
|
||||||
public static Connection getConnection() throws SQLException {
|
public static Connection getConnection() throws SQLException {
|
||||||
if(prop != null) {
|
if(ds != null) {
|
||||||
Connection con = null;
|
return ds.getConnection();
|
||||||
while(con == null) { //oh yes, this will loop until success!
|
|
||||||
try {
|
|
||||||
con = DriverManager.getConnection(ServerConstants.DB_URL, prop);
|
|
||||||
} catch (SQLException sqle) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
return con;
|
|
||||||
} else {
|
} else {
|
||||||
return DriverManager.getConnection(ServerConstants.DB_URL, ServerConstants.DB_USER, ServerConstants.DB_PASS);
|
return DriverManager.getConnection(ServerConstants.DB_URL, ServerConstants.DB_USER, ServerConstants.DB_PASS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Properties getProperties() {
|
|
||||||
Properties connectionProperties = new Properties();
|
|
||||||
connectionProperties.put("user", ServerConstants.DB_USER);
|
|
||||||
connectionProperties.put("password", ServerConstants.DB_PASS);
|
|
||||||
|
|
||||||
connectionProperties.put("minIdle", "-1");
|
|
||||||
connectionProperties.put("maxIdle", "-1");
|
|
||||||
|
|
||||||
connectionProperties.put("testOnBorrow", "true");
|
|
||||||
connectionProperties.put("lifo", "false");
|
|
||||||
|
|
||||||
connectionProperties.put("maxTotal", "42"); //max allotted connections
|
|
||||||
connectionProperties.put("maxConnLifetimeMillis", "60000"); //connection remains valid for 1 min
|
|
||||||
connectionProperties.put("maxWaitMillis", "777"); //there are more pools, if this one is unavailable then pass to another already
|
|
||||||
connectionProperties.put("poolPreparedStatements", "true");
|
|
||||||
connectionProperties.put("maxOpenPreparedStatements", "100"); //max allotted PS
|
|
||||||
|
|
||||||
return connectionProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PoolingDriver installDriver(short id) {
|
|
||||||
GenericObjectPool connectionPool = new GenericObjectPool(null);
|
|
||||||
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(ServerConstants.DB_URL, prop);
|
|
||||||
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool.getJmxName());
|
|
||||||
PoolingDriver driver = new PoolingDriver();
|
|
||||||
driver.registerPool("maplesolaxiapool" + id, connectionPool);
|
|
||||||
|
|
||||||
return driver;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DatabaseConnection() {
|
public DatabaseConnection() {
|
||||||
prop = null;
|
ds = null;
|
||||||
|
|
||||||
|
if(ServerConstants.DB_EXPERIMENTAL_POOL) {
|
||||||
|
// Connection Pool on database ftw!
|
||||||
|
|
||||||
|
HikariConfig config = new HikariConfig();
|
||||||
|
config.setJdbcUrl(ServerConstants.DB_URL);
|
||||||
|
|
||||||
|
config.setUsername(ServerConstants.DB_USER);
|
||||||
|
config.setPassword(ServerConstants.DB_PASS);
|
||||||
|
|
||||||
|
config.addDataSourceProperty("connectionTimeout", "30000");
|
||||||
|
config.addDataSourceProperty("maximumPoolSize", "100");
|
||||||
|
|
||||||
|
config.addDataSourceProperty("cachePrepStmts", "true");
|
||||||
|
config.addDataSourceProperty("prepStmtCacheSize", "250");
|
||||||
|
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
|
||||||
|
|
||||||
|
ds = new HikariDataSource(config);
|
||||||
|
} else {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver
|
Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
@@ -75,18 +52,6 @@ public class DatabaseConnection {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ServerConstants.DB_EXPERIMENTAL_POOLS > 0) {
|
|
||||||
// Connection Pool on database ftw!
|
|
||||||
|
|
||||||
prop = getProperties();
|
|
||||||
try {
|
|
||||||
for(short i = 0; i < ServerConstants.DB_EXPERIMENTAL_POOLS; i++) {
|
|
||||||
DriverManager.registerDriver(installDriver(i));
|
|
||||||
}
|
|
||||||
} catch(SQLException sqle) {
|
|
||||||
sqle.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Binary file not shown.
@@ -3191,7 +3191,49 @@
|
|||||||
<int name="4" value="110030001" />
|
<int name="4" value="110030001" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2382030" />
|
<int name="0" value="1040080" />
|
||||||
|
<int name="1" value="1041074" />
|
||||||
|
<int name="2" value="1050000" />
|
||||||
|
<int name="3" value="1050038" />
|
||||||
|
<int name="4" value="1060068" />
|
||||||
|
<int name="5" value="1061069" />
|
||||||
|
<int name="6" value="1072113" />
|
||||||
|
<int name="7" value="1072121" />
|
||||||
|
<int name="8" value="1072297" />
|
||||||
|
<int name="9" value="1082056" />
|
||||||
|
<int name="10" value="1082074" />
|
||||||
|
<int name="11" value="1092014" />
|
||||||
|
<int name="12" value="1302017" />
|
||||||
|
<int name="13" value="1302020" />
|
||||||
|
<int name="14" value="1302030" />
|
||||||
|
<int name="15" value="1322021" />
|
||||||
|
<int name="16" value="1322022" />
|
||||||
|
<int name="17" value="1322023" />
|
||||||
|
<int name="18" value="1322024" />
|
||||||
|
<int name="19" value="1332020" />
|
||||||
|
<int name="20" value="1382017" />
|
||||||
|
<int name="21" value="1442001" />
|
||||||
|
<int name="22" value="1442027" />
|
||||||
|
<int name="23" value="1442028" />
|
||||||
|
<int name="24" value="1452005" />
|
||||||
|
<int name="25" value="1482006" />
|
||||||
|
<int name="26" value="1492021" />
|
||||||
|
<int name="27" value="2000002" />
|
||||||
|
<int name="28" value="2000003" />
|
||||||
|
<int name="29" value="2040024" />
|
||||||
|
<int name="30" value="2040423" />
|
||||||
|
<int name="31" value="2043301" />
|
||||||
|
<int name="32" value="2044802" />
|
||||||
|
<int name="33" value="2048002" />
|
||||||
|
<int name="34" value="2048005" />
|
||||||
|
<int name="35" value="2382030" />
|
||||||
|
<int name="36" value="4000043" />
|
||||||
|
<int name="37" value="4006001" />
|
||||||
|
<int name="38" value="4010005" />
|
||||||
|
<int name="39" value="4020000" />
|
||||||
|
<int name="40" value="4030012" />
|
||||||
|
<int name="41" value="4130011" />
|
||||||
|
<int name="42" value="4130015" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 37\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA monster that appears in the sand near the sea. Its speed and high defense rate render this monster difficult to hunt, but since it lives by the water, use magic of lightning attribute to attack its vulnerability." />
|
<string name="episode" value=" Lv. : 37\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA monster that appears in the sand near the sea. Its speed and high defense rate render this monster difficult to hunt, but since it lives by the water, use magic of lightning attribute to attack its vulnerability." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -4309,7 +4351,37 @@
|
|||||||
<int name="2" value="110040000" />
|
<int name="2" value="110040000" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2383009" />
|
<int name="0" value="1002025" />
|
||||||
|
<int name="1" value="1002085" />
|
||||||
|
<int name="2" value="1002217" />
|
||||||
|
<int name="3" value="1040083" />
|
||||||
|
<int name="4" value="1040095" />
|
||||||
|
<int name="5" value="1041079" />
|
||||||
|
<int name="6" value="1041081" />
|
||||||
|
<int name="7" value="1041082" />
|
||||||
|
<int name="8" value="1041087" />
|
||||||
|
<int name="9" value="1060072" />
|
||||||
|
<int name="10" value="1060084" />
|
||||||
|
<int name="11" value="1061078" />
|
||||||
|
<int name="12" value="1061081" />
|
||||||
|
<int name="13" value="1061086" />
|
||||||
|
<int name="14" value="1302016" />
|
||||||
|
<int name="15" value="1382001" />
|
||||||
|
<int name="16" value="1412003" />
|
||||||
|
<int name="17" value="1442011" />
|
||||||
|
<int name="18" value="1482007" />
|
||||||
|
<int name="19" value="2000003" />
|
||||||
|
<int name="20" value="2000004" />
|
||||||
|
<int name="21" value="2040427" />
|
||||||
|
<int name="22" value="2043201" />
|
||||||
|
<int name="23" value="2043202" />
|
||||||
|
<int name="24" value="2383009" />
|
||||||
|
<int name="25" value="4000044" />
|
||||||
|
<int name="26" value="4010003" />
|
||||||
|
<int name="27" value="4020002" />
|
||||||
|
<int name="28" value="4130005" />
|
||||||
|
<int name="29" value="4130015" />
|
||||||
|
<int name="30" value="4130017" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 48\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA crab monster that mainly lives near the sand by the sea. It is superior to Lorang in every aspect including speed and defense rate. It is encouraged that you don't attack this monster hastily, as it dashes through the seashore at the speed which rivals that of Lupin. But since it it lives near water like Lorang and is very vulnerable to lightning as a result, try attacking this monster using magic of electricity attribute." />
|
<string name="episode" value=" Lv. : 48\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA crab monster that mainly lives near the sand by the sea. It is superior to Lorang in every aspect including speed and defense rate. It is encouraged that you don't attack this monster hastily, as it dashes through the seashore at the speed which rivals that of Lupin. But since it it lives near water like Lorang and is very vulnerable to lightning as a result, try attacking this monster using magic of electricity attribute." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -5867,7 +5939,41 @@
|
|||||||
<int name="4" value="211040300" />
|
<int name="4" value="211040300" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2383013" />
|
<int name="0" value="1002100" />
|
||||||
|
<int name="1" value="1041096" />
|
||||||
|
<int name="2" value="1050053" />
|
||||||
|
<int name="3" value="1051037" />
|
||||||
|
<int name="4" value="1051044" />
|
||||||
|
<int name="5" value="1051045" />
|
||||||
|
<int name="6" value="1052116" />
|
||||||
|
<int name="7" value="1061095" />
|
||||||
|
<int name="8" value="1072089" />
|
||||||
|
<int name="9" value="1082038" />
|
||||||
|
<int name="10" value="1092030" />
|
||||||
|
<int name="11" value="1442009" />
|
||||||
|
<int name="12" value="1452006" />
|
||||||
|
<int name="13" value="2000002" />
|
||||||
|
<int name="14" value="2000003" />
|
||||||
|
<int name="15" value="2000004" />
|
||||||
|
<int name="16" value="2040321" />
|
||||||
|
<int name="17" value="2040804" />
|
||||||
|
<int name="18" value="2040925" />
|
||||||
|
<int name="19" value="2040933" />
|
||||||
|
<int name="20" value="2043019" />
|
||||||
|
<int name="21" value="2043110" />
|
||||||
|
<int name="22" value="2044602" />
|
||||||
|
<int name="23" value="2383013" />
|
||||||
|
<int name="24" value="4000021" />
|
||||||
|
<int name="25" value="4000048" />
|
||||||
|
<int name="26" value="4003005" />
|
||||||
|
<int name="27" value="4004002" />
|
||||||
|
<int name="28" value="4007000" />
|
||||||
|
<int name="29" value="4007001" />
|
||||||
|
<int name="30" value="4007002" />
|
||||||
|
<int name="31" value="4010002" />
|
||||||
|
<int name="32" value="4020001" />
|
||||||
|
<int name="33" value="4130010" />
|
||||||
|
<int name="34" value="4130011" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Lv. : 50\nForm : Mammal\n\nA small yeti often spotted in the snowfield of Ossyria near El Nath. Is made to live in cold climates and can therefore withstand strong Ice Attribute Attacks while being vulnerable to Fire Attribute Attacks. Its small frame and slow movement makes it an easy target, but beware, as many a travellers have been badly injured by this cute little creature. The Jr. Yeti is capable of transforming into a giant yeti as well so watch out! " />
|
<string name="episode" value="Lv. : 50\nForm : Mammal\n\nA small yeti often spotted in the snowfield of Ossyria near El Nath. Is made to live in cold climates and can therefore withstand strong Ice Attribute Attacks while being vulnerable to Fire Attribute Attacks. Its small frame and slow movement makes it an easy target, but beware, as many a travellers have been badly injured by this cute little creature. The Jr. Yeti is capable of transforming into a giant yeti as well so watch out! " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -6378,7 +6484,39 @@
|
|||||||
<int name="2" value="250010303" />
|
<int name="2" value="250010303" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2383035" />
|
<int name="0" value="1032021" />
|
||||||
|
<int name="1" value="1040099" />
|
||||||
|
<int name="2" value="1050058" />
|
||||||
|
<int name="3" value="1060088" />
|
||||||
|
<int name="4" value="1072134" />
|
||||||
|
<int name="5" value="1082066" />
|
||||||
|
<int name="6" value="1082081" />
|
||||||
|
<int name="7" value="1082201" />
|
||||||
|
<int name="8" value="1092045" />
|
||||||
|
<int name="9" value="1432006" />
|
||||||
|
<int name="10" value="1472055" />
|
||||||
|
<int name="11" value="2000002" />
|
||||||
|
<int name="12" value="2000003" />
|
||||||
|
<int name="13" value="2040031" />
|
||||||
|
<int name="14" value="2040515" />
|
||||||
|
<int name="15" value="2043701" />
|
||||||
|
<int name="16" value="2043801" />
|
||||||
|
<int name="17" value="2049100" />
|
||||||
|
<int name="18" value="2049101" />
|
||||||
|
<int name="19" value="2330002" />
|
||||||
|
<int name="20" value="2383035" />
|
||||||
|
<int name="21" value="4000021" />
|
||||||
|
<int name="22" value="4000283" />
|
||||||
|
<int name="23" value="4000284" />
|
||||||
|
<int name="24" value="4003005" />
|
||||||
|
<int name="25" value="4004002" />
|
||||||
|
<int name="26" value="4004004" />
|
||||||
|
<int name="27" value="4010005" />
|
||||||
|
<int name="28" value="4020004" />
|
||||||
|
<int name="29" value="4020007" />
|
||||||
|
<int name="30" value="4130000" />
|
||||||
|
<int name="31" value="4130009" />
|
||||||
|
<int name="32" value="4130021" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 56\nForm : Mammal\n\nA type of bear that lives near Mu Lung. Although it's only a bear, it has a heartfelt desire to become a virtuous master, hence devoting much of its energy in training. While it diligently trains in its practice uniform, it sometimes fails to suppress its animalistic instinct and attacks the passersby." />
|
<string name="episode" value=" Lv. : 56\nForm : Mammal\n\nA type of bear that lives near Mu Lung. Although it's only a bear, it has a heartfelt desire to become a virtuous master, hence devoting much of its energy in training. While it diligently trains in its practice uniform, it sometimes fails to suppress its animalistic instinct and attacks the passersby." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -7417,36 +7555,34 @@
|
|||||||
<int name="29" value="2040704" />
|
<int name="29" value="2040704" />
|
||||||
<int name="30" value="2040804" />
|
<int name="30" value="2040804" />
|
||||||
<int name="31" value="2040825" />
|
<int name="31" value="2040825" />
|
||||||
<int name="32" value="2040827" />
|
<int name="32" value="2040933" />
|
||||||
<int name="33" value="2040933" />
|
<int name="33" value="2041002" />
|
||||||
<int name="34" value="2040935" />
|
<int name="34" value="2041013" />
|
||||||
<int name="35" value="2041002" />
|
<int name="35" value="2041016" />
|
||||||
<int name="36" value="2041013" />
|
<int name="36" value="2041046" />
|
||||||
<int name="37" value="2041016" />
|
<int name="37" value="2043201" />
|
||||||
<int name="38" value="2041046" />
|
<int name="38" value="2043701" />
|
||||||
<int name="39" value="2043201" />
|
<int name="39" value="2043802" />
|
||||||
<int name="40" value="2043701" />
|
<int name="40" value="2044114" />
|
||||||
<int name="41" value="2043802" />
|
<int name="41" value="2044116" />
|
||||||
<int name="42" value="2044114" />
|
<int name="42" value="2044201" />
|
||||||
<int name="43" value="2044116" />
|
<int name="43" value="2044301" />
|
||||||
<int name="44" value="2044201" />
|
<int name="44" value="2044502" />
|
||||||
<int name="45" value="2044301" />
|
<int name="45" value="2044801" />
|
||||||
<int name="46" value="2044502" />
|
<int name="46" value="2044803" />
|
||||||
<int name="47" value="2044801" />
|
<int name="47" value="2044807" />
|
||||||
<int name="48" value="2044803" />
|
<int name="48" value="2044902" />
|
||||||
<int name="49" value="2044807" />
|
<int name="49" value="2044904" />
|
||||||
<int name="50" value="2044902" />
|
<int name="50" value="2060000" />
|
||||||
<int name="51" value="2044904" />
|
<int name="51" value="2061000" />
|
||||||
<int name="52" value="2060000" />
|
<int name="52" value="2388005" />
|
||||||
<int name="53" value="2061000" />
|
<int name="53" value="4000113" />
|
||||||
<int name="54" value="2388005" />
|
<int name="54" value="4000114" />
|
||||||
<int name="55" value="4000113" />
|
<int name="55" value="4000115" />
|
||||||
<int name="56" value="4000114" />
|
<int name="56" value="4004001" />
|
||||||
<int name="57" value="4000115" />
|
<int name="57" value="4010003" />
|
||||||
<int name="58" value="4004001" />
|
<int name="58" value="4020006" />
|
||||||
<int name="59" value="4010003" />
|
<int name="59" value="4031991" />
|
||||||
<int name="60" value="4020006" />
|
|
||||||
<int name="61" value="4031991" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 59\nForm : Enchanted\n\nThe ghost of the past that originated from the deserted land in Ludibrium. It was brought back to life due to the Dimensional Schism, and has been a follower of Papulatus ever since, pestering anyone that attempts to go near the lowest level of the Clocktower. It appears in the form of an owl clock, and it tries to cling onto the past by turning back the time. " />
|
<string name="episode" value=" Lv. : 59\nForm : Enchanted\n\nThe ghost of the past that originated from the deserted land in Ludibrium. It was brought back to life due to the Dimensional Schism, and has been a follower of Papulatus ever since, pestering anyone that attempts to go near the lowest level of the Clocktower. It appears in the form of an owl clock, and it tries to cling onto the past by turning back the time. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -8375,35 +8511,34 @@
|
|||||||
<int name="20" value="2002001" />
|
<int name="20" value="2002001" />
|
||||||
<int name="21" value="2040004" />
|
<int name="21" value="2040004" />
|
||||||
<int name="22" value="2040031" />
|
<int name="22" value="2040031" />
|
||||||
<int name="23" value="2040033" />
|
<int name="23" value="2040501" />
|
||||||
<int name="24" value="2040501" />
|
<int name="24" value="2040516" />
|
||||||
<int name="25" value="2040516" />
|
<int name="25" value="2040614" />
|
||||||
<int name="26" value="2040614" />
|
<int name="26" value="2040627" />
|
||||||
<int name="27" value="2040627" />
|
<int name="27" value="2040702" />
|
||||||
<int name="28" value="2040702" />
|
<int name="28" value="2040804" />
|
||||||
<int name="29" value="2040804" />
|
<int name="29" value="2041001" />
|
||||||
<int name="30" value="2041001" />
|
<int name="30" value="2041008" />
|
||||||
<int name="31" value="2041008" />
|
<int name="31" value="2041043" />
|
||||||
<int name="32" value="2041043" />
|
<int name="32" value="2043301" />
|
||||||
<int name="33" value="2043301" />
|
<int name="33" value="2044001" />
|
||||||
<int name="34" value="2044001" />
|
<int name="34" value="2044312" />
|
||||||
<int name="35" value="2044312" />
|
<int name="35" value="2044313" />
|
||||||
<int name="36" value="2044313" />
|
<int name="36" value="2044401" />
|
||||||
<int name="37" value="2044401" />
|
<int name="37" value="2044502" />
|
||||||
<int name="38" value="2044502" />
|
<int name="38" value="2044601" />
|
||||||
<int name="39" value="2044601" />
|
<int name="39" value="2044701" />
|
||||||
<int name="40" value="2044701" />
|
<int name="40" value="2044702" />
|
||||||
<int name="41" value="2044702" />
|
<int name="41" value="2044807" />
|
||||||
<int name="42" value="2044807" />
|
<int name="42" value="2048002" />
|
||||||
<int name="43" value="2048002" />
|
<int name="43" value="2060000" />
|
||||||
<int name="44" value="2060000" />
|
<int name="44" value="2061000" />
|
||||||
<int name="45" value="2061000" />
|
<int name="45" value="2388007" />
|
||||||
<int name="46" value="2388007" />
|
<int name="46" value="4000021" />
|
||||||
<int name="47" value="4000021" />
|
<int name="47" value="4000032" />
|
||||||
<int name="48" value="4000032" />
|
<int name="48" value="4000033" />
|
||||||
<int name="49" value="4000033" />
|
<int name="49" value="4010002" />
|
||||||
<int name="50" value="4010002" />
|
<int name="50" value="4020003" />
|
||||||
<int name="51" value="4020003" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 65\nForm : Reptile\n\nA gigantic crocodile that hides in the swamp in Kerning City. Some say that it suddenly grew in size due to a strange substance in the waste water it consumed, although such claim has not been confirmed. While naturally docile, its simple-minded personality sometimes causes Mr. Alli to rashly become a ferocious monster when provoked. " />
|
<string name="episode" value=" Lv. : 65\nForm : Reptile\n\nA gigantic crocodile that hides in the swamp in Kerning City. Some say that it suddenly grew in size due to a strange substance in the waste water it consumed, although such claim has not been confirmed. While naturally docile, its simple-minded personality sometimes causes Mr. Alli to rashly become a ferocious monster when provoked. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -8673,7 +8808,17 @@
|
|||||||
<int name="0" value="200010300" />
|
<int name="0" value="200010300" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2384005" />
|
<int name="0" value="1092045" />
|
||||||
|
<int name="1" value="1092047" />
|
||||||
|
<int name="2" value="1372034" />
|
||||||
|
<int name="3" value="1412027" />
|
||||||
|
<int name="4" value="1482022" />
|
||||||
|
<int name="5" value="2040515" />
|
||||||
|
<int name="6" value="2044410" />
|
||||||
|
<int name="7" value="2384005" />
|
||||||
|
<int name="8" value="4130009" />
|
||||||
|
<int name="9" value="4130010" />
|
||||||
|
<int name="10" value="4130014" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 63\nForm : Mammal\nSpecial Trait : Resistant to Poison Attribute Attacks. Vulnerable to Sanctity Attribute Attacks.\n\nA black monster that lives in the Stairway to the Sky in Orbis. Although it resembles the physical characteristics of Cellion, Lioner, and Grupin, the Jr. Lucida has a small horn and a pair of wings, not to mention its dark and brutal force that is reflected in its black coat of fur. When fully grown, Jr. Lucida becomes Lucida." />
|
<string name="episode" value=" Lv. : 63\nForm : Mammal\nSpecial Trait : Resistant to Poison Attribute Attacks. Vulnerable to Sanctity Attribute Attacks.\n\nA black monster that lives in the Stairway to the Sky in Orbis. Although it resembles the physical characteristics of Cellion, Lioner, and Grupin, the Jr. Lucida has a small horn and a pair of wings, not to mention its dark and brutal force that is reflected in its black coat of fur. When fully grown, Jr. Lucida becomes Lucida." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -9120,8 +9265,27 @@
|
|||||||
<int name="0" value="261020401" />
|
<int name="0" value="261020401" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2384038" />
|
<int name="0" value="1032020" />
|
||||||
<int name="1" value="4000411" />
|
<int name="1" value="1041102" />
|
||||||
|
<int name="2" value="1051054" />
|
||||||
|
<int name="3" value="1072309" />
|
||||||
|
<int name="4" value="1082107" />
|
||||||
|
<int name="5" value="1092016" />
|
||||||
|
<int name="6" value="1102023" />
|
||||||
|
<int name="7" value="1382039" />
|
||||||
|
<int name="8" value="1402015" />
|
||||||
|
<int name="9" value="1452014" />
|
||||||
|
<int name="10" value="1472027" />
|
||||||
|
<int name="11" value="1492022" />
|
||||||
|
<int name="12" value="2022130" />
|
||||||
|
<int name="13" value="2022191" />
|
||||||
|
<int name="14" value="2040519" />
|
||||||
|
<int name="15" value="2041014" />
|
||||||
|
<int name="16" value="2044601" />
|
||||||
|
<int name="17" value="2044705" />
|
||||||
|
<int name="18" value="2044809" />
|
||||||
|
<int name="19" value="2384038" />
|
||||||
|
<int name="20" value="4000411" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 75\nForm : Enchanted\n\nA mechanical apparatus built to restrict the trespassers entering an area limited to only the lab affiliates. This robot, resembling a huge box, floats around the lab to inspect people inside to keep intruders out of the lab. It will attack as soon as it detects a suspect, hence, must be controlled using the necessary console. " />
|
<string name="episode" value=" Lv. : 75\nForm : Enchanted\n\nA mechanical apparatus built to restrict the trespassers entering an area limited to only the lab affiliates. This robot, resembling a huge box, floats around the lab to inspect people inside to keep intruders out of the lab. It will attack as soon as it detects a suspect, hence, must be controlled using the necessary console. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -9982,21 +10146,20 @@
|
|||||||
<int name="14" value="2002006" />
|
<int name="14" value="2002006" />
|
||||||
<int name="15" value="2040024" />
|
<int name="15" value="2040024" />
|
||||||
<int name="16" value="2040534" />
|
<int name="16" value="2040534" />
|
||||||
<int name="17" value="2040536" />
|
<int name="17" value="2041007" />
|
||||||
<int name="18" value="2041007" />
|
<int name="18" value="2043001" />
|
||||||
<int name="19" value="2043001" />
|
<int name="19" value="2043112" />
|
||||||
<int name="20" value="2043112" />
|
<int name="20" value="2043113" />
|
||||||
<int name="21" value="2043113" />
|
<int name="21" value="2070007" />
|
||||||
<int name="22" value="2070007" />
|
<int name="22" value="2330003" />
|
||||||
<int name="23" value="2330003" />
|
<int name="23" value="2384023" />
|
||||||
<int name="24" value="2384023" />
|
<int name="24" value="4004001" />
|
||||||
<int name="25" value="4004001" />
|
<int name="25" value="4006000" />
|
||||||
<int name="26" value="4006000" />
|
<int name="26" value="4010006" />
|
||||||
<int name="27" value="4010006" />
|
<int name="27" value="4020006" />
|
||||||
<int name="28" value="4020006" />
|
<int name="28" value="4030012" />
|
||||||
<int name="29" value="4030012" />
|
<int name="29" value="4031234" />
|
||||||
<int name="30" value="4031234" />
|
<int name="30" value="4130017" />
|
||||||
<int name="31" value="4130017" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 70\nForm : Devil\nSpecial Trait : Resistant to Poison Attribute Attacks.\n\nKing Goblin known for its penchant for wrestling. It frequently pleads with the passersby for a wrestling match. It can fumigate everything nearby with its infamous flatulence. It likes buckwheat jelly." />
|
<string name="episode" value=" Lv. : 70\nForm : Devil\nSpecial Trait : Resistant to Poison Attribute Attacks.\n\nKing Goblin known for its penchant for wrestling. It frequently pleads with the passersby for a wrestling match. It can fumigate everything nearby with its infamous flatulence. It likes buckwheat jelly." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -10458,8 +10621,27 @@
|
|||||||
<int name="0" value="261010102" />
|
<int name="0" value="261010102" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2385023" />
|
<int name="0" value="1002327" />
|
||||||
<int name="1" value="4000418" />
|
<int name="1" value="1032020" />
|
||||||
|
<int name="2" value="1040104" />
|
||||||
|
<int name="3" value="1050077" />
|
||||||
|
<int name="4" value="1072207" />
|
||||||
|
<int name="5" value="1082210" />
|
||||||
|
<int name="6" value="1102023" />
|
||||||
|
<int name="7" value="1332023" />
|
||||||
|
<int name="8" value="1382008" />
|
||||||
|
<int name="9" value="1412009" />
|
||||||
|
<int name="10" value="1462012" />
|
||||||
|
<int name="11" value="1482011" />
|
||||||
|
<int name="12" value="2022130" />
|
||||||
|
<int name="13" value="2022191" />
|
||||||
|
<int name="14" value="2040519" />
|
||||||
|
<int name="15" value="2041014" />
|
||||||
|
<int name="16" value="2044601" />
|
||||||
|
<int name="17" value="2044705" />
|
||||||
|
<int name="18" value="2044809" />
|
||||||
|
<int name="19" value="2385023" />
|
||||||
|
<int name="20" value="4000418" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 80\nForm : Enchanted\n\nThe most unique invention built by the alchemists of Alcadno. At first, the alchemists tried to build a robot more powerful than Roid, but the result of their attempt, Deet, did not have the level of intelligence they had hoped for. Consequently, the alchemists combined Deet and Roid to create the product of best of both worlds. However, with Roid's intelligence and Deet's physical strength combined, this newly improved robot refused to obey the commands of the Alcadno alchemists, causing unforeseen ruckus. After debating what to do with this robot, they decided to play a prank on the Zenumist alchemists. Upon sneaking in this failed invention into the Zenumist lab, Deet and Roi began breaking all the beakers and flasks, leaving no choice for the Zenumist alchemists but to destroy the robot using their renowned magic skills. However, the only way to completely destroy Deet and Roi is to break it into pieces, as even activating the most effective machine in lab 202 could only inflict rusting." />
|
<string name="episode" value=" Lv. : 80\nForm : Enchanted\n\nThe most unique invention built by the alchemists of Alcadno. At first, the alchemists tried to build a robot more powerful than Roid, but the result of their attempt, Deet, did not have the level of intelligence they had hoped for. Consequently, the alchemists combined Deet and Roid to create the product of best of both worlds. However, with Roid's intelligence and Deet's physical strength combined, this newly improved robot refused to obey the commands of the Alcadno alchemists, causing unforeseen ruckus. After debating what to do with this robot, they decided to play a prank on the Zenumist alchemists. Upon sneaking in this failed invention into the Zenumist lab, Deet and Roi began breaking all the beakers and flasks, leaving no choice for the Zenumist alchemists but to destroy the robot using their renowned magic skills. However, the only way to completely destroy Deet and Roi is to break it into pieces, as even activating the most effective machine in lab 202 could only inflict rusting." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -11896,7 +12078,47 @@
|
|||||||
<int name="4" value="240040401" />
|
<int name="4" value="240040401" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2386008" />
|
<int name="0" value="1002365" />
|
||||||
|
<int name="1" value="1040117" />
|
||||||
|
<int name="2" value="1040118" />
|
||||||
|
<int name="3" value="1041118" />
|
||||||
|
<int name="4" value="1050089" />
|
||||||
|
<int name="5" value="1050090" />
|
||||||
|
<int name="6" value="1052128" />
|
||||||
|
<int name="7" value="1060106" />
|
||||||
|
<int name="8" value="1061116" />
|
||||||
|
<int name="9" value="1072223" />
|
||||||
|
<int name="10" value="1082129" />
|
||||||
|
<int name="11" value="1452017" />
|
||||||
|
<int name="12" value="2000005" />
|
||||||
|
<int name="13" value="2000006" />
|
||||||
|
<int name="14" value="2040516" />
|
||||||
|
<int name="15" value="2040701" />
|
||||||
|
<int name="16" value="2043002" />
|
||||||
|
<int name="17" value="2043114" />
|
||||||
|
<int name="18" value="2044901" />
|
||||||
|
<int name="19" value="2044902" />
|
||||||
|
<int name="20" value="2290120" />
|
||||||
|
<int name="21" value="2290127" />
|
||||||
|
<int name="22" value="2386008" />
|
||||||
|
<int name="23" value="4000244" />
|
||||||
|
<int name="24" value="4000245" />
|
||||||
|
<int name="25" value="4000268" />
|
||||||
|
<int name="26" value="4001077" />
|
||||||
|
<int name="27" value="4001105" />
|
||||||
|
<int name="28" value="4004002" />
|
||||||
|
<int name="29" value="4006001" />
|
||||||
|
<int name="30" value="4010001" />
|
||||||
|
<int name="31" value="4020000" />
|
||||||
|
<int name="32" value="4031449" />
|
||||||
|
<int name="33" value="4031482" />
|
||||||
|
<int name="34" value="4031483" />
|
||||||
|
<int name="35" value="4031484" />
|
||||||
|
<int name="36" value="4031485" />
|
||||||
|
<int name="37" value="4130002" />
|
||||||
|
<int name="38" value="4130004" />
|
||||||
|
<int name="39" value="4130005" />
|
||||||
|
<int name="40" value="4130013" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 97\nForm : Reptile\nSpecial Trait : -50% Fire Attribute Damage. Vulnerable to Ice Attribute Attacks.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of reddish wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits flames. " />
|
<string name="episode" value=" Lv. : 97\nForm : Reptile\nSpecial Trait : -50% Fire Attribute Damage. Vulnerable to Ice Attribute Attacks.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of reddish wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits flames. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -11909,7 +12131,42 @@
|
|||||||
<int name="4" value="240040401" />
|
<int name="4" value="240040401" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2386013" />
|
<int name="0" value="1002532" />
|
||||||
|
<int name="1" value="1050094" />
|
||||||
|
<int name="2" value="1051105" />
|
||||||
|
<int name="3" value="1072227" />
|
||||||
|
<int name="4" value="1082143" />
|
||||||
|
<int name="5" value="1082213" />
|
||||||
|
<int name="6" value="1372010" />
|
||||||
|
<int name="7" value="1422013" />
|
||||||
|
<int name="8" value="2000005" />
|
||||||
|
<int name="9" value="2000006" />
|
||||||
|
<int name="10" value="2022003" />
|
||||||
|
<int name="11" value="2040001" />
|
||||||
|
<int name="12" value="2040401" />
|
||||||
|
<int name="13" value="2040924" />
|
||||||
|
<int name="14" value="2040925" />
|
||||||
|
<int name="15" value="2044001" />
|
||||||
|
<int name="16" value="2290101" />
|
||||||
|
<int name="17" value="2330004" />
|
||||||
|
<int name="18" value="2386013" />
|
||||||
|
<int name="19" value="4000244" />
|
||||||
|
<int name="20" value="4000245" />
|
||||||
|
<int name="21" value="4000269" />
|
||||||
|
<int name="22" value="4001077" />
|
||||||
|
<int name="23" value="4001105" />
|
||||||
|
<int name="24" value="4004003" />
|
||||||
|
<int name="25" value="4006000" />
|
||||||
|
<int name="26" value="4010004" />
|
||||||
|
<int name="27" value="4020005" />
|
||||||
|
<int name="28" value="4031449" />
|
||||||
|
<int name="29" value="4031482" />
|
||||||
|
<int name="30" value="4031483" />
|
||||||
|
<int name="31" value="4031484" />
|
||||||
|
<int name="32" value="4031485" />
|
||||||
|
<int name="33" value="4130004" />
|
||||||
|
<int name="34" value="4130013" />
|
||||||
|
<int name="35" value="4130014" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 101\nForm : Reptile\nSpecial Trait : Vulnerable Fire Attribute Attacks. -50% Ice Attribute Damage.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of blue wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits cold air. " />
|
<string name="episode" value=" Lv. : 101\nForm : Reptile\nSpecial Trait : Vulnerable Fire Attribute Attacks. -50% Ice Attribute Damage.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of blue wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits cold air. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -11922,7 +12179,53 @@
|
|||||||
<int name="4" value="240040500" />
|
<int name="4" value="240040500" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2386015" />
|
<int name="0" value="1002531" />
|
||||||
|
<int name="1" value="1040115" />
|
||||||
|
<int name="2" value="1040117" />
|
||||||
|
<int name="3" value="1050093" />
|
||||||
|
<int name="4" value="1051095" />
|
||||||
|
<int name="5" value="1060104" />
|
||||||
|
<int name="6" value="1060107" />
|
||||||
|
<int name="7" value="1072214" />
|
||||||
|
<int name="8" value="1082127" />
|
||||||
|
<int name="9" value="1332027" />
|
||||||
|
<int name="10" value="1442020" />
|
||||||
|
<int name="11" value="1482012" />
|
||||||
|
<int name="12" value="2000005" />
|
||||||
|
<int name="13" value="2000006" />
|
||||||
|
<int name="14" value="2020013" />
|
||||||
|
<int name="15" value="2022003" />
|
||||||
|
<int name="16" value="2040302" />
|
||||||
|
<int name="17" value="2040320" />
|
||||||
|
<int name="18" value="2044301" />
|
||||||
|
<int name="19" value="2044402" />
|
||||||
|
<int name="20" value="2290010" />
|
||||||
|
<int name="21" value="2290019" />
|
||||||
|
<int name="22" value="2290026" />
|
||||||
|
<int name="23" value="2290076" />
|
||||||
|
<int name="24" value="2290119" />
|
||||||
|
<int name="25" value="2290128" />
|
||||||
|
<int name="26" value="2386015" />
|
||||||
|
<int name="27" value="4000244" />
|
||||||
|
<int name="28" value="4000245" />
|
||||||
|
<int name="29" value="4000270" />
|
||||||
|
<int name="30" value="4001077" />
|
||||||
|
<int name="31" value="4001105" />
|
||||||
|
<int name="32" value="4004000" />
|
||||||
|
<int name="33" value="4006000" />
|
||||||
|
<int name="34" value="4006001" />
|
||||||
|
<int name="35" value="4010005" />
|
||||||
|
<int name="36" value="4020002" />
|
||||||
|
<int name="37" value="4031415" />
|
||||||
|
<int name="38" value="4031449" />
|
||||||
|
<int name="39" value="4031482" />
|
||||||
|
<int name="40" value="4031483" />
|
||||||
|
<int name="41" value="4031484" />
|
||||||
|
<int name="42" value="4031485" />
|
||||||
|
<int name="43" value="4130009" />
|
||||||
|
<int name="44" value="4130014" />
|
||||||
|
<int name="45" value="4130017" />
|
||||||
|
<int name="46" value="4131004" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 103\nForm : Reptile\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of black wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence and orally emits the breath of damnation." />
|
<string name="episode" value=" Lv. : 103\nForm : Reptile\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of black wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence and orally emits the breath of damnation." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13438,44 +13741,43 @@
|
|||||||
<int name="24" value="2040504" />
|
<int name="24" value="2040504" />
|
||||||
<int name="25" value="2040513" />
|
<int name="25" value="2040513" />
|
||||||
<int name="26" value="2040516" />
|
<int name="26" value="2040516" />
|
||||||
<int name="27" value="2040536" />
|
<int name="27" value="2040622" />
|
||||||
<int name="28" value="2040622" />
|
<int name="28" value="2043113" />
|
||||||
<int name="29" value="2043113" />
|
<int name="29" value="2049000" />
|
||||||
<int name="30" value="2049000" />
|
<int name="30" value="2280007" />
|
||||||
<int name="31" value="2280007" />
|
<int name="31" value="2280008" />
|
||||||
<int name="32" value="2280008" />
|
<int name="32" value="2280009" />
|
||||||
<int name="33" value="2280009" />
|
<int name="33" value="2280010" />
|
||||||
<int name="34" value="2280010" />
|
<int name="34" value="2290000" />
|
||||||
<int name="35" value="2290000" />
|
<int name="35" value="2290001" />
|
||||||
<int name="36" value="2290001" />
|
<int name="36" value="2290004" />
|
||||||
<int name="37" value="2290004" />
|
<int name="37" value="2290005" />
|
||||||
<int name="38" value="2290005" />
|
<int name="38" value="2290024" />
|
||||||
<int name="39" value="2290024" />
|
<int name="39" value="2290025" />
|
||||||
<int name="40" value="2290025" />
|
<int name="40" value="2290026" />
|
||||||
<int name="41" value="2290026" />
|
<int name="41" value="2290027" />
|
||||||
<int name="42" value="2290027" />
|
<int name="42" value="2290052" />
|
||||||
<int name="43" value="2290052" />
|
<int name="43" value="2290053" />
|
||||||
<int name="44" value="2290053" />
|
<int name="44" value="2290054" />
|
||||||
<int name="45" value="2290054" />
|
<int name="45" value="2290055" />
|
||||||
<int name="46" value="2290055" />
|
<int name="46" value="2290076" />
|
||||||
<int name="47" value="2290076" />
|
<int name="47" value="2290077" />
|
||||||
<int name="48" value="2290077" />
|
<int name="48" value="2290082" />
|
||||||
<int name="49" value="2290082" />
|
<int name="49" value="2290083" />
|
||||||
<int name="50" value="2290083" />
|
<int name="50" value="2290097" />
|
||||||
<int name="51" value="2290097" />
|
<int name="51" value="2290099" />
|
||||||
<int name="52" value="2290099" />
|
<int name="52" value="2290106" />
|
||||||
<int name="53" value="2290106" />
|
<int name="53" value="2290108" />
|
||||||
<int name="54" value="2290108" />
|
<int name="54" value="2290112" />
|
||||||
<int name="55" value="2290112" />
|
<int name="55" value="2290114" />
|
||||||
<int name="56" value="2290114" />
|
<int name="56" value="2290122" />
|
||||||
<int name="57" value="2290122" />
|
<int name="57" value="2290124" />
|
||||||
<int name="58" value="2290124" />
|
<int name="58" value="2290132" />
|
||||||
<int name="59" value="2290132" />
|
<int name="59" value="2388020" />
|
||||||
<int name="60" value="2388020" />
|
<int name="60" value="4000175" />
|
||||||
<int name="61" value="4000175" />
|
<int name="61" value="4001085" />
|
||||||
<int name="62" value="4001085" />
|
<int name="62" value="4031253" />
|
||||||
<int name="63" value="4031253" />
|
<int name="63" value="4031905" />
|
||||||
<int name="64" value="4031905" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : Unknown\nForm : Fish\nSpecial Trait : Vulnerable to Fire Attribute Attacks.\n\nA ferocious fish monster that lives in the cave under the ocean. It sticks its head out from a tiny hole in the cave, which is why its size remains a mystery. Some suspect that this monster has not fully come out of the cave because it's stuck, but no evidences support such a rumor. Although it does not move, it is the king of the deep sea that attacks by shooting a laser beam out of its mouth. " />
|
<string name="episode" value=" Lv. : Unknown\nForm : Fish\nSpecial Trait : Vulnerable to Fire Attribute Attacks.\n\nA ferocious fish monster that lives in the cave under the ocean. It sticks its head out from a tiny hole in the cave, which is why its size remains a mystery. Some suspect that this monster has not fully come out of the cave because it's stuck, but no evidences support such a rumor. Although it does not move, it is the king of the deep sea that attacks by shooting a laser beam out of its mouth. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13752,8 +14054,7 @@
|
|||||||
<int name="91" value="2290090" />
|
<int name="91" value="2290090" />
|
||||||
<int name="92" value="2290106" />
|
<int name="92" value="2290106" />
|
||||||
<int name="93" value="2290119" />
|
<int name="93" value="2290119" />
|
||||||
<int name="94" value="2388043" />
|
<int name="94" value="4021010" />
|
||||||
<int name="95" value="4021010" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Level : Lv.180\nForm : Spirit\n\nA monster that has been summoned by a mysterious man named Kirston using the Mirror of the Goddess. It doesn't seem that Kirston intentionally summoned Pink Bean. Although Pink Bean is a cute little creature, its power is beyond imagination. It is a very dangerous monster and should be approached with caution. One of its amazing powers is that it can revive a dead god. It seems to be a monster from another world." />
|
<string name="episode" value="Level : Lv.180\nForm : Spirit\n\nA monster that has been summoned by a mysterious man named Kirston using the Mirror of the Goddess. It doesn't seem that Kirston intentionally summoned Pink Bean. Although Pink Bean is a cute little creature, its power is beyond imagination. It is a very dangerous monster and should be approached with caution. One of its amazing powers is that it can revive a dead god. It seems to be a monster from another world." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13909,26 +14210,10 @@
|
|||||||
<int name="1" value="261020200" />
|
<int name="1" value="261020200" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002215" />
|
<int name="0" value="2022430" />
|
||||||
<int name="1" value="1040089" />
|
<int name="1" value="2022431" />
|
||||||
<int name="2" value="1050045" />
|
<int name="2" value="2022432" />
|
||||||
<int name="3" value="1372007" />
|
<int name="3" value="2022433" />
|
||||||
<int name="4" value="2000002" />
|
|
||||||
<int name="5" value="2000003" />
|
|
||||||
<int name="6" value="2022430" />
|
|
||||||
<int name="7" value="2022431" />
|
|
||||||
<int name="8" value="2022432" />
|
|
||||||
<int name="9" value="2022433" />
|
|
||||||
<int name="10" value="2040002" />
|
|
||||||
<int name="11" value="2044102" />
|
|
||||||
<int name="12" value="2383007" />
|
|
||||||
<int name="13" value="4000359" />
|
|
||||||
<int name="14" value="4004002" />
|
|
||||||
<int name="15" value="4006001" />
|
|
||||||
<int name="16" value="4020000" />
|
|
||||||
<int name="17" value="4020006" />
|
|
||||||
<int name="18" value="4030012" />
|
|
||||||
<int name="19" value="4130012" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 47\nForm : Enchanted\n\nA Mithril being created by alchemy means... It's constitution, made purely by Mithril, makes it a tough opponent." />
|
<string name="episode" value=" Lv. : 47\nForm : Enchanted\n\nA Mithril being created by alchemy means... It's constitution, made purely by Mithril, makes it a tough opponent." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -14265,16 +14550,15 @@
|
|||||||
<int name="21" value="2000001" />
|
<int name="21" value="2000001" />
|
||||||
<int name="22" value="2000003" />
|
<int name="22" value="2000003" />
|
||||||
<int name="23" value="2043102" />
|
<int name="23" value="2043102" />
|
||||||
<int name="24" value="2043109" />
|
<int name="24" value="2048000" />
|
||||||
<int name="25" value="2048000" />
|
<int name="25" value="2060000" />
|
||||||
<int name="26" value="2060000" />
|
<int name="26" value="2061000" />
|
||||||
<int name="27" value="2061000" />
|
<int name="27" value="2380014" />
|
||||||
<int name="28" value="2380014" />
|
<int name="28" value="4000012" />
|
||||||
<int name="29" value="4000012" />
|
<int name="29" value="4010004" />
|
||||||
<int name="30" value="4010004" />
|
<int name="30" value="4020002" />
|
||||||
<int name="31" value="4020002" />
|
<int name="31" value="4020003" />
|
||||||
<int name="32" value="4020003" />
|
<int name="32" value="4032316" />
|
||||||
<int name="33" value="4032316" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Level : Lv.15\nType : Plants\nNotes: Immune to poison-based attacks.\n\nA mushroom monster featuring a dirty green cap, and has that sick look on its face as if it's about to throw up any minute." />
|
<string name="episode" value="Level : Lv.15\nType : Plants\nNotes: Immune to poison-based attacks.\n\nA mushroom monster featuring a dirty green cap, and has that sick look on its face as if it's about to throw up any minute." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
|
|||||||
@@ -3191,49 +3191,7 @@
|
|||||||
<int name="4" value="110030001" />
|
<int name="4" value="110030001" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1040080" />
|
<int name="0" value="2382030" />
|
||||||
<int name="1" value="1041074" />
|
|
||||||
<int name="2" value="1050000" />
|
|
||||||
<int name="3" value="1050038" />
|
|
||||||
<int name="4" value="1060068" />
|
|
||||||
<int name="5" value="1061069" />
|
|
||||||
<int name="6" value="1072113" />
|
|
||||||
<int name="7" value="1072121" />
|
|
||||||
<int name="8" value="1072297" />
|
|
||||||
<int name="9" value="1082056" />
|
|
||||||
<int name="10" value="1082074" />
|
|
||||||
<int name="11" value="1092014" />
|
|
||||||
<int name="12" value="1302017" />
|
|
||||||
<int name="13" value="1302020" />
|
|
||||||
<int name="14" value="1302030" />
|
|
||||||
<int name="15" value="1322021" />
|
|
||||||
<int name="16" value="1322022" />
|
|
||||||
<int name="17" value="1322023" />
|
|
||||||
<int name="18" value="1322024" />
|
|
||||||
<int name="19" value="1332020" />
|
|
||||||
<int name="20" value="1382017" />
|
|
||||||
<int name="21" value="1442001" />
|
|
||||||
<int name="22" value="1442027" />
|
|
||||||
<int name="23" value="1442028" />
|
|
||||||
<int name="24" value="1452005" />
|
|
||||||
<int name="25" value="1482006" />
|
|
||||||
<int name="26" value="1492021" />
|
|
||||||
<int name="27" value="2000002" />
|
|
||||||
<int name="28" value="2000003" />
|
|
||||||
<int name="29" value="2040024" />
|
|
||||||
<int name="30" value="2040423" />
|
|
||||||
<int name="31" value="2043301" />
|
|
||||||
<int name="32" value="2044802" />
|
|
||||||
<int name="33" value="2048002" />
|
|
||||||
<int name="34" value="2048005" />
|
|
||||||
<int name="35" value="2382030" />
|
|
||||||
<int name="36" value="4000043" />
|
|
||||||
<int name="37" value="4006001" />
|
|
||||||
<int name="38" value="4010005" />
|
|
||||||
<int name="39" value="4020000" />
|
|
||||||
<int name="40" value="4030012" />
|
|
||||||
<int name="41" value="4130011" />
|
|
||||||
<int name="42" value="4130015" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 37\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA monster that appears in the sand near the sea. Its speed and high defense rate render this monster difficult to hunt, but since it lives by the water, use magic of lightning attribute to attack its vulnerability." />
|
<string name="episode" value=" Lv. : 37\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA monster that appears in the sand near the sea. Its speed and high defense rate render this monster difficult to hunt, but since it lives by the water, use magic of lightning attribute to attack its vulnerability." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -4351,37 +4309,7 @@
|
|||||||
<int name="2" value="110040000" />
|
<int name="2" value="110040000" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002025" />
|
<int name="0" value="2383009" />
|
||||||
<int name="1" value="1002085" />
|
|
||||||
<int name="2" value="1002217" />
|
|
||||||
<int name="3" value="1040083" />
|
|
||||||
<int name="4" value="1040095" />
|
|
||||||
<int name="5" value="1041079" />
|
|
||||||
<int name="6" value="1041081" />
|
|
||||||
<int name="7" value="1041082" />
|
|
||||||
<int name="8" value="1041087" />
|
|
||||||
<int name="9" value="1060072" />
|
|
||||||
<int name="10" value="1060084" />
|
|
||||||
<int name="11" value="1061078" />
|
|
||||||
<int name="12" value="1061081" />
|
|
||||||
<int name="13" value="1061086" />
|
|
||||||
<int name="14" value="1302016" />
|
|
||||||
<int name="15" value="1382001" />
|
|
||||||
<int name="16" value="1412003" />
|
|
||||||
<int name="17" value="1442011" />
|
|
||||||
<int name="18" value="1482007" />
|
|
||||||
<int name="19" value="2000003" />
|
|
||||||
<int name="20" value="2000004" />
|
|
||||||
<int name="21" value="2040427" />
|
|
||||||
<int name="22" value="2043201" />
|
|
||||||
<int name="23" value="2043202" />
|
|
||||||
<int name="24" value="2383009" />
|
|
||||||
<int name="25" value="4000044" />
|
|
||||||
<int name="26" value="4010003" />
|
|
||||||
<int name="27" value="4020002" />
|
|
||||||
<int name="28" value="4130005" />
|
|
||||||
<int name="29" value="4130015" />
|
|
||||||
<int name="30" value="4130017" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 48\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA crab monster that mainly lives near the sand by the sea. It is superior to Lorang in every aspect including speed and defense rate. It is encouraged that you don't attack this monster hastily, as it dashes through the seashore at the speed which rivals that of Lupin. But since it it lives near water like Lorang and is very vulnerable to lightning as a result, try attacking this monster using magic of electricity attribute." />
|
<string name="episode" value=" Lv. : 48\nForm : Fish\nSpecial Trait : Vulnerable to Electricity Attribute Attacks.\n\nA crab monster that mainly lives near the sand by the sea. It is superior to Lorang in every aspect including speed and defense rate. It is encouraged that you don't attack this monster hastily, as it dashes through the seashore at the speed which rivals that of Lupin. But since it it lives near water like Lorang and is very vulnerable to lightning as a result, try attacking this monster using magic of electricity attribute." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -5939,41 +5867,7 @@
|
|||||||
<int name="4" value="211040300" />
|
<int name="4" value="211040300" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002100" />
|
<int name="0" value="2383013" />
|
||||||
<int name="1" value="1041096" />
|
|
||||||
<int name="2" value="1050053" />
|
|
||||||
<int name="3" value="1051037" />
|
|
||||||
<int name="4" value="1051044" />
|
|
||||||
<int name="5" value="1051045" />
|
|
||||||
<int name="6" value="1052116" />
|
|
||||||
<int name="7" value="1061095" />
|
|
||||||
<int name="8" value="1072089" />
|
|
||||||
<int name="9" value="1082038" />
|
|
||||||
<int name="10" value="1092030" />
|
|
||||||
<int name="11" value="1442009" />
|
|
||||||
<int name="12" value="1452006" />
|
|
||||||
<int name="13" value="2000002" />
|
|
||||||
<int name="14" value="2000003" />
|
|
||||||
<int name="15" value="2000004" />
|
|
||||||
<int name="16" value="2040321" />
|
|
||||||
<int name="17" value="2040804" />
|
|
||||||
<int name="18" value="2040925" />
|
|
||||||
<int name="19" value="2040933" />
|
|
||||||
<int name="20" value="2043019" />
|
|
||||||
<int name="21" value="2043110" />
|
|
||||||
<int name="22" value="2044602" />
|
|
||||||
<int name="23" value="2383013" />
|
|
||||||
<int name="24" value="4000021" />
|
|
||||||
<int name="25" value="4000048" />
|
|
||||||
<int name="26" value="4003005" />
|
|
||||||
<int name="27" value="4004002" />
|
|
||||||
<int name="28" value="4007000" />
|
|
||||||
<int name="29" value="4007001" />
|
|
||||||
<int name="30" value="4007002" />
|
|
||||||
<int name="31" value="4010002" />
|
|
||||||
<int name="32" value="4020001" />
|
|
||||||
<int name="33" value="4130010" />
|
|
||||||
<int name="34" value="4130011" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Lv. : 50\nForm : Mammal\n\nA small yeti often spotted in the snowfield of Ossyria near El Nath. Is made to live in cold climates and can therefore withstand strong Ice Attribute Attacks while being vulnerable to Fire Attribute Attacks. Its small frame and slow movement makes it an easy target, but beware, as many a travellers have been badly injured by this cute little creature. The Jr. Yeti is capable of transforming into a giant yeti as well so watch out! " />
|
<string name="episode" value="Lv. : 50\nForm : Mammal\n\nA small yeti often spotted in the snowfield of Ossyria near El Nath. Is made to live in cold climates and can therefore withstand strong Ice Attribute Attacks while being vulnerable to Fire Attribute Attacks. Its small frame and slow movement makes it an easy target, but beware, as many a travellers have been badly injured by this cute little creature. The Jr. Yeti is capable of transforming into a giant yeti as well so watch out! " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -6484,39 +6378,7 @@
|
|||||||
<int name="2" value="250010303" />
|
<int name="2" value="250010303" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1032021" />
|
<int name="0" value="2383035" />
|
||||||
<int name="1" value="1040099" />
|
|
||||||
<int name="2" value="1050058" />
|
|
||||||
<int name="3" value="1060088" />
|
|
||||||
<int name="4" value="1072134" />
|
|
||||||
<int name="5" value="1082066" />
|
|
||||||
<int name="6" value="1082081" />
|
|
||||||
<int name="7" value="1082201" />
|
|
||||||
<int name="8" value="1092045" />
|
|
||||||
<int name="9" value="1432006" />
|
|
||||||
<int name="10" value="1472055" />
|
|
||||||
<int name="11" value="2000002" />
|
|
||||||
<int name="12" value="2000003" />
|
|
||||||
<int name="13" value="2040031" />
|
|
||||||
<int name="14" value="2040515" />
|
|
||||||
<int name="15" value="2043701" />
|
|
||||||
<int name="16" value="2043801" />
|
|
||||||
<int name="17" value="2049100" />
|
|
||||||
<int name="18" value="2049101" />
|
|
||||||
<int name="19" value="2330002" />
|
|
||||||
<int name="20" value="2383035" />
|
|
||||||
<int name="21" value="4000021" />
|
|
||||||
<int name="22" value="4000283" />
|
|
||||||
<int name="23" value="4000284" />
|
|
||||||
<int name="24" value="4003005" />
|
|
||||||
<int name="25" value="4004002" />
|
|
||||||
<int name="26" value="4004004" />
|
|
||||||
<int name="27" value="4010005" />
|
|
||||||
<int name="28" value="4020004" />
|
|
||||||
<int name="29" value="4020007" />
|
|
||||||
<int name="30" value="4130000" />
|
|
||||||
<int name="31" value="4130009" />
|
|
||||||
<int name="32" value="4130021" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 56\nForm : Mammal\n\nA type of bear that lives near Mu Lung. Although it's only a bear, it has a heartfelt desire to become a virtuous master, hence devoting much of its energy in training. While it diligently trains in its practice uniform, it sometimes fails to suppress its animalistic instinct and attacks the passersby." />
|
<string name="episode" value=" Lv. : 56\nForm : Mammal\n\nA type of bear that lives near Mu Lung. Although it's only a bear, it has a heartfelt desire to become a virtuous master, hence devoting much of its energy in training. While it diligently trains in its practice uniform, it sometimes fails to suppress its animalistic instinct and attacks the passersby." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -7555,34 +7417,36 @@
|
|||||||
<int name="29" value="2040704" />
|
<int name="29" value="2040704" />
|
||||||
<int name="30" value="2040804" />
|
<int name="30" value="2040804" />
|
||||||
<int name="31" value="2040825" />
|
<int name="31" value="2040825" />
|
||||||
<int name="32" value="2040933" />
|
<int name="32" value="2040827" />
|
||||||
<int name="33" value="2041002" />
|
<int name="33" value="2040933" />
|
||||||
<int name="34" value="2041013" />
|
<int name="34" value="2040935" />
|
||||||
<int name="35" value="2041016" />
|
<int name="35" value="2041002" />
|
||||||
<int name="36" value="2041046" />
|
<int name="36" value="2041013" />
|
||||||
<int name="37" value="2043201" />
|
<int name="37" value="2041016" />
|
||||||
<int name="38" value="2043701" />
|
<int name="38" value="2041046" />
|
||||||
<int name="39" value="2043802" />
|
<int name="39" value="2043201" />
|
||||||
<int name="40" value="2044114" />
|
<int name="40" value="2043701" />
|
||||||
<int name="41" value="2044116" />
|
<int name="41" value="2043802" />
|
||||||
<int name="42" value="2044201" />
|
<int name="42" value="2044114" />
|
||||||
<int name="43" value="2044301" />
|
<int name="43" value="2044116" />
|
||||||
<int name="44" value="2044502" />
|
<int name="44" value="2044201" />
|
||||||
<int name="45" value="2044801" />
|
<int name="45" value="2044301" />
|
||||||
<int name="46" value="2044803" />
|
<int name="46" value="2044502" />
|
||||||
<int name="47" value="2044807" />
|
<int name="47" value="2044801" />
|
||||||
<int name="48" value="2044902" />
|
<int name="48" value="2044803" />
|
||||||
<int name="49" value="2044904" />
|
<int name="49" value="2044807" />
|
||||||
<int name="50" value="2060000" />
|
<int name="50" value="2044902" />
|
||||||
<int name="51" value="2061000" />
|
<int name="51" value="2044904" />
|
||||||
<int name="52" value="2388005" />
|
<int name="52" value="2060000" />
|
||||||
<int name="53" value="4000113" />
|
<int name="53" value="2061000" />
|
||||||
<int name="54" value="4000114" />
|
<int name="54" value="2388005" />
|
||||||
<int name="55" value="4000115" />
|
<int name="55" value="4000113" />
|
||||||
<int name="56" value="4004001" />
|
<int name="56" value="4000114" />
|
||||||
<int name="57" value="4010003" />
|
<int name="57" value="4000115" />
|
||||||
<int name="58" value="4020006" />
|
<int name="58" value="4004001" />
|
||||||
<int name="59" value="4031991" />
|
<int name="59" value="4010003" />
|
||||||
|
<int name="60" value="4020006" />
|
||||||
|
<int name="61" value="4031991" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 59\nForm : Enchanted\n\nThe ghost of the past that originated from the deserted land in Ludibrium. It was brought back to life due to the Dimensional Schism, and has been a follower of Papulatus ever since, pestering anyone that attempts to go near the lowest level of the Clocktower. It appears in the form of an owl clock, and it tries to cling onto the past by turning back the time. " />
|
<string name="episode" value=" Lv. : 59\nForm : Enchanted\n\nThe ghost of the past that originated from the deserted land in Ludibrium. It was brought back to life due to the Dimensional Schism, and has been a follower of Papulatus ever since, pestering anyone that attempts to go near the lowest level of the Clocktower. It appears in the form of an owl clock, and it tries to cling onto the past by turning back the time. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -8511,34 +8375,35 @@
|
|||||||
<int name="20" value="2002001" />
|
<int name="20" value="2002001" />
|
||||||
<int name="21" value="2040004" />
|
<int name="21" value="2040004" />
|
||||||
<int name="22" value="2040031" />
|
<int name="22" value="2040031" />
|
||||||
<int name="23" value="2040501" />
|
<int name="23" value="2040033" />
|
||||||
<int name="24" value="2040516" />
|
<int name="24" value="2040501" />
|
||||||
<int name="25" value="2040614" />
|
<int name="25" value="2040516" />
|
||||||
<int name="26" value="2040627" />
|
<int name="26" value="2040614" />
|
||||||
<int name="27" value="2040702" />
|
<int name="27" value="2040627" />
|
||||||
<int name="28" value="2040804" />
|
<int name="28" value="2040702" />
|
||||||
<int name="29" value="2041001" />
|
<int name="29" value="2040804" />
|
||||||
<int name="30" value="2041008" />
|
<int name="30" value="2041001" />
|
||||||
<int name="31" value="2041043" />
|
<int name="31" value="2041008" />
|
||||||
<int name="32" value="2043301" />
|
<int name="32" value="2041043" />
|
||||||
<int name="33" value="2044001" />
|
<int name="33" value="2043301" />
|
||||||
<int name="34" value="2044312" />
|
<int name="34" value="2044001" />
|
||||||
<int name="35" value="2044313" />
|
<int name="35" value="2044312" />
|
||||||
<int name="36" value="2044401" />
|
<int name="36" value="2044313" />
|
||||||
<int name="37" value="2044502" />
|
<int name="37" value="2044401" />
|
||||||
<int name="38" value="2044601" />
|
<int name="38" value="2044502" />
|
||||||
<int name="39" value="2044701" />
|
<int name="39" value="2044601" />
|
||||||
<int name="40" value="2044702" />
|
<int name="40" value="2044701" />
|
||||||
<int name="41" value="2044807" />
|
<int name="41" value="2044702" />
|
||||||
<int name="42" value="2048002" />
|
<int name="42" value="2044807" />
|
||||||
<int name="43" value="2060000" />
|
<int name="43" value="2048002" />
|
||||||
<int name="44" value="2061000" />
|
<int name="44" value="2060000" />
|
||||||
<int name="45" value="2388007" />
|
<int name="45" value="2061000" />
|
||||||
<int name="46" value="4000021" />
|
<int name="46" value="2388007" />
|
||||||
<int name="47" value="4000032" />
|
<int name="47" value="4000021" />
|
||||||
<int name="48" value="4000033" />
|
<int name="48" value="4000032" />
|
||||||
<int name="49" value="4010002" />
|
<int name="49" value="4000033" />
|
||||||
<int name="50" value="4020003" />
|
<int name="50" value="4010002" />
|
||||||
|
<int name="51" value="4020003" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 65\nForm : Reptile\n\nA gigantic crocodile that hides in the swamp in Kerning City. Some say that it suddenly grew in size due to a strange substance in the waste water it consumed, although such claim has not been confirmed. While naturally docile, its simple-minded personality sometimes causes Mr. Alli to rashly become a ferocious monster when provoked. " />
|
<string name="episode" value=" Lv. : 65\nForm : Reptile\n\nA gigantic crocodile that hides in the swamp in Kerning City. Some say that it suddenly grew in size due to a strange substance in the waste water it consumed, although such claim has not been confirmed. While naturally docile, its simple-minded personality sometimes causes Mr. Alli to rashly become a ferocious monster when provoked. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -8808,17 +8673,7 @@
|
|||||||
<int name="0" value="200010300" />
|
<int name="0" value="200010300" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1092045" />
|
<int name="0" value="2384005" />
|
||||||
<int name="1" value="1092047" />
|
|
||||||
<int name="2" value="1372034" />
|
|
||||||
<int name="3" value="1412027" />
|
|
||||||
<int name="4" value="1482022" />
|
|
||||||
<int name="5" value="2040515" />
|
|
||||||
<int name="6" value="2044410" />
|
|
||||||
<int name="7" value="2384005" />
|
|
||||||
<int name="8" value="4130009" />
|
|
||||||
<int name="9" value="4130010" />
|
|
||||||
<int name="10" value="4130014" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 63\nForm : Mammal\nSpecial Trait : Resistant to Poison Attribute Attacks. Vulnerable to Sanctity Attribute Attacks.\n\nA black monster that lives in the Stairway to the Sky in Orbis. Although it resembles the physical characteristics of Cellion, Lioner, and Grupin, the Jr. Lucida has a small horn and a pair of wings, not to mention its dark and brutal force that is reflected in its black coat of fur. When fully grown, Jr. Lucida becomes Lucida." />
|
<string name="episode" value=" Lv. : 63\nForm : Mammal\nSpecial Trait : Resistant to Poison Attribute Attacks. Vulnerable to Sanctity Attribute Attacks.\n\nA black monster that lives in the Stairway to the Sky in Orbis. Although it resembles the physical characteristics of Cellion, Lioner, and Grupin, the Jr. Lucida has a small horn and a pair of wings, not to mention its dark and brutal force that is reflected in its black coat of fur. When fully grown, Jr. Lucida becomes Lucida." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -9284,8 +9139,9 @@
|
|||||||
<int name="16" value="2044601" />
|
<int name="16" value="2044601" />
|
||||||
<int name="17" value="2044705" />
|
<int name="17" value="2044705" />
|
||||||
<int name="18" value="2044809" />
|
<int name="18" value="2044809" />
|
||||||
<int name="19" value="2384038" />
|
<int name="19" value="2290087" />
|
||||||
<int name="20" value="4000411" />
|
<int name="20" value="2384038" />
|
||||||
|
<int name="21" value="4000411" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 75\nForm : Enchanted\n\nA mechanical apparatus built to restrict the trespassers entering an area limited to only the lab affiliates. This robot, resembling a huge box, floats around the lab to inspect people inside to keep intruders out of the lab. It will attack as soon as it detects a suspect, hence, must be controlled using the necessary console. " />
|
<string name="episode" value=" Lv. : 75\nForm : Enchanted\n\nA mechanical apparatus built to restrict the trespassers entering an area limited to only the lab affiliates. This robot, resembling a huge box, floats around the lab to inspect people inside to keep intruders out of the lab. It will attack as soon as it detects a suspect, hence, must be controlled using the necessary console. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -10146,20 +10002,21 @@
|
|||||||
<int name="14" value="2002006" />
|
<int name="14" value="2002006" />
|
||||||
<int name="15" value="2040024" />
|
<int name="15" value="2040024" />
|
||||||
<int name="16" value="2040534" />
|
<int name="16" value="2040534" />
|
||||||
<int name="17" value="2041007" />
|
<int name="17" value="2040536" />
|
||||||
<int name="18" value="2043001" />
|
<int name="18" value="2041007" />
|
||||||
<int name="19" value="2043112" />
|
<int name="19" value="2043001" />
|
||||||
<int name="20" value="2043113" />
|
<int name="20" value="2043112" />
|
||||||
<int name="21" value="2070007" />
|
<int name="21" value="2043113" />
|
||||||
<int name="22" value="2330003" />
|
<int name="22" value="2070007" />
|
||||||
<int name="23" value="2384023" />
|
<int name="23" value="2330003" />
|
||||||
<int name="24" value="4004001" />
|
<int name="24" value="2384023" />
|
||||||
<int name="25" value="4006000" />
|
<int name="25" value="4004001" />
|
||||||
<int name="26" value="4010006" />
|
<int name="26" value="4006000" />
|
||||||
<int name="27" value="4020006" />
|
<int name="27" value="4010006" />
|
||||||
<int name="28" value="4030012" />
|
<int name="28" value="4020006" />
|
||||||
<int name="29" value="4031234" />
|
<int name="29" value="4030012" />
|
||||||
<int name="30" value="4130017" />
|
<int name="30" value="4031234" />
|
||||||
|
<int name="31" value="4130017" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 70\nForm : Devil\nSpecial Trait : Resistant to Poison Attribute Attacks.\n\nKing Goblin known for its penchant for wrestling. It frequently pleads with the passersby for a wrestling match. It can fumigate everything nearby with its infamous flatulence. It likes buckwheat jelly." />
|
<string name="episode" value=" Lv. : 70\nForm : Devil\nSpecial Trait : Resistant to Poison Attribute Attacks.\n\nKing Goblin known for its penchant for wrestling. It frequently pleads with the passersby for a wrestling match. It can fumigate everything nearby with its infamous flatulence. It likes buckwheat jelly." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -10640,8 +10497,9 @@
|
|||||||
<int name="16" value="2044601" />
|
<int name="16" value="2044601" />
|
||||||
<int name="17" value="2044705" />
|
<int name="17" value="2044705" />
|
||||||
<int name="18" value="2044809" />
|
<int name="18" value="2044809" />
|
||||||
<int name="19" value="2385023" />
|
<int name="19" value="2290045" />
|
||||||
<int name="20" value="4000418" />
|
<int name="20" value="2385023" />
|
||||||
|
<int name="21" value="4000418" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 80\nForm : Enchanted\n\nThe most unique invention built by the alchemists of Alcadno. At first, the alchemists tried to build a robot more powerful than Roid, but the result of their attempt, Deet, did not have the level of intelligence they had hoped for. Consequently, the alchemists combined Deet and Roid to create the product of best of both worlds. However, with Roid's intelligence and Deet's physical strength combined, this newly improved robot refused to obey the commands of the Alcadno alchemists, causing unforeseen ruckus. After debating what to do with this robot, they decided to play a prank on the Zenumist alchemists. Upon sneaking in this failed invention into the Zenumist lab, Deet and Roi began breaking all the beakers and flasks, leaving no choice for the Zenumist alchemists but to destroy the robot using their renowned magic skills. However, the only way to completely destroy Deet and Roi is to break it into pieces, as even activating the most effective machine in lab 202 could only inflict rusting." />
|
<string name="episode" value=" Lv. : 80\nForm : Enchanted\n\nThe most unique invention built by the alchemists of Alcadno. At first, the alchemists tried to build a robot more powerful than Roid, but the result of their attempt, Deet, did not have the level of intelligence they had hoped for. Consequently, the alchemists combined Deet and Roid to create the product of best of both worlds. However, with Roid's intelligence and Deet's physical strength combined, this newly improved robot refused to obey the commands of the Alcadno alchemists, causing unforeseen ruckus. After debating what to do with this robot, they decided to play a prank on the Zenumist alchemists. Upon sneaking in this failed invention into the Zenumist lab, Deet and Roi began breaking all the beakers and flasks, leaving no choice for the Zenumist alchemists but to destroy the robot using their renowned magic skills. However, the only way to completely destroy Deet and Roi is to break it into pieces, as even activating the most effective machine in lab 202 could only inflict rusting." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12078,47 +11936,7 @@
|
|||||||
<int name="4" value="240040401" />
|
<int name="4" value="240040401" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002365" />
|
<int name="0" value="2386008" />
|
||||||
<int name="1" value="1040117" />
|
|
||||||
<int name="2" value="1040118" />
|
|
||||||
<int name="3" value="1041118" />
|
|
||||||
<int name="4" value="1050089" />
|
|
||||||
<int name="5" value="1050090" />
|
|
||||||
<int name="6" value="1052128" />
|
|
||||||
<int name="7" value="1060106" />
|
|
||||||
<int name="8" value="1061116" />
|
|
||||||
<int name="9" value="1072223" />
|
|
||||||
<int name="10" value="1082129" />
|
|
||||||
<int name="11" value="1452017" />
|
|
||||||
<int name="12" value="2000005" />
|
|
||||||
<int name="13" value="2000006" />
|
|
||||||
<int name="14" value="2040516" />
|
|
||||||
<int name="15" value="2040701" />
|
|
||||||
<int name="16" value="2043002" />
|
|
||||||
<int name="17" value="2043114" />
|
|
||||||
<int name="18" value="2044901" />
|
|
||||||
<int name="19" value="2044902" />
|
|
||||||
<int name="20" value="2290120" />
|
|
||||||
<int name="21" value="2290127" />
|
|
||||||
<int name="22" value="2386008" />
|
|
||||||
<int name="23" value="4000244" />
|
|
||||||
<int name="24" value="4000245" />
|
|
||||||
<int name="25" value="4000268" />
|
|
||||||
<int name="26" value="4001077" />
|
|
||||||
<int name="27" value="4001105" />
|
|
||||||
<int name="28" value="4004002" />
|
|
||||||
<int name="29" value="4006001" />
|
|
||||||
<int name="30" value="4010001" />
|
|
||||||
<int name="31" value="4020000" />
|
|
||||||
<int name="32" value="4031449" />
|
|
||||||
<int name="33" value="4031482" />
|
|
||||||
<int name="34" value="4031483" />
|
|
||||||
<int name="35" value="4031484" />
|
|
||||||
<int name="36" value="4031485" />
|
|
||||||
<int name="37" value="4130002" />
|
|
||||||
<int name="38" value="4130004" />
|
|
||||||
<int name="39" value="4130005" />
|
|
||||||
<int name="40" value="4130013" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 97\nForm : Reptile\nSpecial Trait : -50% Fire Attribute Damage. Vulnerable to Ice Attribute Attacks.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of reddish wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits flames. " />
|
<string name="episode" value=" Lv. : 97\nForm : Reptile\nSpecial Trait : -50% Fire Attribute Damage. Vulnerable to Ice Attribute Attacks.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of reddish wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits flames. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12131,42 +11949,7 @@
|
|||||||
<int name="4" value="240040401" />
|
<int name="4" value="240040401" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002532" />
|
<int name="0" value="2386013" />
|
||||||
<int name="1" value="1050094" />
|
|
||||||
<int name="2" value="1051105" />
|
|
||||||
<int name="3" value="1072227" />
|
|
||||||
<int name="4" value="1082143" />
|
|
||||||
<int name="5" value="1082213" />
|
|
||||||
<int name="6" value="1372010" />
|
|
||||||
<int name="7" value="1422013" />
|
|
||||||
<int name="8" value="2000005" />
|
|
||||||
<int name="9" value="2000006" />
|
|
||||||
<int name="10" value="2022003" />
|
|
||||||
<int name="11" value="2040001" />
|
|
||||||
<int name="12" value="2040401" />
|
|
||||||
<int name="13" value="2040924" />
|
|
||||||
<int name="14" value="2040925" />
|
|
||||||
<int name="15" value="2044001" />
|
|
||||||
<int name="16" value="2290101" />
|
|
||||||
<int name="17" value="2330004" />
|
|
||||||
<int name="18" value="2386013" />
|
|
||||||
<int name="19" value="4000244" />
|
|
||||||
<int name="20" value="4000245" />
|
|
||||||
<int name="21" value="4000269" />
|
|
||||||
<int name="22" value="4001077" />
|
|
||||||
<int name="23" value="4001105" />
|
|
||||||
<int name="24" value="4004003" />
|
|
||||||
<int name="25" value="4006000" />
|
|
||||||
<int name="26" value="4010004" />
|
|
||||||
<int name="27" value="4020005" />
|
|
||||||
<int name="28" value="4031449" />
|
|
||||||
<int name="29" value="4031482" />
|
|
||||||
<int name="30" value="4031483" />
|
|
||||||
<int name="31" value="4031484" />
|
|
||||||
<int name="32" value="4031485" />
|
|
||||||
<int name="33" value="4130004" />
|
|
||||||
<int name="34" value="4130013" />
|
|
||||||
<int name="35" value="4130014" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 101\nForm : Reptile\nSpecial Trait : Vulnerable Fire Attribute Attacks. -50% Ice Attribute Damage.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of blue wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits cold air. " />
|
<string name="episode" value=" Lv. : 101\nForm : Reptile\nSpecial Trait : Vulnerable Fire Attribute Attacks. -50% Ice Attribute Damage.\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of blue wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence as well as an extremely fast speed, not to mention the wind it can create with its huge wings. It also orally emits cold air. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12179,53 +11962,7 @@
|
|||||||
<int name="4" value="240040500" />
|
<int name="4" value="240040500" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="1002531" />
|
<int name="0" value="2386015" />
|
||||||
<int name="1" value="1040115" />
|
|
||||||
<int name="2" value="1040117" />
|
|
||||||
<int name="3" value="1050093" />
|
|
||||||
<int name="4" value="1051095" />
|
|
||||||
<int name="5" value="1060104" />
|
|
||||||
<int name="6" value="1060107" />
|
|
||||||
<int name="7" value="1072214" />
|
|
||||||
<int name="8" value="1082127" />
|
|
||||||
<int name="9" value="1332027" />
|
|
||||||
<int name="10" value="1442020" />
|
|
||||||
<int name="11" value="1482012" />
|
|
||||||
<int name="12" value="2000005" />
|
|
||||||
<int name="13" value="2000006" />
|
|
||||||
<int name="14" value="2020013" />
|
|
||||||
<int name="15" value="2022003" />
|
|
||||||
<int name="16" value="2040302" />
|
|
||||||
<int name="17" value="2040320" />
|
|
||||||
<int name="18" value="2044301" />
|
|
||||||
<int name="19" value="2044402" />
|
|
||||||
<int name="20" value="2290010" />
|
|
||||||
<int name="21" value="2290019" />
|
|
||||||
<int name="22" value="2290026" />
|
|
||||||
<int name="23" value="2290076" />
|
|
||||||
<int name="24" value="2290119" />
|
|
||||||
<int name="25" value="2290128" />
|
|
||||||
<int name="26" value="2386015" />
|
|
||||||
<int name="27" value="4000244" />
|
|
||||||
<int name="28" value="4000245" />
|
|
||||||
<int name="29" value="4000270" />
|
|
||||||
<int name="30" value="4001077" />
|
|
||||||
<int name="31" value="4001105" />
|
|
||||||
<int name="32" value="4004000" />
|
|
||||||
<int name="33" value="4006000" />
|
|
||||||
<int name="34" value="4006001" />
|
|
||||||
<int name="35" value="4010005" />
|
|
||||||
<int name="36" value="4020002" />
|
|
||||||
<int name="37" value="4031415" />
|
|
||||||
<int name="38" value="4031449" />
|
|
||||||
<int name="39" value="4031482" />
|
|
||||||
<int name="40" value="4031483" />
|
|
||||||
<int name="41" value="4031484" />
|
|
||||||
<int name="42" value="4031485" />
|
|
||||||
<int name="43" value="4130009" />
|
|
||||||
<int name="44" value="4130014" />
|
|
||||||
<int name="45" value="4130017" />
|
|
||||||
<int name="46" value="4131004" />
|
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 103\nForm : Reptile\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of black wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence and orally emits the breath of damnation." />
|
<string name="episode" value=" Lv. : 103\nForm : Reptile\n\nA ferocious dragon that lives in the Dragon Canyon. It has a huge pair of black wings but no front legs. It sets its nest in between the valleys, and has a decent level of intelligence and orally emits the breath of damnation." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12263,22 +12000,24 @@
|
|||||||
<int name="26" value="2040602" />
|
<int name="26" value="2040602" />
|
||||||
<int name="27" value="2040705" />
|
<int name="27" value="2040705" />
|
||||||
<int name="28" value="2040924" />
|
<int name="28" value="2040924" />
|
||||||
<int name="29" value="2387000" />
|
<int name="29" value="2290045" />
|
||||||
<int name="30" value="4000151" />
|
<int name="30" value="2290081" />
|
||||||
<int name="31" value="4004003" />
|
<int name="31" value="2387000" />
|
||||||
<int name="32" value="4006000" />
|
<int name="32" value="4000151" />
|
||||||
<int name="33" value="4010001" />
|
<int name="33" value="4004003" />
|
||||||
<int name="34" value="4020002" />
|
<int name="34" value="4006000" />
|
||||||
<int name="35" value="4031170" />
|
<int name="35" value="4010001" />
|
||||||
<int name="36" value="4031171" />
|
<int name="36" value="4020002" />
|
||||||
<int name="37" value="4031172" />
|
<int name="37" value="4031170" />
|
||||||
<int name="38" value="4031175" />
|
<int name="38" value="4031171" />
|
||||||
<int name="39" value="4031473" />
|
<int name="39" value="4031172" />
|
||||||
<int name="40" value="4031474" />
|
<int name="40" value="4031175" />
|
||||||
<int name="41" value="4031496" />
|
<int name="41" value="4031473" />
|
||||||
<int name="42" value="4130003" />
|
<int name="42" value="4031474" />
|
||||||
<int name="43" value="4130004" />
|
<int name="43" value="4031496" />
|
||||||
<int name="44" value="4130014" />
|
<int name="44" value="4130003" />
|
||||||
|
<int name="45" value="4130004" />
|
||||||
|
<int name="46" value="4130014" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 108\nForm : Devil\nSpecial Trait : -50% Electricity Attribute Damage.\n\nA powerful gate guard that Papulatus summoned to prevent any form of intrusion into the operation room of the Clocktower. It will make everyone and everything shiver in fear should anyone try to step into the warped corridor of the Clocktower. " />
|
<string name="episode" value=" Lv. : 108\nForm : Devil\nSpecial Trait : -50% Electricity Attribute Damage.\n\nA powerful gate guard that Papulatus summoned to prevent any form of intrusion into the operation room of the Clocktower. It will make everyone and everything shiver in fear should anyone try to step into the warped corridor of the Clocktower. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12317,23 +12056,25 @@
|
|||||||
<int name="27" value="2040512" />
|
<int name="27" value="2040512" />
|
||||||
<int name="28" value="2040702" />
|
<int name="28" value="2040702" />
|
||||||
<int name="29" value="2040802" />
|
<int name="29" value="2040802" />
|
||||||
<int name="30" value="2387001" />
|
<int name="30" value="2290087" />
|
||||||
<int name="31" value="4000152" />
|
<int name="31" value="2290109" />
|
||||||
<int name="32" value="4001112" />
|
<int name="32" value="2387001" />
|
||||||
<int name="33" value="4004004" />
|
<int name="33" value="4000152" />
|
||||||
<int name="34" value="4006001" />
|
<int name="34" value="4001112" />
|
||||||
<int name="35" value="4010004" />
|
<int name="35" value="4004004" />
|
||||||
<int name="36" value="4010005" />
|
<int name="36" value="4006001" />
|
||||||
<int name="37" value="4020008" />
|
<int name="37" value="4010004" />
|
||||||
<int name="38" value="4031170" />
|
<int name="38" value="4010005" />
|
||||||
<int name="39" value="4031171" />
|
<int name="39" value="4020008" />
|
||||||
<int name="40" value="4031172" />
|
<int name="40" value="4031170" />
|
||||||
<int name="41" value="4031175" />
|
<int name="41" value="4031171" />
|
||||||
<int name="42" value="4031453" />
|
<int name="42" value="4031172" />
|
||||||
<int name="43" value="4031458" />
|
<int name="43" value="4031175" />
|
||||||
<int name="44" value="4130001" />
|
<int name="44" value="4031453" />
|
||||||
<int name="45" value="4130003" />
|
<int name="45" value="4031458" />
|
||||||
<int name="46" value="4130008" />
|
<int name="46" value="4130001" />
|
||||||
|
<int name="47" value="4130003" />
|
||||||
|
<int name="48" value="4130008" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 108\nForm : Devil\nSpecial Trait : Vulnerable to Sanctity Attribute Attacks. -50% Ice Attribute Damage.\n\nA creature of an alternate dimension that Papulatus summoned to prevent any form of intrusion into the operation room of the Clocktower. It is a wizard of another dimension linked to the Dimensional Schism which attacks intruders using its magic skills." />
|
<string name="episode" value=" Lv. : 108\nForm : Devil\nSpecial Trait : Vulnerable to Sanctity Attribute Attacks. -50% Ice Attribute Damage.\n\nA creature of an alternate dimension that Papulatus summoned to prevent any form of intrusion into the operation room of the Clocktower. It is a wizard of another dimension linked to the Dimensional Schism which attacks intruders using its magic skills." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -12628,28 +12369,29 @@
|
|||||||
<int name="22" value="2049000" />
|
<int name="22" value="2049000" />
|
||||||
<int name="23" value="2290012" />
|
<int name="23" value="2290012" />
|
||||||
<int name="24" value="2290014" />
|
<int name="24" value="2290014" />
|
||||||
<int name="25" value="2290050" />
|
<int name="25" value="2290045" />
|
||||||
<int name="26" value="2290062" />
|
<int name="26" value="2290050" />
|
||||||
<int name="27" value="2290070" />
|
<int name="27" value="2290062" />
|
||||||
<int name="28" value="2290086" />
|
<int name="28" value="2290070" />
|
||||||
<int name="29" value="2290108" />
|
<int name="29" value="2290086" />
|
||||||
<int name="30" value="2387002" />
|
<int name="30" value="2290108" />
|
||||||
<int name="31" value="4000244" />
|
<int name="31" value="2387002" />
|
||||||
<int name="32" value="4000245" />
|
<int name="32" value="4000244" />
|
||||||
<int name="33" value="4000274" />
|
<int name="33" value="4000245" />
|
||||||
<int name="34" value="4004001" />
|
<int name="34" value="4000274" />
|
||||||
<int name="35" value="4006000" />
|
<int name="35" value="4004001" />
|
||||||
<int name="36" value="4006001" />
|
<int name="36" value="4006000" />
|
||||||
<int name="37" value="4007000" />
|
<int name="37" value="4006001" />
|
||||||
<int name="38" value="4007002" />
|
<int name="38" value="4007000" />
|
||||||
<int name="39" value="4007003" />
|
<int name="39" value="4007002" />
|
||||||
<int name="40" value="4007004" />
|
<int name="40" value="4007003" />
|
||||||
<int name="41" value="4007007" />
|
<int name="41" value="4007004" />
|
||||||
<int name="42" value="4010001" />
|
<int name="42" value="4007007" />
|
||||||
<int name="43" value="4020001" />
|
<int name="43" value="4010001" />
|
||||||
<int name="44" value="4031461" />
|
<int name="44" value="4020001" />
|
||||||
<int name="45" value="4130001" />
|
<int name="45" value="4031461" />
|
||||||
<int name="46" value="4130014" />
|
<int name="46" value="4130001" />
|
||||||
|
<int name="47" value="4130014" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 110\nForm : Immortal\nSpecial Trait : Vulnerable to Sanctity Attribute Attacks.\n\nA group of skeletons that belong to the dragon family. The Skelegons can be found roaming around the dragon nests, unaware that they have died and have become Undeads. They are the reincarnation of dead dragons who were killed during the Dragon War, and will attack anything that comes near regardless of whether the approaching enemy is a human, a dragon, or any other forms of life. " />
|
<string name="episode" value=" Lv. : 110\nForm : Immortal\nSpecial Trait : Vulnerable to Sanctity Attribute Attacks.\n\nA group of skeletons that belong to the dragon family. The Skelegons can be found roaming around the dragon nests, unaware that they have died and have become Undeads. They are the reincarnation of dead dragons who were killed during the Dragon War, and will attack anything that comes near regardless of whether the approaching enemy is a human, a dragon, or any other forms of life. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13030,16 +12772,17 @@
|
|||||||
<int name="11" value="2044101" />
|
<int name="11" value="2044101" />
|
||||||
<int name="12" value="2044501" />
|
<int name="12" value="2044501" />
|
||||||
<int name="13" value="2290006" />
|
<int name="13" value="2290006" />
|
||||||
<int name="14" value="2290133" />
|
<int name="14" value="2290109" />
|
||||||
<int name="15" value="2330004" />
|
<int name="15" value="2290133" />
|
||||||
<int name="16" value="2387009" />
|
<int name="16" value="2330004" />
|
||||||
<int name="17" value="4000453" />
|
<int name="17" value="2387009" />
|
||||||
<int name="18" value="4000459" />
|
<int name="18" value="4000453" />
|
||||||
<int name="19" value="4004000" />
|
<int name="19" value="4000459" />
|
||||||
<int name="20" value="4010005" />
|
<int name="20" value="4004000" />
|
||||||
<int name="21" value="4020005" />
|
<int name="21" value="4010005" />
|
||||||
<int name="22" value="4020009" />
|
<int name="22" value="4020005" />
|
||||||
<int name="23" value="4130008" />
|
<int name="23" value="4020009" />
|
||||||
|
<int name="24" value="4130008" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Level : Lv.116\nForm : Spirit\n\nThe chief of the Qualm Guardians stands at the Road of Regrets, beyond the Gate of the Past, inside the Temple of Time. Its sole purpose is to protect Rhinne, the Goddess of Time. Compared to other guardians, its armor seems more sturdy and brilliantly decorated. It once was a human knight, but throughout the many years of protecting the goddess inside the temple, it has cast off its humanness. Now it only exists to serve the goddess. The only evidence left of its lost humanity is its hardened heart that contains all its bitter memories." />
|
<string name="episode" value="Level : Lv.116\nForm : Spirit\n\nThe chief of the Qualm Guardians stands at the Road of Regrets, beyond the Gate of the Past, inside the Temple of Time. Its sole purpose is to protect Rhinne, the Goddess of Time. Compared to other guardians, its armor seems more sturdy and brilliantly decorated. It once was a human knight, but throughout the many years of protecting the goddess inside the temple, it has cast off its humanness. Now it only exists to serve the goddess. The only evidence left of its lost humanity is its hardened heart that contains all its bitter memories." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13343,14 +13086,15 @@
|
|||||||
<int name="32" value="2041019" />
|
<int name="32" value="2041019" />
|
||||||
<int name="33" value="2041022" />
|
<int name="33" value="2041022" />
|
||||||
<int name="34" value="2070007" />
|
<int name="34" value="2070007" />
|
||||||
<int name="35" value="2330003" />
|
<int name="35" value="2290081" />
|
||||||
<int name="36" value="2388032" />
|
<int name="36" value="2330003" />
|
||||||
<int name="37" value="4000356" />
|
<int name="37" value="2388032" />
|
||||||
<int name="38" value="4000364" />
|
<int name="38" value="4000356" />
|
||||||
<int name="39" value="4000365" />
|
<int name="39" value="4000364" />
|
||||||
<int name="40" value="4004004" />
|
<int name="40" value="4000365" />
|
||||||
<int name="41" value="4010005" />
|
<int name="41" value="4004004" />
|
||||||
<int name="42" value="4020008" />
|
<int name="42" value="4010005" />
|
||||||
|
<int name="43" value="4020008" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 85\nForm : Enchanted\n\nAn unknown creature sometimes known as the Alchemist's experiment-gone-wrong and sometimes known as the strange genius Yulete's experimental creation. This strange creature, which is neither animal nor Roid, is often spotted around secret passageways that are only known by some. Some say that it was created in the secret laboratory hidden in such a secret passageway, and there are rumors that claim that someone had left Kimera there for a specific purpose. So far, none of the rumors surrounding Kimera have been unconfirmed." />
|
<string name="episode" value=" Lv. : 85\nForm : Enchanted\n\nAn unknown creature sometimes known as the Alchemist's experiment-gone-wrong and sometimes known as the strange genius Yulete's experimental creation. This strange creature, which is neither animal nor Roid, is often spotted around secret passageways that are only known by some. Some say that it was created in the secret laboratory hidden in such a secret passageway, and there are rumors that claim that someone had left Kimera there for a specific purpose. So far, none of the rumors surrounding Kimera have been unconfirmed." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13605,7 +13349,8 @@
|
|||||||
<int name="28" value="2044501" />
|
<int name="28" value="2044501" />
|
||||||
<int name="29" value="2044601" />
|
<int name="29" value="2044601" />
|
||||||
<int name="30" value="2044701" />
|
<int name="30" value="2044701" />
|
||||||
<int name="31" value="2388054" />
|
<int name="31" value="2290109" />
|
||||||
|
<int name="32" value="2388054" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="레벨 : Lv.85\n형태 : 무기물형\n\n빅토리아중앙던전의 개미굴광장에는 유명한 노점상인이 있다. 하지만 그 보다 더 깊은 던전에 가끔씩 정체불명의 포장마차가 문을 연다는데... 더 특이한 점은 이 포장마차에서 물건을 사 본 사람은 아직 한 명도 없다는 것이다. 그 이유는 가까이 다가가기만 하면 갑자기 태도가 180도 달라지기 때문이라는데... 개미굴 광장의 노점상인은 경쟁자의 출현에 심기가 불편한것 같다." />
|
<string name="episode" value="레벨 : Lv.85\n형태 : 무기물형\n\n빅토리아중앙던전의 개미굴광장에는 유명한 노점상인이 있다. 하지만 그 보다 더 깊은 던전에 가끔씩 정체불명의 포장마차가 문을 연다는데... 더 특이한 점은 이 포장마차에서 물건을 사 본 사람은 아직 한 명도 없다는 것이다. 그 이유는 가까이 다가가기만 하면 갑자기 태도가 180도 달라지기 때문이라는데... 개미굴 광장의 노점상인은 경쟁자의 출현에 심기가 불편한것 같다." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -13741,43 +13486,44 @@
|
|||||||
<int name="24" value="2040504" />
|
<int name="24" value="2040504" />
|
||||||
<int name="25" value="2040513" />
|
<int name="25" value="2040513" />
|
||||||
<int name="26" value="2040516" />
|
<int name="26" value="2040516" />
|
||||||
<int name="27" value="2040622" />
|
<int name="27" value="2040536" />
|
||||||
<int name="28" value="2043113" />
|
<int name="28" value="2040622" />
|
||||||
<int name="29" value="2049000" />
|
<int name="29" value="2043113" />
|
||||||
<int name="30" value="2280007" />
|
<int name="30" value="2049000" />
|
||||||
<int name="31" value="2280008" />
|
<int name="31" value="2280007" />
|
||||||
<int name="32" value="2280009" />
|
<int name="32" value="2280008" />
|
||||||
<int name="33" value="2280010" />
|
<int name="33" value="2280009" />
|
||||||
<int name="34" value="2290000" />
|
<int name="34" value="2280010" />
|
||||||
<int name="35" value="2290001" />
|
<int name="35" value="2290000" />
|
||||||
<int name="36" value="2290004" />
|
<int name="36" value="2290001" />
|
||||||
<int name="37" value="2290005" />
|
<int name="37" value="2290004" />
|
||||||
<int name="38" value="2290024" />
|
<int name="38" value="2290005" />
|
||||||
<int name="39" value="2290025" />
|
<int name="39" value="2290024" />
|
||||||
<int name="40" value="2290026" />
|
<int name="40" value="2290025" />
|
||||||
<int name="41" value="2290027" />
|
<int name="41" value="2290026" />
|
||||||
<int name="42" value="2290052" />
|
<int name="42" value="2290027" />
|
||||||
<int name="43" value="2290053" />
|
<int name="43" value="2290052" />
|
||||||
<int name="44" value="2290054" />
|
<int name="44" value="2290053" />
|
||||||
<int name="45" value="2290055" />
|
<int name="45" value="2290054" />
|
||||||
<int name="46" value="2290076" />
|
<int name="46" value="2290055" />
|
||||||
<int name="47" value="2290077" />
|
<int name="47" value="2290076" />
|
||||||
<int name="48" value="2290082" />
|
<int name="48" value="2290077" />
|
||||||
<int name="49" value="2290083" />
|
<int name="49" value="2290082" />
|
||||||
<int name="50" value="2290097" />
|
<int name="50" value="2290083" />
|
||||||
<int name="51" value="2290099" />
|
<int name="51" value="2290097" />
|
||||||
<int name="52" value="2290106" />
|
<int name="52" value="2290099" />
|
||||||
<int name="53" value="2290108" />
|
<int name="53" value="2290106" />
|
||||||
<int name="54" value="2290112" />
|
<int name="54" value="2290108" />
|
||||||
<int name="55" value="2290114" />
|
<int name="55" value="2290112" />
|
||||||
<int name="56" value="2290122" />
|
<int name="56" value="2290114" />
|
||||||
<int name="57" value="2290124" />
|
<int name="57" value="2290122" />
|
||||||
<int name="58" value="2290132" />
|
<int name="58" value="2290124" />
|
||||||
<int name="59" value="2388020" />
|
<int name="59" value="2290132" />
|
||||||
<int name="60" value="4000175" />
|
<int name="60" value="2388020" />
|
||||||
<int name="61" value="4001085" />
|
<int name="61" value="4000175" />
|
||||||
<int name="62" value="4031253" />
|
<int name="62" value="4001085" />
|
||||||
<int name="63" value="4031905" />
|
<int name="63" value="4031253" />
|
||||||
|
<int name="64" value="4031905" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : Unknown\nForm : Fish\nSpecial Trait : Vulnerable to Fire Attribute Attacks.\n\nA ferocious fish monster that lives in the cave under the ocean. It sticks its head out from a tiny hole in the cave, which is why its size remains a mystery. Some suspect that this monster has not fully come out of the cave because it's stuck, but no evidences support such a rumor. Although it does not move, it is the king of the deep sea that attacks by shooting a laser beam out of its mouth. " />
|
<string name="episode" value=" Lv. : Unknown\nForm : Fish\nSpecial Trait : Vulnerable to Fire Attribute Attacks.\n\nA ferocious fish monster that lives in the cave under the ocean. It sticks its head out from a tiny hole in the cave, which is why its size remains a mystery. Some suspect that this monster has not fully come out of the cave because it's stuck, but no evidences support such a rumor. Although it does not move, it is the king of the deep sea that attacks by shooting a laser beam out of its mouth. " />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -14054,7 +13800,8 @@
|
|||||||
<int name="91" value="2290090" />
|
<int name="91" value="2290090" />
|
||||||
<int name="92" value="2290106" />
|
<int name="92" value="2290106" />
|
||||||
<int name="93" value="2290119" />
|
<int name="93" value="2290119" />
|
||||||
<int name="94" value="4021010" />
|
<int name="94" value="2388043" />
|
||||||
|
<int name="95" value="4021010" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Level : Lv.180\nForm : Spirit\n\nA monster that has been summoned by a mysterious man named Kirston using the Mirror of the Goddess. It doesn't seem that Kirston intentionally summoned Pink Bean. Although Pink Bean is a cute little creature, its power is beyond imagination. It is a very dangerous monster and should be approached with caution. One of its amazing powers is that it can revive a dead god. It seems to be a monster from another world." />
|
<string name="episode" value="Level : Lv.180\nForm : Spirit\n\nA monster that has been summoned by a mysterious man named Kirston using the Mirror of the Goddess. It doesn't seem that Kirston intentionally summoned Pink Bean. Although Pink Bean is a cute little creature, its power is beyond imagination. It is a very dangerous monster and should be approached with caution. One of its amazing powers is that it can revive a dead god. It seems to be a monster from another world." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -14210,10 +13957,26 @@
|
|||||||
<int name="1" value="261020200" />
|
<int name="1" value="261020200" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<imgdir name="reward">
|
<imgdir name="reward">
|
||||||
<int name="0" value="2022430" />
|
<int name="0" value="1002215" />
|
||||||
<int name="1" value="2022431" />
|
<int name="1" value="1040089" />
|
||||||
<int name="2" value="2022432" />
|
<int name="2" value="1050045" />
|
||||||
<int name="3" value="2022433" />
|
<int name="3" value="1372007" />
|
||||||
|
<int name="4" value="2000002" />
|
||||||
|
<int name="5" value="2000003" />
|
||||||
|
<int name="6" value="2022430" />
|
||||||
|
<int name="7" value="2022431" />
|
||||||
|
<int name="8" value="2022432" />
|
||||||
|
<int name="9" value="2022433" />
|
||||||
|
<int name="10" value="2040002" />
|
||||||
|
<int name="11" value="2044102" />
|
||||||
|
<int name="12" value="2383007" />
|
||||||
|
<int name="13" value="4000359" />
|
||||||
|
<int name="14" value="4004002" />
|
||||||
|
<int name="15" value="4006001" />
|
||||||
|
<int name="16" value="4020000" />
|
||||||
|
<int name="17" value="4020006" />
|
||||||
|
<int name="18" value="4030012" />
|
||||||
|
<int name="19" value="4130012" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value=" Lv. : 47\nForm : Enchanted\n\nA Mithril being created by alchemy means... It's constitution, made purely by Mithril, makes it a tough opponent." />
|
<string name="episode" value=" Lv. : 47\nForm : Enchanted\n\nA Mithril being created by alchemy means... It's constitution, made purely by Mithril, makes it a tough opponent." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
@@ -14550,15 +14313,16 @@
|
|||||||
<int name="21" value="2000001" />
|
<int name="21" value="2000001" />
|
||||||
<int name="22" value="2000003" />
|
<int name="22" value="2000003" />
|
||||||
<int name="23" value="2043102" />
|
<int name="23" value="2043102" />
|
||||||
<int name="24" value="2048000" />
|
<int name="24" value="2043109" />
|
||||||
<int name="25" value="2060000" />
|
<int name="25" value="2048000" />
|
||||||
<int name="26" value="2061000" />
|
<int name="26" value="2060000" />
|
||||||
<int name="27" value="2380014" />
|
<int name="27" value="2061000" />
|
||||||
<int name="28" value="4000012" />
|
<int name="28" value="2380014" />
|
||||||
<int name="29" value="4010004" />
|
<int name="29" value="4000012" />
|
||||||
<int name="30" value="4020002" />
|
<int name="30" value="4010004" />
|
||||||
<int name="31" value="4020003" />
|
<int name="31" value="4020002" />
|
||||||
<int name="32" value="4032316" />
|
<int name="32" value="4020003" />
|
||||||
|
<int name="33" value="4032316" />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
<string name="episode" value="Level : Lv.15\nType : Plants\nNotes: Immune to poison-based attacks.\n\nA mushroom monster featuring a dirty green cap, and has that sick look on its face as if it's about to throw up any minute." />
|
<string name="episode" value="Level : Lv.15\nType : Plants\nNotes: Immune to poison-based attacks.\n\nA mushroom monster featuring a dirty green cap, and has that sick look on its face as if it's about to throw up any minute." />
|
||||||
</imgdir>
|
</imgdir>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||||
<group/>
|
<group>
|
||||||
|
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/tools/MobBookUpdate/src/mobbookupdate/MobBookUpdate.java</file>
|
||||||
|
</group>
|
||||||
</open-files>
|
</open-files>
|
||||||
</project-private>
|
</project-private>
|
||||||
Loaded 100 of 105 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user