Esempio n. 1
0
        private bool AddToGroup(NebulaObject obj, List <NebulaObject> groupObjects)
        {
            var character = obj.GetComponent <PlayerCharacterObject>();

            if (character != null && character.hasGroup)
            {
                if (false == ContainsGroupObject(groupObjects, obj))
                {
                    groupObjects.Add(obj);
                }

                foreach (var member in character.group.members)
                {
                    NebulaObject go;
                    if (obj.mmoWorld().TryGetObject((byte)ItemType.Avatar, member.Value.gameRefID, out go))
                    {
                        if (false == ContainsGroupObject(groupObjects, go))
                        {
                            groupObjects.Add(go);
                        }
                    }
                }
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        protected ConcurrentDictionary <string, Item> GetTargets(NebulaObject source, NebulaObject centerObject, float radius)
        {
            var sourceCharacter = source.Character();

            return(source.mmoWorld().GetItems((item) => {
                if (centerObject.transform.DistanceTo(item.transform) < radius)
                {
                    var damagable = item.Damagable();
                    var bonuses = item.Bonuses();
                    var character = item.Character();
                    bool allComponentsPresent = damagable && bonuses && character;

                    if (allComponentsPresent)
                    {
                        if (item.Id != centerObject.Id && (item.Id != source.Id))
                        {
                            var relation = sourceCharacter.RelationTo(character);
                            if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral)
                            {
                                return true;
                            }
                            //}
                        }
                    }
                }
                return false;
            }));
        }
Esempio n. 3
0
        /// <summary>
        /// Get items which allowed be targets on healing when used area healing
        /// </summary>
        /// <param name="source">Who healed</param>
        /// <param name="target">What center object</param>
        /// <param name="radius">Radius where see items</param>
        /// <returns>Return dictionary of founded items</returns>
        protected ConcurrentDictionary <string, Item> GetHealTargets(NebulaObject source, NebulaObject target, float radius)
        {
            var sourceCharacter = source.Character();

            return(source.mmoWorld().GetItems((item) => {
                float distance = target.transform.DistanceTo(item.transform);
                if (distance < radius)
                {
                    var itemDamagable = item.Damagable();
                    var itemCharacter = item.Character();
                    var itemBonuses = item.Bonuses();
                    bool allItemComponentsPresent = itemDamagable && itemCharacter && itemBonuses;
                    if (allItemComponentsPresent)
                    {
                        if (item.Id != target.Id && (item.Id != source.Id))
                        {
                            var relation = sourceCharacter.RelationTo(itemCharacter);
                            if (relation == FractionRelation.Friend)
                            {
                                return true;
                            }
                        }
                    }
                }
                return false;
            }));
        }
Esempio n. 4
0
 public static bool IAmBotAndNoPlayers(this NebulaObject nebulaObject)
 {
     if (nebulaObject.IAmBot())
     {
         if (nebulaObject.mmoWorld().playerCountOnStartFrame == 0)
         {
             return(true);
         }
     }
     return(false);
 }
Esempio n. 5
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();

            float hpPc          = skill.data.Inputs.GetValue <float>("hp_pc", 0f);
            float hpAlliesPc    = skill.data.Inputs.GetValue <float>("hp_allies_pc", 0f);
            float hpRestoreTime = skill.data.Inputs.GetValue <float>("hp_pc_time", 0f);

            var selfDamagable = source.Damagable();
            var selfCharacter = source.Character();
            var selfWeapon    = source.Weapon();

            float selfRestoreHP   = selfDamagable.maximumHealth * hpPc;
            float alliesRestoreHP = selfDamagable.maximumHealth * hpAlliesPc;

            bool mastery = RollMastery(source);

            if (mastery)
            {
                selfRestoreHP   *= 2;
                alliesRestoreHP *= 2;
            }
            selfDamagable.SetRestoreHPPerSec(selfRestoreHP / hpRestoreTime, hpRestoreTime, source.Id + skill.data.Id.ToString());

            var allies = source.mmoWorld().GetItems(ItemType.Avatar, (item) => {
                if (item.Id != source.Id)
                {
                    var character = item.Character();
                    var damagable = item.Damagable();
                    if (character && damagable)
                    {
                        if (selfCharacter.RelationTo(character) == FractionRelation.Friend)
                        {
                            if (item.transform.DistanceTo(source.transform) < selfWeapon.optimalDistance)
                            {
                                return(true);
                            }
                        }
                    }
                }
                return(false);
            });

            foreach (var friend in allies)
            {
                friend.Value.Damagable().RestoreHealth(source, alliesRestoreHP);
            }
            return(true);
        }
Esempio n. 6
0
        private ConcurrentDictionary <string, Item> GetNearestEnemies(NebulaObject centerObj, NebulaObject myObj, float radius)
        {
            var myCharacter = myObj.Character();

            return(centerObj.mmoWorld().GetItems(item => {
                if (item.Character() && item.Damagable() && item.Bonuses())
                {
                    if (centerObj.transform.DistanceTo(item.transform) <= radius)
                    {
                        var relation = myCharacter.RelationTo(item.Character());
                        if (relation == Common.FractionRelation.Enemy || relation == Common.FractionRelation.Neutral)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }));
        }
Esempio n. 7
0
        protected ConcurrentDictionary <string, Item> GetEnemiesAndNeutrals(NebulaObject source, float radius)
        {
            var sourceCharacter = source.Character();

            return(source.mmoWorld().GetItems((item) => {
                var damagable = item.Damagable();
                var bonuses = item.Bonuses();
                var character = item.Character();
                bool allComponentsPresent = damagable && bonuses && character;

                if (allComponentsPresent)
                {
                    var relation = sourceCharacter.RelationTo(character);
                    if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral)
                    {
                        return true;
                    }
                }
                return false;
            }));
        }
Esempio n. 8
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();

            var targetObject = source.Target().targetObject;

            if (!targetObject)
            {
                return(false);
            }

            var weapon = source.Weapon();

            if (Mathf.Approximately(weapon.HitProbTo(targetObject), 0f))
            {
                log.InfoFormat("Skill {0} error: hit prob is 0", skill.data.Id.ToString("X8"));
                return(false);
            }

            float dmgMult          = skill.GetFloatInput("dmg_mult");
            float critChanceForBot = skill.GetFloatInput("crit_chance");
            float maxCrit          = skill.GetFloatInput("max_crit");
            float time             = skill.GetFloatInput("time");
            float radius           = skill.GetFloatInput("radius");

            var character = source.Character();


            var targets = source.mmoWorld().GetItems((item) => {
                var damagable     = item.Damagable();
                var itemCharacter = item.Character();
                if (damagable && itemCharacter)
                {
                    var relation = character.RelationTo(itemCharacter);
                    if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral)
                    {
                        if (targetObject.transform.DistanceTo(item.transform) <= radius)
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            });

            bool mastery = RollMastery(source);

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

            foreach (var pTarget in targets)
            {
                WeaponHitInfo hit;
                var           shot = weapon.Fire(pTarget.Value, out hit, skill.data.Id, dmgMult, forceShot: true);
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shot);
            }

            float critChanceBuffValue = Mathf.Clamp(targets.Count * critChanceForBot, 0, maxCrit);

            if (!Mathf.Approximately(0f, critChanceBuffValue))
            {
                Buff buff = new Buff(skill.data.Id.ToString(), null, BonusType.increase_crit_chance_on_cnt, time, critChanceBuffValue);
                source.Bonuses().SetBuff(buff, source);
            }
            return(true);
        }
Esempio n. 9
0
        public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info)
        {
            info = new Hashtable();
            if (NotEnemyCheck(source, skill, info))
            {
                return(false);
            }

            var targ            = source.Target().targetObject;
            var sourceCharacter = source.Character();
            var sourceWeapon    = source.Weapon();
            var message         = source.GetComponent <MmoMessageComponent>();

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

            bool mastery = RollMastery(source);

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

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

            BonusType[] speedDebuffs = BuffUtils.GetDebuffsForParameter(BuffParameter.speed);

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

                var items = source.mmoWorld().GetItems((item) => {
                    var itemBonuses          = item.Bonuses();
                    var itemCharacter        = item.Character();
                    var itemDamagable        = item.Damagable();
                    bool allComponentPresent = itemBonuses && itemCharacter && itemDamagable;
                    if (allComponentPresent)
                    {
                        if (item.Id != targ.Id)
                        {
                            float distanceToTarg = targ.transform.DistanceTo(item.transform);
                            if (distanceToTarg <= radius)
                            {
                                if (itemBonuses.ContainsAny(speedDebuffs))
                                {
                                    var relation = sourceCharacter.RelationTo(itemCharacter);
                                    if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral)
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                    return(false);
                });

                foreach (var pitem in items)
                {
                    WeaponHitInfo itemHit;
                    var           itemShot = sourceWeapon.Fire(pitem.Value, out itemHit, skill.data.Id, dmgMult);
                    if (hit.normalOrMissed)
                    {
                        message.SendShot(EventReceiver.OwnerAndSubscriber, itemShot);
                    }
                    else
                    {
                        message.SendShot(EventReceiver.OwnerAndSubscriber, shot);
                    }
                }

                return(true);
            }
            else
            {
                source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shot);
                return(false);
            }
        }
Esempio n. 10
0
        private NebulaObject GetNearestFriend(NebulaObject centerObj, NebulaObject myObj, float radius)
        {
            var centerCharacter = centerObj.Character();
            var myCharacter     = myObj.Character();

            var playerItems = centerObj.mmoWorld().GetItems(item => {
                if (item.getItemType() == Common.ItemType.Avatar)
                {
                    if (myCharacter.RelationTo(item.Character()) == Common.FractionRelation.Friend)
                    {
                        if (item.Id != myObj.Id && item.Id != centerObj.Id)
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            });

            Item  nearestPlayerItem = null;
            float curDist           = float.MaxValue;

            foreach (var kvp in playerItems)
            {
                float dist = kvp.Value.transform.DistanceTo(centerObj.transform);
                if (dist < curDist)
                {
                    nearestPlayerItem = kvp.Value;
                    curDist           = dist;
                }
            }

            if (curDist <= radius)
            {
                if (nearestPlayerItem != null)
                {
                    return(nearestPlayerItem);
                }
            }

            var nonPlayerItems = centerObj.mmoWorld().GetItems(item => {
                if (item.getItemType() != Common.ItemType.Avatar)
                {
                    var itemCharacter = item.Character();
                    var itemDamagable = item.Damagable();
                    var itemBonuses   = item.Bonuses();
                    if (itemCharacter && itemDamagable && itemBonuses)
                    {
                        if (item.Id != myObj.Id && item.Id != centerObj.Id)
                        {
                            if (myCharacter.RelationTo(itemCharacter) == Common.FractionRelation.Friend)
                            {
                                return(true);
                            }
                        }
                    }
                }
                return(false);
            });

            Item nearestNonPlayerItem = null;

            curDist = float.MaxValue;
            foreach (var kvp in nonPlayerItems)
            {
                float dist = centerObj.transform.DistanceTo(kvp.Value.transform);
                if (dist < curDist)
                {
                    nearestNonPlayerItem = kvp.Value;
                    curDist = dist;
                }
            }

            if (curDist <= radius)
            {
                return(nearestNonPlayerItem);
            }

            return(null);
        }