Ejemplo n.º 1
0
        /// <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;
            }
        }
Ejemplo n.º 2
0
        /// <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;
        }