Skip to content

Commit 84aefc1

Browse files
improve stability of script system
1 parent 15a1681 commit 84aefc1

4 files changed

Lines changed: 71 additions & 31 deletions

File tree

Code/EventSystem/EventHandler.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public static class EventHandler
2727

2828
public static void Initialize()
2929
{
30+
Clear();
3031
AvailableEvents = typeof(PluginLoader).Assembly.GetTypes()
3132
.Where(t => t.FullName?.Equals($"LabApi.Events.Handlers.{t.Name}") is true)
3233
.Select(t => t.GetEvents(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public

Code/FileSystem/FileSystem.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ public static void Initialize()
5656
}
5757

5858
UpdateScriptPathCollection();
59-
ScriptFlagHandler.Clear();
60-
EventHandler.Clear();
6159

6260
foreach (var scriptPath in RegisteredScriptPaths)
6361
{

Code/MethodSystem/Methods/CustomRoleMethods/Structures/CRole.cs

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
using LabApi.Events.Arguments.PlayerEvents;
2-
using LabApi.Events.CustomHandlers;
2+
using LabApi.Events.Handlers;
33
using LabApi.Features.Wrappers;
44
using MEC;
55
using PlayerRoles;
6+
using SER.Code.Extensions;
7+
using SER.Code.Helpers;
68
using Random = System.Random;
79

810
namespace SER.Code.MethodSystem.Methods.CustomRoleMethods.Structures;
911

10-
public class CRole : CustomEventsHandler
12+
public class CRole
1113
{
1214
public CRole()
1315
{
14-
CustomHandlersManager.RegisterEventsHandler(this);
16+
Log.Signal($"role {GetType().AccurateName} init");
17+
PlayerEvents.Death += OnDeath;
18+
PlayerEvents.ChangingRole += OnPlayerChangingRole;
19+
ServerEvents.RoundStarted += OnServerRoundStarted;
20+
}
21+
22+
public void Unload()
23+
{
24+
Log.Signal($"role {GetType().AccurateName} deconstr");
25+
PlayerEvents.Death -= OnDeath;
26+
PlayerEvents.ChangingRole -= OnPlayerChangingRole;
27+
ServerEvents.RoundStarted -= OnServerRoundStarted;
1528
}
1629

1730
public enum CustomRoleEvent
@@ -63,9 +76,10 @@ public static void ResetAll()
6376
{
6477
LifeIdAssignedRoles.Clear();
6578
LastRoles.Clear();
66-
RegisteredRoles.Clear();
6779
PlayersInProcessOfReceivingCRole.Clear();
6880
EventHandlers.Clear();
81+
RegisteredRoles.Values.ForEachItem(role => role.Unload());
82+
RegisteredRoles.Clear();
6983
}
7084

7185
public void AssignPlayer(Player plr)
@@ -124,7 +138,7 @@ private void RunHandlers(CustomRoleEvent @event, Player plr)
124138
}
125139
}
126140

127-
public override void OnServerRoundStarted()
141+
public void OnServerRoundStarted()
128142
{
129143
Timing.CallDelayed(Timing.WaitForOneFrame, delegate
130144
{
@@ -202,7 +216,7 @@ private static void HandleRoleRoundStart(CRole role)
202216
}
203217
}
204218

205-
public static void OnDeath(PlayerDeathEventArgs ev)
219+
public void OnDeath(PlayerDeathEventArgs ev)
206220
{
207221
if (ev.Player is not {} plr) return;
208222
if (!LifeIdAssignedRoles.TryGetValue(plr.LifeId, out var role)) return;
@@ -211,21 +225,41 @@ public static void OnDeath(PlayerDeathEventArgs ev)
211225
role.RemovePlayer(plr);
212226
}
213227

214-
public override void OnPlayerChangingRole(PlayerChangingRoleEventArgs ev)
228+
public void OnPlayerChangingRole(PlayerChangingRoleEventArgs ev)
215229
{
216230
if (ev.Player is not {} plr) return;
217231

218232
if (LifeIdAssignedRoles.TryGetValue(plr.LifeId, out var role))
219233
{
220234
role.RemovePlayer(plr);
235+
Log.Debug($"removing role {Id} from {plr.DisplayName}");
221236
}
222237

223-
if (PlayersInProcessOfReceivingCRole.Contains(plr)) return;
224-
if (SpawnSystem is not ChanceSpawn chanceSpawn) return;
225-
if (ev.NewRole != chanceSpawn.RoleToReplace) return;
226-
if (chanceSpawn.SpawnChance <= new Random().NextDouble()) return;
238+
if (SpawnSystem is not ChanceSpawn chanceSpawn)
239+
{
240+
Log.Debug($"{Id} is not a chance spawn system");
241+
return;
242+
}
243+
244+
if (PlayersInProcessOfReceivingCRole.Contains(plr))
245+
{
246+
Log.Debug($"player {plr.DisplayName} is already in process of receiving role (checking role: {Id})");
247+
return;
248+
}
249+
250+
if (ev.NewRole != chanceSpawn.RoleToReplace)
251+
{
252+
Log.Debug($"{Id} role cannot work for {plr.DisplayName}, invalid role");
253+
return;
254+
}
255+
if (chanceSpawn.SpawnChance <= new Random().NextDouble())
256+
{
257+
Log.Debug($"player {plr.DisplayName} failed chance spawn");
258+
return;
259+
}
227260

228261
ev.IsAllowed = false;
229262
AssignPlayer(plr);
263+
Log.Debug($"player {plr.DisplayName} successfully received role {Id}");
230264
}
231265
}

Code/Plugin/MainPlugin.cs

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using LabApi.Features.Console;
77
using MEC;
88
using SER.Code.Extensions;
9+
using SER.Code.FlagSystem;
910
using SER.Code.FlagSystem.Flags;
1011
using SER.Code.Helpers;
1112
using SER.Code.MethodSystem;
@@ -121,38 +122,44 @@ public override void OnEnabled()
121122

122123
Instance = this;
123124

124-
Script.StopAll();
125-
EventHandler.Initialize();
126-
MethodIndex.Initialize();
127-
VariableIndex.Initialize();
128-
Flag.RegisterFlags();
129-
CommandEvents.Initialize();
125+
130126
var fBridge = new FrameworkBridge();
131127
fBridge.Load();
132128
SendLogo();
133129

130+
Events.ServerEvents.MapGenerating += ev =>
131+
{
132+
Script.StopAll();
133+
ScriptFlagHandler.Clear();
134+
SetPlayerDataMethod.PlayerData.Clear();
135+
TeslaRuleHandler.ResetAll();
136+
DamageRuleHandler.ResetAll();
137+
CRole.ResetAll();
138+
139+
Flag.RegisterFlags();
140+
EventHandler.Initialize();
141+
MethodIndex.Initialize();
142+
VariableIndex.Initialize();
143+
CommandEvents.Initialize();
144+
FileSystem.FileSystem.Initialize();
145+
};
146+
134147
Events.ServerEvents.WaitingForPlayers += () => OnServerFullyInit(fBridge);
135-
Events.ServerEvents.RoundRestarted += PrivateDisable;
136148
Events.PlayerEvents.Joined += OnJoined;
137-
138-
FileSystem.FileSystem.Initialize();
149+
139150
CustomHandlersManager.RegisterEventsHandler(new TeslaRuleHandler());
140151
CustomHandlersManager.RegisterEventsHandler(new DamageRuleHandler());
141152
}
142153

143154
#if !EXILED
144-
public override void Disable() => PrivateDisable();
155+
public override void Disable()
145156
#else
146-
public override void OnDisabled() => PrivateDisable();
157+
public override void OnDisabled()
147158
#endif
148-
149-
private static void PrivateDisable()
150-
{
151-
CRole.ResetAll();
159+
{
152160
Script.StopAll();
153-
SetPlayerDataMethod.PlayerData.Clear();
154-
TeslaRuleHandler.ResetAll();
155-
DamageRuleHandler.ResetAll();
161+
ScriptFlagHandler.Clear();
162+
EventHandler.Clear();
156163
}
157164

158165
private void OnServerFullyInit(FrameworkBridge frameworkBridge)

0 commit comments

Comments
 (0)