Esempio n. 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);
            }
        }
Esempio n. 2
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();

            string id = skill.data.Id.ToString();

            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 dmgMultArea = skill.data.Inputs.Value <float>("dmg_area_mult");
            float radius      = skill.data.Inputs.Value <float>("radius");

            var sourceWeapon = source.GetComponent <BaseWeapon>();
            var targetComp   = source.GetComponent <PlayerTarget>();
            var sourceChar   = source.GetComponent <CharacterObject>();

            var targetObj = targetComp.targetObject;

            bool mastery = RollMastery(source);

            if (mastery)
            {
                dmgMult *= 2;
            }
            WeaponHitInfo hit;
            var           shotInfo = sourceWeapon.GetComponent <BaseWeapon>().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.Id != targetObj.Id)
                        {
                            if (it.transform.DistanceTo(targetObj.transform) <= radius)
                            {
                                if (sourceChar.RelationTo(it.GetComponent <CharacterObject>()) == FractionRelation.Enemy)
                                {
                                    return(true);
                                }
                            }
                        }
                    }
                    return(false);
                });

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

                WeaponDamage sInpWeapDmg = new WeaponDamage(sourceWeapon.myWeaponBaseType);
                sInpWeapDmg.SetBaseTypeDamage(damage);
                InputDamage inpDamage = new InputDamage(source, sInpWeapDmg);
                if (mastery)
                {
                    inpDamage.Mult(2);
                }
                foreach (var p in items)
                {
                    p.Value.GetComponent <DamagableObject>().ReceiveDamage(inpDamage);
                }

                return(true);
            }
            else
            {
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shotInfo);
                return(false);
            }
        }