From d6d820442e17e2baaab8d771d97033b9c629718b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Buratto?= <46575243+joaoburatto@users.noreply.github.com> Date: Fri, 29 Sep 2023 19:22:26 -0300 Subject: [PATCH] Rename PunPun to Log and refactor SaveSystem & TileSystem (#1229) * Rename PunPun to Log and refactor SaveSystem & TileSystem * Remove unused stuff * Add missing metas and script fixes * Fix missing log changes * Fix missing changes * Add map saves * Fix how folder checks are made * Add log when the saved map is null * Add warning and pragma explanation * Fix issue with client's build menu --- .../Plugins/DiscordGameSDK/DiscordManager.cs | 8 +- Assets/Scripts/External/FishNet.meta | 8 + .../External/FishNet/CodeGenerating.meta | 8 + .../FishNet/CodeGenerating/cecil-0.11.4.meta | 8 + .../cecil-0.11.4/Mono.Cecil.sln.meta | 0 Assets/Scripts/External/FishNet/Runtime.meta | 8 + .../FishNet/Runtime/Transporting.meta | 8 + .../Runtime/Transporting/Transports.meta | 8 + .../Transporting/Transports/Tugboat.meta | 8 + .../Transports/Tugboat/LiteNetLib.meta | 8 + .../Tugboat/LiteNetLib/LiteNetLib.csproj.meta | 0 .../SS3D/Core/ApplicationInitializerSystem.cs | 10 +- Assets/Scripts/SS3D/Core/LogManager.cs | 26 +- .../Scripts/SS3D/Core/SessionNetworkSystem.cs | 10 +- .../SS3D/Core/Settings/NetworkSettings.cs | 2 +- Assets/Scripts/SS3D/Core/Subsystems.cs | 2 +- .../SS3D/Core/Utils/CommandLineArgsSystem.cs | 2 +- Assets/Scripts/SS3D/Core/ViewLocator.cs | 2 +- Assets/Scripts/SS3D/Data/Assets.cs | 6 +- Assets/Scripts/SS3D/Data/GamePaths.cs | 1 + Assets/Scripts/SS3D/Data/Management.meta | 3 + .../SS3D/Data/Management/SaveSystem.cs | 164 ++++ .../Management}/SaveSystem.cs.meta | 0 Assets/Scripts/SS3D/Data/Paths.cs | 62 +- .../SS3D/Logging/{Punpun.cs => Log.cs} | 26 +- .../Logging/{Punpun.cs.meta => Log.cs.meta} | 0 .../LogSettingsInspectorEditor.cs | 2 +- .../NameSpaceLogLevelDrawer.cs | 36 +- .../SS3D/Logging/LogSettings/LogSetting.cs | 70 -- .../SS3D/Logging/LogSettings/LogSettings.cs | 63 ++ ...LogSetting.cs.meta => LogSettings.cs.meta} | 0 .../Scripts/SS3D/Logging/SS3D.Logging.asmdef | 4 +- .../SS3D/Networking/UnauthorizedPlayer.cs | 2 +- .../SS3D/Systems/Entities/EntitySystem.cs | 4 +- .../Furniture/LockLockerInteraction.cs | 4 +- .../Furniture/UnlockLockerInteraction.cs | 4 +- .../SS3D/Systems/Gamemodes/Modes/Gamemode.cs | 10 +- .../SS3D/Systems/Health/BodyParts/Bodypart.cs | 4 +- .../Interactions/InteractionController.cs | 4 +- .../Inventory/Containers/AttachedContainer.cs | 2 +- .../Inventory/Containers/ClothesDisplayer.cs | 2 +- .../Systems/Inventory/Containers/Hands.cs | 4 +- .../Inventory/Containers/HumanInventory.cs | 8 +- .../Inventory/Containers/InventoryView.cs | 6 +- .../SS3D/Systems/Inventory/Items/Item.cs | 6 +- .../Systems/Inventory/Items/ItemSystem.cs | 12 +- .../Inventory/UI/InventoryDisplayElement.cs | 2 +- .../Systems/Permissions/PermissionSystem.cs | 8 +- .../Systems/PlayerControl/PlayerSystem.cs | 14 +- .../Scripts/SS3D/Systems/Roles/RoleSystem.cs | 6 +- .../SS3D/Systems/Rounds/ReadyPlayersSystem.cs | 4 +- .../SS3D/Systems/Rounds/RoundSystem.cs | 6 +- .../SS3D/Systems/Rounds/RoundSystemBase.cs | 6 +- .../SS3D/Systems/Screens/GameScreens.cs | 4 +- .../Systems/Screens/PlayerCameraSystem.cs | 2 +- .../Systems/Substances/SubstanceContainer.cs | 2 +- .../Connections/MultiAdjacencyConnector.cs | 2 +- .../Tile/PlacedObjects/PlacedItemObject.cs | 2 +- .../Tile/PlacedObjects/PlacedTileObject.cs | 2 +- .../Scripts/SS3D/Systems/Tile/SaveSystem.cs | 140 --- Assets/Scripts/SS3D/Systems/Tile/TileChunk.cs | 4 +- .../Scripts/SS3D/Systems/Tile/TileHelper.cs | 8 +- Assets/Scripts/SS3D/Systems/Tile/TileMap.cs | 16 +- .../Tile/TileMapCreator/TileMapCreator.cs | 862 ++++++++++-------- .../Tile/TileMapCreator/TileMapCreatorTab.cs | 4 +- .../SS3D/Systems/Tile/TileResourceLoader.cs | 81 +- .../Scripts/SS3D/Systems/Tile/TileSystem.cs | 106 ++- Assets/Scripts/Tests/Edit Mode/LogTests.cs | 20 +- Assets/Settings/LogSettings.asset | 2 + Builds/Game/Data/Tilemaps/Save.json | 1 + Builds/Game/Data/Tilemaps/UnnamedMap.json | 1 + ProjectSettings/ProjectSettings.asset | 2 +- 72 files changed, 1040 insertions(+), 902 deletions(-) create mode 100644 Assets/Scripts/External/FishNet.meta create mode 100644 Assets/Scripts/External/FishNet/CodeGenerating.meta create mode 100644 Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4.meta rename Assets/{ => Scripts/External}/FishNet/CodeGenerating/cecil-0.11.4/Mono.Cecil.sln.meta (100%) create mode 100644 Assets/Scripts/External/FishNet/Runtime.meta create mode 100644 Assets/Scripts/External/FishNet/Runtime/Transporting.meta create mode 100644 Assets/Scripts/External/FishNet/Runtime/Transporting/Transports.meta create mode 100644 Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat.meta create mode 100644 Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib.meta rename Assets/{ => Scripts/External}/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib/LiteNetLib.csproj.meta (100%) create mode 100644 Assets/Scripts/SS3D/Data/Management.meta create mode 100644 Assets/Scripts/SS3D/Data/Management/SaveSystem.cs rename Assets/Scripts/SS3D/{Systems/Tile => Data/Management}/SaveSystem.cs.meta (100%) rename Assets/Scripts/SS3D/Logging/{Punpun.cs => Log.cs} (85%) rename Assets/Scripts/SS3D/Logging/{Punpun.cs.meta => Log.cs.meta} (100%) delete mode 100644 Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs create mode 100644 Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs rename Assets/Scripts/SS3D/Logging/LogSettings/{LogSetting.cs.meta => LogSettings.cs.meta} (100%) delete mode 100644 Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs create mode 100644 Builds/Game/Data/Tilemaps/Save.json create mode 100644 Builds/Game/Data/Tilemaps/UnnamedMap.json diff --git a/Assets/Scripts/External/Discord/Plugins/DiscordGameSDK/DiscordManager.cs b/Assets/Scripts/External/Discord/Plugins/DiscordGameSDK/DiscordManager.cs index 8f960ea70b..6e0fb4f543 100644 --- a/Assets/Scripts/External/Discord/Plugins/DiscordGameSDK/DiscordManager.cs +++ b/Assets/Scripts/External/Discord/Plugins/DiscordGameSDK/DiscordManager.cs @@ -211,16 +211,16 @@ void CallDiscord() activityManager.SendInvite(485905734618447895, ActivityActionType.Join, "", (inviteUserResult) => { Console.WriteLine("Invite User {0}", inviteUserResult); - Punpun.Information(nameof(DiscordManager), "How is This Working >???", Logs.External); + Log.Information(nameof(DiscordManager), "How is This Working >???", Logs.External); }); if(res == Result.Ok) { - Punpun.Information(this, "Discord Status Is On!", Logs.External); + Log.Information(this, "Discord Status Is On!", Logs.External); } else { - Punpun.Error(nameof(DiscordManager), "Discord Status Failed!", Logs.External); + Log.Error(nameof(DiscordManager), "Discord Status Failed!", Logs.External); } }); } @@ -230,7 +230,7 @@ void CallDiscord() void OnDisable() { - Punpun.Warning(nameof(DiscordManager), "Discord Shutdown after 10 seconds", Logs.External); + Log.Warning(nameof(DiscordManager), "Discord Shutdown after 10 seconds", Logs.External); Shutdown(); discord?.Dispose(); diff --git a/Assets/Scripts/External/FishNet.meta b/Assets/Scripts/External/FishNet.meta new file mode 100644 index 0000000000..4af56ff045 --- /dev/null +++ b/Assets/Scripts/External/FishNet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5c9902a4668e78d4abef1bd35697d5af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/CodeGenerating.meta b/Assets/Scripts/External/FishNet/CodeGenerating.meta new file mode 100644 index 0000000000..0da94fd112 --- /dev/null +++ b/Assets/Scripts/External/FishNet/CodeGenerating.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbb4974b4302f435b9f4663c64d8f803 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4.meta b/Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4.meta new file mode 100644 index 0000000000..ec9a868aa3 --- /dev/null +++ b/Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f482f18100f20045bd2188d839d9217 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FishNet/CodeGenerating/cecil-0.11.4/Mono.Cecil.sln.meta b/Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4/Mono.Cecil.sln.meta similarity index 100% rename from Assets/FishNet/CodeGenerating/cecil-0.11.4/Mono.Cecil.sln.meta rename to Assets/Scripts/External/FishNet/CodeGenerating/cecil-0.11.4/Mono.Cecil.sln.meta diff --git a/Assets/Scripts/External/FishNet/Runtime.meta b/Assets/Scripts/External/FishNet/Runtime.meta new file mode 100644 index 0000000000..b353727859 --- /dev/null +++ b/Assets/Scripts/External/FishNet/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf3413dc76bc5ad45904d2f8166257ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/Runtime/Transporting.meta b/Assets/Scripts/External/FishNet/Runtime/Transporting.meta new file mode 100644 index 0000000000..ed847ec301 --- /dev/null +++ b/Assets/Scripts/External/FishNet/Runtime/Transporting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 693688363b7a8f746a35a5a6168d82b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports.meta b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports.meta new file mode 100644 index 0000000000..a0f770e8ce --- /dev/null +++ b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb8b443596223e84aaca2634238adda3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat.meta b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat.meta new file mode 100644 index 0000000000..eeec7bc6c0 --- /dev/null +++ b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 43760836a07366846a82fe7f158bd84e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib.meta b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib.meta new file mode 100644 index 0000000000..6708b0db77 --- /dev/null +++ b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9af335f3230cff649a5cc0c50e34a206 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib/LiteNetLib.csproj.meta b/Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib/LiteNetLib.csproj.meta similarity index 100% rename from Assets/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib/LiteNetLib.csproj.meta rename to Assets/Scripts/External/FishNet/Runtime/Transporting/Transports/Tugboat/LiteNetLib/LiteNetLib.csproj.meta diff --git a/Assets/Scripts/SS3D/Core/ApplicationInitializerSystem.cs b/Assets/Scripts/SS3D/Core/ApplicationInitializerSystem.cs index 9ba31c1e17..fdb2a5cf9d 100644 --- a/Assets/Scripts/SS3D/Core/ApplicationInitializerSystem.cs +++ b/Assets/Scripts/SS3D/Core/ApplicationInitializerSystem.cs @@ -4,6 +4,7 @@ using SS3D.Core.Utils; using SS3D.Data; using SS3D.Data.Enums; +using SS3D.Data.Management; using SS3D.Logging; using SS3D.SceneManagement; using UDiscord; @@ -35,7 +36,10 @@ private void InitializeLauncher() sceneToLoad = Scenes.Launcher; } + // This call is async and not awaited. Hence the pragma disable. + #pragma warning disable CS4014 Scene.LoadAsync(sceneToLoad); + #pragma warning restore CS4014 } /// @@ -43,10 +47,12 @@ private void InitializeLauncher() /// public void InitializeApplication() { - Punpun.Information(this, "Initializing application", Logs.Important); + Log.Information(this, "Initializing application", Logs.Important); DOTween.Init(); + SaveSystem.Initialize(); + InitializeDiscordIntegration(); InitializeAssetData(); @@ -103,7 +109,7 @@ private void InitializeDiscordIntegration() /// private void InitializeNetworkSession() { - Punpun.Information(this, "Initializing network session", Logs.Important); + Log.Information(this, "Initializing network session", Logs.Important); SessionNetworkSystem sessionNetworkSystem = Subsystems.Get(); sessionNetworkSystem.InitializeNetworkSession(); diff --git a/Assets/Scripts/SS3D/Core/LogManager.cs b/Assets/Scripts/SS3D/Core/LogManager.cs index bd815c7145..1dec1b69cd 100644 --- a/Assets/Scripts/SS3D/Core/LogManager.cs +++ b/Assets/Scripts/SS3D/Core/LogManager.cs @@ -1,16 +1,14 @@ using Serilog; using Serilog.Sinks.Unity3D; -using Serilog.Core; using Serilog.Events; using Serilog.Formatting.Compact; using UnityEngine; using FishNet; using System; -using System.Linq; -using System.Collections.Generic; using SS3D.Logging.LogSettings; using SS3D.Logging; using SS3D.Data; +using Log = Serilog.Log; namespace SS3D.Core @@ -23,28 +21,28 @@ namespace SS3D.Core /// public static class LogManager { - private static readonly string defaultUnityLogTemplate; + private static readonly string DefaultUnityLogTemplate; private static readonly string LogFolderPath; - private static bool _isInitialized; + private static bool IsInitialized; - private static LogSetting settings; + private static readonly LogSettings Settings; static LogManager() { - defaultUnityLogTemplate = "{SourceContext} {Message}{NewLine}{Exception}"; + DefaultUnityLogTemplate = "{SourceContext} {Message}{NewLine}{Exception}"; LogFolderPath = Application.dataPath + "/../Logs/"; if (Application.isPlaying) { - settings = Assets.Get(Data.Enums.AssetDatabases.Settings, (int)Data.Enums.SettingsId.LogSettings); + Settings = Assets.Get(Data.Enums.AssetDatabases.Settings, (int)Data.Enums.SettingsId.LogSettings); } } public static void Initialize() { - if (_isInitialized) return; - _isInitialized = true; + if (IsInitialized) return; + IsInitialized = true; var configuration = new LoggerConfiguration(); @@ -54,7 +52,7 @@ public static void Initialize() } // Configure writing to Unity's console, using our custom text formatter. - configuration = configuration.WriteTo.Unity3D(formatter: new SS3DUnityTextFormatter(outputTemplate: defaultUnityLogTemplate)); + configuration = configuration.WriteTo.Unity3D(formatter: new SS3DUnityTextFormatter(outputTemplate: DefaultUnityLogTemplate)); @@ -77,9 +75,9 @@ private static LoggerConfiguration ConfigureForPlayMode(LoggerConfiguration conf // Apply some override on the minimum logging level for some namespaces using the log settings. // Does not apply override if the logging level corresponds to the global minimum level. - foreach (var levelForNameSpace in settings.SS3DNameSpaces) + foreach (var levelForNameSpace in Settings.SS3DNameSpaces) { - if (levelForNameSpace.Level == settings.defaultLogLevel) continue; + if (levelForNameSpace.Level == Settings.defaultLogLevel) continue; configuration = configuration.MinimumLevel.Override(levelForNameSpace.Name, levelForNameSpace.Level); } @@ -110,7 +108,7 @@ private static LoggerConfiguration ConfigureForPlayMode(LoggerConfiguration conf /// private static LoggerConfiguration ConfigureMinimumLevel(LoggerConfiguration loggerConfiguration) { - switch (settings.defaultLogLevel) + switch (Settings.defaultLogLevel) { case LogEventLevel.Verbose: return loggerConfiguration.MinimumLevel.Verbose(); case LogEventLevel.Debug: return loggerConfiguration.MinimumLevel.Debug(); diff --git a/Assets/Scripts/SS3D/Core/SessionNetworkSystem.cs b/Assets/Scripts/SS3D/Core/SessionNetworkSystem.cs index e5db12eadd..8a3c9dd1a3 100644 --- a/Assets/Scripts/SS3D/Core/SessionNetworkSystem.cs +++ b/Assets/Scripts/SS3D/Core/SessionNetworkSystem.cs @@ -35,15 +35,15 @@ public void InitializeNetworkSession() switch (networkType) { case NetworkType.DedicatedServer: - Punpun.Information(this, "Hosting a new headless server on port {port}", Logs.Important, port); + Log.Information(this, "Hosting a new headless server on port {port}", Logs.Important, port); networkManager.ServerManager.StartConnection(port); break; case NetworkType.Client: - Punpun.Information(this, "Joining server {serverAddress}:{port} as {ckey}", Logs.Important, serverAddress, port, ckey); + Log.Information(this, "Joining server {serverAddress}:{port} as {ckey}", Logs.Important, serverAddress, port, ckey); networkManager.ClientManager.StartConnection(serverAddress, port); break; case NetworkType.Host: - Punpun.Information(this, "Hosting a new server on port {port}", Logs.Important, port); + Log.Information(this, "Hosting a new server on port {port}", Logs.Important, port); networkManager.ServerManager.StartConnection(port); networkManager.ClientManager.StartConnection(); break; @@ -69,11 +69,11 @@ public void CloseNetworkSession() NetworkManager networkManager = InstanceFinder.NetworkManager; if (networkManager == null) { - Punpun.Warning(this, "No NetworkManager found", Logs.Important); + Log.Warning(this, "No NetworkManager found", Logs.Important); return; } - Punpun.Information(this, "Closing network session", Logs.Important); + Log.Information(this, "Closing network session", Logs.Important); networkManager.TransportManager.Transport.Shutdown(); } } diff --git a/Assets/Scripts/SS3D/Core/Settings/NetworkSettings.cs b/Assets/Scripts/SS3D/Core/Settings/NetworkSettings.cs index 02c28540fb..f5b968a8e2 100644 --- a/Assets/Scripts/SS3D/Core/Settings/NetworkSettings.cs +++ b/Assets/Scripts/SS3D/Core/Settings/NetworkSettings.cs @@ -47,7 +47,7 @@ public static void ResetOnBuiltApplication() { NetworkSettings networkSettings = GetOrFind(); - Punpun.Information(nameof(NetworkSettings), $"Network settings reset on the built executable"); + Log.Information(nameof(NetworkSettings), $"Network settings reset on the built executable"); networkSettings.NetworkType = NetworkType.Client; networkSettings.ServerAddress = string.Empty; diff --git a/Assets/Scripts/SS3D/Core/Subsystems.cs b/Assets/Scripts/SS3D/Core/Subsystems.cs index 9779a05fee..dd7f95616a 100644 --- a/Assets/Scripts/SS3D/Core/Subsystems.cs +++ b/Assets/Scripts/SS3D/Core/Subsystems.cs @@ -53,7 +53,7 @@ public static T Get() where T : MonoBehaviour string message = $"Couldn't find subsystem of {typeof(T).Name} in the scene"; // ReSharper disable once Unity.PerformanceCriticalCodeInvocation - Punpun.Error(typeof(Subsystems), message, Logs.Important); + Log.Error(typeof(Subsystems), message, Logs.Important); return null; } diff --git a/Assets/Scripts/SS3D/Core/Utils/CommandLineArgsSystem.cs b/Assets/Scripts/SS3D/Core/Utils/CommandLineArgsSystem.cs index 50e2b17f85..95387c0c82 100644 --- a/Assets/Scripts/SS3D/Core/Utils/CommandLineArgsSystem.cs +++ b/Assets/Scripts/SS3D/Core/Utils/CommandLineArgsSystem.cs @@ -104,7 +104,7 @@ private void LoadCommandLineArgs() } catch (Exception e) { - Punpun.Information(this,e,$"Failed to load command line arguments"); + Log.Information(this,e,$"Failed to load command line arguments"); throw; } } diff --git a/Assets/Scripts/SS3D/Core/ViewLocator.cs b/Assets/Scripts/SS3D/Core/ViewLocator.cs index c98cf9daf0..dd2907acba 100644 --- a/Assets/Scripts/SS3D/Core/ViewLocator.cs +++ b/Assets/Scripts/SS3D/Core/ViewLocator.cs @@ -63,7 +63,7 @@ public static List Get() where T : MonoBehaviour string message = $"No views of type {typeof(T).Name} found."; // ReSharper disable once Unity.PerformanceCriticalCodeInvocation - Punpun.Error(typeof(Subsystems), "No views of type {typeName} found", Logs.Important, typeof(T).Name); + Log.Error(typeof(Subsystems), "No views of type {typeName} found", Logs.Important, typeof(T).Name); return null; } diff --git a/Assets/Scripts/SS3D/Data/Assets.cs b/Assets/Scripts/SS3D/Data/Assets.cs index eaea31503f..561ea95d18 100644 --- a/Assets/Scripts/SS3D/Data/Assets.cs +++ b/Assets/Scripts/SS3D/Data/Assets.cs @@ -89,7 +89,7 @@ public static void LoadAssetDatabases() Databases.Add(index, database); } - Punpun.Information(typeof(Assets), "{assetDatabasesCount} Asset Databases initialized", Logs.Important, assetDatabases.Count); + Log.Information(typeof(Assets), "{assetDatabasesCount} Asset Databases initialized", Logs.Important, assetDatabases.Count); } /// @@ -103,7 +103,7 @@ public static AssetDatabase GetDatabase(int key) if (!databaseExists) { - Punpun.Warning(typeof(Assets), "Database of type {key} not found", Logs.Important, key); + Log.Warning(typeof(Assets), "Database of type {key} not found", Logs.Important, key); } return database; @@ -120,7 +120,7 @@ public static AssetDatabase GetDatabase(Enums.AssetDatabases key) if (!databaseExists) { - Punpun.Warning(typeof(Assets), "Database of type {key} not found", Logs.Important, key); + Log.Warning(typeof(Assets), "Database of type {key} not found", Logs.Important, key); } return database; diff --git a/Assets/Scripts/SS3D/Data/GamePaths.cs b/Assets/Scripts/SS3D/Data/GamePaths.cs index d2dec63e37..f4fafbf075 100644 --- a/Assets/Scripts/SS3D/Data/GamePaths.cs +++ b/Assets/Scripts/SS3D/Data/GamePaths.cs @@ -4,5 +4,6 @@ public enum GamePaths { Root, Config, + Data, } } \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Data/Management.meta b/Assets/Scripts/SS3D/Data/Management.meta new file mode 100644 index 0000000000..3a636fcb85 --- /dev/null +++ b/Assets/Scripts/SS3D/Data/Management.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 99262c2992c44e1f85309b64814e25d9 +timeCreated: 1689875076 \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Data/Management/SaveSystem.cs b/Assets/Scripts/SS3D/Data/Management/SaveSystem.cs new file mode 100644 index 0000000000..5875637aea --- /dev/null +++ b/Assets/Scripts/SS3D/Data/Management/SaveSystem.cs @@ -0,0 +1,164 @@ +using JetBrains.Annotations; +using SS3D.Logging; +using System; +using System.IO; +using System.Runtime.CompilerServices; +using UnityEngine; + +namespace SS3D.Data.Management +{ + /// + /// Class for the saving and loading of serialized objects. Uses Generics and can be adapted for any serializable object. + /// + public static class SaveSystem + { + /// + /// The saved files extension. + /// + private const string SaveExtension = "json"; + + /// + /// Folder where to save the save files. + /// + private static readonly string SaveFolder = Paths.GetPath(GamePaths.Data, true); + + private static bool IsInitialized; + + public static void Initialize() + { + if (IsInitialized) + { + return; + } + + IsInitialized = true; + + if (!Directory.Exists(SaveFolder)) + { + Directory.CreateDirectory(SaveFolder); + } + } + + private static bool Save(string fileName, string saveString, bool overwrite) + { + string saveFileName = fileName; + + if (!overwrite) + { + // Make sure the Save Number is unique so it doesnt overwrite a previous save file + int saveNumber = 1; + while (File.Exists(SaveFolder + saveFileName + "." + SaveExtension)) + { + saveNumber++; + saveFileName = fileName + "_" + saveNumber; + } + } + + try + { + File.WriteAllText(SaveFolder + saveFileName + "." + SaveExtension, saveString); + Log.Information(typeof(SaveSystem), $"Saved file {fileName}"); + } + catch (Exception e) + { + Log.Error(typeof(SaveSystem), $"Something went wrong when saving {fileName}: {e.Message}"); + + return false; + } + + return true; + } + + private static bool Load(string fileName, [CanBeNull] out string saveString) + { + if (!File.Exists(SaveFolder + fileName + "." + SaveExtension)) + { + saveString = null; + return false; + } + + saveString = File.ReadAllText(SaveFolder + fileName + "." + SaveExtension); + return true; + + } + + private static bool TryLoadMostRecentFile(string path, [CanBeNull] out string file) + { + DirectoryInfo directoryInfo = new(SaveFolder + path); + + if (!Directory.Exists(SaveFolder)) + { + Log.Information(nameof(SaveSystem), $"No saves found, creating new folder at {SaveFolder}"); + + Directory.CreateDirectory(SaveFolder); + } + + // Get all save files + FileInfo[] saveFiles = directoryInfo.GetFiles( "*." + SaveExtension); + + // Cycle through all save files and identify the most recent one + FileInfo mostRecentFile = null; + foreach (FileInfo fileInfo in saveFiles) + { + if (mostRecentFile == null) + { + mostRecentFile = fileInfo; + } + else + { + if (fileInfo.LastWriteTime > mostRecentFile.LastWriteTime) + { + mostRecentFile = fileInfo; + } + } + } + + // If theres a save file, load it, if not return null + if (mostRecentFile == null) + { + Log.Error(typeof(SaveSystem), $"Failed to find the most recent file at {path}"); + + file = null; + return false; + } + + Log.Information(typeof(SaveSystem), $"Loaded the the most recent file at {path}"); + + file = File.ReadAllText(mostRecentFile.FullName); + return true; + + } + + public static bool SaveObject(string fileName, object saveObject, bool overwrite = false) + { + string json = JsonUtility.ToJson(saveObject); + + return Save(fileName, json, overwrite); + } + + public static TSaveObject LoadObject(string fileName) + { + if (Load(fileName, out string saveString)) + { + TSaveObject saveObject = JsonUtility.FromJson(saveString); + return saveObject; + } + + return default; + } + + public static TSaveObject LoadMostRecentObject(string path) + { + bool mostRecentFileExists = TryLoadMostRecentFile(path, out string saveString); + + if (!mostRecentFileExists) + { + return default; + } + + TSaveObject saveObject = JsonUtility.FromJson(saveString); + return saveObject; + + } + } +} diff --git a/Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs.meta b/Assets/Scripts/SS3D/Data/Management/SaveSystem.cs.meta similarity index 100% rename from Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs.meta rename to Assets/Scripts/SS3D/Data/Management/SaveSystem.cs.meta diff --git a/Assets/Scripts/SS3D/Data/Paths.cs b/Assets/Scripts/SS3D/Data/Paths.cs index 8e80a78b1a..fb4baed4a7 100644 --- a/Assets/Scripts/SS3D/Data/Paths.cs +++ b/Assets/Scripts/SS3D/Data/Paths.cs @@ -15,22 +15,22 @@ public static class Paths /// Gets the config path from the root path, excluding everything outside the game root folder. /// [NotNull] - private static string ConfigGamePath => Application.isEditor ? EditorConfigFilePath : BuiltConfigFilePath; + private static string GamePath => Application.isEditor ? EditorGameFilePath : BuiltGameFilePath; /// /// Gets the full path to the application folder. /// [NotNull] - private static string RootGamePath => Path.GetFullPath("."); + private static string FullGamePath => Path.GetFullPath("."); /// /// The path to the Config folder on the Editor project. /// - private const string EditorConfigFilePath = "/Builds/Game/Config/"; + private const string EditorGameFilePath = "/Builds/Game"; /// /// The path to the config folder on the built project. /// - private const string BuiltConfigFilePath = "/Config/"; + private const string BuiltGameFilePath = ""; /// /// Gets a path in the game folder. @@ -41,61 +41,9 @@ public static class Paths [NotNull] public static string GetPath(GamePaths gamePath, bool fullPath = false) { - string path; - - switch (gamePath) - { - case GamePaths.Root: - path = RootGamePath; - return path; - case GamePaths.Config: - path = ConfigGamePath; - - break; - default: - throw new ArgumentOutOfRangeException(nameof(gamePath), gamePath, null); - } - - if (fullPath) - { - path = RootGamePath + path; - } + string path = (fullPath ? FullGamePath : string.Empty) + GamePath + "/" + gamePath; return path; } - - /// - /// Reads or creates a file. - /// - /// The full path including the file. - /// The read or created file. - [NotNull] - public static string ReadOrCreateIfNotExistsFile([NotNull] string path) - { - if (File.Exists(path)) - { - return File.ReadAllText(path); - } - - Punpun.Information(nameof(Paths), $"File {path} not found, creating a new one."); - - File.Create(path); - return File.ReadAllText(path); - } - - /// - /// Writes or creates a/to a file. - /// - /// File path. - /// File content. - public static void WriteOrCreateIfNotExistsFile([NotNull] string path, string fileContent) - { - if (!File.Exists(path)) - { - File.Create(path); - } - - File.WriteAllText(path, fileContent); - } } } \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Logging/Punpun.cs b/Assets/Scripts/SS3D/Logging/Log.cs similarity index 85% rename from Assets/Scripts/SS3D/Logging/Punpun.cs rename to Assets/Scripts/SS3D/Logging/Log.cs index 3167bf641f..85dd0a0fa4 100644 --- a/Assets/Scripts/SS3D/Logging/Punpun.cs +++ b/Assets/Scripts/SS3D/Logging/Log.cs @@ -11,7 +11,7 @@ namespace SS3D.Logging /// Makes mandatory adding additionnal log context with the Logs enum. /// Takes care of adding infoLog and sender properties to Serilog Logger. /// - public static class Punpun + public static class Log { /// /// Write a log event with the level and associated exception. @@ -25,7 +25,7 @@ public static class Punpun public static void Verbose(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[]{infoLog}.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Verbose("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Verbose("{InfoLog}" + messageTemplate, properties); } /// @@ -41,7 +41,7 @@ public static void Verbose(object sender, string messageTemplate, Logs infoLog = public static void Verbose(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Verbose(exception,"{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Verbose(exception,"{InfoLog}" + messageTemplate, properties); } /// @@ -56,7 +56,7 @@ public static void Verbose(object sender, Exception exception, string messageTem public static void Debug(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug("{InfoLog}" + messageTemplate, properties); } /// @@ -71,7 +71,7 @@ public static void Debug(object sender, string messageTemplate, Logs infoLog = L public static void Debug(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); } /// @@ -86,7 +86,7 @@ public static void Debug(object sender, Exception exception, string messageTempl public static void Information(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Information("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Information("{InfoLog}" + messageTemplate, properties); } /// @@ -101,7 +101,7 @@ public static void Information(object sender, string messageTemplate, Logs infoL public static void Information(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); } /// @@ -116,7 +116,7 @@ public static void Information(object sender, Exception exception, string messag public static void Warning(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Warning("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Warning("{InfoLog}" + messageTemplate, properties); } /// @@ -131,7 +131,7 @@ public static void Warning(object sender, string messageTemplate, Logs infoLog = public static void Warning(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Debug(exception, "{InfoLog}" + messageTemplate, properties); } /// @@ -146,7 +146,7 @@ public static void Warning(object sender, Exception exception, string messageTem public static void Error(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Error("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Error("{InfoLog}" + messageTemplate, properties); } /// @@ -161,7 +161,7 @@ public static void Error(object sender, string messageTemplate, Logs infoLog = L public static void Error(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Error(exception, "{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Error(exception, "{InfoLog}" + messageTemplate, properties); } /// @@ -176,7 +176,7 @@ public static void Error(object sender, Exception exception, string messageTempl public static void Fatal(object sender, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Fatal("{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Fatal("{InfoLog}" + messageTemplate, properties); } /// @@ -191,7 +191,7 @@ public static void Fatal(object sender, string messageTemplate, Logs infoLog = L public static void Fatal(object sender, Exception exception, string messageTemplate, Logs infoLog = Logs.Generic, params object[] propertyValues) { var properties = new object[] { infoLog }.Concat(propertyValues).ToArray(); - Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Fatal(exception, "{InfoLog}" + messageTemplate, properties); + Serilog.Log.ForContext(Constants.SourceContextPropertyName, sender.GetType().Name).Fatal(exception, "{InfoLog}" + messageTemplate, properties); } } diff --git a/Assets/Scripts/SS3D/Logging/Punpun.cs.meta b/Assets/Scripts/SS3D/Logging/Log.cs.meta similarity index 100% rename from Assets/Scripts/SS3D/Logging/Punpun.cs.meta rename to Assets/Scripts/SS3D/Logging/Log.cs.meta diff --git a/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/LogSettingsInspectorEditor.cs b/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/LogSettingsInspectorEditor.cs index 4d17aad2a0..b63156a1d2 100644 --- a/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/LogSettingsInspectorEditor.cs +++ b/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/LogSettingsInspectorEditor.cs @@ -13,7 +13,7 @@ namespace SS3D.Logging.LogSettings.InspectorEditor /// Custom inspector for the log settings, allow to show the list of namespaces in a convenient manner, /// as well as resetting easily all namespaces logging level. /// - [CustomEditor(typeof(LogSetting))] + [CustomEditor(typeof(LogSettings))] public class LogSettingsInspectorEditor : Editor { public override void OnInspectorGUI() diff --git a/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/NameSpaceLogLevelDrawer.cs b/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/NameSpaceLogLevelDrawer.cs index 1638ef532d..85ac141983 100644 --- a/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/NameSpaceLogLevelDrawer.cs +++ b/Assets/Scripts/SS3D/Logging/LogSettings/InspectorEditor/NameSpaceLogLevelDrawer.cs @@ -2,29 +2,29 @@ using UnityEditor; using UnityEngine; -using SS3D.Logging.LogSettings; -[CustomPropertyDrawer(typeof(LogSetting.NameSpaceLogLevel))] -public class NameSpaceLogLevelDrawer : PropertyDrawer +namespace SS3D.Logging.LogSettings.InspectorEditor { - public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { - // Using BeginProperty / EndProperty on the parent property means that - // prefab override logic works on the entire property. - EditorGUI.BeginProperty(position, label, property); + [CustomPropertyDrawer(typeof(NamespaceLogLevel))] + public class NameSpaceLogLevelDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + // Using BeginProperty / EndProperty on the parent property means that + // prefab override logic works on the entire property. + EditorGUI.BeginProperty(position, label, property); - // Draw label - position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); + // Draw label + position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); - // Calculate rect - var unitRect = new Rect(position.x + 35, position.y, 150, position.height); - + // Calculate rect + Rect unitRect = new Rect(position.x + 35, position.y, 150, position.height); - // Draw fields - pass GUIContent.none to each so they are drawn without labels - EditorGUI.PropertyField(unitRect, property.FindPropertyRelative("_level"), GUIContent.none); + // Draw fields - pass GUIContent.none to each so they are drawn without labels + EditorGUI.PropertyField(unitRect, property.FindPropertyRelative("_level"), GUIContent.none); - - EditorGUI.EndProperty(); - } + EditorGUI.EndProperty(); + } + } } # endif \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs b/Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs deleted file mode 100644 index 2400079463..0000000000 --- a/Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using System.Linq; -using Serilog.Events; - -namespace SS3D.Logging.LogSettings -{ - - /// - /// Allow user to create a scriptable object representing settings for the log, in particular, - /// allows to set in inspector the logging level for each namespace. - /// - [CreateAssetMenu(menuName = "ScriptableObjects/LogSettings", order = 1)] - public class LogSetting : ScriptableObject - { - // structure to associate to each namespace a log level. - [Serializable] - public struct NameSpaceLogLevel - { - public NameSpaceLogLevel(string name, LogEventLevel level) - { - _name = name; - _level = level; - } - - [SerializeField] - private string _name; - [SerializeField] - private LogEventLevel _level; - - public string Name => _name; - public LogEventLevel Level => _level; - } - - [SerializeField] - public List SS3DNameSpaces = GetAllNameOfSS3DNameSpace(); - public LogEventLevel defaultLogLevel = LogEventLevel.Verbose; - - /// - /// Get all the name of the SS3D namespaces in alphanumerical order. - /// - /// - public static List GetAllNameOfSS3DNameSpace() - { - var Assemblies = AppDomain.CurrentDomain.GetAssemblies(); - var SS3DNameSpaces = new List(); - int i = 0; - foreach (var assembly in Assemblies) - { - var namespaces = assembly.GetTypes() - .Select(t => t.Namespace) - .Distinct(); - - - foreach (var type in namespaces) - { - if (type == null || !type.Contains("SS3D")) - { - continue; - } - SS3DNameSpaces.Add(new NameSpaceLogLevel(type, LogEventLevel.Information)); - i++; - } - } - - return SS3DNameSpaces.OrderBy(o => o.Name).ToList(); - } - } -} diff --git a/Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs b/Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs new file mode 100644 index 0000000000..48ebb4d4e8 --- /dev/null +++ b/Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs @@ -0,0 +1,63 @@ +using Coimbra; +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using UnityEngine; +using System.Linq; +using Serilog.Events; +using System.Reflection; + +namespace SS3D.Logging.LogSettings +{ + /// + /// Allow user to create a scriptable object representing settings for the log, in particular, + /// allows to set in inspector the logging level for each namespace. + /// + [CreateAssetMenu(menuName = "ScriptableObjects/LogSettings", order = 1)] + [ProjectSettings("SS3D")] + public sealed class LogSettings : ScriptableSettings + { + [SerializeField] + public List SS3DNameSpaces = GetAllSs3DNamespaces(); + public LogEventLevel defaultLogLevel = LogEventLevel.Verbose; + + /// + /// Get all the name of the SS3D namespaces in alphanumerical order. + /// + /// + [NotNull] + private static List GetAllSs3DNamespaces() + { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + List projectNamespaces = new List(); + int i = 0; + foreach (string type in assemblies.Select(assembly => assembly.GetTypes().Select(t => t.Namespace).Distinct()).SelectMany(namespaces => namespaces.Where(type => type != null && type.Contains("SS3D")))) + { + projectNamespaces.Add(new NamespaceLogLevel(type, LogEventLevel.Information)); + i++; + } + + return projectNamespaces.OrderBy(o => o.Name).ToList(); + } + } + + // structure to associate to each namespace a log level. + [Serializable] + public struct NamespaceLogLevel + { + public NamespaceLogLevel(string name, LogEventLevel level) + { + _name = name; + _level = level; + } + + [SerializeField] + private string _name; + + [SerializeField] + private LogEventLevel _level; + + public string Name => _name; + public LogEventLevel Level => _level; + } +} diff --git a/Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs.meta b/Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs.meta similarity index 100% rename from Assets/Scripts/SS3D/Logging/LogSettings/LogSetting.cs.meta rename to Assets/Scripts/SS3D/Logging/LogSettings/LogSettings.cs.meta diff --git a/Assets/Scripts/SS3D/Logging/SS3D.Logging.asmdef b/Assets/Scripts/SS3D/Logging/SS3D.Logging.asmdef index 47c9b473e6..538d95303f 100644 --- a/Assets/Scripts/SS3D/Logging/SS3D.Logging.asmdef +++ b/Assets/Scripts/SS3D/Logging/SS3D.Logging.asmdef @@ -2,10 +2,10 @@ "name": "SS3D.Logging", "rootNamespace": "", "references": [ - "GUID:0980e432586b1dd4c811ecb5a88e17e7", "GUID:ebcad7e3972724c43aa595f17cf4d103", "GUID:7c88a4a7926ee5145ad2dfa06f454c67", - "GUID:92a1e40b8cccf8645adbdd275ac6371a" + "GUID:92a1e40b8cccf8645adbdd275ac6371a", + "GUID:6aabbee860c32c64d9bbd52d0704ed2c" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Scripts/SS3D/Networking/UnauthorizedPlayer.cs b/Assets/Scripts/SS3D/Networking/UnauthorizedPlayer.cs index 5e1efc92c3..71e4e6f51d 100644 --- a/Assets/Scripts/SS3D/Networking/UnauthorizedPlayer.cs +++ b/Assets/Scripts/SS3D/Networking/UnauthorizedPlayer.cs @@ -30,7 +30,7 @@ private void Setup() return; } - Punpun.Information(this, "Attempting authentication for user {ckey}", Logs.ClientOnly, ckey); + Log.Information(this, "Attempting authentication for user {ckey}", Logs.ClientOnly, ckey); UserAuthorizationMessage userAuthorizationMessage = new(ckey); ClientManager.Broadcast(userAuthorizationMessage); diff --git a/Assets/Scripts/SS3D/Systems/Entities/EntitySystem.cs b/Assets/Scripts/SS3D/Systems/Entities/EntitySystem.cs index 4d90225d9a..0b69a4d80e 100644 --- a/Assets/Scripts/SS3D/Systems/Entities/EntitySystem.cs +++ b/Assets/Scripts/SS3D/Systems/Entities/EntitySystem.cs @@ -179,7 +179,7 @@ private void SpawnPlayer(Player player) _spawnedPlayers.Add(entity); - Punpun.Information(this, "Spawning mind {createdMind} on {entity}", Logs.ServerOnly, createdMind.name, entity.name); + Log.Information(this, "Spawning mind {createdMind} on {entity}", Logs.ServerOnly, createdMind.name, entity.name); } /// @@ -193,7 +193,7 @@ private void SpawnReadyPlayers(List players) if (players.Count == 0) { - Punpun.Information(this, "No players to spawn", Logs.ServerOnly); + Log.Information(this, "No players to spawn", Logs.ServerOnly); } foreach (Player ckey in players) diff --git a/Assets/Scripts/SS3D/Systems/Furniture/LockLockerInteraction.cs b/Assets/Scripts/SS3D/Systems/Furniture/LockLockerInteraction.cs index 46cdf0c4aa..c149ca310b 100644 --- a/Assets/Scripts/SS3D/Systems/Furniture/LockLockerInteraction.cs +++ b/Assets/Scripts/SS3D/Systems/Furniture/LockLockerInteraction.cs @@ -56,11 +56,11 @@ public override bool Start(InteractionEvent interactionEvent, InteractionReferen { if (hands.Inventory.HasPermission(permissionToUnlock)) { - Punpun.Information(this, "Locker has been locked!"); + Log.Information(this, "Locker has been locked!"); locker.Locked = true; } else { - Punpun.Information(this, "No permission to lock Locker!"); + Log.Information(this, "No permission to lock Locker!"); return false; } } diff --git a/Assets/Scripts/SS3D/Systems/Furniture/UnlockLockerInteraction.cs b/Assets/Scripts/SS3D/Systems/Furniture/UnlockLockerInteraction.cs index 03e3649552..fdf51993a9 100644 --- a/Assets/Scripts/SS3D/Systems/Furniture/UnlockLockerInteraction.cs +++ b/Assets/Scripts/SS3D/Systems/Furniture/UnlockLockerInteraction.cs @@ -55,11 +55,11 @@ public override bool Start(InteractionEvent interactionEvent, InteractionReferen { if (hands.Inventory.HasPermission(permissionToUnlock)) { - Punpun.Information(this, "Locker has been unlocked!"); + Log.Information(this, "Locker has been unlocked!"); locker.Locked = false; } else { - Punpun.Information(this, "No permission to unlock Locker!"); + Log.Information(this, "No permission to unlock Locker!"); } } diff --git a/Assets/Scripts/SS3D/Systems/Gamemodes/Modes/Gamemode.cs b/Assets/Scripts/SS3D/Systems/Gamemodes/Modes/Gamemode.cs index 7cc799b4de..20effda22c 100644 --- a/Assets/Scripts/SS3D/Systems/Gamemodes/Modes/Gamemode.cs +++ b/Assets/Scripts/SS3D/Systems/Gamemodes/Modes/Gamemode.cs @@ -114,7 +114,7 @@ protected virtual void FinalizeObjectives() FailOnGoingObjectives(); int succeededObjectives = _roundObjectives.Count(objective => objective.Succeeded); - Punpun.Information(this, "Objectives Completed: {succeededObjectives}/{roundObjectivesCount}", + Log.Information(this, "Objectives Completed: {succeededObjectives}/{roundObjectivesCount}", Logs.Generic, succeededObjectives, _roundObjectives.Count); } @@ -127,7 +127,7 @@ private void CheckAllObjectivesCompletion() ObjectiveStatus status = objective.Status; - Punpun.Information(this, "{objectiveTitle} - {status}", Logs.Generic, objective.Title, status); + Log.Information(this, "{objectiveTitle} - {status}", Logs.Generic, objective.Title, status); } } @@ -145,7 +145,7 @@ private void DestroyAllObjectives() /// protected virtual void CreateObjectives(List spawnedPlayersCkeys) { - Punpun.Information(this, "Creating initial objectives", Logs.ServerOnly); + Log.Information(this, "Creating initial objectives", Logs.ServerOnly); // Determine the minimum number of assignees (so every gets an objective) int numberOfPlayers = spawnedPlayersCkeys.Count; @@ -168,7 +168,7 @@ protected virtual void AssignRoundStartObjectives(List ckeysToAssign) // Validate that input is correct. if (ckeysToAssign.Count != RoundObjectives.Count) { - Punpun.Error(this, "Number of objective entries ({RoundObjectivesCount}) and players ({ckeysCount}) do not match!", + Log.Error(this, "Number of objective entries ({RoundObjectivesCount}) and players ({ckeysCount}) do not match!", Logs.Generic, RoundObjectives.Count, ckeysToAssign.Count); } @@ -281,7 +281,7 @@ protected virtual void AssignObjective(GamemodeObjective objective, string playe string title = $"[{objective.Id}/{objective.Title}]"; string playerName = $"[{playerCkey}]".Colorize(LogColors.Blue); - Punpun.Information(this, "Objective initialized {title} for {playerName}", Logs.ServerOnly, title, playerName); + Log.Information(this, "Objective initialized {title} for {playerName}", Logs.ServerOnly, title, playerName); } /// diff --git a/Assets/Scripts/SS3D/Systems/Health/BodyParts/Bodypart.cs b/Assets/Scripts/SS3D/Systems/Health/BodyParts/Bodypart.cs index 43c7d6e048..c2421e1637 100644 --- a/Assets/Scripts/SS3D/Systems/Health/BodyParts/Bodypart.cs +++ b/Assets/Scripts/SS3D/Systems/Health/BodyParts/Bodypart.cs @@ -158,12 +158,12 @@ public void SetParentBodyPart(BodyPart value) if (_childBodyParts.Contains(value)) { - Punpun.Error(this, "trying to set up {bodypart} bodypart as both child and" + + Log.Error(this, "trying to set up {bodypart} bodypart as both child and" + " parent of {bodypart} bodypart.", Logs.Generic, value, this); return; } - Punpun.Debug(this, "value of parent body part {bodypart}", Logs.Generic, value); + Log.Debug(this, "value of parent body part {bodypart}", Logs.Generic, value); _parentBodyPart = value; _parentBodyPart._childBodyParts.Add(this); } diff --git a/Assets/Scripts/SS3D/Systems/Interactions/InteractionController.cs b/Assets/Scripts/SS3D/Systems/Interactions/InteractionController.cs index 813beab983..316d58debd 100644 --- a/Assets/Scripts/SS3D/Systems/Interactions/InteractionController.cs +++ b/Assets/Scripts/SS3D/Systems/Interactions/InteractionController.cs @@ -380,7 +380,7 @@ private void CmdRunInventoryInteraction(GameObject target, GameObject sourceObje // Check for valid interaction index if (index < 0 || entries.Count <= index) { - Punpun.Error(target, "Inventory interaction with invalid index {index}", Logs.Generic, index); + Log.Error(target, "Inventory interaction with invalid index {index}", Logs.Generic, index); return; } @@ -390,7 +390,7 @@ private void CmdRunInventoryInteraction(GameObject target, GameObject sourceObje if (chosenEntry.Interaction.GetName(interactionEvent) != interactionName) { - Punpun.Error(target, "Interaction at index {index} did not have the expected name of {interactionName}", + Log.Error(target, "Interaction at index {index} did not have the expected name of {interactionName}", Logs.Generic, index, interactionName); return; diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Containers/AttachedContainer.cs b/Assets/Scripts/SS3D/Systems/Inventory/Containers/AttachedContainer.cs index 54649a7ff2..5adc1121fd 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Containers/AttachedContainer.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Containers/AttachedContainer.cs @@ -282,7 +282,7 @@ private void HandleStoredItemsChanged(SyncListOperation op, int index, StoredIte } // This seem to be called correctly 2 move and none when moving inside, 2 remove and none when removing, 2 add and none when adding, 2 add 2 remove and none when transferring - Punpun.Information(this, "container change type is" + changeType.ToString()); + Log.Information(this, "container change type is" + changeType.ToString()); if (changeType == ContainerChangeType.None) { return; diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Containers/ClothesDisplayer.cs b/Assets/Scripts/SS3D/Systems/Inventory/Containers/ClothesDisplayer.cs index ffa35f25cb..aec25d0d2f 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Containers/ClothesDisplayer.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Containers/ClothesDisplayer.cs @@ -72,7 +72,7 @@ private void ClothedBodyPartsOnChange(SyncListOperation op, int index, Item newItem = newData._clothToDisplay; if (!newBodyPart.TryGetComponent(out SkinnedMeshRenderer renderer)) { - Punpun.Warning(this, $"no skinned mesh renderer on game object {newBodyPart}, can't display cloth"); + Log.Warning(this, $"no skinned mesh renderer on game object {newBodyPart}, can't display cloth"); return; } newBodyPart.gameObject.SetActive(true); diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Containers/Hands.cs b/Assets/Scripts/SS3D/Systems/Inventory/Containers/Hands.cs index 872d463133..644e30a4ee 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Containers/Hands.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Containers/Hands.cs @@ -152,13 +152,13 @@ public void CmdSetActiveHand(AttachedContainer selectedContainer) if (hand == selectedContainer) { - Punpun.Warning(this, "Hand already selected"); + Log.Warning(this, "Hand already selected"); return; } if (!HandContainers.Contains(selectedContainer)) { - Punpun.Warning(this, "no hand with the passed container in parameter"); + Log.Warning(this, "no hand with the passed container in parameter"); return; } diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Containers/HumanInventory.cs b/Assets/Scripts/SS3D/Systems/Inventory/Containers/HumanInventory.cs index c7a42233f7..9fb2733032 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Containers/HumanInventory.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Containers/HumanInventory.cs @@ -149,7 +149,7 @@ private void SetUpContainers() foreach (var container in attachedContainers) { AddContainer(container); - Punpun.Information(this, "Adding {container} container to inventory", Logs.Generic, container); + Log.Information(this, "Adding {container} container to inventory", Logs.Generic, container); } } @@ -306,13 +306,13 @@ private void CmdTransferItem(GameObject itemObject, Vector2Int position, Attache // Can't put an item in its own container if (item.GetComponentsInChildren().AsEnumerable().Contains(container)){ - Punpun.Warning(this, "can't put an item in its own container"); + Log.Warning(this, "can't put an item in its own container"); return; } if (container == null) { - Punpun.Error(this, $"Client sent invalid container reference: NetId {container.ObjectId}"); + Log.Error(this, $"Client sent invalid container reference: NetId {container.ObjectId}"); return; } @@ -434,7 +434,7 @@ private void HandleTryRemoveContainerOnItemDetached(object sender, Item item) if (ContainersOnPlayer.Contains(container)) { RemoveContainer(container); - Punpun.Warning(this, $"invoke {container} removed"); + Log.Warning(this, $"invoke {container} removed"); } } } diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Containers/InventoryView.cs b/Assets/Scripts/SS3D/Systems/Inventory/Containers/InventoryView.cs index 1193220031..357699de5e 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Containers/InventoryView.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Containers/InventoryView.cs @@ -182,7 +182,7 @@ private void HandleInventoryContainerAdded(AttachedContainer container) break; default: - Punpun.Error(this, $"Unknown or missing container type {container.Type} for this container {container}"); + Log.Error(this, $"Unknown or missing container type {container.Type} for this container {container}"); slot = null; break; } @@ -244,7 +244,7 @@ private int PlaceHorizontalLayoutSlot(ContainerType type) return i; } } - Punpun.Warning(this, "returning slot position 0, should not reach this point"); + Log.Warning(this, "returning slot position 0, should not reach this point"); return 0; } @@ -290,7 +290,7 @@ private int LastIndexSlotOfType(ContainerType type) } if (slotOfType == null) { - Punpun.Warning(this, "no slots of type " + type.ToString() + ", returning index 0 "); + Log.Warning(this, "no slots of type " + type.ToString() + ", returning index 0 "); return 0; } else diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Items/Item.cs b/Assets/Scripts/SS3D/Systems/Inventory/Items/Item.cs index 509806edc7..66bb623cbe 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Items/Item.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Items/Item.cs @@ -79,7 +79,7 @@ public void Init(string itemName, float weight, List traits) { if (_initialised) { - Punpun.Error(this, "Item already initialised, returning"); + Log.Error(this, "Item already initialised, returning"); return; } _name = itemName ?? string.Empty; @@ -310,7 +310,7 @@ public Sprite GenerateIcon() } catch (NullReferenceException) { - Punpun.Warning(this, "Can't generate icon for " + name + "."); + Log.Warning(this, "Can't generate icon for " + name + "."); icon = null; } // Return stored items back to their parents @@ -330,7 +330,7 @@ public void AddTrait(Trait trait) { if (_traits.Contains(trait)) { - Punpun.Warning(this, "item already contains trait {trait}", Logs.Generic, trait.Name); + Log.Warning(this, "item already contains trait {trait}", Logs.Generic, trait.Name); return; } _traits.Add(trait); diff --git a/Assets/Scripts/SS3D/Systems/Inventory/Items/ItemSystem.cs b/Assets/Scripts/SS3D/Systems/Inventory/Items/ItemSystem.cs index 1a36435832..50f8460b2c 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/Items/ItemSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/Items/ItemSystem.cs @@ -46,7 +46,7 @@ private void LoadItemPrefabs() } else { - Punpun.Error(this, $"gameobject {itemObject} doesn't have any item component"); + Log.Error(this, $"gameobject {itemObject} doesn't have any item component"); } } } @@ -78,14 +78,14 @@ public Item SpawnItem(ItemId id, Vector3 position, Quaternion rotation) if (!hasValue) { - Punpun.Error(this, "No item with ID {id} was found", Logs.ServerOnly, id.ToString()); + Log.Error(this, "No item with ID {id} was found", Logs.ServerOnly, id.ToString()); return null; } Item itemInstance = Instantiate(itemPrefab, position, rotation); ServerManager.Spawn(itemInstance.GameObject); - Punpun.Information(this, "Item {itemInstance} spawned at {position}", Logs.ServerOnly, itemInstance.name, position); + Log.Information(this, "Item {itemInstance} spawned at {position}", Logs.ServerOnly, itemInstance.name, position); return itemInstance; } @@ -103,13 +103,13 @@ public Item SpawnItemInContainer(ItemId id, AttachedContainer attachedContainer) if (!hasValue) { - Punpun.Error(this, "No item with ID {id} was found", Logs.ServerOnly, id.ToString()); + Log.Error(this, "No item with ID {id} was found", Logs.ServerOnly, id.ToString()); return null; } if (attachedContainer is null) { - Punpun.Error(this, "Container does not found!", Logs.ServerOnly); + Log.Error(this, "Container does not found!", Logs.ServerOnly); return null; } @@ -117,7 +117,7 @@ public Item SpawnItemInContainer(ItemId id, AttachedContainer attachedContainer) ServerManager.Spawn(itemInstance.GameObject); attachedContainer.AddItem(itemInstance); - Punpun.Information(this, "Item {item} spawned in container {container}", Logs.ServerOnly, itemInstance.name, attachedContainer.ContainerName); + Log.Information(this, "Item {item} spawned in container {container}", Logs.ServerOnly, itemInstance.name, attachedContainer.ContainerName); return itemInstance; } } diff --git a/Assets/Scripts/SS3D/Systems/Inventory/UI/InventoryDisplayElement.cs b/Assets/Scripts/SS3D/Systems/Inventory/UI/InventoryDisplayElement.cs index 9de9215c0b..fd69d715af 100644 --- a/Assets/Scripts/SS3D/Systems/Inventory/UI/InventoryDisplayElement.cs +++ b/Assets/Scripts/SS3D/Systems/Inventory/UI/InventoryDisplayElement.cs @@ -37,7 +37,7 @@ public void OnDrop(PointerEventData eventData) ItemDisplay display = drag.GetComponent(); if (display == null) { - Punpun.Warning(this, "dragging on null display"); + Log.Warning(this, "dragging on null display"); return; } diff --git a/Assets/Scripts/SS3D/Systems/Permissions/PermissionSystem.cs b/Assets/Scripts/SS3D/Systems/Permissions/PermissionSystem.cs index 559ec13f3e..df869ed3ff 100644 --- a/Assets/Scripts/SS3D/Systems/Permissions/PermissionSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Permissions/PermissionSystem.cs @@ -34,7 +34,7 @@ public sealed class PermissionSystem : NetworkSystem /// private const string ConfigFileName = "permissions.txt"; - private static readonly string PermissionsPath = Paths.GetPath(GamePaths.Config, true) + ConfigFileName; + private static readonly string PermissionsPath = Paths.GetPath(GamePaths.Config, true) + "/" + ConfigFileName; protected override void OnStart() { @@ -72,7 +72,7 @@ public bool TryGetUserRole(string ckey, out ServerRoleTypes userPermission) if (string.IsNullOrEmpty(ckey)) { - Punpun.Warning(this, "Ckey null while trying to get user role"); + Log.Warning(this, "Ckey null while trying to get user role"); userPermission = ServerRoleTypes.None; return false; @@ -125,7 +125,7 @@ private void LoadPermissions() _userPermissions.Add(ckey, role); - Punpun.Information(this, "Found user permission {ckey} as {role}", Logs.ServerOnly, ckey, role); + Log.Information(this, "Found user permission {ckey} as {role}", Logs.ServerOnly, ckey, role); } HasLoadedPermissions = true; @@ -139,7 +139,7 @@ private void CreatePermissionsFileIfNotExists() return; } - Punpun.Information(this, "Permissions file not found, creating a new one", Logs.ServerOnly); + Log.Information(this, "Permissions file not found, creating a new one", Logs.ServerOnly); File.WriteAllText(PermissionsPath, string.Empty); } diff --git a/Assets/Scripts/SS3D/Systems/PlayerControl/PlayerSystem.cs b/Assets/Scripts/SS3D/Systems/PlayerControl/PlayerSystem.cs index 9988e05efd..c5d00da8ec 100644 --- a/Assets/Scripts/SS3D/Systems/PlayerControl/PlayerSystem.cs +++ b/Assets/Scripts/SS3D/Systems/PlayerControl/PlayerSystem.cs @@ -143,7 +143,7 @@ private void LateSyncServerPlayers() private void ProcessPlayerJoin(NetworkConnection conn) { string message = $"Player joined the server - {conn.ClientId} {conn.GetAddress()}"; - Punpun.Information(this, "Player joined the server - {clientId} {connectionAddress}", + Log.Information(this, "Player joined the server - {clientId} {connectionAddress}", Logs.ServerOnly, conn.ClientId, conn.GetAddress()); NetworkObject unauthorizedUser = Instantiate(_unauthorizedUserPrefab, Vector3.zero, Quaternion.identity); @@ -164,7 +164,7 @@ private void ProcessAuthorizePlayer(NetworkConnection conn, UserAuthorizationMes if (!hasPlayer) { - Punpun.Information(this, "No Player match for {ckey} found, creating a new one", Logs.ServerOnly, ckey); + Log.Information(this, "No Player match for {ckey} found, creating a new one", Logs.ServerOnly, ckey); player = Instantiate(_playerPrefab); ServerManager.Spawn(player.gameObject); @@ -175,7 +175,7 @@ private void ProcessAuthorizePlayer(NetworkConnection conn, UserAuthorizationMes } else { - Punpun.Information(this, "Player match for {ckey} found, reassigning to client", Logs.ServerOnly, ckey); + Log.Information(this, "Player match for {ckey} found, reassigning to client", Logs.ServerOnly, ckey); } player.GiveOwnership(conn); @@ -191,18 +191,18 @@ private void ProcessAuthorizePlayer(NetworkConnection conn, UserAuthorizationMes private void ProcessPlayerDisconnect(NetworkConnection conn) { string message = $"Client {conn.ClientId} {conn.GetAddress()} disconnected"; - Punpun.Information(this, "Client {clientId} {connectionAddress} disconnected", Logs.ServerOnly, conn.ClientId, conn.GetAddress()); + Log.Information(this, "Client {clientId} {connectionAddress} disconnected", Logs.ServerOnly, conn.ClientId, conn.GetAddress()); NetworkObject[] ownedObjects = conn.Objects.ToArray(); if (ownedObjects.Length == 0) { - Punpun.Warning(this, "No clientOwnedObjects were found", Logs.ServerOnly); + Log.Warning(this, "No clientOwnedObjects were found", Logs.ServerOnly); return; } foreach (NetworkObject networkIdentity in ownedObjects) { - Punpun.Information(this, "Client {connectionAddress}'s owned object: {networkIdentity}", + Log.Information(this, "Client {connectionAddress}'s owned object: {networkIdentity}", Logs.ServerOnly, conn.GetAddress(), networkIdentity.name); Player player = networkIdentity.GetComponent(); @@ -210,7 +210,7 @@ private void ProcessPlayerDisconnect(NetworkConnection conn) { _onlinePlayers.Remove(player.Ckey); player.RemoveOwnership(); - Punpun.Information(this, "Invoking the player server left event: {ckey}", Logs.ServerOnly, player.Ckey); + Log.Information(this, "Invoking the player server left event: {ckey}", Logs.ServerOnly, player.Ckey); return; } diff --git a/Assets/Scripts/SS3D/Systems/Roles/RoleSystem.cs b/Assets/Scripts/SS3D/Systems/Roles/RoleSystem.cs index f3a8af93c5..e05cc010c4 100644 --- a/Assets/Scripts/SS3D/Systems/Roles/RoleSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Roles/RoleSystem.cs @@ -47,7 +47,7 @@ private void GetAvailableRoles() { if (_rolesAvailable == null) { - Punpun.Error(this, "Initial Available Roles not set!"); + Log.Error(this, "Initial Available Roles not set!"); } foreach (RolesData role in _rolesAvailable.Roles) @@ -146,7 +146,7 @@ public void GiveRoleLoadoutToPlayer(Entity entity) { RoleData roleData = rolePlayer.Value.Value; - Punpun.Information(this, entity.Ckey + " embarked with role " + roleData.Name); + Log.Information(this, entity.Ckey + " embarked with role " + roleData.Name); SpawnIdentificationItems(entity, roleData); if (roleData.Loadout != null) @@ -181,7 +181,7 @@ private void SpawnIdentificationItems(Entity entity, RoleData role) foreach (IDPermission permission in role.Permissions) { idCard.AddPermission(permission); - Punpun.Information(this, "Added " + permission.Name + " permission to IDCard of " + entity.Ckey); + Log.Information(this, "Added " + permission.Name + " permission to IDCard of " + entity.Ckey); } pda.StartingIDCard = idCardItem; diff --git a/Assets/Scripts/SS3D/Systems/Rounds/ReadyPlayersSystem.cs b/Assets/Scripts/SS3D/Systems/Rounds/ReadyPlayersSystem.cs index 776901be56..3a500477e1 100644 --- a/Assets/Scripts/SS3D/Systems/Rounds/ReadyPlayersSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Rounds/ReadyPlayersSystem.cs @@ -86,11 +86,11 @@ private void SetPlayerReady(Player player, bool ready) switch (ready) { case true when !playerIsReady: - Punpun.Information(this, "player is {ckey} is ready", Logs.ServerOnly, player.Ckey); + Log.Information(this, "player is {ckey} is ready", Logs.ServerOnly, player.Ckey); _readyPlayers.Add(player); break; case false when playerIsReady: - Punpun.Information(this, "player is {cCkey} is not ready", Logs.ServerOnly, player.Ckey); + Log.Information(this, "player is {cCkey} is not ready", Logs.ServerOnly, player.Ckey); _readyPlayers.Remove(player); break; } diff --git a/Assets/Scripts/SS3D/Systems/Rounds/RoundSystem.cs b/Assets/Scripts/SS3D/Systems/Rounds/RoundSystem.cs index be81f7d5e9..9382e712aa 100644 --- a/Assets/Scripts/SS3D/Systems/Rounds/RoundSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Rounds/RoundSystem.cs @@ -41,7 +41,7 @@ protected override async UniTask ProcessChangeRoundState(ChangeRoundStateMessage [Server] protected override async UniTask PrepareRound() { - Punpun.Information(this, "Preparing round", Logs.ServerOnly); + Log.Information(this, "Preparing round", Logs.ServerOnly); RoundState = RoundState.Preparing; @@ -55,7 +55,7 @@ protected override async UniTask PrepareRound() [Server] protected override async UniTask ProcessRoundTick() { - Punpun.Information(this, "Starting {seconds} seconds warmup tick", Logs.ServerOnly, _warmupSeconds); + Log.Information(this, "Starting {seconds} seconds warmup tick", Logs.ServerOnly, _warmupSeconds); RoundSeconds = _warmupSeconds; TickCancellationToken = new CancellationTokenSource(); @@ -70,7 +70,7 @@ protected override async UniTask ProcessRoundTick() } RoundState = RoundState.Ongoing; - Punpun.Information(this, "Starting round tick", Logs.ServerOnly); + Log.Information(this, "Starting round tick", Logs.ServerOnly); while (IsOngoing) { diff --git a/Assets/Scripts/SS3D/Systems/Rounds/RoundSystemBase.cs b/Assets/Scripts/SS3D/Systems/Rounds/RoundSystemBase.cs index 920e915167..3c475ce576 100644 --- a/Assets/Scripts/SS3D/Systems/Rounds/RoundSystemBase.cs +++ b/Assets/Scripts/SS3D/Systems/Rounds/RoundSystemBase.cs @@ -116,11 +116,11 @@ private void AuthorizeChangeRoundState(NetworkConnection conn, ChangeRoundStateM // Checks if player can call a round start if (!permissionSystem.IsAtLeast(userCkey, requiredRole)) { - Punpun.Information(this, "User {ckey} doesn't have {requiredRole} permission", Logs.ServerOnly, userCkey, requiredRole); + Log.Information(this, "User {ckey} doesn't have {requiredRole} permission", Logs.ServerOnly, userCkey, requiredRole); } else { - Punpun.Information(this, "User {ckey} has started the round", Logs.ServerOnly, userCkey); + Log.Information(this, "User {ckey} has started the round", Logs.ServerOnly, userCkey); #pragma warning disable CS4014 ProcessChangeRoundState(m); @@ -182,7 +182,7 @@ private void SyncRoundState(RoundState oldValue, RoundState newValue, bool asSer return; } - Punpun.Information(this, $"Round state updated to: {_roundState}", Logs.Important); + Log.Information(this, _roundState.ToString(), Logs.ServerOnly); RoundStateUpdated roundStateUpdated = new(newValue); roundStateUpdated.Invoke(this); diff --git a/Assets/Scripts/SS3D/Systems/Screens/GameScreens.cs b/Assets/Scripts/SS3D/Systems/Screens/GameScreens.cs index 61975a5537..67bec01d47 100644 --- a/Assets/Scripts/SS3D/Systems/Screens/GameScreens.cs +++ b/Assets/Scripts/SS3D/Systems/Screens/GameScreens.cs @@ -57,7 +57,7 @@ public static bool TryGet(ScreenType screenType, [CanBeNull] out T screen) wh string message = $"No screen of type {screenType} found."; // ReSharper disable once Unity.PerformanceCriticalCodeInvocation - Punpun.Error(typeof(GameScreens), message, Logs.Important, typeof(T).Name); + Log.Error(typeof(GameScreens), message, Logs.Important, typeof(T).Name); screen = null; return false; @@ -69,7 +69,7 @@ public static void SwitchTo(ScreenType screenToSwitchTo) LastScreen = ActiveScreen; ActiveScreen = screenToSwitchTo; - Punpun.Information(typeof(GameScreens), $"Switching game screen to {screenToSwitchTo}"); + Log.Information(typeof(GameScreens), $"Switching game screen to {screenToSwitchTo}"); foreach (KeyValuePair screenEntry in Screens) { diff --git a/Assets/Scripts/SS3D/Systems/Screens/PlayerCameraSystem.cs b/Assets/Scripts/SS3D/Systems/Screens/PlayerCameraSystem.cs index 8b05f62a5c..d2c6eb870a 100644 --- a/Assets/Scripts/SS3D/Systems/Screens/PlayerCameraSystem.cs +++ b/Assets/Scripts/SS3D/Systems/Screens/PlayerCameraSystem.cs @@ -40,7 +40,7 @@ private void HandlePlayerObjectChanged(ref EventContext context, in LocalPlayerO _fovSequence.Append(_camera.DOFieldOfView(75, 0.1f)); _fovSequence.Append(_camera.DOFieldOfView(65, .7F)); - Punpun.Information(this, "setting new camera target {gameObject}", Logs.Generic, target.name); + Log.Information(this, "setting new camera target {gameObject}", Logs.Generic, target.name); _cameraFollow.SetTarget(target); new CameraTargetChanged(GameObject).Invoke(this); diff --git a/Assets/Scripts/SS3D/Systems/Substances/SubstanceContainer.cs b/Assets/Scripts/SS3D/Systems/Substances/SubstanceContainer.cs index 8c21ede787..b04df48f28 100644 --- a/Assets/Scripts/SS3D/Systems/Substances/SubstanceContainer.cs +++ b/Assets/Scripts/SS3D/Systems/Substances/SubstanceContainer.cs @@ -95,7 +95,7 @@ public void Init(float volume, bool locked) { if (_initialised) { - Punpun.Warning(this, "already initialised, returning"); + Log.Warning(this, "already initialised, returning"); return; } _volume = volume; diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/MultiAdjacencyConnector.cs b/Assets/Scripts/SS3D/Systems/Tile/Connections/MultiAdjacencyConnector.cs index 43f0bc0690..41beaef1fb 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/Connections/MultiAdjacencyConnector.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/MultiAdjacencyConnector.cs @@ -132,7 +132,7 @@ private void UpdateMeshAndDirection() if (_filter == null) { - Punpun.Warning(this, "Missing mesh {meshDirectionInfo}", Logs.Generic, info ); + Log.Warning(this, "Missing mesh {meshDirectionInfo}", Logs.Generic, info ); } _filter.mesh = info.Mesh; diff --git a/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedItemObject.cs b/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedItemObject.cs index 49d8174835..825018af7c 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedItemObject.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedItemObject.cs @@ -39,7 +39,7 @@ public static PlacedItemObject Create(Vector3 worldPosition, Quaternion rotation if (InstanceFinder.ServerManager != null && placedObject.GetComponent() != null) { if (placedObject.GetComponent() == null) - Punpun.Warning(Subsystems.Get(), "{placedObject} does not have a Network Component and will not be spawned", + Log.Warning(Subsystems.Get(), "{placedObject} does not have a Network Component and will not be spawned", Logs.Generic, placedObject.NameString); else InstanceFinder.ServerManager.Spawn(placedGameObject); diff --git a/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedTileObject.cs b/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedTileObject.cs index aebc89a351..1ae71aff26 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedTileObject.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/PlacedObjects/PlacedTileObject.cs @@ -39,7 +39,7 @@ public static PlacedTileObject Create(Vector3 worldPosition, Vector2Int origin, if (InstanceFinder.ServerManager != null) { if (placedObject.GetComponent() == null) - Punpun.Information(Subsystems.Get(), "{placedObject} does not have a Network Component and will not be spawned", + Log.Information(Subsystems.Get(), "{placedObject} does not have a Network Component and will not be spawned", Logs.Generic, placedObject.NameString); else InstanceFinder.ServerManager.Spawn(placedGameObject); diff --git a/Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs b/Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs deleted file mode 100644 index 596046d596..0000000000 --- a/Assets/Scripts/SS3D/Systems/Tile/SaveSystem.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System.IO; -using UnityEngine; - -namespace SS3D.Systems.Tile -{ - /// - /// Class for the saving and loading of serialized objects. Uses Generics and can be adapted for any serializable object. - /// - public static class SaveSystem - { - private const string SAVE_EXTENSION = "txt"; - - private static readonly string SaveFolder = Application.streamingAssetsPath + "/Saves/"; - private static bool _isInit; - - public static void Init() - { - if (!_isInit) - { - _isInit = true; - if (!Directory.Exists(SaveFolder)) - { - Directory.CreateDirectory(SaveFolder); - } - } - } - - public static string[] GetSaveFiles() - { - Init(); - return Directory.GetFiles(SaveFolder, $"*.{SAVE_EXTENSION}"); - } - - private static void Save(string fileName, string saveString, bool overwrite) - { - Init(); - string saveFileName = fileName; - if (!overwrite) - { - // Make sure the Save Number is unique so it doesnt overwrite a previous save file - int saveNumber = 1; - while (File.Exists(SaveFolder + saveFileName + "." + SAVE_EXTENSION)) - { - saveNumber++; - saveFileName = fileName + "_" + saveNumber; - } - // saveFileName is unique - } - File.WriteAllText(SaveFolder + saveFileName + "." + SAVE_EXTENSION, saveString); - } - - private static string Load(string fileName) - { - Init(); - if (File.Exists(SaveFolder + fileName + "." + SAVE_EXTENSION)) - { - string saveString = File.ReadAllText(SaveFolder + fileName + "." + SAVE_EXTENSION); - return saveString; - } - - return null; - } - - private static string LoadMostRecentFile() - { - Init(); - DirectoryInfo directoryInfo = new(SaveFolder); - - // Get all save files - FileInfo[] saveFiles = directoryInfo.GetFiles("*." + SAVE_EXTENSION); - - // Cycle through all save files and identify the most recent one - FileInfo mostRecentFile = null; - foreach (FileInfo fileInfo in saveFiles) - { - if (mostRecentFile == null) - { - mostRecentFile = fileInfo; - } - else - { - if (fileInfo.LastWriteTime > mostRecentFile.LastWriteTime) - { - mostRecentFile = fileInfo; - } - } - } - - // If theres a save file, load it, if not return null - if (mostRecentFile != null) - { - string saveString = File.ReadAllText(mostRecentFile.FullName); - return saveString; - } - - return null; - } - - public static void SaveObject(object saveObject) - { - SaveObject("Save", saveObject, true); - } - - public static void SaveObject(string fileName, object saveObject, bool overwrite) - { - Init(); - string json = JsonUtility.ToJson(saveObject); - Save(fileName, json, overwrite); - } - - public static TSaveObject LoadMostRecentObject() - { - Init(); - string saveString = LoadMostRecentFile(); - if (saveString == null) - { - return default; - } - - TSaveObject saveObject = JsonUtility.FromJson(saveString); - return saveObject; - - } - - public static TSaveObject LoadObject(string fileName) - { - Init(); - string saveString = Load(fileName); - if (saveString != null) - { - TSaveObject saveObject = JsonUtility.FromJson(saveString); - return saveObject; - } - else - { - return default; - } - } - } -} diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileChunk.cs b/Assets/Scripts/SS3D/Systems/Tile/TileChunk.cs index f3def35d2a..3d5113f0cc 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileChunk.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileChunk.cs @@ -125,7 +125,7 @@ public void SetTileObject(TileLayer layer, int x, int y, TileObject value) } else { - Punpun.Warning(Subsystems.Get(), "Tried to set tile object outside of chunk boundary"); + Log.Warning(Subsystems.Get(), "Tried to set tile object outside of chunk boundary"); } } @@ -137,7 +137,7 @@ public TileObject GetTileObject(TileLayer layer, int x, int y) } else { - Punpun.Warning(Subsystems.Get(), "Tried to get tile object outside of chunk boundary"); + Log.Warning(Subsystems.Get(), "Tried to get tile object outside of chunk boundary"); return default; } } diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileHelper.cs b/Assets/Scripts/SS3D/Systems/Tile/TileHelper.cs index daa2f1f623..5b8c62de96 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileHelper.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileHelper.cs @@ -10,7 +10,7 @@ namespace SS3D.Systems.Tile /// public static class TileHelper { - private static TileLayer[] tileLayers; + private static TileLayer[] TileLayers; public static Direction GetNextDir(Direction dir) { @@ -31,11 +31,11 @@ public static int GetRotationAngle(Direction dir) public static TileLayer[] GetTileLayers() { - if (tileLayers == null) + if (TileLayers == null) { - tileLayers = (TileLayer[])Enum.GetValues(typeof(TileLayer)); + TileLayers = (TileLayer[])Enum.GetValues(typeof(TileLayer)); } - return tileLayers; + return TileLayers; } public static Tuple ToCardinalVector(Direction direction) diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMap.cs b/Assets/Scripts/SS3D/Systems/Tile/TileMap.cs index 36bf5b20b6..c6f81f9ee2 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileMap.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMap.cs @@ -1,6 +1,8 @@ using FishNet; using FishNet.Object; +using JetBrains.Annotations; using SS3D.Core; +using SS3D.Logging; using System; using System.Collections; using System.Collections.Generic; @@ -288,17 +290,23 @@ public SavedTileMap Save() }; } - public void Load(SavedTileMap saveObject) + public void Load([CanBeNull] SavedTileMap saveObject) { + if (saveObject == null) + { + Log.Warning(this, "The intended save object is null"); + return; + } + Clear(); TileSystem tileSystem = Subsystems.Get(); - foreach (var savedChunk in saveObject.savedChunkList) + foreach (SavedTileChunk savedChunk in saveObject.savedChunkList) { TileChunk chunk = GetOrCreateChunk(savedChunk.originPosition); - foreach (var savedTile in savedChunk.tileObjectSaveObjectArray) + foreach (SavedTileObject savedTile in savedChunk.tileObjectSaveObjectArray) { TileObjectSo toBePlaced = (TileObjectSo)tileSystem.GetAsset(savedTile.placedSaveObject.tileObjectSOName); Vector3 placePosition = chunk.GetWorldPosition(savedTile.x, savedTile.y); @@ -308,7 +316,7 @@ public void Load(SavedTileMap saveObject) } } - foreach (var savedItem in saveObject.savedItemList) + foreach (SavedPlacedItemObject savedItem in saveObject.savedItemList) { ItemObjectSo toBePlaced = (ItemObjectSo)tileSystem.GetAsset(savedItem.itemName); PlaceItemObject(savedItem.worldPosition, savedItem.rotation, toBePlaced); diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs index 283c3a216d..07601ef027 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreator.cs @@ -1,407 +1,473 @@ using Coimbra; -using System.Collections.Generic; -using UnityEngine; -using SS3D.Core; -using UnityEngine.EventSystems; -using System.Linq; -using TMPro; -using FishNet.Object; using FishNet.Connection; -using SS3D.Logging; +using FishNet.Object; +using SS3D.Core; using SS3D.Core.Behaviours; +using SS3D.Logging; using SS3D.Systems.Inputs; -using SS3D.Systems.Tile.TileMapCreator; +using SS3D.Systems.Tile.UI; +using System.Collections.Generic; +using System.Linq; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.InputSystem; using InputSystem = SS3D.Systems.Inputs.InputSystem; -namespace SS3D.Systems.Tile.UI +namespace SS3D.Systems.Tile.TileMapCreator { - /// - /// In-game editor for placing and deleting items/objects in a tilemap. - /// - public class TileMapCreator : NetworkSystem, IPointerEnterHandler, IPointerExitHandler - { - public GameObject _menuRoot; - public GameObject _contentRoot; - public GameObject _slotPrefab; - public TMP_Dropdown _layerPlacementDropdown; - - private bool _enabled = false; - private bool _initalized = false; - private bool _isDeleting = false; - private bool _itemPlacement = false; - private bool _mouseOverUI = false; - - private Vector3 _lastSnappedPosition; - private GenericObjectSo _selectedObject; - - private TileSystem _tileSystem; - private GhostManager _ghostManager; - private Plane _plane; - - private List _objectDatabase; - private Controls.TileCreatorActions _controls; - private InputSystem _inputSystem; - - public bool IsDeleting - { - get => _isDeleting; - set - { - if (_selectedObject != null) - { - _isDeleting = value; - RefreshGhost(); - } - } - } - - [ServerOrClient] - protected override void OnStart() - { - base.OnStart(); - ShowUI(false); - _inputSystem = Subsystems.Get(); - _controls = _inputSystem.Inputs.TileCreator; - _inputSystem.ToggleAction(_controls.ToggleMenu, true); - - _controls.ToggleMenu.performed += HandleToggleMenu; - _controls.Replace.performed += HandleReplace; - _controls.Replace.canceled += HandleReplace; - _controls.Place.performed += HandlePlace; - _controls.Rotate.performed += HandleRotate; - } - private void HandleToggleMenu(InputAction.CallbackContext context) - { - if (_enabled) - { - _inputSystem.ToggleActionMap(_controls, false, new []{_controls.ToggleMenu}); - _inputSystem.ToggleCollisions(_controls, true); - } - else - { - _inputSystem.ToggleActionMap(_controls, true, new []{_controls.ToggleMenu}); - _inputSystem.ToggleCollisions(_controls, false); - } - _enabled = !_enabled; - ShowUI(_enabled); - Initialize(); - } - - private void HandleRotate(InputAction.CallbackContext context) - { - _ghostManager.SetNextRotation(); - RefreshGhost(); - } - - private void HandleReplace(InputAction.CallbackContext context) - { - RefreshGhost(); - } - - private void HandlePlace(InputAction.CallbackContext context) - { - if (_mouseOverUI) - { - return; - } - if (_controls.Replace.phase == InputActionPhase.Performed) - HandleMouseClick(_lastSnappedPosition, true); - else - HandleMouseClick(_lastSnappedPosition, false); - } - - [ServerOrClient] - private void Initialize() - { - if (!_initalized) - { - _tileSystem = Subsystems.Get(); - _ghostManager = GetComponent(); - _plane = new Plane(Vector3.up, 0); - - LoadObjectGrid(new[] { TileLayer.Plenum }, false); - - _initalized = true; - } - } - - [ServerOrClient] - private void Update() - { - if (!_initalized) - return; - - // Clean-up if we are not building - if (!_enabled || _selectedObject == null) - { - _ghostManager.DestroyGhost(); - return; - } - else - { - _ghostManager.CreateGhost(_selectedObject.prefab); - } - - // Check if mouse moved - Vector3 snappedPosition = TileHelper.GetClosestPosition(GetMousePosition()); - if (snappedPosition != _lastSnappedPosition && !_itemPlacement) - { - _ghostManager.SetTargetPosition(snappedPosition); - _lastSnappedPosition = snappedPosition; - RefreshGhost(); - } - - if (_itemPlacement) - { - Vector3 newPosition = GetMousePosition(); - _ghostManager.SetTargetPosition(newPosition); - _lastSnappedPosition = newPosition; - } - - _ghostManager.MoveGhost(); - } - - [ServerOrClient] - private void HandleMouseClick(Vector3 snappedPosition, bool replaceExisting) - { - if (_isDeleting) - { - if (_itemPlacement) - FindAndDeleteItem(snappedPosition); - else - _tileSystem.RpcClearTileObject(_selectedObject.nameString, snappedPosition); - } - else - { - if (_selectedObject == null) - { - return; - } - _tileSystem.RpcPlaceObject(_selectedObject.nameString, snappedPosition, _ghostManager.Dir, replaceExisting); - RefreshGhost(); - } - } - - [ServerOrClient] - private void FindAndDeleteItem(Vector3 worldPosition) - { - Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); - - if (Physics.Raycast(ray, out RaycastHit hitInfo)) - { - PlacedItemObject placedItem = hitInfo.collider.gameObject.GetComponent(); - - if (placedItem != null) - { - _tileSystem.RpcClearItemObject(placedItem.NameString, worldPosition); - } - } - } - - [ServerOrClient] - private Vector3 GetMousePosition() - { - Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); - - if (_plane.Raycast(ray, out float distance)) - { - return ray.GetPoint(distance); - } - - return Vector3.zero; - } - - [ServerOrClient] - private void CheckBuildValidity(Vector3 placePosition, bool replaceExisting) - { - RpcSendCanBuild(_selectedObject.nameString, placePosition, _ghostManager.Dir, replaceExisting, LocalConnection); - } - - [Client] - [ServerRpc(RequireOwnership = false)] - // Ownership not required since a client can request whether it is possible to build - public void RpcSendCanBuild(string tileObjectSoName, Vector3 placePosition, Direction dir, bool replaceExisting, NetworkConnection conn) - { - if (_tileSystem == null) - { - _tileSystem = Subsystems.Get(); - } - - TileObjectSo tileObjectSo = (TileObjectSo) _tileSystem.GetAsset(tileObjectSoName); - - if (tileObjectSo == null) - { - return; - } - - bool canBuild = _tileSystem.CanBuild(tileObjectSo, placePosition, dir, replaceExisting); - RpcReceiveCanBuild(conn, canBuild); - } - - [Client] - [TargetRpc] - private void RpcReceiveCanBuild(NetworkConnection conn, bool canBuild) - { - if (canBuild) - _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Valid); - else - _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Invalid); - } - - [ServerOrClient] - private void ShowUI(bool show) - { - _menuRoot.SetActive(show); - } - - /// - /// Loads a list of tile objects and places them in the UI box grid. - /// - /// - /// - [ServerOrClient] - private void LoadObjectGrid(TileLayer[] allowedLayers, bool isItems) - { - ClearGrid(); - - _objectDatabase = _tileSystem.Loader.GetAllAssets(); - - foreach (var asset in _objectDatabase) - { - if (isItems && asset is not ItemObjectSo) - continue; - - if (!isItems && asset is ItemObjectSo) - continue; - - if (!isItems && asset is TileObjectSo && !allowedLayers.Contains(((TileObjectSo)asset).layer)) - continue; - - GameObject slot = Instantiate(_slotPrefab); - slot.transform.SetParent(_contentRoot.transform); - - TileMapCreatorTab tab = slot.AddComponent(); - - tab.Setup(asset); - } - } - - [ServerOrClient] - private void ClearGrid() - { - for (int i = 0; i < _contentRoot.transform.childCount; i++) - { - _contentRoot.transform.GetChild(i).gameObject.Dispose(true); - } - } - - [ServerOrClient] - private void RefreshGhost() - { - if (_selectedObject == null) - { - return; - } - if (_isDeleting) - { - _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Deleting); - } - else if (_itemPlacement) - { - _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Valid); - } - else if (!_itemPlacement) - { - if (_controls.Replace.phase == InputActionPhase.Performed) - CheckBuildValidity(_lastSnappedPosition, true); - else - CheckBuildValidity(_lastSnappedPosition, false); - } - } - - [ServerOrClient] - public void SetSelectedObject(GenericObjectSo genericObjectSo) - { - if (genericObjectSo is TileObjectSo) - _itemPlacement = false; - else if (genericObjectSo is ItemObjectSo) - _itemPlacement = true; - - _selectedObject = genericObjectSo; - _ghostManager.DestroyGhost(); - _ghostManager.CreateGhost(genericObjectSo.prefab); - RefreshGhost(); - } - - [Server] - public void LoadMap() - { - if (IsServer) - _tileSystem.Load(); - else - Punpun.Information(this, "Cannot load the map on a client"); - } - - [Server] - public void SaveMap() - { - if (IsServer) - _tileSystem.Save(); - else - Punpun.Information(this, "Cannot save the map on a client"); - } - - - /// - /// Change the currently displayed tiles/items when a new layer is selected in the drop down menu. - /// - [ServerOrClient] - public void OnDropDownChange() - { - int index = _layerPlacementDropdown.value; - - switch (index) - { - case 0: - LoadObjectGrid(new[] {TileLayer.Plenum}, false); - break; - case 1: - LoadObjectGrid(new[] { TileLayer.Turf }, false); - break; - case 2: - LoadObjectGrid(new[] { TileLayer.FurnitureBase, TileLayer.FurnitureTop }, false); - break; - case 3: - LoadObjectGrid(new[] { TileLayer.WallMountHigh, TileLayer.WallMountLow }, false); - break; - case 4: - LoadObjectGrid(new[] { TileLayer.Wire, TileLayer.Disposal, TileLayer.Pipes }, false); - break; - case 5: - LoadObjectGrid(new[] { TileLayer.Overlays }, false); - break; - case 6: - LoadObjectGrid(null, true); - break; - default: - ClearGrid(); - break; - } - } - - [ServerOrClient] - public void OnPointerEnter(PointerEventData eventData) - { - _mouseOverUI = true; - Subsystems.Get().ToggleBinding("/scroll/y", false); - } - - [ServerOrClient] - public void OnPointerExit(PointerEventData eventData) - { - _mouseOverUI = false; - Subsystems.Get().ToggleBinding("/scroll/y", true); - } - } + /// + /// In-game editor for placing and deleting items/objects in a tilemap. + /// + public class TileMapCreator : NetworkSystem, IPointerEnterHandler, IPointerExitHandler + { + public GameObject _menuRoot; + public GameObject _contentRoot; + public GameObject _slotPrefab; + public TMP_Dropdown _layerPlacementDropdown; + + private bool _enabled = false; + private bool _initalized = false; + private bool _isDeleting = false; + private bool _itemPlacement = false; + private bool _mouseOverUI = false; + + private Vector3 _lastSnappedPosition; + private GenericObjectSo _selectedObject; + + private TileSystem _tileSystem; + private GhostManager _ghostManager; + private Plane _plane; + + private List _objectDatabase; + private Controls.TileCreatorActions _controls; + private InputSystem _inputSystem; + + public bool IsDeleting + { + get => _isDeleting; + set + { + if (_selectedObject == null) + { + return; + } + + _isDeleting = value; + RefreshGhost(); + } + } + + [ServerOrClient] + protected override void OnStart() + { + base.OnStart(); + ShowUI(false); + _inputSystem = Subsystems.Get(); + _controls = _inputSystem.Inputs.TileCreator; + _inputSystem.ToggleAction(_controls.ToggleMenu, true); + + _controls.ToggleMenu.performed += HandleToggleMenu; + _controls.Replace.performed += HandleReplace; + _controls.Replace.canceled += HandleReplace; + _controls.Place.performed += HandlePlace; + _controls.Rotate.performed += HandleRotate; + } + + private void HandleToggleMenu(InputAction.CallbackContext context) + { + if (_enabled) + { + _inputSystem.ToggleActionMap(_controls, false, new[] + { + _controls.ToggleMenu + }); + + _inputSystem.ToggleCollisions(_controls, true); + } + else + { + _inputSystem.ToggleActionMap(_controls, true, new[] + { + _controls.ToggleMenu + }); + + _inputSystem.ToggleCollisions(_controls, false); + } + + _enabled = !_enabled; + ShowUI(_enabled); + Initialize(); + } + + private void HandleRotate(InputAction.CallbackContext context) + { + _ghostManager.SetNextRotation(); + RefreshGhost(); + } + + private void HandleReplace(InputAction.CallbackContext context) + { + RefreshGhost(); + } + + private void HandlePlace(InputAction.CallbackContext context) + { + if (_mouseOverUI) + { + return; + } + + HandleMouseClick(_lastSnappedPosition, _controls.Replace.phase == InputActionPhase.Performed); + } + + [ServerOrClient] + private void Initialize() + { + if (_initalized) + { + return; + } + + _tileSystem = Subsystems.Get(); + _ghostManager = GetComponent(); + _plane = new Plane(Vector3.up, 0); + + LoadObjectGrid(new[] + { + TileLayer.Plenum + }, false); + + _initalized = true; + } + + [ServerOrClient] + private void Update() + { + if (!_initalized) + { + return; + } + + // Clean-up if we are not building + if (!_enabled || _selectedObject == null) + { + _ghostManager.DestroyGhost(); + + return; + } + + _ghostManager.CreateGhost(_selectedObject.prefab); + + // Check if mouse moved + Vector3 snappedPosition = TileHelper.GetClosestPosition(GetMousePosition()); + + if (snappedPosition != _lastSnappedPosition && !_itemPlacement) + { + _ghostManager.SetTargetPosition(snappedPosition); + _lastSnappedPosition = snappedPosition; + RefreshGhost(); + } + + if (_itemPlacement) + { + Vector3 newPosition = GetMousePosition(); + _ghostManager.SetTargetPosition(newPosition); + _lastSnappedPosition = newPosition; + } + + _ghostManager.MoveGhost(); + } + + [ServerOrClient] + private void HandleMouseClick(Vector3 snappedPosition, bool replaceExisting) + { + if (_isDeleting) + { + if (_itemPlacement) + { + FindAndDeleteItem(snappedPosition); + } + else + { + _tileSystem.RpcClearTileObject(_selectedObject.nameString, snappedPosition); + } + } + else + { + if (_selectedObject == null) + { + return; + } + + _tileSystem.RpcPlaceObject(_selectedObject.nameString, snappedPosition, _ghostManager.Dir, replaceExisting); + RefreshGhost(); + } + } + + [ServerOrClient] + private void FindAndDeleteItem(Vector3 worldPosition) + { + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + + if (Physics.Raycast(ray, out RaycastHit hitInfo)) + { + PlacedItemObject placedItem = hitInfo.collider.gameObject.GetComponent(); + + if (placedItem != null) + { + _tileSystem.RpcClearItemObject(placedItem.NameString, worldPosition); + } + } + } + + [ServerOrClient] + private Vector3 GetMousePosition() + { + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + + if (_plane.Raycast(ray, out float distance)) + { + return ray.GetPoint(distance); + } + + return Vector3.zero; + } + + [ServerOrClient] + private void CheckBuildValidity(Vector3 placePosition, bool replaceExisting) + { + RpcSendCanBuild(_selectedObject.nameString, placePosition, _ghostManager.Dir, replaceExisting, LocalConnection); + } + + // Ownership not required since a client can request whether it is possible to build + [Client] + [ServerRpc(RequireOwnership = false)] + public void RpcSendCanBuild(string tileObjectSoName, Vector3 placePosition, Direction dir, bool replaceExisting, NetworkConnection conn) + { + if (_tileSystem == null) + { + _tileSystem = Subsystems.Get(); + } + + TileObjectSo tileObjectSo = (TileObjectSo)_tileSystem.GetAsset(tileObjectSoName); + + if (tileObjectSo == null) + { + return; + } + + bool canBuild = _tileSystem.CanBuild(tileObjectSo, placePosition, dir, replaceExisting); + RpcReceiveCanBuild(conn, canBuild); + } + + [Client] + [TargetRpc] + private void RpcReceiveCanBuild(NetworkConnection conn, bool canBuild) + { + _ghostManager.ChangeGhostColor(canBuild ? GhostManager.BuildMatMode.Valid : GhostManager.BuildMatMode.Invalid); + } + + [ServerOrClient] + private void ShowUI(bool show) + { + _menuRoot.SetActive(show); + } + + /// + /// Loads a list of tile objects and places them in the UI box grid. + /// + /// + /// + [ServerOrClient] + private void LoadObjectGrid(TileLayer[] allowedLayers, bool isItems) + { + ClearGrid(); + + _objectDatabase = _tileSystem.Loader.Assets; + + foreach (GenericObjectSo asset in _objectDatabase) + { + switch (isItems) + { + case true when asset is not ItemObjectSo: + case false when asset is ItemObjectSo: + case false when asset is TileObjectSo so && !allowedLayers.Contains(so.layer): + continue; + } + + GameObject slot = Instantiate(_slotPrefab, _contentRoot.transform, true); + + TileMapCreatorTab tab = slot.AddComponent(); + + tab.Setup(asset); + } + } + + [ServerOrClient] + private void ClearGrid() + { + for (int i = 0; i < _contentRoot.transform.childCount; i++) + { + _contentRoot.transform.GetChild(i).gameObject.Dispose(true); + } + } + + [ServerOrClient] + private void RefreshGhost() + { + if (_selectedObject == null) + { + return; + } + + if (_isDeleting) + { + _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Deleting); + } + else + { + switch (_itemPlacement) + { + case true: + _ghostManager.ChangeGhostColor(GhostManager.BuildMatMode.Valid); + + break; + case false when _controls.Replace.phase == InputActionPhase.Performed: + CheckBuildValidity(_lastSnappedPosition, true); + + break; + case false: + CheckBuildValidity(_lastSnappedPosition, false); + + break; + } + } + } + + [ServerOrClient] + public void SetSelectedObject(GenericObjectSo genericObjectSo) + { + _itemPlacement = genericObjectSo switch + { + TileObjectSo => false, + ItemObjectSo => true, + _ => _itemPlacement, + }; + + _selectedObject = genericObjectSo; + _ghostManager.DestroyGhost(); + _ghostManager.CreateGhost(genericObjectSo.prefab); + + RefreshGhost(); + } + + [Server] + public void LoadMap() + { + if (IsServer) + { + _tileSystem.Load(); + } + else + { + Log.Information(this, "Cannot load the map on a client"); + } + } + + [Server] + public void SaveMap() + { + if (IsServer) + { + _tileSystem.Save(); + } + else + { + Log.Information(this, "Cannot save the map on a client"); + } + } + + + /// + /// Change the currently displayed tiles/items when a new layer is selected in the drop down menu. + /// + [ServerOrClient] + public void OnDropDownChange() + { + int index = _layerPlacementDropdown.value; + + switch (index) + { + case 0: + LoadObjectGrid(new[] + { + TileLayer.Plenum + }, false); + + break; + case 1: + LoadObjectGrid(new[] + { + TileLayer.Turf + }, false); + + break; + case 2: + LoadObjectGrid(new[] + { + TileLayer.FurnitureBase, + TileLayer.FurnitureTop + }, false); + + break; + case 3: + LoadObjectGrid(new[] + { + TileLayer.WallMountHigh, + TileLayer.WallMountLow + }, false); + + break; + case 4: + LoadObjectGrid(new[] + { + TileLayer.Wire, + TileLayer.Disposal, + TileLayer.Pipes + }, false); + + break; + case 5: + LoadObjectGrid(new[] + { + TileLayer.Overlays + }, false); + + break; + case 6: + LoadObjectGrid(null, true); + + break; + default: + ClearGrid(); + + break; + } + } + + [ServerOrClient] + public void OnPointerEnter(PointerEventData eventData) + { + _mouseOverUI = true; + Subsystems.Get().ToggleBinding("/scroll/y", false); + } + + [ServerOrClient] + public void OnPointerExit(PointerEventData eventData) + { + _mouseOverUI = false; + Subsystems.Get().ToggleBinding("/scroll/y", true); + } + } } \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreatorTab.cs b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreatorTab.cs index c84a1bd68c..bd65f32853 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreatorTab.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/TileMapCreator/TileMapCreatorTab.cs @@ -14,7 +14,7 @@ public class TileMapCreatorTab : MonoBehaviour { private Image _image; private GenericObjectSo _genericObjectSo; - private TileMapCreator _menu; + private TileMapCreator.TileMapCreator _menu; /// @@ -29,7 +29,7 @@ private void LoadTab(Sprite icon, string nameString) transform.localScale = Vector3.one; GetComponentInChildren().text = nameString; - _menu = GetComponentInParent(); + _menu = GetComponentInParent(); GetComponent public class TileSystem : NetworkSystem { - public TileResourceLoader Loader { get; private set; } + public const string SavePath = "/Tilemaps"; + + public const string UnnamedMapName = "UnnamedMap"; + public TileResourceLoader Loader { get; private set; } + private TileMap _currentMap; [ServerOrClient] @@ -27,64 +33,68 @@ protected override void OnStart() } [ServerOrClient] - private IEnumerator WaitForResourcesLoad() + private async UniTask WaitForResourcesLoad() { - while (!Loader.IsInitialized) - { - yield return null; - } + await UniTask.WaitUntil(() => Loader.IsInitialized); Load(); } - [ServerOrClient] - private void Setup() + [Server] + private async void Setup() { - Loader = GetComponent(); - - // Server only loads the map - if (IsServer) - { - CreateMap("Test map"); - StartCoroutine(WaitForResourcesLoad()); - Punpun.Information(this, "All tiles loaded successfully"); - } + Loader = GetComponent(); + + // Server only loads the map + if (!IsServer) + { + return; + } + + CreateMap(UnnamedMapName); + + await WaitForResourcesLoad(); + + Log.Information(this, "All tiles loaded successfully"); } [ServerOrClient] private void CreateMap(string mapName) { - if (_currentMap == null) - { - TileMap map = TileMap.Create(mapName); - map.transform.SetParent(transform); - _currentMap = map; - } + if (_currentMap != null) + { + Log.Warning(this, $"A map is already loaded. {mapName}"); + return; + } + + Log.Information(this, $"Creating new tilemap {mapName}"); + + TileMap map = TileMap.Create(mapName); + map.transform.SetParent(transform); + _currentMap = map; } [ServerOrClient] - public GenericObjectSo GetAsset(string assetName) - { - return Loader.GetAsset(assetName); - } + public GenericObjectSo GetAsset(string assetName) => Loader.GetAsset(assetName); [Server] private bool PlaceObject(GenericObjectSo genericObjectSo, Vector3 placePosition, Direction dir, bool replaceExisting) { - if (genericObjectSo is TileObjectSo) - { - return _currentMap.PlaceTileObject((TileObjectSo)genericObjectSo, placePosition, dir, false, replaceExisting); - } - else if (genericObjectSo is ItemObjectSo) - { - _currentMap.PlaceItemObject(placePosition, Quaternion.Euler(0, TileHelper.GetRotationAngle(dir), 0), (ItemObjectSo)genericObjectSo); - } - - return true; + switch (genericObjectSo) + { + case TileObjectSo so: + return _currentMap.PlaceTileObject(so, placePosition, dir, false, replaceExisting); + case ItemObjectSo so: + _currentMap.PlaceItemObject(placePosition, Quaternion.Euler(0, TileHelper.GetRotationAngle(dir), 0), so); + break; + } + + return true; } + // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. [Client] - [ServerRpc(RequireOwnership = false)] // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. + [ServerRpc(RequireOwnership = false)] public void RpcPlaceObject(string genericObjectSoName, Vector3 placePosition, Direction dir, bool replaceExisting) { GenericObjectSo tileObjectSo = GetAsset(genericObjectSoName); @@ -97,16 +107,18 @@ private void ClearTileObject(TileObjectSo tileObjectSo, Vector3 placePosition) _currentMap.ClearTileObject(placePosition, tileObjectSo.layer); } + // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. [Client] - [ServerRpc(RequireOwnership = false)] // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. + [ServerRpc(RequireOwnership = false)] public void RpcClearTileObject(string tileObjectSoName, Vector3 placePosition) { GenericObjectSo tileObjectSo = GetAsset(tileObjectSoName); _currentMap.ClearTileObject(placePosition, ((TileObjectSo)tileObjectSo).layer); } + // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. [Client] - [ServerRpc(RequireOwnership = false)] // No ownership required since clients are allowed to place/remove objects. Should be removed when construction is in. + [ServerRpc(RequireOwnership = false)] public void RpcClearItemObject(string itemObjectSoName, Vector3 placePosition) { ItemObjectSo itemObjectSo = (ItemObjectSo)GetAsset(itemObjectSoName); @@ -122,14 +134,20 @@ public bool CanBuild(TileObjectSo tileObjectSo, Vector3 placePosition, Direction [Server] public void Save() { - var mapSave = _currentMap.Save(); - SaveSystem.SaveObject(mapSave); + Log.Information(this, $"Saving tilemap {_currentMap.name}"); + + SavedTileMap mapSave = _currentMap.Save(); + + SaveSystem.SaveObject(SavePath + "/" + _currentMap.name, mapSave); } [Server] public void Load() { - var mapSave = SaveSystem.LoadMostRecentObject(); + Log.Information(this, "Loading most recent tilemap"); + + SavedTileMap mapSave = SaveSystem.LoadMostRecentObject(SavePath); + _currentMap.Load(mapSave); } @@ -138,7 +156,7 @@ public void ResetSave() { _currentMap.Clear(); Save(); - Punpun.Warning(this, "Tilemap resetted. Existing savefile has been wiped"); + Log.Warning(this, "Tilemap resetted. Existing savefile has been wiped"); } } } \ No newline at end of file diff --git a/Assets/Scripts/Tests/Edit Mode/LogTests.cs b/Assets/Scripts/Tests/Edit Mode/LogTests.cs index 6e6bbd1de6..a205b572b5 100644 --- a/Assets/Scripts/Tests/Edit Mode/LogTests.cs +++ b/Assets/Scripts/Tests/Edit Mode/LogTests.cs @@ -65,7 +65,7 @@ public void SimpleDictionnaryDisplayAsExpectedInUnity() _lastUnityConsoleMessage = ""; string color = LogColors.GetLogColor(Logs.Generic); - Punpun.Information(this, "{simpleDictionary}", Logs.Generic, _simpleDictionaryToDisplay); + SS3D.Logging.Log.Information(this, "{simpleDictionary}", Logs.Generic, _simpleDictionaryToDisplay); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] {{\"one\":1,\"two\":2,\"three\":3}}"); _lastUnityConsoleMessage = ""; @@ -83,7 +83,7 @@ public void SimpleStructureDisplayAsExpectedInUnity() _lastUnityConsoleMessage = ""; string color = LogColors.GetLogColor(Logs.Generic); - Punpun.Information(this, "{@simpleStructure}", Logs.Generic, _simpleStructureToDisplay); + SS3D.Logging.Log.Information(this, "{@simpleStructure}", Logs.Generic, _simpleStructureToDisplay); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] {{\"Name\":\"simple\",\"Count\":3,\"IsCool\":true,\"$type\":\"SimpleStructure\"}}"); _lastUnityConsoleMessage = ""; @@ -98,7 +98,7 @@ public void ListOfFloatDisplayAsExpectedInUnity() _lastUnityConsoleMessage = ""; string color = LogColors.GetLogColor(Logs.Generic); - Punpun.Information(this, "{list}", Logs.Generic, _floatListToDisplay); + SS3D.Logging.Log.Information(this, "{list}", Logs.Generic, _floatListToDisplay); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] [0.4,0.222,4.7E-05,78789]"); _lastUnityConsoleMessage = ""; @@ -113,43 +113,43 @@ public void MessagWithNoAddedPropertyDisplayAsExpectedInUnity() _lastUnityConsoleMessage = ""; string color = LogColors.GetLogColor(Logs.Generic); - Punpun.Information(this, "hello there !", Logs.Generic); + SS3D.Logging.Log.Information(this, "hello there !", Logs.Generic); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.External); - Punpun.Information(this, "hello there !", Logs.External); + SS3D.Logging.Log.Information(this, "hello there !", Logs.External); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.ServerOnly); - Punpun.Information(this, "hello there !", Logs.ServerOnly); + SS3D.Logging.Log.Information(this, "hello there !", Logs.ServerOnly); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.ClientOnly); - Punpun.Information(this, "hello there !", Logs.ClientOnly); + SS3D.Logging.Log.Information(this, "hello there !", Logs.ClientOnly); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.None); - Punpun.Information(this, "hello there !", Logs.None); + SS3D.Logging.Log.Information(this, "hello there !", Logs.None); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.Important); - Punpun.Information(this, "hello there !", Logs.Important); + SS3D.Logging.Log.Information(this, "hello there !", Logs.Important); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; color = LogColors.GetLogColor(Logs.Physics); - Punpun.Information(this, "hello there !", Logs.Physics); + SS3D.Logging.Log.Information(this, "hello there !", Logs.Physics); while (_lastUnityConsoleMessage == "") continue; Assert.IsTrue(_lastUnityConsoleMessage == $"[LogTests] hello there !"); _lastUnityConsoleMessage = ""; diff --git a/Assets/Settings/LogSettings.asset b/Assets/Settings/LogSettings.asset index 9740a8100e..354a09abc3 100644 --- a/Assets/Settings/LogSettings.asset +++ b/Assets/Settings/LogSettings.asset @@ -12,6 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ff3f0ffef787c464d8f721719a55afa8, type: 3} m_Name: LogSettings m_EditorClassIdentifier: + _preload: 1 + _type: 2 SS3DNameSpaces: - _name: SS3D.Attributes _level: 0 diff --git a/Builds/Game/Data/Tilemaps/Save.json b/Builds/Game/Data/Tilemaps/Save.json new file mode 100644 index 0000000000..e3c314287c --- /dev/null +++ b/Builds/Game/Data/Tilemaps/Save.json @@ -0,0 +1 @@ +{"mapName":"Test map","savedChunkList":[{"chunkKey":{"x":0,"y":0},"originPosition":{"x":0.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":0},"dir":0}},{"layer":0,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":1},"dir":0}},{"layer":0,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":2},"dir":0}},{"layer":0,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":3},"dir":0}},{"layer":0,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":0},"dir":0}},{"layer":0,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":1},"dir":0}},{"layer":0,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":2},"dir":0}},{"layer":0,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":3},"dir":0}},{"layer":0,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":0},"dir":0}},{"layer":0,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":1},"dir":0}},{"layer":0,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":2},"dir":0}},{"layer":0,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":3},"dir":0}},{"layer":0,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":0},"dir":0}},{"layer":0,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":1},"dir":0}},{"layer":0,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":2},"dir":0}},{"layer":0,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":3},"dir":0}},{"layer":0,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":0},"dir":0}},{"layer":0,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":1},"dir":0}},{"layer":0,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":2},"dir":0}},{"layer":0,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":3},"dir":0}},{"layer":0,"x":4,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":4},"dir":0}},{"layer":0,"x":4,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":5},"dir":0}},{"layer":0,"x":4,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":6},"dir":0}},{"layer":0,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":0},"dir":0}},{"layer":0,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":1},"dir":0}},{"layer":0,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":2},"dir":0}},{"layer":0,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":3},"dir":0}},{"layer":0,"x":5,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":4},"dir":0}},{"layer":0,"x":5,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":5},"dir":0}},{"layer":0,"x":5,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":6},"dir":0}},{"layer":0,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":0},"dir":0}},{"layer":0,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":1},"dir":0}},{"layer":0,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":2},"dir":0}},{"layer":0,"x":6,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":3},"dir":0}},{"layer":0,"x":6,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":4},"dir":0}},{"layer":0,"x":6,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":5},"dir":0}},{"layer":0,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":6},"dir":0}},{"layer":0,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":0},"dir":0}},{"layer":0,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":1},"dir":0}},{"layer":0,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":2},"dir":0}},{"layer":0,"x":7,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":3},"dir":0}},{"layer":0,"x":7,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":4},"dir":0}},{"layer":0,"x":7,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":5},"dir":0}},{"layer":0,"x":7,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":6},"dir":0}},{"layer":0,"x":8,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":0},"dir":0}},{"layer":0,"x":8,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":1},"dir":0}},{"layer":0,"x":8,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":2},"dir":0}},{"layer":0,"x":8,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":3},"dir":0}},{"layer":0,"x":8,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":4},"dir":0}},{"layer":0,"x":8,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":5},"dir":0}},{"layer":0,"x":8,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":6},"dir":0}},{"layer":0,"x":9,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":0},"dir":0}},{"layer":0,"x":9,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":1},"dir":0}},{"layer":0,"x":9,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":2},"dir":0}},{"layer":0,"x":9,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":3},"dir":0}},{"layer":0,"x":9,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":4},"dir":0}},{"layer":0,"x":9,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":5},"dir":0}},{"layer":0,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":6},"dir":0}},{"layer":0,"x":10,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":0},"dir":0}},{"layer":0,"x":10,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":1},"dir":0}},{"layer":0,"x":10,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":2},"dir":0}},{"layer":0,"x":10,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":3},"dir":0}},{"layer":0,"x":10,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":4},"dir":0}},{"layer":0,"x":10,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":5},"dir":0}},{"layer":0,"x":10,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":6},"dir":0}},{"layer":0,"x":11,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":0},"dir":0}},{"layer":0,"x":11,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":1},"dir":0}},{"layer":0,"x":11,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":2},"dir":0}},{"layer":0,"x":11,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":3},"dir":0}},{"layer":0,"x":11,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":4},"dir":0}},{"layer":0,"x":11,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":5},"dir":0}},{"layer":0,"x":11,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":6},"dir":0}},{"layer":0,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":0},"dir":0}},{"layer":0,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":1},"dir":0}},{"layer":0,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":2},"dir":0}},{"layer":0,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":3},"dir":0}},{"layer":0,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":0},"dir":0}},{"layer":0,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":1},"dir":0}},{"layer":0,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":2},"dir":0}},{"layer":0,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":3},"dir":0}},{"layer":0,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":0},"dir":0}},{"layer":0,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":1},"dir":0}},{"layer":0,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":2},"dir":0}},{"layer":0,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":3},"dir":0}},{"layer":0,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":0},"dir":0}},{"layer":0,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":1},"dir":0}},{"layer":0,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":2},"dir":0}},{"layer":0,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":3},"dir":0}},{"layer":1,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":0},"dir":0}},{"layer":1,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":1},"dir":0}},{"layer":1,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":2},"dir":0}},{"layer":1,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":3},"dir":0}},{"layer":1,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":0},"dir":0}},{"layer":1,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":1},"dir":0}},{"layer":1,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":2},"dir":0}},{"layer":1,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":3},"dir":0}},{"layer":1,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":0},"dir":0}},{"layer":1,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":1},"dir":0}},{"layer":1,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":2},"dir":0}},{"layer":1,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":3},"dir":0}},{"layer":1,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":0},"dir":0}},{"layer":1,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":1},"dir":0}},{"layer":1,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":2},"dir":0}},{"layer":1,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":3},"dir":0}},{"layer":1,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":0},"dir":0}},{"layer":1,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":1},"dir":0}},{"layer":1,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":2},"dir":0}},{"layer":1,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":3},"dir":0}},{"layer":1,"x":4,"y":4,"placedSaveObject":{"tileObjectSOName":"airlock_civilian","origin":{"x":4,"y":4},"dir":2}},{"layer":1,"x":4,"y":5,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":5},"dir":0}},{"layer":1,"x":4,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":6},"dir":0}},{"layer":1,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":0},"dir":0}},{"layer":1,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":1},"dir":0}},{"layer":1,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":2},"dir":0}},{"layer":1,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":3},"dir":0}},{"layer":1,"x":5,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":4},"dir":0}},{"layer":1,"x":5,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":5},"dir":0}},{"layer":1,"x":5,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":6},"dir":0}},{"layer":1,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":0},"dir":0}},{"layer":1,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":1},"dir":0}},{"layer":1,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":2},"dir":0}},{"layer":1,"x":6,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":3},"dir":0}},{"layer":1,"x":6,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":4},"dir":0}},{"layer":1,"x":6,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":5},"dir":0}},{"layer":1,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":6},"dir":0}},{"layer":1,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":0},"dir":0}},{"layer":1,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":1},"dir":0}},{"layer":1,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":2},"dir":0}},{"layer":1,"x":7,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":3},"dir":0}},{"layer":1,"x":7,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":4},"dir":0}},{"layer":1,"x":7,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":5},"dir":0}},{"layer":1,"x":7,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":7,"y":6},"dir":0}},{"layer":1,"x":8,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":0},"dir":0}},{"layer":1,"x":8,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":1},"dir":0}},{"layer":1,"x":8,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":2},"dir":0}},{"layer":1,"x":8,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":3},"dir":0}},{"layer":1,"x":8,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":4},"dir":0}},{"layer":1,"x":8,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":5},"dir":0}},{"layer":1,"x":8,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":8,"y":6},"dir":0}},{"layer":1,"x":9,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":0},"dir":0}},{"layer":1,"x":9,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":1},"dir":0}},{"layer":1,"x":9,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":2},"dir":0}},{"layer":1,"x":9,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":3},"dir":0}},{"layer":1,"x":9,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":4},"dir":0}},{"layer":1,"x":9,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":5},"dir":0}},{"layer":1,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":6},"dir":0}},{"layer":1,"x":10,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":0},"dir":0}},{"layer":1,"x":10,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":1},"dir":0}},{"layer":1,"x":10,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":2},"dir":0}},{"layer":1,"x":10,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":3},"dir":0}},{"layer":1,"x":10,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":4},"dir":0}},{"layer":1,"x":10,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":5},"dir":0}},{"layer":1,"x":10,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":6},"dir":0}},{"layer":1,"x":11,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":0},"dir":0}},{"layer":1,"x":11,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":1},"dir":0}},{"layer":1,"x":11,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":2},"dir":0}},{"layer":1,"x":11,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":3},"dir":0}},{"layer":1,"x":11,"y":4,"placedSaveObject":{"tileObjectSOName":"airlock_civilian","origin":{"x":11,"y":4},"dir":2}},{"layer":1,"x":11,"y":5,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":5},"dir":0}},{"layer":1,"x":11,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":6},"dir":0}},{"layer":1,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":0},"dir":0}},{"layer":1,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":1},"dir":0}},{"layer":1,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":2},"dir":0}},{"layer":1,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":3},"dir":0}},{"layer":1,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":0},"dir":0}},{"layer":1,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":1},"dir":0}},{"layer":1,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":2},"dir":0}},{"layer":1,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":3},"dir":0}},{"layer":1,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":0},"dir":0}},{"layer":1,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":1},"dir":0}},{"layer":1,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":2},"dir":0}},{"layer":1,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":3},"dir":0}},{"layer":1,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":0},"dir":0}},{"layer":1,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":1},"dir":0}},{"layer":1,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":2},"dir":0}},{"layer":1,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":3},"dir":0}},{"layer":5,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":3,"y":3},"dir":4}},{"layer":5,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"light_bulb_fixture","origin":{"x":6,"y":6},"dir":4}},{"layer":5,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"light_bulb_fixture","origin":{"x":9,"y":6},"dir":4}},{"layer":5,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":12,"y":3},"dir":4}},{"layer":6,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":2,"y":3},"dir":4}},{"layer":6,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"apc","origin":{"x":6,"y":6},"dir":4}},{"layer":6,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"firealarm","origin":{"x":9,"y":6},"dir":4}},{"layer":6,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":13,"y":3},"dir":4}}]},{"chunkKey":{"x":0,"y":-1},"originPosition":{"x":0.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":15},"dir":4}},{"layer":0,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":15},"dir":4}},{"layer":0,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":15},"dir":4}},{"layer":0,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":15},"dir":4}},{"layer":0,"x":4,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":9},"dir":4}},{"layer":0,"x":4,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":10},"dir":4}},{"layer":0,"x":4,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":11},"dir":4}},{"layer":0,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":12},"dir":4}},{"layer":0,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":13},"dir":4}},{"layer":0,"x":4,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":14},"dir":4}},{"layer":0,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":15},"dir":4}},{"layer":0,"x":5,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":9},"dir":4}},{"layer":0,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":10},"dir":4}},{"layer":0,"x":5,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":11},"dir":0}},{"layer":0,"x":5,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":12},"dir":0}},{"layer":0,"x":5,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":13},"dir":0}},{"layer":0,"x":5,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":14},"dir":0}},{"layer":0,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":15},"dir":0}},{"layer":0,"x":6,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":9},"dir":4}},{"layer":0,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":10},"dir":4}},{"layer":0,"x":6,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":11},"dir":0}},{"layer":0,"x":6,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":12},"dir":0}},{"layer":0,"x":6,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":13},"dir":0}},{"layer":0,"x":6,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":14},"dir":0}},{"layer":0,"x":6,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":15},"dir":0}},{"layer":0,"x":7,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":9},"dir":4}},{"layer":0,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":10},"dir":4}},{"layer":0,"x":7,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":11},"dir":0}},{"layer":0,"x":7,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":12},"dir":0}},{"layer":0,"x":7,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":13},"dir":0}},{"layer":0,"x":7,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":14},"dir":0}},{"layer":0,"x":7,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":15},"dir":0}},{"layer":0,"x":8,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":9},"dir":4}},{"layer":0,"x":8,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":10},"dir":4}},{"layer":0,"x":8,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":11},"dir":0}},{"layer":0,"x":8,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":12},"dir":0}},{"layer":0,"x":8,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":13},"dir":0}},{"layer":0,"x":8,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":14},"dir":0}},{"layer":0,"x":8,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":15},"dir":0}},{"layer":0,"x":9,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":9},"dir":4}},{"layer":0,"x":9,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":10},"dir":4}},{"layer":0,"x":9,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":11},"dir":0}},{"layer":0,"x":9,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":12},"dir":0}},{"layer":0,"x":9,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":13},"dir":0}},{"layer":0,"x":9,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":14},"dir":0}},{"layer":0,"x":9,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":15},"dir":0}},{"layer":0,"x":10,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":9},"dir":4}},{"layer":0,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":10},"dir":4}},{"layer":0,"x":10,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":11},"dir":0}},{"layer":0,"x":10,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":12},"dir":0}},{"layer":0,"x":10,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":13},"dir":0}},{"layer":0,"x":10,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":14},"dir":0}},{"layer":0,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":15},"dir":0}},{"layer":0,"x":11,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":9},"dir":4}},{"layer":0,"x":11,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":10},"dir":4}},{"layer":0,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":11},"dir":4}},{"layer":0,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":12},"dir":4}},{"layer":0,"x":11,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":13},"dir":4}},{"layer":0,"x":11,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":14},"dir":4}},{"layer":0,"x":11,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":15},"dir":4}},{"layer":0,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":15},"dir":4}},{"layer":0,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":15},"dir":4}},{"layer":0,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":15},"dir":4}},{"layer":0,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":15},"dir":4}},{"layer":1,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":15},"dir":4}},{"layer":1,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":15},"dir":4}},{"layer":1,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":15},"dir":4}},{"layer":1,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":15},"dir":4}},{"layer":1,"x":4,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":9},"dir":4}},{"layer":1,"x":4,"y":10,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":10},"dir":4}},{"layer":1,"x":4,"y":11,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":11},"dir":4}},{"layer":1,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":12},"dir":4}},{"layer":1,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":13},"dir":4}},{"layer":1,"x":4,"y":14,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":14},"dir":4}},{"layer":1,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":15},"dir":4}},{"layer":1,"x":5,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":9},"dir":4}},{"layer":1,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":10},"dir":0}},{"layer":1,"x":5,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":11},"dir":0}},{"layer":1,"x":5,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":12},"dir":0}},{"layer":1,"x":5,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":13},"dir":0}},{"layer":1,"x":5,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":14},"dir":0}},{"layer":1,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":15},"dir":4}},{"layer":1,"x":6,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":9},"dir":4}},{"layer":1,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":10},"dir":0}},{"layer":1,"x":6,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":11},"dir":4}},{"layer":1,"x":6,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":12},"dir":4}},{"layer":1,"x":6,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":13},"dir":4}},{"layer":1,"x":6,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":14},"dir":0}},{"layer":1,"x":6,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":15},"dir":4}},{"layer":1,"x":7,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":7,"y":9},"dir":4}},{"layer":1,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":10},"dir":0}},{"layer":1,"x":7,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":11},"dir":4}},{"layer":1,"x":7,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":12},"dir":4}},{"layer":1,"x":7,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":13},"dir":0}},{"layer":1,"x":7,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":14},"dir":0}},{"layer":1,"x":7,"y":15,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":15},"dir":0}},{"layer":1,"x":8,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":8,"y":9},"dir":4}},{"layer":1,"x":8,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":10},"dir":0}},{"layer":1,"x":8,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":11},"dir":4}},{"layer":1,"x":8,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":12},"dir":4}},{"layer":1,"x":8,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":13},"dir":0}},{"layer":1,"x":8,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":14},"dir":0}},{"layer":1,"x":8,"y":15,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":15},"dir":0}},{"layer":1,"x":9,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":9},"dir":4}},{"layer":1,"x":9,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":10},"dir":0}},{"layer":1,"x":9,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":11},"dir":4}},{"layer":1,"x":9,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":12},"dir":4}},{"layer":1,"x":9,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":13},"dir":4}},{"layer":1,"x":9,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":14},"dir":0}},{"layer":1,"x":9,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":15},"dir":4}},{"layer":1,"x":10,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":9},"dir":4}},{"layer":1,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":10},"dir":0}},{"layer":1,"x":10,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":11},"dir":0}},{"layer":1,"x":10,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":12},"dir":0}},{"layer":1,"x":10,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":13},"dir":0}},{"layer":1,"x":10,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":14},"dir":0}},{"layer":1,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":15},"dir":4}},{"layer":1,"x":11,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":9},"dir":4}},{"layer":1,"x":11,"y":10,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":10},"dir":4}},{"layer":1,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":11},"dir":4}},{"layer":1,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":12},"dir":4}},{"layer":1,"x":11,"y":13,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":13},"dir":4}},{"layer":1,"x":11,"y":14,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":14},"dir":4}},{"layer":1,"x":11,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":15},"dir":4}},{"layer":1,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":15},"dir":4}},{"layer":1,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":15},"dir":4}},{"layer":1,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":15},"dir":4}},{"layer":1,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":15},"dir":4}},{"layer":5,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":4,"y":12},"dir":2}},{"layer":5,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":5,"y":15},"dir":0}},{"layer":5,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":10,"y":15},"dir":0}},{"layer":5,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":11,"y":12},"dir":6}},{"layer":6,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"apc","origin":{"x":4,"y":13},"dir":2}},{"layer":6,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"light_switch","origin":{"x":5,"y":15},"dir":4}},{"layer":6,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"firealarm","origin":{"x":10,"y":15},"dir":4}},{"layer":6,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":11,"y":11},"dir":6}},{"layer":7,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"locker","origin":{"x":5,"y":10},"dir":0}},{"layer":7,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"locker","origin":{"x":6,"y":10},"dir":0}},{"layer":7,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"locker_security","origin":{"x":7,"y":10},"dir":0}},{"layer":7,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"nuke_cart","origin":{"x":10,"y":10},"dir":4}}]},{"chunkKey":{"x":-1,"y":-1},"originPosition":{"x":-16.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":15},"dir":4}},{"layer":0,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":15},"dir":4}},{"layer":0,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":15},"dir":4}},{"layer":0,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":15},"dir":4}},{"layer":1,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":15},"dir":4}},{"layer":1,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":15},"dir":4}},{"layer":1,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":15},"dir":4}},{"layer":1,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":15},"dir":4}},{"layer":5,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":13,"y":15},"dir":0}}]},{"chunkKey":{"x":-1,"y":0},"originPosition":{"x":-16.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":0},"dir":4}},{"layer":0,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":1},"dir":4}},{"layer":0,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":2},"dir":4}},{"layer":0,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":3},"dir":4}},{"layer":0,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":0},"dir":4}},{"layer":0,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":1},"dir":4}},{"layer":0,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":2},"dir":4}},{"layer":0,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":3},"dir":4}},{"layer":0,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":0},"dir":4}},{"layer":0,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":1},"dir":4}},{"layer":0,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":2},"dir":4}},{"layer":0,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":3},"dir":4}},{"layer":0,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":0},"dir":4}},{"layer":0,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":1},"dir":4}},{"layer":0,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":2},"dir":4}},{"layer":0,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":3},"dir":4}},{"layer":1,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":0},"dir":0}},{"layer":1,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":1},"dir":0}},{"layer":1,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":2},"dir":0}},{"layer":1,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":3},"dir":4}},{"layer":1,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":0},"dir":0}},{"layer":1,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":1},"dir":0}},{"layer":1,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":2},"dir":0}},{"layer":1,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":3},"dir":4}},{"layer":1,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":0},"dir":0}},{"layer":1,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":1},"dir":0}},{"layer":1,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":2},"dir":0}},{"layer":1,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":3},"dir":4}},{"layer":1,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":0},"dir":0}},{"layer":1,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":1},"dir":0}},{"layer":1,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":2},"dir":0}},{"layer":1,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":3},"dir":4}}]},{"chunkKey":{"x":1,"y":0},"originPosition":{"x":16.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":0},"dir":4}},{"layer":0,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":1},"dir":4}},{"layer":0,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":2},"dir":4}},{"layer":0,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":3},"dir":4}},{"layer":0,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":0},"dir":4}},{"layer":0,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":1},"dir":4}},{"layer":0,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":2},"dir":4}},{"layer":0,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":3},"dir":4}},{"layer":0,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":0},"dir":4}},{"layer":0,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":1},"dir":4}},{"layer":0,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":2},"dir":4}},{"layer":0,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":3},"dir":4}},{"layer":0,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":0},"dir":4}},{"layer":0,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":1},"dir":4}},{"layer":0,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":2},"dir":4}},{"layer":0,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":3},"dir":4}},{"layer":0,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":0},"dir":4}},{"layer":0,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":1},"dir":4}},{"layer":0,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":2},"dir":4}},{"layer":0,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":3},"dir":4}},{"layer":0,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":0},"dir":4}},{"layer":0,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":1},"dir":4}},{"layer":0,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":2},"dir":4}},{"layer":0,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":3},"dir":4}},{"layer":0,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":0},"dir":4}},{"layer":0,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":1},"dir":4}},{"layer":0,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":2},"dir":4}},{"layer":0,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":0},"dir":4}},{"layer":0,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":1},"dir":4}},{"layer":0,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":2},"dir":4}},{"layer":1,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":0},"dir":0}},{"layer":1,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":1},"dir":0}},{"layer":1,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":2},"dir":0}},{"layer":1,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":3},"dir":4}},{"layer":1,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":0},"dir":0}},{"layer":1,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":1},"dir":0}},{"layer":1,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":2},"dir":0}},{"layer":1,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":3},"dir":4}},{"layer":1,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":0},"dir":0}},{"layer":1,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":1},"dir":0}},{"layer":1,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":2},"dir":0}},{"layer":1,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":3},"dir":4}},{"layer":1,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":0},"dir":0}},{"layer":1,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":1},"dir":0}},{"layer":1,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":2},"dir":0}},{"layer":1,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":3},"dir":4}},{"layer":1,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":0},"dir":0}},{"layer":1,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":1},"dir":0}},{"layer":1,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":2},"dir":0}},{"layer":1,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":3},"dir":4}},{"layer":1,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":0},"dir":0}},{"layer":1,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":1},"dir":0}},{"layer":1,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":2},"dir":0}},{"layer":1,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":3},"dir":4}}]},{"chunkKey":{"x":1,"y":-1},"originPosition":{"x":16.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":15},"dir":4}},{"layer":0,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":15},"dir":4}},{"layer":0,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":15},"dir":4}},{"layer":0,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":15},"dir":4}},{"layer":0,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":15},"dir":4}},{"layer":0,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":15},"dir":4}},{"layer":1,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":15},"dir":4}},{"layer":1,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":15},"dir":4}},{"layer":1,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":15},"dir":4}},{"layer":1,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":15},"dir":4}},{"layer":1,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":15},"dir":4}},{"layer":1,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":15},"dir":4}},{"layer":5,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":2,"y":15},"dir":0}}]},{"chunkKey":{"x":2,"y":0},"originPosition":{"x":32.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[]},{"chunkKey":{"x":1,"y":-2},"originPosition":{"x":16.0,"y":0.0,"z":-32.0},"tileObjectSaveObjectArray":[]},{"chunkKey":{"x":0,"y":-2},"originPosition":{"x":0.0,"y":0.0,"z":-32.0},"tileObjectSaveObjectArray":[]}],"savedItemList":[{"itemName":"borg_engineering","worldPosition":{"x":13.868721961975098,"y":0.0,"z":0.13913965225219727},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"idcard","worldPosition":{"x":10.058170318603516,"y":0.0,"z":-1.9040601253509522},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"pda","worldPosition":{"x":9.76523494720459,"y":0.0,"z":-1.8928546905517579},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"security_idcard","worldPosition":{"x":10.043039321899414,"y":0.0,"z":-2.2987756729125978},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"security_pda","worldPosition":{"x":9.791738510131836,"y":0.0,"z":-2.269656181335449},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"bikehorn","worldPosition":{"x":10.198518753051758,"y":0.0,"z":-2.696934223175049},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"nuke_disk","worldPosition":{"x":9.787110328674317,"y":0.0,"z":-2.6697144508361818},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}}]} \ No newline at end of file diff --git a/Builds/Game/Data/Tilemaps/UnnamedMap.json b/Builds/Game/Data/Tilemaps/UnnamedMap.json new file mode 100644 index 0000000000..cdc04c6453 --- /dev/null +++ b/Builds/Game/Data/Tilemaps/UnnamedMap.json @@ -0,0 +1 @@ +{"mapName":"UnnamedMap","savedChunkList":[{"chunkKey":{"x":0,"y":0},"originPosition":{"x":0.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":0},"dir":0}},{"layer":0,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":1},"dir":0}},{"layer":0,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":2},"dir":0}},{"layer":0,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":3},"dir":0}},{"layer":0,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":0},"dir":0}},{"layer":0,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":1},"dir":0}},{"layer":0,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":2},"dir":0}},{"layer":0,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":3},"dir":0}},{"layer":0,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":0},"dir":0}},{"layer":0,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":1},"dir":0}},{"layer":0,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":2},"dir":0}},{"layer":0,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":3},"dir":0}},{"layer":0,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":0},"dir":0}},{"layer":0,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":1},"dir":0}},{"layer":0,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":2},"dir":0}},{"layer":0,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":3},"dir":0}},{"layer":0,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":0},"dir":0}},{"layer":0,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":1},"dir":0}},{"layer":0,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":2},"dir":0}},{"layer":0,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":3},"dir":0}},{"layer":0,"x":4,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":4},"dir":0}},{"layer":0,"x":4,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":5},"dir":0}},{"layer":0,"x":4,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":6},"dir":0}},{"layer":0,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":0},"dir":0}},{"layer":0,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":1},"dir":0}},{"layer":0,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":2},"dir":0}},{"layer":0,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":3},"dir":0}},{"layer":0,"x":5,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":4},"dir":0}},{"layer":0,"x":5,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":5},"dir":0}},{"layer":0,"x":5,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":6},"dir":0}},{"layer":0,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":0},"dir":0}},{"layer":0,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":1},"dir":0}},{"layer":0,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":2},"dir":0}},{"layer":0,"x":6,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":3},"dir":0}},{"layer":0,"x":6,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":4},"dir":0}},{"layer":0,"x":6,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":5},"dir":0}},{"layer":0,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":6},"dir":0}},{"layer":0,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":0},"dir":0}},{"layer":0,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":1},"dir":0}},{"layer":0,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":2},"dir":0}},{"layer":0,"x":7,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":3},"dir":0}},{"layer":0,"x":7,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":4},"dir":0}},{"layer":0,"x":7,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":5},"dir":0}},{"layer":0,"x":7,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":6},"dir":0}},{"layer":0,"x":8,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":0},"dir":0}},{"layer":0,"x":8,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":1},"dir":0}},{"layer":0,"x":8,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":2},"dir":0}},{"layer":0,"x":8,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":3},"dir":0}},{"layer":0,"x":8,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":4},"dir":0}},{"layer":0,"x":8,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":5},"dir":0}},{"layer":0,"x":8,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":6},"dir":0}},{"layer":0,"x":9,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":0},"dir":0}},{"layer":0,"x":9,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":1},"dir":0}},{"layer":0,"x":9,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":2},"dir":0}},{"layer":0,"x":9,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":3},"dir":0}},{"layer":0,"x":9,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":4},"dir":0}},{"layer":0,"x":9,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":5},"dir":0}},{"layer":0,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":6},"dir":0}},{"layer":0,"x":10,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":0},"dir":0}},{"layer":0,"x":10,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":1},"dir":0}},{"layer":0,"x":10,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":2},"dir":0}},{"layer":0,"x":10,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":3},"dir":0}},{"layer":0,"x":10,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":4},"dir":0}},{"layer":0,"x":10,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":5},"dir":0}},{"layer":0,"x":10,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":6},"dir":0}},{"layer":0,"x":11,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":0},"dir":0}},{"layer":0,"x":11,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":1},"dir":0}},{"layer":0,"x":11,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":2},"dir":0}},{"layer":0,"x":11,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":3},"dir":0}},{"layer":0,"x":11,"y":4,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":4},"dir":0}},{"layer":0,"x":11,"y":5,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":5},"dir":0}},{"layer":0,"x":11,"y":6,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":6},"dir":0}},{"layer":0,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":0},"dir":0}},{"layer":0,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":1},"dir":0}},{"layer":0,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":2},"dir":0}},{"layer":0,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":3},"dir":0}},{"layer":0,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":0},"dir":0}},{"layer":0,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":1},"dir":0}},{"layer":0,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":2},"dir":0}},{"layer":0,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":3},"dir":0}},{"layer":0,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":0},"dir":0}},{"layer":0,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":1},"dir":0}},{"layer":0,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":2},"dir":0}},{"layer":0,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":3},"dir":0}},{"layer":0,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":0},"dir":0}},{"layer":0,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":1},"dir":0}},{"layer":0,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":2},"dir":0}},{"layer":0,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":3},"dir":0}},{"layer":1,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":0},"dir":0}},{"layer":1,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":1},"dir":0}},{"layer":1,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":2},"dir":0}},{"layer":1,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":3},"dir":0}},{"layer":1,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":0},"dir":0}},{"layer":1,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":1},"dir":0}},{"layer":1,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":2},"dir":0}},{"layer":1,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":3},"dir":0}},{"layer":1,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":0},"dir":0}},{"layer":1,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":1},"dir":0}},{"layer":1,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":2},"dir":0}},{"layer":1,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":3},"dir":0}},{"layer":1,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":0},"dir":0}},{"layer":1,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":1},"dir":0}},{"layer":1,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":2},"dir":0}},{"layer":1,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":3},"dir":0}},{"layer":1,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":0},"dir":0}},{"layer":1,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":1},"dir":0}},{"layer":1,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":2},"dir":0}},{"layer":1,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":3},"dir":0}},{"layer":1,"x":4,"y":4,"placedSaveObject":{"tileObjectSOName":"airlock_civilian","origin":{"x":4,"y":4},"dir":2}},{"layer":1,"x":4,"y":5,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":5},"dir":0}},{"layer":1,"x":4,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":6},"dir":0}},{"layer":1,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":0},"dir":0}},{"layer":1,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":1},"dir":0}},{"layer":1,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":2},"dir":0}},{"layer":1,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":3},"dir":0}},{"layer":1,"x":5,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":4},"dir":0}},{"layer":1,"x":5,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":5},"dir":0}},{"layer":1,"x":5,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":6},"dir":0}},{"layer":1,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":0},"dir":0}},{"layer":1,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":1},"dir":0}},{"layer":1,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":2},"dir":0}},{"layer":1,"x":6,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":3},"dir":0}},{"layer":1,"x":6,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":4},"dir":0}},{"layer":1,"x":6,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":5},"dir":0}},{"layer":1,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":6},"dir":0}},{"layer":1,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":0},"dir":0}},{"layer":1,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":1},"dir":0}},{"layer":1,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":2},"dir":0}},{"layer":1,"x":7,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":3},"dir":0}},{"layer":1,"x":7,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":4},"dir":0}},{"layer":1,"x":7,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":5},"dir":0}},{"layer":1,"x":7,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":7,"y":6},"dir":0}},{"layer":1,"x":8,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":0},"dir":0}},{"layer":1,"x":8,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":1},"dir":0}},{"layer":1,"x":8,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":2},"dir":0}},{"layer":1,"x":8,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":3},"dir":0}},{"layer":1,"x":8,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":4},"dir":0}},{"layer":1,"x":8,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":5},"dir":0}},{"layer":1,"x":8,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":8,"y":6},"dir":0}},{"layer":1,"x":9,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":0},"dir":0}},{"layer":1,"x":9,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":1},"dir":0}},{"layer":1,"x":9,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":2},"dir":0}},{"layer":1,"x":9,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":3},"dir":0}},{"layer":1,"x":9,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":4},"dir":0}},{"layer":1,"x":9,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":5},"dir":0}},{"layer":1,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":6},"dir":0}},{"layer":1,"x":10,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":0},"dir":0}},{"layer":1,"x":10,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":1},"dir":0}},{"layer":1,"x":10,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":2},"dir":0}},{"layer":1,"x":10,"y":3,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":3},"dir":0}},{"layer":1,"x":10,"y":4,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":4},"dir":0}},{"layer":1,"x":10,"y":5,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":5},"dir":0}},{"layer":1,"x":10,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":6},"dir":0}},{"layer":1,"x":11,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":0},"dir":0}},{"layer":1,"x":11,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":1},"dir":0}},{"layer":1,"x":11,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":11,"y":2},"dir":0}},{"layer":1,"x":11,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":3},"dir":0}},{"layer":1,"x":11,"y":4,"placedSaveObject":{"tileObjectSOName":"airlock_civilian","origin":{"x":11,"y":4},"dir":2}},{"layer":1,"x":11,"y":5,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":5},"dir":0}},{"layer":1,"x":11,"y":6,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":6},"dir":0}},{"layer":1,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":0},"dir":0}},{"layer":1,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":1},"dir":0}},{"layer":1,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":2},"dir":0}},{"layer":1,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":3},"dir":0}},{"layer":1,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":0},"dir":0}},{"layer":1,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":1},"dir":0}},{"layer":1,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":2},"dir":0}},{"layer":1,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":3},"dir":0}},{"layer":1,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":0},"dir":0}},{"layer":1,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":1},"dir":0}},{"layer":1,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":2},"dir":0}},{"layer":1,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":3},"dir":0}},{"layer":1,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":0},"dir":0}},{"layer":1,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":1},"dir":0}},{"layer":1,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":2},"dir":0}},{"layer":1,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":3},"dir":0}},{"layer":5,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":3,"y":3},"dir":4}},{"layer":5,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"light_bulb_fixture","origin":{"x":6,"y":6},"dir":4}},{"layer":5,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"light_bulb_fixture","origin":{"x":9,"y":6},"dir":4}},{"layer":5,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":12,"y":3},"dir":4}},{"layer":6,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":2,"y":3},"dir":4}},{"layer":6,"x":6,"y":6,"placedSaveObject":{"tileObjectSOName":"apc","origin":{"x":6,"y":6},"dir":4}},{"layer":6,"x":9,"y":6,"placedSaveObject":{"tileObjectSOName":"firealarm","origin":{"x":9,"y":6},"dir":4}},{"layer":6,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":13,"y":3},"dir":4}}]},{"chunkKey":{"x":0,"y":-1},"originPosition":{"x":0.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":15},"dir":4}},{"layer":0,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":15},"dir":4}},{"layer":0,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":15},"dir":4}},{"layer":0,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":15},"dir":4}},{"layer":0,"x":4,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":9},"dir":4}},{"layer":0,"x":4,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":10},"dir":4}},{"layer":0,"x":4,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":11},"dir":4}},{"layer":0,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":12},"dir":4}},{"layer":0,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":13},"dir":4}},{"layer":0,"x":4,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":14},"dir":4}},{"layer":0,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":15},"dir":4}},{"layer":0,"x":5,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":9},"dir":4}},{"layer":0,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":10},"dir":4}},{"layer":0,"x":5,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":11},"dir":0}},{"layer":0,"x":5,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":12},"dir":0}},{"layer":0,"x":5,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":13},"dir":0}},{"layer":0,"x":5,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":14},"dir":0}},{"layer":0,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":15},"dir":0}},{"layer":0,"x":6,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":9},"dir":4}},{"layer":0,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":10},"dir":4}},{"layer":0,"x":6,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":11},"dir":0}},{"layer":0,"x":6,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":12},"dir":0}},{"layer":0,"x":6,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":13},"dir":0}},{"layer":0,"x":6,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":14},"dir":0}},{"layer":0,"x":6,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":15},"dir":0}},{"layer":0,"x":7,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":9},"dir":4}},{"layer":0,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":10},"dir":4}},{"layer":0,"x":7,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":11},"dir":0}},{"layer":0,"x":7,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":12},"dir":0}},{"layer":0,"x":7,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":13},"dir":0}},{"layer":0,"x":7,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":14},"dir":0}},{"layer":0,"x":7,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":15},"dir":0}},{"layer":0,"x":8,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":9},"dir":4}},{"layer":0,"x":8,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":10},"dir":4}},{"layer":0,"x":8,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":11},"dir":0}},{"layer":0,"x":8,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":12},"dir":0}},{"layer":0,"x":8,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":13},"dir":0}},{"layer":0,"x":8,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":14},"dir":0}},{"layer":0,"x":8,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":8,"y":15},"dir":0}},{"layer":0,"x":9,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":9},"dir":4}},{"layer":0,"x":9,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":10},"dir":4}},{"layer":0,"x":9,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":11},"dir":0}},{"layer":0,"x":9,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":12},"dir":0}},{"layer":0,"x":9,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":13},"dir":0}},{"layer":0,"x":9,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":14},"dir":0}},{"layer":0,"x":9,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":9,"y":15},"dir":0}},{"layer":0,"x":10,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":9},"dir":4}},{"layer":0,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":10},"dir":4}},{"layer":0,"x":10,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":11},"dir":0}},{"layer":0,"x":10,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":12},"dir":0}},{"layer":0,"x":10,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":13},"dir":0}},{"layer":0,"x":10,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":14},"dir":0}},{"layer":0,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":10,"y":15},"dir":0}},{"layer":0,"x":11,"y":9,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":9},"dir":4}},{"layer":0,"x":11,"y":10,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":10},"dir":4}},{"layer":0,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":11},"dir":4}},{"layer":0,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":12},"dir":4}},{"layer":0,"x":11,"y":13,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":13},"dir":4}},{"layer":0,"x":11,"y":14,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":14},"dir":4}},{"layer":0,"x":11,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":11,"y":15},"dir":4}},{"layer":0,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":15},"dir":4}},{"layer":0,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":15},"dir":4}},{"layer":0,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":15},"dir":4}},{"layer":0,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":15},"dir":4}},{"layer":1,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":15},"dir":4}},{"layer":1,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":15},"dir":4}},{"layer":1,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":15},"dir":4}},{"layer":1,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":15},"dir":4}},{"layer":1,"x":4,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":9},"dir":4}},{"layer":1,"x":4,"y":10,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":10},"dir":4}},{"layer":1,"x":4,"y":11,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":11},"dir":4}},{"layer":1,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":12},"dir":4}},{"layer":1,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":13},"dir":4}},{"layer":1,"x":4,"y":14,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":14},"dir":4}},{"layer":1,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":15},"dir":4}},{"layer":1,"x":5,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":9},"dir":4}},{"layer":1,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":10},"dir":0}},{"layer":1,"x":5,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":11},"dir":0}},{"layer":1,"x":5,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":12},"dir":0}},{"layer":1,"x":5,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":13},"dir":0}},{"layer":1,"x":5,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":14},"dir":0}},{"layer":1,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":15},"dir":4}},{"layer":1,"x":6,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":9},"dir":4}},{"layer":1,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":10},"dir":0}},{"layer":1,"x":6,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":11},"dir":4}},{"layer":1,"x":6,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":12},"dir":4}},{"layer":1,"x":6,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":6,"y":13},"dir":4}},{"layer":1,"x":6,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":6,"y":14},"dir":0}},{"layer":1,"x":6,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":6,"y":15},"dir":4}},{"layer":1,"x":7,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":7,"y":9},"dir":4}},{"layer":1,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":10},"dir":0}},{"layer":1,"x":7,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":11},"dir":4}},{"layer":1,"x":7,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":12},"dir":4}},{"layer":1,"x":7,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":7,"y":13},"dir":0}},{"layer":1,"x":7,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":14},"dir":0}},{"layer":1,"x":7,"y":15,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":7,"y":15},"dir":0}},{"layer":1,"x":8,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":8,"y":9},"dir":4}},{"layer":1,"x":8,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":10},"dir":0}},{"layer":1,"x":8,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":11},"dir":4}},{"layer":1,"x":8,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":12},"dir":4}},{"layer":1,"x":8,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":8,"y":13},"dir":0}},{"layer":1,"x":8,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":14},"dir":0}},{"layer":1,"x":8,"y":15,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":8,"y":15},"dir":0}},{"layer":1,"x":9,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":9},"dir":4}},{"layer":1,"x":9,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":10},"dir":0}},{"layer":1,"x":9,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":11},"dir":4}},{"layer":1,"x":9,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":12},"dir":4}},{"layer":1,"x":9,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_carpet","origin":{"x":9,"y":13},"dir":4}},{"layer":1,"x":9,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":9,"y":14},"dir":0}},{"layer":1,"x":9,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":9,"y":15},"dir":4}},{"layer":1,"x":10,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":9},"dir":4}},{"layer":1,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":10},"dir":0}},{"layer":1,"x":10,"y":11,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":11},"dir":0}},{"layer":1,"x":10,"y":12,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":12},"dir":0}},{"layer":1,"x":10,"y":13,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":13},"dir":0}},{"layer":1,"x":10,"y":14,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":10,"y":14},"dir":0}},{"layer":1,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":10,"y":15},"dir":4}},{"layer":1,"x":11,"y":9,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":9},"dir":4}},{"layer":1,"x":11,"y":10,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":10},"dir":4}},{"layer":1,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":11},"dir":4}},{"layer":1,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":12},"dir":4}},{"layer":1,"x":11,"y":13,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":13},"dir":4}},{"layer":1,"x":11,"y":14,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":14},"dir":4}},{"layer":1,"x":11,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":11,"y":15},"dir":4}},{"layer":1,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":15},"dir":4}},{"layer":1,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":15},"dir":4}},{"layer":1,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":15},"dir":4}},{"layer":1,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":15},"dir":4}},{"layer":5,"x":4,"y":12,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":4,"y":12},"dir":2}},{"layer":5,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":5,"y":15},"dir":0}},{"layer":5,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":10,"y":15},"dir":0}},{"layer":5,"x":11,"y":12,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":11,"y":12},"dir":6}},{"layer":6,"x":4,"y":13,"placedSaveObject":{"tileObjectSOName":"apc","origin":{"x":4,"y":13},"dir":2}},{"layer":6,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"light_switch","origin":{"x":5,"y":15},"dir":4}},{"layer":6,"x":10,"y":15,"placedSaveObject":{"tileObjectSOName":"firealarm","origin":{"x":10,"y":15},"dir":4}},{"layer":6,"x":11,"y":11,"placedSaveObject":{"tileObjectSOName":"airalarm","origin":{"x":11,"y":11},"dir":6}},{"layer":7,"x":5,"y":10,"placedSaveObject":{"tileObjectSOName":"locker","origin":{"x":5,"y":10},"dir":0}},{"layer":7,"x":6,"y":10,"placedSaveObject":{"tileObjectSOName":"locker","origin":{"x":6,"y":10},"dir":0}},{"layer":7,"x":7,"y":10,"placedSaveObject":{"tileObjectSOName":"locker_security","origin":{"x":7,"y":10},"dir":0}},{"layer":7,"x":10,"y":10,"placedSaveObject":{"tileObjectSOName":"nuke_cart","origin":{"x":10,"y":10},"dir":4}}]},{"chunkKey":{"x":-1,"y":-1},"originPosition":{"x":-16.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":15},"dir":4}},{"layer":0,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":15},"dir":4}},{"layer":0,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":15},"dir":4}},{"layer":0,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":15},"dir":4}},{"layer":1,"x":12,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":15},"dir":4}},{"layer":1,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":15},"dir":4}},{"layer":1,"x":14,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":15},"dir":4}},{"layer":1,"x":15,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":15},"dir":4}},{"layer":5,"x":13,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":13,"y":15},"dir":0}}]},{"chunkKey":{"x":-1,"y":0},"originPosition":{"x":-16.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":0},"dir":4}},{"layer":0,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":1},"dir":4}},{"layer":0,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":2},"dir":4}},{"layer":0,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":12,"y":3},"dir":4}},{"layer":0,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":0},"dir":4}},{"layer":0,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":1},"dir":4}},{"layer":0,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":2},"dir":4}},{"layer":0,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":13,"y":3},"dir":4}},{"layer":0,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":0},"dir":4}},{"layer":0,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":1},"dir":4}},{"layer":0,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":2},"dir":4}},{"layer":0,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":14,"y":3},"dir":4}},{"layer":0,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":0},"dir":4}},{"layer":0,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":1},"dir":4}},{"layer":0,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":2},"dir":4}},{"layer":0,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":15,"y":3},"dir":4}},{"layer":1,"x":12,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":0},"dir":0}},{"layer":1,"x":12,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":1},"dir":0}},{"layer":1,"x":12,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":12,"y":2},"dir":0}},{"layer":1,"x":12,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":12,"y":3},"dir":4}},{"layer":1,"x":13,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":0},"dir":0}},{"layer":1,"x":13,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":1},"dir":0}},{"layer":1,"x":13,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":13,"y":2},"dir":0}},{"layer":1,"x":13,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":13,"y":3},"dir":4}},{"layer":1,"x":14,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":0},"dir":0}},{"layer":1,"x":14,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":1},"dir":0}},{"layer":1,"x":14,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":14,"y":2},"dir":0}},{"layer":1,"x":14,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":14,"y":3},"dir":4}},{"layer":1,"x":15,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":0},"dir":0}},{"layer":1,"x":15,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":1},"dir":0}},{"layer":1,"x":15,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":15,"y":2},"dir":0}},{"layer":1,"x":15,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":15,"y":3},"dir":4}}]},{"chunkKey":{"x":1,"y":0},"originPosition":{"x":16.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":0},"dir":4}},{"layer":0,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":1},"dir":4}},{"layer":0,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":2},"dir":4}},{"layer":0,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":3},"dir":4}},{"layer":0,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":0},"dir":4}},{"layer":0,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":1},"dir":4}},{"layer":0,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":2},"dir":4}},{"layer":0,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":3},"dir":4}},{"layer":0,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":0},"dir":4}},{"layer":0,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":1},"dir":4}},{"layer":0,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":2},"dir":4}},{"layer":0,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":3},"dir":4}},{"layer":0,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":0},"dir":4}},{"layer":0,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":1},"dir":4}},{"layer":0,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":2},"dir":4}},{"layer":0,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":3},"dir":4}},{"layer":0,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":0},"dir":4}},{"layer":0,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":1},"dir":4}},{"layer":0,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":2},"dir":4}},{"layer":0,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":3},"dir":4}},{"layer":0,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":0},"dir":4}},{"layer":0,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":1},"dir":4}},{"layer":0,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":2},"dir":4}},{"layer":0,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":3},"dir":4}},{"layer":0,"x":6,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":0},"dir":4}},{"layer":0,"x":6,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":1},"dir":4}},{"layer":0,"x":6,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":6,"y":2},"dir":4}},{"layer":0,"x":7,"y":0,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":0},"dir":4}},{"layer":0,"x":7,"y":1,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":1},"dir":4}},{"layer":0,"x":7,"y":2,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":7,"y":2},"dir":4}},{"layer":1,"x":0,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":0},"dir":0}},{"layer":1,"x":0,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":1},"dir":0}},{"layer":1,"x":0,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":0,"y":2},"dir":0}},{"layer":1,"x":0,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":3},"dir":4}},{"layer":1,"x":1,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":0},"dir":0}},{"layer":1,"x":1,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":1},"dir":0}},{"layer":1,"x":1,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":1,"y":2},"dir":0}},{"layer":1,"x":1,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":3},"dir":4}},{"layer":1,"x":2,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":0},"dir":0}},{"layer":1,"x":2,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":1},"dir":0}},{"layer":1,"x":2,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":2,"y":2},"dir":0}},{"layer":1,"x":2,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":3},"dir":4}},{"layer":1,"x":3,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":0},"dir":0}},{"layer":1,"x":3,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":1},"dir":0}},{"layer":1,"x":3,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":3,"y":2},"dir":0}},{"layer":1,"x":3,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":3},"dir":4}},{"layer":1,"x":4,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":0},"dir":0}},{"layer":1,"x":4,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":1},"dir":0}},{"layer":1,"x":4,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":4,"y":2},"dir":0}},{"layer":1,"x":4,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":3},"dir":4}},{"layer":1,"x":5,"y":0,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":0},"dir":0}},{"layer":1,"x":5,"y":1,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":1},"dir":0}},{"layer":1,"x":5,"y":2,"placedSaveObject":{"tileObjectSOName":"tile_grey","origin":{"x":5,"y":2},"dir":0}},{"layer":1,"x":5,"y":3,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":3},"dir":4}}]},{"chunkKey":{"x":1,"y":-1},"originPosition":{"x":16.0,"y":0.0,"z":-16.0},"tileObjectSaveObjectArray":[{"layer":0,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":0,"y":15},"dir":4}},{"layer":0,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":1,"y":15},"dir":4}},{"layer":0,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":2,"y":15},"dir":4}},{"layer":0,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":3,"y":15},"dir":4}},{"layer":0,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":4,"y":15},"dir":4}},{"layer":0,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"plenum","origin":{"x":5,"y":15},"dir":4}},{"layer":1,"x":0,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":0,"y":15},"dir":4}},{"layer":1,"x":1,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":1,"y":15},"dir":4}},{"layer":1,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":2,"y":15},"dir":4}},{"layer":1,"x":3,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":3,"y":15},"dir":4}},{"layer":1,"x":4,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":4,"y":15},"dir":4}},{"layer":1,"x":5,"y":15,"placedSaveObject":{"tileObjectSOName":"wall_steel","origin":{"x":5,"y":15},"dir":4}},{"layer":5,"x":2,"y":15,"placedSaveObject":{"tileObjectSOName":"light_tube_fixture","origin":{"x":2,"y":15},"dir":0}}]},{"chunkKey":{"x":2,"y":0},"originPosition":{"x":32.0,"y":0.0,"z":0.0},"tileObjectSaveObjectArray":[]},{"chunkKey":{"x":1,"y":-2},"originPosition":{"x":16.0,"y":0.0,"z":-32.0},"tileObjectSaveObjectArray":[]},{"chunkKey":{"x":0,"y":-2},"originPosition":{"x":0.0,"y":0.0,"z":-32.0},"tileObjectSaveObjectArray":[]}],"savedItemList":[{"itemName":"borg_engineering","worldPosition":{"x":13.868721961975098,"y":0.0,"z":0.13913965225219727},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"idcard","worldPosition":{"x":10.058170318603516,"y":0.0,"z":-1.9040601253509522},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"pda","worldPosition":{"x":9.76523494720459,"y":0.0,"z":-1.8928546905517579},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"security_idcard","worldPosition":{"x":10.043039321899414,"y":0.0,"z":-2.2987756729125978},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"security_pda","worldPosition":{"x":9.791738510131836,"y":0.0,"z":-2.269656181335449},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"bikehorn","worldPosition":{"x":10.198518753051758,"y":0.0,"z":-2.696934223175049},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}},{"itemName":"nuke_disk","worldPosition":{"x":9.787110328674317,"y":0.0,"z":-2.6697144508361818},"rotation":{"x":0.0,"y":0.7071067690849304,"z":0.0,"w":-0.7071067690849304}}]} \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index f988445fa4..212e122dd8 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -141,7 +141,7 @@ PlayerSettings: - {fileID: 11400000, guid: 2b55e2e913cc78044a828c6fb589fb9e, type: 2} - {fileID: 11400000, guid: 443046479504c5640b8f5902a102c09f, type: 2} - {fileID: 11400000, guid: 3c59f55e6898e694083e7a1ede49fe18, type: 2} - - {fileID: 11400000, guid: 97967903e9bd51b499aaa39639cc9bb2, type: 2} + - {fileID: 11400000, guid: 2024dd0c65f45424f98ac0c8a6979181, type: 2} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1