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); } }
public static CaravanOnline GetOtherByServerId(long serverId, List <WorldObject> allWorldObjects = null) { int objId; if (ConverterServerId == null || !ConverterServerId.TryGetValue(serverId, out objId)) { return(null); } if (allWorldObjects == null) { allWorldObjects = Find.WorldObjects.AllWorldObjects; } CaravanOnline worldObject = null; for (int i = 0; i < allWorldObjects.Count; i++) { if (allWorldObjects[i].ID == objId && allWorldObjects[i] is CaravanOnline) { worldObject = allWorldObjects[i] as CaravanOnline; break; } } return(worldObject); }
public CaravanArrivalAction_VisitOnline(CaravanOnline сaravanOnline, string mode) { this.сaravanOnline = сaravanOnline; this.mode = mode; }
/// <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> /// Для всех объектов с сервера, в т.ч. и для наших. /// Для своих объектов заполняем данные в словарь 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; }