WuhuIslandTesting/Library/PackageCache/com.stresslevelzero.marrow.sdk@1.2.0/Scripts/SLZ.Marrow/SLZ.Marrow.Warehouse/LevelCrate.cs
2025-01-07 02:06:59 +01:00

188 lines
No EOL
7.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System;
using Newtonsoft.Json.Linq;
using SLZ.Serialize;
using UnityEngine.Serialization;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;
#endif
namespace SLZ.Marrow.Warehouse
{
public class LevelCrate : Crate
{
[FormerlySerializedAs("_assetReference")]
[SerializeField]
private MarrowScene _mainAsset;
public override MarrowAsset MainAsset
{
get => _mainAsset;
set
{
if (value != null && value.GetType() == typeof(MarrowAsset))
{
_mainAsset = new MarrowScene(value.AssetGUID);
}
else
{
_mainAsset = (MarrowScene)value;
}
}
}
public MarrowScene MainScene { get => _mainAsset; set => _mainAsset = value; }
[SerializeField]
private List<MarrowScene> _additionalAssetReferences = new List<MarrowScene>();
[Tooltip("Level has multiple scenes")]
[SerializeField]
private bool _multiScene = false;
public bool MultiScene { get => _multiScene; set => _multiScene = value; }
[Tooltip("Scenes that also load in when the root scene loads, and will stay always loaded in until level change")]
[SerializeField]
private List<MarrowScene> _persistentScenes = new List<MarrowScene>();
public List<MarrowScene> PersistentScenes => _persistentScenes;
[Tooltip("Scenes that will be loaded dynamically in the level, for example: Chunk scenes loaded through a Chunk Trigger. All chunked scenes must be included here or they will not be included in the build")]
[SerializeField]
private List<MarrowScene> _chunkScenes = new List<MarrowScene>();
public List<MarrowScene> ChunkScenes => _chunkScenes;
[Tooltip("Scenes that will ONLY load in the editor at design time, outside of playmode. They will NOT load in during builds, and will NOT be included in builds")]
[SerializeField]
private List<MarrowScene> _editorScenes = new List<MarrowScene>();
public List<MarrowScene> EditorScenes => _editorScenes;
#if UNITY_EDITOR
private string CURSED_SCENE_GUID = "99c9720ab356a0642a771bea13969a05";
[ContextMenu("Validate Scene Guid")]
public void ValidateSceneGUID()
{
if (!string.IsNullOrEmpty(MainScene.AssetGUID))
{
if (MainScene.AssetGUID == CURSED_SCENE_GUID)
{
var scenePath = AssetDatabase.GUIDToAssetPath(CURSED_SCENE_GUID);
var metaPath = AssetDatabase.GetTextMetaFilePathFromAssetPath(scenePath);
var metaText = System.IO.File.ReadAllText(metaPath);
if (metaText.Contains(CURSED_SCENE_GUID) && metaText.Contains($"guid: {CURSED_SCENE_GUID}"))
{
string newGuid = System.Guid.NewGuid().ToString("N");
metaText = metaText.Replace($"guid: {CURSED_SCENE_GUID}", $"guid: {newGuid}");
System.IO.File.WriteAllText(metaPath, metaText);
MainScene = new MarrowScene(newGuid);
EditorUtility.SetDirty(this);
AssetDatabase.ImportAsset(scenePath);
AssetDatabase.SaveAssetIfDirty(this);
AssetDatabase.Refresh();
}
}
}
}
#endif
#if UNITY_EDITOR
public override System.Type AssetType { get => typeof(SceneAsset); }
#else
#endif
#if UNITY_EDITOR
public SceneSetup[] ToEditorSceneSetups()
{
var allScenesForEditor = new List<MarrowScene>();
allScenesForEditor.Add(MainScene);
allScenesForEditor.AddRange(PersistentScenes.Select(assetRef => assetRef).Where(scene => scene.EditorAsset != null || scene.AssetGUID != string.Empty));
allScenesForEditor.AddRange(ChunkScenes.Select(assetRef => assetRef).Where(scene => scene.EditorAsset != null || scene.AssetGUID != string.Empty));
allScenesForEditor.AddRange(EditorScenes.Select(assetRef => assetRef).Where(scene => scene.EditorAsset != null || scene.AssetGUID != string.Empty));
var ret = new SceneSetup[allScenesForEditor.Count];
bool first = true;
for (var i = 0; i < allScenesForEditor.Count; i++)
{
var sceneAsset = allScenesForEditor[i];
var sceneSetup = new SceneSetup
{
path = AssetDatabase.GUIDToAssetPath(sceneAsset.AssetGUID),
isActive = first,
isLoaded = true
};
if (first)
first = false;
ret[i] = sceneSetup;
}
return ret;
}
#endif
public override void ImportPackedAssets(Dictionary<string, PackedAsset> packedAssets)
{
if (packedAssets.TryGetValue("PersistentScenes", out var packedAsset) && packedAsset.HasSubAssets())
{
foreach (var subAsset in packedAsset.subAssets)
{
PersistentScenes.Add(new MarrowScene(subAsset.subAsset.AssetGUID));
}
}
if (packedAssets.TryGetValue("ChunkScenes", out packedAsset) && packedAsset.HasSubAssets())
{
foreach (var subAsset in packedAsset.subAssets)
{
ChunkScenes.Add(new MarrowScene(subAsset.subAsset.AssetGUID));
}
}
}
public override List<PackedAsset> ExportPackedAssets()
{
base.ExportPackedAssets();
Type sceneAssetType = typeof(UnityEngine.SceneManagement.Scene);
List<PackedSubAsset> subAssets = new List<PackedSubAsset>();
for (var i = 0; i < _persistentScenes.Count; i++)
{
var persistentScene = _persistentScenes[i];
string subTitle = i.ToString();
#if UNITY_EDITOR
subTitle = $"{(persistentScene.EditorAsset != null ? MarrowSDK.SanitizeName(persistentScene.EditorAsset.name) : "")}-{subTitle}";
#endif
subAssets.Add(new PackedSubAsset(subTitle, persistentScene));
}
PackedAssets.Add(new PackedAsset("PersistentScenes", subAssets, sceneAssetType, "_persistentScenes"));
subAssets = new List<PackedSubAsset>();
for (var i = 0; i < _chunkScenes.Count; i++)
{
var chunkScene = _chunkScenes[i];
string subTitle = i.ToString();
#if UNITY_EDITOR
subTitle = $"{(chunkScene.EditorAsset != null ? MarrowSDK.SanitizeName(chunkScene.EditorAsset.name) : "")}-{subTitle}";
#endif
subAssets.Add(new PackedSubAsset(subTitle, chunkScene));
}
PackedAssets.Add(new PackedAsset("ChunkScenes", subAssets, sceneAssetType, "_chunkScenes"));
return PackedAssets;
}
public override void Pack(ObjectStore store, JObject json)
{
base.Pack(store, json);
json.Add("multiscene", MultiScene);
}
public override void Unpack(ObjectStore store, string objectId)
{
base.Unpack(store, objectId);
if (store.TryGetJSON("multiscene", objectId, out JToken barcodeValue))
{
_multiScene = barcodeValue.ToObject<bool>();
}
}
}
}