From d7eec7742da39b1e920edf1d70f8f69a646d3638 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 24 May 2025 16:42:12 +0200 Subject: [PATCH] Added something --- src/Loader.cs | 29 ++++++++++- src/Managers/Main.cs | 112 ++++++++++++++++++++++++++++++++++++++++- src/Managers/Visual.cs | 3 +- src/Registry.cs | 1 + 4 files changed, 140 insertions(+), 5 deletions(-) diff --git a/src/Loader.cs b/src/Loader.cs index 80e6b63..e01c0a1 100644 --- a/src/Loader.cs +++ b/src/Loader.cs @@ -334,12 +334,12 @@ public static void UpdateSprite(string name) } } - Plugin.logger.LogInfo($"Registered sprite data from {mod.id} mod"); + Plugin.logger.LogInfo($"Registered sprite info from {mod.id} mod"); return deserialized; } catch (Exception e) { - Plugin.logger.LogError($"Error on loading sprite data from {mod.id} mod: {e.Message}"); + Plugin.logger.LogError($"Error on loading sprite info from {mod.id} mod: {e.Message}"); return null; } } @@ -353,6 +353,31 @@ 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); + 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 void LoadGameLogicDataPatch(Mod mod, JObject gld, JObject patch) { try diff --git a/src/Managers/Main.cs b/src/Managers/Main.cs index 87ebdba..4e558e0 100644 --- a/src/Managers/Main.cs +++ b/src/Managers/Main.cs @@ -10,6 +10,7 @@ using UnityEngine; namespace PolyMod.Managers; + public static class Main { internal const int MAX_TECH_TIER = 100; @@ -179,8 +180,8 @@ private static void GameModeScreen_Init(GameModeScreen __instance) [HarmonyPrefix] [HarmonyPatch(typeof(TechView), nameof(TechView.CreateNode))] - public static bool TechView_CreateNode(TechView __instance, TechData data, TechItem parentItem, float angle) - { + public static bool TechView_CreateNode(TechView __instance, TechData data, TechItem parentItem, float angle) + { GameLogicData gameLogicData = GameManager.GameState.GameLogicData; TribeData tribeData = gameLogicData.GetTribeData(GameManager.LocalPlayer.tribe); float baseAngle = 360 / gameLogicData.GetOverride(gameLogicData.GetTechData(TechData.Type.Basic), tribeData).techUnlocks.Count; @@ -358,6 +359,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)) { @@ -380,5 +389,104 @@ internal static void Load(JObject gameLogicdata) } stopwatch.Stop(); Plugin.logger.LogInfo($"Loaded all mods in {stopwatch.ElapsedMilliseconds}ms"); + Unit baseUnit = PrefabManager.units[GetSkinnedHashKey(2, SkinType.Default)]; + if (baseUnit != null) + { + foreach (System.Collections.Generic.KeyValuePair valuePair in Registry.prefabInfos) + { + Console.Write(valuePair.Key); + PolyMod.Managers.Visual.PrefabInfo info = valuePair.Value; + SkinVisualsReference? skinComp = baseUnit.GetComponent(); + if (skinComp != null) + { + Transform head = KeepOnlyChildByName(baseUnit.transform, "Head"); + skinComp.visualParts = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray(1); + SkinVisualsReference.VisualPart visualPart = new SkinVisualsReference.VisualPart(); + visualPart.DefaultSpriteName = "head"; + visualPart.visualPart = head.gameObject; + skinComp.visualParts[0] = visualPart; + PrefabManager.units[GetSkinnedHashKey(53, SkinType.Default)] = baseUnit; + } + } + } + else + { + Console.Write("NULLLLLLLL"); + } + } + + public static Transform KeepOnlyChildByName(Transform parent, string nameToKeep) + { + Console.Write("0"); + var spriteContainer = parent.GetChild(0); + Console.Write("1"); + int childCount = spriteContainer.childCount; + Transform? toReturn = null; + for (int i = 0; i < childCount; i++) + { + var child = spriteContainer.GetChild(i); + Console.Write(child.gameObject.name); + if (child.gameObject.name != nameToKeep) + { + GameObject.Destroy(child.gameObject); + } + else + { + toReturn = child.transform; + } + } + return toReturn; + } + + private static void GetTypeAndSkin(int hash, out int type, out SkinType skin) + { + skin = (SkinType)(hash / 1000); + type = hash % 1000; + } + + private static int GetSkinnedHashKey(int type, SkinType skin) + { + return type + ((int)skin * 1000); + } + + public static void GetPrefabTree(Transform transform, int depth) + { + if (transform == null) return; + + GameObject obj = transform.gameObject; + string indent = new string(' ', depth * 2); + Console.WriteLine($"{indent}GameObject: {obj.name}"); + + var components = obj.GetComponents(); + foreach (var comp in components) + { + if (comp == null) continue; + + var typeName = comp.GetIl2CppType().Name; + + if (typeName == "SkinVisualsReference") + { + SkinVisualsReference? skinComp = comp.TryCast(); + if (skinComp != null) + { + Console.WriteLine($"{indent}- Component: {typeName}"); + foreach (SkinVisualsReference.VisualPart part in skinComp.visualParts) + { + if (part.visualPart == null) continue; + Console.WriteLine($"{indent}- VS: {part.visualPart.GetIl2CppType().Name}"); + Console.WriteLine($"{indent}- VS: {part.DefaultSpriteName}"); + Console.WriteLine($"{indent}- VS: {part.visualPart.transform.position}"); + part.visualPart.transform.position = new Vector3(0, 0, 0); + } + } + } + } + + int childCount = transform.childCount; + for (int i = 0; i < childCount; i++) + { + var child = transform.GetChild(i); + GetPrefabTree(child, depth + 1); + } } } diff --git a/src/Managers/Visual.cs b/src/Managers/Visual.cs index 620c9c6..fde1cbb 100644 --- a/src/Managers/Visual.cs +++ b/src/Managers/Visual.cs @@ -32,6 +32,8 @@ public class PreviewTile } public record SpriteInfo(float? pixelsPerUnit, Vector2? pivot); public record SkinInfo(int idx, string id, SkinData? skinData); + public record PrefabInfo(string type, string name, List visualParts); + public record VisualPartInfo(string baseName, Vector3 coordinates); public static Dictionary basicPopupWidths = new(); private static bool firstTimeOpeningPreview = true; private static UnitData.Type currentUnitTypeUI = UnitData.Type.None; @@ -94,7 +96,6 @@ void GetAtlas(SpriteAtlas spriteAtlas) private static void SpriteAtlasManager_DoSpriteLookup(ref SpriteAtlasManager.SpriteLookupResult __result, SpriteAtlasManager __instance, string baseName, TribeData.Type tribe, SkinType skin, bool checkForOutline, int level) { baseName = Util.FormatSpriteName(baseName); - Sprite? sprite = Registry.GetSprite(baseName, Util.GetStyle(tribe, skin), level); if (sprite != null) __result.sprite = sprite; diff --git a/src/Registry.cs b/src/Registry.cs index 8b74429..0e16c5f 100644 --- a/src/Registry.cs +++ b/src/Registry.cs @@ -13,6 +13,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();