diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index c14670866c..434a5d8587 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -753,6 +753,8 @@ Corrigido AP reset modificando stats de forma err 03 Janeiro 2018, Corrigido item megafone permitindo o display de equipamentos não-comercializáveis, mesmo marcados como Untradeable. -10 - 11 Janeiro 2018, +10 - 13 Janeiro 2018, Incrementado portal de MK Castle agora permitindo uso dos 2 itens possíveis. -Resolvido alguns logs de erros disparados por mapas nulos no código-fonte. \ No newline at end of file +Resolvido alguns logs de erros disparados por mapas nulos no código-fonte. +Resolvido pequenos problemas de volatidade (nulos) nas referencias ao jogador em alguns handlers. +Corrigido alguns problemas com copyright em alguns arquivos. \ No newline at end of file diff --git a/scripts/npc/2091005.js b/scripts/npc/2091005.js index 3033722b8a..05dfad86cc 100644 --- a/scripts/npc/2091005.js +++ b/scripts/npc/2091005.js @@ -1,6 +1,9 @@ /* - This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server - Copyleft (L) 2017 RonanLana + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + Copyleft (L) 2017 RonanLana (HeavenMS) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as @@ -8,12 +11,10 @@ the Free Software Foundation. You may not use, modify or distribute this program under any other version of the GNU Affero General Public License. - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ diff --git a/src/net/server/channel/handlers/AutoAggroHandler.java b/src/net/server/channel/handlers/AutoAggroHandler.java index 085fac30d1..e611bbb72a 100644 --- a/src/net/server/channel/handlers/AutoAggroHandler.java +++ b/src/net/server/channel/handlers/AutoAggroHandler.java @@ -37,21 +37,19 @@ public final class AutoAggroHandler extends AbstractMaplePacketHandler { MapleMap map = c.getPlayer().getMap(); int oid = slea.readInt(); - try { - MapleMonster monster = map.getMonsterByOid(oid); - if (monster != null && monster.getController() != null) { - if (!monster.isControllerHasAggro()) { - if (map.getCharacterById(monster.getController().getId()) == null) { - monster.switchController(c.getPlayer(), true); - } else { - monster.switchController(monster.getController(), true); - } - } else if (map.getCharacterById(monster.getController().getId()) == null) { + MapleMonster monster = map.getMonsterByOid(oid); + if (monster != null && monster.getController() != null) { + if (!monster.isControllerHasAggro()) { + if (map.getCharacterById(monster.getController().getId()) == null) { monster.switchController(c.getPlayer(), true); + } else { + monster.switchController(monster.getController(), true); } - } else if (monster != null && monster.getController() == null) { + } else if (map.getCharacterById(monster.getController().getId()) == null) { monster.switchController(c.getPlayer(), true); } - } catch(NullPointerException npe) {} + } else if (monster != null && monster.getController() == null) { + monster.switchController(c.getPlayer(), true); + } } } diff --git a/src/net/server/channel/handlers/CloseRangeDamageHandler.java b/src/net/server/channel/handlers/CloseRangeDamageHandler.java index da974ce9a3..f9b60158a7 100644 --- a/src/net/server/channel/handlers/CloseRangeDamageHandler.java +++ b/src/net/server/channel/handlers/CloseRangeDamageHandler.java @@ -49,53 +49,53 @@ import constants.skills.WindArcher; public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - MapleCharacter player = c.getPlayer(); - player.setPetLootCd(System.currentTimeMillis()); + MapleCharacter chr = c.getPlayer(); + chr.setPetLootCd(System.currentTimeMillis()); - /*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8); + /*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8); if(timeElapsed < 300) { - AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed); + AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed); } - player.getAutobanManager().spam(8);*/ + chr.getAutobanManager().spam(8);*/ - AttackInfo attack = parseDamage(slea, player, false, false); - if (player.getBuffEffect(MapleBuffStat.MORPH) != null) { - if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { + AttackInfo attack = parseDamage(slea, chr, false, false); + if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) { + if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { // How are they attacking when the client won't let them? - player.getClient().disconnect(false, false); + chr.getClient().disconnect(false, false); return; } } - if (c.getPlayer().getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging + if (chr.getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging return; - if (player.getMap().isDojoMap() && attack.numAttacked > 0) { - player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK); - c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy())); + if (chr.getMap().isDojoMap() && attack.numAttacked > 0) { + chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); } - player.getMap().broadcastMessage(player, MaplePacketCreator.closeRangeAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.closeRangeAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true); int numFinisherOrbs = 0; - Integer comboBuff = player.getBuffedValue(MapleBuffStat.COMBO); + Integer comboBuff = chr.getBuffedValue(MapleBuffStat.COMBO); if (GameConstants.isFinisherSkill(attack.skill)) { if (comboBuff != null) { numFinisherOrbs = comboBuff.intValue() - 1; } - player.handleOrbconsume(); + chr.handleOrbconsume(); } else if (attack.numAttacked > 0) { if (attack.skill != 1111008 && comboBuff != null) { - int orbcount = player.getBuffedValue(MapleBuffStat.COMBO); - int oid = player.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO; - int advcomboid = player.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO; + int orbcount = chr.getBuffedValue(MapleBuffStat.COMBO); + int oid = chr.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO; + int advcomboid = chr.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO; Skill combo = SkillFactory.getSkill(oid); Skill advcombo = SkillFactory.getSkill(advcomboid); MapleStatEffect ceffect; - int advComboSkillLevel = player.getSkillLevel(advcombo); + int advComboSkillLevel = chr.getSkillLevel(advcombo); if (advComboSkillLevel > 0) { ceffect = advcombo.getEffect(advComboSkillLevel); } else { - int comboLv = player.getSkillLevel(combo); - if(comboLv <= 0 || player.isGM()) comboLv = SkillFactory.getSkill(oid).getMaxLevel(); + int comboLv = chr.getSkillLevel(combo); + if(comboLv <= 0 || chr.isGM()) comboLv = SkillFactory.getSkill(oid).getMaxLevel(); if(comboLv > 0) ceffect = combo.getEffect(comboLv); else ceffect = null; @@ -109,20 +109,20 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { } } - int olv = player.getSkillLevel(oid); + int olv = chr.getSkillLevel(oid); if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel(); int duration = combo.getEffect(olv).getDuration(); List> stat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, neworbcount)); - player.setBuffedValue(MapleBuffStat.COMBO, neworbcount); - duration -= (int) (System.currentTimeMillis() - player.getBuffedStarttime(MapleBuffStat.COMBO)); + chr.setBuffedValue(MapleBuffStat.COMBO, neworbcount); + duration -= (int) (System.currentTimeMillis() - chr.getBuffedStarttime(MapleBuffStat.COMBO)); c.announce(MaplePacketCreator.giveBuff(oid, duration, stat)); - player.getMap().broadcastMessage(player, MaplePacketCreator.giveForeignBuff(player.getId(), stat), false); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.giveForeignBuff(chr.getId(), stat), false); } } - } else if (player.getSkillLevel(player.isCygnus() ? SkillFactory.getSkill(15100004) : SkillFactory.getSkill(5110001)) > 0 && (player.getJob().isA(MapleJob.MARAUDER) || player.getJob().isA(MapleJob.THUNDERBREAKER2))) { + } else if (chr.getSkillLevel(chr.isCygnus() ? SkillFactory.getSkill(15100004) : SkillFactory.getSkill(5110001)) > 0 && (chr.getJob().isA(MapleJob.MARAUDER) || chr.getJob().isA(MapleJob.THUNDERBREAKER2))) { for (int i = 0; i < attack.numAttacked; i++) { - player.handleEnergyChargeGain(); + chr.handleEnergyChargeGain(); } } } @@ -132,60 +132,60 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { if (dmgIt.hasNext()) { totDamageToOneMonster = dmgIt.next().get(0).intValue(); } - int remainingHP = player.getHp() - totDamageToOneMonster * attack.getAttackEffect(player, null).getX() / 100; + int remainingHP = chr.getHp() - totDamageToOneMonster * attack.getAttackEffect(chr, null).getX() / 100; if (remainingHP > 1) { - player.setHp(remainingHP); + chr.setHp(remainingHP); } else { - player.setHp(1); + chr.setHp(1); } - player.updateSingleStat(MapleStat.HP, player.getHp()); - player.checkBerserk(player.isHidden()); + chr.updateSingleStat(MapleStat.HP, chr.getHp()); + chr.checkBerserk(chr.isHidden()); } if (attack.numAttacked > 0 && attack.skill == 1211002) { boolean advcharge_prob = false; - int advcharge_level = player.getSkillLevel(SkillFactory.getSkill(1220010)); + int advcharge_level = chr.getSkillLevel(SkillFactory.getSkill(1220010)); if (advcharge_level > 0) { advcharge_prob = SkillFactory.getSkill(1220010).getEffect(advcharge_level).makeChanceResult(); } if (!advcharge_prob) { - player.cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE); + chr.cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE); } } int attackCount = 1; if (attack.skill != 0) { - attackCount = attack.getAttackEffect(player, null).getAttackCount(); + attackCount = attack.getAttackEffect(chr, null).getAttackCount(); } if (numFinisherOrbs == 0 && GameConstants.isFinisherSkill(attack.skill)) { return; } if (attack.skill % 10000000 == 1009) { // bamboo - if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging + if (chr.getDojoEnergy() < 10000) { // PE hacking or maybe just lagging return; } - player.setDojoEnergy(0); - c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy())); + chr.setDojoEnergy(0); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset.")); } else if (attack.skill > 0) { Skill skill = SkillFactory.getSkill(attack.skill); - MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill)); + MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); if (effect_.getCooldown() > 0) { - if (player.skillIsCooling(attack.skill)) { + if (chr.skillIsCooling(attack.skill)) { return; } else { c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown())); - player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); + chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); } } } - if ((player.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 || player.getSkillLevel(SkillFactory.getSkill(Rogue.DARK_SIGHT)) > 0) && player.getBuffedValue(MapleBuffStat.DARKSIGHT) != null) {// && player.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004 - player.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT); - player.cancelBuffStats(MapleBuffStat.DARKSIGHT); - } else if(player.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && player.getBuffedValue(MapleBuffStat.WIND_WALK) != null) { - player.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK); - player.cancelBuffStats(MapleBuffStat.WIND_WALK); + if ((chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 || chr.getSkillLevel(SkillFactory.getSkill(Rogue.DARK_SIGHT)) > 0) && chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null) {// && chr.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004 + chr.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT); + chr.cancelBuffStats(MapleBuffStat.DARKSIGHT); + } else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null) { + chr.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK); + chr.cancelBuffStats(MapleBuffStat.WIND_WALK); } - applyAttack(attack, player, attackCount); + applyAttack(attack, chr, attackCount); } } \ No newline at end of file diff --git a/src/net/server/channel/handlers/MagicDamageHandler.java b/src/net/server/channel/handlers/MagicDamageHandler.java index fb73ac7eca..34af281eb9 100644 --- a/src/net/server/channel/handlers/MagicDamageHandler.java +++ b/src/net/server/channel/handlers/MagicDamageHandler.java @@ -22,7 +22,6 @@ package net.server.channel.handlers; import server.MapleStatEffect; -import server.TimerManager; import tools.MaplePacketCreator; import tools.data.input.SeekableLittleEndianAccessor; import client.MapleBuffStat; @@ -39,51 +38,51 @@ import constants.skills.ILArchMage; public final class MagicDamageHandler extends AbstractDealDamageHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - MapleCharacter player = c.getPlayer(); - player.setPetLootCd(System.currentTimeMillis()); + MapleCharacter chr = c.getPlayer(); + chr.setPetLootCd(System.currentTimeMillis()); - /*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8); + /*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8); if(timeElapsed < 300) { - AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed); + AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed); } - player.getAutobanManager().spam(8);*/ + chr.getAutobanManager().spam(8);*/ - AttackInfo attack = parseDamage(slea, player, false, true); + AttackInfo attack = parseDamage(slea, chr, false, true); - if (player.getBuffEffect(MapleBuffStat.MORPH) != null) { - if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { + if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) { + if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { // How are they attacking when the client won't let them? - player.getClient().disconnect(false, false); + chr.getClient().disconnect(false, false); return; } } - if (player.getMap().isDojoMap() && attack.numAttacked > 0) { - player.setDojoEnergy(player.getDojoEnergy() + + ServerConstants.DOJO_ENERGY_ATK); - c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy())); + if (chr.getMap().isDojoMap() && attack.numAttacked > 0) { + chr.setDojoEnergy(chr.getDojoEnergy() + + ServerConstants.DOJO_ENERGY_ATK); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); } int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1; - byte[] packet = MaplePacketCreator.magicAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display); + byte[] packet = MaplePacketCreator.magicAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display); - player.getMap().broadcastMessage(player, packet, false, true); - MapleStatEffect effect = attack.getAttackEffect(player, null); + chr.getMap().broadcastMessage(chr, packet, false, true); + MapleStatEffect effect = attack.getAttackEffect(chr, null); Skill skill = SkillFactory.getSkill(attack.skill); - MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill)); + MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); if (effect_.getCooldown() > 0) { - if (player.skillIsCooling(attack.skill)) { + if (chr.skillIsCooling(attack.skill)) { return; } else { c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown())); - player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); + chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); } } - applyAttack(attack, player, effect.getAttackCount()); - Skill eaterSkill = SkillFactory.getSkill((player.getJob().getId() - (player.getJob().getId() % 10)) * 10000);// MP Eater, works with right job - int eaterLevel = player.getSkillLevel(eaterSkill); + applyAttack(attack, chr, effect.getAttackCount()); + Skill eaterSkill = SkillFactory.getSkill((chr.getJob().getId() - (chr.getJob().getId() % 10)) * 10000);// MP Eater, works with right job + int eaterLevel = chr.getSkillLevel(eaterSkill); if (eaterLevel > 0) { for (Integer singleDamage : attack.allDamage.keySet()) { - eaterSkill.getEffect(eaterLevel).applyPassive(player, player.getMap().getMapObject(singleDamage), 0); + eaterSkill.getEffect(eaterLevel).applyPassive(chr, chr.getMap().getMapObject(singleDamage), 0); } } } diff --git a/src/net/server/channel/handlers/MoveLifeHandler.java b/src/net/server/channel/handlers/MoveLifeHandler.java index c251de0365..7843d5d95c 100644 --- a/src/net/server/channel/handlers/MoveLifeHandler.java +++ b/src/net/server/channel/handlers/MoveLifeHandler.java @@ -46,71 +46,69 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler { int objectid = slea.readInt(); short moveid = slea.readShort(); - - try { - MapleMapObject mmo = map.getMapObject(objectid); - if (mmo == null || mmo.getType() != MapleMapObjectType.MONSTER) { + + MapleMapObject mmo = map.getMapObject(objectid); + if (mmo == null || mmo.getType() != MapleMapObjectType.MONSTER) { + return; + } + MapleMonster monster = (MapleMonster) mmo; + List res; + byte skillByte = slea.readByte(); + byte skill = slea.readByte(); + int skill_1 = slea.readByte() & 0xFF; + byte skill_2 = slea.readByte(); + byte skill_3 = slea.readByte(); + byte skill_4 = slea.readByte(); + slea.read(8); + MobSkill toUse = null; + if (skillByte == 1 && monster.getNoSkills() > 0) { + int random = Randomizer.nextInt(monster.getNoSkills()); + Pair skillToUse = monster.getSkills().get(random); + toUse = MobSkillFactory.getMobSkill(skillToUse.getLeft(), skillToUse.getRight()); + int percHpLeft = (monster.getHp() / monster.getMaxHp()) * 100; + if (toUse.getHP() < percHpLeft || !monster.canUseSkill(toUse)) { + toUse = null; + } + } + if ((skill_1 >= 100 && skill_1 <= 200) && monster.hasSkill(skill_1, skill_2)) { + MobSkill skillData = MobSkillFactory.getMobSkill(skill_1, skill_2); + if (skillData != null && monster.canUseSkill(skillData)) { + skillData.applyEffect(c.getPlayer(), monster, true, banishPlayers); + } + } + slea.readByte(); + slea.readInt(); // whatever + short start_x = slea.readShort(); // hmm.. startpos? + short start_y = slea.readShort(); // hmm... + Point startPos = new Point(start_x, start_y); + res = parseMovement(slea); + if (monster.getController() != c.getPlayer()) { + if (monster.isAttackedBy(c.getPlayer())) {// aggro and controller change + monster.switchController(c.getPlayer(), true); + } else { return; } - MapleMonster monster = (MapleMonster) mmo; - List res; - byte skillByte = slea.readByte(); - byte skill = slea.readByte(); - int skill_1 = slea.readByte() & 0xFF; - byte skill_2 = slea.readByte(); - byte skill_3 = slea.readByte(); - byte skill_4 = slea.readByte(); - slea.read(8); - MobSkill toUse = null; - if (skillByte == 1 && monster.getNoSkills() > 0) { - int random = Randomizer.nextInt(monster.getNoSkills()); - Pair skillToUse = monster.getSkills().get(random); - toUse = MobSkillFactory.getMobSkill(skillToUse.getLeft(), skillToUse.getRight()); - int percHpLeft = (monster.getHp() / monster.getMaxHp()) * 100; - if (toUse.getHP() < percHpLeft || !monster.canUseSkill(toUse)) { - toUse = null; - } - } - if ((skill_1 >= 100 && skill_1 <= 200) && monster.hasSkill(skill_1, skill_2)) { - MobSkill skillData = MobSkillFactory.getMobSkill(skill_1, skill_2); - if (skillData != null && monster.canUseSkill(skillData)) { - skillData.applyEffect(c.getPlayer(), monster, true, banishPlayers); - } - } - slea.readByte(); - slea.readInt(); // whatever - short start_x = slea.readShort(); // hmm.. startpos? - short start_y = slea.readShort(); // hmm... - Point startPos = new Point(start_x, start_y); - res = parseMovement(slea); - if (monster.getController() != c.getPlayer()) { - if (monster.isAttackedBy(c.getPlayer())) {// aggro and controller change - monster.switchController(c.getPlayer(), true); - } else { - return; - } - } else if (skill == -1 && monster.isControllerKnowsAboutAggro() && !monster.isMobile() && !monster.isFirstAttack()) { - monster.setControllerHasAggro(false); - monster.setControllerKnowsAboutAggro(false); - } - boolean aggro = monster.isControllerHasAggro(); - if (toUse != null) { - c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro, toUse.getSkillId(), toUse.getSkillLevel())); - } else { - c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro)); - } - if (aggro) { - monster.setControllerKnowsAboutAggro(true); - } - if (res != null) { - map.broadcastMessage(c.getPlayer(), MaplePacketCreator.moveMonster(skillByte, skill, skill_1, skill_2, skill_3, skill_4, objectid, startPos, res), monster.getPosition()); - updatePosition(res, monster, -1); - map.moveMonster(monster, monster.getPosition()); - } + } else if (skill == -1 && monster.isControllerKnowsAboutAggro() && !monster.isMobile() && !monster.isFirstAttack()) { + monster.setControllerHasAggro(false); + monster.setControllerKnowsAboutAggro(false); + } + boolean aggro = monster.isControllerHasAggro(); + if (toUse != null) { + c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro, toUse.getSkillId(), toUse.getSkillLevel())); + } else { + c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro)); + } + if (aggro) { + monster.setControllerKnowsAboutAggro(true); + } + if (res != null) { + map.broadcastMessage(c.getPlayer(), MaplePacketCreator.moveMonster(skillByte, skill, skill_1, skill_2, skill_3, skill_4, objectid, startPos, res), monster.getPosition()); + updatePosition(res, monster, -1); + map.moveMonster(monster, monster.getPosition()); + } - for (MapleCharacter chr : banishPlayers) { - chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg()); - } - } catch(NullPointerException npe) {} + for (MapleCharacter chr : banishPlayers) { + chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg()); + } } } diff --git a/src/net/server/channel/handlers/PetAutoPotHandler.java b/src/net/server/channel/handlers/PetAutoPotHandler.java index 48021c582f..7f63bb92bc 100644 --- a/src/net/server/channel/handlers/PetAutoPotHandler.java +++ b/src/net/server/channel/handlers/PetAutoPotHandler.java @@ -1,6 +1,9 @@ /* - This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server - Copyleft (L) 2017 RonanLana + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + Copyleft (L) 2017 RonanLana (HeavenMS) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as @@ -8,12 +11,10 @@ the Free Software Foundation. You may not use, modify or distribute this program under any other version of the GNU Affero General Public License. - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ @@ -34,7 +35,7 @@ import constants.ServerConstants; /** * - * @author Ronan + * @author Ronan (multi-pot consumption feature) */ public final class PetAutoPotHandler extends AbstractMaplePacketHandler { @Override @@ -69,14 +70,12 @@ public final class PetAutoPotHandler extends AbstractMaplePacketHandler { if(toUse != null) { MapleStatEffect stat = MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()); - if (toUse.getQuantity() <= 0) return; + if (toUse.getQuantity() <= 0 || toUse.getItemId() != itemId) { + c.announce(MaplePacketCreator.enableActions()); + return; + } do { - if (toUse.getItemId() != itemId) { - c.announce(MaplePacketCreator.enableActions()); - return; - } - MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false); stat.applyTo(chr); diff --git a/src/net/server/channel/handlers/RangedAttackHandler.java b/src/net/server/channel/handlers/RangedAttackHandler.java index 5bdcfa5777..8b46293025 100644 --- a/src/net/server/channel/handlers/RangedAttackHandler.java +++ b/src/net/server/channel/handlers/RangedAttackHandler.java @@ -24,7 +24,6 @@ package net.server.channel.handlers; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MapleStatEffect; -import server.TimerManager; import tools.MaplePacketCreator; import tools.Randomizer; import tools.data.input.SeekableLittleEndianAccessor; @@ -51,47 +50,47 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - MapleCharacter player = c.getPlayer(); - player.setPetLootCd(System.currentTimeMillis()); + MapleCharacter chr = c.getPlayer(); + chr.setPetLootCd(System.currentTimeMillis()); - /*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8); + /*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8); if(timeElapsed < 300) { - AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed); + AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed); } - player.getAutobanManager().spam(8);*/ + chr.getAutobanManager().spam(8);*/ - AttackInfo attack = parseDamage(slea, player, true, false); + AttackInfo attack = parseDamage(slea, chr, true, false); - if (player.getBuffEffect(MapleBuffStat.MORPH) != null) { - if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { + if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) { + if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) { // How are they attacking when the client won't let them? - player.getClient().disconnect(false, false); + chr.getClient().disconnect(false, false); return; } } - if (player.getMap().isDojoMap() && attack.numAttacked > 0) { - player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK); - c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy())); + if (chr.getMap().isDojoMap() && attack.numAttacked > 0) { + chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); } if (attack.skill == Buccaneer.ENERGY_ORB || attack.skill == ThunderBreaker.SPARK || attack.skill == Shadower.TAUNT || attack.skill == NightLord.TAUNT) { - player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); - applyAttack(attack, player, 1); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); + applyAttack(attack, chr, 1); } else if (attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.COMBO_FENRIR || attack.skill == Aran.COMBO_TEMPEST) { - player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); - if (attack.skill == Aran.COMBO_SMASH && player.getCombo() >= 30) { - player.setCombo((short) 0); - applyAttack(attack, player, 1); - } else if (attack.skill == Aran.COMBO_FENRIR && player.getCombo() >= 100) { - player.setCombo((short) 0); - applyAttack(attack, player, 2); - } else if (attack.skill == Aran.COMBO_TEMPEST && player.getCombo() >= 200) { - player.setCombo((short) 0); - applyAttack(attack, player, 4); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); + if (attack.skill == Aran.COMBO_SMASH && chr.getCombo() >= 30) { + chr.setCombo((short) 0); + applyAttack(attack, chr, 1); + } else if (attack.skill == Aran.COMBO_FENRIR && chr.getCombo() >= 100) { + chr.setCombo((short) 0); + applyAttack(attack, chr, 2); + } else if (attack.skill == Aran.COMBO_TEMPEST && chr.getCombo() >= 200) { + chr.setCombo((short) 0); + applyAttack(attack, chr, 4); } } else { - Item weapon = player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11); + Item weapon = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11); MapleWeaponType type = MapleItemInformationProvider.getInstance().getWeaponType(weapon.getItemId()); if (type == MapleWeaponType.NOT_A_WEAPON) { return; @@ -101,17 +100,17 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { byte bulletCount = 1; MapleStatEffect effect = null; if (attack.skill != 0) { - effect = attack.getAttackEffect(player, null); + effect = attack.getAttackEffect(chr, null); bulletCount = effect.getBulletCount(); if (effect.getCooldown() > 0) { c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect.getCooldown())); } } - boolean hasShadowPartner = player.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null; + boolean hasShadowPartner = chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null; if (hasShadowPartner) { bulletCount *= 2; } - MapleInventory inv = player.getInventory(MapleInventoryType.USE); + MapleInventory inv = chr.getInventory(MapleInventoryType.USE); for (short i = 1; i <= inv.getSlotLimit(); i++) { Item item = inv.getItem(i); if (item != null) { @@ -122,18 +121,18 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { boolean cbow = ItemConstants.isArrowForCrossBow(id); if (item.getQuantity() >= bulletCount) { //Fixes the bug where you can't use your last arrow. if (type == MapleWeaponType.CLAW && ItemConstants.isThrowingStar(id) && weapon.getItemId() != 1472063) { - if (((id == 2070007 || id == 2070018) && player.getLevel() < 70) || (id == 2070016 && player.getLevel() < 50)) { + if (((id == 2070007 || id == 2070018) && chr.getLevel() < 70) || (id == 2070016 && chr.getLevel() < 50)) { } else { projectile = id; break; } } else if ((type == MapleWeaponType.GUN && ItemConstants.isBullet(id))) { if (id == 2331000 && id == 2332000) { - if (player.getLevel() > 69) { + if (chr.getLevel() > 69) { projectile = id; break; } - } else if (player.getLevel() > (id % 10) * 20 + 9) { + } else if (chr.getLevel() > (id % 10) * 20 + 9) { projectile = id; break; } @@ -144,8 +143,8 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { } } } - boolean soulArrow = player.getBuffedValue(MapleBuffStat.SOULARROW) != null; - boolean shadowClaw = player.getBuffedValue(MapleBuffStat.SHADOW_CLAW) != null; + boolean soulArrow = chr.getBuffedValue(MapleBuffStat.SOULARROW) != null; + boolean shadowClaw = chr.getBuffedValue(MapleBuffStat.SHADOW_CLAW) != null; if (projectile != 0) { if (!soulArrow && !shadowClaw && attack.skill != 11101004 && attack.skill != 15111007 && attack.skill != 14101006) { byte bulletConsume = bulletCount; @@ -161,7 +160,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { if (projectile != 0 || soulArrow || attack.skill == 11101004 || attack.skill == 15111007 || attack.skill == 14101006) { int visProjectile = projectile; //visible projectile sent to players if (ItemConstants.isThrowingStar(projectile)) { - MapleInventory cash = player.getInventory(MapleInventoryType.CASH); + MapleInventory cash = chr.getInventory(MapleInventoryType.CASH); for (int i = 1; i <= cash.getSlotLimit(); i++) { // impose order... Item item = cash.getItem((short) i); if (item != null) { @@ -181,46 +180,46 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { case 3221001: // Pierce case 5221004: // Rapid Fire case 13111002: // KoC Hurricane - packet = MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.rangedirection, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display); + packet = MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.rangedirection, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display); break; default: - packet = MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display); + packet = MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display); break; } - player.getMap().broadcastMessage(player, packet, false, true); + chr.getMap().broadcastMessage(chr, packet, false, true); if (effect != null) { int money = effect.getMoneyCon(); if (money != 0) { int moneyMod = money / 2; money += Randomizer.nextInt(moneyMod); - if (money > player.getMeso()) { - money = player.getMeso(); + if (money > chr.getMeso()) { + money = chr.getMeso(); } - player.gainMeso(-money, false); + chr.gainMeso(-money, false); } } if (attack.skill != 0) { Skill skill = SkillFactory.getSkill(attack.skill); - MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill)); + MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); if (effect_.getCooldown() > 0) { - if (player.skillIsCooling(attack.skill)) { + if (chr.skillIsCooling(attack.skill)) { return; } else { c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown())); - player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); + chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000); } } } - if (player.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 && player.getBuffedValue(MapleBuffStat.DARKSIGHT) != null && attack.numAttacked > 0 && player.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004) { - player.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT); - player.cancelBuffStats(MapleBuffStat.DARKSIGHT); - } else if(player.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && player.getBuffedValue(MapleBuffStat.WIND_WALK) != null && attack.numAttacked > 0) { - player.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK); - player.cancelBuffStats(MapleBuffStat.WIND_WALK); + if (chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 && chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null && attack.numAttacked > 0 && chr.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004) { + chr.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT); + chr.cancelBuffStats(MapleBuffStat.DARKSIGHT); + } else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null && attack.numAttacked > 0) { + chr.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK); + chr.cancelBuffStats(MapleBuffStat.WIND_WALK); } - applyAttack(attack, player, bulletCount); + applyAttack(attack, chr, bulletCount); } } } diff --git a/src/net/server/channel/handlers/SpecialMoveHandler.java b/src/net/server/channel/handlers/SpecialMoveHandler.java index 68f6b8ee7c..df6be698bf 100644 --- a/src/net/server/channel/handlers/SpecialMoveHandler.java +++ b/src/net/server/channel/handlers/SpecialMoveHandler.java @@ -22,11 +22,9 @@ package net.server.channel.handlers; import java.awt.Point; -import java.util.concurrent.ScheduledFuture; import net.AbstractMaplePacketHandler; import server.MapleStatEffect; -import server.TimerManager; import server.life.MapleMonster; import tools.FilePrinter; import tools.MaplePacketCreator; @@ -54,25 +52,27 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler { MapleCharacter chr = c.getPlayer(); chr.getAutobanManager().setTimestamp(4, slea.readInt(), 3); int skillid = slea.readInt(); + /* - if ((!GameConstants.isPQSkillMap(c.getPlayer().getMapId()) && GameConstants.isPqSkill(skillid)) || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) { - AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit skills."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skillid + " without it being in their job.\r\n"); + if ((!GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(skillid)) || (!chr.isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, chr.getJob().getId()) && !chr.isGM())) { + AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit skills."); + FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to use skill " + skillid + " without it being in their job.\r\n"); c.disconnect(true, false); return; } - */ + */ + Point pos = null; int __skillLevel = slea.readByte(); Skill skill = SkillFactory.getSkill(skillid); int skillLevel = chr.getSkillLevel(skill); if (skillid % 10000000 == 1010 || skillid % 10000000 == 1011) { - if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging + if (chr.getDojoEnergy() < 10000) { // PE hacking or maybe just lagging return; } skillLevel = 1; - c.getPlayer().setDojoEnergy(0); - c.announce(MaplePacketCreator.getEnergy("energy", c.getPlayer().getDojoEnergy())); + chr.setDojoEnergy(0); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset.")); } if (skillLevel == 0 || skillLevel != __skillLevel) return; @@ -93,16 +93,16 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler { for (int i = 0; i < num; i++) { mobId = slea.readInt(); success = slea.readByte(); - chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showMagnet(mobId, success), false); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.showMagnet(mobId, success), false); MapleMonster monster = chr.getMap().getMonsterByOid(mobId); if (monster != null) { if (!monster.isBoss()) { - monster.switchController(c.getPlayer(), monster.isControllerHasAggro()); + monster.switchController(chr, monster.isControllerHasAggro()); } } } byte direction = slea.readByte(); - chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid), direction), false); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid), direction), false); c.announce(MaplePacketCreator.enableActions()); return; } else if (skillid == Brawler.MP_RECOVERY) {// MP Recovery @@ -116,7 +116,7 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler { chr.updateSingleStat(MapleStat.MP, chr.getMp()); } else if (skillid == Priest.DISPEL || skillid == SuperGM.HEAL_PLUS_DISPEL) { slea.skip((skillid == Priest.DISPEL) ? 10 : 11); - chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid)), false); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid)), false); } else if (skillid % 10000000 == 1004) { slea.readShort(); } @@ -126,11 +126,11 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler { } if (chr.isAlive()) { if (skill.getId() != Priest.MYSTIC_DOOR) { - skill.getEffect(skillLevel).applyTo(c.getPlayer(), pos); + skill.getEffect(skillLevel).applyTo(chr, pos); } else if(chr.canDoor()) { //update door lists chr.cancelMagicDoor(); - skill.getEffect(skillLevel).applyTo(c.getPlayer(), pos); + skill.getEffect(skillLevel).applyTo(chr, pos); } else { chr.message("Please wait 5 seconds before casting Mystic Door again."); c.announce(MaplePacketCreator.enableActions()); diff --git a/src/net/server/channel/handlers/SummonDamageHandler.java b/src/net/server/channel/handlers/SummonDamageHandler.java index ffffa235d5..9c5c8ebc4b 100644 --- a/src/net/server/channel/handlers/SummonDamageHandler.java +++ b/src/net/server/channel/handlers/SummonDamageHandler.java @@ -28,12 +28,10 @@ import client.SkillFactory; import client.status.MonsterStatusEffect; import java.util.ArrayList; import java.util.List; -import net.AbstractMaplePacketHandler; import server.MapleStatEffect; import server.life.MapleMonster; import server.maps.MapleSummon; import tools.MaplePacketCreator; -import tools.data.input.LittleEndianAccessor; import tools.data.input.SeekableLittleEndianAccessor; public final class SummonDamageHandler extends AbstractDealDamageHandler { diff --git a/src/net/server/channel/handlers/TakeDamageHandler.java b/src/net/server/channel/handlers/TakeDamageHandler.java index bb1fb15811..b27b36720f 100644 --- a/src/net/server/channel/handlers/TakeDamageHandler.java +++ b/src/net/server/channel/handlers/TakeDamageHandler.java @@ -63,7 +63,7 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { List banishPlayers = new ArrayList<>(); - MapleCharacter player = c.getPlayer(); + MapleCharacter chr = c.getPlayer(); slea.readInt(); byte damagefrom = slea.readByte(); slea.readByte(); //Element @@ -73,7 +73,7 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler { boolean is_pgmr = false, is_pg = true, is_deadly = false; int mpattack = 0; MapleMonster attacker = null; - final MapleMap map = player.getMap(); + final MapleMap map = chr.getMap(); if (damagefrom != -3 && damagefrom != -4) { monsteridfrom = slea.readInt(); oid = slea.readInt(); @@ -100,17 +100,17 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler { loseItems = assaulter.getStats().loseItem(); if (loseItems != null) { MapleInventoryType type; - final int playerpos = player.getPosition().x; + final int playerpos = chr.getPosition().x; byte d = 1; - Point pos = new Point(0, player.getPosition().y); + Point pos = new Point(0, chr.getPosition().y); for (loseItem loseItem : loseItems) { type = ItemConstants.getInventoryType(loseItem.getId()); for (byte b = 0; b < loseItem.getX(); b++) {//LOL? if (Randomizer.nextInt(101) >= loseItem.getChance()) { - if (player.haveItem(loseItem.getId())) { + if (chr.haveItem(loseItem.getId())) { pos.x = (int) (playerpos + ((d % 2 == 0) ? (25 * (d + 1) / 2) : -(25 * (d / 2)))); MapleInventoryManipulator.removeById(c, type, loseItem.getId(), 1, false, false); - map.spawnItemDrop(c.getPlayer(), c.getPlayer(), new Item(loseItem.getId(), (short) 0, (short) 1), map.calcDropPos(pos, player.getPosition()), true, true); + map.spawnItemDrop(chr, chr, new Item(loseItem.getId(), (short) 0, (short) 1), map.calcDropPos(pos, chr.getPosition()), true, true); d++; } else { break; @@ -140,123 +140,126 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler { MobAttackInfo attackInfo = MobAttackInfoFactory.getMobAttackInfo(attacker, damagefrom); if (attackInfo != null) { if (attackInfo.isDeadlyAttack()) { - mpattack = player.getMp() - 1; + mpattack = chr.getMp() - 1; is_deadly = true; } mpattack += attackInfo.getMpBurn(); MobSkill skill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel()); if (skill != null && damage > 0) { - skill.applyEffect(player, attacker, false, banishPlayers); + skill.applyEffect(chr, attacker, false, banishPlayers); } attacker.setMp(attacker.getMp() - attackInfo.getMpCon()); - if (player.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) { - int jobid = player.getJob().getId(); + if (chr.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) { + int jobid = chr.getJob().getId(); if (jobid == 212 || jobid == 222 || jobid == 232) { int id = jobid * 10000 + 1002; Skill manaReflectSkill = SkillFactory.getSkill(id); - if (player.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && player.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).makeChanceResult()) { - int bouncedamage = (damage * manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).getX() / 100); + if (chr.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && chr.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).makeChanceResult()) { + int bouncedamage = (damage * manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).getX() / 100); if (bouncedamage > attacker.getMaxHp() / 5) { bouncedamage = attacker.getMaxHp() / 5; } - map.damageMonster(player, attacker, bouncedamage); - map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), true); - player.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5)); - map.broadcastMessage(player, MaplePacketCreator.showBuffeffect(player.getId(), id, 5), false); + map.damageMonster(chr, attacker, bouncedamage); + map.broadcastMessage(chr, MaplePacketCreator.damageMonster(oid, bouncedamage), true); + chr.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5)); + map.broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), id, 5), false); } } } } } if (damage == -1) { - fake = 4020002 + (player.getJob().getId() / 10 - 40) * 100000; + fake = 4020002 + (chr.getJob().getId() / 10 - 40) * 100000; } //in dojo player cannot use pot, so deadly attacks should be turned off as well - if(is_deadly && player.getMap().isDojoMap() && !ServerConstants.USE_DEADLY_DOJO) { + if(is_deadly && chr.getMap().isDojoMap() && !ServerConstants.USE_DEADLY_DOJO) { damage = 0; mpattack = 0; } if (damage == 0) { - player.getAutobanManager().addMiss(); + chr.getAutobanManager().addMiss(); } else { - player.getAutobanManager().resetMisses(); + chr.getAutobanManager().resetMisses(); } - if (damage > 0 && !player.isHidden()) { - if (attacker != null && damagefrom == -1 && player.getBuffedValue(MapleBuffStat.POWERGUARD) != null) { // PG works on bosses, but only at half of the rate. - int bouncedamage = (int) (damage * (player.getBuffedValue(MapleBuffStat.POWERGUARD).doubleValue() / (attacker.isBoss() ? 200 : 100))); + if (damage > 0 && !chr.isHidden()) { + if (attacker != null && damagefrom == -1 && chr.getBuffedValue(MapleBuffStat.POWERGUARD) != null) { // PG works on bosses, but only at half of the rate. + int bouncedamage = (int) (damage * (chr.getBuffedValue(MapleBuffStat.POWERGUARD).doubleValue() / (attacker.isBoss() ? 200 : 100))); bouncedamage = Math.min(bouncedamage, attacker.getMaxHp() / 10); damage -= bouncedamage; - map.damageMonster(player, attacker, bouncedamage); - map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), false, true); - player.checkMonsterAggro(attacker); + map.damageMonster(chr, attacker, bouncedamage); + map.broadcastMessage(chr, MaplePacketCreator.damageMonster(oid, bouncedamage), false, true); + chr.checkMonsterAggro(attacker); } - if (attacker != null && damagefrom == -1 && player.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) { + if (attacker != null && damagefrom == -1 && chr.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) { Skill skill = SkillFactory.getSkill(Aran.BODY_PRESSURE); - final MapleStatEffect eff = skill.getEffect(player.getSkillLevel(skill)); + final MapleStatEffect eff = skill.getEffect(chr.getSkillLevel(skill)); if (!attacker.alreadyBuffedStats().contains(MonsterStatus.NEUTRALISE)) { if (!attacker.isBoss() && eff.makeChanceResult()) { - attacker.applyStatus(player, new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.NEUTRALISE, 1), skill, null, false), false, (eff.getDuration()/10) * 2, false); + attacker.applyStatus(chr, new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.NEUTRALISE, 1), skill, null, false), false, (eff.getDuration()/10) * 2, false); } } } if (damagefrom != -3 && damagefrom != -4) { int achilles = 0; Skill achilles1 = null; - int jobid = player.getJob().getId(); + int jobid = chr.getJob().getId(); if (jobid < 200 && jobid % 10 == 2) { achilles1 = SkillFactory.getSkill(jobid * 10000 + (jobid == 112 ? 4 : 5)); - achilles = player.getSkillLevel(achilles1); + achilles = chr.getSkillLevel(achilles1); } if (achilles != 0 && achilles1 != null) { damage *= (achilles1.getEffect(achilles).getX() / 1000.0); } } - Integer mesoguard = player.getBuffedValue(MapleBuffStat.MESOGUARD); - if (player.getBuffedValue(MapleBuffStat.MAGIC_GUARD) != null && mpattack == 0) { - int mploss = (int) (damage * (player.getBuffedValue(MapleBuffStat.MAGIC_GUARD).doubleValue() / 100.0)); + Integer mesoguard = chr.getBuffedValue(MapleBuffStat.MESOGUARD); + if (chr.getBuffedValue(MapleBuffStat.MAGIC_GUARD) != null && mpattack == 0) { + int mploss = (int) (damage * (chr.getBuffedValue(MapleBuffStat.MAGIC_GUARD).doubleValue() / 100.0)); int hploss = damage - mploss; - if (mploss > player.getMp()) { - hploss += mploss - player.getMp(); - mploss = player.getMp(); + + int curmp = chr.getMp(); + if (mploss > curmp) { + hploss += mploss - curmp; + mploss = curmp; } - player.addMPHP(-hploss, -mploss); + + chr.addMPHP(-hploss, -mploss); } else if (mesoguard != null) { damage = Math.round(damage / 2); int mesoloss = (int) (damage * (mesoguard.doubleValue() / 100.0)); - if (player.getMeso() < mesoloss) { - player.gainMeso(-player.getMeso(), false); - player.cancelBuffStats(MapleBuffStat.MESOGUARD); + if (chr.getMeso() < mesoloss) { + chr.gainMeso(-chr.getMeso(), false); + chr.cancelBuffStats(MapleBuffStat.MESOGUARD); } else { - player.gainMeso(-mesoloss, false); + chr.gainMeso(-mesoloss, false); } - player.addMPHP(-damage, -mpattack); + chr.addMPHP(-damage, -mpattack); } else { - if (player.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) { - if (player.getBuffedValue(MapleBuffStat.MONSTER_RIDING).intValue() == Corsair.BATTLE_SHIP) { - player.decreaseBattleshipHp(damage); + if (chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) { + if (chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING).intValue() == Corsair.BATTLE_SHIP) { + chr.decreaseBattleshipHp(damage); } } - player.addMPHP(-damage, -mpattack); + chr.addMPHP(-damage, -mpattack); } } - if (!player.isHidden()) { - map.broadcastMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false); - player.checkBerserk(true); + if (!chr.isHidden()) { + map.broadcastMessage(chr, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, chr.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false); + chr.checkBerserk(true); } else { - map.broadcastGMMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false); - player.checkBerserk(false); + map.broadcastGMMessage(chr, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, chr.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false); + chr.checkBerserk(false); } if (GameConstants.isDojo(map.getId())) { - player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_DMG); - c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy())); + chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_DMG); + c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy())); } - for (MapleCharacter chr : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :) - chr.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg()); + for (MapleCharacter player : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :) + player.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg()); } } } diff --git a/src/net/server/channel/handlers/TouchMonsterDamageHandler.java b/src/net/server/channel/handlers/TouchMonsterDamageHandler.java index 34f98368c2..fc2cd68b6e 100644 --- a/src/net/server/channel/handlers/TouchMonsterDamageHandler.java +++ b/src/net/server/channel/handlers/TouchMonsterDamageHandler.java @@ -21,16 +21,17 @@ */ package net.server.channel.handlers; -import net.server.channel.handlers.AbstractDealDamageHandler; import client.MapleBuffStat; import client.MapleClient; +import client.MapleCharacter; import tools.data.input.SeekableLittleEndianAccessor; public final class TouchMonsterDamageHandler extends AbstractDealDamageHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - if (c.getPlayer().getEnergyBar() == 15000 || c.getPlayer().getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) { - applyAttack(parseDamage(slea, c.getPlayer(), false, false), c.getPlayer(), 1); + MapleCharacter chr = c.getPlayer(); + if (chr.getEnergyBar() == 15000 || chr.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) { + applyAttack(parseDamage(slea, chr, false, false), c.getPlayer(), 1); } } } diff --git a/src/server/MapleStorageInventory.java b/src/server/MapleStorageInventory.java index f25f3566ed..5a466530e4 100644 --- a/src/server/MapleStorageInventory.java +++ b/src/server/MapleStorageInventory.java @@ -253,12 +253,12 @@ public class MapleStorageInventory { if(dst > this.getSlotLimit()) { return; } - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + Item source = this.getItem(src); if (source == null) { return; } - short slotMax = ii.getSlotMax(c, source.getItemId()); + short slotMax = MapleItemInformationProvider.getInstance().getSlotMax(c, source.getItemId()); this.move(src, dst, slotMax); }