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); }
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"); }
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); }
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); }
/// <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); }
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); }
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(); } }
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"); }); }); }