public override bool ShouldDefend(Unit attacker, AbilityDamageInfo incDamage) { if (attacker is Pet) { return(true); } CreatureSubTypes subType = (CreatureSubTypes)Spawn.Proto.CreatureSubType; switch (incDamage.SubDamageType) { case SubDamageTypes.Oil: return(true); case SubDamageTypes.None: if (subType == CreatureSubTypes.SIEGE_RAM) { return(incDamage.StatUsed != 1); } return(incDamage.DamageType == DamageTypes.Physical && incDamage.StatUsed != 1); } return(false); }
/// <summary> /// Reduces the damage a siege weapon takes from regular types of attack. /// </summary> /// <param name="incDamage"></param> public override void ModifyDamageIn(AbilityDamageInfo incDamage) { CreatureSubTypes subType = (CreatureSubTypes)Spawn.Proto.CreatureSubType; if (subType == CreatureSubTypes.SIEGE_RAM) { switch (incDamage.SubDamageType) { case SubDamageTypes.Cleave: incDamage.DamageReduction = 0.15f; break; case SubDamageTypes.Artillery: incDamage.Mitigation = incDamage.Damage * 0.975f; incDamage.Damage *= 0.025f; break; case SubDamageTypes.Oil: incDamage.Damage = 0; incDamage.PrecalcDamage = 0; incDamage.DamageReduction = 0f; incDamage.DamageEvent = (byte)CombatEvent.COMBATEVENT_BLOCK; break; case SubDamageTypes.Cannon: if (SiegeInterface.IsDeployed) { incDamage.Mitigation = incDamage.Damage * 0.95f; incDamage.Damage *= 0.05f; } else { incDamage.Mitigation = incDamage.Damage * 0.75f; incDamage.Damage *= 0.25f; } break; case SubDamageTypes.None: switch (incDamage.DamageType) { case DamageTypes.Physical: if (incDamage.StatUsed != 1) { incDamage.Damage = 0; incDamage.PrecalcDamage = 0; incDamage.DamageReduction = 0f; incDamage.DamageEvent = (byte)CombatEvent.COMBATEVENT_BLOCK; } else { incDamage.DamageReduction *= 0.066f; } break; case DamageTypes.RawDamage: incDamage.Mitigation = incDamage.Damage * 0.99f; incDamage.Damage *= 0.01f; incDamage.PrecalcMitigation = incDamage.PrecalcDamage * 0.99f; incDamage.PrecalcDamage *= 0.01f; break; default: incDamage.DamageReduction *= 0.005f; break; } break; } } else { switch (incDamage.SubDamageType) { case SubDamageTypes.Cleave: incDamage.DamageReduction *= 0.8f; break; case SubDamageTypes.Artillery: incDamage.Mitigation = incDamage.Damage * 0.95f; incDamage.Damage *= 0.05f; break; case SubDamageTypes.Oil: incDamage.Damage = 0; incDamage.PrecalcDamage = 0; incDamage.DamageReduction = 0f; incDamage.DamageEvent = (byte)CombatEvent.COMBATEVENT_BLOCK; break; case SubDamageTypes.Cannon: incDamage.Mitigation = incDamage.Damage * 0.5f; incDamage.Damage *= 0.5f; break; case SubDamageTypes.None: switch (incDamage.DamageType) { case DamageTypes.Physical: if (incDamage.StatUsed == 8) { incDamage.Damage = 0; incDamage.PrecalcDamage = 0; incDamage.DamageReduction = 0f; incDamage.DamageEvent = (byte)CombatEvent.COMBATEVENT_BLOCK; } else { incDamage.DamageReduction *= 0.4f; } break; case DamageTypes.RawDamage: incDamage.Mitigation = incDamage.Damage * 0.5f; incDamage.Damage *= 0.5f; break; default: incDamage.DamageReduction *= 0.05f; break; } break; } } }