forked from nikita/muzika-gromche
Fix LEDHangingLight (GarageTile & PoolTile) lights flickering
This commit is contained in:
parent
4d84a2d001
commit
78370da460
|
@ -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<RuntimeAnimatorController>(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))]
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue