public static WorldObjectEntry GetServerInfo(WorldObject myWorldObject)
        {
            WorldObjectEntry storeWO;

            if (MyWorldObjectEntry == null ||
                !MyWorldObjectEntry.TryGetValue(myWorldObject.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) ||
                MyWorldObjectEntry == null ||
                !MyWorldObjectEntry.TryGetValue(objId, out storeWO))
            {
                return(null);
            }
            return(storeWO);
        }
示例#3
0
        public static void SendToServer(ModelPlayToServer toServ)
        {
            toServ.LastTick = (long)Find.TickManager.TicksGame;

            //отправка всех новых и измененных объектов игрока
            toServ.WObjects = Find.WorldObjects.AllWorldObjects
                              .Where(o => o.Faction != null && o.Faction.IsPlayer && !(o is CaravanOnline) && !(o is BaseOnline))
                              .Select(o => GetWorldObjectEntry(o))
                              .ToList();

            //свои объекты которые удалил пользователь с последнего обновления
            if (ToDelete != null)
            {
                var toDeleteNewNow = MyWorldObjectEntry
                                     .Where(p => !Find.WorldObjects.AllWorldObjects.Any(wo => wo.ID == p.Key))
                                     .Select(p => p.Value)
                                     .ToList();
                ToDelete.AddRange(toDeleteNewNow);
            }

            toServ.WObjectsToDelete = ToDelete;
        }
        /// <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);
        }
        public static void LoadFromServer(ModelPlayToClient fromServ, bool removeMissing)
        {
            if (removeMissing)
            {
                //запускается только при первом получении данных от сервера после загрузки или создания карты
                //удаляем все объекты других игроков (на всякий случай, т.к. в сейв они не сохраняются)

                var missingWObjects = Find.WorldObjects.AllWorldObjects
                                      .Select(o => o as CaravanOnline)
                                      .Where(o => o != null)
                                      //.Where(o => !fromServ.WObjects.Any(wo => wo.ServerId == o.OnlineWObject.ServerId))
                                      .ToList();
                for (int i = 0; i < missingWObjects.Count; i++)
                {
                    Find.WorldObjects.Remove(missingWObjects[i]);
                }
                Loger.Log("RemoveMissing " + missingWObjects.Count);
            }

            //обновление всех объектов
            ToDelete = new List <WorldObjectEntry>();
            if (fromServ.WObjects != null && fromServ.WObjects.Count > 0)
            {
                for (int i = 0; i < fromServ.WObjects.Count; i++)
                {
                    ApplyWorldObject(fromServ.WObjects[i]);
                }
            }
            if (fromServ.WObjectsToDelete != null && fromServ.WObjectsToDelete.Count > 0)
            {
                for (int i = 0; i < fromServ.WObjectsToDelete.Count; i++)
                {
                    DeleteWorldObject(fromServ.WObjectsToDelete[i]);
                }
            }

            //пришла посылка от каравана другого игрока
            if (fromServ.Mails != null && fromServ.Mails.Count > 0)
            {
                LongEventHandler.QueueLongEvent(delegate
                                                //LongEventHandler.ExecuteWhenFinished(delegate
                {
                    foreach (var mail in fromServ.Mails)
                    {
                        if (mail.To == null ||
                            mail.To.Login != SessionClientController.My.Login ||
                            mail.Things == null ||
                            mail.Things.Count == 0 ||
                            mail.PlaceServerId <= 0)
                        {
                            continue;
                        }
                        //находим наш объект, кому пришла передача
                        var placeId = MyWorldObjectEntry
                                      .Where(p => p.Value.ServerId == mail.PlaceServerId)
                                      .Select(p => p.Key)
                                      .FirstOrDefault();

                        Loger.Log("Mail " + placeId + " "
                                  + (mail.From == null ? "-" : mail.From.Login) + "->"
                                  + (mail.To == null ? "-" : mail.To.Login) + ":"
                                  + mail.ContentString());
                        WorldObject place;
                        if (placeId == 0)
                        {
                            //если нет, и какой-то сбой, посылаем в первый поселек
                            place = Find.WorldObjects.Settlements
                                    .FirstOrDefault(f => f.Faction == Faction.OfPlayer && f is MapParent && ((MapParent)f).Map.IsPlayerHome);
                        }
                        else
                        {
                            place = Find.WorldObjects.AllWorldObjects
                                    .FirstOrDefault(o => o.ID == placeId && o.Faction == Faction.OfPlayer);
                        }
                        //создаем объекты
                        if (place != null)
                        {
                            DropToWorldObject(place, mail.Things, (mail.From == null ? "-" : mail.From.Login));
                        }
                    }
                }, "", false, null);
            }
        }
示例#7
0
        public static void LoadFromServer(ModelPlayToClient fromServ)
        {
            //обновление всех объектов
            ToDelete = new List <WorldObjectEntry>();
            if (fromServ.WObjects != null && fromServ.WObjects.Count > 0)
            {
                for (int i = 0; i < fromServ.WObjects.Count; i++)
                {
                    ApplyWorldObject(fromServ.WObjects[i]);
                }
            }
            if (fromServ.WObjectsToDelete != null && fromServ.WObjectsToDelete.Count > 0)
            {
                for (int i = 0; i < fromServ.WObjectsToDelete.Count; i++)
                {
                    DeleteWorldObject(fromServ.WObjectsToDelete[i]);
                }
            }

            //пришла посылка от каравана другого игрока
            if (fromServ.Mails != null && fromServ.Mails.Count > 0)
            {
                LongEventHandler.QueueLongEvent(delegate
                                                //LongEventHandler.ExecuteWhenFinished(delegate
                {
                    foreach (var mail in fromServ.Mails)
                    {
                        if (mail.To == null ||
                            mail.To.Login != SessionClientController.My.Login ||
                            mail.Things == null ||
                            mail.Things.Count == 0 ||
                            mail.PlaceServerId <= 0)
                        {
                            continue;
                        }
                        //находим наш объект, кому пришла передача
                        var placeId = MyWorldObjectEntry
                                      .Where(p => p.Value.ServerId == mail.PlaceServerId)
                                      .Select(p => p.Key)
                                      .FirstOrDefault();

                        Loger.Log("Mail " + placeId + " "
                                  + (mail.From == null ? "-" : mail.From.Login) + "->"
                                  + (mail.To == null ? "-" : mail.To.Login) + ":"
                                  + mail.ContentString());
                        WorldObject place;
                        if (placeId == 0)
                        {
                            //если нет, и какой-то сбой, посылаем в первый поселек
                            place = Find.WorldObjects.FactionBases
                                    .FirstOrDefault(f => f.Faction == Faction.OfPlayer);
                        }
                        else
                        {
                            place = Find.WorldObjects.AllWorldObjects
                                    .FirstOrDefault(o => o.ID == placeId && o.Faction == Faction.OfPlayer);
                        }
                        //создаем объекты
                        if (place != null)
                        {
                            DropToWorldObject(place, mail.Things, (mail.From == null ? "-" : mail.From.Login));
                        }
                    }
                }, "", false, null);
            }
        }