1- using LabExtended . Attributes ;
2-
3- using Mirror ;
4-
5- using UserSettings . ServerSpecific ;
6-
7- using LabExtended . API . Settings . Menus ;
8- using LabExtended . API . Settings . Interfaces ;
9-
1+ using LabApi . Loader ;
102using LabExtended . API . Settings . Entries ;
113using LabExtended . API . Settings . Entries . Buttons ;
124using LabExtended . API . Settings . Entries . Dropdown ;
13-
5+ using LabExtended . API . Settings . Interfaces ;
6+ using LabExtended . API . Settings . Menus ;
7+ using LabExtended . Attributes ;
148using LabExtended . Core ;
9+ using LabExtended . Core . Pooling . Pools ;
1510using LabExtended . Events ;
1611using LabExtended . Extensions ;
17-
12+ using LabExtended . Patches . Functions . Settings ;
13+ using Mirror ;
1814using NorthwoodLib . Pools ;
15+ using System . Reflection ;
16+ using UserSettings . ServerSpecific ;
1917
2018#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
2119#pragma warning disable CS8602 // Dereference of a possibly null reference.
@@ -32,6 +30,11 @@ public static class SettingsManager
3230 /// </summary>
3331 public static List < SettingsBuilder > AllBuilders { get ; } = new ( ) ;
3432
33+ /// <summary>
34+ /// Gets a dictionary of DefinedSettings for each Plugin Assembly
35+ /// </summary>
36+ public static Dictionary < Assembly , ServerSpecificSettingBase [ ] > GlobalSettingsByAssembly { get ; } = new ( ) ;
37+
3538 /// <summary>
3639 /// Gets or sets the server-side settings version.
3740 /// </summary>
@@ -48,10 +51,62 @@ public static int Version
4851 /// <exception cref="ArgumentNullException"></exception>
4952 public static void SyncEntries ( this ExPlayer player )
5053 {
51- if ( player ? . ReferenceHub == null )
54+ if ( player is null )
5255 throw new ArgumentNullException ( nameof ( player ) ) ;
5356
54- ServerSpecificSettingsSync . SendToPlayer ( player . ReferenceHub ) ;
57+ var list = ListPool < ServerSpecificSettingBase > . Shared . Rent ( ) ;
58+ var headers = ListPool < string > . Shared . Rent ( ) ;
59+
60+ foreach ( var settingsEntry in player . settingsIdLookup )
61+ {
62+ if ( settingsEntry . Value ? . Base is null )
63+ continue ;
64+
65+ if ( ! settingsEntry . Value . Player )
66+ continue ;
67+
68+ if ( settingsEntry . Value . IsHidden )
69+ continue ;
70+
71+ if ( settingsEntry . Value . Menu != null )
72+ {
73+ if ( settingsEntry . Value . Menu . IsHidden )
74+ continue ;
75+
76+ if ( ! string . IsNullOrWhiteSpace ( settingsEntry . Value . Menu . Header ) &&
77+ ! headers . Contains ( settingsEntry . Value . Menu . CustomId ) )
78+ {
79+ headers . Add ( settingsEntry . Value . Menu . CustomId ) ;
80+ list . Add ( new SSGroupHeader ( settingsEntry . Value . Menu . Header ,
81+ settingsEntry . Value . Menu . HeaderReducedPadding , settingsEntry . Value . Menu . HeaderHint ) ) ;
82+ }
83+ }
84+
85+ list . Add ( settingsEntry . Value . Base ) ;
86+ }
87+
88+
89+ Dictionary < Assembly , ServerSpecificSettingBase [ ] > playerSettings = DictionaryPool < Assembly , ServerSpecificSettingBase [ ] > . Shared . Rent ( ) ;
90+ playerSettings . AddRange ( GlobalSettingsByAssembly ) ; // todo Use SendOnJoinFilter
91+ foreach ( var kvp in player . settingsByAssembly ) {
92+ playerSettings [ kvp . Key ] = kvp . Value ;
93+ }
94+
95+ foreach ( var sssByAssemblyEntry in playerSettings ) {
96+ Assembly pluginAssembly = sssByAssemblyEntry . Key ;
97+ ServerSpecificSettingBase [ ] collection = sssByAssemblyEntry . Value ;
98+ if ( collection . First ( ) is not SSGroupHeader ) {
99+ string pluginName = PluginLoader . Plugins . TryGetFirst ( o => o . Value . Equals ( pluginAssembly ) , out var result ) ? result . Key . Name : pluginAssembly . GetName ( ) . Name ;
100+ list . Add ( new SSGroupHeader ( pluginName . SpaceByUpperCase ( ) ) ) ;
101+ collection . ForEach ( list . Add ) ;
102+ } else if ( collection . Length > 1 ) {
103+ collection . ForEach ( list . Add ) ;
104+ }
105+ }
106+
107+ player . Send ( new SSSEntriesPack ( ListPool < ServerSpecificSettingBase > . Shared . ToArrayReturn ( list ) , Version ) ) ;
108+
109+ ListPool < string > . Shared . Return ( headers ) ;
55110 }
56111
57112 /// <summary>
@@ -434,8 +489,6 @@ public static bool AddMenu(this ExPlayer player, SettingsMenu menu)
434489 menuHeader . Menu = menu ;
435490 menuHeader . Player = player ;
436491
437- player . settingsList . Add ( menuHeader . Base ) ;
438-
439492 player . settingsIdLookup . Add ( menuHeader . CustomId , menuHeader ) ;
440493 player . settingsAssignedIdLookup . Add ( menuHeader . AssignedId , menuHeader ) ;
441494 }
@@ -449,8 +502,6 @@ public static bool AddMenu(this ExPlayer player, SettingsMenu menu)
449502 menuSetting . Player = player ;
450503 menuSetting . Menu = menu ;
451504
452- player . settingsList . Add ( menuSetting . Base ) ;
453-
454505 player . settingsIdLookup . Add ( menuSetting . CustomId , menuSetting ) ;
455506 player . settingsAssignedIdLookup . Add ( menuSetting . AssignedId , menuSetting ) ;
456507
@@ -491,8 +542,6 @@ public static bool AddSetting(ExPlayer player, SettingsEntry entry)
491542
492543 entry . Player = player ;
493544
494- player . settingsList . Add ( entry . Base ) ;
495-
496545 player . settingsIdLookup . Add ( entry . CustomId , entry ) ;
497546 player . settingsAssignedIdLookup . Add ( entry . AssignedId , entry ) ;
498547
@@ -526,8 +575,6 @@ public static bool AddSettings(ExPlayer player, IEnumerable<SettingsEntry> entri
526575 {
527576 var header = new SettingsGroup ( groupHeader , reducedHeaderPadding , headerHint ) ;
528577
529- player . settingsList . Add ( header . Base ) ;
530-
531578 player . settingsIdLookup [ header . CustomId ] = header ;
532579 player . settingsAssignedIdLookup [ header . AssignedId ] = header ;
533580 }
@@ -536,8 +583,6 @@ public static bool AddSettings(ExPlayer player, IEnumerable<SettingsEntry> entri
536583 {
537584 entry . Player = player ;
538585
539- player . settingsList . Add ( entry . Base ) ;
540-
541586 player . settingsIdLookup . Add ( entry . CustomId , entry ) ;
542587 player . settingsAssignedIdLookup . Add ( entry . AssignedId , entry ) ;
543588 }
@@ -630,8 +675,6 @@ private static void OnPlayerVerified(ExPlayer player)
630675
631676 builtSetting . Player = player ;
632677
633- player . settingsList . Add ( builtSetting . Base ) ;
634-
635678 player . settingsIdLookup . Add ( builtSetting . CustomId , builtSetting ) ;
636679 player . settingsAssignedIdLookup . Add ( builtSetting . AssignedId , builtSetting ) ;
637680
@@ -684,8 +727,6 @@ private static void OnPlayerVerified(ExPlayer player)
684727 continue ;
685728 }
686729
687- player . settingsList . Add ( menuSetting . Base ) ;
688-
689730 player . settingsIdLookup . Add ( menuSetting . CustomId , menuSetting ) ;
690731 player . settingsAssignedIdLookup . Add ( menuSetting . AssignedId , menuSetting ) ;
691732
0 commit comments