package handling.channel.handler; import client.MapleBuffStat; import client.MapleCharacter; import client.MapleClient; import client.PlayerStats; import client.Skill; import client.SkillFactory; import client.inventory.MapleInventoryType; import client.status.MonsterStatus; import client.status.MonsterStatusEffect; import java.awt.Point; import server.MapleStatEffect; import server.Randomizer; import server.life.MapleMonster; import server.life.MobAttackInfo; import server.life.MobSkill; import server.life.MobSkillFactory; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.Pair; import tools.data.input.SeekableLittleEndianAccessor; public class TakeDamageHandler { /** * 玩家受到伤害 * @param slea * @param c * @param chr */ public static void TakeDamage(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // 1E // FF // 07 00 00 00 // 00 A2 86 01 // 00 35 FC 01 00 00 00 //TODO 修复反射伤害给怪物 还有其他的掉血类型 // 1E FE 19 00 00 00 00 00 高处掉落下来扣血 if ((chr == null) || (chr.getMap() == null) || (chr.isHidden())) { c.getSession().write(MaplePacketCreator.enableActions()); return; } byte type = slea.readByte(); int damage = slea.readInt(); boolean isDeadlyAttack = false; boolean pPhysical = false; int oid = 0; int monsteridfrom = 0; int fake = 0; int mpattack = 0; byte direction = 0; int pOid = 0; int pDamage = 0; byte pType = 0; Point pPos = new Point(0, 0); MapleMonster attacker = null; PlayerStats stats = chr.getStat(); if (chr.isShowPacket()) { chr.dropMessage(5, "受伤类型: " + type + " 受伤数值: " + damage); } if (type == -1) { // 怪物伤害 slea.readByte(); oid = slea.readInt(); attacker = chr.getMap().getMonsterByOid(oid); // MapleStatEffect.applyDoubleDefense(chr); if ((attacker == null)) { chr.dropMessage(5, "攻击着为空!"); return; } } else if (type == -2) { // 高处掉落扣血 slea.readShort(); } // if (stats.reduceDamageRate > 0) { // damage = (int) (damage - damage * (stats.reduceDamageRate / 100.0D)); // } // Pair modify = chr.modifyDamageTaken(damage, attacker); // damage = ((Double) modify.left).intValue(); if (chr.isShowPacket()) { chr.dropMessage(5, "最终受到伤害 " + damage); } if (damage > 0) { if (chr.getBuffedValue(MapleBuffStat.变身术) != null) { chr.cancelMorphs(); } boolean mpAttack = false; if (chr.getBuffedValue(MapleBuffStat.魔法盾) != null) { int hploss = 0; int mploss = 0; if (isDeadlyAttack) { if (stats.getHp() > 1) { hploss = stats.getHp() - 1; } if (stats.getMp() > 1) { mploss = stats.getMp() - 1; } chr.addMPHP(-hploss, -mploss); } else { mploss = (int) (damage * (chr.getBuffedValue(MapleBuffStat.魔法盾).doubleValue() / 100.0D)) + mpattack; hploss = damage - mploss; if (mploss > stats.getMp()) { mploss = stats.getMp(); hploss = damage - mploss + mpattack; } chr.addMPHP(-hploss, -mploss); } } else if (chr.getBuffedValue(MapleBuffStat.金钱护盾) != null) { int mesoloss = (int) Math.ceil(damage * chr.getStat().mesoGuard / 100.0D); if (chr.getStat().mesoGuardMeso >= mesoloss) { chr.getStat().mesoGuardMeso = chr.getStat().mesoGuardMeso - mesoloss; } else { chr.getStat().mesoGuardMeso = 0; chr.cancelBuffStats(new MapleBuffStat[]{MapleBuffStat.金钱护盾}); } damage = damage - mesoloss; if (chr.isShowPacket()) { chr.dropMessage(5, "金钱护盾 - 最终伤害: " + damage + " 减少金币: " + mesoloss); } if (chr.getMeso() < mesoloss) { chr.gainMeso(-chr.getMeso(), false); chr.cancelBuffStats(new MapleBuffStat[]{MapleBuffStat.金钱护盾}); } else { chr.gainMeso(-mesoloss, false); } if ((isDeadlyAttack) && (stats.getMp() > 1)) { mpattack = stats.getMp() - 1; } chr.addMPHP(-damage, -mpattack); } else if (isDeadlyAttack) { chr.addMPHP(stats.getHp() > 1 ? -(stats.getHp() - 1) : 0, (stats.getMp() > 1) && (!mpAttack) ? -(stats.getMp() - 1) : 0); } else { chr.addMPHP(-damage, mpAttack ? 0 : -mpattack); } } byte offset = 0; int offset_d = 0; if (chr.isShowPacket()) { chr.dropMessage(5, "玩家掉血 - 类型: " + type + " 怪物ID: " + monsteridfrom + " 伤害: " + damage + " fake: " + fake + " direction: " + direction + " oid: " + oid + " offset: " + offset); } c.getSession().write(MaplePacketCreator.enableActions()); chr.getMap().broadcastMessage(chr, MaplePacketCreator.damagePlayer(chr.getId(), type, damage, monsteridfrom, direction, 0, pDamage, pPhysical, pOid, pType, pPos, offset, offset_d, fake), false); } }