示例#1
0
        public static int CalculateRaidCost(string type, long serverId, int mult, string arrivalModes, string faction)
        {
            Loger.Log("IncidentLod OCIncident.CalculateRaidCost 1");
            //var serverId = UpdateWorldController.GetServerInfo(wo).ServerId;
            var target = UpdateWorldController.GetOtherByServerId(serverId) as BaseOnline;

            if (target == null)
            {
                return(-1);
            }
            var costs = target.Player.CostWorldObjects(serverId);
            var cost  = costs.MarketValue + costs.MarketValuePawn;

            if (cost <= 0)
            {
                return(-1);
            }

            //{цена поселения защитника/100 000}^(2/3) * 100 * lvl ^(3/2)
            var raidCost = (int)((float)Math.Pow(cost / 100000f, 2f / 3f) * 100f
                                 * (float)Math.Pow((float)mult, 3f / 2f) //* (float)mult
                                 * (float)SessionClientController.Data.GeneralSettings.IncidentCostPrecent / 100f
                                 * (type == "inf" ? 3f
                    : type == "acid" ? 2f
                    : type == "raid"
                    ?   (arrivalModes == "random" ? 1.5f : arrivalModes == "air" ? 1.4f : 1f)
                                    * (faction == "mech" ? 5f : faction == "pirate" ? 2f : 1f)
                    : 1f)
                                 );

            Loger.Log($"IncidentLod OCIncident.CalculateRaidCost({serverId}, {mult}). targetCost={(int)cost} raidCost={raidCost}");

            return(SessionClientController.Data.IsAdmin && Prefs.DevMode ? 1 : raidCost);
        }
示例#2
0
        public override IEnumerable <FloatMenuOption> GetFloatMenuOptions(Caravan caravan)
        {
            foreach (FloatMenuOption o in base.GetFloatMenuOptions(caravan))
            {
                yield return(o);
            }

            var player = this.Player;

            // Передача товара
            var  minCostForTrade = 25000; // эту цифру изменять вместе с ServerManager.DoWorld()
            bool disTrade        = false;

            if (SessionClientController.Data.ProtectingNovice)
            {
                var costAll = player.CostAllWorldObjects();
                disTrade = player.Public.LastTick < 3600000 / 2 || costAll.MarketValue + costAll.MarketValuePawn < minCostForTrade;
            }
            var fmoTrade = new FloatMenuOption("OCity_Caravan_Trade".Translate(OnlinePlayerLogin + " " + OnlineName)
                                               + (disTrade ? "OCity_Caravan_Abort".Translate().ToString() + " " + minCostForTrade.ToString() : "") // "Вам нет года или стоимость меньше" You are under a year old or cost less than
                                               , delegate
            {
                caravan.pather.StartPath(this.Tile, new CaravanArrivalAction_VisitOnline(this, "exchangeOfGoods"), true);
            }, MenuOptionPriority.Default, null, null, 0f, null, this);

            if (disTrade)
            {
                fmoTrade.Disabled = true;
            }
            yield return(fmoTrade);

            // Атаковать
            if (SessionClientController.My.EnablePVP &&
                this is BaseOnline &&
                GameAttacker.CanStart)
            {
                var dis = AttackUtils.CheckPossibilityAttack(SessionClientController.Data.MyEx
                                                             , player
                                                             , UpdateWorldController.GetMyByLocalId(caravan.ID).ServerId
                                                             , this.OnlineWObject.ServerId
                                                             , SessionClientController.Data.ProtectingNovice
                                                             );
                var fmo = new FloatMenuOption("OCity_Caravan_Attack".Translate(OnlinePlayerLogin + " " + OnlineName)
                                              + (dis != null ? " (" + dis + ")" : "")
                                              , delegate
                {
                    caravan.pather.StartPath(this.Tile, new CaravanArrivalAction_VisitOnline(this, "attack"), true);
                }, MenuOptionPriority.Default, null, null, 0f, null, this);

                if (dis != null)
                {
                    fmo.Disabled = true;
                }

                yield return(fmo);
            }
            //}
        }
        /// <summary>
        /// Инициализация после получения всех данных и уже запущенной игре
        /// </summary>
        public static void InitGame()
        {
            try
            {
                Loger.Log("Client InitGame()");
                //Data.ChatsTime = DateTime.UtcNow + ServerTimeDelta; //без этого указания будут получены все сообщения с каналов

                MainButtonWorker_OC.ShowOnStart();
                UpdateWorldController.ClearWorld();
                UpdateWorldController.InitGame();
                Data.UpdateTime = DateTime.MinValue;
                UpdateWorld(true);

                Data.LastServerConnect = DateTime.MinValue;

                Timers.Add(500, UpdateChats);
                Timers.Add(5000, () => UpdateWorld(false));
                Timers.Add(60000 * 15, BackgroundSaveGame);

                //устанавливаем событие на выход из игры
                GameExit.BeforeExit = () =>
                {
                    Loger.Log("Client BeforeExit ");
                    GameExit.BeforeExit = null;
                    TimersStop();
                    if (Current.Game == null)
                    {
                        return;
                    }

                    Loger.Log("Client SaveGameBeforeExit " + SaveFullName);
                    GameDataSaveLoader.SaveGame(SaveName);
                    var content = File.ReadAllBytes(SaveFullName);
                    if (content.Length > 1024)
                    {
                        Data.SaveFileData = content;
                        UpdateWorld(false);

                        Loger.Log("Client SaveGameBeforeExit OK");
                    }
                    SessionClient.Get.Disconnect();
                };
            }
            catch (Exception e)
            {
                ExceptionUtil.ExceptionLog(e, "Client InitGame Error");
                GameExit.BeforeExit = null;
                TimersStop();
                if (Current.Game == null)
                {
                    return;
                }
                SessionClient.Get.Disconnect();
            }
        }
        private static void CreatePlayerWorld(ModelInfo serverInfo)
        {
            Loger.Log("Client InitConnected() ExistMap");

            //создать поселение
            GameStarter.SetMapSize        = serverInfo.MapSize;
            GameStarter.SetPlanetCoverage = serverInfo.PlanetCoverage;
            GameStarter.SetSeed           = serverInfo.Seed;
            GameStarter.SetDifficulty     = serverInfo.Difficulty;
            GameStarter.SetScenario       = GetScenarioDefault();
            GameStarter.AfterStart        = CreatePlayerMap;

            GameStarter.GameGeneration(false);

            //выбор места на планете. Код из события завершения выбора параметров планеты Page_CreateWorldParams
            Loger.Log("Client InitConnected() ExistMap1");

            Current.Game          = new Game();
            Current.Game.InitData = new GameInitData();
            Current.Game.Scenario = GameStarter.SetScenario;
            Current.Game.Scenario.PreConfigure();
            Current.Game.storyteller = new Storyteller(StorytellerDefOf.Cassandra
                                                       , GameStarter.SetDifficulty == 0 ? DifficultyDefOf.Easy
                    : DifficultyDefOf.Rough);

            Loger.Log("Client InitConnected() ExistMap2");
            Current.Game.World = WorldGenerator.GenerateWorld(
                GameStarter.SetPlanetCoverage,
                GameStarter.SetSeed,
                GameStarter.SetOverallRainfall,
                GameStarter.SetOverallTemperature,
                OverallPopulation.Little
                );

            Loger.Log("Client InitConnected() ExistMap3");
            //после создания мира запускаем его обработку, загружаем поселения др. игроков
            UpdateWorldController.InitGame();
            UpdateWorld(true);

            Timers.Add(10000, PingServer);

            Loger.Log("Client InitConnected() ExistMap4");
            var form = GetFirstConfigPage();

            Find.WindowStack.Add(form);

            Loger.Log("Client InitConnected() ExistMap5");

            MemoryUtility.UnloadUnusedUnityAssets();

            Loger.Log("Client InitConnected() ExistMap6");
            Find.World.renderer.RegenerateAllLayersNow();

            Loger.Log("Client InitConnected() ExistMap7");
        }
示例#5
0
        private static WorldObject GetPlace(ModelMailTrade mail, bool softSettlement = true, bool softNewCaravan = false)
        {
            if (mail.PlaceServerId <= 0)
            {
                Loger.Log("Mail fail: no data");
                return(null);
            }
            //находим наш объект, кому пришла передача
            var placeId = UpdateWorldController.GetLocalIdByServerId(mail.PlaceServerId);

            Loger.Log("Mail " + placeId + " "
                      + (mail.From == null ? "-" : mail.From.Login) + "->"
                      + (mail.To == null ? "-" : mail.To.Login) + ":"
                      + mail.ContentString());
            WorldObject place = null;

            if (placeId == 0)
            {
                if (softNewCaravan)
                {
                    Loger.Log($"Mail softNewCaravan Tile={mail.Tile}");
                    //если нет, и нужен караван, то возможно он был пересоздан: ищим в той же точке новый
                    place = Find.WorldObjects.AllWorldObjects
                            .Where(o => o is Caravan && o.Tile == mail.Tile && o.Faction == Faction.OfPlayer)
                            .OrderByDescending(o => o.ID)
                            .FirstOrDefault();
                }
                else if (softSettlement)
                {
                    Loger.Log("Mail softSettlement");
                    //если нет, и какой-то сбой, посылаем в первый поселек
                    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)
            {
                Loger.Log("Mail fail: place is null");
                return(null);
            }

            return(place);
        }
示例#6
0
        public override IEnumerable <FloatMenuOption> GetFloatMenuOptions(Caravan caravan)
        {
            foreach (FloatMenuOption o in base.GetFloatMenuOptions(caravan))
            {
                yield return(o);
            }

            yield return(new FloatMenuOption("OCity_Caravan_Trade".Translate(OnlinePlayerLogin + " " + OnlineName), delegate
            {
                caravan.pather.StartPath(this.Tile, new CaravanArrivalAction_VisitOnline(this, "exchangeOfGoods"), true);
            }, MenuOptionPriority.Default, null, null, 0f, null, this));

            if (SessionClientController.My.EnablePVP &&
                this is BaseOnline &&
                GameAttacker.CanStart)
            {
                var dis = AttackUtils.CheckPossibilityAttack(SessionClientController.Data.MyEx
                                                             , this.Player
                                                             , UpdateWorldController.GetMyByLocalId(caravan.ID).ServerId
                                                             , this.OnlineWObject.ServerId
                                                             );
                var fmo = new FloatMenuOption("OCity_Caravan_Attack".Translate(OnlinePlayerLogin + " " + OnlineName)
                                              + (dis != null ? " (" + dis + ")" : "")
                                              , delegate
                {
                    caravan.pather.StartPath(this.Tile, new CaravanArrivalAction_VisitOnline(this, "attack"), true);
                }, MenuOptionPriority.Default, null, null, 0f, null, this);

                if (dis != null)
                {
                    fmo.Disabled = true;
                }

                yield return(fmo);
            }
            //}
        }
        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;
                        Data.SaveFileData   = null;
                    }

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

                    //запрос на информацию об игроках. Можно будет ограничить редкое получение для тех кто оффлайн
                    if (Data.Chats != null && Data.Chats[0].PartyLogin != null)
                    {
                        toServ.GetPlayersInfo = Data.Chats[0].PartyLogin;
                    }

                    //отправляем на сервер, получаем ответ
                    ModelPlayToClient fromServ = connect.PlayInfo(toServ);
                    Loger.Log("Client " + My.Login + " UpdateWorld "
                              + string.Format("Отпр. свои {0}, своиDel {1}{5}. Пришло {2}, del {3}, посылок {4}"
                                              , 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 ? "" : ", сейв"
                                              ));

                    //сохраняем время актуальности данных
                    Data.UpdateTime = fromServ.UpdateTime;

                    //обновляем информацию по игрокам
                    if (fromServ.PlayersInfo != null && fromServ.PlayersInfo.Count > 0)
                    {
                        foreach (var pi in fromServ.PlayersInfo)
                        {
                            if (pi.Login == null)
                            {
                                continue;
                            }
                            if (Data.Players.ContainsKey(pi.Login))
                            {
                                Data.Players[pi.Login] = new PlayerClient()
                                {
                                    Public = pi
                                }
                            }
                            ;
                            else
                            {
                                Data.Players.Add(pi.Login, new PlayerClient()
                                {
                                    Public = pi
                                });
                            }
                        }
                    }
                    var allWObjects = Find.WorldObjects.AllWorldObjects
                                      .Where(o => o is CaravanOnline)
                                      .Select(o => o as CaravanOnline)
                                      .ToList();
                    foreach (var pi in Data.Players)
                    {
                        pi.Value.WObjects = allWObjects.Where(wo => wo.OnlinePlayerLogin == pi.Key).ToList();
                    }

                    //обновляем планету
                    UpdateWorldController.LoadFromServer(fromServ);
                });
            }
        }
        /// <summary>
        /// После успешной регистрации или входа
        /// </summary>
        ///
        public static void InitConnected()
        {
            Loger.Log("Client InitConnected()");
            Data = new ClientData();
            TimersStop();
            Timers = new WorkTimer();

            var connect    = SessionClient.Get;
            var serverInfo = connect.GetInfo(true);

            My = serverInfo.My;
            ServerTimeDelta = serverInfo.ServerTime - DateTime.UtcNow;

            Loger.Log("Client IsAdmin=" + serverInfo.IsAdmin + " Seed=" + serverInfo.Seed + " ExistMap=" + My.ExistMap);
            //создаем мир, если мы админ
            if (serverInfo.IsAdmin && serverInfo.Seed == "")
            {
                Loger.Log("Client InitConnected() IsAdmin");
                var form = new Dialog_CreateWorld();
                form.PostCloseAction = () =>
                {
                    if (!form.ResultOK)
                    {
                        Disconnected("OCity_SessionCC_MsgCanceledCreateW".Translate());
                        return;
                    }
                    GameStarter.SetMapSize        = int.Parse(form.InputMapSize);
                    GameStarter.SetPlanetCoverage = float.Parse(form.InputPlanetCoverage) / 100f;
                    GameStarter.SetSeed           = form.InputSeed;
                    GameStarter.SetDifficulty     = int.Parse(form.InputDifficulty);
                    GameStarter.SetScenario       = ScenarioDefault;

                    GameStarter.AfterStart = CreatingWorld;
                    GameStarter.GameGeneration();
                };
                Find.WindowStack.Add(form);
                return;
            }

            if (!My.ExistMap)
            {
                Loger.Log("Client InitConnected() ExistMap");

                //создать поселение
                GameStarter.SetMapSize        = serverInfo.MapSize;
                GameStarter.SetPlanetCoverage = serverInfo.PlanetCoverage;
                GameStarter.SetSeed           = serverInfo.Seed;
                GameStarter.SetDifficulty     = serverInfo.Difficulty;
                GameStarter.SetScenario       = ScenarioDefault;

                GameStarter.AfterStart = CreatePlayerMap;

                GameStarter.GameGeneration(false);

                //выбор места на планете. Код из события завершения выбора параметров планеты Page_CreateWorldParams
                Loger.Log("Client InitConnected() ExistMap1");

                Current.Game          = new Game();
                Current.Game.InitData = new GameInitData();
                Current.Game.Scenario = GameStarter.SetScenario;
                Current.Game.Scenario.PreConfigure();
                Current.Game.storyteller = new Storyteller(StorytellerDefOf.Cassandra
                                                           , GameStarter.SetDifficulty == 2 ? DifficultyDefOf.Hard
                        : GameStarter.SetDifficulty == 1 ? DifficultyDefOf.Medium
                        : DifficultyDefOf.VeryEasy);

                Loger.Log("Client InitConnected() ExistMap2");
                Current.Game.World = WorldGenerator.GenerateWorld(
                    GameStarter.SetPlanetCoverage,
                    GameStarter.SetSeed,
                    GameStarter.SetOverallRainfall,
                    GameStarter.SetOverallTemperature);

                Loger.Log("Client InitConnected() ExistMap3");
                //после создания мира запускаем его обработку, загружаем поселения др. игроков
                UpdateWorldController.InitGame();
                UpdateWorld(true);

                Loger.Log("Client InitConnected() ExistMap4");
                var form = GetFirstConfigPage();
                Find.WindowStack.Add(form);

                Loger.Log("Client InitConnected() ExistMap5");

                MemoryUtility.UnloadUnusedUnityAssets();

                Loger.Log("Client InitConnected() ExistMap6");
                Find.World.renderer.RegenerateAllLayersNow();

                Loger.Log("Client InitConnected() ExistMap7");

                return;
            }

            Loger.Log("Client InitConnected() WorldLoad");

            var worldData = connect.WorldLoad();

            File.WriteAllBytes(SaveFullName, worldData.SaveFileData);
            Action loadAction = () => {
                LongEventHandler.QueueLongEvent(delegate {
                    Current.Game = new Game {
                        InitData = new GameInitData {
                            gameToLoad = SaveName
                        }
                    };
                    GameLoades.AfterLoad = () =>
                    {
                        GameLoades.AfterLoad = null;

                        //Непосредственно после загрузки игры
                        InitGame();
                    };

                    /* вместо этого сделал через гармонику
                     * LongEventHandler.ExecuteWhenFinished(() =>
                     * {
                     *  var th = new Thread(() =>
                     *  {
                     *      //не знаю как правильно привязаться к событию окончания загрузки мира
                     *      while (Current.Game == null || Current.Game.World == null || Find.WorldObjects == null)
                     *      {
                     *          Thread.Sleep(100);
                     *          Loger.Log("Sleep(100)");
                     *      }
                     *      Thread.Sleep(100);
                     *      LongEventHandler.QueueLongEvent(delegate
                     *      {
                     *          //Непосредственно после загрузки игры
                     *          InitGame();
                     *      }, "", false, null);
                     *  });
                     *  th.IsBackground = true;
                     *  th.Start();
                     * });
                     */
                }, "Play", "LoadingLongEvent", false, null);
            };

            PreLoadUtility.CheckVersionAndLoad(SaveFullName, ScribeMetaHeaderUtility.ScribeHeaderMode.Map, loadAction);
        }
示例#9
0
        /// <summary>
        /// Начинаем процесс, первые запросы информации
        /// </summary>
        /// <param name="connect"></param>
        public void Start(SessionClient connect)
        {
            Loger.Log("Client GameAttackHost Start 1");
            var tolient = connect.AttackOnlineHost(new AttackHostToSrv()
            {
                State = 2
            });

            if (!string.IsNullOrEmpty(connect.ErrorMessage))
            {
                ErrorBreak(connect.ErrorMessage);
                return;
            }

            AttackerLogin          = tolient.StartInitiatorPlayer;
            InitiatorPlaceServerId = tolient.InitiatorPlaceServerId;
            HostPlaceServerId      = tolient.HostPlaceServerId;

            Loger.Log("Client GameAttackHost Start 2 " + tolient.HostPlaceServerId);

            LongEventHandler.QueueLongEvent(delegate
            {
                try
                {
                    Loger.Log("Client GameAttackHost Start 3");
                    var hostPlace = UpdateWorldController.GetWOByServerId(HostPlaceServerId) as MapParent;
                    var cloneMap  = hostPlace.Map;

                    var toSrvMap = new AttackHostToSrv()
                    {
                        State = 4,
                        TerrainDefNameCell = new List <IntVec3S>(),
                        TerrainDefName     = new List <string>(),
                        Thing     = new List <ThingTrade>(),
                        ThingCell = new List <IntVec3S>()
                    };

                    toSrvMap.MapSize = new IntVec3S(cloneMap.Size);

                    CellRect cellRect = CellRect.WholeMap(cloneMap);
                    cellRect.ClipInsideMap(cloneMap);

                    //почва
                    Loger.Log("Client GameAttackHost Start 4");
                    foreach (IntVec3 current in cellRect)
                    {
                        var terr = cloneMap.terrainGrid.TerrainAt(current);
                        toSrvMap.TerrainDefNameCell.Add(new IntVec3S(current));
                        toSrvMap.TerrainDefName.Add(terr.defName);
                    }

                    //скалы, преграды и строения без пешек и без растений не деревьев, вывести кол-во
                    Loger.Log("Client GameAttackHost Start 5");
                    foreach (IntVec3 current in cellRect)
                    {
                        foreach (Thing thc in Find.CurrentMap.thingGrid.ThingsAt(current).ToList <Thing>())
                        {
                            if (thc is Pawn)
                            {
                                continue;
                            }

                            //из растений оставляем только деревья
                            if (thc.def.category == ThingCategory.Plant && !thc.def.plant.IsTree)
                            {
                                continue;
                            }

                            if (thc.Position != current)
                            {
                                continue;
                            }

                            var tt = ThingTrade.CreateTrade(thc, thc.stackCount, false);

                            toSrvMap.ThingCell.Add(new IntVec3S(current));
                            toSrvMap.Thing.Add(tt);
                        }
                    }

                    Loger.Log("Client GameAttackHost Start 6");
                    SessionClientController.Command((connect0) =>
                    {
                        Loger.Log("Client GameAttackHost Start 7");
                        connect0.AttackOnlineHost(toSrvMap);
                        if (!string.IsNullOrEmpty(connect0.ErrorMessage))
                        {
                            ErrorBreak(connect0.ErrorMessage);
                            return;
                        }

                        //Ждем и получаем пешки атакующего и добавляем их
                        Loger.Log("Client GameAttackHost Start 8");
                        List <ThingEntry> pawnsA = null;
                        var s1Time = DateTime.UtcNow;
                        while (true)
                        {
                            var toClient5 = connect0.AttackOnlineHost(new AttackHostToSrv()
                            {
                                State = 5
                            });
                            if (!string.IsNullOrEmpty(connect0.ErrorMessage))
                            {
                                ErrorBreak(connect0.ErrorMessage);
                                return;
                            }
                            pawnsA = toClient5.Pawns;
                            if (pawnsA != null && pawnsA.Count > 0)
                            {
                                break;
                            }
                            if ((DateTime.UtcNow - s1Time).TotalSeconds > 20)
                            {
                                ErrorBreak("Timeout");
                                return;
                            }
                        }
                        if (!string.IsNullOrEmpty(connect0.ErrorMessage))
                        {
                            ErrorBreak(connect0.ErrorMessage);
                            return;
                        }

                        Loger.Log("Client GameAttackHost Start 9");
                        //Потом добавляем список к отправке
                        SendedPawnsId       = new HashSet <int>();
                        SendedState         = new Dictionary <int, int>();
                        ToUpdateStateId     = new List <int>();
                        ToUpdateState       = new List <Thing>();
                        ToSendDeleteId      = new HashSet <int>();
                        ToSendAddId         = new HashSet <int>();
                        ToSendThingAdd      = new HashSet <Thing>();
                        AttackingPawns      = new List <Pawn>();
                        AttackingPawnDic    = new Dictionary <int, int>();
                        AttackingPawnJobDic = new Dictionary <int, AttackPawnCommand>();
                        AttackUpdateTick    = 0;
                        GameMap             = cloneMap;

                        UIEventNewJobDisable = true;
                        var cellPawns        = GameUtils.SpawnCaravanPirate(cloneMap, pawnsA,
                                                                            (th, te) =>
                        {
                            var p = th as Pawn;
                            if (p == null)
                            {
                                return;
                            }

                            AttackingPawns.Add(p);
                            AttackingPawnDic.Add(p.thingIDNumber, te.OriginalID);

                            //задаем команду стоять и не двигаться (но стрелять если кто в радиусе)
                            Loger.Log("Client GameAttackHost Start 9 StartJob Wait_Combat ");
                            p.playerSettings.hostilityResponse = HostilityResponseMode.Ignore;
                            p.jobs.StartJob(new Job(JobDefOf.Wait_Combat)
                            {
                                playerForced          = true,
                                expiryInterval        = int.MaxValue,
                                checkOverrideOnExpire = false,
                            }
                                            , JobCondition.InterruptForced);

                            /*
                             * if (p.Label == "Douglas, Клерк")
                             * {
                             *  //todo для теста не забыть удалить!
                             *  var pp = p;
                             *  var th = new Thread(() =>
                             *  {
                             *      Thread.Sleep(5000);
                             *      while (true)
                             *      {
                             *          Thread.Sleep(1000);
                             *          try
                             *          {
                             *              var jj = pp.jobs.curJob;
                             *              Loger.Log("Host ThreadTestJob " + pp.Label + " job=" + (jj == null ? "null" : jj.def.defName.ToString()));
                             *          }
                             *          catch
                             *          { }
                             *      }
                             *  });
                             *  th.IsBackground = true;
                             *  th.Start();
                             * }
                             */
                        });
                        UIEventNewJobDisable = false;

                        Loger.Log("Client GameAttackHost Start 10");

                        CameraJumper.TryJump(cellPawns, cloneMap);

                        TimerObj = SessionClientController.Timers.Add(200, AttackUpdate);

                        //включаем обработку событий урона и уничтожения объектов
                        GameAttackTrigger_Patch.ActiveAttackHost.Add(GameMap, this);

                        Loger.Log("Client GameAttackHost Start 11");
                    });
                }
                catch (Exception ext)
                {
                    Loger.Log("GameAttackHost Start() Exception " + ext.ToString());
                }
            }, "...", false, null);
        }
示例#10
0
        public static IntVec3 SpawnList(Map map, List <ThingEntry> pawns, bool attackCell
                                        , Func <ThingEntry, bool> getPirate
                                        , Action <Thing, ThingEntry> spawn = null
                                        , Func <Thing, IntVec3> getCell    = null)
        {
            if (MainHelper.DebugMode)
            {
                Loger.Log("SpawnList...");
            }

            //на основе UpdateWorldController.DropToWorldObjectDo
            var factionPirate = Find.FactionManager.AllFactions.FirstOrDefault(f => f.def.defName == "Pirate")
                                ?? Find.FactionManager.OfAncientsHostile; //SessionClientController.Data.FactionPirate;

            IntVec3 ret = new IntVec3();
            Thing   thinXZ;

            for (int i = 0; i < pawns.Count; i++)
            {
                var thing = pawns[i];
                //GenSpawn.Spawn(pawn, cell, map, Rot4.Random, WipeMode.Vanish, false);

                if (MainHelper.DebugMode)
                {
                    Loger.Log("Prepare...");
                }
                var thin = UpdateWorldController.PrepareSpawnThingEntry(thing, factionPirate, getPirate(thing));

                var cell = getCell != null?getCell(thin) : thin.Position;

                if (i == 0)
                {
                    ret = cell;
                }

                if (MainHelper.DebugMode)
                {
                    try { Loger.Log("Spawn... " + thin.Label); } catch { Loger.Log("Spawn... "); }
                }
                if (thin is Pawn)
                {
                    if (MainHelper.DebugMode)
                    {
                        Loger.Log("Pawn... " + thin.Position.x + " " + thin.Position.y);
                    }
                    GenSpawn.Spawn((Pawn)thin, cell, map);
                }
                else
                {
                    GenDrop.TryDropSpawn(thin, cell, map, ThingPlaceMode.Near, out thinXZ, null);
                }
                if (spawn != null)
                {
                    spawn(thin, thing);
                }
                if (MainHelper.DebugMode)
                {
                    Loger.Log("Spawn...OK");
                }
            }
            return(ret);
        }
示例#11
0
        public bool Run()
        {
            return(false);

            Log.Message("DevelopTest Run: " + UpdateWorldController.GetTestText());

            var hostPlace = UpdateWorldController.GetWOByServerId(7) as MapParent;

            Log.Message("DevelopTest Run: " + (hostPlace?.Label ?? "null"));
            return(true);

            /*
             * var mmap = Find.Maps[0];
             * var ppawn = mmap.mapPawns.AllPawnsSpawned.FirstOrDefault(i => i.thingIDNumber == 589);
             * var tpawn = mmap.mapPawns.AllPawnsSpawned.FirstOrDefault(i => i.thingIDNumber == 586);
             *
             * var pxml = ThingEntry.CreateEntry(ppawn, 1);
             * File.WriteAllText(Loger.PathLog + "RunTest" + (++tttt).ToString() + ".xml", pxml.Data);
             *
             * var place = Find.WorldObjects.Settlements
             *  .FirstOrDefault(f => f.Faction == Faction.OfPlayer);
             * var map_ = ((Settlement)place).Map;
             * var cell_ = GameUtils.GetTradeCell(map_);
             *
             * map_.terrainGrid.SetTerrain(cell_
             *  , (tttt++) % 2 == 1
             *  ? DefDatabase<TerrainDef>.GetNamed("TileGranite")
             *  : TerrainDefOf.WaterDeep);
             *
             * return true;
             */
            /////////////////////////////////////////////////////

            /*
             * GameUtils.ShowDialodOKCancel("asdasda",
             *  () => Log.Message("Test OK"),
             *  () => Log.Message("Test Cancel")
             *  );
             * return true;
             */
            /*
             * var formm = new Dialog_Exchenge(Find.Maps[0]);
             * Find.WindowStack.Add(formm);
             * return true;
             * // */
            return(false);

            /*
             * var lll = ScenarioLister.ScenariosInCategory(ScenarioCategory.FromDef);
             *
             * File.WriteAllText(Loger.PathLog + @"ScenarioLister.txt", TextObj(lll), Encoding.UTF8);
             * return true;
             */
            try
            {
                Log.Message("DevelopTest Run");
                Loger.Log("");
                Loger.Log("DevelopTest Run");

                var pawns = Find.WorldPawns.AllPawnsAlive.ToList();

                //Fedon,Huntsman,Ally,Lilith,Tater,Jesse,Kentucky
                //Log.Message(string.Join(",", pawns.Select(p => p.NameStringShort).ToArray()));

                var pawn = pawns.Where(p => p.Name.ToStringShort == "Huntsman").FirstOrDefault();
                File.WriteAllText(Loger.PathLog + @"Huntsman.txt", TextObj(pawn), Encoding.UTF8);

                var   msg     = "";
                var   map     = Find.Maps[0];
                var   pawnsMy = map.mapPawns.AllPawnsSpawned.First();
                Thing thinXZ;
                var   cell = GameUtils.GetTradeCell(map);

                var gx = new GameXMLUtils();
                //var testPawn = Scribe.saver.DebugOutputFor(pawns[0]);
                var testPawn = gx.ToXml(pawnsMy);
                File.WriteAllText(@"c:\World\testPawn.xml", testPawn);

                gx.StartFromXml(@"c:\World\test.xml");
                var thin0 = gx.Test <Thing>();
                //PawnComponentsUtility.CreateInitialComponents((Pawn)thin0);
                gx.Finish();

                thin0.ThingID += "555";
                if (thin0 is Pawn)
                {
                    var refugee = (Pawn)thin0;
                    GenSpawn.Spawn(refugee, cell, map);
                    //refugee.SetFaction(Faction.OfPlayer, null);
                    refugee.PostMapInit();  //?
                    //map.mapPawns.UpdateRegistryForPawn((Pawn)thin0);
                }
                else
                {
                    GenDrop.TryDropSpawn(thin0, cell, map, ThingPlaceMode.Near, out thinXZ, null);
                }


                //MapComponentUtility.FinalizeInit(map); //????
                return(true);

                File.WriteAllText(Loger.PathLog + @"map.txt", TextObj(map, false), Encoding.UTF8);

                List <Thing>       listThing = CaravanFormingUtility.AllReachableColonyItems(Find.Maps[0]);
                Dialog_TradeOnline form      = null;
                form = new Dialog_TradeOnline(listThing, "OCity_DevTest_Test".Translate(), 3, () =>
                {
                    var select = form.GetSelect();
                    Thing thin = null;
                    var thins  = select.Select(p =>
                    {
                        return(ThingEntry.CreateEntry(thin = p.Key, p.Value));
                    }).ToList();
                    var outText = TextObj(thins, true);
                    File.WriteAllText(Loger.PathLog + @"Car.txt", outText, Encoding.UTF8);

                    var caravan = Find.WorldObjects.Caravans[0];
                    foreach (var t in select)
                    {
                        //t.Key

                        //ThingEntry the = new ThingEntry(t.Key, t.Value);
                        ///*
                        //thin = the.CreateThing();
                        //var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null);
                        //p.inventory.innerContainer.TryAdd(thin, true);
                        //*/
                        //thin = the.CreateThing();
                        GenDrop.TryDropSpawn(thin, cell, map, ThingPlaceMode.Near, out thinXZ, null);
                    }

                    /*
                     * File.WriteAllText(Loger.PathLog + @"ThingIn.txt", TextObj(thin, true), Encoding.UTF8);
                     * //if (thin.Spawned) thin.DeSpawn();
                     * ThingEntry the = new ThingEntry(thin, 1);
                     * thin = the.CreateThing();
                     * GenDrop.TryDropSpawn(thin, GameUtils.GetTradeCell(map), map, ThingPlaceMode.Near, out thinXZ, null);
                     * File.WriteAllText(Loger.PathLog + @"ThingXZ.txt", TextObj(thinXZ, true), Encoding.UTF8);
                     * File.WriteAllText(Loger.PathLog + @"ThingOut.txt", TextObj(thin, true), Encoding.UTF8);
                     */
                    /*
                     * if (thin != null)
                     * {
                     *  File.WriteAllText(Loger.PathLog + @"ThingIn.txt", TextObj(thin, true), Encoding.UTF8);
                     *  ThingEntry the = new ThingEntry(thin, 1);
                     *  File.WriteAllText(Loger.PathLog + @"ThingEntry.txt", TextObj(the, true), Encoding.UTF8);
                     *  File.WriteAllText(Loger.PathLog + @"ThingOut.txt", TextObj(the.CreateThing(), true), Encoding.UTF8);
                     * }*/
                });
                Find.WindowStack.Add(form);
                return(true);

                pawn = pawns.Where(p => p.Name.ToStringShort == "Jesse").FirstOrDefault();

                //msg += Find.Maps.Count.ToString() + Environment.NewLine;


                var pawnText = TextObj(pawn, true);
                File.WriteAllText(Loger.PathLog + @"Car.txt", pawnText, Encoding.UTF8);

                int directionTile = CaravanExitMapUtility.RandomBestExitTileFrom(Find.Maps[0]);
                //Find.Maps[0].Tile;

                //var destroyedFactionBase = (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.CaravanOnline);
                var destroyedFactionBase = (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.BaseOnline);
                destroyedFactionBase.Tile          = directionTile;
                destroyedFactionBase.OnlineWObject = new Model.WorldObjectEntry()
                {
                    LoginOwner = "OCity_DevTest_NameTestPlayer".Translate()
                };
                destroyedFactionBase.SetFaction(Faction.OfPlayer);
                Find.WorldObjects.Add(destroyedFactionBase);

                var cars    = Find.WorldObjects.AllWorldObjects.Where(o => o is Caravan).ToList();
                var seeText = TextObj(cars);
                File.WriteAllText(Loger.PathLog + @"See.txt", seeText, Encoding.UTF8);

                Loger.Log(msg);
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }
            return(true);
        }
        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);
                    }
                });
            }
        }
        /// <summary>
        /// Инициализация после получения всех данных и уже запущенной игре
        /// </summary>
        public static void InitGame()
        {
            try
            {
                Loger.Log("Client InitGame()");
                //Data.ChatsTime = (DateTime.UtcNow + ServerTimeDelta).AddDays(-1); //без этого указания будут получены все сообщения с каналов

                MainButtonWorker_OC.ShowOnStart();
                UpdateWorldController.ClearWorld();
                UpdateWorldController.InitGame();
                Data.UpdateTime = DateTime.MinValue;
                UpdateWorld(true);

                Data.LastServerConnect = DateTime.MinValue;

                Timers.Add(100, UpdateFastTimer);
                Timers.Add(500, UpdateChats);
                Timers.Add(5000, () => UpdateWorld(false));
                Timers.Add(10000, PingServer);
                Timers.Add(60000 * Data.DelaySaveGame, BackgroundSaveGame);
                TimerReconnect.Add(1000, CheckReconnectTimer);

                //устанавливаем событие на выход из игры
                GameExit.BeforeExit = () =>
                {
                    try
                    {
                        Loger.Log("Client BeforeExit ");
                        GameExit.BeforeExit = null;
                        TimersStop();
                        if (Current.Game == null)
                        {
                            return;
                        }

                        if (!Data.BackgroundSaveGameOff)
                        {
                            Loger.Log($"Client {SessionClientController.My.Login} SaveGameBeforeExit " + SaveFullName);
                            GameDataSaveLoader.SaveGame(SaveName);
                            var content = File.ReadAllBytes(SaveFullName);
                            if (content.Length > 1024)
                            {
                                Data.SaveFileData = content;
                                Data.SingleSave   = false;
                                UpdateWorld(false);

                                Loger.Log($"Client {SessionClientController.My.Login} SaveGameBeforeExit OK");
                            }
                        }
                        SessionClient.Get.Disconnect();
                    }
                    catch (Exception e)
                    {
                        Loger.Log("Client BeforeExit Exception: " + e.ToString());
                        throw;
                    }
                };
            }
            catch (Exception e)
            {
                ExceptionUtil.ExceptionLog(e, "Client InitGame Error");
                GameExit.BeforeExit = null;
                TimersStop();
                if (Current.Game == null)
                {
                    return;
                }
                SessionClient.Get.Disconnect();
            }
        }
示例#14
0
        public void Start(Caravan caravan, BaseOnline attackedBase)
        {
            SessionClientController.Command((connect) =>
            {
                connect.ErrorMessage = null;

                Loger.Log("Client GameAttack State 0");
                var res = connect.AttackOnlineInitiator(new AttackInitiatorToSrv()
                {
                    State                  = 0,
                    StartHostPlayer        = attackedBase.Player.Public.Login,
                    HostPlaceServerId      = attackedBase.OnlineWObject.ServerId,
                    InitiatorPlaceServerId = UpdateWorldController.GetServerInfo(caravan).ServerId
                });
                if (!string.IsNullOrEmpty(connect.ErrorMessage))
                {
                    ErrorBreak(connect.ErrorMessage);
                    return;
                }

                // ждем положительного ответа с статусом больше 2 и отправляем своих колонистов
                Loger.Log("Client GameAttack State 1");
                var s1Time = DateTime.UtcNow;
                while (true)
                {
                    var res1 = connect.AttackOnlineInitiator(new AttackInitiatorToSrv()
                    {
                        State = 1
                    });
                    if (!string.IsNullOrEmpty(connect.ErrorMessage))
                    {
                        ErrorBreak(connect.ErrorMessage);
                        return;
                    }
                    if (res1.State == 2)
                    {
                        break;
                    }
                    if ((DateTime.UtcNow - s1Time).TotalSeconds > 20)
                    {
                        ErrorBreak("Timeout");
                        return;
                    }
                }
                var pawnsToSend = GetPawnsAndDeleteCaravan(caravan);
                var response    = connect.AttackOnlineInitiator(new AttackInitiatorToSrv()
                {
                    State = 2,
                    Pawns = pawnsToSend
                });
                if (!string.IsNullOrEmpty(connect.ErrorMessage))
                {
                    ErrorBreak(connect.ErrorMessage);
                    return;
                }

                // принимаем карту и создаем
                Loger.Log("Client GameAttack CreateMap State=" + response.State);

                Loger.Log("Client GameAttack WaitTo3");
                s1Time = DateTime.UtcNow;
                while (true)
                {
                    response = connect.AttackOnlineInitiator(new AttackInitiatorToSrv()
                    {
                        State = 3
                    });
                    if (!string.IsNullOrEmpty(connect.ErrorMessage))
                    {
                        ErrorBreak(connect.ErrorMessage);
                        return;
                    }
                    if (response.State >= 4)
                    {
                        break;
                    }
                    if ((DateTime.UtcNow - s1Time).TotalSeconds > 60)
                    {
                        ErrorBreak("Timeout");
                        return;
                    }
                }
                Find.TickManager.Pause();
                CreateClearMap(attackedBase.Tile, response.MapSize.Get(), (map, mapParent) =>
                {
                    GameMap = map;
                    Loger.Log("Client StartCreateClearMap 1");
                    CellRect cellRect = CellRect.WholeMap(map);
                    cellRect.ClipInsideMap(map);

                    Loger.Log("Client StartCreateClearMap 2");
                    //почва
                    for (int i = 0; i < response.TerrainDefNameCell.Count; i++)
                    {
                        var current  = response.TerrainDefNameCell[i].Get();
                        var terrName = response.TerrainDefName[i];
                        //Log.Message(terr.defName);
                        map.terrainGrid.SetTerrain(current, DefDatabase <TerrainDef> .GetNamed(terrName));
                    }

                    Loger.Log("Client StartCreateClearMap 3");
                    //скалы, преграды и строения без пешек и без растений не деревьев
                    ThingsIDDicRev = new Dictionary <int, int>();
                    ThingsIDDic    = new Dictionary <int, int>();
                    ThingsObjDic   = new Dictionary <int, Thing>();
                    AttackerPawns  = new Dictionary <Pawn, int>();
                    ToSendCommand  = new Dictionary <int, AttackPawnCommand>();
                    for (int i = 0; i < response.ThingCell.Count; i++)
                    {
                        var current = response.ThingCell[i].Get();
                        var tt      = response.Thing[i];
                        var th      = tt.CreateThing();
                        GenSpawn.Spawn(th, current, map, new Rot4(tt.Rotation), WipeMode.Vanish);
                        //словарь сопоставления ID их и сейчас созданный (их из OriginalID, наш ID)
                        if (tt.OriginalID != 0 && th.thingIDNumber != 0)
                        {
                            ThingsIDDicRev[tt.OriginalID]  = th.thingIDNumber;
                            ThingsIDDic[th.thingIDNumber]  = tt.OriginalID;
                            ThingsObjDic[th.thingIDNumber] = th;
                        }
                    }

                    Loger.Log("Client StartCreateClearMap 4 CountThings=" + ThingsIDDic.Count.ToString()
                              + " CountThingsRev=" + ThingsIDDicRev.Count.ToString()
                              + " CountThingsObj=" + ThingsObjDic.Count.ToString());

                    //режим вечной паузы
                    //todo

                    Loger.Log("Client StartCreateClearMap 5");
                    AttackUpdateTick = 0;
                    AttackUpdate();

                    TimerObj = SessionClientController.Timers.Add(200, AttackUpdate);

                    //включаем обработку событий выдачи команд
                    Loger.Log("Client StartCreateClearMap 6");
                });
            });
        }