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 static int GetLocalIdByServerId(long serverId)
        {
            int objId;

            if (ConverterServerId == null ||
                !ConverterServerId.TryGetValue(serverId, out objId))
            {
                return(0);
            }
            return(objId);
        }
        public static WorldObjectEntry GetMyByServerId(long serverId)
        {
            WorldObjectEntry storeWO;
            int objId;

            if (ConverterServerId == null ||
                !ConverterServerId.TryGetValue(serverId, out objId) ||
                MyWorldObjectEntry == null ||
                !MyWorldObjectEntry.TryGetValue(objId, out storeWO))
            {
                return(null);
            }
            return(storeWO);
        }
        public static WorldObject GetWOByServerId(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;
            }

            for (int i = 0; i < allWorldObjects.Count; i++)
            {
                if (allWorldObjects[i].ID == objId)
                {
                    return(allWorldObjects[i]);
                }
            }
            return(null);
        }
        /// <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;
            }
        }