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:
ronancpl
2017-08-16 14:06:59 -03:00
parent e0a27e00ab
commit c8e36c10e7
129 changed files with 744 additions and 448 deletions

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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":

View File

@@ -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;
}