diff --git a/src/engine/gameManager/CombatManager.java b/src/engine/gameManager/CombatManager.java index 56dc7890..f5b2b75d 100644 --- a/src/engine/gameManager/CombatManager.java +++ b/src/engine/gameManager/CombatManager.java @@ -86,9 +86,9 @@ public enum CombatManager { // heck if character can even attack yet - if (attacker.getTimestamps().containsKey("Attack" + slot.name())) - if (System.currentTimeMillis() < attacker.getTimestamps().get("Attack" + slot.name())) - return; + //if (attacker.getTimestamps().containsKey("Attack" + slot.name())) + // if (System.currentTimeMillis() < attacker.getTimestamps().get("Attack" + slot.name())) + // return; // check if character is in range to attack target @@ -114,19 +114,19 @@ public enum CombatManager { boolean inRange = false; - float attackerHitbox = attacker.calcHitBox(); + attackRange += attacker.calcHitBox(); switch(target.getObjectType()){ case PlayerCharacter: case Mob: - float targetHitbox = ((AbstractCharacter)target).calcHitBox(); - if(distanceSquared < ((attackRange + attackerHitbox + targetHitbox) * 2)) + attackRange += ((AbstractCharacter)target).calcHitBox(); + if(distanceSquared < attackRange * 2) inRange = true; break; case Building: float locX = target.loc.x - target.getBounds().getHalfExtents().x; float locZ = target.loc.z - target.getBounds().getHalfExtents().y; - float sizeX = (target.getBounds().getHalfExtents().x + attackRange + attackerHitbox) * 2; - float sizeZ = (target.getBounds().getHalfExtents().y + attackRange + attackerHitbox) * 2; + float sizeX = (target.getBounds().getHalfExtents().x + attackRange) * 2; + float sizeZ = (target.getBounds().getHalfExtents().y + attackRange) * 2; Rectangle2D.Float rect = new Rectangle2D.Float(locX,locZ,sizeX,sizeZ); if(rect.contains(new Point2D.Float(attacker.loc.x,attacker.loc.z))) inRange = true; @@ -134,213 +134,213 @@ public enum CombatManager { } - if (!inRange) - return; + if (inRange) { - // take stamina away from attacker + // take stamina away from attacker - if (weapon != null) { - float stam = weapon.template.item_wt / 3f; - stam = (stam < 1) ? 1 : stam; - attacker.modifyStamina(-(stam), attacker, true); - } else - attacker.modifyStamina(-0.5f, attacker, true); + if (weapon != null) { + float stam = weapon.template.item_wt / 3f; + stam = (stam < 1) ? 1 : stam; + attacker.modifyStamina(-(stam), attacker, true); + } else + attacker.modifyStamina(-0.5f, attacker, true); - //cancel things that are cancelled by an attack + //cancel things that are cancelled by an attack - attacker.cancelOnAttackSwing(); + attacker.cancelOnAttackSwing(); - //declare relevant variables + //declare relevant variables - int min = attacker.minDamageHandOne; - int max = attacker.maxDamageHandOne; - int atr = attacker.atrHandOne; + int min = attacker.minDamageHandOne; + int max = attacker.maxDamageHandOne; + int atr = attacker.atrHandOne; - //get the proper stats based on which slot is attacking + //get the proper stats based on which slot is attacking - if (slot == mbEnums.EquipSlotType.LHELD) { - min = attacker.minDamageHandTwo; - max = attacker.maxDamageHandTwo; - atr = attacker.atrHandTwo; - } + if (slot == mbEnums.EquipSlotType.LHELD) { + min = attacker.minDamageHandTwo; + max = attacker.maxDamageHandTwo; + atr = attacker.atrHandTwo; + } - int def = 0; + int def = 0; - if (AbstractCharacter.IsAbstractCharacter(target)) - def = ((AbstractCharacter) target).defenseRating; + if (AbstractCharacter.IsAbstractCharacter(target)) + def = ((AbstractCharacter) target).defenseRating; - //calculate hit chance based off ATR and DEF + //calculate hit chance based off ATR and DEF - int hitChance; - if (def == 0) - def = 1; - float dif = atr / def; + int hitChance; + if (def == 0) + def = 1; + float dif = atr / def; - if (dif <= 0.8f) - hitChance = 4; - else - hitChance = ((int) (450 * (dif - 0.8f)) + 4); + if (dif <= 0.8f) + hitChance = 4; + else + hitChance = ((int) (450 * (dif - 0.8f)) + 4); - if (target.getObjectType() == mbEnums.GameObjectType.Building) - hitChance = 100; + if (target.getObjectType() == mbEnums.GameObjectType.Building) + hitChance = 100; - int passiveAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD)); - if (attacker.charItemManager.getEquipped().get(slot) != null) { - passiveAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, true); - } + int passiveAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD)); + if (attacker.charItemManager.getEquipped().get(slot) != null) { + passiveAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, true); + } - if (ThreadLocalRandom.current().nextInt(100) > hitChance) { - TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim); + if (ThreadLocalRandom.current().nextInt(100) > hitChance) { + TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim); - if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) - DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); - else - DispatchMessage.sendToAllInRange(attacker, msg); + if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) + DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); + else + DispatchMessage.sendToAllInRange(attacker, msg); - return; - } + return; + } - //calculate passive chances only if target is AbstractCharacter + //calculate passive chances only if target is AbstractCharacter - if (EnumSet.of(mbEnums.GameObjectType.PlayerCharacter, mbEnums.GameObjectType.NPC, mbEnums.GameObjectType.Mob).contains(target.getObjectType())) { - mbEnums.PassiveType passiveType = mbEnums.PassiveType.None; - int hitRoll = ThreadLocalRandom.current().nextInt(100); + if (EnumSet.of(mbEnums.GameObjectType.PlayerCharacter, mbEnums.GameObjectType.NPC, mbEnums.GameObjectType.Mob).contains(target.getObjectType())) { + mbEnums.PassiveType passiveType = mbEnums.PassiveType.None; + int hitRoll = ThreadLocalRandom.current().nextInt(100); - float dodgeChance = ((AbstractCharacter) target).getPassiveChance("Dodge", attacker.getLevel(), true); - float blockChance = ((AbstractCharacter) target).getPassiveChance("Block", attacker.getLevel(), true); - float parryChance = ((AbstractCharacter) target).getPassiveChance("Parry", attacker.getLevel(), true); + float dodgeChance = ((AbstractCharacter) target).getPassiveChance("Dodge", attacker.getLevel(), true); + float blockChance = ((AbstractCharacter) target).getPassiveChance("Block", attacker.getLevel(), true); + float parryChance = ((AbstractCharacter) target).getPassiveChance("Parry", attacker.getLevel(), true); - // Passive chance clamped at 75 + // Passive chance clamped at 75 - dodgeChance = Math.max(0, Math.min(75, dodgeChance)); - blockChance = Math.max(0, Math.min(75, blockChance)); - parryChance = Math.max(0, Math.min(75, parryChance)); + dodgeChance = Math.max(0, Math.min(75, dodgeChance)); + blockChance = Math.max(0, Math.min(75, blockChance)); + parryChance = Math.max(0, Math.min(75, parryChance)); - if (hitRoll < dodgeChance) - passiveType = mbEnums.PassiveType.Dodge; - else if (hitRoll < blockChance) - passiveType = mbEnums.PassiveType.Block; - else if (hitRoll < parryChance) - passiveType = mbEnums.PassiveType.Parry; + if (hitRoll < dodgeChance) + passiveType = mbEnums.PassiveType.Dodge; + else if (hitRoll < blockChance) + passiveType = mbEnums.PassiveType.Block; + else if (hitRoll < parryChance) + passiveType = mbEnums.PassiveType.Parry; - if (passiveType.equals(mbEnums.PassiveType.None) == false) { - TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value); + if (passiveType.equals(mbEnums.PassiveType.None) == false) { + TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value); - if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) - DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); - else - DispatchMessage.sendToAllInRange(attacker, msg); + if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter) + DispatchMessage.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); + else + DispatchMessage.sendToAllInRange(attacker, msg); - return; + return; + } } - } - //calculate the base damage - int damage = ThreadLocalRandom.current().nextInt(min, max + 1); - if (damage == 0) - return; + //calculate the base damage + int damage = ThreadLocalRandom.current().nextInt(min, max + 1); + if (damage == 0) + return; - //get the damage type + //get the damage type - mbEnums.DamageType damageType; + mbEnums.DamageType damageType; - if (attacker.charItemManager.getEquipped().get(slot) == null) { - damageType = mbEnums.DamageType.CRUSHING; - if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) - if (((Mob) attacker).isSiege()) - damageType = mbEnums.DamageType.SIEGE; - } else { - damageType = (mbEnums.DamageType) attacker.charItemManager.getEquipped().get(slot).template.item_weapon_damage.keySet().toArray()[0]; - } + if (attacker.charItemManager.getEquipped().get(slot) == null) { + damageType = mbEnums.DamageType.CRUSHING; + if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) + if (((Mob) attacker).isSiege()) + damageType = mbEnums.DamageType.SIEGE; + } else { + damageType = (mbEnums.DamageType) attacker.charItemManager.getEquipped().get(slot).template.item_weapon_damage.keySet().toArray()[0]; + } - //get resists + //get resists - Resists resists; + Resists resists; - if (AbstractCharacter.IsAbstractCharacter(target) == false) - resists = ((Building) target).getResists(); //this is a building - else - resists = ((AbstractCharacter) target).getResists(); //this is a character + if (AbstractCharacter.IsAbstractCharacter(target) == false) + resists = ((Building) target).getResists(); //this is a building + else + resists = ((AbstractCharacter) target).getResists(); //this is a character - if (AbstractCharacter.IsAbstractCharacter(target)) { - AbstractCharacter absTarget = (AbstractCharacter) target; + if (AbstractCharacter.IsAbstractCharacter(target)) { + AbstractCharacter absTarget = (AbstractCharacter) target; - //check damage shields + //check damage shields - PlayerBonuses bonuses = absTarget.getBonuses(); + PlayerBonuses bonuses = absTarget.getBonuses(); - if (bonuses != null) { + if (bonuses != null) { - ConcurrentHashMap damageShields = bonuses.getDamageShields(); - float total = 0; + ConcurrentHashMap damageShields = bonuses.getDamageShields(); + float total = 0; - for (DamageShield ds : damageShields.values()) { + for (DamageShield ds : damageShields.values()) { - //get amount to damage back + //get amount to damage back - float amount; + float amount; - if (ds.usePercent()) - amount = damage * ds.getAmount() / 100; - else - amount = ds.getAmount(); + if (ds.usePercent()) + amount = damage * ds.getAmount() / 100; + else + amount = ds.getAmount(); - //get resisted damage for damagetype + //get resisted damage for damagetype - if (resists != null) - amount = resists.getResistedDamage(absTarget, attacker, ds.getDamageType(), amount, 0); - total += amount; - } + if (resists != null) + amount = resists.getResistedDamage(absTarget, attacker, ds.getDamageType(), amount, 0); + total += amount; + } - if (total > 0) { - //apply Damage back - attacker.modifyHealth(-total, absTarget, true); - TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0); - DispatchMessage.sendToAllInRange(target, cmm); + if (total > 0) { + //apply Damage back + attacker.modifyHealth(-total, absTarget, true); + TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0); + DispatchMessage.sendToAllInRange(target, cmm); + } } - } - if (resists != null) { + if (resists != null) { - //check for damage type immunities + //check for damage type immunities - if (resists.immuneTo(damageType)) - return; + if (resists.immuneTo(damageType)) + return; - //calculate resisted damage including fortitude + //calculate resisted damage including fortitude - damage = (int) resists.getResistedDamage(attacker, (AbstractCharacter) target, damageType, damage, 0); + damage = (int) resists.getResistedDamage(attacker, (AbstractCharacter) target, damageType, damage, 0); + } } - } - //remove damage from target health + //remove damage from target health - if (damage > 0) { + if (damage > 0) { - if (AbstractCharacter.IsAbstractCharacter(target)) - ((AbstractCharacter) target).modifyHealth(-damage, attacker, true); - else - ((Building) target).setCurrentHitPoints(target.getCurrentHitpoints() - damage); + if (AbstractCharacter.IsAbstractCharacter(target)) + ((AbstractCharacter) target).modifyHealth(-damage, attacker, true); + else + ((Building) target).setCurrentHitPoints(target.getCurrentHitpoints() - damage); - int attackAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD)); - if (attacker.charItemManager.getEquipped().get(slot) != null) { - attackAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, slot.equals(mbEnums.EquipSlotType.RHELD)); + int attackAnim = getSwingAnimation(null, null, slot.equals(mbEnums.EquipSlotType.RHELD)); + if (attacker.charItemManager.getEquipped().get(slot) != null) { + attackAnim = getSwingAnimation(attacker.charItemManager.getEquipped().get(slot).template, null, slot.equals(mbEnums.EquipSlotType.RHELD)); + } + TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim); + DispatchMessage.sendToAllInRange(target, cmm); } - TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim); - DispatchMessage.sendToAllInRange(target, cmm); - } - DeferredPowerJob dpj = null; + DeferredPowerJob dpj = null; - if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { + if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { - dpj = ((PlayerCharacter) attacker).getWeaponPower(); + dpj = ((PlayerCharacter) attacker).getWeaponPower(); - if (dpj != null) { - dpj.attack(target, attackRange); + if (dpj != null) { + dpj.attack(target, attackRange); - if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) - ((PlayerCharacter) attacker).setWeaponPower(dpj); + if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) + ((PlayerCharacter) attacker).setWeaponPower(dpj); + } } } //calculate next allowed attack and update the timestamp