Inheritance: Entity, IHasOwner
Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 public EntityInformation(NpcEntity entity, long totalDamage, long beginTime, long endTime)
 {
     Entity = entity;
     TotalDamage = totalDamage;
     BeginTime = beginTime;
     EndTime = endTime;
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 7
0
 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();
 }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
 public void UpdateCurrentBoss(NpcEntity entity)
 {
     if (!entity.Info.Boss) return;
     if (NetworkController.Instance.Encounter != entity)
     {
         NetworkController.Instance.NewEncounter = entity;
     }
 }
Ejemplo n.º 11
0
        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;
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
        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);
                }
            }
        }