Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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;
                }
            }
        }