Exemple #1
0
        public static void MailProcessDeleteByServerId(ModelMailTrade mail)
        {
            Loger.Log("Client MailProcessDeleteByServerId " + mail.PlaceServerId);

            if (mail.PlaceServerId <= 0)
            {
                Loger.Log("Mail fail: no data");
                return;
            }

            var place = GetPlace(mail, false, true);

            if (place != null)
            {
                Find.WorldObjects.Remove(place);

                //автосейв с единым сохранением
                SessionClientController.SaveGameNow(true);
            }
        }
        public static void MailProcessStartIncident(ModelMail incoming)
        {
            Loger.Log("IncidentLod MailController.MailProcessStartIncident 1");
            var mail = (ModelMailStartIncident)incoming;

            Find.TickManager.Pause();

            var incident = new Incidents().GetIncident(mail.IncidentType);

            incident.mult        = mail.IncidentMult;
            incident.arrivalMode = mail.IncidentArrivalMode;
            incident.strategy    = mail.IncidentStrategy;
            incident.faction     = mail.IncidentFaction;
            incident.attacker    = mail.From.Login;
            incident.place       = GetPlace(mail);
            incident.TryExecuteEvent();

            if (!SessionClientController.Data.BackgroundSaveGameOff)
            {
                SessionClientController.SaveGameNow(true);
            }
            Loger.Log("IncidentLod MailController.MailProcessStartIncident 2");
        }
Exemple #3
0
        /// <summary>
        /// Расчитывает стоимость инциндента, и изымает её.
        /// </summary>
        /// <param name="command">Текстовая команда для чата</param>
        /// <param name="onliCheck">Только рассчитать, не изымая.</param>
        /// <error>Ошибка, или результат при onliCheck</error>
        /// <returns>Строка с количество требуемой стоимости</returns>
        public static string GetCostOnGameByCommand(string command, bool onliCheck, out string error)
        {
            Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 1 command:" + command);
            //разбираем аргументы в кавычках '. Удвоенная кавычка указывает на её символ.
            string        cmd;
            List <string> args;

            ChatUtils.ParceCommand(command, out cmd, out args);

            if (args.Count < 3)
            {
                error = "OC_Incidents_OCIncident_WrongArg".Translate().ToString();
                Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand error:" + error);
                return(null);
            }

            // /call raid '111' 1 10 air tribe

            //проверка, что денег хватает
            int cost = OCIncident.CalculateRaidCost(args[0].ToLower(), Int64.Parse(args[2])
                                                    , args.Count > 3 ? Int32.Parse(args[3]) : 1
                                                    , args.Count > 4 ? args[4].ToLower() : null
                                                    , args.Count > 5 ? args[5].ToLower() : null);
            int gold = -1;

            Map map = null;

            if (cost > 0)
            {
                gold = GameUtils.FindThings(ThingDefOf.Gold, 0, false);
            }

            if (cost < 0 || gold < 0 || gold < cost)
            {
                error = cost < 0 || gold < 0
                    ? "OC_Incidents_OCIncident_WealthErr".Translate().ToString() + $" cost={cost} gold={gold}"
                    : "OC_Incidents_OCIncident_GoldErr".Translate(gold, cost, cost - gold).ToString();
                Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand error:" + error);
                return(null);
            }

            if (onliCheck)
            {
                error = null;
                return("OC_Incidents_OCIncident_NotEnoughGold".Translate(cost));
            }

            Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 2");

            //отнимаем нужное кол-во денег(золото или серебро... или что-нибудь ещё)
            GameUtils.FindThings(ThingDefOf.Gold, cost, false);

            Loger.Log("IncidentLod OCIncident.GetCostOnGameByCommand 3");
            //принудительное сохранение
            if (!SessionClientController.Data.BackgroundSaveGameOff)
            {
                SessionClientController.SaveGameNow(true);
            }
            Loger.Log("IncidentLod ChatController.AfterStartIncident 4");

            error = null;
            return("OC_Incidents_OCIncident_GoldPay".Translate(cost));
        }
        private static void UpdateWorld(bool firstRun = false)
        {
            lock (UpdatingWorld)
            {
                Command((connect) =>
                {
                    //собираем пакет на сервер
                    var toServ = new ModelPlayToServer()
                    {
                        UpdateTime = Data.UpdateTime, //время прошлого запроса
                    };
                    //данные сохранения игры
                    if (Data.SaveFileData != null)
                    {
                        toServ.SaveFileData = Data.SaveFileData;
                        toServ.SingleSave   = Data.SingleSave;
                        Data.SaveFileData   = null;
                    }

                    //собираем данные с планеты
                    if (!firstRun)
                    {
                        UpdateWorldController.SendToServer(toServ);
                    }

                    if (firstRun)
                    {
                        GetPlayersInfoCountRequest = 0;
                    }

                    //запрос на информацию об игроках. Можно будет ограничить редкое получение для тех кто оффлайн
                    if (Data.Chats != null && Data.Chats[0].PartyLogin != null)
                    {
                        if (Data.Players == null || Data.Players.Count == 0 ||
                            GetPlayersInfoCountRequest % 5 == 0)
                        {
                            //в начале и раз в пол минуты (5 сек между UpdateWorld * 5) получаем инфу обо всех
                            toServ.GetPlayersInfo = Data.Chats[0].PartyLogin;
                        }
                        else
                        {
                            //в промежутках о тех кто онлайн
                            toServ.GetPlayersInfo = Data.Players.Values.Where(p => p.Online).Select(p => p.Public.Login).ToList();
                        }
                        GetPlayersInfoCountRequest++;
                        //Loger.Log("Client " + My.Login + " UpdateWorld* " + (toServ.GetPlayersInfo.Count.ToString())
                        //    + " " + (toServ.GetPlayersInfo.Any(p => p == SessionClientController.My.Login) ? "1" : "0"));
                    }

                    //отправляем на сервер, получаем ответ
                    ModelPlayToClient fromServ = connect.PlayInfo(toServ);

                    //Loger.Log("Client UpdateWorld 5 ");
                    Loger.Log("Client " + My.Login + " UpdateWorld "
                              + string.Format("Отпр. свои {0}, своиDel {1}{5}. Пришло {2}, del {3}, игроков {8}, посылок {4}{6}{7}"
                                              , toServ.WObjects == null ? 0 : toServ.WObjects.Count
                                              , toServ.WObjectsToDelete == null ? 0 : toServ.WObjectsToDelete.Count
                                              , fromServ.WObjects == null ? 0 : fromServ.WObjects.Count
                                              , fromServ.WObjectsToDelete == null ? 0 : fromServ.WObjectsToDelete.Count
                                              , fromServ.Mails == null ? 0 : fromServ.Mails.Count
                                              , toServ.SaveFileData == null || toServ.SaveFileData.Length == 0 ? "" : ", сейв"
                                              , fromServ.AreAttacking ? " Атакуют!" : ""
                                              , fromServ.NeedSaveAndExit ? " Команда на отключение" : ""
                                              , fromServ.PlayersInfo == null ? "null" : fromServ.PlayersInfo.Count.ToString()
                                              ));

                    //сохраняем время актуальности данных
                    Data.UpdateTime = fromServ.UpdateTime;
                    if (!string.IsNullOrEmpty(fromServ.KeyReconnect))
                    {
                        Data.KeyReconnect = fromServ.KeyReconnect;
                    }

                    //обновляем информацию по игрокам
                    if (fromServ.PlayersInfo != null && fromServ.PlayersInfo.Count > 0)
                    {
                        foreach (var pi in fromServ.PlayersInfo)
                        {
                            if (pi.Login == null)
                            {
                                continue;
                            }
                            Data.Players[pi.Login] = new PlayerClient()
                            {
                                Public = pi
                            };
                            if (pi.Login == My.Login)
                            {
                                My        = pi;
                                Data.MyEx = Data.Players[pi.Login];
                                //Loger.Log("Client " + My.Login + " UpdateWorld* " + My.LastOnlineTime.ToString("o") + " " + DateTime.UtcNow.ToString("o")
                                //   + " " + (toServ.GetPlayersInfo.Any(p => p == My.Login) ? "1" : "0"));
                            }
                        }
                    }

                    //обновляем планету
                    UpdateWorldController.LoadFromServer(fromServ, firstRun);

                    //обновляем инфу по поселениям
                    var allWObjects = Find.WorldObjects.AllWorldObjects
                                      .Select(o => o as CaravanOnline)
                                      .Where(o => o != null)
                                      .ToList();
                    foreach (var pi in Data.Players)
                    {
                        if (pi.Value.Public.Login == My.Login)
                        {
                            continue;
                        }
                        pi.Value.WObjects = allWObjects.Where(wo => wo.OnlinePlayerLogin == pi.Key).ToList();
                    }

                    //Сохраняем и выходим
                    if (fromServ.NeedSaveAndExit)
                    {
                        if (!SessionClientController.Data.BackgroundSaveGameOff)
                        {
                            SessionClientController.SaveGameNow(false, () =>
                            {
                                SessionClientController.Disconnected("OCity_SessionCC_Shutdown_Command_ProgressSaved".Translate());
                            });
                        }
                        else
                        {
                            SessionClientController.Disconnected("OCity_SessionCC_Shutdown_Command".Translate());
                        }
                    }

                    //если на нас напали запускаем процесс
                    if (fromServ.AreAttacking && GameAttackHost.AttackMessage())
                    {
                        GameAttackHost.Get.Start(connect);
                    }
                });
            }
        }
Exemple #5
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
                                          , () =>
            {
                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));
                }
                SessionClientController.Command((connect) =>
                {
                    connect.SendThings(sendThings
                                       , SessionClientController.My.Login
                                       , сaravanOnline.OnlinePlayerLogin
                                       , сaravanOnline.OnlineWObject.ServerId
                                       , сaravanOnline.Tile
                                       );
                });

                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);
                        }
                    }
                }

                //После передачи сохраняем, чтобы нельзя было обузить
                if (!SessionClientController.Data.BackgroundSaveGameOff)
                {
                    SessionClientController.SaveGameNow(true);
                }
            });
            Find.WindowStack.Add(form);
        }