//Добавить игрока или обновить его в бд public static void AddOrUpdatePlayer(DataBase.cPlayers.Player item) { if (item.GUID != 0) { for (int i = 0; i < database.Players.PlayersCount; i++) { if (database.Players.PlayerList[i].GUID == item.GUID) { //Устанавливаем имя if (item.Name != "") { database.Players.PlayerList[i].Name = item.Name; } //Установка уровня if (item.LvL != 0) { database.Players.PlayerList[i].LvL = item.LvL; } //Устанавливаем последнюю зону if (item.LastZoneID != 0) { database.Players.PlayerList[i].LastZoneID = item.LastZoneID; } //Устанавливаем дату последнего обнаружения if (item.LastSeen != "") { database.Players.PlayerList[i].LastSeen = item.LastSeen; } //Обновляем последнюю позицию database.Players.PlayerList[i].LastPos = Tools.Vec.Round(item.LastPos, 2); //Обновляем уровень в списке уровней UpdateLevel(i, item.LvL); //Обновляем обнаружения UpdatePlayerSeen(i, item.LastZoneID); return; } } //Если не нашли в базе данных, то значит добавляем новый экземпляр if (item.LvL != 0 & item.LvL != 80) { item.Levels.Add(new LVL(item.LvL, Tools.GetNowTime())); } if (item.LastZoneID != 0) { item.Seens.Add(new SEEN(item.LastZoneID, Tools.GetNowTime())); } database.Players.PlayerList.Add(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); } }
public static void SaveDBtoShow() { DBtoShow DatabaseToShow = new DBtoShow(); try { for (int i = 0; i < DB.database.Players.PlayerList.Count; i++) { DataBase.cPlayers.Player player = DB.database.Players.PlayerList[i]; string Nick = player.Name; string Team = Defines.IsHorde(player.Race) ? "Орда" : "Альянс"; string GUID = player.GUID != 0 ? player.GUID.ToString("#,#") : null; byte LvL = player.LvL; string Race = Defines.GetTextOfRace(player.Race); string Class = Defines.GetTextOfClass(player.Class); string Gender = player.Gender == 0 ? "М" : player.Gender == 1 ? "Ж" : null; string LastPos = Tools.Vec.Round(player.LastPos, 2).ToString().Replace("{", "").Replace("}", ""); string LastSeen = player.LastSeen; string LastZoneID = Enums.ZonesDB.GetTextOfZone(player.LastZoneID); //Отражение уровней List <Уровень> Levels = new List <Уровень>(); for (int l = 0; l < player.Levels.Count; l++) { Уровень lvlChanged = new Уровень() { ЛвЛ = " " + player.Levels[l].L + " ", Дата = player.Levels[l].T }; Levels.Add(lvlChanged); } //Отражение зон List <Обнаружение> Seens = new List <Обнаружение>(); for (int z = 0; z < player.Seens.Count; z++) { Обнаружение zoneChanged = new Обнаружение() { Зона = Enums.ZonesDB.GetTextOfZone(player.Seens[z].I), Дата = player.Seens[z].T }; Seens.Add(zoneChanged); } DatabaseToShow.Игроки.Add(new DBtoShow.Игрок() { Ник = Nick, Сторона = Team, GUID = GUID, ЛвЛ = LvL.ToString(), аса = Race, Класс = Class, Пол = Gender, ПоследняяПозиция = LastPos, ПоследнееОбнаружение = LastSeen, ПоследняяЗона = LastZoneID, Уровни = Levels, Обнаружения = Seens }); } } catch (Exception ex) { Tools.MsgBox.Exception(ex, "Ошибка отражения основной БД в БД для просмотра."); return; } try { XmlSerializer ser = new XmlSerializer(typeof(DBtoShow)); string dbPath = DB.PlayersPath + "\\" + "Игроки.xml"; using (Stream fStream = new FileStream(dbPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) { ser.Serialize(fStream, DatabaseToShow); fStream.Flush(); fStream.Close(); } } catch (Exception ex) { Tools.MsgBox.Exception(ex, "Ошибка сохранения бд игроков для просмотра."); } }