//Добавить траву в бд или обновить её в бд public static void AddOrUpdateHerb(uint ZoneID, DataBase.cHerbs.Herb item) { if (database.Herbs.ZoneExist(ZoneID)) //Если такая зона есть в списке зон { for (int i = 0; i < database.Herbs.HerbDict[ZoneID].Count; i++) { if (database.Herbs.HerbDict[ZoneID][i].ID == item.ID) //Отсеиваем мусор { bool inRadius = Tools.Vec.InRadius(database.Herbs.HerbDict[ZoneID][i].Position, item.Position, Game1.settings.nodes.RadiusCheck); if (inRadius) { //Установка позиции database.Herbs.HerbDict[ZoneID][i].Position = item.Position; //Обновляем максимальную дистанцию отрисовки if (item.MaxSeeDistance > database.Herbs.HerbDict[ZoneID][i].MaxSeeDistance) { database.Herbs.HerbDict[ZoneID][i].MaxSeeDistance = item.MaxSeeDistance; } //Устанавливаем текущее время if (item.LastSeen != "") { database.Herbs.HerbDict[ZoneID][i].LastSeen = item.LastSeen; } return; } } } //Если прошли цикл, значит это новая трава! database.Herbs.HerbDict[ZoneID].Add(item); } else { //Если не нашли эту зону в списке, добавляем database.Herbs.HerbDict.Add(ZoneID, new List <DataBase.cHerbs.Herb>() { item }); } }
//Отдельный поток для обновления базы данных public static void DB_Updater() { while (true) { Stopwatch dbTime = Stopwatch.StartNew(); { //Обноляем и добавляем игроков for (int i = 0; i < scanner.Players.Count; i++) { //Бережно берем из списка Radar.PlayerObject player; try { player = scanner.Players[i] as Radar.PlayerObject; } catch { SystemSounds.Exclamation.Play(); continue; } if (player != null) //Если игрок не багнулся { if (player.Name != "") //Если имя загрузилось { DataBase.cPlayers.Player pl = new DataBase.cPlayers.Player() { Name = player.Name, GUID = player.Guid, LvL = (byte)player.Level, Class = player.Class, Race = player.Race, Gender = player.Gender, LastPos = new Vector3(player.XPos, player.YPos, player.ZPos), LastSeen = Tools.GetNowTime(), LastZoneID = scanner.CurrentZoneID, }; DB.AddOrUpdatePlayer(pl); } } } //Обноляем и добавляем всякие объекты и т.п for (int i = 0; i < scanner.Objects.Count; i++) { //Бережно берем из списка Radar.OtherObject obj; try { obj = scanner.Objects[i] as Radar.OtherObject; } catch { SystemSounds.Exclamation.Play(); continue; } if (obj != null) //Если объект не багнулся { //Временная переменная Enums.Name_And_TextureName temp = new Enums.Name_And_TextureName(); if (Enums.ObjDB.GetOre(obj.ObjectId, ref temp)) //Это руда { DataBase.cOres.Ore oreToUpdate = new DataBase.cOres.Ore() { Name = temp.name, ID = obj.ObjectId, Position = Tools.Vec.Round(new Vector2(obj.XPos, obj.YPos), 2), MaxSeeDistance = (float)Math.Round(Vector2.Distance(new Vector2(obj.XPos, obj.YPos), new Vector2(scanner.MyPlayer.XPos, scanner.MyPlayer.YPos)), 2), LastSeen = Tools.GetNowTime(), }; DB.AddOrUpdateOre(scanner.CurrentZoneID, oreToUpdate); } else if (Enums.ObjDB.GetHerb(obj.ObjectId, ref temp)) //Трава { DataBase.cHerbs.Herb herbToUpdate = new DataBase.cHerbs.Herb() { Name = temp.name, ID = obj.ObjectId, Position = Tools.Vec.Round(new Vector2(obj.XPos, obj.YPos), 2), MaxSeeDistance = (float)Math.Round(Vector2.Distance(new Vector2(obj.XPos, obj.YPos), new Vector2(scanner.MyPlayer.XPos, scanner.MyPlayer.YPos)), 2), LastSeen = Tools.GetNowTime(), }; DB.AddOrUpdateHerb(scanner.CurrentZoneID, herbToUpdate); } else //Это не руда и не трава, добавляем в список объектов! { DataBase.cObjects.Object objectToUpdate = new DataBase.cObjects.Object() { ID = obj.ObjectId, Position = Tools.Vec.Round(new Vector2(obj.XPos, obj.YPos), 2), MaxSeeDistance = (float)Math.Round(Vector2.Distance(new Vector2(obj.XPos, obj.YPos), new Vector2(scanner.MyPlayer.XPos, scanner.MyPlayer.YPos)), 2), LastSeen = Tools.GetNowTime(), }; DB.AddOrUpdateObject(scanner.CurrentZoneID, objectToUpdate); } } } } dbTime.Stop(); DbUpdateTime = dbTime.ElapsedTicks; Thread.Sleep(500); } }