ToTeraDpsApi() private static method

private static ToTeraDpsApi ( EncounterBase teradpsData, NpcEntity entity ) : void
teradpsData DamageMeter.TeraDpsApi.EncounterBase
entity Tera.Game.NpcEntity
return void
Ejemplo n.º 1
0
        private void PacketAnalysisLoop()
        {
            while (true)
            {
                if (NeedToReset)
                {
                    Reset();
                    NeedToReset = false;
                }

                if (NeedToResetCurrent)
                {
                    ResetCurrent();
                    NeedToResetCurrent = false;
                }

                if (NeedToCopy != null)
                {
                    var stats          = DamageTracker.Instance.GetPlayerStats();
                    var currentBoss    = Encounter;
                    var info           = currentBoss == null?new EntityInfo():DamageTracker.Instance.GetEntityStats()[currentBoss];
                    var timedEncounter = TimedEncounter;
                    var totaldamage    = DamageTracker.Instance.TotalDamage(currentBoss, timedEncounter);
                    var firstHit       = DamageTracker.Instance.FirstHit(currentBoss);
                    var lastHit        = DamageTracker.Instance.LastHit(currentBoss);
                    var partyDps       = DamageTracker.Instance.PartyDps(currentBoss, timedEncounter);
                    var tmpcopy        = NeedToCopy;
                    var pasteThread    = new Thread(() => CopyThread(info, stats, _abnormalityStorage.Clone(currentBoss?.NpcE), totaldamage, partyDps, firstHit, lastHit, currentBoss, timedEncounter, tmpcopy));
                    pasteThread.Priority = ThreadPriority.Highest;
                    pasteThread.Start();

                    NeedToCopy = null;
                }

                Encounter = NewEncounter;

                if (_forceUiUpdate)
                {
                    UpdateUi();
                    _forceUiUpdate = false;
                }

                CheckUpdateUi();


                Message obj;
                var     successDequeue = TeraSniffer.Instance.Packets.TryDequeue(out obj);
                if (!successDequeue)
                {
                    Thread.Sleep(1);
                    continue;
                }

                if (TeraSniffer.Instance.Packets.Count > 3000)
                {
                    MessageBox.Show(
                        "Your computer is too slow to use this DPS meter. Can't analyse all those packet in decent amount of time. Shutting down now.");
                    Exit();
                }

                var message = _messageFactory.Create(obj);

                var skillResultMessage = message as EachSkillResultServerMessage;
                if (skillResultMessage != null)
                {
                    var skillResult = new SkillResult(skillResultMessage, EntityTracker, PlayerTracker, BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.PetSkillDatabase);
                    DamageTracker.Instance.Update(skillResult);
                    continue;
                }
                var changeHp = message as SCreatureChangeHp;
                if (changeHp != null)
                {
                    AbnormalityTracker.Update(changeHp);
                    continue;
                }

                var pchangeHp = message as SPartyMemberChangeHp;
                if (pchangeHp != null)
                {
                    var user = PlayerTracker.GetOrNull(pchangeHp.ServerId, pchangeHp.PlayerId);
                    AbnormalityTracker.RegisterSlaying(user?.User, pchangeHp.Slaying, pchangeHp.Time.Ticks);
                    continue;
                }

                var changeMp = message as SPlayerChangeMp;
                if (changeMp != null)
                {
                    AbnormalityTracker.Update(changeMp);
                    continue;
                }

                var NpcStatus = message as SNpcStatus;
                if (NpcStatus != null)
                {
                    AbnormalityTracker.RegisterNpcStatus(NpcStatus);
                    continue;
                }

                var dead = message as SCreatureLife;
                if (dead != null)
                {
                    AbnormalityTracker.RegisterDead(dead);
                    continue;
                }

                var abnormalityBegin = message as SAbnormalityBegin;
                if (abnormalityBegin != null)
                {
                    AbnormalityTracker.AddAbnormality(abnormalityBegin);
                    continue;
                }

                var abnormalityEnd = message as SAbnormalityEnd;
                if (abnormalityEnd != null)
                {
                    AbnormalityTracker.DeleteAbnormality(abnormalityEnd);
                    continue;
                }

                var abnormalityRefresh = message as SAbnormalityRefresh;
                if (abnormalityRefresh != null)
                {
                    AbnormalityTracker.RefreshAbnormality(abnormalityRefresh);
                    continue;
                }

                var npcOccupier = message as SNpcOccupierInfo;
                if (npcOccupier != null)
                {
                    DamageTracker.Instance.UpdateEntities(new NpcOccupierResult(npcOccupier), npcOccupier.Time.Ticks);
                    continue;
                }

                var despawnNpc = message as SDespawnNpc;
                if (despawnNpc != null)
                {
                    AbnormalityTracker.StopAggro(despawnNpc);
                    AbnormalityTracker.DeleteAbnormality(despawnNpc);
                    DataExporter.ToTeraDpsApi(despawnNpc, _abnormalityStorage);
                    continue;
                }

                var chatMessage = message as S_CHAT;
                if (chatMessage != null)
                {
                    Chat.Instance.Add(chatMessage);
                    continue;
                }

                var whisperMessage = message as S_WHISPER;
                if (whisperMessage != null)
                {
                    Chat.Instance.Add(whisperMessage);
                    continue;
                }

                var despawnUser = message as SDespawnUser;
                if (despawnUser != null)
                {
                    CharmTracker.CharmReset(despawnUser.User, new List <CharmStatus>(), despawnUser.Time.Ticks);
                    AbnormalityTracker.DeleteAbnormality(despawnUser);
                    continue;
                }

                var charmEnable = message as SEnableCharmStatus;
                if (charmEnable != null)
                {
                    CharmTracker.CharmEnable(EntityTracker.MeterUser.Id, charmEnable.CharmId, charmEnable.Time.Ticks);
                    continue;
                }
                var pcharmEnable = message as SPartyMemberCharmEnable;
                if (pcharmEnable != null)
                {
                    var player = PlayerTracker.GetOrNull(pcharmEnable.ServerId, pcharmEnable.PlayerId);
                    if (player == null)
                    {
                        continue;
                    }
                    CharmTracker.CharmEnable(player.User.Id, pcharmEnable.CharmId, pcharmEnable.Time.Ticks);
                    continue;
                }
                var charmReset = message as SResetCharmStatus;
                if (charmReset != null)
                {
                    CharmTracker.CharmReset(charmReset.TargetId, charmReset.Charms, charmReset.Time.Ticks);
                    continue;
                }
                var pcharmReset = message as SPartyMemberCharmReset;
                if (pcharmReset != null)
                {
                    var player = PlayerTracker.GetOrNull(pcharmReset.ServerId, pcharmReset.PlayerId);
                    if (player == null)
                    {
                        continue;
                    }
                    CharmTracker.CharmReset(player.User.Id, pcharmReset.Charms, pcharmReset.Time.Ticks);
                    continue;
                }
                var charmDel = message as SRemoveCharmStatus;
                if (charmDel != null)
                {
                    CharmTracker.CharmDel(EntityTracker.MeterUser.Id, charmDel.CharmId, charmDel.Time.Ticks);
                    continue;
                }
                var pcharmDel = message as SPartyMemberCharmDel;
                if (pcharmDel != null)
                {
                    var player = PlayerTracker.GetOrNull(pcharmDel.ServerId, pcharmDel.PlayerId);
                    if (player == null)
                    {
                        continue;
                    }
                    CharmTracker.CharmDel(player.User.Id, pcharmDel.CharmId, pcharmDel.Time.Ticks);
                    continue;
                }
                var charmAdd = message as SAddCharmStatus;
                if (charmAdd != null)
                {
                    CharmTracker.CharmAdd(charmAdd.TargetId, charmAdd.CharmId, charmAdd.Status, charmAdd.Time.Ticks);
                    continue;
                }
                var pcharmAdd = message as SPartyMemberCharmAdd;
                if (pcharmAdd != null)
                {
                    var player = PlayerTracker.GetOrNull(pcharmAdd.ServerId, pcharmAdd.PlayerId);
                    if (player == null)
                    {
                        continue;
                    }
                    CharmTracker.CharmAdd(player.User.Id, pcharmAdd.CharmId, pcharmAdd.Status, pcharmAdd.Time.Ticks);
                    continue;
                }

                EntityTracker.Update(message);
                PlayerTracker.UpdateParty(message);
                //var sSpawnUser = message as SpawnUserServerMessage;
                //if (sSpawnUser != null)
                //{
                //    Console.WriteLine(sSpawnUser.Name + " : " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.Id.Id))+" : " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.ServerId)) + " " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.PlayerId)));
                //    continue;
                //}

                var spawnMe = message as SpawnMeServerMessage;
                if (spawnMe != null)
                {
                    _abnormalityStorage.EndAll(message.Time.Ticks);
                    AbnormalityTracker = new AbnormalityTracker(EntityTracker, PlayerTracker, BasicTeraData.Instance.HotDotDatabase, _abnormalityStorage, DamageTracker.Instance.Update);
                    CharmTracker       = new CharmTracker(AbnormalityTracker);
                    continue;
                }
                var sLogin = message as LoginServerMessage;
                if (sLogin != null)
                {
                    _abnormalityStorage.EndAll(message.Time.Ticks);
                    AbnormalityTracker = new AbnormalityTracker(EntityTracker, PlayerTracker, BasicTeraData.Instance.HotDotDatabase, _abnormalityStorage, DamageTracker.Instance.Update);
                    CharmTracker       = new CharmTracker(AbnormalityTracker);
                    Connected(BasicTeraData.Instance.Servers.GetServerName(sLogin.ServerId, Server));
                    //Console.WriteLine(sLogin.Name + " : " + BitConverter.ToString(BitConverter.GetBytes(sLogin.Id.Id)));
                    continue;
                }
            }
        }
        private void PacketAnalysisLoop()
        {
            while (true)
            {
                if (NeedToReset)
                {
                    Reset();
                    NeedToReset = false;
                }

                if (NeedToResetCurrent)
                {
                    ResetCurrent();
                    NeedToResetCurrent = false;
                }

                if (NeedToCopy != null)
                {
                    var stats          = DamageTracker.Instance.GetPlayerStats();
                    var currentBoss    = Encounter;
                    var timedEncounter = TimedEncounter;
                    var totaldamage    = DamageTracker.Instance.TotalDamage(currentBoss, timedEncounter);
                    var firstHit       = DamageTracker.Instance.FirstHit(currentBoss);
                    var lastHit        = DamageTracker.Instance.LastHit(currentBoss);
                    var partyDps       = DamageTracker.Instance.PartyDps(currentBoss, timedEncounter);
                    var tmpcopy        = NeedToCopy;
                    var pasteThread    = new Thread(() => CopyThread(stats, totaldamage, partyDps, firstHit, lastHit, currentBoss, timedEncounter, tmpcopy));
                    pasteThread.Priority = ThreadPriority.Highest;
                    pasteThread.Start();

                    NeedToCopy = null;
                }

                Encounter = NewEncounter;

                if (_forceUiUpdate)
                {
                    UpdateUi();
                    _forceUiUpdate = false;
                }

                CheckUpdateUi();


                Message obj;
                var     successDequeue = TeraSniffer.Instance.Packets.TryDequeue(out obj);
                if (!successDequeue)
                {
                    Thread.Sleep(10);
                    continue;
                }

                if (TeraSniffer.Instance.Packets.Count > 3000)
                {
                    MessageBox.Show(
                        "Your computer is too slow to use this DPS meter. Can't analyse all those packet in decent amount of time. Shutting down now.");
                    Exit();
                }

                var message = _messageFactory.Create(obj);
                EntityTracker.Update(message);

                var skillResultMessage = message as EachSkillResultServerMessage;
                if (skillResultMessage != null)
                {
                    var amount = skillResultMessage.Amount;
                    if (!skillResultMessage.IsHeal && skillResultMessage.IsHp && amount > 0)
                    {
                        amount *= -1;
                    }
                    var skillResult = ForgeSkillResult(
                        false,
                        amount,
                        skillResultMessage.IsCritical,
                        skillResultMessage.IsHp,
                        skillResultMessage.SkillId,
                        skillResultMessage.Source,
                        skillResultMessage.Target);
                    DamageTracker.Instance.Update(skillResult, skillResultMessage.Time.Ticks);
                }

                //var sSpawnUser = message as SpawnUserServerMessage;
                //if (sSpawnUser != null)
                //{
                //    Console.WriteLine(sSpawnUser.Name + " : " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.Id.Id))+" : " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.ServerId)) + " " + BitConverter.ToString(BitConverter.GetBytes(sSpawnUser.PlayerId)));
                //    continue;
                //}


                var npcOccupier = message as SNpcOccupierInfo;
                if (npcOccupier != null)
                {
                    DamageTracker.Instance.UpdateEntities(new NpcOccupierResult(npcOccupier), npcOccupier.Time.Ticks);
                    continue;
                }


                var changeHp = message as SCreatureChangeHp;
                if (changeHp != null)
                {
                    AbnormalityTracker.Instance.Update(changeHp);
                    var user = EntityTracker.GetOrPlaceholder(changeHp.TargetId);
                    if (user is UserEntity)
                    {
                        if (changeHp.Slaying)
                        {
                            AbnormalityTracker.Instance.AddAbnormality(changeHp.TargetId, changeHp.TargetId, 0, 0, 8888889, changeHp.Time.Ticks);
                        }
                        else
                        {
                            AbnormalityTracker.Instance.DeleteAbnormality(changeHp);
                        }
                    }
                    continue;
                }

                var pchangeHp = message as SPartyMemberChangeHp;
                if (pchangeHp != null)
                {
                    var user = PlayerTracker.GetOrNull(pchangeHp.PlayerId);
                    if (user == null)
                    {
                        continue;              //have not seen user yet, cause he is far away, but in party.
                    }
                    //Console.WriteLine(user.Name + " :" + pchangeHp.Slaying);
                    if (pchangeHp.Slaying)
                    {
                        AbnormalityTracker.Instance.AddAbnormality(user.User.Id, user.User.Id, 0, 0, 8888889, pchangeHp.Time.Ticks);
                    }
                    else
                    {
                        AbnormalityTracker.Instance.DeleteAbnormality(user.User.Id, 8888889, message.Time.Ticks);
                    }
                    continue;
                }

                var changeMp = message as SPlayerChangeMp;
                if (changeMp != null)
                {
                    AbnormalityTracker.Instance.Update(changeMp);
                    continue;
                }

                var NpcStatus = message as SNpcStatus;
                if (NpcStatus != null)
                {
                    if (NpcStatus.Enraged)
                    {
                        AbnormalityTracker.Instance.AddAbnormality(NpcStatus.Npc, NpcStatus.Target, 0, 0, 8888888, NpcStatus.Time.Ticks);
                        continue;
                    }
                    else
                    {
                        AbnormalityTracker.Instance.DeleteAbnormality(NpcStatus);
                        continue;
                    }
                }

                var dead = message as SCreatureLife;
                if (dead != null)
                {
                    DamageTracker.Instance.RegisterDead(dead);
                    continue;
                }

                var abnormalityBegin = message as SAbnormalityBegin;
                if (abnormalityBegin != null)
                {
                    AbnormalityTracker.Instance.AddAbnormality(abnormalityBegin);
                    continue;
                }

                var abnormalityEnd = message as SAbnormalityEnd;
                if (abnormalityEnd != null)
                {
                    AbnormalityTracker.Instance.DeleteAbnormality(abnormalityEnd);
                    continue;
                }

                var abnormalityRefresh = message as SAbnormalityRefresh;
                if (abnormalityRefresh != null)
                {
                    AbnormalityTracker.Instance.RefreshAbnormality(abnormalityRefresh);
                    continue;
                }

                var despawnNpc = message as SDespawnNpc;
                if (despawnNpc != null)
                {
                    AbnormalityTracker.Instance.DeleteAbnormality(despawnNpc);
                    DataExporter.ToTeraDpsApi(despawnNpc);
                    continue;
                }

                var chatMessage = message as S_CHAT;
                if (chatMessage != null)
                {
                    Chat.Instance.Add(chatMessage);
                    continue;
                }

                var whisperMessage = message as S_WHISPER;
                if (whisperMessage != null)
                {
                    Chat.Instance.Add(whisperMessage);
                    continue;
                }

                var despawnUser = message as SDespawnUser;
                if (despawnUser != null)
                {
                    AbnormalityTracker.Instance.DeleteAbnormality(despawnUser);
                    continue;
                }



                var sLogin = message as LoginServerMessage;
                if (sLogin != null)
                {
                    AbnormalityTracker.Instance.Renew();
                    Connected(BasicTeraData.Instance.Servers.GetServerName(sLogin.ServerId, Server));
                    //Console.WriteLine(sLogin.Name + " : " + BitConverter.ToString(BitConverter.GetBytes(sLogin.Id.Id)));
                    continue;
                }
            }
        }