Equipment Level-up

Added mechanics to permit equipment level-up for every equipment in the
game. Added a new EXP table for equipments.
This commit is contained in:
ronancpl
2017-06-01 00:50:07 -03:00
parent f30acb3b8a
commit a6ac40a351
49 changed files with 167 additions and 55 deletions

View File

@@ -150,10 +150,6 @@ import scripting.item.ItemScriptManager;
import server.maps.MapleMapItem;
public class MapleCharacter extends AbstractAnimatedMapleMapObject {
private static final int[] DROP_RATE_GAIN = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
private static final int[] MESO_RATE_GAIN = {1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66};
private static final int[] EXP_RATE_GAIN = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}; //fibonacci :3
private static final String LEVEL_200 = "[Congrats] %s has reached Level 200! Congratulate %s on such an amazing achievement!";
// MapleStory default keyset
@@ -3383,15 +3379,15 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public void setPlayerRates() {
this.expRate *= EXP_RATE_GAIN[this.level / 20];
this.mesoRate *= MESO_RATE_GAIN[this.level / 20];
this.dropRate *= DROP_RATE_GAIN[this.level / 20];
this.expRate *= GameConstants.getPlayerBonusExpRate(this.level / 20);
this.mesoRate *= GameConstants.getPlayerBonusMesoRate(this.level / 20);
this.dropRate *= GameConstants.getPlayerBonusDropRate(this.level / 20);
}
public void revertPlayerRates() {
this.expRate /= EXP_RATE_GAIN[(this.level - 1) / 20];
this.mesoRate /= MESO_RATE_GAIN[(this.level - 1) / 20];
this.dropRate /= DROP_RATE_GAIN[(this.level - 1) / 20];
this.expRate /= GameConstants.getPlayerBonusExpRate((this.level - 1) / 20);
this.mesoRate /= GameConstants.getPlayerBonusMesoRate((this.level - 1) / 20);
this.dropRate /= GameConstants.getPlayerBonusDropRate((this.level - 1) / 20);
}
public void revertWorldRates() {
@@ -3945,7 +3941,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
}
} catch (Exception e) {
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, e, "MapleCharacter.mobKilled. CID: " + this.id + " last Quest Processed: " + lastQuestProcessed);
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, e, "MapleCharacter.mobKilled. CID: " + this.id + " last Quest Processed: " + lastQuestProcessed);
}
}
@@ -5964,7 +5960,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
pendantExp = 0;
}
public void increaseEquipExp(int mobexp) {
public void increaseEquipExp(int expGain) {
if(expGain < 0) expGain = Integer.MAX_VALUE;
MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance();
for (Item item : getInventory(MapleInventoryType.EQUIPPED).list()) {
Equip nEquip = (Equip) item;
@@ -5973,8 +5971,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
continue;
}
if ((nEquip.getItemLevel() < ServerConstants.USE_EQUIPMNT_LVLUP) && (itemName.contains("Reverse") && nEquip.getItemLevel() < 4) || itemName.contains("Timeless") && nEquip.getItemLevel() < 6) {
nEquip.gainItemExp(client, mobexp, itemName.contains("Reverse"));
if ((nEquip.getItemLevel() < ServerConstants.USE_EQUIPMNT_LVLUP) || (itemName.contains("Reverse") && nEquip.getItemLevel() < 4) || (itemName.contains("Timeless") && nEquip.getItemLevel() < 6)) {
nEquip.gainItemExp(client, expGain);
}
}
}

View File

@@ -103,7 +103,7 @@ public class MapleMount {
if (tiredness > 99) {
this.tiredness = 99;
owner.dispelSkill(owner.getJobType() * 10000000 + 1004);
owner.dropMessage("Your mount grew tired! Treat it some revitalizer before riding it again!");
owner.dropMessage(6, "Your mount grew tired! Treat it some revitalizer before riding it again!");
}
} else {
if(this.tirednessSchedule != null) {

View File

@@ -648,28 +648,28 @@ public class Commands {
//debug only
case "debugpos":
if(ServerConstants.USE_DEBUG) {
player.dropMessage("Current map position: (" + player.getPosition().getX() + ", " + player.getPosition().getY() + ").");
player.dropMessage(6, "Current map position: (" + player.getPosition().getX() + ", " + player.getPosition().getY() + ").");
}
break;
case "debugmap":
if(ServerConstants.USE_DEBUG) {
player.dropMessage("Current map id " + player.getMap().getId() + ", event: '" + ((player.getMap().getEventInstance() != null) ? player.getMap().getEventInstance().getName() : "null") + "'; Players: " + player.getMap().getAllPlayers().size() + ", Mobs: " + player.getMap().countMonsters() + ", Reactors: " + player.getMap().countReactors() + ".");
player.dropMessage(6, "Current map id " + player.getMap().getId() + ", event: '" + ((player.getMap().getEventInstance() != null) ? player.getMap().getEventInstance().getName() : "null") + "'; Players: " + player.getMap().getAllPlayers().size() + ", Mobs: " + player.getMap().countMonsters() + ", Reactors: " + player.getMap().countReactors() + ".");
}
break;
case "debugevent":
if(ServerConstants.USE_DEBUG) {
if(player.getEventInstance() == null) player.dropMessage("Player currently not in an event.");
else player.dropMessage("Current event name: " + player.getEventInstance().getName() + ".");
if(player.getEventInstance() == null) player.dropMessage(6, "Player currently not in an event.");
else player.dropMessage(6, "Current event name: " + player.getEventInstance().getName() + ".");
}
break;
case "debugreactors":
if(ServerConstants.USE_DEBUG) {
player.dropMessage("Current reactor states on map " + player.getMapId() + ":");
player.dropMessage(6, "Current reactor states on map " + player.getMapId() + ":");
for(Pair p: player.getMap().reportReactorStates()) {
player.dropMessage("Reactor id: " + p.getLeft() + " -> State: " + p.getRight() + ".");
player.dropMessage(6, "Reactor id: " + p.getLeft() + " -> State: " + p.getRight() + ".");
}
}
break;
@@ -682,7 +682,7 @@ public class Commands {
s += (i + " ");
}
player.dropMessage(s);
player.dropMessage(6, s);
}
break;
@@ -693,7 +693,7 @@ public class Commands {
s += (i + " ");
}
player.dropMessage(s);
player.dropMessage(6, s);
}
break;

View File

@@ -22,11 +22,14 @@
package client.inventory;
import client.MapleClient;
import constants.ServerConstants;
import constants.ExpTable;
import java.util.LinkedList;
import java.util.List;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.Randomizer;
public class Equip extends Item {
@@ -49,11 +52,10 @@ public class Equip extends Item {
private float itemExp;
private int ringid = -1;
private boolean wear = false;
private boolean isElemental = false; // timeless or reverse
public Equip(int id, short position) {
super(id, position, (short) 1);
this.itemExp = 0;
this.itemLevel = 1;
this(id, position, 0);
}
public Equip(int id, short position, int slots) {
@@ -61,6 +63,9 @@ public class Equip extends Item {
this.upgradeSlots = (byte) slots;
this.itemExp = 0;
this.itemLevel = 1;
String itemName = MapleItemInformationProvider.getInstance().getName(id);
if(itemName != null) this.isElemental = (itemName.contains("Timeless") || itemName.contains("Reverse"));
}
@Override
@@ -254,8 +259,59 @@ public class Equip extends Item {
this.level = level;
}
public void gainLevel(MapleClient c, boolean timeless) {
List<Pair<String, Integer>> stats = MapleItemInformationProvider.getInstance().getItemLevelupStats(getItemId(), itemLevel, timeless);
private int getStatModifier(boolean isAttribute) {
if(ServerConstants.USE_EQUIPMNT_LVLUP_POWER) {
if(isAttribute) return 2;
else return 4;
}
else {
if(isAttribute) return 4;
else return 16;
}
}
private void getUnitStatUpgrade(List<Pair<String, Integer>> stats, String name, int curStat, boolean isAttribute) {
int maxUpgrade = Randomizer.rand(0, 1 + (curStat / getStatModifier(isAttribute)));
if(maxUpgrade == 0) return;
stats.add(new Pair<>(name, maxUpgrade)); // each 4 stat point grants a bonus stat upgrade on equip level up.
}
private void getUnitSlotUpgrade(List<Pair<String, Integer>> stats, String name) {
if(Math.random() < 0.1) {
stats.add(new Pair<>(name, 1)); // 10% success on getting a slot upgrade.
}
}
private void improveDefaultStats(List<Pair<String, Integer>> stats) {
if(dex > 0) getUnitStatUpgrade(stats, "incDEX", dex, true);
if(str > 0) getUnitStatUpgrade(stats, "incSTR", str, true);
if(_int > 0) getUnitStatUpgrade(stats, "incINT",_int, true);
if(luk > 0) getUnitStatUpgrade(stats, "incLUK", luk, true);
if(hp > 0) getUnitStatUpgrade(stats, "incMHP", hp, false);
if(mp > 0) getUnitStatUpgrade(stats, "incMMP", mp, false);
if(watk > 0) getUnitStatUpgrade(stats, "incPAD", watk, false);
if(matk > 0) getUnitStatUpgrade(stats, "incMAD", matk, false);
if(wdef > 0) getUnitStatUpgrade(stats, "incPDD", wdef, false);
if(mdef > 0) getUnitStatUpgrade(stats, "incMDD", mdef, false);
if(avoid > 0) getUnitStatUpgrade(stats, "incEVA", avoid, false);
if(acc > 0) getUnitStatUpgrade(stats, "incACC", acc, false);
if(speed > 0) getUnitStatUpgrade(stats, "incSpeed", speed, false);
if(jump > 0) getUnitStatUpgrade(stats, "incJump", jump, false);
}
public void gainLevel(MapleClient c) {
List<Pair<String, Integer>> stats = MapleItemInformationProvider.getInstance().getItemLevelupStats(getItemId(), itemLevel);
if(stats.isEmpty()) improveDefaultStats(stats);
if(ServerConstants.USE_EQUIPMNT_LVLUP_SLOTS) {
getUnitSlotUpgrade(stats, "incVicious");
getUnitSlotUpgrade(stats, "incSlot");
}
itemLevel++;
if(ServerConstants.USE_DEBUG) c.getPlayer().dropMessage(6, "'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "' has LEVELED UP to level " + itemLevel + "!");
for (Pair<String, Integer> stat : stats) {
switch (stat.getLeft()) {
case "incDEX":
@@ -300,9 +356,22 @@ public class Equip extends Item {
case "incJump":
jump += stat.getRight();
break;
case "incVicious":
if(vicious > 0) {
vicious -= stat.getRight();
if(vicious < 0) vicious = 0;
c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
}
break;
case "incSlot":
upgradeSlots += stat.getRight();
c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
break;
}
}
this.itemLevel++;
c.announce(MaplePacketCreator.showEquipmentLevelUp());
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignEffect(c.getPlayer().getId(), 15));
c.getPlayer().forceUpdateItem(this);
@@ -311,17 +380,41 @@ public class Equip extends Item {
public int getItemExp() {
return (int) itemExp;
}
private double normalizedMasteryExp(int reqLevel) {
return Math.max((2622.71 * Math.exp(reqLevel * 0.0533649)) - 6000.0, 15);
}
public void gainItemExp(MapleClient c, int gain) { // Ronan's Equip Exp gain method
if(itemLevel >= 30) return;
int reqLevel = MapleItemInformationProvider.getInstance().getEquipStats(this.getItemId()).get("reqLevel");
float masteryModifier = (float)ExpTable.getExpNeededForLevel(1) / (float)normalizedMasteryExp(reqLevel);
float elementModifier = (isElemental) ? 1.2f : 1.0f;
float baseExpGain = gain * elementModifier * masteryModifier;
itemExp += baseExpGain;
int expNeeded = ExpTable.getEquipExpNeededForLevel(itemLevel);
//System.out.println("Gain: " + gain + " Mastery: " + masteryModifier + "Base gain: " + baseExpGain + " item current exp: " + itemExp + " / " + expNeeded);
if (itemExp >= expNeeded) {
while(itemExp >= expNeeded) {
itemExp = (itemExp - expNeeded);
gainLevel(c);
public void gainItemExp(MapleClient c, int gain, boolean reverse) {
int expneeded = !reverse ? (10 * itemLevel + 70) : (5 * itemLevel + 65);
float modifier = 364 / expneeded;
float exp = (expneeded / (1000000 * modifier * modifier)) * gain;
itemExp += exp;
if (itemExp >= 364) {
itemExp = (itemExp - 364);
gainLevel(c, !reverse);
if(itemLevel == ServerConstants.USE_EQUIPMNT_LVLUP) {
itemExp = 0.0f;
break;
}
expNeeded = ExpTable.getEquipExpNeededForLevel(itemLevel);
}
} else {
c.getPlayer().forceUpdateItem(this);
//if(ServerConstants.USE_DEBUG) c.getPlayer().dropMessage("'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "': " + itemExp + " / " + expNeeded);
}
}