Skip to content

Commit d7eec77

Browse files
committed
Added something
1 parent 9262d6d commit d7eec77

4 files changed

Lines changed: 140 additions & 5 deletions

File tree

src/Loader.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,12 +334,12 @@ public static void UpdateSprite(string name)
334334
}
335335
}
336336

337-
Plugin.logger.LogInfo($"Registered sprite data from {mod.id} mod");
337+
Plugin.logger.LogInfo($"Registered sprite info from {mod.id} mod");
338338
return deserialized;
339339
}
340340
catch (Exception e)
341341
{
342-
Plugin.logger.LogError($"Error on loading sprite data from {mod.id} mod: {e.Message}");
342+
Plugin.logger.LogError($"Error on loading sprite info from {mod.id} mod: {e.Message}");
343343
return null;
344344
}
345345
}
@@ -353,6 +353,31 @@ public static void LoadAudioFile(Mod mod, Mod.File file)
353353
// TODO: issue #71
354354
}
355355

356+
public static void LoadPrefabInfoFile(Mod mod, Mod.File file)
357+
{
358+
try
359+
{
360+
string name = Path.GetFileNameWithoutExtension(file.name);
361+
var options = new JsonSerializerOptions
362+
{
363+
PropertyNameCaseInsensitive = true
364+
};
365+
366+
Visual.PrefabInfo? prefab = JsonSerializer.Deserialize<Visual.PrefabInfo>(file.bytes, options);
367+
368+
if (prefab != null)
369+
{
370+
Console.WriteLine(prefab);
371+
Registry.prefabInfos.Add(name, prefab);
372+
Plugin.logger.LogInfo($"Registered prefab info from {mod.id} mod");
373+
}
374+
}
375+
catch (Exception e)
376+
{
377+
Plugin.logger.LogError($"Error on loading prefab info from {mod.id} mod: {e.Message}");
378+
}
379+
}
380+
356381
public static void LoadGameLogicDataPatch(Mod mod, JObject gld, JObject patch)
357382
{
358383
try

src/Managers/Main.cs

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using UnityEngine;
1111

1212
namespace PolyMod.Managers;
13+
1314
public static class Main
1415
{
1516
internal const int MAX_TECH_TIER = 100;
@@ -179,8 +180,8 @@ private static void GameModeScreen_Init(GameModeScreen __instance)
179180

180181
[HarmonyPrefix]
181182
[HarmonyPatch(typeof(TechView), nameof(TechView.CreateNode))]
182-
public static bool TechView_CreateNode(TechView __instance, TechData data, TechItem parentItem, float angle)
183-
{
183+
public static bool TechView_CreateNode(TechView __instance, TechData data, TechItem parentItem, float angle)
184+
{
184185
GameLogicData gameLogicData = GameManager.GameState.GameLogicData;
185186
TribeData tribeData = gameLogicData.GetTribeData(GameManager.LocalPlayer.tribe);
186187
float baseAngle = 360 / gameLogicData.GetOverride(gameLogicData.GetTechData(TechData.Type.Basic), tribeData).techUnlocks.Count;
@@ -358,6 +359,14 @@ internal static void Load(JObject gameLogicdata)
358359
);
359360
continue;
360361
}
362+
if (Regex.IsMatch(Path.GetFileName(file.name), @"^prefab(_.*)?\.json$"))
363+
{
364+
Loader.LoadPrefabInfoFile(
365+
mod,
366+
file
367+
);
368+
continue;
369+
}
361370

362371
switch (Path.GetExtension(file.name))
363372
{
@@ -380,5 +389,104 @@ internal static void Load(JObject gameLogicdata)
380389
}
381390
stopwatch.Stop();
382391
Plugin.logger.LogInfo($"Loaded all mods in {stopwatch.ElapsedMilliseconds}ms");
392+
Unit baseUnit = PrefabManager.units[GetSkinnedHashKey(2, SkinType.Default)];
393+
if (baseUnit != null)
394+
{
395+
foreach (System.Collections.Generic.KeyValuePair<string, PolyMod.Managers.Visual.PrefabInfo> valuePair in Registry.prefabInfos)
396+
{
397+
Console.Write(valuePair.Key);
398+
PolyMod.Managers.Visual.PrefabInfo info = valuePair.Value;
399+
SkinVisualsReference? skinComp = baseUnit.GetComponent<SkinVisualsReference>();
400+
if (skinComp != null)
401+
{
402+
Transform head = KeepOnlyChildByName(baseUnit.transform, "Head");
403+
skinComp.visualParts = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray<SkinVisualsReference.VisualPart>(1);
404+
SkinVisualsReference.VisualPart visualPart = new SkinVisualsReference.VisualPart();
405+
visualPart.DefaultSpriteName = "head";
406+
visualPart.visualPart = head.gameObject;
407+
skinComp.visualParts[0] = visualPart;
408+
PrefabManager.units[GetSkinnedHashKey(53, SkinType.Default)] = baseUnit;
409+
}
410+
}
411+
}
412+
else
413+
{
414+
Console.Write("NULLLLLLLL");
415+
}
416+
}
417+
418+
public static Transform KeepOnlyChildByName(Transform parent, string nameToKeep)
419+
{
420+
Console.Write("0");
421+
var spriteContainer = parent.GetChild(0);
422+
Console.Write("1");
423+
int childCount = spriteContainer.childCount;
424+
Transform? toReturn = null;
425+
for (int i = 0; i < childCount; i++)
426+
{
427+
var child = spriteContainer.GetChild(i);
428+
Console.Write(child.gameObject.name);
429+
if (child.gameObject.name != nameToKeep)
430+
{
431+
GameObject.Destroy(child.gameObject);
432+
}
433+
else
434+
{
435+
toReturn = child.transform;
436+
}
437+
}
438+
return toReturn;
439+
}
440+
441+
private static void GetTypeAndSkin(int hash, out int type, out SkinType skin)
442+
{
443+
skin = (SkinType)(hash / 1000);
444+
type = hash % 1000;
445+
}
446+
447+
private static int GetSkinnedHashKey(int type, SkinType skin)
448+
{
449+
return type + ((int)skin * 1000);
450+
}
451+
452+
public static void GetPrefabTree(Transform transform, int depth)
453+
{
454+
if (transform == null) return;
455+
456+
GameObject obj = transform.gameObject;
457+
string indent = new string(' ', depth * 2);
458+
Console.WriteLine($"{indent}GameObject: {obj.name}");
459+
460+
var components = obj.GetComponents<Component>();
461+
foreach (var comp in components)
462+
{
463+
if (comp == null) continue;
464+
465+
var typeName = comp.GetIl2CppType().Name;
466+
467+
if (typeName == "SkinVisualsReference")
468+
{
469+
SkinVisualsReference? skinComp = comp.TryCast<SkinVisualsReference>();
470+
if (skinComp != null)
471+
{
472+
Console.WriteLine($"{indent}- Component: {typeName}");
473+
foreach (SkinVisualsReference.VisualPart part in skinComp.visualParts)
474+
{
475+
if (part.visualPart == null) continue;
476+
Console.WriteLine($"{indent}- VS: {part.visualPart.GetIl2CppType().Name}");
477+
Console.WriteLine($"{indent}- VS: {part.DefaultSpriteName}");
478+
Console.WriteLine($"{indent}- VS: {part.visualPart.transform.position}");
479+
part.visualPart.transform.position = new Vector3(0, 0, 0);
480+
}
481+
}
482+
}
483+
}
484+
485+
int childCount = transform.childCount;
486+
for (int i = 0; i < childCount; i++)
487+
{
488+
var child = transform.GetChild(i);
489+
GetPrefabTree(child, depth + 1);
490+
}
383491
}
384492
}

src/Managers/Visual.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class PreviewTile
3232
}
3333
public record SpriteInfo(float? pixelsPerUnit, Vector2? pivot);
3434
public record SkinInfo(int idx, string id, SkinData? skinData);
35+
public record PrefabInfo(string type, string name, List<VisualPartInfo> visualParts);
36+
public record VisualPartInfo(string baseName, Vector3 coordinates);
3537
public static Dictionary<int, int> basicPopupWidths = new();
3638
private static bool firstTimeOpeningPreview = true;
3739
private static UnitData.Type currentUnitTypeUI = UnitData.Type.None;
@@ -94,7 +96,6 @@ void GetAtlas(SpriteAtlas spriteAtlas)
9496
private static void SpriteAtlasManager_DoSpriteLookup(ref SpriteAtlasManager.SpriteLookupResult __result, SpriteAtlasManager __instance, string baseName, TribeData.Type tribe, SkinType skin, bool checkForOutline, int level)
9597
{
9698
baseName = Util.FormatSpriteName(baseName);
97-
9899
Sprite? sprite = Registry.GetSprite(baseName, Util.GetStyle(tribe, skin), level);
99100
if (sprite != null)
100101
__result.sprite = sprite;

src/Registry.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public static class Registry
1313
internal static Dictionary<string, Mod> mods = new();
1414
public static Dictionary<string, Visual.PreviewTile[]> tribePreviews = new();
1515
public static Dictionary<string, Visual.SpriteInfo> spriteInfos = new();
16+
public static Dictionary<string, Visual.PrefabInfo> prefabInfos = new();
1617
public static Dictionary<string, AssetBundle> assetBundles = new();
1718
public static List<TribeData.Type> customTribes = new();
1819
public static List<Visual.SkinInfo> skinInfo = new();

0 commit comments

Comments
 (0)