public static void DeleteWorldObject(WorldObjectEntry worldObjectEntry) { List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects; //поиск уже существующих 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; * } * } * } */ worldObject = GetOtherByServerId(worldObjectEntry.ServerId); if (worldObject != null) { Loger.Log("DeleteWorldObject " + DevelopTest.TextObj(worldObjectEntry) + " " + (worldObject == null ? "null" : worldObject.ID.ToString())); Find.WorldObjects.Remove(worldObject); } }
private void OnRequestPropCommand(NetworkMessage message) { var msg = message.ReadMessage <Messages.PropCommandMessage>(); WorldObjectEntry entry = null; switch (msg.Command) { case PropCommandEnum.Delete: if (DeleteProrpInternal(msg.Id, out entry)) { NetworkServer.SendToAll(Messages.PROP_COMMAND, new Messages.PropCommandMessage(entry.id, msg.Command)); } break; case PropCommandEnum.Clone: if (objects.TryGetValue(msg.Id, out entry)) { WorldObject obj = new WorldObject(); entry.Prop.SaveTo(obj); entry = CreateObjectServer(obj); NetworkServer.SendToAll(Messages.SPAWN_PROP, new Messages.SpawnPropMessage(obj, entry.id)); NetworkServer.SendToClient(message.conn.connectionId, Messages.PROP_COMMAND, new Messages.PropCommandMessage(entry.id, msg.Command)); } break; default: Debug.LogError("Unknow Commad: " + msg.Command); break; } }
private bool DeleteProrpInternal(long id, out WorldObjectEntry entry) { if (objects.TryGetValue(id, out entry) && objects.Remove(id)) { Destroy(entry.Prop.gameObject); return(true); } return(false); }
private WorldObjectEntry CreateObjectInternal(WorldObject obj, long id) { var prop = CreatePropGameObjectInternal(obj); var objectEntry = new WorldObjectEntry(id, prop); prop.SetId(objectEntry.id); prop.name = string.Format("[{0}] {1}", objectEntry.id, prop.name); objects.Add(objectEntry.id, objectEntry); return(objectEntry); }
/// <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 (MyWorldObjectEntry.Any(wo => wo.Value.ServerId == worldObjectEntry.ServerId)) { return; } err += "2 "; for (int i = 0; i < allWorldObjects.Count; i++) { err += "3 "; if (!MyWorldObjectEntry.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); MyWorldObjectEntry.Add(id, worldObjectEntry); if (!ConverterServerId.ContainsKey(worldObjectEntry.ServerId)) { ConverterServerId.Add(worldObjectEntry.ServerId, id); } err += "5 "; return; } } err += "6 "; Loger.Log("ToDel " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); //объект нужно удалить на сервере - его нету у самого игрока (не заполняется при самом первом обновлении после загрузки) if (ToDelete != null) { ToDelete.Add(worldObjectEntry); } err += "7 "; 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) { 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) { var transferables = CalculateTransferables(caravan); 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); } worldObjectEntry.FreeWeight = CollectionsMassCalculator.Capacity(stackParts) - CollectionsMassCalculator.MassUsage(stackParts, IgnorePawnsInventoryMode.Ignore, false, false); 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); } else { worldObjectEntry.MarketValue += thing.MarketValue * (float)count; } } } } else if (worldObject is Settlement) { var map = (worldObject as Settlement).Map; if (map != null) { worldObjectEntry.MarketValue = map.wealthWatcher.WealthTotal; worldObjectEntry.MarketValuePawn = 0; foreach (Pawn current in map.mapPawns.FreeColonists) { worldObjectEntry.MarketValuePawn += current.MarketValue; } //Loger.Log("Map things "+ worldObjectEntry.MarketValue + " pawns " + worldObjectEntry.MarketValuePawn); } } WorldObjectEntry storeWO; if (MyWorldObjectEntry.TryGetValue(worldObject.ID, out storeWO)) { //если серверу приходит объект без данного ServerId, значит это наш новый объект (кроме первого запроса, т.к. не было ещё загрузки) worldObjectEntry.ServerId = storeWO.ServerId; } return(worldObjectEntry); }
/// <summary> /// Для всех объектов с сервера, в т.ч. и для наших. /// Для своих объектов заполняем данные в словарь MyWorldObjectEntry /// </summary> /// <param name="worldObjectEntry"></param> /// <returns></returns> public static void ApplyWorldObject(WorldObjectEntry worldObjectEntry) { List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects; if (worldObjectEntry.LoginOwner == SessionClientController.My.Login) { //для своих нужно только занести в MyWorldObjectEntry (чтобы запомнить ServerId) if (MyWorldObjectEntry.Any(wo => wo.Value.ServerId == worldObjectEntry.ServerId)) { return; } for (int i = 0; i < allWorldObjects.Count; i++) { if (!MyWorldObjectEntry.ContainsKey(allWorldObjects[i].ID) && allWorldObjects[i].Tile == worldObjectEntry.Tile && (allWorldObjects[i] is Caravan && worldObjectEntry.Type == WorldObjectEntryType.Caravan || allWorldObjects[i] is FactionBase && worldObjectEntry.Type == WorldObjectEntryType.Base)) { Loger.Log("SetMyID " + allWorldObjects[i].ID + " ServerId " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); MyWorldObjectEntry.Add(allWorldObjects[i].ID, worldObjectEntry); return; } } Loger.Log("ToDel " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); //объект нужно удалить на сервере - его нету у самого игрока (не заполняется при самом первом обновлении после загрузки) if (ToDelete != null) { ToDelete.Add(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; } } } //если тут база другого игрока, то удаление всех кто занимает этот тайл, кроме караванов (удаление новых НПЦ и событий с занятых тайлов) if (worldObjectEntry.Type == WorldObjectEntryType.Base) { for (int i = 0; i < allWorldObjects.Count; i++) { if (allWorldObjects[i].Tile == worldObjectEntry.Tile && allWorldObjects[i] != worldObject && !(allWorldObjects[i] is Caravan) && !(allWorldObjects[i] is CaravanOnline)) { Loger.Log("Remove " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); Find.WorldObjects.Remove(allWorldObjects[i]); } } } //создание if (worldObject == null) { worldObject = worldObjectEntry.Type == WorldObjectEntryType.Base ? (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.BaseOnline) : (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.CaravanOnline); worldObject.SetFaction(Faction.OfPlayer); worldObject.Tile = worldObjectEntry.Tile; Find.WorldObjects.Add(worldObject); ConverterServerId.Add(worldObjectEntry.ServerId, worldObject.ID); Loger.Log("Add " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name + " " + worldObjectEntry.LoginOwner); } else { ConverterServerId[worldObjectEntry.ServerId] = worldObject.ID; //на всякий случай Loger.Log("SetID " + worldObjectEntry.ServerId + " " + worldObjectEntry.Name); } //обновление worldObject.Tile = worldObjectEntry.Tile; worldObject.OnlineWObject = worldObjectEntry; }
/// <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); }