Skip to content

Commit 4c32827

Browse files
authored
Vanilla SSS Adapter (#29)
New feature: Vanilla SSS Adapter Provides for each plugin it's own DefinitionSettings, players can have individual settings, LabEx and LabApi SSS compatible.
2 parents dcba09b + b02381b commit 4c32827

7 files changed

Lines changed: 337 additions & 208 deletions

File tree

LabExtended/API/ExPlayer.cs

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,43 @@
1-
using LabExtended.API.Enums;
2-
using LabExtended.API.Hints;
1+
using CentralAuth;
2+
using CommandSystem;
3+
using Footprinting;
4+
using Hints;
5+
using InventorySystem.Disarming;
6+
using InventorySystem.Items;
7+
using InventorySystem.Items.Pickups;
8+
using LabApi.Features.Wrappers;
39
using LabExtended.API.Containers;
410
using LabExtended.API.CustomVoice;
5-
using LabExtended.API.RemoteAdmin;
11+
using LabExtended.API.Enums;
612
using LabExtended.API.FileStorage;
7-
8-
using LabExtended.API.Settings.Menus;
9-
using LabExtended.API.Settings.Entries;
10-
13+
using LabExtended.API.Hints;
1114
using LabExtended.API.Hints.Elements.Personal;
12-
13-
using LabExtended.Core.Pooling.Pools;
14-
15+
using LabExtended.API.RemoteAdmin;
16+
using LabExtended.API.Settings.Entries;
17+
using LabExtended.API.Settings.Menus;
1518
using LabExtended.Commands.Attributes;
1619
using LabExtended.Commands.Interfaces;
17-
20+
using LabExtended.Core;
21+
using LabExtended.Core.Pooling.Pools;
1822
using LabExtended.Events;
19-
using LabExtended.Utilities;
2023
using LabExtended.Extensions;
21-
22-
using LabApi.Features.Wrappers;
23-
24+
using LabExtended.Utilities;
25+
using LiteNetLib;
2426
using Mirror;
2527
using Mirror.LiteNetLib4Mirror;
26-
28+
using NetworkManagerUtils.Dummies;
29+
using NorthwoodLib.Pools;
2730
using PlayerRoles;
28-
using PlayerRoles.Spectating;
2931
using PlayerRoles.FirstPersonControl;
30-
31-
using InventorySystem.Disarming;
32-
33-
using InventorySystem.Items;
34-
using InventorySystem.Items.Pickups;
35-
32+
using PlayerRoles.Spectating;
3633
using RemoteAdmin;
3734
using RemoteAdmin.Communication;
38-
39-
using LiteNetLib;
40-
35+
using System.Collections.Generic;
36+
using System.Collections.ObjectModel;
37+
using System.Reflection;
4138
using UnityEngine;
42-
43-
using VoiceChat;
44-
45-
using Hints;
46-
47-
using CentralAuth;
48-
49-
using CommandSystem;
50-
51-
using Footprinting;
52-
53-
using NetworkManagerUtils.Dummies;
54-
55-
using NorthwoodLib.Pools;
56-
5739
using UserSettings.ServerSpecific;
40+
using VoiceChat;
5841

5942
#pragma warning disable CS8602 // Dereference of a possibly null reference.
6043
#pragma warning disable CS8604 // Possible null reference argument.
@@ -135,6 +118,11 @@ public class ExPlayer : Player, IDisposable
135118
}
136119
}
137120

121+
/// <summary>
122+
/// Gets a dictionary of Personal DefinedSettings for each Plugin Assembly
123+
/// </summary>
124+
public Dictionary<Assembly, ServerSpecificSettingBase[]>? SettingsByAssembly => settingsByAssembly;
125+
138126
#region Get
139127
/// <summary>
140128
/// Gets an <see cref="ExPlayer"/> instance tied to the specified <see cref="ReferenceHub"/>.
@@ -459,15 +447,17 @@ public static IEnumerable<ExPlayer> Get(RoleTypeId role)
459447
private string idInfoValue = string.Empty;
460448

461449
internal ICommandRunner? activeRunner;
462-
450+
451+
internal Dictionary<Assembly, ServerSpecificSettingBase[]>?
452+
settingsByAssembly = DictionaryPool<Assembly, ServerSpecificSettingBase[]>.Shared.Rent();
453+
463454
internal Dictionary<string, SettingsMenu>? settingsMenuLookup = DictionaryPool<string, SettingsMenu>.Shared.Rent();
464455
internal Dictionary<string, SettingsEntry>? settingsIdLookup = DictionaryPool<string, SettingsEntry>.Shared.Rent();
465456

466457
internal Dictionary<int, SettingsEntry>?
467458
settingsAssignedIdLookup = DictionaryPool<int, SettingsEntry>.Shared.Rent();
468459

469460
internal List<HintElement> removeNextFrame = ListPool<HintElement>.Shared.Rent();
470-
internal List<ServerSpecificSettingBase> settingsList = ListPool<ServerSpecificSettingBase>.Shared.Rent();
471461

472462
/// <summary>
473463
/// Spawns a new dummy player with the specified nickname.
@@ -1443,8 +1433,8 @@ public void Dispose()
14431433
PersistentStorage = null!;
14441434
}
14451435

1446-
if (settingsList != null)
1447-
ListPool<ServerSpecificSettingBase>.Shared.Return(settingsList);
1436+
if (settingsByAssembly != null)
1437+
DictionaryPool<Assembly, ServerSpecificSettingBase[]>.Shared.Return(settingsByAssembly);
14481438

14491439
if (settingsIdLookup != null)
14501440
DictionaryPool<string, SettingsEntry>.Shared.Return(settingsIdLookup);
@@ -1467,7 +1457,7 @@ public void Dispose()
14671457
if (SentPositions != null)
14681458
DictionaryPool<uint, PositionSync.SentPosition>.Shared.Return(SentPositions);
14691459

1470-
settingsList = null!;
1460+
settingsByAssembly = null;
14711461
settingsIdLookup = null;
14721462
settingsMenuLookup = null;
14731463
settingsAssignedIdLookup = null;
@@ -1483,6 +1473,21 @@ public void Dispose()
14831473
Rotation = null!;
14841474
}
14851475

1476+
internal void SyncSettingsByAssembly(Assembly assembly, ServerSpecificSettingBase[] collection) {
1477+
if (!this)
1478+
return;
1479+
1480+
if (settingsByAssembly == null) {
1481+
ApiLog.Warn($"Player's {nameof(settingsByAssembly)} is null");
1482+
return;
1483+
}
1484+
1485+
if (collection == null || collection.Length == 0)
1486+
settingsByAssembly.Remove(assembly);
1487+
else
1488+
settingsByAssembly[assembly] = collection;
1489+
}
1490+
14861491
private static ReferenceHub SpawnHiddenDummy(string nick)
14871492
{
14881493
var hubGo = UnityEngine.Object.Instantiate(NetworkManager.singleton.playerPrefab);

LabExtended/API/Settings/SettingsManager.cs

Lines changed: 68 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
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;
102
using LabExtended.API.Settings.Entries;
113
using LabExtended.API.Settings.Entries.Buttons;
124
using LabExtended.API.Settings.Entries.Dropdown;
13-
5+
using LabExtended.API.Settings.Interfaces;
6+
using LabExtended.API.Settings.Menus;
7+
using LabExtended.Attributes;
148
using LabExtended.Core;
9+
using LabExtended.Core.Pooling.Pools;
1510
using LabExtended.Events;
1611
using LabExtended.Extensions;
17-
12+
using LabExtended.Patches.Functions.Settings;
13+
using Mirror;
1814
using 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

LabExtended/Patches/Functions/Settings/SettingsHandleStatusPatch.cs renamed to LabExtended/Patches/Functions/Settings/SettingsForwardStatusPatch.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
namespace LabExtended.Patches.Functions.Settings
1010
{
11-
/// <summary>
12-
/// Provides a Harmony patch for handling server-specific settings status messages.
13-
/// </summary>
14-
public static class SettingsHandleStatusPatch
11+
static class SettingsForwardStatusPatch
1512
{
1613
[HarmonyPatch(typeof(ServerSpecificSettingsSync), nameof(ServerSpecificSettingsSync.ServerProcessClientStatusMsg))]
1714
private static bool Prefix(NetworkConnection conn, ref SSSUserStatusReport msg)

LabExtended/Patches/Functions/Settings/SettingsHandleResponsePatch.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)