Enable nullable reference types
This commit is contained in:
		
							parent
							
								
									0573091162
								
							
						
					
					
						commit
						6a0be0d780
					
				|  | @ -7,6 +7,7 @@ | |||
|         <Version>13.37.1337</Version> | ||||
|         <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||||
|         <LangVersion>latest</LangVersion> | ||||
|         <Nullable>enable</Nullable> | ||||
| 
 | ||||
|         <!-- Prevent Publicizer Warnings from Showing --> | ||||
|         <NoWarn>$(NoWarn);CS0436</NoWarn> | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ namespace MuzikaGromche | |||
|     [LobbyCompatibility(CompatibilityLevel.Everyone, VersionStrictness.Patch)] | ||||
|     public class Plugin : BaseUnityPlugin | ||||
|     { | ||||
|         internal new static Config Config { get; private set; } = null; | ||||
|         internal new static Config Config { get; private set; } = null!; | ||||
| 
 | ||||
|         private static readonly string[] PwnLyricsVariants = [ | ||||
|             "", "", "", // make sure the array has enough items to index it without checking | ||||
|  | @ -480,8 +480,8 @@ namespace MuzikaGromche | |||
|             return tracks[trackId]; | ||||
|         } | ||||
| 
 | ||||
|         public static Track CurrentTrack; | ||||
|         public static BeatTimeState BeatTimeState; | ||||
|         public static Track? CurrentTrack; | ||||
|         public static BeatTimeState? BeatTimeState; | ||||
| 
 | ||||
|         public static void SetLightColor(Color color) | ||||
|         { | ||||
|  | @ -624,16 +624,16 @@ namespace MuzikaGromche | |||
| 
 | ||||
|     public class Track | ||||
|     { | ||||
|         public string Name; | ||||
|         public required string Name; | ||||
|         // Language of the track's lyrics. | ||||
|         public Language Language; | ||||
|         public required Language Language; | ||||
|         // Whether this track has NSFW/explicit lyrics. | ||||
|         public bool IsExplicit = false; | ||||
|         // Wind-up time can and should be shorter than the Start audio track, | ||||
|         // so that the "pop" effect can be baked into the Start audio and kept away | ||||
|         // from the looped part. This also means that the light show starts before | ||||
|         // the looped track does, so we need to sync them up as soon as we enter the Loop. | ||||
|         public float WindUpTimer; | ||||
|         public required float WindUpTimer; | ||||
| 
 | ||||
|         // Estimated number of beats per minute. Not used for light show, but might come in handy. | ||||
|         public float Bpm => 60f / (LoadedLoop.length / Beats); | ||||
|  | @ -655,11 +655,11 @@ namespace MuzikaGromche | |||
|         // WAV is OK, but takes a lot of space. Try OGGVORBIS instead. | ||||
|         public AudioType AudioType = AudioType.MPEG; | ||||
| 
 | ||||
|         public AudioClip LoadedStart; | ||||
|         public AudioClip LoadedLoop; | ||||
|         public AudioClip LoadedStart = null!; | ||||
|         public AudioClip LoadedLoop = null!; | ||||
| 
 | ||||
|         // How often this track should be chosen, relative to the sum of weights of all tracks. | ||||
|         public SyncedEntry<int> Weight; | ||||
|         public SyncedEntry<int> Weight = null!; | ||||
| 
 | ||||
|         public string FileNameStart => $"{Name}Start.{Ext}"; | ||||
|         public string FileNameLoop => $"{Name}Loop.{Ext}"; | ||||
|  | @ -743,7 +743,7 @@ namespace MuzikaGromche | |||
|         // In such case, a random number chosen and updated once per loop | ||||
|         // is used to select an alternative. | ||||
|         // If the chosen alternative is an empty string, lyrics event shall be skipped. | ||||
|         public string[] LyricsLines { get; private set; } | ||||
|         public string[] LyricsLines { get; private set; } = []; | ||||
|         public (float, string)[] Lyrics | ||||
|         { | ||||
|             set | ||||
|  | @ -989,7 +989,7 @@ namespace MuzikaGromche | |||
| 
 | ||||
|         private float loopOffsetBeat = float.NegativeInfinity; | ||||
| 
 | ||||
|         private static System.Random lyricsRandom = null; | ||||
|         private static System.Random lyricsRandom = null!; | ||||
| 
 | ||||
|         private int lyricsRandomPerLoop; | ||||
| 
 | ||||
|  | @ -1140,7 +1140,7 @@ namespace MuzikaGromche | |||
|             return events; | ||||
|         } | ||||
| 
 | ||||
|         private SetLightsColorEvent GetColorEvent(BeatTimeSpan loopOffsetSpan, BeatTimestamp windUpOffsetTimestamp) | ||||
|         private SetLightsColorEvent? GetColorEvent(BeatTimeSpan loopOffsetSpan, BeatTimestamp windUpOffsetTimestamp) | ||||
|         { | ||||
|             if (FadeOut(loopOffsetSpan) is Color c1) | ||||
|             { | ||||
|  | @ -1403,26 +1403,26 @@ namespace MuzikaGromche | |||
| 
 | ||||
|     public class Config : SyncedConfig2<Config> | ||||
|     { | ||||
|         public static ConfigEntry<bool> EnableColorAnimations { get; private set; } | ||||
|         public static ConfigEntry<bool> EnableColorAnimations { get; private set; } = null!; | ||||
| 
 | ||||
|         public static ConfigEntry<bool> DisplayLyrics { get; private set; } | ||||
|         public static ConfigEntry<bool> DisplayLyrics { get; private set; } = null!; | ||||
| 
 | ||||
|         public static ConfigEntry<float> AudioOffset { get; private set; } | ||||
|         public static ConfigEntry<float> AudioOffset { get; private set; } = null!; | ||||
| 
 | ||||
|         public static ConfigEntry<bool> SkipExplicitTracks { get; private set; } | ||||
|         public static ConfigEntry<bool> SkipExplicitTracks { get; private set; } = null!; | ||||
| 
 | ||||
|         public static bool ShouldSkipWindingPhase { get; private set; } = false; | ||||
| 
 | ||||
|         public static Palette PaletteOverride { get; private set; } = null; | ||||
|         public static Palette? PaletteOverride { get; private set; } = null; | ||||
| 
 | ||||
|         public static float? FadeOutBeatOverride { get; private set; } = null; | ||||
|         public static float? FadeOutDurationOverride { get; private set; } = null; | ||||
|         public static float[] FlickerLightsTimeSeriesOverride { get; private set; } = null; | ||||
|         public static float[] LyricsTimeSeriesOverride { get; private set; } = null; | ||||
|         public static float[]? FlickerLightsTimeSeriesOverride { get; private set; } = null; | ||||
|         public static float[]? LyricsTimeSeriesOverride { get; private set; } = null; | ||||
|         public static float? BeatsOffsetOverride { get; private set; } = null; | ||||
|         public static float? ColorTransitionInOverride { get; private set; } = null; | ||||
|         public static float? ColorTransitionOutOverride { get; private set; } = null; | ||||
|         public static string ColorTransitionEasingOverride { get; private set; } = null; | ||||
|         public static string? ColorTransitionEasingOverride { get; private set; } = null; | ||||
| 
 | ||||
|         public Config(ConfigFile configFile) : base(PluginInfo.PLUGIN_GUID) | ||||
|         { | ||||
|  | @ -1559,7 +1559,7 @@ namespace MuzikaGromche | |||
|             const string section = "Palette"; | ||||
|             const int maxCustomPaletteSize = 8; | ||||
|             // Declare and initialize early to avoid "Use of unassigned local variable" | ||||
|             SyncedEntry<int> customPaletteSizeSyncedEntry = null; | ||||
|             SyncedEntry<int> customPaletteSizeSyncedEntry = null!; | ||||
|             var customPaletteSyncedEntries = new SyncedEntry<string>[maxCustomPaletteSize]; | ||||
| 
 | ||||
|             var loadButton = new GenericButtonConfigItem(section, "Load Palette from the Current Track", | ||||
|  | @ -1623,16 +1623,16 @@ namespace MuzikaGromche | |||
|             const string section = "Timings"; | ||||
|             var colorTransitionRange = new AcceptableValueRange<float>(0f, 1f); | ||||
|             // Declare and initialize early to avoid "Use of unassigned local variable" | ||||
|             List<(Action<Track> Load, Action Apply)> entries = []; | ||||
|             SyncedEntry<bool> overrideTimingsSyncedEntry = null; | ||||
|             SyncedEntry<float> fadeOutBeatSyncedEntry = null; | ||||
|             SyncedEntry<float> fadeOutDurationSyncedEntry = null; | ||||
|             SyncedEntry<string> flickerLightsTimeSeriesSyncedEntry = null; | ||||
|             SyncedEntry<string> lyricsTimeSeriesSyncedEntry = null; | ||||
|             SyncedEntry<float> beatsOffsetSyncedEntry = null; | ||||
|             SyncedEntry<float> colorTransitionInSyncedEntry = null; | ||||
|             SyncedEntry<float> colorTransitionOutSyncedEntry = null; | ||||
|             SyncedEntry<string> colorTransitionEasingSyncedEntry = null; | ||||
|             List<(Action<Track?> Load, Action Apply)> entries = []; | ||||
|             SyncedEntry<bool> overrideTimingsSyncedEntry = null!; | ||||
|             SyncedEntry<float> fadeOutBeatSyncedEntry = null!; | ||||
|             SyncedEntry<float> fadeOutDurationSyncedEntry = null!; | ||||
|             SyncedEntry<string> flickerLightsTimeSeriesSyncedEntry = null!; | ||||
|             SyncedEntry<string> lyricsTimeSeriesSyncedEntry = null!; | ||||
|             SyncedEntry<float> beatsOffsetSyncedEntry = null!; | ||||
|             SyncedEntry<float> colorTransitionInSyncedEntry = null!; | ||||
|             SyncedEntry<float> colorTransitionOutSyncedEntry = null!; | ||||
|             SyncedEntry<string> colorTransitionEasingSyncedEntry = null!; | ||||
| 
 | ||||
|             var loadButton = new GenericButtonConfigItem(section, "Load Timings from the Current Track", | ||||
|                 "Override custom timings with the built-in timings of the current track.", "Load", load); | ||||
|  | @ -1687,7 +1687,7 @@ namespace MuzikaGromche | |||
|                 CSyncHackAddSyncedEntry(syncedEntry); | ||||
|                 syncedEntry.SyncHostToLocal(); | ||||
|                 syncedEntry.Changed += (sender, args) => applier(); | ||||
|                 void loader(Track track) | ||||
|                 void loader(Track? track) | ||||
|                 { | ||||
|                     // if track is null, set everything to defaults | ||||
|                     syncedEntry.LocalValue = track == null ? (T)syncedEntry.Entry.DefaultValue : getter(track); | ||||
|  | @ -1697,9 +1697,9 @@ namespace MuzikaGromche | |||
| 
 | ||||
|             void registerStruct<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action<T?> setter) where T : struct => | ||||
|                 register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null)); | ||||
|             void registerClass<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action<T> setter) where T : class => | ||||
|             void registerClass<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action<T?> setter) where T : class => | ||||
|                 register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null)); | ||||
|             void registerArray<T>(SyncedEntry<string> syncedEntry, Func<Track, T[]> getter, Action<T[]> setter, Func<string, T> parser, bool sort = false) where T : struct => | ||||
|             void registerArray<T>(SyncedEntry<string> syncedEntry, Func<Track, T[]> getter, Action<T[]?> setter, Func<string, T> parser, bool sort = false) where T : struct => | ||||
|                 register(syncedEntry, | ||||
|                     (track) => string.Join(", ", getter(track)), | ||||
|                     () => | ||||
|  | @ -1713,7 +1713,7 @@ namespace MuzikaGromche | |||
|                         setter.Invoke(overrideTimingsSyncedEntry.Value ? values : null); | ||||
|                     }); | ||||
| 
 | ||||
|             T[] parseStringArray<T>(string str, Func<string, T> parser, bool sort = false) where T : struct | ||||
|             T[]? parseStringArray<T>(string str, Func<string, T> parser, bool sort = false) where T : struct | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|  | @ -1838,7 +1838,7 @@ namespace MuzikaGromche | |||
|                 __instance.farAudio = __state.farAudio; | ||||
| 
 | ||||
|                 var time = __instance.farAudio.time; | ||||
|                 var delay = Plugin.CurrentTrack.LoadedStart.length - time; | ||||
|                 var delay = Plugin.CurrentTrack!.LoadedStart.length - time; | ||||
| 
 | ||||
|                 // Override screamingSFX with Loop, delayed by the remaining time of the Start audio | ||||
|                 __instance.creatureVoice.Stop(); | ||||
|  | @ -1853,7 +1853,7 @@ namespace MuzikaGromche | |||
|             // Manage the timeline: switch color of the lights according to the current playback/beat position. | ||||
|             if (__instance.previousState == 1 || __instance.previousState == 2) | ||||
|             { | ||||
|                 var events = Plugin.BeatTimeState.Update(start: __instance.farAudio, loop: __instance.creatureVoice); | ||||
|                 var events = Plugin.BeatTimeState!.Update(start: __instance.farAudio, loop: __instance.creatureVoice); | ||||
|                 foreach (var ev in events) | ||||
|                 { | ||||
|                     switch (ev) | ||||
|  | @ -1906,7 +1906,7 @@ namespace MuzikaGromche | |||
| 
 | ||||
|     internal class State | ||||
|     { | ||||
|         public AudioSource farAudio; | ||||
|         public int previousState; | ||||
|         public required AudioSource farAudio; | ||||
|         public required int previousState; | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue