From 821bd28349c9ac6c91ccc5ad64a281dabe15b7ca Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 23 Jun 2025 21:55:27 +0200 Subject: [PATCH 1/5] Here we go again --- src/Loader.cs | 92 ++++++++++++++++++++++++++++++++++++++++++ src/Managers/Main.cs | 17 ++++++++ src/Managers/Visual.cs | 8 ++++ src/Registry.cs | 1 + 4 files changed, 118 insertions(+) diff --git a/src/Loader.cs b/src/Loader.cs index f68f8f4..16c9d27 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -458,6 +458,98 @@ public static void LoadAudioFile(Mod mod, Mod.File file) // TODO: issue #71 } + public static void LoadPrefabInfoFile(Mod mod, Mod.File file) + { + try + { + string name = Path.GetFileNameWithoutExtension(file.name); + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + Visual.PrefabInfo? prefab = JsonSerializer.Deserialize(file.bytes, options); + + if (prefab != null) + { + Console.WriteLine(prefab); + Registry.prefabInfos.Add(name, prefab); + + Unit unit = PrefabManager.GetPrefab(UnitData.Type.Warrior, TribeData.Type.Imperius, SkinType.Default); + if (unit != null) + { + Unit instantiatedUnit = GameObject.Instantiate(unit); + if (instantiatedUnit != null) + { + var svr = instantiatedUnit.GetComponent(); + var spriteContainer = instantiatedUnit.transform.GetChild(0); + List visualParts = new(); + int childCount = spriteContainer.childCount; + for (int i = 0; i < childCount; i++) + { + var child = spriteContainer.GetChild(i); + // Console.Write(child.gameObject.name); + // if (child.gameObject.name == "Head") + // { + // Console.Write(child.gameObject.transform.position); + // } + GameObject.Destroy(child.gameObject); + } + foreach (Visual.VisualPartInfo visualPartInfo in prefab.visualParts) + { + SkinVisualsReference.VisualPart visualPartComponent = new(); + visualPartComponent.DefaultSpriteName = visualPartInfo.baseName; + visualPartComponent.visualPart = new GameObject(); + visualPartComponent.visualPart.name = visualPartInfo.gameObjectName; + visualPartComponent.visualPart.transform.position = visualPartInfo.coordinates; + visualPartComponent.visualPart.transform.SetParent(spriteContainer.transform); + visualPartComponent.outline = new GameObject(); + visualPartComponent.outline.name = "Outline"; + visualPartComponent.outline.transform.position = visualPartInfo.coordinates; + visualPartComponent.outline.transform.SetParent(visualPartComponent.visualPart.transform); + if (visualPartComponent.visualPart.GetComponent() == null) + visualPartComponent.visualPart.AddComponent(); + + visualParts.Add(visualPartComponent); + } + svr.visualParts = new(visualParts.ToArray()); + + + Console.WriteLine(svr.visualParts.Length); + GameObject.DontDestroyOnLoad(instantiatedUnit.gameObject); + //PrefabManager.units[GetSkinnedHashKey(2, SkinType.Default)] = instantiatedUnit.GetComponent(); THIS LINE REPLACES ALL WARRIORS WITHYOUR PREFAB + } + } + + Plugin.logger.LogInfo($"Registered prefab info from {mod.id} mod"); + } + } + catch (Exception e) + { + Plugin.logger.LogError($"Error on loading prefab info from {mod.id} mod: {e.Message}"); + } + } + + public static Transform? GetPlaceholderVisualPart(Transform spriteContainer) + { + int childCount = spriteContainer.childCount; + for (int i = 0; i < childCount; i++) + { + var child = spriteContainer.GetChild(i); + Console.Write(child.gameObject.name); + if (child.gameObject.name == "Head") + { + return child.transform; + } + } + return null; + } + + private static int GetSkinnedHashKey(int type, SkinType skin) + { + return type + ((int)skin * 1000); + } + public static void LoadGameLogicDataPatch(Mod mod, JObject gld, JObject patch) { try diff --git a/src/Managers/Main.cs b/src/Managers/Main.cs index db9ab38..8a53b40 100644 --- a/src/Managers/Main.cs +++ b/src/Managers/Main.cs @@ -286,6 +286,15 @@ private static void StartTurnAction_Execute(StartTurnAction __instance, GameStat } } + [HarmonyPrefix] + [HarmonyPatch(typeof(Unit), nameof(Unit.CreateUnit))] + private static bool Unit_CreateUnit(Unit __instance, UnitData unitData, TribeData.Type tribe, SkinType unitSkin) + { + Unit unit = PrefabManager.GetPrefab(unitData.type, tribe, unitSkin); + if (unit == null) Console.Write("THIS FUCKING SHIT IS NULL WHAT THE FUCK"); + return true; + } + internal static void Init() { stopwatch.Start(); @@ -359,6 +368,14 @@ internal static void Load(JObject gameLogicdata) ); continue; } + if (Regex.IsMatch(Path.GetFileName(file.name), @"^prefab(_.*)?\.json$")) + { + Loader.LoadPrefabInfoFile( + mod, + file + ); + continue; + } switch (Path.GetExtension(file.name)) { diff --git a/src/Managers/Visual.cs b/src/Managers/Visual.cs index 96b3350..7198d03 100644 --- a/src/Managers/Visual.cs +++ b/src/Managers/Visual.cs @@ -37,6 +37,14 @@ public record SkinInfo(int idx, string id, SkinData? skinData); private static bool firstTimeOpeningPreview = true; private static UnitData.Type currentUnitTypeUI = UnitData.Type.None; private static TribeData.Type attackerTribe = TribeData.Type.None; + public enum PrefabType + { + Unit, + Improvement, + Resource + } + public record PrefabInfo(PrefabType type, string name, List visualParts); + public record VisualPartInfo(string gameObjectName, string baseName, Vector3 coordinates); #region General diff --git a/src/Registry.cs b/src/Registry.cs index 3861034..f649c9e 100644 --- a/src/Registry.cs +++ b/src/Registry.cs @@ -14,6 +14,7 @@ public static class Registry internal static Dictionary mods = new(); public static Dictionary tribePreviews = new(); public static Dictionary spriteInfos = new(); + public static Dictionary prefabInfos = new(); public static Dictionary assetBundles = new(); public static List customTribes = new(); public static List skinInfo = new(); From e8b80a34dfeaf04addc022f91c81c70e9441dffc Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 25 Jun 2025 22:30:02 +0200 Subject: [PATCH 2/5] Implemented units prefabs --- src/Loader.cs | 118 ++++++++++++++++++++++++----------------- src/Managers/Main.cs | 28 ++++++++++ src/Managers/Visual.cs | 9 +++- src/Registry.cs | 5 +- 4 files changed, 110 insertions(+), 50 deletions(-) diff --git a/src/Loader.cs b/src/Loader.cs index 16c9d27..afec8f2 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -61,14 +61,10 @@ public static class Loader { if (duringEnumCacheCreation) { - UnitData.Type unitPrefabType = UnitData.Type.Scout; if (token["prefab"] != null) { - string prefabId = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(token["prefab"]!.ToString()); - if (Enum.TryParse(prefabId, out UnitData.Type parsedType)) - unitPrefabType = parsedType; + Registry.prefabNames.Add((int)(UnitData.Type)Registry.autoidx, CultureInfo.CurrentCulture.TextInfo.ToTitleCase(token["prefab"]!.ToString())); } - PrefabManager.units.TryAdd((int)(UnitData.Type)Registry.autoidx, PrefabManager.units[(int)unitPrefabType]); } else { @@ -465,59 +461,85 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file) string name = Path.GetFileNameWithoutExtension(file.name); var options = new JsonSerializerOptions { - PropertyNameCaseInsensitive = true + Converters = { new Vector2Json() }, + PropertyNameCaseInsensitive = true, }; Visual.PrefabInfo? prefab = JsonSerializer.Deserialize(file.bytes, options); - if (prefab != null) { - Console.WriteLine(prefab); - Registry.prefabInfos.Add(name, prefab); - - Unit unit = PrefabManager.GetPrefab(UnitData.Type.Warrior, TribeData.Type.Imperius, SkinType.Default); - if (unit != null) + if (prefab.type == Visual.PrefabType.Unit) { - Unit instantiatedUnit = GameObject.Instantiate(unit); - if (instantiatedUnit != null) + Unit unit = PrefabManager.GetPrefab(UnitData.Type.Warrior, TribeData.Type.Imperius, SkinType.Default); + if (unit != null) { - var svr = instantiatedUnit.GetComponent(); - var spriteContainer = instantiatedUnit.transform.GetChild(0); - List visualParts = new(); - int childCount = spriteContainer.childCount; - for (int i = 0; i < childCount; i++) - { - var child = spriteContainer.GetChild(i); - // Console.Write(child.gameObject.name); - // if (child.gameObject.name == "Head") - // { - // Console.Write(child.gameObject.transform.position); - // } - GameObject.Destroy(child.gameObject); - } - foreach (Visual.VisualPartInfo visualPartInfo in prefab.visualParts) + Unit instantiatedUnit = GameObject.Instantiate(unit); + if (instantiatedUnit != null) { - SkinVisualsReference.VisualPart visualPartComponent = new(); - visualPartComponent.DefaultSpriteName = visualPartInfo.baseName; - visualPartComponent.visualPart = new GameObject(); - visualPartComponent.visualPart.name = visualPartInfo.gameObjectName; - visualPartComponent.visualPart.transform.position = visualPartInfo.coordinates; - visualPartComponent.visualPart.transform.SetParent(spriteContainer.transform); - visualPartComponent.outline = new GameObject(); - visualPartComponent.outline.name = "Outline"; - visualPartComponent.outline.transform.position = visualPartInfo.coordinates; - visualPartComponent.outline.transform.SetParent(visualPartComponent.visualPart.transform); - if (visualPartComponent.visualPart.GetComponent() == null) - visualPartComponent.visualPart.AddComponent(); - - visualParts.Add(visualPartComponent); - } - svr.visualParts = new(visualParts.ToArray()); + Material? spritesMaterial = null; + var svr = instantiatedUnit.GetComponent(); + var spriteContainer = instantiatedUnit.transform.GetChild(0); + List visualParts = new(); + int childCount = spriteContainer.childCount; + for (int i = 0; i < childCount; i++) + { + var child = spriteContainer.GetChild(i); + if (child.gameObject.name == "Head") + { + SpriteRenderer? headRenderer = child.gameObject.GetComponent(); + if (headRenderer != null) + { + spritesMaterial = headRenderer.material; + } + } + GameObject.Destroy(child.gameObject); + } + foreach (Visual.VisualPartInfo visualPartInfo in prefab.visualParts) + { + SkinVisualsReference.VisualPart visualPartComponent = new(); + visualPartComponent.DefaultSpriteName = visualPartInfo.baseName; + visualPartComponent.visualPart = new GameObject(); + visualPartComponent.visualPart.name = visualPartInfo.gameObjectName; + visualPartComponent.visualPart.transform.SetParent(spriteContainer.transform); + visualPartComponent.outline = new GameObject(); + visualPartComponent.outline.name = "Outline"; + visualPartComponent.outline.transform.SetParent(visualPartComponent.visualPart.transform); + if (visualPartComponent.visualPart.GetComponent() == null) + { + SpriteRenderer renderer = visualPartComponent.visualPart.AddComponent(); + renderer.material = spritesMaterial; + renderer.sortingLayerName = "Units"; + renderer.sortingOrder = 1; + SkinVisualsReference.RendererUnion rendererUnion = new(); + rendererUnion.spriteRenderer = renderer; + visualPartComponent.renderer = rendererUnion; + } + if (visualPartComponent.outline.GetComponent() == null) + { + SpriteRenderer outlineRenderer = visualPartComponent.outline.AddComponent(); + outlineRenderer.material = spritesMaterial; + outlineRenderer.sortingLayerName = "Units"; + outlineRenderer.sortingOrder = -1; + SkinVisualsReference.RendererUnion outlineRendererUnion = new(); + outlineRendererUnion.spriteRenderer = outlineRenderer; + visualPartComponent.outlineRenderer = outlineRendererUnion; + } + visualPartComponent.tintable = visualPartInfo.tintable; + visualPartComponent.visualPart.transform.position = visualPartInfo.coordinates; + visualPartComponent.outline.transform.position = visualPartInfo.coordinates; - Console.WriteLine(svr.visualParts.Length); - GameObject.DontDestroyOnLoad(instantiatedUnit.gameObject); - //PrefabManager.units[GetSkinnedHashKey(2, SkinType.Default)] = instantiatedUnit.GetComponent(); THIS LINE REPLACES ALL WARRIORS WITHYOUR PREFAB + visualPartComponent.visualPart.transform.localScale = visualPartInfo.scale; + visualPartComponent.outline.transform.localScale = visualPartInfo.scale; + visualParts.Add(visualPartComponent); + } + svr.visualParts = new(visualParts.ToArray()); + + + Console.WriteLine(svr.visualParts.Length); + GameObject.DontDestroyOnLoad(instantiatedUnit.gameObject); + Registry.unitPrefabs.Add(prefab, instantiatedUnit.GetComponent()); + } } } diff --git a/src/Managers/Main.cs b/src/Managers/Main.cs index 8a53b40..13ae547 100644 --- a/src/Managers/Main.cs +++ b/src/Managers/Main.cs @@ -32,6 +32,34 @@ private static void GameLogicData_Parse(GameLogicData __instance, JObject rootOb if (!fullyInitialized) { Load(rootObject); + foreach (System.Collections.Generic.KeyValuePair item in Registry.prefabNames) + { + UnitData.Type unitPrefabType = UnitData.Type.Scout; + string prefabId = item.Value; + if (Enum.TryParse(prefabId, out UnitData.Type parsedType)) + { + unitPrefabType = parsedType; + PrefabManager.units.TryAdd(item.Key, PrefabManager.units[(int)unitPrefabType]); + } + else + { + KeyValuePair prefabInfo = Registry.unitPrefabs.FirstOrDefault(kv => kv.Key.name == prefabId); + if (!EqualityComparer.Default.Equals(prefabInfo.Key, default)) + { + // UnitData? data = prefabInfo.Value.UnitData; + // if (data != null) + // { + // data.type = (UnitData.Type)Registry.autoidx; + // prefabInfo.Value.SetData(data); + // } + PrefabManager.units.TryAdd(item.Key, prefabInfo.Value); + } + else + { + PrefabManager.units.TryAdd(item.Key, PrefabManager.units[(int)unitPrefabType]); + } + } + } foreach (Visual.SkinInfo skin in Registry.skinInfo) { if (skin.skinData != null) diff --git a/src/Managers/Visual.cs b/src/Managers/Visual.cs index 7198d03..b047780 100644 --- a/src/Managers/Visual.cs +++ b/src/Managers/Visual.cs @@ -44,7 +44,14 @@ public enum PrefabType Resource } public record PrefabInfo(PrefabType type, string name, List visualParts); - public record VisualPartInfo(string gameObjectName, string baseName, Vector3 coordinates); + public record VisualPartInfo( + string gameObjectName, + string baseName, + Quaternion rotation, + Vector2 coordinates = new Vector2(), + Vector2 scale = new Vector2(), + bool tintable = false + ); #region General diff --git a/src/Registry.cs b/src/Registry.cs index f649c9e..207d225 100644 --- a/src/Registry.cs +++ b/src/Registry.cs @@ -14,7 +14,10 @@ public static class Registry internal static Dictionary mods = new(); public static Dictionary tribePreviews = new(); public static Dictionary spriteInfos = new(); - public static Dictionary prefabInfos = new(); + public static Dictionary prefabNames = new(); + public static Dictionary unitPrefabs = new(); + public static Dictionary resourcePrefabs = new(); + public static Dictionary improvementsPrefabs = new(); public static Dictionary assetBundles = new(); public static List customTribes = new(); public static List skinInfo = new(); From bc88f6a9cb2a5e9df6ed4bed791d23c626b366cd Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 29 Jun 2025 14:52:30 +0200 Subject: [PATCH 3/5] Refactor --- src/Loader.cs | 167 ++++++++++++++++++++--------------------- src/Managers/Main.cs | 6 -- src/Managers/Visual.cs | 25 ++++++ 3 files changed, 106 insertions(+), 92 deletions(-) diff --git a/src/Loader.cs b/src/Loader.cs index afec8f2..1fc1db4 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -458,93 +458,36 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file) { try { - string name = Path.GetFileNameWithoutExtension(file.name); - var options = new JsonSerializerOptions + var prefab = JsonSerializer.Deserialize(file.bytes, new JsonSerializerOptions { Converters = { new Vector2Json() }, PropertyNameCaseInsensitive = true, - }; + }); + if (prefab == null || prefab.type != Visual.PrefabType.Unit) + return; - Visual.PrefabInfo? prefab = JsonSerializer.Deserialize(file.bytes, options); - if (prefab != null) - { - if (prefab.type == Visual.PrefabType.Unit) - { - Unit unit = PrefabManager.GetPrefab(UnitData.Type.Warrior, TribeData.Type.Imperius, SkinType.Default); - if (unit != null) - { - Unit instantiatedUnit = GameObject.Instantiate(unit); - if (instantiatedUnit != null) - { - Material? spritesMaterial = null; - var svr = instantiatedUnit.GetComponent(); - var spriteContainer = instantiatedUnit.transform.GetChild(0); - List visualParts = new(); - int childCount = spriteContainer.childCount; - for (int i = 0; i < childCount; i++) - { - var child = spriteContainer.GetChild(i); - if (child.gameObject.name == "Head") - { - SpriteRenderer? headRenderer = child.gameObject.GetComponent(); - if (headRenderer != null) - { - spritesMaterial = headRenderer.material; - } - } - GameObject.Destroy(child.gameObject); - } - foreach (Visual.VisualPartInfo visualPartInfo in prefab.visualParts) - { - SkinVisualsReference.VisualPart visualPartComponent = new(); - visualPartComponent.DefaultSpriteName = visualPartInfo.baseName; - visualPartComponent.visualPart = new GameObject(); - visualPartComponent.visualPart.name = visualPartInfo.gameObjectName; - visualPartComponent.visualPart.transform.SetParent(spriteContainer.transform); - visualPartComponent.outline = new GameObject(); - visualPartComponent.outline.name = "Outline"; - visualPartComponent.outline.transform.SetParent(visualPartComponent.visualPart.transform); - if (visualPartComponent.visualPart.GetComponent() == null) - { - SpriteRenderer renderer = visualPartComponent.visualPart.AddComponent(); - renderer.material = spritesMaterial; - renderer.sortingLayerName = "Units"; - renderer.sortingOrder = 1; - SkinVisualsReference.RendererUnion rendererUnion = new(); - rendererUnion.spriteRenderer = renderer; - visualPartComponent.renderer = rendererUnion; - } - if (visualPartComponent.outline.GetComponent() == null) - { - SpriteRenderer outlineRenderer = visualPartComponent.outline.AddComponent(); - outlineRenderer.material = spritesMaterial; - outlineRenderer.sortingLayerName = "Units"; - outlineRenderer.sortingOrder = -1; - SkinVisualsReference.RendererUnion outlineRendererUnion = new(); - outlineRendererUnion.spriteRenderer = outlineRenderer; - visualPartComponent.outlineRenderer = outlineRendererUnion; - } - visualPartComponent.tintable = visualPartInfo.tintable; + var baseUnit = PrefabManager.GetPrefab(UnitData.Type.Warrior, TribeData.Type.Imperius, SkinType.Default); + if (baseUnit == null) + return; - visualPartComponent.visualPart.transform.position = visualPartInfo.coordinates; - visualPartComponent.outline.transform.position = visualPartInfo.coordinates; + var unitInstance = GameObject.Instantiate(baseUnit); + if (unitInstance == null) + return; - visualPartComponent.visualPart.transform.localScale = visualPartInfo.scale; - visualPartComponent.outline.transform.localScale = visualPartInfo.scale; - visualParts.Add(visualPartComponent); - } - svr.visualParts = new(visualParts.ToArray()); + var spriteContainer = unitInstance.transform.GetChild(0); + var material = ClearExistingPartsAndExtractMaterial(spriteContainer); + var visualParts = ApplyVisualParts(prefab.visualParts, spriteContainer, material); - Console.WriteLine(svr.visualParts.Length); - GameObject.DontDestroyOnLoad(instantiatedUnit.gameObject); - Registry.unitPrefabs.Add(prefab, instantiatedUnit.GetComponent()); - } - } - } + var svr = unitInstance.GetComponent(); + svr.visualParts = visualParts.ToArray(); - Plugin.logger.LogInfo($"Registered prefab info from {mod.id} mod"); - } + Console.WriteLine(svr.visualParts.Length); + + GameObject.DontDestroyOnLoad(unitInstance.gameObject); + Registry.unitPrefabs.Add(prefab, unitInstance.GetComponent()); + + Plugin.logger.LogInfo($"Registered prefab info from {mod.id} mod"); } catch (Exception e) { @@ -552,24 +495,76 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file) } } - public static Transform? GetPlaceholderVisualPart(Transform spriteContainer) + private static Material? ClearExistingPartsAndExtractMaterial(Transform spriteContainer) { - int childCount = spriteContainer.childCount; - for (int i = 0; i < childCount; i++) + Material? material = null; + for (int i = 0; i < spriteContainer.childCount; i++) { var child = spriteContainer.GetChild(i); - Console.Write(child.gameObject.name); if (child.gameObject.name == "Head") { - return child.transform; + var renderer = child.GetComponent(); + if (renderer != null) + material = renderer.material; } + GameObject.Destroy(child.gameObject); } - return null; + return material; + } + + private static List ApplyVisualParts( + List partInfos, + Transform spriteContainer, + Material? material) + { + List parts = new(); + + foreach (var info in partInfos) + { + parts.Add(CreateVisualPart(info, spriteContainer, material)); + } + + return parts; } - private static int GetSkinnedHashKey(int type, SkinType skin) + private static SkinVisualsReference.VisualPart CreateVisualPart( + Visual.VisualPartInfo info, + Transform parent, + Material? material) { - return type + ((int)skin * 1000); + var visualPartObj = new GameObject(info.gameObjectName); + visualPartObj.transform.SetParent(parent); + visualPartObj.transform.position = info.coordinates; + visualPartObj.transform.localScale = info.scale; + + var outlineObj = new GameObject("Outline"); + outlineObj.transform.SetParent(visualPartObj.transform); + outlineObj.transform.position = info.coordinates; + outlineObj.transform.localScale = info.scale; + + var visualPart = new SkinVisualsReference.VisualPart + { + DefaultSpriteName = info.baseName, + visualPart = visualPartObj, + outline = outlineObj, + tintable = info.tintable + }; + + var renderer = visualPartObj.AddComponent(); + renderer.material = material; + renderer.sortingLayerName = "Units"; + renderer.sortingOrder = info.tintable ? 0 : 1; + + visualPart.renderer = new SkinVisualsReference.RendererUnion { spriteRenderer = renderer }; + + var outlineRenderer = outlineObj.AddComponent(); + outlineRenderer.material = material; + outlineRenderer.sortingLayerName = "Units"; + outlineRenderer.sortingOrder = -1; + + visualPart.outlineRenderer = new SkinVisualsReference.RendererUnion { spriteRenderer = outlineRenderer }; + + return visualPart; } public static void LoadGameLogicDataPatch(Mod mod, JObject gld, JObject patch) diff --git a/src/Managers/Main.cs b/src/Managers/Main.cs index 13ae547..68892ed 100644 --- a/src/Managers/Main.cs +++ b/src/Managers/Main.cs @@ -46,12 +46,6 @@ private static void GameLogicData_Parse(GameLogicData __instance, JObject rootOb KeyValuePair prefabInfo = Registry.unitPrefabs.FirstOrDefault(kv => kv.Key.name == prefabId); if (!EqualityComparer.Default.Equals(prefabInfo.Key, default)) { - // UnitData? data = prefabInfo.Value.UnitData; - // if (data != null) - // { - // data.type = (UnitData.Type)Registry.autoidx; - // prefabInfo.Value.SetData(data); - // } PrefabManager.units.TryAdd(item.Key, prefabInfo.Value); } else diff --git a/src/Managers/Visual.cs b/src/Managers/Visual.cs index b047780..99f3f7e 100644 --- a/src/Managers/Visual.cs +++ b/src/Managers/Visual.cs @@ -52,6 +52,7 @@ public record VisualPartInfo( Vector2 scale = new Vector2(), bool tintable = false ); + private static bool enableOutlines = false; #region General @@ -120,6 +121,30 @@ private static void SpriteAtlasManager_DoSpriteLookup(ref SpriteAtlasManager.Spr #endregion #region Units + // lobotomy + + [HarmonyPrefix] + [HarmonyPatch(typeof(InteractionBar), nameof(InteractionBar.Show))] + private static bool InteractionBar_Show(InteractionBar __instance, bool instant, bool force) + { + enableOutlines = true; + return true; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(UISpriteDuplicator), nameof(UISpriteDuplicator.CreateImage), typeof(SpriteRenderer), typeof(Transform), typeof(Transform), typeof(float), typeof(Vector2), typeof(bool))] + private static bool UISpriteDuplicator_CreateImage(SpriteRenderer spriteRenderer, Transform source, Transform destination, float scale, Vector2 offset, bool forceFullAlpha) + { + return !(spriteRenderer.sortingOrder == -1 && !enableOutlines); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(InteractionBar), nameof(InteractionBar.Show))] + private static void InteractionBar_Show_Postfix(InteractionBar __instance, bool instant, bool force) + { + enableOutlines = false; + } + [HarmonyPrefix] [HarmonyPatch(typeof(UIUnitRenderer), nameof(UIUnitRenderer.CreateUnit))] private static bool UIUnitRenderer_CreateUnit_Prefix(UIUnitRenderer __instance) From 6f2f9c599847eb936c20b460adddbe40beb57d03 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 29 Jun 2025 14:57:19 +0200 Subject: [PATCH 4/5] Removed console write --- src/Loader.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Loader.cs b/src/Loader.cs index 1fc1db4..5f367cf 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -482,8 +482,6 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file) var svr = unitInstance.GetComponent(); svr.visualParts = visualParts.ToArray(); - Console.WriteLine(svr.visualParts.Length); - GameObject.DontDestroyOnLoad(unitInstance.gameObject); Registry.unitPrefabs.Add(prefab, unitInstance.GetComponent()); From deb59df25385f484878aefcdbf896d617b44679b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 29 Jun 2025 15:25:11 +0200 Subject: [PATCH 5/5] Added rotation --- src/Loader.cs | 2 ++ src/Managers/Visual.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Loader.cs b/src/Loader.cs index 5f367cf..bdf79a2 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -534,11 +534,13 @@ private static SkinVisualsReference.VisualPart CreateVisualPart( visualPartObj.transform.SetParent(parent); visualPartObj.transform.position = info.coordinates; visualPartObj.transform.localScale = info.scale; + visualPartObj.transform.rotation = Quaternion.Euler(0f, 0f, info.rotation); var outlineObj = new GameObject("Outline"); outlineObj.transform.SetParent(visualPartObj.transform); outlineObj.transform.position = info.coordinates; outlineObj.transform.localScale = info.scale; + outlineObj.transform.rotation = Quaternion.Euler(0f, 0f, info.rotation); var visualPart = new SkinVisualsReference.VisualPart { diff --git a/src/Managers/Visual.cs b/src/Managers/Visual.cs index 99f3f7e..e816f0b 100644 --- a/src/Managers/Visual.cs +++ b/src/Managers/Visual.cs @@ -47,7 +47,7 @@ public record PrefabInfo(PrefabType type, string name, List visu public record VisualPartInfo( string gameObjectName, string baseName, - Quaternion rotation, + float rotation = 0f, Vector2 coordinates = new Vector2(), Vector2 scale = new Vector2(), bool tintable = false