Reworked equip lvlup + Reactor quest item drop + ToT quests fix
Rebalanced the way equipment exp is gained (about 100~200 same-level range mobs to pass equip level 1 to 2). Fixed reactors dropping quest items to player if they don't have the quest started. Fixed broken Temple of Time quests.
This commit is contained in:
@@ -1464,14 +1464,31 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
if (id / 1000000 == 2) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
if (ii.isConsumeOnPickup(id)) {
|
||||
if (id > 2022430 && id < 2022434) {
|
||||
for (MapleCharacter mc : c.getPlayer().getMap().getCharacters()) {
|
||||
if (mc.getParty() == c.getPlayer().getParty()) {
|
||||
ii.getItemEffect(id).applyTo(mc);
|
||||
if (ii.isPartyItem(id)) {
|
||||
List<MapleCharacter> pchr = c.getPlayer().getPartyMembersOnSameMap();
|
||||
|
||||
if(!ii.isPartyAllcure(id)) {
|
||||
if(!pchr.isEmpty()) {
|
||||
for (MapleCharacter mc : pchr) {
|
||||
ii.getItemEffect(id).applyTo(mc);
|
||||
mc.checkBerserk(mc.isHidden());
|
||||
}
|
||||
} else {
|
||||
ii.getItemEffect(id).applyTo(c.getPlayer());
|
||||
c.getPlayer().checkBerserk(c.getPlayer().isHidden());
|
||||
}
|
||||
} else {
|
||||
if(!pchr.isEmpty()) {
|
||||
for (MapleCharacter mc : pchr) {
|
||||
mc.dispelDebuffs();
|
||||
}
|
||||
} else {
|
||||
c.getPlayer().dispelDebuffs();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ii.getItemEffect(id).applyTo(c.getPlayer());
|
||||
c.getPlayer().checkBerserk(c.getPlayer().isHidden());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -1940,7 +1957,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
extraRecoveryTask = null;
|
||||
}
|
||||
|
||||
if(extraHpRec > 0 || extraMpRec > 0) {
|
||||
if(extraHpRec != 0 || extraMpRec != 0) {
|
||||
startExtraTaskInternal(extraHpRec, extraMpRec, extraRecInterval);
|
||||
}
|
||||
}
|
||||
@@ -3167,6 +3184,19 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<MapleCharacter> getPartyMembersOnSameMap() {
|
||||
List<MapleCharacter> list = new LinkedList<>();
|
||||
int thisMapHash = this.getMap().hashCode();
|
||||
|
||||
if(party != null) {
|
||||
for(MaplePartyCharacter partyMembers: party.getMembers()) {
|
||||
if(partyMembers.getPlayer().getMap().hashCode() == thisMapHash) list.add(partyMembers.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public boolean isPartyMember(MapleCharacter chr) {
|
||||
for(MapleCharacter mpcu: getPartyMembers()) {
|
||||
if(mpcu.getId() == chr.getId()) {
|
||||
@@ -3188,6 +3218,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
closeMiniGame();
|
||||
closeHiredMerchant(false);
|
||||
closePlayerMessenger();
|
||||
|
||||
client.closePlayerScriptInteractions();
|
||||
}
|
||||
|
||||
public void closeNpcShop() {
|
||||
@@ -3595,11 +3627,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
|
||||
private void guildUpdate() {
|
||||
mgc.setLevel(level);
|
||||
mgc.setJobId(job.getId());
|
||||
|
||||
if (this.guildid < 1) {
|
||||
return;
|
||||
}
|
||||
mgc.setLevel(level);
|
||||
mgc.setJobId(job.getId());
|
||||
|
||||
try {
|
||||
Server.getInstance().memberLevelJobUpdate(this.mgc);
|
||||
//Server.getInstance().getGuild(guildid, world, mgc).gainGP(40);
|
||||
@@ -4955,7 +4989,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showRecovery(id, heal), false);
|
||||
}
|
||||
}, healInterval, healInterval);
|
||||
} else if (effect.isDojoBuff()) {
|
||||
} else if (effect.isDojoBuff() || effect.getSourceId() == 2022337) {
|
||||
boolean isRecoveryBuff = false;
|
||||
if(effect.getHpRRate() > 0) {
|
||||
extraHpRec = effect.getHpR();
|
||||
@@ -4968,7 +5002,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
extraRecInterval = effect.getMpRRate();
|
||||
isRecoveryBuff = true;
|
||||
}
|
||||
|
||||
|
||||
if(isRecoveryBuff) {
|
||||
stopExtraTask();
|
||||
startExtraTask(extraHpRec, extraMpRec, extraRecInterval); // HP & MP sharing the same task holder
|
||||
|
||||
@@ -732,8 +732,6 @@ public class MapleClient {
|
||||
player.cancelAllDebuffs();
|
||||
|
||||
player.closePlayerInteractions();
|
||||
|
||||
NPCScriptManager.getInstance().dispose(this);
|
||||
QuestScriptManager.getInstance().dispose(this);
|
||||
|
||||
if (player.getEventInstance() != null) {
|
||||
@@ -764,6 +762,8 @@ public class MapleClient {
|
||||
final MapleMessengerCharacter chrm = new MapleMessengerCharacter(player, 0);
|
||||
final MapleGuildCharacter chrg = player.getMGC();
|
||||
final MapleGuild guild = player.getGuild();
|
||||
|
||||
player.cancelMagicDoor();
|
||||
|
||||
if (channel == -1 || shutdown) {
|
||||
if(chrg != null) chrg.setCharacter(null);
|
||||
@@ -1254,4 +1254,9 @@ public class MapleClient {
|
||||
public void removeClickedNPC(){
|
||||
lastNpcClick = 0;
|
||||
}
|
||||
|
||||
public void closePlayerScriptInteractions() {
|
||||
this.removeClickedNPC();
|
||||
NPCScriptManager.getInstance().dispose(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,9 +338,8 @@ public class Commands {
|
||||
switch(sub[0]) {
|
||||
case "help":
|
||||
case "commands":
|
||||
case "playercommands":
|
||||
player.setCS(true);
|
||||
c.getAbstractPlayerInteraction().openNpc(9201143);
|
||||
case "playercommands":
|
||||
c.getAbstractPlayerInteraction().openNpc(9201143, "commands");
|
||||
break;
|
||||
|
||||
case "time":
|
||||
@@ -1095,7 +1094,14 @@ public class Commands {
|
||||
if (ItemConstants.isPet(itemId)) {
|
||||
petid = MaplePet.createPet(itemId);
|
||||
}
|
||||
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, -1);
|
||||
|
||||
byte flag = 0;
|
||||
if(player.gmLevel() < 3) {
|
||||
flag |= ItemConstants.ACCOUNT_SHARING;
|
||||
flag |= ItemConstants.UNTRADEABLE;
|
||||
}
|
||||
|
||||
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, flag, -1);
|
||||
} else {
|
||||
Item toDrop;
|
||||
if (MapleItemInformationProvider.getInstance().getInventoryType(itemId) == MapleInventoryType.EQUIP) {
|
||||
@@ -1103,6 +1109,16 @@ public class Commands {
|
||||
} else {
|
||||
toDrop = new Item(itemId, (short) 0, quantity);
|
||||
}
|
||||
|
||||
toDrop.setOwner(player.getName());
|
||||
if(player.gmLevel() < 3) {
|
||||
byte b = toDrop.getFlag();
|
||||
b |= ItemConstants.ACCOUNT_SHARING;
|
||||
b |= ItemConstants.UNTRADEABLE;
|
||||
|
||||
toDrop.setFlag(b);
|
||||
}
|
||||
|
||||
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
|
||||
}
|
||||
break;
|
||||
@@ -1294,6 +1310,19 @@ public class Commands {
|
||||
player.dropMessage(sub[1] + " not found on this channel! Make sure your target is logged on and on the same channel as yours.");
|
||||
}
|
||||
break;
|
||||
|
||||
case "job":
|
||||
if (sub.length == 2) {
|
||||
player.changeJob(MapleJob.getById(Integer.parseInt(sub[1])));
|
||||
player.equipChanged();
|
||||
} else if (sub.length == 3) {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
victim.changeJob(MapleJob.getById(Integer.parseInt(sub[2])));
|
||||
player.equipChanged();
|
||||
} else {
|
||||
player.message("Syntax: !job <job id> <opt: IGN of another person>");
|
||||
}
|
||||
break;
|
||||
|
||||
case "unbug":
|
||||
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.enableActions());
|
||||
@@ -1407,6 +1436,8 @@ public class Commands {
|
||||
victim.setMp(statUpdate);
|
||||
victim.updateSingleStat(MapleStat.HP, statUpdate);
|
||||
victim.updateSingleStat(MapleStat.MP, statUpdate);
|
||||
|
||||
victim.checkBerserk(victim.isHidden());
|
||||
break;
|
||||
|
||||
case "music":
|
||||
@@ -1823,6 +1854,23 @@ public class Commands {
|
||||
player.yellowMessage("Done.");
|
||||
break;
|
||||
|
||||
case "npc":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !npc <npcid>");
|
||||
break;
|
||||
}
|
||||
MapleNPC npc = MapleLifeFactory.getNPC(Integer.parseInt(sub[1]));
|
||||
if (npc != null) {
|
||||
npc.setPosition(player.getPosition());
|
||||
npc.setCy(player.getPosition().y);
|
||||
npc.setRx0(player.getPosition().x + 50);
|
||||
npc.setRx1(player.getPosition().x - 50);
|
||||
npc.setFh(player.getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
|
||||
player.getMap().addMapObject(npc);
|
||||
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -1854,6 +1902,7 @@ public class Commands {
|
||||
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
Item it = ii.getEquipById(itemid);
|
||||
it.setOwner(player.getName());
|
||||
MapleInventoryType type = ii.getInventoryType(itemid);
|
||||
if (type.equals(MapleInventoryType.EQUIP)) {
|
||||
hardsetItemStats((Equip) it, multiply);
|
||||
@@ -1909,31 +1958,35 @@ public class Commands {
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !exprate <newrate>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
c.getWorldServer().setExpRate(Integer.parseInt(sub[1]));
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Exp Rate has been changed to " + sub[1] + "x."));
|
||||
break;
|
||||
case "mesorate":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !mesorate <newrate>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
c.getWorldServer().setMesoRate(Integer.parseInt(sub[1]));
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Meso Rate has been changed to " + sub[1] + "x."));
|
||||
break;
|
||||
|
||||
case "droprate":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !droprate <newrate>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
c.getWorldServer().setDropRate(Integer.parseInt(sub[1]));
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Drop Rate has been changed to " + sub[1] + "x."));
|
||||
break;
|
||||
|
||||
case "bossdroprate":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !bossdroprate <newrate>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
c.getWorldServer().setBossDropRate(Integer.parseInt(sub[1]));
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Boss Drop Rate has been changed to " + sub[1] + "x."));
|
||||
break;
|
||||
|
||||
case "itemvac":
|
||||
@@ -2006,18 +2059,21 @@ public class Commands {
|
||||
break;
|
||||
}
|
||||
|
||||
if (sub.length == 2) {
|
||||
player.setFace(Integer.parseInt(sub[1]));
|
||||
player.equipChanged();
|
||||
} else {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
if(victim == null) {
|
||||
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
|
||||
break;
|
||||
try {
|
||||
if (sub.length == 2) {
|
||||
player.setFace(Integer.parseInt(sub[1]));
|
||||
player.equipChanged();
|
||||
} else {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
if(victim == null) {
|
||||
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
|
||||
break;
|
||||
}
|
||||
victim.setFace(Integer.parseInt(sub[2]));
|
||||
victim.equipChanged();
|
||||
}
|
||||
victim.setFace(Integer.parseInt(sub[2]));
|
||||
victim.equipChanged();
|
||||
}
|
||||
} catch(Exception e) {}
|
||||
|
||||
break;
|
||||
|
||||
case "hair":
|
||||
@@ -2026,18 +2082,26 @@ public class Commands {
|
||||
break;
|
||||
}
|
||||
|
||||
if (sub.length == 2) {
|
||||
player.setHair(Integer.parseInt(sub[1]));
|
||||
player.equipChanged();
|
||||
} else {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
if(victim == null) {
|
||||
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
|
||||
break;
|
||||
try {
|
||||
if (sub.length == 2) {
|
||||
player.setHair(Integer.parseInt(sub[1]));
|
||||
player.equipChanged();
|
||||
|
||||
player.getMap().removePlayer(player);
|
||||
player.getMap().addPlayer(player);
|
||||
} else {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
if(victim == null) {
|
||||
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
|
||||
break;
|
||||
}
|
||||
victim.setHair(Integer.parseInt(sub[2]));
|
||||
victim.equipChanged();
|
||||
|
||||
victim.getMap().removePlayer(victim);
|
||||
victim.getMap().addPlayer(victim);
|
||||
}
|
||||
victim.setHair(Integer.parseInt(sub[2]));
|
||||
victim.equipChanged();
|
||||
}
|
||||
} catch(Exception e) {}
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -2231,36 +2295,6 @@ public class Commands {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
player.message(victim.getName() + "'s account name is " + victim.getClient().getAccountName() + ".");
|
||||
break;
|
||||
|
||||
case "npc":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !npc <npcid>");
|
||||
break;
|
||||
}
|
||||
MapleNPC npc = MapleLifeFactory.getNPC(Integer.parseInt(sub[1]));
|
||||
if (npc != null) {
|
||||
npc.setPosition(player.getPosition());
|
||||
npc.setCy(player.getPosition().y);
|
||||
npc.setRx0(player.getPosition().x + 50);
|
||||
npc.setRx1(player.getPosition().x - 50);
|
||||
npc.setFh(player.getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
|
||||
player.getMap().addMapObject(npc);
|
||||
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc));
|
||||
}
|
||||
break;
|
||||
|
||||
case "job":
|
||||
if (sub.length == 2) {
|
||||
player.changeJob(MapleJob.getById(Integer.parseInt(sub[1])));
|
||||
player.equipChanged();
|
||||
} else if (sub.length == 3) {
|
||||
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
|
||||
victim.changeJob(MapleJob.getById(Integer.parseInt(sub[2])));
|
||||
player.equipChanged();
|
||||
} else {
|
||||
player.message("Syntax: !job <job id> <opt: IGN of another person>");
|
||||
}
|
||||
break;
|
||||
|
||||
case "shutdown":
|
||||
case "shutdownnow":
|
||||
|
||||
@@ -26,8 +26,6 @@ import constants.ServerConstants;
|
||||
import constants.ExpTable;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import server.MapleItemInformationProvider;
|
||||
import tools.MaplePacketCreator;
|
||||
import tools.Pair;
|
||||
@@ -376,6 +374,7 @@ public class Equip extends Item {
|
||||
boolean gotVicious = false, gotSlot = false;
|
||||
|
||||
String lvupStr = "'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "' is now level " + itemLevel + "! ";
|
||||
String showStr = "#e'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "'#b is now #elevel #r" + itemLevel + "#k#b!";
|
||||
|
||||
Integer statUp, maxStat = ServerConstants.MAX_EQUIPMNT_STAT;
|
||||
for (Pair<StatUpgrade, Integer> stat : stats) {
|
||||
@@ -462,9 +461,17 @@ public class Equip extends Item {
|
||||
}
|
||||
}
|
||||
|
||||
if(gotVicious) {
|
||||
//c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
|
||||
lvupStr += "+VICIOUS ";
|
||||
}
|
||||
if(gotSlot) {
|
||||
//c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
|
||||
lvupStr += "+UPGSLOT ";
|
||||
}
|
||||
|
||||
showLevelupMessage(showStr, c); // thx to polaris devs !
|
||||
c.getPlayer().dropMessage(6, lvupStr);
|
||||
if(gotVicious) c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
|
||||
if(gotSlot) c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
|
||||
|
||||
c.announce(MaplePacketCreator.showEquipmentLevelUp());
|
||||
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignEffect(c.getPlayer().getId(), 15));
|
||||
@@ -476,11 +483,16 @@ public class Equip extends Item {
|
||||
}
|
||||
|
||||
private double normalizedMasteryExp(int reqLevel) {
|
||||
// Trivia: at equips requiring level 200, one gaining MAX INTEGER exp points will have their equip
|
||||
// exp gain normalized to roughly 5.752 points (1/3 of the needed to pass the equipment to lvl 2)!
|
||||
// Good thing there is not much lvl 140+ equipments in the game!
|
||||
// Conversion factor between mob exp and equip exp gain. Through many calculations, the expected for equipment levelup
|
||||
// from level 1 to 2 is killing about 100~200 mobs of the same level range, on a 1x EXP rate scenario.
|
||||
|
||||
return Math.max((2622.71 * Math.exp(reqLevel * 0.0733649)) - 6000.0, 15);
|
||||
if(reqLevel >= 78) {
|
||||
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * (10413.648 * Math.exp(reqLevel * 0.03275)), 15);
|
||||
} else if(reqLevel >= 38) {
|
||||
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * ( 4985.818 * Math.exp(reqLevel * 0.02007)), 15);
|
||||
} else {
|
||||
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * ( 248.219 * Math.exp(reqLevel * 0.11093)), 15);
|
||||
}
|
||||
}
|
||||
|
||||
public void gainItemExp(MapleClient c, int gain) { // Ronan's Equip Exp gain method
|
||||
@@ -497,7 +509,7 @@ public class Equip extends Item {
|
||||
itemExp += baseExpGain;
|
||||
int expNeeded = ExpTable.getEquipExpNeededForLevel(itemLevel);
|
||||
|
||||
if(ServerConstants.USE_DEBUG_SHOW_INFO_EQPEXP) System.out.println("'" + ii.getName(this.getItemId()) + "' -> EXP Gain: " + gain + " Mastery: " + masteryModifier + " Base gain: " + baseExpGain + " exp: " + itemExp + " / " + expNeeded);
|
||||
if(ServerConstants.USE_DEBUG_SHOW_INFO_EQPEXP) System.out.println("'" + ii.getName(this.getItemId()) + "' -> EXP Gain: " + gain + " Mastery: " + masteryModifier + " Base gain: " + baseExpGain + " exp: " + itemExp + " / " + expNeeded + ", Kills TNL: " + expNeeded / (baseExpGain / c.getPlayer().getExpRate()));
|
||||
|
||||
if (itemExp >= expNeeded) {
|
||||
while(itemExp >= expNeeded) {
|
||||
@@ -540,6 +552,11 @@ public class Equip extends Item {
|
||||
c.getPlayer().dropMessage(5, "'" + eqpName + "' -> Level: " + itemLevel + eqpInfo);
|
||||
}
|
||||
|
||||
public final void showLevelupMessage(String msg, MapleClient c) {
|
||||
c.announce(MaplePacketCreator.sendHint(msg, 500, 10));
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
}
|
||||
|
||||
public void setItemExp(int exp) {
|
||||
this.itemExp = exp;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ServerConstants {
|
||||
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_DEBUG = true; //Will enable some text prints on the client, oriented for debugging purposes.
|
||||
public static final boolean USE_DEBUG_SHOW_RCVD_PACKET = false; //Prints on the cmd all received packet ids.
|
||||
public static final boolean USE_DEBUG_SHOW_INFO_EQPEXP = false; //Prints on the cmd all equip exp gain info.
|
||||
public static final boolean USE_DEBUG_SHOW_INFO_EQPEXP = true; //Prints on the cmd all equip exp gain info.
|
||||
public static final boolean USE_MTS = false;
|
||||
public static final boolean USE_FAMILY_SYSTEM = false;
|
||||
public static final boolean USE_DUEY = true;
|
||||
@@ -49,7 +49,7 @@ public class ServerConstants {
|
||||
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_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 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.
|
||||
@@ -100,6 +100,7 @@ public class ServerConstants {
|
||||
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
|
||||
|
||||
@@ -47,7 +47,7 @@ public final class GeneralChatHandler extends net.AbstractMaplePacketHandler {
|
||||
return;
|
||||
}
|
||||
char heading = s.charAt(0);
|
||||
if (heading == '!' || heading == '@') { // client seems to not send command with '/' heading to the server, if not a GM account
|
||||
if (heading == '/' || heading == '!' || heading == '@') { // client seems to not send command with '/' heading to the server, if not a GM account
|
||||
String[] sp = s.split(" ");
|
||||
sp[0] = sp[0].toLowerCase().substring(1);
|
||||
|
||||
|
||||
@@ -47,11 +47,11 @@ public final class UseItemHandler extends AbstractMaplePacketHandler {
|
||||
int itemId = slea.readInt();
|
||||
Item toUse = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
|
||||
if (toUse != null && toUse.getQuantity() > 0 && toUse.getItemId() == itemId) {
|
||||
if (itemId == 2022178 || itemId == 2022433 || itemId == 2050004) {
|
||||
if (itemId == 2022178 || itemId == 2050004) {
|
||||
c.getPlayer().dispelDebuffs();
|
||||
remove(c, slot);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (itemId == 2050001) {
|
||||
c.getPlayer().dispelDebuff(MapleDisease.DARKNESS);
|
||||
remove(c, slot);
|
||||
|
||||
@@ -414,12 +414,10 @@ public class EventInstanceManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void changedMap(MapleCharacter chr, int mapId) {
|
||||
public void changedMap(MapleCharacter chr, int mapId) { // optional
|
||||
try {
|
||||
em.getIv().invokeFunction("changedMap", this, chr, mapId);
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} catch (ScriptException | NoSuchMethodException ex) {}
|
||||
}
|
||||
|
||||
public void changedLeader(MapleCharacter ldr) {
|
||||
|
||||
@@ -320,7 +320,7 @@ public class EventManager {
|
||||
}
|
||||
|
||||
public boolean startInstance(int lobbyId, MapleCharacter leader) {
|
||||
return startInstance(lobbyId, null, leader, 1);
|
||||
return startInstance(lobbyId, leader, leader, 1);
|
||||
}
|
||||
|
||||
public boolean startInstance(int lobbyId, MapleCharacter chr, MapleCharacter leader, int difficulty) {
|
||||
|
||||
@@ -119,7 +119,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
|
||||
} else {
|
||||
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
|
||||
}
|
||||
reactor.getMap().spawnItemDrop(reactor, getPlayer(), drop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), (byte)(getPlayer().getParty() != null ? 1 : 0), false);
|
||||
|
||||
reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short)d.questid);
|
||||
}
|
||||
dropPos.x += 25;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import client.inventory.ModifyInventory;
|
||||
import constants.ItemConstants;
|
||||
import constants.ServerConstants;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.util.ArrayList;
|
||||
@@ -549,12 +550,12 @@ public class MapleInventoryManipulator {
|
||||
if (weddingRing) {
|
||||
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
|
||||
} else if (c.getPlayer().getMap().getEverlast()) {
|
||||
if (ii.isDropRestricted(target.getItemId()) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
|
||||
if (ii.isDropRestricted(target.getItemId()) || ii.isCash(target.getItemId()) || isDroppedItemRestricted(target)) {
|
||||
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
|
||||
} else {
|
||||
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
|
||||
}
|
||||
} else if (ii.isDropRestricted(target.getItemId()) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
|
||||
} else if (ii.isDropRestricted(target.getItemId()) || ii.isCash(target.getItemId()) || isDroppedItemRestricted(target)) {
|
||||
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
|
||||
} else {
|
||||
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
|
||||
@@ -566,12 +567,12 @@ public class MapleInventoryManipulator {
|
||||
c.getPlayer().equipChanged();
|
||||
}
|
||||
if (c.getPlayer().getMap().getEverlast()) {
|
||||
if (ii.isDropRestricted(itemId) || ii.isCash(itemId)) {
|
||||
if (ii.isDropRestricted(itemId) || ii.isCash(itemId) || isDroppedItemRestricted(source)) {
|
||||
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
|
||||
} else {
|
||||
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
|
||||
}
|
||||
} else if (ii.isDropRestricted(itemId) || ii.isCash(itemId)) {
|
||||
} else if (ii.isDropRestricted(itemId) || ii.isCash(itemId) || isDroppedItemRestricted(source)) {
|
||||
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
|
||||
} else {
|
||||
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
|
||||
@@ -579,6 +580,10 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isDroppedItemRestricted(Item it) {
|
||||
return ServerConstants.USE_ERASE_UNTRADEABLE_DROP && ((it.getFlag() & ItemConstants.UNTRADEABLE) == ItemConstants.UNTRADEABLE);
|
||||
}
|
||||
|
||||
private static boolean isOverall(int itemId) {
|
||||
return itemId / 10000 == 105;
|
||||
}
|
||||
|
||||
@@ -1312,6 +1312,14 @@ public class MapleItemInformationProvider {
|
||||
int itemType = itemId / 1000;
|
||||
return itemType == 5211 || itemType == 5360;
|
||||
}
|
||||
|
||||
public boolean isPartyItem(int itemId) {
|
||||
return itemId >= 2022430 && itemId <= 2022433;
|
||||
}
|
||||
|
||||
public boolean isPartyAllcure(int itemId) {
|
||||
return itemId == 2022433;
|
||||
}
|
||||
|
||||
public Collection<Item> canWearEquipment(MapleCharacter chr, Collection<Item> items) {
|
||||
MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED);
|
||||
|
||||
@@ -228,10 +228,10 @@ public class MapleStatEffect {
|
||||
addBuffStatPairToListIfNotZero(statups, MapleBuffStat.BOOSTER, Integer.valueOf(ret.booster));
|
||||
|
||||
if(!skill) {
|
||||
if(isDojoBuff(sourceid)) {
|
||||
if(isDojoBuff(sourceid) || sourceid == 2022337) {
|
||||
ret.mhpR = (byte) MapleDataTool.getInt("mhpR", source, 0);
|
||||
ret.mhpRRate = (short) (MapleDataTool.getInt("mhpRRate", source, 0) * 100);
|
||||
ret.mmpR = (byte) MapleDataTool.getInt("mmpRRate", source, 0);
|
||||
ret.mmpR = (byte) MapleDataTool.getInt("mmpR", source, 0);
|
||||
ret.mmpRRate = (short) (MapleDataTool.getInt("mmpRRate", source, 0) * 100);
|
||||
|
||||
addBuffStatPairToListIfNotZero(statups, MapleBuffStat.HPREC, Integer.valueOf(ret.mhpR));
|
||||
|
||||
@@ -77,7 +77,11 @@ public class MapleDoor {
|
||||
try {
|
||||
return town.getAvailableDoorPortals().get(slot);
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
return town.getAvailableDoorPortals().get(0);
|
||||
try {
|
||||
return town.getAvailableDoorPortals().get(0);
|
||||
} catch (IndexOutOfBoundsException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -560,6 +560,10 @@ public class MapleMap {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void dropFromReactor(final MapleCharacter chr, final MapleReactor reactor, Item drop, Point dropPos, short questid) {
|
||||
spawnDrop(drop, this.calcDropPos(dropPos, reactor.getPosition()), reactor, chr, (byte)(chr.getParty() != null ? 1 : 0), questid);
|
||||
}
|
||||
|
||||
private void stopItemMonitor() {
|
||||
chrWLock.lock();
|
||||
@@ -653,14 +657,14 @@ public class MapleMap {
|
||||
droppedItemCount.decrementAndGet();
|
||||
}
|
||||
|
||||
private void spawnDrop(final Item idrop, final Point dropPos, final MapleMonster mob, final MapleCharacter chr, final byte droptype, final short questid) {
|
||||
final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, mob, chr, droptype, false, questid);
|
||||
private void spawnDrop(final Item idrop, final Point dropPos, final MapleMapObject dropper, final MapleCharacter chr, final byte droptype, final short questid) {
|
||||
final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, dropper, chr, droptype, false, questid);
|
||||
mdrop.setDropTime(System.currentTimeMillis());
|
||||
spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {
|
||||
@Override
|
||||
public void sendPackets(MapleClient c) {
|
||||
if (questid <= 0 || (c.getPlayer().getQuestStatus(questid) == 1 && c.getPlayer().needQuestItem(questid, idrop.getItemId()))) {
|
||||
c.announce(MaplePacketCreator.dropItemFromMapObject(mdrop, mob.getPosition(), dropPos, (byte) 1));
|
||||
c.announce(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getPosition(), dropPos, (byte) 1));
|
||||
}
|
||||
}
|
||||
}, null);
|
||||
@@ -2591,37 +2595,39 @@ public class MapleMap {
|
||||
public void run() {
|
||||
reactor.lockReactor();
|
||||
try {
|
||||
if (reactor.getShouldCollect() == true && mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) {
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
TimerManager tMan = TimerManager.getInstance();
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
if(reactor.getReactorType() == 100) {
|
||||
if (reactor.getShouldCollect() == true && mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) {
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
TimerManager tMan = TimerManager.getInstance();
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
|
||||
reactor.setShouldCollect(false);
|
||||
MapleMap.this.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem.getPosition());
|
||||
MapleMap.this.removeMapObject(mapitem);
|
||||
reactor.hitReactor(c);
|
||||
reactor.setShouldCollect(false);
|
||||
MapleMap.this.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem.getPosition());
|
||||
MapleMap.this.removeMapObject(mapitem);
|
||||
reactor.hitReactor(c);
|
||||
|
||||
if (reactor.getDelay() > 0) {
|
||||
tMan.schedule(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
reactor.lockReactor();
|
||||
try {
|
||||
reactor.setState((byte) 0);
|
||||
reactor.resetReactorActions();
|
||||
if (reactor.getDelay() > 0) {
|
||||
tMan.schedule(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
reactor.lockReactor();
|
||||
try {
|
||||
reactor.setState((byte) 0);
|
||||
reactor.resetReactorActions();
|
||||
|
||||
broadcastMessage(MaplePacketCreator.triggerReactor(reactor, 0));
|
||||
} finally {
|
||||
reactor.unlockReactor();
|
||||
broadcastMessage(MaplePacketCreator.triggerReactor(reactor, 0));
|
||||
} finally {
|
||||
reactor.unlockReactor();
|
||||
}
|
||||
}
|
||||
}
|
||||
}, reactor.getDelay());
|
||||
}, reactor.getDelay());
|
||||
}
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
}
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
|
||||
@@ -271,6 +271,8 @@ public class MapleMapFactory {
|
||||
|
||||
private AbstractLoadedMapleLife loadLife(MapleData life, String id, String type) {
|
||||
AbstractLoadedMapleLife myLife = MapleLifeFactory.getLife(Integer.parseInt(id), type);
|
||||
if(life == null) System.out.println("lf null");
|
||||
if(myLife == null) System.out.println("mlf null");
|
||||
myLife.setCy(MapleDataTool.getInt(life.getChildByPath("cy")));
|
||||
MapleData dF = life.getChildByPath("f");
|
||||
if (dF != null) {
|
||||
@@ -293,11 +295,10 @@ public class MapleMapFactory {
|
||||
MapleReactor myReactor = new MapleReactor(MapleReactorFactory.getReactor(Integer.parseInt(id)), Integer.parseInt(id));
|
||||
int x = MapleDataTool.getInt(reactor.getChildByPath("x"));
|
||||
int y = MapleDataTool.getInt(reactor.getChildByPath("y"));
|
||||
myReactor.setName(MapleDataTool.getString(reactor.getChildByPath("name"), ""));
|
||||
myReactor.setPosition(new Point(x, y));
|
||||
myReactor.setDelay(MapleDataTool.getInt(reactor.getChildByPath("reactorTime")) * 1000);
|
||||
myReactor.setState((byte) 0);
|
||||
|
||||
myReactor.setName(MapleDataTool.getString(reactor.getChildByPath("name"), ""));
|
||||
myReactor.resetReactorActions();
|
||||
return myReactor;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user