diff --git a/MuzikaGromche/PoweredLightsAnimators.cs b/MuzikaGromche/PoweredLightsAnimators.cs index ae280df..9616e34 100644 --- a/MuzikaGromche/PoweredLightsAnimators.cs +++ b/MuzikaGromche/PoweredLightsAnimators.cs @@ -11,7 +11,9 @@ namespace MuzikaGromche { internal class PoweredLightsAnimators { - private readonly record struct AnimatorPatch(string AnimatorContainerPath, RuntimeAnimatorController AnimatorController); + private delegate void ManualPatch(GameObject animatorContainer); + + private readonly record struct AnimatorPatch(string AnimatorContainerPath, RuntimeAnimatorController AnimatorController, ManualPatch? ManualPatch); private readonly record struct TilePatch(string TileName, AnimatorPatch[] Patches) { @@ -19,13 +21,13 @@ namespace MuzikaGromche public readonly string TileCloneName = $"{TileName}(Clone)"; } - private readonly record struct AnimatorPatchDescriptor(string AnimatorContainerPath, string AnimatorControllerAssetPath) + private readonly record struct AnimatorPatchDescriptor(string AnimatorContainerPath, string AnimatorControllerAssetPath, ManualPatch? ManualPatch = null) { public AnimatorPatch Load(AssetBundle assetBundle) { var animationController = assetBundle.LoadAsset(AnimatorControllerAssetPath) ?? throw new FileNotFoundException($"RuntimeAnimatorController not found: {AnimatorControllerAssetPath}", AnimatorControllerAssetPath); - return new(AnimatorContainerPath, animationController); + return new(AnimatorContainerPath, animationController, ManualPatch); } } @@ -58,6 +60,7 @@ namespace MuzikaGromche const string MineshaftSpotlight = $"{BasePath}MineshaftSpotlight (Patched).controller"; const string LightbulbsLine = $"{BasePath}lightbulbsLineMesh (Patched).controller"; const string CeilingFan = $"{BasePath}CeilingFan (originally GameObject) (Patched).controller"; + const string LEDHangingLight = $"{BasePath}LEDHangingLight (Patched).controller"; TilePatchDescriptor[] descriptors = [ @@ -87,6 +90,17 @@ namespace MuzikaGromche new("CeilingFanAnimContainer", CeilingFan), new("MineshaftSpotlight (1)", MineshaftSpotlight), ]), + new("GarageTile", [ + new("HangingLEDBarLight (3)", LEDHangingLight), + new("HangingLEDBarLight (4)", LEDHangingLight, + // This HangingLEDBarLight's IndirectLight is wrongly named, so animator couldn't find it + RenameGameObjectPatch("IndirectLight (1)", "IndirectLight")), + ]), + new("PoolTile", [ + new("PoolLights/HangingLEDBarLight", LEDHangingLight), + new("PoolLights/HangingLEDBarLight (4)", LEDHangingLight), + new("PoolLights/HangingLEDBarLight (5)", LEDHangingLight), + ]), ]; Patches = descriptors @@ -127,11 +141,29 @@ namespace MuzikaGromche #pragma warning restore CS0162 // Unreachable code detected } + patch.ManualPatch?.Invoke(animationContainerTransform.gameObject); + animator.runtimeAnimatorController = patch.AnimatorController; Debug.Log($"{nameof(MuzikaGromche)} {nameof(PoweredLightsAnimatorsPatch)} {tilePatch.TileName}/{patch.AnimatorContainerPath}: Replaced animator controller"); } } } + + private static ManualPatch RenameGameObjectPatch(string relativePath, string newName) => animatorContainer => + { + var targetObject = animatorContainer.transform.Find(relativePath)?.gameObject; + if (targetObject == null) + { +#if DEBUG + throw new NullReferenceException($"{animatorContainer.name}/{relativePath}: GameObject not found!"); +#endif +#pragma warning disable CS0162 // Unreachable code detected + return; +#pragma warning restore CS0162 // Unreachable code detected + } + targetObject.name = newName; + Debug.Log($"{nameof(MuzikaGromche)} {nameof(PoweredLightsAnimatorsPatch)} {animatorContainer.name}/{relativePath}: Renamed GameObject"); + }; } [HarmonyPatch(typeof(Tile))] diff --git a/MuzikaGromche/UnityAssets/muzikagromche_poweredlightsanimators b/MuzikaGromche/UnityAssets/muzikagromche_poweredlightsanimators index c425ab2..d420618 100644 Binary files a/MuzikaGromche/UnityAssets/muzikagromche_poweredlightsanimators and b/MuzikaGromche/UnityAssets/muzikagromche_poweredlightsanimators differ