private void InitializeTeleporterDB() { TeleporterDB.LogDB = Log; TeleporterDB = new TeleporterDB(Path.Combine(EmpyrionConfiguration.SaveGameModPath, "Teleporters.json")) { AreAllies = AreAllies }; }
private void DeleteTeleporterRoutes(int aPlayerId, int aSourceId, int aTargetId) { Request_Player_Info(aPlayerId.ToId(), (P) => { var deletedCount = TeleporterDB.Delete(aSourceId, aTargetId); SaveTeleporterDB(); AlertPlayer(P.entityId, $"Delete {deletedCount} teleporter from {aSourceId}"); }); }
private void ListTeleporterRoutes(int aPlayerId, int aStructureId) { Request_GlobalStructure_List(G => { Request_Player_Info(aPlayerId.ToId(), (P) => { ShowDialog(aPlayerId, P, "Teleporters", TeleporterDB.List(aStructureId, P).OrderBy(T => T.Permission).Aggregate("\n", (S, T) => S + T.ToString(G) + "\n")); }); }); }
private void InitializeTeleporterDBFileWatcher() { DBFileChangedWatcher = new FileSystemWatcher { Path = Path.GetDirectoryName(TeleporterDBFilename), NotifyFilter = NotifyFilters.LastWrite, Filter = Path.GetFileName(TeleporterDBFilename) }; DBFileChangedWatcher.Changed += (s, e) => TeleporterDB = TeleporterDB.ReadDB(TeleporterDBFilename); DBFileChangedWatcher.EnableRaisingEvents = true; }
private void SaveTeleporterRoute(int aPlayerId, TeleporterPermission aPermission, int aSourceId, int aTargetId) { Request_GlobalStructure_List(G => { Request_Player_Info(aPlayerId.ToId(), (P) => { var SourceStructure = TeleporterDB.SearchEntity(G, aSourceId); var TargetStructure = TeleporterDB.SearchEntity(G, aSourceId); if (SourceStructure == null) { AlertPlayer(P.entityId, $"Structure not found: {aSourceId}"); } else if (TargetStructure == null) { AlertPlayer(P.entityId, $"Structure not found: {aTargetId}"); } else if (!CheckPermission(SourceStructure, TeleporterDB.Configuration)) { AlertPlayer(P.entityId, $"Structure not allowed: {aSourceId} {(EntityType)SourceStructure.Data.type}/{(FactionGroups)SourceStructure.Data.factionGroup}"); } else if (!CheckPermission(TargetStructure, TeleporterDB.Configuration)) { AlertPlayer(P.entityId, $"Structure not allowed: {aTargetId} {(EntityType)TargetStructure.Data.type}/{(FactionGroups)TargetStructure.Data.factionGroup}"); } else if (P.credits < TeleporterDB.Configuration.CostsPerTeleporterPosition) { AlertPlayer(P.entityId, $"You need {TeleporterDB.Configuration.CostsPerTeleporterPosition} credits ;-)"); } else if (TeleporterDB.Configuration.ForbiddenPlayfields.Contains(P.playfield) || TeleporterDB.Configuration.ForbiddenPlayfields.Contains(SourceStructure.Playfield) || TeleporterDB.Configuration.ForbiddenPlayfields.Contains(TargetStructure.Playfield)) { InformPlayer(aPlayerId, "No teleporter allowed here ;-)"); log($"EmpyrionTeleporter: Exec: {P.playerName}/{P.entityId}/{P.clientId} -> no teleport allowed for pos={GetVector3(P.pos).String()} on '{P.playfield}'", LogLevel.Error); } else { TeleporterDB.AddRoute(G, aPermission, aSourceId, aTargetId, P); SaveTeleporterDB(); if (TeleporterDB.Configuration.CostsPerTeleporterPosition > 0) { Request_Player_SetCredits(new IdCredits(P.entityId, P.credits - TeleporterDB.Configuration.CostsPerTeleporterPosition)); } ShowDialog(aPlayerId, P, "Teleporters", $"\nTeleporter set\n{aSourceId} => {aTargetId}"); } }); }); }
private void CleanUpTeleporterRoutes(int aPlayerId) { Request_GlobalStructure_List(G => { var GlobalFlatIdList = G.globalStructures.Aggregate(new List <int>(), (L, P) => { L.AddRange(P.Value.Select(S => S.id)); return(L); }); var TeleporterFlatIdList = TeleporterDB.TeleporterRoutes.Aggregate(new List <int>(), (L, P) => { L.Add(P.A.Id); L.Add(P.B.Id); return(L); }); var DeleteList = TeleporterFlatIdList.Where(I => !GlobalFlatIdList.Contains(I)).Distinct(); var DelCount = DeleteList.Aggregate(0, (C, I) => C + TeleporterDB.Delete(I, 0)); log($"CleanUpTeleporterRoutes: {DelCount} Structures: {DeleteList.Aggregate("", (S, I) => S + "," + I)}", LogLevel.Message); InformPlayer(aPlayerId, $"CleanUp: {DelCount} TeleporterRoutes"); if (DelCount > 0) { SaveTeleporterDB(); } }); }
private void InitializeTeleporterDB() { TeleporterDBFilename = Path.Combine(EmpyrionConfiguration.ProgramPath, @"Saves\Games\" + EmpyrionConfiguration.DedicatedYaml.SaveGameName + @"\Mods\EmpyrionTeleporter\TeleporterDB.xml"); Directory.CreateDirectory(Path.GetDirectoryName(TeleporterDBFilename)); // Move DB file to new location var OldDB = Path.Combine(Directory.GetCurrentDirectory(), @"Content\Mods\EmpyrionTeleporter\TeleporterDB.xml"); if (File.Exists(OldDB)) { File.Move(OldDB, TeleporterDBFilename); } TeleporterDB.LogDB = log; TeleporterDB = TeleporterDB.ReadDB(TeleporterDBFilename); TeleporterDB.SaveDB(TeleporterDBFilename); }
private bool ExecTeleportPlayer(GlobalStructureList aGlobalStructureList, PlayerInfo aPlayer, int aPlayerId) { var FoundRoute = TeleporterDB.SearchRoute(aGlobalStructureList, aPlayer); if (FoundRoute == null) { InformPlayer(aPlayerId, "No teleporter position here :-( wait 2min for structure update and try it again please."); log($"EmpyrionTeleporter: Exec: {aPlayer.playerName}/{aPlayer.entityId}/{aPlayer.clientId} -> no route found for pos={GetVector3(aPlayer.pos).String()} on '{aPlayer.playfield}'", LogLevel.Error); return(false); } if (TeleporterDB.Configuration.ForbiddenPlayfields.Contains(aPlayer.playfield) || TeleporterDB.Configuration.ForbiddenPlayfields.Contains(FoundRoute.Playfield)) { InformPlayer(aPlayerId, "No teleport allowed here ;-)"); log($"EmpyrionTeleporter: Exec: {aPlayer.playerName}/{aPlayer.entityId}/{aPlayer.clientId} -> no teleport allowed for pos={GetVector3(aPlayer.pos).String()} on '{aPlayer.playfield}'", LogLevel.Error); return(false); } log($"EmpyrionTeleporter: Exec: {aPlayer.playerName}/{aPlayer.entityId}-> {FoundRoute.Id} on '{FoundRoute.Playfield}' pos={FoundRoute.Position.String()} rot={FoundRoute.Rotation.String()}", LogLevel.Message); if (!PlayerLastGoodPosition.ContainsKey(aPlayer.entityId)) { PlayerLastGoodPosition.Add(aPlayer.entityId, null); } PlayerLastGoodPosition[aPlayer.entityId] = new IdPlayfieldPositionRotation(aPlayer.entityId, aPlayer.playfield, aPlayer.pos, aPlayer.rot); Action <PlayerInfo> ActionTeleportPlayer = (P) => { if (FoundRoute.Playfield == P.playfield) { Request_Entity_Teleport(new IdPositionRotation(aPlayer.entityId, GetVector3(FoundRoute.Position), GetVector3(FoundRoute.Rotation)), null, (E) => InformPlayer(aPlayerId, "Entity_Teleport: {E}")); } else { Request_Player_ChangePlayerfield(new IdPlayfieldPositionRotation(aPlayer.entityId, FoundRoute.Playfield, GetVector3(FoundRoute.Position), GetVector3(FoundRoute.Rotation)), null, (E) => InformPlayer(aPlayerId, "Player_ChangePlayerfield: {E}")); } }; Request_Player_SetPlayerInfo(new PlayerInfoSet() { entityId = aPlayer.entityId, health = (int)aPlayer.healthMax }); new Thread(new ThreadStart(() => { var TryTimer = new Stopwatch(); TryTimer.Start(); while (TryTimer.ElapsedMilliseconds < (TeleporterDB.Configuration.PreparePlayerForTeleport * 1000)) { Thread.Sleep(2000); var WaitTime = TeleporterDB.Configuration.PreparePlayerForTeleport - (int)(TryTimer.ElapsedMilliseconds / 1000); InformPlayer(aPlayerId, $"Prepare for teleport in {WaitTime} sec."); } ActionTeleportPlayer(aPlayer); CheckPlayerStableTargetPos(aPlayerId, aPlayer, ActionTeleportPlayer, FoundRoute.Position); })).Start(); return(true); }
private void SaveTeleporterDB() { DBFileChangedWatcher.EnableRaisingEvents = false; TeleporterDB.SaveDB(TeleporterDBFilename); DBFileChangedWatcher.EnableRaisingEvents = true; }