public static WorldObjectEntry GetServerInfo(WorldObject myWorldObject) { WorldObjectEntry storeWO; if (WorldObjectEntrys == null || !WorldObjectEntrys.TryGetValue(myWorldObject.ID, out storeWO)) { return(null); } return(storeWO); }
public static WorldObjectEntry GetMyByLocalId(int id) { WorldObjectEntry storeWO; if (WorldObjectEntrys == null || !WorldObjectEntrys.TryGetValue(id, out storeWO)) { return(null); } return(storeWO); }
public static WorldObjectEntry GetMyByServerId(long serverId) { WorldObjectEntry storeWO; int objId; if (ConverterServerId == null || !ConverterServerId.TryGetValue(serverId, out objId) || WorldObjectEntrys == null || !WorldObjectEntrys.TryGetValue(objId, out storeWO)) { return(null); } return(storeWO); }
/// <summary> /// Для всех объектов с сервера, в т.ч. и для наших. /// Для своих объектов заполняем данные в словарь MyWorldObjectEntry /// </summary> /// <param name="worldObjectEntry"></param> /// <returns></returns> public static void ApplyWorldObject(WorldObjectEntry worldObjectEntry) { var err = ""; try { List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects; err += "1 "; if (worldObjectEntry.LoginOwner == SessionClientController.My.Login) { //для своих нужно только занести в MyWorldObjectEntry (чтобы запомнить ServerId) if (!WorldObjectEntrys.Any(wo => wo.Value.ServerId == worldObjectEntry.ServerId)) { err += "2 "; for (int i = 0; i < allWorldObjects.Count; i++) { err += "3 "; if (!WorldObjectEntrys.ContainsKey(allWorldObjects[i].ID) && allWorldObjects[i].Tile == worldObjectEntry.Tile && (allWorldObjects[i] is Caravan && worldObjectEntry.Type == WorldObjectEntryType.Caravan || allWorldObjects[i] is MapParent && worldObjectEntry.Type == WorldObjectEntryType.Base)) { err += "4 "; var id = allWorldObjects[i].ID; Loger.Log("SetMyID " + id + " ServerId " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); WorldObjectEntrys.Add(id, worldObjectEntry); ConverterServerId[worldObjectEntry.ServerId] = id; err += "5 "; return; } } err += "6 "; Loger.Log("ToDel " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); //объект нужно удалить на сервере - его нету у самого игрока (не заполняется при самом первом обновлении после загрузки) if (ToDelete != null) { ToDelete.Add(worldObjectEntry); } err += "7 "; } else { //если такой есть, то обновляем информацию var pair = WorldObjectEntrys.First(wo => wo.Value.ServerId == worldObjectEntry.ServerId); WorldObjectEntrys[pair.Key] = worldObjectEntry; } return; } //поиск уже существующих CaravanOnline worldObject = null; /* * int existId; * if (ConverterServerId.TryGetValue(worldObjectEntry.ServerId, out existId)) * { * for (int i = 0; i < allWorldObjects.Count; i++) * { * if (allWorldObjects[i].ID == existId && allWorldObjects[i] is CaravanOnline) * { * worldObject = allWorldObjects[i] as CaravanOnline; * break; * } * } * } */ err += "8 "; worldObject = GetOtherByServerId(worldObjectEntry.ServerId, allWorldObjects); err += "9 "; //если тут база другого игрока, то удаление всех кто занимает этот тайл, кроме караванов (удаление новых НПЦ и событий с занятых тайлов) if (worldObjectEntry.Type == WorldObjectEntryType.Base) { err += "10 "; for (int i = 0; i < allWorldObjects.Count; i++) { err += "11 "; if (allWorldObjects[i].Tile == worldObjectEntry.Tile && allWorldObjects[i] != worldObject && !(allWorldObjects[i] is Caravan) && !(allWorldObjects[i] is CaravanOnline) && (allWorldObjects[i].Faction == null || !allWorldObjects[i].Faction.IsPlayer)) { err += "12 "; Loger.Log("Remove " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); Find.WorldObjects.Remove(allWorldObjects[i]); } } } err += "13 "; //создание if (worldObject == null) { err += "14 "; worldObject = worldObjectEntry.Type == WorldObjectEntryType.Base ? (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.BaseOnline) : (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.CaravanOnline); err += "15 "; worldObject.SetFaction(Faction.OfPlayer); worldObject.Tile = worldObjectEntry.Tile; Find.WorldObjects.Add(worldObject); err += "16 "; ConverterServerId.Add(worldObjectEntry.ServerId, worldObject.ID); Loger.Log("Add " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name + " " + worldObjectEntry.LoginOwner); err += "17 "; } else { err += "18 "; ConverterServerId[worldObjectEntry.ServerId] = worldObject.ID; //на всякий случай err += "19 "; //Loger.Log("SetID " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); } err += "20 "; //обновление worldObject.Tile = worldObjectEntry.Tile; err += "21 "; worldObject.OnlineWObject = worldObjectEntry; } catch { Loger.Log("ApplyWorldObject ErrorLog: " + err); throw; } }
/// <summary> /// Только для своих объетков /// </summary> public static WorldObjectEntry GetWorldObjectEntry(WorldObject worldObject , PlayerGameProgress gameProgress , Dictionary <Map, List <Pawn> > cacheColonists) { var worldObjectEntry = new WorldObjectEntry(); worldObjectEntry.Type = worldObject is Caravan ? WorldObjectEntryType.Caravan : WorldObjectEntryType.Base; worldObjectEntry.Tile = worldObject.Tile; worldObjectEntry.Name = worldObject.LabelCap; worldObjectEntry.LoginOwner = SessionClientController.My.Login; worldObjectEntry.FreeWeight = 999999; //определяем цену и вес var caravan = worldObject as Caravan; if (caravan != null) { //Loger.Log("Client TestBagSD 002"); var transferables = CalculateTransferables(caravan); //Loger.Log("Client TestBagSD 003"); List <ThingCount> stackParts = new List <ThingCount>(); for (int i = 0; i < transferables.Count; i++) { TransferableUtility.TransferNoSplit(transferables[i].things, transferables[i].MaxCount /*CountToTransfer*/, delegate(Thing originalThing, int toTake) { stackParts.Add(new ThingCount(originalThing, toTake)); }, false, false); } //Loger.Log("Client TestBagSD 004"); worldObjectEntry.FreeWeight = CollectionsMassCalculator.Capacity(stackParts) - CollectionsMassCalculator.MassUsage(stackParts, IgnorePawnsInventoryMode.Ignore, false, false); //Loger.Log("Client TestBagSD 005"); worldObjectEntry.MarketValue = 0f; worldObjectEntry.MarketValuePawn = 0f; for (int i = 0; i < stackParts.Count; i++) { int count = stackParts[i].Count; if (count > 0) { Thing thing = stackParts[i].Thing; if (thing is Pawn) { worldObjectEntry.MarketValuePawn += thing.MarketValue + WealthWatcher.GetEquipmentApparelAndInventoryWealth(thing as Pawn); GameProgressAdd(gameProgress, thing as Pawn); } else { worldObjectEntry.MarketValue += thing.MarketValue * (float)count; } } } //Loger.Log("Client TestBagSD 006"); } else if (worldObject is Settlement) { //Loger.Log("Client TestBagSD 007"); var map = (worldObject as Settlement).Map; if (map != null) { //Loger.Log("Client TestBagSD 008"); try { DateTime lastForceRecount; if (!LastForceRecount.TryGetValue(map.uniqueID, out lastForceRecount)) { LastForceRecount.Add(map.uniqueID, DateTime.UtcNow.AddSeconds(new Random(map.uniqueID * 7).Next(0, 10))); } else if ((DateTime.UtcNow - lastForceRecount).TotalSeconds > 30) { LastForceRecount[map.uniqueID] = DateTime.UtcNow; ModBaseData.RunMainThread(() => { map.wealthWatcher.ForceRecount(); }); } worldObjectEntry.MarketValue = map.wealthWatcher.WealthTotal; } catch { Thread.Sleep(100); try { worldObjectEntry.MarketValue = map.wealthWatcher.WealthTotal; } catch { } } worldObjectEntry.MarketValuePawn = 0; //Loger.Log("Client TestBagSD 015"); List <Pawn> ps; if (!cacheColonists.TryGetValue(map, out ps)) { var mapPawnsA = new Pawn[map.mapPawns.AllPawnsSpawned.Count]; map.mapPawns.AllPawnsSpawned.CopyTo(mapPawnsA); ps = mapPawnsA.Where(p => p.Faction == Faction.OfPlayer && p.RaceProps.Humanlike).ToList(); cacheColonists[map] = ps; } //Loger.Log("Client TestBagSD 016"); foreach (Pawn current in ps) { worldObjectEntry.MarketValuePawn += current.MarketValue; GameProgressAdd(gameProgress, current); } //Loger.Log("Client TestBagSD 017"); //Loger.Log("Map things "+ worldObjectEntry.MarketValue + " pawns " + worldObjectEntry.MarketValuePawn); } } //Loger.Log("Client TestBagSD 018"); WorldObjectEntry storeWO; if (WorldObjectEntrys.TryGetValue(worldObject.ID, out storeWO)) { //если серверу приходит объект без данного ServerId, значит это наш новый объект (кроме первого запроса, т.к. не было ещё загрузки) worldObjectEntry.ServerId = storeWO.ServerId; } //Loger.Log("Client TestBagSD 019"); return(worldObjectEntry); }
public static void SendToServer(ModelPlayToServer toServ, bool firstRun, ModelGameServerInfo modelGameServerInfo) { //Loger.Log("Empire=" + Find.FactionManager.FirstFactionOfDef(FactionDefOf.Empire)?.GetUniqueLoadID()); toServ.LastTick = (long)Find.TickManager.TicksGame; var gameProgress = new PlayerGameProgress(); var allWorldObjectsArr = new WorldObject[Find.WorldObjects.AllWorldObjects.Count]; Find.WorldObjects.AllWorldObjects.CopyTo(allWorldObjectsArr); var allWorldObjects = allWorldObjectsArr.Where(wo => wo != null).ToList(); List <Faction> factionList = Find.FactionManager.AllFactionsListForReading; if (SessionClientController.Data.GeneralSettings.EquableWorldObjects) { #region Send to Server: firstRun EquableWorldObjects try { // Game on init if (firstRun && modelGameServerInfo != null) { if (modelGameServerInfo.WObjectOnlineList.Count > 0) { toServ.WObjectOnlineList = allWorldObjectsArr.Where(wo => wo is Settlement) .Where(wo => wo.HasName && !wo.Faction.IsPlayer).Select(obj => GetWorldObjects(obj)).ToList(); } if (modelGameServerInfo.FactionOnlineList.Count > 0) { List <Faction> factions = Find.FactionManager.AllFactionsListForReading; toServ.FactionOnlineList = factions.Select(obj => GetFactions(obj)).ToList(); } return; } } catch (Exception e) { Loger.Log("Exception >> " + e); Log.Error("SendToServer FirstRun error"); return; } #endregion } if (!firstRun) { //Loger.Log("Client TestBagSD 035"); Dictionary <Map, List <Pawn> > cacheColonists = new Dictionary <Map, List <Pawn> >(); //отправка всех новых и измененных объектов игрока toServ.WObjects = allWorldObjects .Where(o => o.Faction?.IsPlayer == true && //o.Faction != null && o.Faction.IsPlayer (o is Settlement || o is Caravan)) //Чтобы отсеч разные карты событий .Select(o => GetWorldObjectEntry(o, gameProgress, cacheColonists)) .ToList(); LastSendMyWorldObjects = toServ.WObjects; //Loger.Log("Client TestBagSD 036"); //свои объекты которые удалил пользователь с последнего обновления if (ToDelete != null) { var toDeleteNewNow = WorldObjectEntrys .Where(p => !allWorldObjects.Any(wo => wo.ID == p.Key)) .Select(p => p.Value) .ToList(); ToDelete.AddRange(toDeleteNewNow); } toServ.WObjectsToDelete = ToDelete; } toServ.GameProgress = gameProgress; if (SessionClientController.Data.GeneralSettings.EquableWorldObjects) { #region Send to Server: Non-Player World Objects // Non-Player World Objects try { var OnlineWObjArr = allWorldObjectsArr.Where(wo => wo is Settlement) .Where(wo => wo.HasName && !wo.Faction.IsPlayer); if (!firstRun) { if (LastWorldObjectOnline != null && LastWorldObjectOnline.Count > 0) { toServ.WObjectOnlineToDelete = LastWorldObjectOnline.Where(WOnline => !OnlineWObjArr.Any(wo => ValidateOnlineWorldObject(WOnline, wo))).ToList(); toServ.WObjectOnlineToAdd = OnlineWObjArr.Where(wo => !LastWorldObjectOnline.Any(WOnline => ValidateOnlineWorldObject(WOnline, wo))) .Select(obj => GetWorldObjects(obj)).ToList(); } } toServ.WObjectOnlineList = OnlineWObjArr.Select(obj => GetWorldObjects(obj)).ToList(); LastWorldObjectOnline = toServ.WObjectOnlineList; } catch (Exception e) { Loger.Log("Exception >> " + e); Log.Error("ERROR SendToServer WorldObject Online"); } #endregion #region Send to Server: Non-Player Factions // Non-Player Factions try { if (!firstRun) { if (LastFactionOnline != null && LastFactionOnline.Count > 0) { toServ.FactionOnlineToDelete = LastFactionOnline.Where(FOnline => !factionList.Any(f => ValidateFaction(FOnline, f))).ToList(); toServ.FactionOnlineToAdd = factionList.Where(f => !LastFactionOnline.Any(FOnline => ValidateFaction(FOnline, f))) .Select(obj => GetFactions(obj)).ToList(); } } toServ.FactionOnlineList = factionList.Select(obj => GetFactions(obj)).ToList(); LastFactionOnline = toServ.FactionOnlineList; } catch (Exception e) { Loger.Log("Exception >> " + e); Log.Error("ERROR SendToServer Faction Online"); } #endregion } }