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); } }
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); }
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)); }
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()); }
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); }
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); }
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); } }
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()); }
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); } }
private static bool IsValidSkill(SkillResult message) { return(UserEntity.ForEntity(message.Source)["root_source"] != UserEntity.ForEntity(message.Target)["root_source"] || message.Damage == 0); }