Esempio n. 1
0
        public SkillResult(EachSkillResultServerMessage message, EntityTracker entityRegistry,
                           PlayerTracker playerTracker, SkillDatabase skillDatabase)
        {
            Time       = message.Time;
            Amount     = message.Amount;
            IsCritical = message.IsCritical;
            IsHeal     = message.IsHeal;
            SkillId    = message.SkillId;

            Source = entityRegistry.GetOrPlaceholder(message.Source);
            Target = entityRegistry.GetOrPlaceholder(message.Target);
            var userNpc    = UserEntity.ForEntity(Source);
            var npc        = (NpcEntity)userNpc["source"];
            var sourceUser = userNpc["root_source"] as UserEntity; // Attribute damage dealt by owned entities to the owner
            var targetUser = Target as UserEntity;                 // But don't attribute damage received by owned entities to the owner

            if (sourceUser != null)
            {
                Skill = skillDatabase.Get(sourceUser, message);
                if (Skill == null && npc != null)
                {
                    Skill = new UserSkill(message.SkillId, sourceUser.RaceGenderClass, npc.Info.Name);
                }
                SourcePlayer = playerTracker.Get(sourceUser.PlayerId);
                if (Skill == null)
                {
                    Skill = new UserSkill(message.SkillId, sourceUser.RaceGenderClass, "Unknown");
                }
            }
            if (targetUser != null)
            {
                TargetPlayer = playerTracker.Get(targetUser.PlayerId);
            }
        }
Esempio n. 2
0
        public void Update(SkillResult skillResult)
        {
            if (skillResult.Source == null || skillResult.Target == null)
            {
                return;
            }

            var entitySource = UserEntity.ForEntity(NetworkController.Instance.EntityTracker.GetOrPlaceholder(skillResult.Source.Id));
            var entityTarget = GetActorEntity(skillResult.Target.Id);

            if (skillResult.SourcePlayer == null && skillResult.TargetPlayer == null)
            {
                return;
            }
            if (BasicTeraData.Instance.WindowData.PartyOnly &&
                (skillResult.SourcePlayer == null ||
                 !NetworkController.Instance.PlayerTracker.MyParty(skillResult.SourcePlayer)) &&
                (skillResult.TargetPlayer == null ||
                 !NetworkController.Instance.PlayerTracker.MyParty(skillResult.TargetPlayer)))
            {
                return;
            }
            if (BasicTeraData.Instance.WindowData.OnlyBoss && !(((entityTarget as NpcEntity)?.Info.Boss ?? false) ||
                                                                (skillResult.SourcePlayer != null && skillResult.TargetPlayer != null) ||
                                                                ((entitySource["root_source"] as NpcEntity)?.Info.Boss ?? false)))
            {
                return;
            }
            if (entitySource["root_source"] is PlaceHolderEntity || entityTarget == null)
            {
                return;
            }
            InsertSkill(entityTarget, entitySource["root_source"], entitySource["source"], skillResult);
        }
Esempio n. 3
0
        private static bool IsValidSkill(SkillResult message)
        {
            if (message.Amount == 0)
            // to count buff skills/consumable usage - need additional hitstat for it (damage/heal/mana/uses)
            {
                return(false);
            }

            return((UserEntity.ForEntity(message.Source)["root_source"] != UserEntity.ForEntity(message.Target)["root_source"]) || (message.Damage == 0));
        }
Esempio n. 4
0
        private void UpdateStatsReceived(PlayerInfo playerInfo, SkillResult message, Entity entitySource, long time)
        {
            if (_hasReset.Contains(entitySource) && entitySource.IsBoss())
            {
                Console.WriteLine("Remove:" + entitySource.Name);
                DeleteEntity(entitySource);
                _hasReset.Remove(entitySource);
            }

            if (!IsValidAttack(message))
            {
                return;
            }

            //Not damage & if you are a healer, don't show heal / mana regen affecting you, as that will modify your crit rate and other stats.
            if ((message.IsHp && message.Amount > 0 || !message.IsHp) && !PlayerClassHelper.IsHeal(playerInfo.Class) &&
                (UserEntity.ForEntity(message.Source)["user"] != UserEntity.ForEntity(message.Target)["user"]))
            {
                UpdateSkillStats(message, new Entity(playerInfo.Player.User.Name), playerInfo, time);
                return;
            }

            if (message.Damage <= 0)
            {
                return;
            }

            var entity = entitySource;

            if (entitySource.IsBoss())
            {
                foreach (
                    var t in EntitiesStats.Where(t => t.Key.Name == entitySource.Name).OrderByDescending(t => t.Value.FirstHit))
                {
                    entity = t.Key;
                    break;
                }

                //Don't count damage taken if boss haven't taken any damage
                if (entity == null)
                {
                    return;
                }
            }

            playerInfo.Received.AddStats(time, entity, message.Damage);
            if (EntitiesStats.ContainsKey(entity))
            {
                return;
            }
            EntitiesStats.Add(entity, new EntityInfo());
        }
Esempio n. 5
0
        private static bool IsValidAttack(SkillResult message)
        {
            if (message.Amount == 0)
            {
                return(false);
            }

            if ((UserEntity.ForEntity(message.Source)["user"] == UserEntity.ForEntity(message.Target)["user"]) &&
                (message.Damage != 0))
            {
                return(false);
            }

            return(true);
        }
Esempio n. 6
0
        private static bool IsValidAttack(SkillResult message)
        {
            if (message.Amount == 0) // to count buff skills/consumable usage - need additional hitstat for it (damage/heal/mana/uses)
            {
                return(false);
            }

            if ((UserEntity.ForEntity(message.Source)["user"] == UserEntity.ForEntity(message.Target)["user"]) &&
                (message.Damage != 0))
            {
                return(false);
            }

            return(true);
        }
Esempio n. 7
0
        public SkillResult(bool abnormality, int amount, bool isCritical, bool isHp, int skillId, EntityId source,
                           EntityId target, EntityTracker entityRegistry)
        {
            Amount      = amount;
            IsCritical  = isCritical;
            IsHp        = isHp;
            SkillId     = skillId;
            Abnormality = abnormality;

            Source = entityRegistry.GetOrPlaceholder(source);
            Target = entityRegistry.GetOrPlaceholder(target);
            var userNpc    = UserEntity.ForEntity(Source);
            var npc        = (NpcEntity)userNpc["npc"];
            var sourceUser = userNpc["user"] as UserEntity; // Attribute damage dealt by owned entities to the owner
            var targetUser = Target as UserEntity;          // But don't attribute damage received by owned entities to the owner

            if (abnormality)
            {
                var hotdot = BasicTeraData.Instance.HotDotDatabase.Get(skillId);
                if (hotdot == null)
                {
                    return;
                }
                Skill = new UserSkill(skillId, PlayerClass.Common,
                                      hotdot.Name, "DOT", null);
            }

            if (sourceUser != null)
            {
                SourcePlayer = NetworkController.Instance.PlayerTracker.Get(sourceUser.PlayerId);
                if (!abnormality)
                {
                    Skill = BasicTeraData.Instance.SkillDatabase.Get(sourceUser.RaceGenderClass.Class, skillId);
                    if (Skill == null && npc != null)
                    {
                        var petName = BasicTeraData.Instance.MonsterDatabase.GetMonsterName(npc.NpcArea.ToString(),
                                                                                            npc.NpcId.ToString());
                        Skill = new UserSkill(skillId, sourceUser.RaceGenderClass.Class, petName,
                                              BasicTeraData.Instance.PetSkillDatabase.Get(petName, skillId), null);
                    }
                }
            }

            if (targetUser != null)
            {
                TargetPlayer = NetworkController.Instance.PlayerTracker.Get(targetUser.PlayerId);
            }
        }
Esempio n. 8
0
        private void UpdateStatsReceived(PlayerInfo playerInfo, SkillResult message, Entity entitySource, long time)
        {
            if (!IsValidAttack(message))
            {
                return;
            }

            //Not damage & if you are a healer, don't show heal / mana regen affecting you, as that will modify your crit rate and other stats.
            if ((message.IsHp && message.Amount > 0 || !message.IsHp) && !playerInfo.IsHealer &&
                (UserEntity.ForEntity(message.Source)["user"] != UserEntity.ForEntity(message.Target)["user"]))
            {
                UpdateSkillStats(message, new Entity(playerInfo.Player.User.Name), playerInfo, time);
                return;
            }

            if (message.Damage <= 0)
            {
                return;
            }

            var entity = entitySource;

            if (entitySource.IsBoss)
            {
                foreach (
                    var t in EntitiesStats.Where(t => t.Key.Name == entitySource.Name && t.Key.Id == entitySource.Id))
                {
                    entity = t.Key;
                    break;
                }

                //Don't count damage taken if boss haven't taken any damage
                if (entity == null)
                {
                    return;
                }
            }

            playerInfo.Received.AddStats(time, entity, message.Damage);
            if (EntitiesStats.ContainsKey(entity))
            {
                return;
            }
            EntitiesStats.Add(entity, new EntityInfo());
        }
Esempio n. 9
0
        public SkillResult(EachSkillResultServerMessage message, EntityTracker entityRegistry,
                           PlayerTracker playerTracker, SkillDatabase skillDatabase)
        {
            Amount     = message.Amount;
            IsCritical = message.IsCritical;
            IsHeal     = message.IsHeal;
            SkillId    = message.SkillId;

            Source = entityRegistry.GetOrPlaceholder(message.Source);
            Target = entityRegistry.GetOrPlaceholder(message.Target);
            var sourceUser = UserEntity.ForEntity(Source); // Attribute damage dealt by owned entities to the owner
            var targetUser = Target as UserEntity;         // But don't attribute damage received by owned entities to the owner

            if (sourceUser != null)
            {
                Skill        = skillDatabase.Get(sourceUser, message.SkillId);
                SourcePlayer = playerTracker.Get(sourceUser.PlayerId);
            }

            if (targetUser != null)
            {
                TargetPlayer = playerTracker.Get(targetUser.PlayerId);
            }
        }
Esempio n. 10
0
 private static bool IsValidSkill(SkillResult message)
 {
     return(UserEntity.ForEntity(message.Source)["root_source"] != UserEntity.ForEntity(message.Target)["root_source"] || message.Damage == 0);
 }