package client; import client.inventory.Item; import gui.tw.BlConfig; import tools.data.MaplePacketLittleEndianWriter; import client.inventory.MapleWeaponType; import client.inventory.ModifyInventory; import server.MapleInventoryManipulator; import tools.MaplePacketCreator; import java.util.*; import server.MapleStatEffect; import server.StructSetItem; import server.StructSetItem.SetItem; import java.util.Map.Entry; import server.StructPotentialItem; import tools.Pair; import gui.Start; import client.inventory.IEquip; import client.inventory.IItem; import client.inventory.MapleInventoryType; import constants.GameConstants; import server.MapleItemInformationProvider; import java.util.concurrent.locks.ReentrantLock; import client.inventory.Equip; import java.lang.ref.WeakReference; import java.io.Serializable; public class PlayerStats implements Serializable { private static final long serialVersionUID = -679541993413738569L; private final transient WeakReference chr; private final Map setHandling; private final List durabilityHandling; private final List equipLevelHandling; private transient float shouldHealHP; private transient float shouldHealMP; public short str; public short dex; public short luk; public short int_; public short hp; public short maxhp; public short mp; public short maxmp; private transient short passive_sharpeye_percent; private transient short localmaxhp; private transient short localmaxmp; private transient byte passive_mastery; private transient byte passive_sharpeye_rate; private transient int localstr; private transient int localdex; private transient int localluk; private transient int localint_; private transient int magic; private transient int watk; private transient int hands; private transient int accuracy; public transient boolean equippedWelcomeBackRing; public transient boolean equippedFairy; public transient boolean hasMeso; public transient boolean hasItem; public transient boolean hasVac; public transient boolean hasClone; public transient boolean hasPartyBonus; public transient boolean Berserk; public transient boolean isRecalc; public transient boolean equippedRing; public transient int equipmentBonusExp; public transient int expMod; public transient int dropMod; public transient int cashMod; public transient int bs; public transient int levelBonus; public transient double expBuff; public transient double dropBuff; public transient double mesoBuff; public transient double cashBuff; public transient double realExpBuff; public transient double realDropBuff; public transient double realMesoBuff; public transient double realCashBuff; public transient double dam_r; public transient double bossdam_r; public transient double dropm; public transient double expm; public transient int recoverHP; public transient int recoverMP; public transient int mpconReduce; public transient int incMesoProp; public transient int incRewardProp; public transient int DAMreflect; public transient int DAMreflect_rate; public transient int mpRestore; public transient int hpRecover; public transient int hpRecoverProp; public transient int mpRecover; public transient int mpRecoverProp; public transient int RecoveryUP; public transient int incAllskill; private transient float speedMod; private transient float jumpMod; private transient float localmaxbasedamage; public transient int def; public transient int element_ice; public transient int element_fire; public transient int element_light; public transient int element_psn; public static final short maxStr = 999; public ReentrantLock lock; public short pickRate; public int defRange; public transient int dotTime; public transient int harvestingTool; public PlayerStats(final MapleCharacter chr) { this.equipLevelHandling = (List) new ArrayList(); this.Berserk = false; this.isRecalc = false; this.lock = new ReentrantLock(); this.setHandling = (Map) new HashMap(); this.durabilityHandling = (List) new ArrayList(); this.chr = new WeakReference(chr); } public final void init() { this.recalcLocalStats(); this.relocHeal(); } public final short getStr() { return this.str; } public final short getDex() { return this.dex; } public final short getLuk() { return this.luk; } public final short getInt() { return this.int_; } public final void setStr(final short str) { this.str = str; this.recalcLocalStats(); } public final void setDex(final short dex) { this.dex = dex; this.recalcLocalStats(); } public final void setLuk(final short luk) { this.luk = luk; this.recalcLocalStats(); } public final void setInt(final short int_) { this.int_ = int_; this.recalcLocalStats(); } public final boolean setHp(final int newhp) { return this.setHp(newhp, false); } public final boolean setHp(final int newhp, final boolean silent) { final short oldHp = this.hp; int thp = newhp; if (thp < 0) { thp = 0; } if (thp > this.localmaxhp) { thp = this.localmaxhp; } this.hp = (short) thp; final MapleCharacter chra = (MapleCharacter) this.chr.get(); if (chra != null) { if (!silent) { chra.updatePartyMemberHP(); } if (oldHp > this.hp && !chra.isAlive()) { chra.playerDead(); } } return this.hp != oldHp; } public final boolean setMp(final int newmp) { final short oldMp = this.mp; int tmp = newmp; if (tmp < 0) { tmp = 0; } if (tmp > this.localmaxmp) { tmp = this.localmaxmp; } this.mp = (short) tmp; return this.mp != oldMp; } public final void setMaxHp(final short hp) { this.maxhp = hp; this.recalcLocalStats(); } public final void setMaxMp(final short mp) { this.maxmp = mp; this.recalcLocalStats(); } public final short getHp() { return this.hp; } public final short getMaxHp() { return this.maxhp; } public final short getMp() { return this.mp; } public final short getMaxMp() { return this.maxmp; } public final int getTotalDex() { return this.localdex; } public final int getTotalInt() { return this.localint_; } public final int getTotalStr() { return this.localstr; } public final int getTotalLuk() { return this.localluk; } public final int getTotalMagic() { return this.magic; } public final double getSpeedMod() { return (double) this.speedMod; } public final double getJumpMod() { return (double) this.jumpMod; } public final int getTotalWatk() { return this.watk; } public final short getCurrentMaxHp() { return this.localmaxhp; } public final short getCurrentMaxMp() { return this.localmaxmp; } public final int getHands() { return this.hands; } public final float getCurrentMaxBaseDamage() { return this.localmaxbasedamage; } public void recalcLocalStats() { this.recalcLocalStats(false); } public void recalcLocalStats(final boolean first_login) { final MapleCharacter chra = (MapleCharacter) this.chr.get(); if (chra == null) { return; } if (this.isRecalc) { return; } this.isRecalc = true; final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final int oldmaxhp = this.localmaxhp; int localmaxhp_ = this.getMaxHp(); int localmaxmp_ = this.getMaxMp(); this.localdex = this.getDex(); this.localint_ = this.getInt(); this.localstr = this.getStr(); this.localluk = this.getLuk(); int speed = 100; int jump = 100; this.dotTime = 0; int percent_hp = 0; int percent_mp = 0; int percent_str = 0; int percent_dex = 0; int percent_int = 0; int percent_luk = 0; int percent_acc = 0; int percent_atk = 0; int percent_matk = 0; int added_sharpeye_rate = 0; int added_sharpeye_dmg = 0; this.magic = this.localint_; this.watk = 0; if (chra.getJob() == 500 || (chra.getJob() >= 520 && chra.getJob() <= 522)) { this.watk = 20; } else if (chra.getJob() == 400 || (chra.getJob() >= 410 && chra.getJob() <= 412) || (chra.getJob() >= 1400 && chra.getJob() <= 1412)) { this.watk = 30; } this.dam_r = 100.0; this.bossdam_r = 100.0; this.realExpBuff = 100.0; this.realCashBuff = 100.0; this.realDropBuff = 100.0; this.realMesoBuff = 100.0; this.expBuff = 100.0; this.cashBuff = 100.0; this.dropBuff = 100.0; this.mesoBuff = 100.0; this.recoverHP = 0; this.recoverMP = 0; this.mpconReduce = 0; this.incMesoProp = 0; this.incRewardProp = 0; this.DAMreflect = 0; this.DAMreflect_rate = 0; this.hpRecover = 0; this.hpRecoverProp = 0; this.mpRecover = 0; this.mpRecoverProp = 0; this.mpRestore = 0; this.equippedWelcomeBackRing = false; this.equippedRing = false; this.equippedFairy = false; this.hasMeso = false; this.hasItem = false; this.hasPartyBonus = false; this.hasVac = false; this.hasClone = false; final boolean canEquipLevel = chra.getLevel() >= 120 && !GameConstants.isKOC((int) chra.getJob()); this.equipmentBonusExp = 0; this.RecoveryUP = 0; this.dropMod = 1; this.dropm = 1.0; this.expMod = 1; this.expm = 1.0; this.cashMod = 1; this.levelBonus = 0; this.incAllskill = 0; this.durabilityHandling.clear(); this.equipLevelHandling.clear(); this.setHandling.clear(); this.element_fire = 100; this.element_ice = 100; this.element_light = 100; this.element_psn = 100; this.def = 100; this.defRange = 0; for (final IItem item : chra.getInventory(MapleInventoryType.EQUIPPED)) { final IEquip equip = (IEquip) item; if (equip.getPosition() == -11 && GameConstants.isMagicWeapon(equip.getItemId())) { final Map eqstat = MapleItemInformationProvider.getInstance().getEquipStats(equip.getItemId()); this.element_fire = ((Integer) eqstat.get("incRMAF")).intValue(); this.element_ice = ((Integer) eqstat.get("incRMAI")).intValue(); this.element_light = ((Integer) eqstat.get("incRMAL")).intValue(); this.element_psn = ((Integer) eqstat.get("incRMAS")).intValue(); this.def = ((Integer) eqstat.get("elemDefault")).intValue(); } this.accuracy += equip.getAcc(); localmaxhp_ += equip.getHp(); localmaxmp_ += equip.getMp(); this.localdex += equip.getDex(); this.localint_ += equip.getInt(); this.localstr += equip.getStr(); this.localluk += equip.getLuk(); this.magic += equip.getMatk() + equip.getInt(); this.watk += equip.getWatk(); speed += equip.getSpeed(); jump += equip.getJump(); switch (equip.getItemId()) { case 1112427: { added_sharpeye_rate += 5; added_sharpeye_dmg += 20; break; } case 1112428: { added_sharpeye_rate += 10; added_sharpeye_dmg += 10; break; } case 1112429: { added_sharpeye_rate += 5; added_sharpeye_dmg += 20; break; } case 1112127: { this.equippedWelcomeBackRing = true; break; } case 1114000: { this.equippedRing = true; break; } case 1122017: case 1122086: case 1122207: case 1122215: { this.equippedFairy = true; break; } case 1812000: { this.hasMeso = true; break; } case 1812001: { this.hasItem = true; break; } default: { for (int a = 0; a < Start.经验加成表.size(); ++a) { final int eb_bonus = Integer.parseInt((String) (Start.经验加成表.get(a)).getLeft()); if (equip.getItemId() == eb_bonus) { this.equipmentBonusExp += GameConstants.Equipment_Bonus_EXP(eb_bonus); } } break; } } percent_hp += equip.getHpR(); percent_mp += equip.getMpR(); final int set = ii.getSetItemID(equip.getItemId()); if (set > 0) { int value = 1; if (this.setHandling.get(Integer.valueOf(set)) != null) { value += ((Integer) this.setHandling.get(Integer.valueOf(set))).intValue(); } this.setHandling.put(Integer.valueOf(set), Integer.valueOf(value)); } if (equip.getState() > 1) { final int[] array; final int[] potentials = array = new int[]{equip.getPotential1(), equip.getPotential2(), equip.getPotential3()}; for (final int i : array) { if (i > 0) { final StructPotentialItem pot = (StructPotentialItem) ii.getPotentialInfo(i).get(ii.getReqLevel(equip.getItemId()) / 10); if (pot != null) { this.localstr += pot.incSTR; this.localdex += pot.incDEX; this.localint_ += pot.incINT; this.localluk += pot.incLUK; this.localmaxhp += pot.incMHP; this.localmaxmp += pot.incMMP; this.watk += pot.incPAD; this.magic += pot.incINT + pot.incMAD; speed += pot.incSpeed; jump += pot.incJump; this.accuracy += pot.incACC; this.incAllskill += pot.incAllskill; percent_hp += pot.incMHPr; percent_mp += pot.incMMPr; percent_str += pot.incSTRr; percent_dex += pot.incDEXr; percent_int += pot.incINTr; percent_luk += pot.incLUKr; percent_acc += pot.incACCr; percent_atk += pot.incPADr; percent_matk += pot.incMADr; added_sharpeye_rate += pot.incCr; added_sharpeye_dmg += pot.incCr; if (!pot.boss) { this.dam_r = Math.max((double) pot.incDAMr, this.dam_r); } else { this.bossdam_r = Math.max((double) pot.incDAMr, this.bossdam_r); } this.recoverHP += pot.RecoveryHP; this.recoverMP += pot.RecoveryMP; this.RecoveryUP += pot.RecoveryUP; if (pot.HP > 0) { this.hpRecover += pot.HP; this.hpRecoverProp += pot.prop; } if (pot.MP > 0) { this.mpRecover += pot.MP; this.mpRecoverProp += pot.prop; } this.mpconReduce += pot.mpconReduce; this.incMesoProp += pot.incMesoProp; this.incRewardProp += pot.incRewardProp; if (pot.DAMreflect > 0) { this.DAMreflect += pot.DAMreflect; this.DAMreflect_rate += pot.prop; } this.mpRestore += pot.mpRestore; if (!first_login && pot.skillID > 0) { chra.changeSkillLevel_Skip(SkillFactory.getSkill(this.getSkillByJob((int) pot.skillID, (int) chra.getJob())), (byte) 1, (byte) 1); } } } } } if (equip.getDurability() > 0) { this.durabilityHandling.add((Equip) equip); } if (canEquipLevel && GameConstants.getMaxLevel(equip.getItemId()) > 0) { if (GameConstants.getStatFromWeapon(equip.getItemId()) == null) { if (equip.getEquipLevel() > GameConstants.getMaxLevel(equip.getItemId())) { continue; } } else if (equip.getEquipLevel() >= GameConstants.getMaxLevel(equip.getItemId())) { continue; } this.equipLevelHandling.add((Equip) equip); } } for (final Entry entry : this.setHandling.entrySet()) { final StructSetItem set2 = ii.getSetItem(((Integer) entry.getKey()).intValue()); if (set2 != null) { final Map itemz = set2.getItems(); for (final Entry ent : itemz.entrySet()) { if (((Integer) ent.getKey()).intValue() <= ((Integer) entry.getValue()).intValue()) { final SetItem se = (SetItem) ent.getValue(); this.localstr += se.incSTR; this.localdex += se.incDEX; this.localint_ += se.incINT; this.localluk += se.incLUK; this.watk += se.incPAD; this.magic += se.incINT + se.incMAD; speed += se.incSpeed; this.accuracy += se.incACC; localmaxhp_ += se.incMHP; localmaxmp_ += se.incMMP; } } } } final int hour = Calendar.getInstance().get(11); final int weekDay = Calendar.getInstance().get(7); if (chra.getMarriageId() > 0) { this.expm = 1.1; this.dropm = 1.1; } this.expMod = 1; this.dropMod = 1; for (final IItem item2 : chra.getInventory(MapleInventoryType.CASH)) { if (this.expMod < 3 && (item2.getItemId() == 5211060 || item2.getItemId() == 5211050 || item2.getItemId() == 5211051 || item2.getItemId() == 5211052 || item2.getItemId() == 5211053 || item2.getItemId() == 5211054)) { this.expMod = 3; } else if (this.expMod < 2 && (item2.getItemId() == 5211061 || item2.getItemId() == 5211000 || item2.getItemId() == 5211001 || item2.getItemId() == 5211002 || item2.getItemId() == 5211003 || item2.getItemId() == 5211046 || item2.getItemId() == 5211047 || item2.getItemId() == 5211048 || item2.getItemId() == 5211049)) { this.expMod = 2; } else if (this.expMod < 2 && (item2.getItemId() == 5210002 || item2.getItemId() == 5210003) && ((hour >= 6 && hour <= 18 && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { this.expMod = 2; } else if (this.expMod < 2 && (item2.getItemId() == 5210004 || item2.getItemId() == 5210005 || item2.getItemId() == 521000) && (((hour >= 18 || hour <= 6) && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { this.expMod = 2; } else if (this.expMod < 2 && (item2.getItemId() == 5210000 || item2.getItemId() == 5210001) && ((hour >= 10 && hour <= 22 && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { this.expMod = 2; } // if (this.dropMod == 1) { // if (item2.getItemId() == 5360015 || item2.getItemId() == 5360014 || item2.getItemId() == 5360016) { // this.dropMod = 2; // } else if (item2.getItemId() == 5360018 && hour >= 0 && hour <= 24) { //10倍爆率卡 // this.dropMod = 10; // } else if (item2.getItemId() == 5360000 && hour >= 0 && hour <= 6) { // this.dropMod = 2; // } else if (item2.getItemId() == 5360001 && hour >= 6 && hour <= 12) { // this.dropMod = 2; // } else if (item2.getItemId() == 5360002 && hour >= 12 && hour <= 18) { // this.dropMod = 2; // } else if (item2.getItemId() == 5360003 && hour >= 18 && hour <= 24) { // this.dropMod = 2; // } // } if (item2.getItemId() == 5650000) { this.hasPartyBonus = true; } else if (item2.getItemId() == 5590001) { this.levelBonus = 10; } else { if (this.levelBonus != 0 || item2.getItemId() != 5590000) { continue; } this.levelBonus = 5; } } for (final IItem item2 : chra.getInventory(MapleInventoryType.ETC)) { switch (item2.getItemId()) { case 5062000: { this.hasVac = true; continue; } case 4030004: { this.hasClone = true; continue; } case 4030005: { this.cashMod = 2; continue; } case 4101000: case 4101002: { this.equippedFairy = true; chra.setFairyExp((byte) 30); continue; } } } int bl = 0; int jb = 0; if (Start.blkg == 1){ for (BlConfig blConfig : Start.BLlist) { if (blConfig.isInTimeRange()){ boolean b = chra.haveItem(blConfig.getItem_id()); if (b) { int itemNum = 1; if (blConfig.getStackableNum()== 1) { itemNum = chra.getItemNum(blConfig.getItem_id()); } if (Start.bldj == 1) { bl += (blConfig.getItem_rate() * itemNum); jb += (blConfig.getGold_rate() * itemNum); }else { bl = bl>= (blConfig.getItem_rate() * itemNum)? bl : blConfig.getItem_rate() * itemNum; jb = jb>= (blConfig.getGold_rate() * itemNum)? jb : blConfig.getGold_rate() * itemNum; } } } } } this.dropMod+= bl/100; this.cashMod+= jb/100; for (final IItem item2 : chra.getInventory(MapleInventoryType.CASH)) { switch (item2.getItemId()) { case 5062000: { this.hasVac = true; continue; } } } this.magic += chra.getSkillLevel(SkillFactory.getSkill(22000000)); this.localstr = (int) ((float) this.localstr + (float) (percent_str * this.localstr) / 100.0f); this.localdex = (int) ((float) this.localdex + (float) (percent_dex * this.localdex) / 100.0f); final int before_ = this.localint_; this.localint_ = (int) ((float) this.localint_ + (float) (percent_int * this.localint_) / 100.0f); this.magic += this.localint_ - before_; this.localluk = (int) ((float) this.localluk + (float) (percent_luk * this.localluk) / 100.0f); this.accuracy = (int) ((float) this.accuracy + (float) (percent_acc * this.accuracy) / 100.0f); this.watk = (int) ((float) this.watk + (float) (percent_atk * this.watk) / 100.0f); this.magic = (int) ((float) this.magic + (float) (percent_matk * this.magic) / 100.0f); localmaxhp_ = (int) ((float) localmaxhp_ + (float) (percent_hp * localmaxhp_) / 100.0f); localmaxmp_ = (int) ((float) localmaxmp_ + (float) (percent_mp * localmaxmp_) / 100.0f); this.magic = Math.min(this.magic, 1999); Integer buff = chra.getBuffedValue(MapleBuffStat.MAPLE_WARRIOR); if (buff != null) { final double d = buff.doubleValue() / 100.0; this.localstr = (int) ((double) this.localstr + d * (double) this.str); this.localdex = (int) ((double) this.localdex + d * (double) this.dex); this.localluk = (int) ((double) this.localluk + d * (double) this.luk); final int before = this.localint_; this.localint_ = (int) ((double) this.localint_ + d * (double) this.int_); this.magic += this.localint_ - before; } buff = chra.getBuffedValue(MapleBuffStat.ECHO_OF_HERO); if (buff != null) { final double d = buff.doubleValue() / 100.0; this.watk += (int) ((double) this.watk * d); this.magic += (int) ((double) this.magic * d); } buff = chra.getBuffedValue(MapleBuffStat.ARAN_COMBO); if (buff != null) { this.watk += buff.intValue() / 10; } buff = chra.getBuffedValue(MapleBuffStat.MAXHP); if (buff != null) { localmaxhp_ = (int) ((double) localmaxhp_ + buff.doubleValue() / 100.0 * (double) localmaxhp_); } buff = chra.getBuffedValue(MapleBuffStat.MAXMP); if (buff != null) { localmaxmp_ = (int) ((double) localmaxmp_ + buff.doubleValue() / 100.0 * (double) localmaxmp_); } switch (chra.getJob()) { case 322: { final ISkill expert = SkillFactory.getSkill(3220004); final int boostLevel = chra.getSkillLevel(expert); if (boostLevel > 0) { this.watk += expert.getEffect(boostLevel).getX(); break; } break; } case 312: { final ISkill expert = SkillFactory.getSkill(3120005); final int boostLevel = chra.getSkillLevel(expert); if (boostLevel > 0) { this.watk += expert.getEffect(boostLevel).getX(); break; } break; } case 211: case 212: { final ISkill amp = SkillFactory.getSkill(2110001); final int level = chra.getSkillLevel(amp); if (level > 0) { this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; break; } break; } case 221: case 222: { final ISkill amp = SkillFactory.getSkill(2210001); final int level = chra.getSkillLevel(amp); if (level > 0) { this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; break; } break; } case 1211: case 1212: { final ISkill amp = SkillFactory.getSkill(12110001); final int level = chra.getSkillLevel(amp); if (level > 0) { this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; break; } break; } case 2112: { final ISkill expert = SkillFactory.getSkill(21120001); final int boostLevel = chra.getSkillLevel(expert); if (boostLevel > 0) { this.watk += expert.getEffect(boostLevel).getX(); break; } break; } } final ISkill blessoffairy = SkillFactory.getSkill(GameConstants.getBofForJob((int) chra.getJob())); final int boflevel = chra.getSkillLevel(blessoffairy); if (boflevel > 0) { this.watk += blessoffairy.getEffect(boflevel).getX(); this.magic += blessoffairy.getEffect(boflevel).getY(); this.accuracy += blessoffairy.getEffect(boflevel).getX(); } buff = chra.getBuffedValue(MapleBuffStat.EXPRATE); if (buff != null) { this.expBuff *= buff.doubleValue() / 100.0; this.realExpBuff += buff.doubleValue(); } if (chra.isBuffedValue(2382046)) { this.realMesoBuff += 100.0; this.mesoBuff *= 2.0; this.realDropBuff += 200.0; this.dropBuff *= 3.0; } else if (chra.isBuffedValue(2382028)) { this.realMesoBuff += 100.0; this.mesoBuff *= 2.0; this.realDropBuff += 200.0; this.dropBuff *= 3.0; } buff = chra.getBuffedValue(MapleBuffStat.DROP_RATE); if (buff != null) { if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382028) { switch (chra.getMapId()) { case 100040101: case 100040102: case 100040103: case 100040104: case 107000401: case 107000402: case 107000403: case 191000000: { this.realDropBuff += buff.doubleValue(); this.dropBuff *= buff.doubleValue() / 100.0; break; } } } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382028) { switch (chra.getMapId()) { case 222020100: case 222020200: case 222020300: { this.realDropBuff += buff.doubleValue(); this.dropBuff *= buff.doubleValue() / 100.0; break; } } } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2022462) { this.realDropBuff += 50.0; this.dropBuff *= 1.5; } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382001) { this.realMesoBuff += 100.0; this.mesoBuff *= 2.0; this.realDropBuff += 200.0; this.dropBuff *= 3.0; } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382040) { this.realMesoBuff += 100.0; this.mesoBuff *= 2.0; this.realDropBuff += 200.0; this.dropBuff *= 3.0; } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2383003) { this.realMesoBuff += 100.0; this.mesoBuff *= 2.0; this.realDropBuff += 200.0; this.dropBuff *= 3.0; } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2383006) { this.realDropBuff += 300.0; this.dropBuff *= 4.0; } else { this.realDropBuff += buff.doubleValue(); this.dropBuff *= buff.doubleValue() / 100.0; } } buff = chra.getBuffedValue(MapleBuffStat.ACASH_RATE); if (buff != null) { this.realCashBuff += buff.doubleValue(); this.cashBuff *= buff.doubleValue() / 100.0; } buff = chra.getBuffedValue(MapleBuffStat.MESO_RATE); if (buff != null) { if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2382005 || chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2382016) { if (chra.getMapId() >= 221020000 && chra.getMapId() <= 221024400) { this.mesoBuff *= buff.doubleValue() / 100.0; this.realMesoBuff += buff.doubleValue(); } } else if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2022459) { this.realMesoBuff += 30.0; this.mesoBuff *= 1.3; } else if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2022460) { this.realMesoBuff += 50.0; this.mesoBuff *= 1.5; } else { this.realMesoBuff += buff.doubleValue(); this.mesoBuff *= buff.doubleValue() / 100.0; } } buff = chra.getBuffedValue(MapleBuffStat.MESOUP); if (buff != null) { this.realMesoBuff += buff.doubleValue(); this.mesoBuff *= buff.doubleValue() / 100.0; } buff = chra.getBuffedValue(MapleBuffStat.ACC); if (buff != null) { this.accuracy += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.WATK); if (buff != null) { this.watk += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.MATK); if (buff != null) { this.magic += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.SPEED); if (buff != null) { speed += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.JUMP); if (buff != null) { jump += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.DASH_SPEED); if (buff != null) { speed += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.DASH_JUMP); if (buff != null) { jump += buff.intValue(); } buff = chra.getBuffedValue(MapleBuffStat.WIND_WALK); if (buff != null) { final MapleStatEffect eff = chra.getStatForBuff(MapleBuffStat.WIND_WALK); this.dam_r *= (double) eff.getDamage() / 100.0; this.bossdam_r *= (double) eff.getDamage() / 100.0; } buff = chra.getBuffedSkill_Y(MapleBuffStat.OWL_SPIRIT); if (buff != null) { this.dam_r *= buff.doubleValue() / 100.0; this.bossdam_r *= buff.doubleValue() / 100.0; } buff = chra.getBuffedValue(MapleBuffStat.BERSERK_FURY); if (buff != null) { this.dam_r *= 2.0; this.bossdam_r *= 2.0; } final ISkill bx = SkillFactory.getSkill(1320006); if (chra.getSkillLevel(bx) > 0) { this.dam_r *= (double) bx.getEffect((int) chra.getSkillLevel(bx)).getDamage() / 100.0; this.bossdam_r *= (double) bx.getEffect((int) chra.getSkillLevel(bx)).getDamage() / 100.0; } buff = chra.getBuffedValue(MapleBuffStat.WK_CHARGE); if (buff != null) { final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.WK_CHARGE); this.dam_r *= (double) eff2.getDamage() / 100.0; this.bossdam_r *= (double) eff2.getDamage() / 100.0; } buff = chra.getBuffedValue(MapleBuffStat.MONSTER_RIDING); if (buff != null) { final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.MONSTER_RIDING); this.pickRate = eff2.getProb(); } buff = chra.getBuffedValue(MapleBuffStat.LIGHTNING_CHARGE); if (buff != null) { final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.LIGHTNING_CHARGE); this.dam_r *= (double) eff2.getDamage() / 100.0; this.bossdam_r *= (double) eff2.getDamage() / 100.0; } buff = chra.getBuffedSkill_X(MapleBuffStat.SHARP_EYES); if (buff != null) { added_sharpeye_rate += buff.intValue(); } buff = chra.getBuffedSkill_Y(MapleBuffStat.SHARP_EYES); if (buff != null) { added_sharpeye_dmg += buff.intValue() - 100; } if (speed > 140) { speed = 140; } if (jump > 123) { jump = 123; } this.speedMod = (float) speed / 100.0f; this.jumpMod = (float) jump / 100.0f; final Integer mount = chra.getBuffedValue(MapleBuffStat.MONSTER_RIDING); if (mount != null) { this.jumpMod = 1.23f; switch (mount.intValue()) { case 1: { this.speedMod = 1.5f; break; } case 2: { this.speedMod = 1.7f; break; } case 3: { this.speedMod = 1.8f; break; } default: { System.err.println("Unhandeled monster riding level, Speedmod = " + this.speedMod + ""); break; } } } this.hands = this.localdex + this.localint_ + this.localluk; this.localmaxhp = (short) Math.min(30000, Math.abs(Math.max(-30000, localmaxhp_))); this.localmaxmp = (short) Math.min(30000, Math.abs(Math.max(-30000, localmaxmp_))); this.CalcPassive_SharpEye(chra, added_sharpeye_rate, added_sharpeye_dmg); this.CalcPassive_Mastery(chra); this.CalcPassive_Range(chra); if (first_login) { chra.silentEnforceMaxHpMp(); } else { chra.enforceMaxHpMp(); } this.localmaxbasedamage = this.calculateMaxBaseDamage(this.magic, this.watk); if (oldmaxhp != 0 && oldmaxhp != this.localmaxhp) { chra.updatePartyMemberHP(); } this.isRecalc = false; } public boolean checkEquipLevels(final MapleCharacter chr, final long gain) { boolean changed = false; final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final List all = new ArrayList(this.equipLevelHandling); for (Equip eq : all) { final int lvlz = eq.getEquipLevel(); eq.setItemEXP(Math.min(eq.getItemEXP() + gain, Integer.MAX_VALUE)); if (eq.getEquipLevel() > lvlz) { for (int i = eq.getEquipLevel() - lvlz; i > 0; --i) { final Map> inc = ii.getEquipIncrements(eq.getItemId()); if (inc != null && inc.containsKey(Integer.valueOf(lvlz + i))) { eq = ii.levelUpEquip(eq, inc.get(Integer.valueOf(lvlz + i))); } if (GameConstants.getStatFromWeapon(eq.getItemId()) == null) { final Map> ins = ii.getEquipSkills(eq.getItemId()); if (ins != null && ins.containsKey(Integer.valueOf(lvlz + i))) { for (final Integer z : ins.get(Integer.valueOf(lvlz + i))) { if (Math.random() < 0.1) { final ISkill skil = SkillFactory.getSkill(z.intValue()); if (skil == null || !skil.canBeLearnedBy((int) chr.getJob()) || chr.getSkillLevel(skil) >= chr.getMasterLevel(skil)) { continue; } chr.changeSkillLevel(skil, (byte) (chr.getSkillLevel(skil) + 1), chr.getMasterLevel(skil)); } } } } } changed = true; } chr.forceReAddItem_Flag(eq.copy(), MapleInventoryType.EQUIPPED); } if (changed) { chr.equipChanged(); chr.getClient().sendPacket(MaplePacketCreator.showItemLevelupEffect()); chr.getMap().broadcastMessage(chr, MaplePacketCreator.showForeignItemLevelupEffect(chr.getId()), false); } return changed; } public boolean checkEquipDurabilitys(final MapleCharacter chr, final int gain) { for (final Equip item : this.durabilityHandling) { item.setDurability(item.getDurability() + gain); if (item.getDurability() < 0) { item.setDurability(0); } } final List all = new ArrayList(this.durabilityHandling); for (final Equip eqq : all) { if (eqq.getDurability() == 0) { if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { chr.getClient().sendPacket(MaplePacketCreator.getInventoryFull()); chr.getClient().sendPacket(MaplePacketCreator.getShowInventoryFull()); return false; } this.durabilityHandling.remove(eqq); final short pos = chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot(); MapleInventoryManipulator.unequip(chr.getClient(), eqq.getPosition(), pos); chr.getClient().sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(1, (IItem) eqq, pos))); } else { chr.forceReAddItem(eqq.copy(), MapleInventoryType.EQUIPPED); } } return true; } private void CalcPassive_Mastery(final MapleCharacter player) { if (player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)) == null) { this.passive_mastery = 0; return; } int skil = 0; switch (GameConstants.getWeaponType(player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)).getItemId())) { case 弓: { skil = 3100000; break; } case 拳套: { skil = 4100000; break; } case 双刀: case 短剑: { skil = ((player.getJob() >= 430 && player.getJob() <= 434) ? 4300000 : 4200000); break; } case 弩: { skil = 3200000; break; } case 单手斧: case 双手斧: { skil = 1100001; break; } case 单手剑: case 双手剑: { skil = (GameConstants.isKOC((int) player.getJob()) ? 11100000 : ((player.getJob() > 112) ? 1200000 : 1100000)); break; } case 单手棍: case 双手棍: { skil = 1200001; break; } case 枪: { skil = (GameConstants.isAran((int) player.getJob()) ? 21100000 : 1300001); break; } case 矛: { skil = 1300000; break; } case 指虎: { skil = (GameConstants.isKOC((int) player.getJob()) ? 15100001 : 5100001); break; } case 火枪: { skil = 5200000; break; } case 短杖: { skil = 32100006; break; } default: { this.passive_mastery = 0; return; } } if (player.getSkillLevel(skil) <= 0) { this.passive_mastery = 0; return; } this.passive_mastery = (byte) (player.getSkillLevel(skil) / 2 + player.getSkillLevel(skil) % 2); } private void CalcPassive_SharpEye(final MapleCharacter player, final int added_sharpeye_rate, final int added_sharpeye_dmg) { switch (player.getJob()) { case 410: case 411: case 412: { final ISkill critSkill = SkillFactory.getSkill(4100001); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 1410: case 1411: case 1412: { final ISkill critSkill = SkillFactory.getSkill(14100001); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 511: case 512: { final ISkill critSkill = SkillFactory.getSkill(5110000); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 1511: case 1512: { final ISkill critSkill = SkillFactory.getSkill(15110000); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 2111: case 2112: { final ISkill critSkill = SkillFactory.getSkill(21110000); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getX() * critSkill.getEffect(critlevel).getDamage() + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getX() * critSkill.getEffect(critlevel).getY() + added_sharpeye_rate); return; } break; } case 300: case 310: case 311: case 312: case 320: case 321: case 322: { final ISkill critSkill = SkillFactory.getSkill(3000001); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 1300: case 1310: case 1311: case 1312: { final ISkill critSkill = SkillFactory.getSkill(13000000); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } case 2214: case 2215: case 2216: case 2217: case 2218: { final ISkill critSkill = SkillFactory.getSkill(22140000); final int critlevel = player.getSkillLevel(critSkill); if (critlevel > 0) { this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); return; } break; } } this.passive_sharpeye_percent = (short) added_sharpeye_dmg; this.passive_sharpeye_rate = (byte) added_sharpeye_rate; } private void CalcPassive_Range(final MapleCharacter chra) { switch (chra.getJob()) { case 300: case 310: case 311: case 312: case 320: case 321: case 322: { this.defRange = 100; final ISkill bx = SkillFactory.getSkill(3000002); final int bof = chra.getSkillLevel(bx); if (bof > 0) { this.defRange += bx.getEffect(bof).getRange(); break; } break; } case 410: case 411: case 412: case 420: case 421: case 422: { this.defRange = 100; final ISkill bx = SkillFactory.getSkill(4000001); final int bof = chra.getSkillLevel(bx); if (bof > 0) { this.defRange += bx.getEffect(bof).getRange(); break; } break; } case 520: case 521: case 522: { this.defRange = 100; break; } case 1300: case 1310: case 1311: case 1312: { this.defRange = 100; final ISkill bx = SkillFactory.getSkill(13000001); final int bof = chra.getSkillLevel(bx); if (bof > 0) { this.defRange += bx.getEffect(bof).getRange(); break; } break; } case 1400: case 1410: case 1411: case 1412: { this.defRange = 100; final ISkill bx = SkillFactory.getSkill(14000001); final int bof = chra.getSkillLevel(bx); if (bof > 0) { this.defRange += bx.getEffect(bof).getRange(); break; } break; } case 2100: case 2110: case 2111: case 2112: { this.defRange = 80; break; } } } public final short passive_sharpeye_percent() { return this.passive_sharpeye_percent; } public final byte passive_sharpeye_rate() { return this.passive_sharpeye_rate; } public final byte passive_mastery() { return this.passive_mastery; } public final float calculateMaxBaseDamage(final int matk, final int watk) { final MapleCharacter chra = (MapleCharacter) this.chr.get(); if (chra == null) { return 0.0f; } float maxbasedamage; if (watk == 0) { maxbasedamage = 1.0f; } else { final IItem weapon_item = chra.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)); final int job = chra.getJob(); final MapleWeaponType weapon = (weapon_item == null) ? MapleWeaponType.沒有武器 : GameConstants.getWeaponType(weapon_item.getItemId()); final boolean magican = (job >= 200 && job <= 232) || (job >= 1200 && job <= 1212); int mainstat = 0; int secondarystat = 0; switch (weapon) { case 矛: { mainstat = (int) ((double) this.localstr * 1.25); secondarystat = (int) ((double) this.localdex * 1.25); break; } case 弓: case 弩: { mainstat = this.localdex * 2; secondarystat = this.localstr * 2; break; } case 拳套: case 双刀: case 短剑: { if ((job >= 400 && job <= 434) || (job >= 1400 && job <= 1412)) { mainstat = this.localluk; secondarystat = this.localdex + this.localstr; break; } mainstat = this.localstr; secondarystat = this.localdex; break; } case 指虎: { mainstat = this.localstr; secondarystat = this.localdex; break; } case 火枪: { mainstat = this.localdex; secondarystat = this.localstr; break; } case 沒有武器: { if ((job >= 500 && job <= 522) || (job >= 1500 && job <= 1512)) { mainstat = this.localstr; secondarystat = this.localdex; break; } mainstat = 0; secondarystat = 0; break; } default: { if (magican) { mainstat = this.localint_; secondarystat = this.localluk; break; } mainstat = this.localstr; secondarystat = this.localdex; break; } } maxbasedamage = (weapon.getMaxDamageMultiplier() * (float) mainstat + (float) secondarystat) * (float) (magican ? matk : watk) / 100.0f; } return maxbasedamage; } public final float getHealHP() { int shouldHealHP = 10; Skill bx = (Skill) SkillFactory.getSkill(1000000); int bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealHP += eff.getHp(); } bx = (Skill) SkillFactory.getSkill(1320008); bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealHP += eff.getHp(); } bx = (Skill) SkillFactory.getSkill(4100002); bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealHP += eff.getHp(); } bx = (Skill) SkillFactory.getSkill(4200001); bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealHP += eff.getHp(); } return (float) shouldHealHP; } public final float getHealMP() { int shouldHealMP = 3; Skill bx = (Skill) SkillFactory.getSkill(2000000); int bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { shouldHealMP += bof * 5; } bx = (Skill) SkillFactory.getSkill(4100002); bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealMP += eff.getMp(); } bx = (Skill) SkillFactory.getSkill(4200001); bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); if (bof > 0) { final MapleStatEffect eff = bx.getEffect(bof); shouldHealMP += eff.getMp(); } return (float) shouldHealMP; } public final void relocHeal() { final MapleCharacter chra = (MapleCharacter) this.chr.get(); if (chra == null) { return; } final int playerjob = chra.getJob(); this.shouldHealHP = (float) (10 + this.recoverHP); this.shouldHealMP = (float) (3 + this.mpRestore + this.recoverMP); if (GameConstants.isJobFamily(200, playerjob)) { this.shouldHealMP += (float) chra.getSkillLevel(SkillFactory.getSkill(2000000)) / 10.0f * (float) chra.getLevel(); } else if (GameConstants.isJobFamily(111, playerjob)) { final ISkill effect = SkillFactory.getSkill(1110000); final int lvl = chra.getSkillLevel(effect); if (lvl > 0) { this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); } } else if (GameConstants.isJobFamily(121, playerjob)) { final ISkill effect = SkillFactory.getSkill(1210000); final int lvl = chra.getSkillLevel(effect); if (lvl > 0) { this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); } } else if (GameConstants.isJobFamily(1111, playerjob)) { final ISkill effect = SkillFactory.getSkill(11110000); final int lvl = chra.getSkillLevel(effect); if (lvl > 0) { this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); } } else if (GameConstants.isJobFamily(410, playerjob)) { final ISkill effect = SkillFactory.getSkill(4100002); final int lvl = chra.getSkillLevel(effect); if (lvl > 0) { this.shouldHealHP += (float) effect.getEffect(lvl).getHp(); this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); } } else if (GameConstants.isJobFamily(420, playerjob)) { final ISkill effect = SkillFactory.getSkill(4200001); final int lvl = chra.getSkillLevel(effect); if (lvl > 0) { this.shouldHealHP += (float) effect.getEffect(lvl).getHp(); this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); } } if (chra.isGM()) { this.shouldHealHP += 1000.0f; this.shouldHealMP += 1000.0f; } if (chra.getChair() != 0) { this.shouldHealHP += 99.0f; this.shouldHealMP += 99.0f; } else { final float recvRate = chra.getMap().getRecoveryRate(); this.shouldHealHP *= recvRate; this.shouldHealMP *= recvRate; } this.shouldHealHP *= 2.0f; this.shouldHealMP *= 2.0f; } public final void connectData(final MaplePacketLittleEndianWriter mplew) { mplew.writeShort((int) this.str); mplew.writeShort((int) this.dex); mplew.writeShort((int) this.int_); mplew.writeShort((int) this.luk); mplew.writeShort((int) this.hp); mplew.writeShort((int) this.maxhp); mplew.writeShort((int) this.mp); mplew.writeShort((int) this.maxmp); } public final int getSkillByJob(final int skillID, final int job) { if (GameConstants.isKOC(job)) { return skillID + 10000000; } if (GameConstants.isAran(job)) { return skillID + 20000000; } return skillID; } public final void handleProfessionTool(final MapleCharacter chra) { if (chra.getProfessionLevel(92000000) > 0 || chra.getProfessionLevel(92010000) > 0) { for (final Equip equip : (List) (List) chra.getInventory(MapleInventoryType.EQUIP).newList()) { if ((equip.getDurability() != 0 && equip.getItemId() / 10000 == 150 && chra.getProfessionLevel(92000000) > 0) || (equip.getItemId() / 10000 == 151 && chra.getProfessionLevel(92010000) > 0)) { if (equip.getDurability() > 0) { this.durabilityHandling.add(equip); } this.harvestingTool = equip.getPosition(); break; } } } } }