diff --git a/MuzikaGromche/Plugin.cs b/MuzikaGromche/Plugin.cs index 550f8d1..4a31d81 100644 --- a/MuzikaGromche/Plugin.cs +++ b/MuzikaGromche/Plugin.cs @@ -1334,6 +1334,7 @@ namespace MuzikaGromche const string section = "Timings"; var colorTransitionRange = new AcceptableValueRange(0f, 1f); // Declare and initialize early to avoid "Use of unassigned local variable" + List<(Action Load, Action Apply)> entries = []; SyncedEntry overrideTimingsSyncedEntry = null; SyncedEntry beatsOffsetSyncedEntry = null; SyncedEntry colorTransitionInSyncedEntry = null; @@ -1379,56 +1380,43 @@ namespace MuzikaGromche CanModifyCallback = CanModifyIfHost, })); - CSyncHackAddSyncedEntry(beatsOffsetSyncedEntry); - CSyncHackAddSyncedEntry(colorTransitionInSyncedEntry); - CSyncHackAddSyncedEntry(colorTransitionOutSyncedEntry); - CSyncHackAddSyncedEntry(colorTransitionEasingSyncedEntry); + registerStruct(beatsOffsetSyncedEntry, t => t._BeatsOffset, x => BeatsOffsetOverride = x); + registerStruct(colorTransitionInSyncedEntry, t => t._ColorTransitionIn, x => ColorTransitionInOverride = x); + registerStruct(colorTransitionOutSyncedEntry, t => t._ColorTransitionOut, x => ColorTransitionOutOverride = x); + registerClass(colorTransitionEasingSyncedEntry, t => t._ColorTransitionEasing.Name, x => ColorTransitionEasingOverride = x); - beatsOffsetSyncedEntry.SyncHostToLocal(); - colorTransitionInSyncedEntry.SyncHostToLocal(); - colorTransitionOutSyncedEntry.SyncHostToLocal(); - colorTransitionEasingSyncedEntry.SyncHostToLocal(); + void register(SyncedEntry syncedEntry, Func getter, Action applier) + { + CSyncHackAddSyncedEntry(syncedEntry); + syncedEntry.SyncHostToLocal(); + syncedEntry.Changed += (sender, args) => applier(); + void loader(Track track) + { + // if track is null, set everything to defaults + syncedEntry.LocalValue = track == null ? (T)syncedEntry.Entry.DefaultValue : getter(track); + } + entries.Add((loader, applier)); + } - beatsOffsetSyncedEntry.Changed += (sender, args) => apply(); - colorTransitionInSyncedEntry.Changed += (sender, args) => apply(); - colorTransitionOutSyncedEntry.Changed += (sender, args) => apply(); - colorTransitionEasingSyncedEntry.Changed += (sender, args) => apply(); + void registerStruct(SyncedEntry syncedEntry, Func getter, Action setter) where T: struct => + register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null)); + void registerClass(SyncedEntry syncedEntry, Func getter, Action setter) where T: class => + register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null)); void load() { - // if track is null, set everything to defaults var track = Plugin.CurrentTrack; - if (track == null) + foreach (var entry in entries) { - beatsOffsetSyncedEntry.LocalValue = 0f; - colorTransitionInSyncedEntry.LocalValue = 0f; - colorTransitionOutSyncedEntry.LocalValue = 0f; - colorTransitionEasingSyncedEntry.LocalValue = Easing.Linear.Name; - } - else - { - beatsOffsetSyncedEntry.LocalValue = track._BeatsOffset; - colorTransitionInSyncedEntry.LocalValue = track._ColorTransitionIn; - colorTransitionOutSyncedEntry.LocalValue = track._ColorTransitionOut; - colorTransitionEasingSyncedEntry.LocalValue = track._ColorTransitionEasing.Name; + entry.Load(track); } } void apply() { - if (!overrideTimingsSyncedEntry.Value) + foreach (var entry in entries) { - BeatsOffsetOverride = null; - ColorTransitionInOverride = null; - ColorTransitionOutOverride = null; - ColorTransitionEasingOverride = null; - } - else - { - BeatsOffsetOverride = beatsOffsetSyncedEntry.Value; - ColorTransitionInOverride = colorTransitionInSyncedEntry.Value; - ColorTransitionOutOverride = colorTransitionOutSyncedEntry.Value; - ColorTransitionEasingOverride = colorTransitionEasingSyncedEntry.Value; + entry.Apply(); } } }