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