Exemple #1
0
        private void exchangeOfGoods(Caravan caravan)
        {
            //Pawn bestNegotiator = CaravanVisitUtility.BestNegotiator(caravan);
            ThingOwner <Thing> сontainer = new ThingOwner <Thing>();
            Dialog_TradeOnline form      = null;

            if (сaravanOnline.OnlineWObject == null)
            {
                Log.Error("OCity_Caravan_LOGNoData".Translate());
                return;
            }

            var goods = GameUtils.GetAllThings(caravan);

            form = new Dialog_TradeOnline(goods
                                          , сaravanOnline.OnlinePlayerLogin
                                          , сaravanOnline.OnlineWObject.FreeWeight
                                          , () =>
            {
                if (!SessionClientController.Data.BackgroundSaveGameOff)
                {
                    var select            = form.GetSelect();
                    bool selectAllCaravan = caravan.PawnsListForReading.Count == select.Count(s => s.Key is Pawn);
                    if (selectAllCaravan)
                    {
                        Log.Message("OCity_Caravan_LOGSwap".Translate());
                        select = new Dictionary <Thing, int>();
                        foreach (var pawn in caravan.PawnsListForReading)
                        {
                            foreach (var item in pawn.inventory.innerContainer.ToDictionary(t => t, t => t.stackCount))
                            {
                                select.Add(item.Key, item.Value);
                            }
                            select.Add(pawn, 1);
                            pawn.inventory.innerContainer.Clear();
                        }
                    }
                    //передаем выбранные товары из caravan к другому игроку в сaravanOnline
                    var sendThings = new List <ThingEntry>();
                    foreach (var pair in select)
                    {
                        var thing     = pair.Key;
                        var numToTake = pair.Value;
                        if (thing is Pawn)
                        {
                            var pawn = thing as Pawn;
                            //если отдали пешку, то выкладываем все другим и удаляемся из каравана
                            var things = pawn.inventory.innerContainer.ToList();
                            pawn.inventory.innerContainer.Clear();
                            GameUtils.DeSpawnSetupOnCaravan(caravan, pawn);
                            foreach (var thin in things)
                            {
                                var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null);
                                if (p != null)
                                {
                                    p.inventory.innerContainer.TryAdd(thin, true);
                                }
                            }
                        }
                        sendThings.Add(ThingEntry.CreateEntry(thing, numToTake));
                    }

                    if (selectAllCaravan)
                    {
                        //удаляем пешку из игры
                        foreach (var pawn in caravan.PawnsListForReading)
                        {
                            GameUtils.PawnDestroy(pawn);
                        }

                        Find.WorldObjects.Remove(caravan);
                    }
                    else
                    {
                        foreach (var pair in select)
                        {
                            var thing     = pair.Key;
                            var numToTake = pair.Value;
                            if (thing is Pawn)
                            {
                                var pawn = thing as Pawn;
                                //удаляем пешку из игры
                                GameUtils.PawnDestroy(pawn);
                            }
                            else
                            {
                                //если отдали вешь, то находим кто её тащит и убираем с него
                                Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(caravan, thing);
                                ownerOf.inventory.innerContainer.TryTransferToContainer(thing, сontainer, numToTake);
                            }
                        }
                    }

                    //После передачи сохраняем, чтобы нельзя было обузить, после чего передаем вещи
                    SessionClientController.SaveGameNowSingleAndCommandSafely(
                        (connect) =>
                    {
                        return(connect.SendThings(sendThings
                                                  , SessionClientController.My.Login
                                                  , сaravanOnline.OnlinePlayerLogin
                                                  , сaravanOnline.OnlineWObject.ServerId
                                                  , сaravanOnline.Tile
                                                  ));
                    },
                        null,
                        null); //если не удалось отправить письмо, то жопа так как сейв уже прошел
                }
            });
            Find.WindowStack.Add(form);
        }