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