public void Update(SpawnNpcServerMessage m) { var newEntity = new NpcEntity(m.Id, m.OwnerId, GetOrPlaceholder(m.OwnerId), _npcDatabase.GetOrPlaceholder(m.NpcArea, m.NpcId), m.Position, m.Heading); Register(newEntity); }
public EntityInformation(NpcEntity entity, long totalDamage, long beginTime, long endTime) { Entity = entity; TotalDamage = totalDamage; BeginTime = beginTime; EndTime = endTime; }
public HistoryLink(string link, NpcEntity boss) { InitializeComponent(); Boss.Content = boss.Info.Name; Boss.Tag = link; if (link.StartsWith("!")) { Boss.Foreground = Brushes.Red; Boss.ToolTip = link; return; } Link.Source = BasicTeraData.Instance.ImageDatabase.Link.Source; }
public void Update(S_BOSS_GAGE_INFO m) { var entity = GetOrNull(m.EntityId) as NpcEntity; if (entity == null) { entity = new NpcEntity(m.EntityId, EntityId.Empty, null, _npcDatabase.GetOrPlaceholder((ushort)m.HuntingZoneId, m.TemplateId), new Vector3f(), new Angle()); Register(entity); } _npcDatabase.AddDetectedBoss(entity.Info.HuntingZoneId, entity.Info.TemplateId); entity.Info.Boss = true; entity.Info.HP = (long)m.TotalHp; }
public void DeleteAllWhenTimeBelow(NpcEntity entity) { if (entity == null) { DeleteAll(); return; } var entityInfo = GlobalInformationEntity(entity, false); const string sql = "DELETE FROM skills WHERE time < $time"; var command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$time", entityInfo.BeginTime); command.ExecuteNonQuery(); command.Dispose(); }
public void Update(ParsedMessage message) { Entity newEntity = null; message.On <SpawnUserServerMessage>(m => newEntity = new UserEntity(m)); message.On <LoginServerMessage>(m => newEntity = new UserEntity(m)); message.On <SpawnNpcServerMessage>(m => newEntity = new NpcEntity(m.Id, m.OwnerId, GetOrPlaceholder(m.OwnerId))); message.On <SpawnProjectileServerMessage>(m => newEntity = new ProjectileEntity(m.Id, m.OwnerId, GetOrPlaceholder(m.OwnerId))); message.On <StartUserProjectileServerMessage>(m => newEntity = new ProjectileEntity(m.Id, m.OwnerId, GetOrPlaceholder(m.OwnerId))); if (newEntity != null) { _dictionary[newEntity.Id] = newEntity; OnEntityUpdated(newEntity); } }
public static void Export(NpcEntity entity, AbnormalityStorage abnormality, Dest type) { if (entity==null) return; var stats = GenerateStats(entity, abnormality); if (stats == null) { return; } var sendThread = new Thread(() => { if ((type&Dest.Site)!=0 && NetworkController.Instance.BossLink.Any(x=>x.Value==entity&&x.Key.StartsWith("!"))) ToTeraDpsApi(stats.BaseStats, entity); if ((type&Dest.Excel)!=0) ExcelExport.ExcelSave(stats); }); sendThread.Start(); }
public List<PlayerDamageDealt> PlayerDamageInformation(NpcEntity target) { SQLiteCommand command; string sql; if (target == null) { sql = "SELECT SUM(amount) as total_amount, MIN(time) as start_time, MAX(time) as end_time, SUM(critic) as number_critics, COUNT(*) AS number_hits, sourceServerIdPlayerId " + "FROM skills WHERE type = $type AND sourceServerIdPlayerId IS NOT NULL GROUP BY sourceServerIdPlayerId ORDER BY `total_amount` DESC;"; command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$type", Type.Damage); return PlayerDamageInformation(command); } sql = "SELECT SUM(amount) as total_amount, MIN(time) as start_time, MAX(time) as end_time, SUM(critic) as number_critics, COUNT(*) AS number_hits, sourceServerIdPlayerId, target " + "FROM skills " + "WHERE target = $target AND type = $type AND sourceServerIdPlayerId IS NOT NULL " + "GROUP BY sourceServerIdPlayerId " + "ORDER BY `total_amount` DESC;"; command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$target", target.Id.Id); command.Parameters.AddWithValue("$type", Type.Damage); return PlayerDamageInformation(command); }
public EntityInformation GlobalInformationEntity(NpcEntity entity, bool timed) { SQLiteCommand command; if (entity == null) { var sql = "SELECT SUM(amount) as total_amount, MIN(time) as start_time, MAX(time) as end_time, source " + "FROM skills " + "WHERE type = $type "+ "GROUP BY source; "; command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$type", (int) Type.Damage); } else { if (!timed) { var sql = "SELECT SUM(amount) as total_amount, MIN(time) as start_time, MAX(time) as end_time, source " + "FROM skills " + "WHERE target = $target AND type = $type " + "GROUP BY source; "; command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$type", (int) Type.Damage); command.Parameters.AddWithValue("$target", entity.Id.Id); } else { var sql = "SELECT SUM(amount) as total_amount, MIN(time) as start_time, MAX(time) as end_time, source " + "FROM skills " + "WHERE time BETWEEN (SELECT MIN(time) FROM skills WHERE target = $target) AND (SELECT MAX(time) FROM skills WHERE target = $target) AND type = $type " + "GROUP BY source; "; command = new SQLiteCommand(sql, Connexion); command.Parameters.AddWithValue("$type", (int) Type.Damage); command.Parameters.AddWithValue("$target", entity.Id.Id); } } var rdr = command.ExecuteReader(); command.Dispose(); long sumTotalDamage = 0; long minBeginTime = 0; long maxEndTime = 0; while (rdr.Read()) { var source = rdr.GetFieldValue<long>(rdr.GetOrdinal("source")); var entitySource = NetworkController.Instance.EntityTracker.GetOrNull(new EntityId((ulong)source)); if (!(entitySource is UserEntity)) continue; var totalDamage = rdr.IsDBNull(rdr.GetOrdinal("total_amount")) ? 0 : rdr.GetFieldValue<long>(rdr.GetOrdinal("total_amount")); var beginTime = rdr.IsDBNull(rdr.GetOrdinal("start_time")) ? 0 : rdr.GetFieldValue<long>(rdr.GetOrdinal("start_time")); var endTime = rdr.IsDBNull(rdr.GetOrdinal("end_time")) ? 0 : rdr.GetFieldValue<long>(rdr.GetOrdinal("end_time")); sumTotalDamage += totalDamage; if (minBeginTime == 0 || beginTime < minBeginTime) { minBeginTime = beginTime; } if (endTime > maxEndTime) { maxEndTime = endTime; } } return new EntityInformation(entity, sumTotalDamage, minBeginTime, maxEndTime); }
public void UpdateCurrentBoss(NpcEntity entity) { if (!entity.Info.Boss) return; if (NetworkController.Instance.Encounter != entity) { NetworkController.Instance.NewEncounter = entity; } }
private static ExtendedStats GenerateStats(NpcEntity entity, AbnormalityStorage abnormals) { if (!entity.Info.Boss) return null; var timedEncounter = false; /* modify timedEncounter depending on teradps.io need */ var entityInfo = Database.Database.Instance.GlobalInformationEntity(entity, timedEncounter); var skills = Database.Database.Instance.GetSkills(entityInfo.BeginTime, entityInfo.EndTime); var playersInfo = timedEncounter ? Database.Database.Instance.PlayerDamageInformation(entityInfo.BeginTime, entityInfo.EndTime) : Database.Database.Instance.PlayerDamageInformation(entity); var heals = Database.Database.Instance.PlayerHealInformation(entityInfo.BeginTime, entityInfo.EndTime); playersInfo.RemoveAll(x => x.Amount == 0); var firstTick = entityInfo.BeginTime; var lastTick = entityInfo.EndTime; var interTick = lastTick - firstTick; var interval = interTick/TimeSpan.TicksPerSecond; if (interval == 0) { return null; } var totaldamage = entityInfo.TotalDamage; var partyDps = TimeSpan.TicksPerSecond*totaldamage/interTick; var teradpsData = new EncounterBase(); var extendedStats = new ExtendedStats(); var _abnormals = abnormals.Clone(entity, firstTick, lastTick); teradpsData.encounterUnixEpoch = new DateTimeOffset(new DateTime(lastTick,DateTimeKind.Utc)).ToUnixTimeSeconds(); extendedStats.Entity = entity; extendedStats.BaseStats = teradpsData; extendedStats.FirstTick = firstTick; extendedStats.LastTick = lastTick; teradpsData.areaId = entity.Info.HuntingZoneId + ""; teradpsData.bossId = entity.Info.TemplateId + ""; teradpsData.fightDuration = interval + ""; teradpsData.partyDps = partyDps + ""; extendedStats.Debuffs = _abnormals.Get(entity); foreach (var debuff in extendedStats.Debuffs.OrderByDescending(x => x.Value.Duration(firstTick, lastTick))) { var percentage = debuff.Value.Duration(firstTick, lastTick)*100/interTick; if (percentage == 0) { continue; } teradpsData.debuffUptime.Add(new KeyValuePair<string, string>( debuff.Key.Id + "", percentage + "" )); } foreach (var user in playersInfo.OrderByDescending(x=>x.Amount)) { var teradpsUser = new Members(); var damage = user.Amount; teradpsUser.playerTotalDamage = damage + ""; if (damage <= 0) { continue; } var buffs = _abnormals.Get(user.Source); teradpsUser.playerClass = user.Source.Class.ToString(); teradpsUser.playerName = user.Source.Name; teradpsUser.playerServer = BasicTeraData.Instance.Servers.GetServerName(user.Source.ServerId); teradpsUser.playerAverageCritRate = Math.Round(user.CritRate, 1) + ""; teradpsUser.healCrit = user.Source.IsHealer ? heals.FirstOrDefault(x => x.Source == user.Source)?.CritRate + "" : null; teradpsUser.playerDps = TimeSpan.TicksPerSecond*damage/interTick + ""; teradpsUser.playerTotalDamagePercentage = user.Amount*100/entityInfo.TotalDamage + ""; extendedStats.PlayerReceived.Add(user.Source.Name, Tuple.Create(skills.HitsReceived(user.Source.User, entity, timedEncounter), skills.DamageReceived(user.Source.User, entity, timedEncounter))); var death = buffs.Death; teradpsUser.playerDeaths = death.Count(firstTick, lastTick) + ""; teradpsUser.playerDeathDuration = death.Duration(firstTick, lastTick)/TimeSpan.TicksPerSecond + ""; var aggro = buffs.Aggro(entity); teradpsUser.aggro = 100*aggro.Duration(firstTick, lastTick)/interTick + ""; foreach (var buff in buffs.Times.OrderByDescending(x=>x.Value.Duration(firstTick, lastTick))) { var percentage = buff.Value.Duration(firstTick, lastTick)*100/interTick; if (percentage == 0) { continue; } teradpsUser.buffUptime.Add(new KeyValuePair<string, string>( buff.Key.Id + "", percentage + "" )); } var serverPlayerName = $"{teradpsUser.playerServer}_{teradpsUser.playerName}"; extendedStats.PlayerSkills.Add(serverPlayerName, skills.GetSkillsDealt(user.Source.User, entity, timedEncounter)); extendedStats.PlayerBuffs.Add(serverPlayerName, buffs); var skillsId = SkillAggregate.GetAggregate(user, entityInfo.Entity, skills, timedEncounter, Database.Database.Type.Damage); extendedStats.PlayerSkillsAggregated[teradpsUser.playerServer + "/" + teradpsUser.playerName] = skillsId; foreach (var skill in skillsId.OrderByDescending(x=>x.Amount())) { var skillLog = new SkillLog(); var skilldamage = skill.Amount(); skillLog.skillAverageCrit = Math.Round(skill.AvgCrit()) + ""; skillLog.skillAverageWhite = Math.Round(skill.AvgWhite()) + ""; skillLog.skillCritRate = skill.CritRate() + ""; skillLog.skillDamagePercent = skill.DamagePercent() + ""; skillLog.skillHighestCrit = skill.BiggestCrit() + ""; skillLog.skillHits = skill.Hits() + ""; var skillKey = skill.Skills.First().Key; skillLog.skillId= BasicTeraData.Instance.SkillDatabase.GetSkillByPetName(skillKey.NpcInfo?.Name, user.Source.RaceGenderClass)?.Id.ToString() ?? skillKey.Id.ToString(); skillLog.skillLowestCrit = skill.LowestCrit() + ""; skillLog.skillTotalDamage = skilldamage + ""; if (skilldamage == 0) { continue; } teradpsUser.skillLog.Add(skillLog); } teradpsData.members.Add(teradpsUser); } return extendedStats; }
private static void ToTeraDpsApi(EncounterBase teradpsData, NpcEntity entity) { if ( //string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsToken) //|| string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsUser) //|| !BasicTeraData.Instance.WindowData.SiteExport) { return; } /* Validation, without that, the server cpu will be burning \o */ var areaId = int.Parse(teradpsData.areaId); if ( //areaId != 886 && //areaId != 467 && //areaId != 767 && //areaId != 768 && //areaId != 468 && areaId != 770 && areaId != 769 && areaId != 916 && areaId != 969 && areaId != 970 && !(areaId == 950 && int.Parse(teradpsData.bossId)/100!=11) ) { return; } try { using (var client = new HttpClient()) { client.Timeout = TimeSpan.FromSeconds(40); var response = client.GetAsync("http://moongourd.com/shared/servertime"); var timediff = (response.Result.Headers.Date.Value.UtcDateTime.Ticks - DateTime.UtcNow.Ticks) / TimeSpan.TicksPerSecond; teradpsData.encounterUnixEpoch += timediff; } } catch { Console.WriteLine("Get server time error"); NetworkController.Instance.BossLink.TryAdd( "!" + LP.TeraDpsIoApiError + " " + entity.Info.Name + " " + entity.Id + " " + DateTime.Now.Ticks, entity); return; } //if (int.Parse(teradpsData.partyDps) < 2000000 && areaId != 468) //{ // return; //} var json = JsonConvert.SerializeObject(teradpsData, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); SendTeraDpsIo(entity, json, 3); }
private static void SendTeraDpsIo(NpcEntity boss, string json, int numberTry) { Console.WriteLine(json); if (numberTry == 0) { Console.WriteLine("API ERROR"); NetworkController.Instance.BossLink.TryAdd( "!"+LP.TeraDpsIoApiError + " " + boss.Info.Name + " " + boss.Id + " " + DateTime.Now.Ticks, boss); return; } try { using (var client = new HttpClient()) { //client.DefaultRequestHeaders.Add("X-Auth-Token", BasicTeraData.Instance.WindowData.TeraDpsToken); //client.DefaultRequestHeaders.Add("X-User-Id", BasicTeraData.Instance.WindowData.TeraDpsUser); client.DefaultRequestHeaders.Add("X-Local-Time",DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString()); client.Timeout = TimeSpan.FromSeconds(40); var response = client.PostAsync("http://moongourd.com/dpsmeter_data.php", new StringContent( json, Encoding.UTF8, "application/json") ); var responseString = response.Result.Content.ReadAsStringAsync(); Console.WriteLine(responseString.Result); var responseObject = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseString.Result); if (responseObject.ContainsKey("id") && ((string) responseObject["id"]).StartsWith("http://")) { NetworkController.Instance.BossLink.TryAdd((string) responseObject["id"], boss); } else { NetworkController.Instance.BossLink.TryAdd( "!" + (string) responseObject["message"] + " " + boss.Info.Name + " " + boss.Id + " " + DateTime.Now.Ticks, boss); } } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); Thread.Sleep(10000); SendTeraDpsIo(boss, json, numberTry - 1); } }
private static void Send(NpcEntity boss, string json, int numberTry) { var sent = false; while (numberTry-- > 0 && !sent) { try { using (var client = new HttpClient()) { client.Timeout = TimeSpan.FromSeconds(30); //client.DefaultRequestHeaders.Add("X-Auth-Token", SettingsHelper.Instance.Settings.TeraDpsToken); //client.DefaultRequestHeaders.Add("X-User-Id", SettingsHelper.Instance.Settings.TeraDpsUser); var response = client.PostAsync("http://moongourd.com/dpsmeter_data.php", new StringContent( json, Encoding.UTF8, "application/json") ); sent = true; var responseString = response.Result.Content.ReadAsStringAsync(); Debug.WriteLine(responseString.Result); Dictionary<string, object> responseObject = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseString.Result); if (responseObject.ContainsKey("id")) { Debug.WriteLine((string)responseObject["id"] + " " + boss.Info.Name); } else { Debug.WriteLine("!" + (string)responseObject["message"] + " " + boss.Info.Name + " " + DateTime.Now.Ticks); } } } catch (Exception e) { Debug.WriteLine(e.Message); Debug.WriteLine(e.StackTrace); Thread.Sleep(10000); } } }