From 5a1becc465019f65f87a2a54976e426240d3c104 Mon Sep 17 00:00:00 2001 From: louis1706 Date: Mon, 4 Dec 2023 10:27:42 +0100 Subject: [PATCH 1/3] SelectingRespawnTeamEventArgs --- .../Server/SelectingRespawnTeamEventArgs.cs | 35 ++++++++++ Exiled.Events/Handlers/Server.cs | 11 ++++ .../Events/Server/SelectingRespawnTeam.cs | 64 +++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs create mode 100644 Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs diff --git a/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs b/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs new file mode 100644 index 0000000000..2365a8de84 --- /dev/null +++ b/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs @@ -0,0 +1,35 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Server +{ + using System; + + using Exiled.API.Features; + using Exiled.Events.EventArgs.Interfaces; + using Respawning; + + /// + /// Contains all information before selecting the team to respawn next. + /// + public class SelectingRespawnTeamEventArgs : IExiledEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The used as the starting value for this event. + public SelectingRespawnTeamEventArgs(SpawnableTeamType type) + { + ChosenTeam = type; + } + + /// + /// Gets or sets that represents the team chosen to spawn. + /// + public SpawnableTeamType ChosenTeam { get; set; } + } +} \ No newline at end of file diff --git a/Exiled.Events/Handlers/Server.cs b/Exiled.Events/Handlers/Server.cs index ceddc32ada..954788215f 100644 --- a/Exiled.Events/Handlers/Server.cs +++ b/Exiled.Events/Handlers/Server.cs @@ -68,6 +68,11 @@ public static class Server /// public static Event ChoosingStartTeamQueue { get; set; } = new(); + /// + /// Invoked before choosing the team that will respawn. + /// + public static Event SelectingRespawnTeam { get; set; } = new(); + /// /// Invoked after the "reload configs" command is ran. /// @@ -184,5 +189,11 @@ public static class Server /// Called after the "reload permissions" command is ran. /// public static void OnReloadedPermissions() => ReloadedPermissions.InvokeSafely(); + + /// + /// Called before selecting the team that will respawn next. + /// + /// The instance. + public static void OnSelectingRespawnTeam(SelectingRespawnTeamEventArgs ev) => SelectingRespawnTeam.InvokeSafely(ev); } } \ No newline at end of file diff --git a/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs new file mode 100644 index 0000000000..8060ce0b44 --- /dev/null +++ b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs @@ -0,0 +1,64 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Exiled Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Server +{ + using System; + using System.Collections.Generic; + using System.Reflection; + using System.Reflection.Emit; + + using Exiled.API.Features; + using Exiled.API.Features.Pools; + using Exiled.Events.Attributes; + using Exiled.Events.EventArgs.Server; + + using HarmonyLib; + + using Respawning; + + using static HarmonyLib.AccessTools; + + /// + /// Patches to add the event. + /// + [EventPatch(typeof(Handlers.Server), nameof(Handlers.Server.SelectingRespawnTeam))] + [HarmonyPatch(typeof(RespawnManager), nameof(RespawnManager.Update))] + internal static class SelectingRespawnTeam + { + private static IEnumerable Transpiler(IEnumerable instructions, ILGenerator generator) + { + List newInstructions = ListPool.Pool.Get(instructions); + LocalBuilder ev = generator.DeclareLocal(typeof(SelectingRespawnTeamEventArgs)); + + const int offset = 1; + int index = newInstructions.FindLastIndex(i => i.opcode == OpCodes.Stloc_1) + offset; + + newInstructions.InsertRange(index, new[] + { + // SelectingRespawnTeamEventArgs ev = new(dominatingTeam); + new CodeInstruction(OpCodes.Ldloc_1), + new(OpCodes.Newobj, GetDeclaredConstructors(typeof(SelectingRespawnTeamEventArgs))[0]), + new(OpCodes.Dup), + new(OpCodes.Stloc_S, ev), + + // Handlers.Server.OnSelectingRespawnTeam(ev); + new(OpCodes.Call, Method(typeof(Handlers.Server), nameof(Handlers.Server.OnSelectingRespawnTeam))), + + // dominatingTeam = ev.ChosenTeam; + new(OpCodes.Ldloc, ev), + new CodeInstruction(OpCodes.Callvirt, PropertyGetter(typeof(SelectingRespawnTeamEventArgs), nameof(SelectingRespawnTeamEventArgs.ChosenTeam))), + new(OpCodes.Stloc_1), + }); + + for (int z = 0; z < newInstructions.Count; z++) + yield return newInstructions[z]; + + ListPool.Pool.Return(newInstructions); + } + } +} \ No newline at end of file From 0abfa8a11cfbcbc4c58391c345d468ee21410816 Mon Sep 17 00:00:00 2001 From: Yamato <66829532+louis1706@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:12:17 +0100 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Nao <60253860+NaoUnderscore@users.noreply.github.com> --- .../EventArgs/Server/SelectingRespawnTeamEventArgs.cs | 4 ++-- Exiled.Events/Handlers/Server.cs | 2 +- Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs b/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs index 2365a8de84..3c3b87de57 100644 --- a/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs +++ b/Exiled.Events/EventArgs/Server/SelectingRespawnTeamEventArgs.cs @@ -24,12 +24,12 @@ public class SelectingRespawnTeamEventArgs : IExiledEvent /// The used as the starting value for this event. public SelectingRespawnTeamEventArgs(SpawnableTeamType type) { - ChosenTeam = type; + Team = type; } /// /// Gets or sets that represents the team chosen to spawn. /// - public SpawnableTeamType ChosenTeam { get; set; } + public SpawnableTeamType Team { get; set; } } } \ No newline at end of file diff --git a/Exiled.Events/Handlers/Server.cs b/Exiled.Events/Handlers/Server.cs index 954788215f..1b3d0481a9 100644 --- a/Exiled.Events/Handlers/Server.cs +++ b/Exiled.Events/Handlers/Server.cs @@ -69,7 +69,7 @@ public static class Server public static Event ChoosingStartTeamQueue { get; set; } = new(); /// - /// Invoked before choosing the team that will respawn. + /// Invoked before selecting the team that will respawn. /// public static Event SelectingRespawnTeam { get; set; } = new(); diff --git a/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs index 8060ce0b44..f04a268466 100644 --- a/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs +++ b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs @@ -51,7 +51,7 @@ private static IEnumerable Transpiler(IEnumerable Date: Tue, 5 Dec 2023 23:18:11 +0100 Subject: [PATCH 3/3] Update Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs --- Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs index f04a268466..644494c555 100644 --- a/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs +++ b/Exiled.Events/Patches/Events/Server/SelectingRespawnTeam.cs @@ -49,7 +49,7 @@ private static IEnumerable Transpiler(IEnumerable