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);
            }
        }
Beispiel #2
0
    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;
        }
    }
Beispiel #3
0
 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);
 }
Beispiel #4
0
    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);
        }
Beispiel #7
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;
        }
        /// <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);
        }