Add Animator and Audio to MineshaftStartTile
This commit is contained in:
		
							parent
							
								
									f131ad7148
								
							
						
					
					
						commit
						05749ff122
					
				|  | @ -11,9 +11,15 @@ namespace MuzikaGromche | |||
| { | ||||
|     static class PoweredLightsAnimators | ||||
|     { | ||||
|         private const string PoweredLightTag = "PoweredLight"; | ||||
| 
 | ||||
|         private delegate void ManualPatch(GameObject animatorContainer); | ||||
| 
 | ||||
|         private readonly record struct AnimatorPatch(string AnimatorContainerPath, RuntimeAnimatorController AnimatorController, ManualPatch? ManualPatch); | ||||
|         private readonly record struct AnimatorPatch( | ||||
|             string AnimatorContainerPath, | ||||
|             RuntimeAnimatorController AnimatorController, | ||||
|             bool AddTagAndAnimator, | ||||
|             ManualPatch? ManualPatch); | ||||
| 
 | ||||
|         private readonly record struct TilePatch(string TileName, AnimatorPatch[] Patches) | ||||
|         { | ||||
|  | @ -21,13 +27,17 @@ namespace MuzikaGromche | |||
|             public readonly string TileCloneName = $"{TileName}(Clone)"; | ||||
|         } | ||||
| 
 | ||||
|         private readonly record struct AnimatorPatchDescriptor(string AnimatorContainerPath, string AnimatorControllerAssetPath, ManualPatch? ManualPatch = null) | ||||
|         private readonly record struct AnimatorPatchDescriptor( | ||||
|             string AnimatorContainerPath, | ||||
|             string AnimatorControllerAssetPath, | ||||
|             bool AddTagAndAnimator = false, | ||||
|             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, ManualPatch); | ||||
|                 return new(AnimatorContainerPath, animationController, AddTagAndAnimator, ManualPatch); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -47,6 +57,10 @@ namespace MuzikaGromche | |||
| 
 | ||||
|         private static IDictionary<string, TilePatch> Patches = new Dictionary<string, TilePatch>(); | ||||
| 
 | ||||
|         private static AudioClip AudioClipOn = null!; | ||||
|         private static AudioClip AudioClipOff = null!; | ||||
|         private static AudioClip AudioClipFlicker = null!; | ||||
| 
 | ||||
|         public static void Load() | ||||
|         { | ||||
|             const string BundleFileName = "muzikagromche_poweredlightsanimators"; | ||||
|  | @ -54,6 +68,10 @@ namespace MuzikaGromche | |||
|             var assetBundle = AssetBundle.LoadFromFile(bundlePath) | ||||
|                 ?? throw new NullReferenceException("Failed to load bundle"); | ||||
| 
 | ||||
|             AudioClipOn = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightOn.ogg"); | ||||
|             AudioClipOff = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightOff.ogg"); | ||||
|             AudioClipFlicker = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightFlicker.ogg"); | ||||
| 
 | ||||
|             const string BasePath = "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/"; | ||||
| 
 | ||||
|             const string PointLight4 = $"{BasePath}Point Light (4) (Patched).controller"; | ||||
|  | @ -61,6 +79,7 @@ namespace MuzikaGromche | |||
|             const string LightbulbsLine = $"{BasePath}lightbulbsLineMesh (Patched).controller"; | ||||
|             const string CeilingFan = $"{BasePath}CeilingFan (originally GameObject) (Patched).controller"; | ||||
|             const string LEDHangingLight = $"{BasePath}LEDHangingLight (Patched).controller"; | ||||
|             const string MineshaftStartTileSpotlight = $"{BasePath}MineshaftStartTileSpotlight (New).controller"; | ||||
| 
 | ||||
|             TilePatchDescriptor[] descriptors = | ||||
|             [ | ||||
|  | @ -98,13 +117,17 @@ namespace MuzikaGromche | |||
|                     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")), | ||||
|                         ManualPatch: RenameGameObjectPatch("IndirectLight (1)", "IndirectLight")), | ||||
|                 ]), | ||||
|                 new("PoolTile", [ | ||||
|                     new("PoolLights/HangingLEDBarLight", LEDHangingLight), | ||||
|                     new("PoolLights/HangingLEDBarLight (4)", LEDHangingLight), | ||||
|                     new("PoolLights/HangingLEDBarLight (5)", LEDHangingLight), | ||||
|                 ]), | ||||
|                 new("MineshaftStartTile", [ | ||||
|                     new("Cylinder.001 (1)", MineshaftStartTileSpotlight, AddTagAndAnimator: true), | ||||
|                     new("Cylinder.001 (2)", MineshaftStartTileSpotlight, AddTagAndAnimator: true), | ||||
|                 ]), | ||||
|             ]; | ||||
| 
 | ||||
|             Patches = descriptors | ||||
|  | @ -134,7 +157,41 @@ namespace MuzikaGromche | |||
| #pragma warning restore CS0162 // Unreachable code detected | ||||
|                     } | ||||
| 
 | ||||
|                     var animator = animationContainerTransform.gameObject.GetComponent<Animator>(); | ||||
|                     GameObject animationContainer = animationContainerTransform.gameObject; | ||||
|                     Animator animator = animationContainer.GetComponent<Animator>(); | ||||
| 
 | ||||
|                     if (patch.AddTagAndAnimator) | ||||
|                     { | ||||
|                         animationContainer.tag = PoweredLightTag; | ||||
|                         if (animator == null) | ||||
|                         { | ||||
|                             animator = animationContainer.AddComponent<Animator>(); | ||||
|                         } | ||||
|                         if (!animationContainer.TryGetComponent<PlayAudioAnimationEvent>(out var audioScript)) | ||||
|                         { | ||||
|                             audioScript = animationContainer.AddComponent<PlayAudioAnimationEvent>(); | ||||
|                             audioScript.audioClip = AudioClipOn; | ||||
|                             audioScript.audioClip2 = AudioClipOff; | ||||
|                             audioScript.audioClip3 = AudioClipFlicker; | ||||
|                         } | ||||
|                         if (!animationContainer.TryGetComponent<AudioSource>(out var audioSource)) | ||||
|                         { | ||||
|                             // Copy from an existing AudioSource of another light animator | ||||
|                             var otherSource = tile.gameObject.GetComponentInChildren<AudioSource>(); | ||||
|                             if (otherSource != null) | ||||
|                             { | ||||
|                                 audioSource = animationContainer.AddComponent<AudioSource>(); | ||||
|                                 audioSource.spatialBlend = 1; | ||||
|                                 audioSource.playOnAwake = false; | ||||
|                                 audioSource.outputAudioMixerGroup = otherSource.outputAudioMixerGroup; | ||||
|                                 audioSource.spread = otherSource.spread; | ||||
|                                 audioSource.rolloffMode = otherSource.rolloffMode; | ||||
|                                 audioSource.maxDistance = otherSource.maxDistance; | ||||
|                                 audioSource.SetCustomCurve(AudioSourceCurveType.CustomRolloff, otherSource.GetCustomCurve(AudioSourceCurveType.CustomRolloff)); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (animator == null) | ||||
|                     { | ||||
| #if DEBUG | ||||
|  | @ -145,7 +202,7 @@ namespace MuzikaGromche | |||
| #pragma warning restore CS0162 // Unreachable code detected | ||||
|                     } | ||||
| 
 | ||||
|                     patch.ManualPatch?.Invoke(animationContainerTransform.gameObject); | ||||
|                     patch.ManualPatch?.Invoke(animationContainer); | ||||
| 
 | ||||
|                     animator.runtimeAnimatorController = patch.AnimatorController; | ||||
|                     Debug.Log($"{nameof(MuzikaGromche)} {nameof(PoweredLightsAnimatorsPatch)} {tilePatch.TileName}/{patch.AnimatorContainerPath}: Replaced animator controller"); | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue