private static ToTeraDpsApi ( |
||
teradpsData | ||
entity | ||
리턴 | void |
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; } } }