Example #1
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();
            info.SetSkillUseState(Common.SkillUseState.normal);
            if (ShotToEnemyRestricted(source, skill))
            {
                info.SetSkillUseState(Common.SkillUseState.invalidTarget);
                return(false);
            }
            if (NotCheckDistance(source))
            {
                info.SetSkillUseState(Common.SkillUseState.tooFar);
                return(false);
            }

            float dmgMult     = skill.GetFloatInput("dmg_mult");
            float areaDmgMult = skill.GetFloatInput("dmg_area_mult");
            float radius      = skill.GetFloatInput("radius");

            var weapon    = source.Weapon();
            var character = source.Character();
            var raceable  = source.Raceable();

            bool mastery = RollMastery(source);

            if (mastery)
            {
                dmgMult *= 2;
            }
            WeaponHitInfo hit;
            var           shot = weapon.Fire(out hit, skill.data.Id, dmgMult);

            if (hit.normalOrMissed)
            {
                source.MmoMessage().SendShot(Common.EventReceiver.OwnerAndSubscriber, shot);

                var targets = GetTargets(source, source.Target().targetObject, radius);

                var genWeapDmg = weapon.GenerateDamage();
                genWeapDmg.Mult(areaDmgMult);
                InputDamage inpDamage = new InputDamage(source, genWeapDmg);
                if (mastery)
                {
                    //inpDamage.SetDamage(inpDamage.damage * 2);
                    inpDamage.Mult(2);
                }
                foreach (var pTarget in targets)
                {
                    pTarget.Value.Damagable().ReceiveDamage(inpDamage);
                }
                return(true);
            }
            else
            {
                source.MmoMessage().SendShot(Common.EventReceiver.ItemOwner, shot);
                return(false);
            }
        }
Example #2
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();
            info.SetSkillUseState(Common.SkillUseState.normal);
            if (ShotToEnemyRestricted(source, skill))
            {
                info.SetSkillUseState(Common.SkillUseState.invalidTarget);
                return(false);
            }
            if (NotCheckDistance(source))
            {
                info.SetSkillUseState(Common.SkillUseState.tooFar);
                return(false);
            }

            float dmgMult     = skill.GetFloatInput("dmg_mult");
            float dmgAreaMult = skill.GetFloatInput("dmg_area_mult");
            float dmgPc       = skill.GetFloatInput("dmg_pc");
            float dmgTime     = skill.GetFloatInput("dmg_time");
            int   stackCount  = skill.GetIntInput("stack_count");
            float radius      = skill.GetFloatInput("radius");

            var sourceWeapon    = source.Weapon();
            var sourceBonuses   = source.Bonuses();
            var sourceMessage   = source.MmoMessage();
            var sourceCharacter = source.Character();
            var sourceRace      = source.Raceable();

            bool mastery = RollMastery(source);

            if (mastery)
            {
                dmgMult     *= 2;
                dmgAreaMult *= 2;
                dmgTime     *= 2;
            }

            WeaponHitInfo hit;
            var           shot = sourceWeapon.Fire(out hit, skill.data.Id, dmgMult);

            if (hit.normalOrMissed)
            {
                sourceMessage.SendShot(Common.EventReceiver.OwnerAndSubscriber, shot);

                var genDmg = sourceWeapon.GenerateDamage();
                genDmg.Mult(dmgAreaMult);
                InputDamage inpDamage = new InputDamage(source, genDmg);

                foreach (var pTarget in GetTargets(source, source.Target().targetObject, radius))
                {
                    pTarget.Value.Damagable().ReceiveDamage(inpDamage);
                    if (sourceBonuses.GetBuffCountWithTag(Common.BonusType.increase_damage_on_pc, skill.data.Id) < stackCount)
                    {
                        Buff buff = new Buff(Guid.NewGuid().ToString(), null, Common.BonusType.increase_damage_on_pc, dmgTime, dmgPc);
                        buff.SetTag(skill.data.Id);
                        sourceBonuses.SetBuff(buff, source);
                    }
                }
                return(true);
            }
            else
            {
                sourceMessage.SendShot(Common.EventReceiver.ItemOwner, shot);
                return(false);
            }
        }
Example #3
0
 protected override void AbsorbDamage(InputDamage inputDamage)
 {
     base.AbsorbDamage(inputDamage);
 }
Example #4
0
 public override InputDamage ReceiveDamage(InputDamage inputDamage)
 {
     return(base.ReceiveDamage(inputDamage));
 }
Example #5
0
 protected override void ModifyDamage(InputDamage damage)
 {
     base.ModifyDamage(damage);
 }
Example #6
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();

            info.SetSkillUseState(SkillUseState.normal);
            if (!CheckForShotEnemy(source, skill))
            {
                info.SetSkillUseState(SkillUseState.invalidTarget);
                return(false);
            }

            if (NotCheckDistance(source))
            {
                info.SetSkillUseState(SkillUseState.tooFar);
                return(false);
            }
            float dmgMult  = skill.data.Inputs.Value <float>("dmg_mult");
            float dmg2Mult = skill.data.Inputs.Value <float>("dmg2_mult");
            float radius   = skill.data.Inputs.Value <float>("radius");

            var sourceWeapon  = source.GetComponent <BaseWeapon>();
            var sourceChar    = source.GetComponent <CharacterObject>();
            var targetBonuses = source.GetComponent <PlayerTarget>().targetObject.GetComponent <PlayerBonuses>();

            bool mastery = RollMastery(source);

            if (mastery)
            {
                dmgMult  *= 2;
                dmg2Mult *= 2;
            }

            WeaponHitInfo hit;
            var           shotInfo = sourceWeapon.Fire(out hit, skill.data.Id, dmgMult);

            if (hit.normalOrMissed)
            {
                var items = (source.world as MmoWorld).GetItems((it) => {
                    if (it.GetComponent <DamagableObject>() && it.GetComponent <CharacterObject>())
                    {
                        if (it.Id != targetBonuses.nebulaObject.Id)
                        {
                            if (sourceChar.RelationTo(it.GetComponent <CharacterObject>()) == FractionRelation.Enemy)
                            {
                                return(true);
                            }
                        }
                    }
                    return(false);
                });

                float minDist    = float.MaxValue;
                Item  targetItem = null;
                foreach (var p in items)
                {
                    float cdist = p.Value.transform.DistanceTo(targetBonuses.transform);
                    if (cdist < minDist)
                    {
                        minDist    = cdist;
                        targetItem = p.Value;
                    }
                }

                if (targetItem && (minDist < radius))
                {
                    float        dmg         = sourceWeapon.GetDamage(false).totalDamage *dmg2Mult;
                    WeaponDamage sInpWeapDmg = new WeaponDamage(sourceWeapon.myWeaponBaseType);
                    sInpWeapDmg.SetBaseTypeDamage(dmg);
                    InputDamage inpDamage = new InputDamage(source, sInpWeapDmg);
                    targetItem.GetComponent <DamagableObject>().ReceiveDamage(inpDamage);
                }

                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shotInfo);
                return(true);
            }
            else
            {
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shotInfo);
                return(false);
            }
        }
Example #7
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();
            if (!source)
            {
                return(false);
            }
            if (NotEnemyCheck(source, skill, info))
            {
                return(false);
            }

            var sourceWeapon    = source.GetComponent <ShipWeapon>();
            var sourceCharacter = source.GetComponent <CharacterObject>();
            var race            = source.GetComponent <RaceableObject>();

            float dmgMult       = skill.data.Inputs.Value <float>("dmg_mult");
            float secondDmgMult = skill.data.Inputs.Value <float>("second_dmg_mult");
            float radius        = skill.data.Inputs.Value <float>("radius");
            float time          = skill.data.Inputs.Value <float>("time");

            var targetObject = source.GetComponent <PlayerTarget>().targetObject;

            bool mastery = RollMastery(source);

            if (mastery)
            {
                dmgMult       *= 2;
                secondDmgMult *= 2;
                time          *= 2;
            }

            WeaponHitInfo hit;
            var           shotInfo = sourceWeapon.Fire(out hit, skill.data.Id, dmgMult);

            if (hit.normalOrMissed)
            {
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shotInfo);

                var items = (source.world as MmoWorld).GetItems((it) => {
                    if (it.GetComponent <DamagableObject>() && it.GetComponent <CharacterObject>())
                    {
                        if (it.transform.DistanceTo(targetObject.transform) < radius)
                        {
                            if (sourceCharacter.RelationTo(it.GetComponent <CharacterObject>()) == FractionRelation.Enemy)
                            {
                                return(true);
                            }
                        }
                    }
                    return(false);
                });

                float curTime = Time.curtime();

                float damage = sourceWeapon.GetDamage(false).totalDamage *dmgMult;

                WeaponDamage wd = new WeaponDamage(sourceWeapon.myWeaponBaseType);
                wd.SetBaseTypeDamage(damage);
                InputDamage inpDamage = new InputDamage(source, wd);
                foreach (var pair in items)
                {
                    if (pair.Value.Id != targetObject.Id)
                    {
                        pair.Value.GetComponent <DamagableObject>().ReceiveDamage(inpDamage);
                    }

                    sourceWeapon.AddAdditionalDamager(pair.Value.Id, new ShipWeapon.AdditionalDamage {
                        damageMult = secondDmgMult, expireTime = curTime + time
                    });
                }
                return(true);
            }
            else
            {
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shotInfo);
                return(false);
            }
        }
Example #8
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();
            var weapon = source.Weapon();

            var targets = GetTargets(source, source, weapon.optimalDistance);

            if (targets.Count == 0)
            {
                return(false);
            }

            ConcurrentBag <Item> filteredTargets = new ConcurrentBag <Item>();

            foreach (var pItem in targets)
            {
                filteredTargets.Add(pItem.Value);
                if (filteredTargets.Count >= 3)
                {
                    break;
                }
            }

            float dmgMult     = skill.GetFloatInput("dmg_mult");
            float dmgAreaMult = skill.GetFloatInput("dmg_area_mult");
            float radius      = skill.GetFloatInput("radius");

            float damagePerTarget = dmgMult / filteredTargets.Count;
            var   sourceMessage   = source.MmoMessage();

            var sourceCharacter = source.Character();
            var sourceRace      = source.Raceable();

            bool mastery = RollMastery(source);

            if (mastery)
            {
                damagePerTarget *= 2;
                dmgAreaMult     *= 2;
            }

            foreach (var target in filteredTargets)
            {
                WeaponHitInfo hit;
                var           shot = weapon.Fire(target, out hit, skill.data.Id, damagePerTarget);
                if (hit.normalOrMissed)
                {
                    sourceMessage.SendShot(Common.EventReceiver.OwnerAndSubscriber, shot);

                    var nearItems = GetTargets(source, target, radius);

                    WeaponDamage wd = weapon.GenerateDamage();
                    wd.Mult(dmgAreaMult);
                    InputDamage inpDamage = new InputDamage(source, wd);
                    foreach (var pNear in nearItems)
                    {
                        if (NoId(filteredTargets, pNear.Key))
                        {
                            pNear.Value.Damagable().ReceiveDamage(inpDamage);
                        }
                    }
                }
                else
                {
                    sourceMessage.SendShot(Common.EventReceiver.ItemOwner, shot);
                }
            }
            return(true);
        }