예제 #1
0
        public void ModifyDamage(DamagableObject target, InputDamage inputDamage)
        {
            if (nebulaObject.Type == (byte)ItemType.Avatar)
            {
                if (HasSkill(m43AID))
                {
                    var skill = GetSkillById(m43AID);
                    if (skill.isOn)
                    {
                        var m43a = skill.GetExecutor() as Skill_0000043A;
                        if (target.health < target.maximumHealth * m43a.hpPc)
                        {
                            if (false == Mathf.Approximately(m43a.dmgMult, 0f))
                            {
                                //log.InfoFormat("modify damage on {0}% with skill 43A", m43a.dmgMult);
                                inputDamage.Mult(m43a.dmgMult);
                                //return inputDamage;
                            }
                        }
                    }
                }
            }

            //return inputDamage;
        }
예제 #2
0
 public virtual InputDamage ReceiveDamage(InputDamage inputDamage)
 {
     nebulaObject.SetInvisibility(false);
     if (mBonuses)
     {
         inputDamage.Mult((1.0f + mBonuses.inputDamagePcBonus));
         //inputDamage.SetDamage(inputDamage.damage * (1.0f + mBonuses.inputDamagePcBonus));
         ApplyReflection(inputDamage);
     }
     if (inputDamage.hasDamager)
     {
         var damagerBons = inputDamage.source.Bonuses();
         if (damagerBons)
         {
             float vampPc     = damagerBons.vampirismPcBonus;
             float hp         = inputDamage.totalDamage * vampPc;
             var   dDamagable = inputDamage.source.Damagable();
             if (dDamagable)
             {
                 dDamagable.Heal(new InputHeal(hp));
             }
         }
     }
     return(inputDamage);
 }
예제 #3
0
        private void ApplyDamage(ref WeaponHitInfo hit, DamagableObject target, float damageMult, bool useDamageMultSelfAsDamage, InputDamage inputDamage)
        {
            inputDamage.Mult(damageMult * Rand.NormalNumber(0.8f, 1.2f));

            if (useDamageMultSelfAsDamage)
            {
                WeaponDamage dmg = new WeaponDamage(inputDamage.weaponBaseType, 0, 0, 0);
                dmg.SetBaseTypeDamage(damageMult);
                inputDamage.CopyValues(dmg);
            }

            if (cachedSkills)
            {
                cachedSkills.ModifyDamage(target, inputDamage);
            }

            int  level    = 1;
            byte workshop = (byte)Workshop.Arlen;
            byte race     = (byte)Race.None;

            level    = cachedCharacter.level;
            workshop = cachedCharacter.workshop;

            RaceableObject raceable = nebulaObject.Raceable();

            if (raceable)
            {
                race = raceable.race;
            }

            var copy = inputDamage.CreateCopy();

            if (false == ReflectDamage(target, ref hit, inputDamage))
            {
                target.ReceiveDamage(inputDamage);
                StartDamageDron(target, inputDamage.CreateCopy(), workshop, level, race);
            }
            hit.SetRemainTargetHp(target.health);

            if (m_Achievments != null)
            {
                m_Achievments.OnMakeDamage(copy);
            }
        }
예제 #4
0
        //private float ApplyResistPassiveBonus(float inputResist) {
        //    if(nebulaObject.IsPlayer()) {
        //        if(mPassiveBonuses != null && mPassiveBonuses.resistTier > 0 ) {
        //            return Mathf.Clamp01(inputResist + mPassiveBonuses.resistBonus);
        //        }
        //    }
        //    return inputResist;
        //}

        public override InputDamage ReceiveDamage(InputDamage inputDamage)
        {
            //firs call base behaviour
            inputDamage = base.ReceiveDamage(inputDamage);

            if (!nebulaObject)
            {
                inputDamage.ClearAllDamages();
                //inputDamage.SetDamage(0.0f);
                return(inputDamage);
            }

            nebulaObject.SendMessage(ComponentMessages.InCombat);

            if (ignoreDamageAtStart || god)
            {
                //if (GetComponent<MmoActor>()) {
                //    log.Info("player damage ignored");
                //}
                //return 0f;
                inputDamage.ClearAllDamages();
                //inputDamage.SetDamage(0.0f);
                return(inputDamage);
            }
            //if(god) {
            //    //log.Info("ShipBasedDamagableObject is GOD, return 0 damage");
            //    return 0f;
            //}

            if (mShip == null)
            {
                mShip = GetComponent <BaseShip>();
            }
            float resist       = 0f;
            float acidResist   = 0.0f;
            float laserResist  = 0.0f;
            float rocketResist = 0.0f;

            if (mShip != null)
            {
                resist       = mShip.commonResist;
                acidResist   = mShip.acidResist;
                laserResist  = mShip.laserResist;
                rocketResist = mShip.rocketResist;
            }
            //resist = ApplyResistPassiveBonus(resist);

            inputDamage.Mult(1.0f - Mathf.Clamp01(resist));

            inputDamage.Mult(WeaponBaseType.Acid, 1.0f - Mathf.Clamp01(acidResist));
            inputDamage.Mult(WeaponBaseType.Laser, 1.0f - Mathf.Clamp01(laserResist));
            inputDamage.Mult(WeaponBaseType.Rocket, 1.0f - Mathf.Clamp01(rocketResist));

            //inputDamage.SetDamage(inputDamage.damage * (1.0f - Mathf.Clamp01(resist)));
            AbsorbDamage(inputDamage);
            //inputDamage.CopyValues(AbsorbDamage(inputDamage.damage));

            if (!god)
            {
                if (mBonuses)
                {
                    if (mBonuses.isImmuneToDamage)
                    {
                        inputDamage.ClearAllDamages();
                        //inputDamage.SetDamage(0f);
                    }
                }

                if (nebulaObject.IsPlayer())
                {
                    mTarget.MoveDamageToSubscriber(inputDamage);
                }
                SubHealth(inputDamage.totalDamage);
            }

            if (inputDamage.hasDamager)
            {
                AddDamager(
                    inputDamage.sourceId,
                    inputDamage.sourceType,
                    inputDamage.totalDamage,
                    (byte)inputDamage.workshop,
                    inputDamage.level,
                    (byte)inputDamage.race,
                    inputDamage.source);
            }

            //if(mEventedObject != null && inputDamage.hasDamager) {
            //    mEventedObject.ReceiveDamage(new DamageInfo(inputDamage.sourceId, inputDamage.sourceType, inputDamage.damage, (byte)inputDamage.workshop, inputDamage.level, (byte)inputDamage.race));
            //}

            if (health <= 0f)
            {
                if (NotRespawnBySkill())
                {
                    SetWasKilled(true);
                }
                else
                {
                    if (nebulaObject.Type == (byte)ItemType.Avatar)
                    {
                        if (m_Message)
                        {
                            m_Message.ResurrectBySkillEffect();
                        }
                    }
                }
            }
            return(inputDamage);
        }