From 7a89f316a5198068f5224cbb95967ddd26747df4 Mon Sep 17 00:00:00 2001 From: Lumi Date: Sun, 25 May 2025 23:16:30 +0100 Subject: [PATCH 1/4] feat: snake events --- .../EventArgs/Interfaces/ISnakeEvent.cs | 21 ++++++++ .../EventArgs/Snake/GainedScoreEventArgs.cs | 43 +++++++++++++++ .../EventArgs/Snake/GameOverEventArgs.cs | 48 +++++++++++++++++ .../EventArgs/Snake/NewGameEventArgs.cs | 36 +++++++++++++ EXILED/Exiled.Events/Exiled.Events.csproj | 1 + EXILED/Exiled.Events/Handlers/Snake.cs | 51 ++++++++++++++++++ .../Patches/Events/Snake/ChaosKeycard.cs | 53 +++++++++++++++++++ 7 files changed, 253 insertions(+) create mode 100644 EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs create mode 100644 EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs create mode 100644 EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs create mode 100644 EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs create mode 100644 EXILED/Exiled.Events/Handlers/Snake.cs create mode 100644 EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs diff --git a/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs b/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs new file mode 100644 index 0000000000..57df681811 --- /dev/null +++ b/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs @@ -0,0 +1,21 @@ +namespace Exiled.Events.EventArgs.Interfaces +{ + using Exiled.API.Features.Items; + using InventorySystem.Items.Keycards.Snake; + + /// + /// Event args used for all related events. + /// + public interface ISnakeEvent : IPlayerEvent + { + /// + /// Gets the Snake game controller. + /// + public SnakeEngine Engine { get; } + + /// + /// Gets the keycard that triggered this event. + /// + public Keycard Keycard { get; } + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs new file mode 100644 index 0000000000..53e0ac549c --- /dev/null +++ b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs @@ -0,0 +1,43 @@ +using Exiled.API.Features.Items; + +namespace Exiled.Events.EventArgs.Snake +{ + using Exiled.Events.EventArgs.Interfaces; + using InventorySystem.Items.Keycards.Snake; + + /// + /// Contains all information after a player gains score in the Snake minigame. + /// + public class GainedScoreEventArgs : ISnakeEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + /// The who triggered this event. + /// The triggering this event. + public GainedScoreEventArgs(SnakeEngine engine, API.Features.Player player, Keycard keycard) + { + Engine = engine; + Player = player; + Score = engine.Score; + Keycard = keycard; + } + + /// + public SnakeEngine Engine { get; } + + /// + /// Gets the person playing the game. + /// + public API.Features.Player Player { get; } + + /// + public Keycard Keycard { get; } + + /// + /// Gets the newly obtained score. + /// + public int Score { get; } + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs new file mode 100644 index 0000000000..a3574d77f5 --- /dev/null +++ b/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs @@ -0,0 +1,48 @@ +namespace Exiled.Events.EventArgs.Snake +{ + using Exiled.API.Features.Items; + using Interfaces; + using InventorySystem.Items.Keycards.Snake; + + /// + /// Contains all information after a player loses at Snake. + /// + public class GameOverEventArgs : ISnakeEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + /// The who triggered this event. + /// The triggering this event. + public GameOverEventArgs(SnakeEngine engine, API.Features.Player player, Keycard keycard) + { + Engine = engine; + Player = player; + FinalScore = engine.Score; + Length = engine.CurLength; + Keycard = keycard; + } + + /// + public SnakeEngine Engine { get; } + + /// + /// Gets the person playing the game. + /// + public API.Features.Player Player { get; } + + /// + public Keycard Keycard { get; } + + /// + /// Gets the final score. + /// + public int FinalScore { get; } + + /// + /// Gets the final length of the snake. + /// + public int Length { get; } + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs new file mode 100644 index 0000000000..2a0d85e9b2 --- /dev/null +++ b/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs @@ -0,0 +1,36 @@ +namespace Exiled.Events.EventArgs.Snake +{ + using Exiled.API.Features.Items; + using Interfaces; + using InventorySystem.Items.Keycards.Snake; + + /// + /// Contains all information when a player starts a new snake game + /// + public class NewGameEventArgs : ISnakeEvent + { + /// + /// Initializes a new instance of the class. + /// + /// The instance. + /// The who triggered this event. + /// The triggering this event. + public NewGameEventArgs(SnakeEngine engine, API.Features.Player player, Keycard keycard) + { + Engine = engine; + Player = player; + Keycard = keycard; + } + + /// + public SnakeEngine Engine { get; } + + /// + /// Gets the person playing the game. + /// + public API.Features.Player Player { get; } + + /// + public Keycard Keycard { get; } + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/Exiled.Events.csproj b/EXILED/Exiled.Events/Exiled.Events.csproj index 620625057d..528d035ba6 100644 --- a/EXILED/Exiled.Events/Exiled.Events.csproj +++ b/EXILED/Exiled.Events/Exiled.Events.csproj @@ -37,6 +37,7 @@ + diff --git a/EXILED/Exiled.Events/Handlers/Snake.cs b/EXILED/Exiled.Events/Handlers/Snake.cs new file mode 100644 index 0000000000..2933d0f82b --- /dev/null +++ b/EXILED/Exiled.Events/Handlers/Snake.cs @@ -0,0 +1,51 @@ +using Exiled.Events.EventArgs.Snake; + +namespace Exiled.Events.Handlers +{ + using Exiled.Events.Features; + + public class Snake + { + /// + /// Invoked when gaining score in Snake. + /// + public static Event GainedScore = new(); + + /// + /// Invoked when a player loses in Snake. + /// + public static Event GameOver = new(); + + /// + /// Invoked when a player starts a new game. + /// + public static Event NewGame = new(); + + /// + /// Called when a player gains score in Snake. + /// + /// The instance. + public static void OnGainedScore(GainedScoreEventArgs ev) + { + GainedScore.InvokeSafely(ev); + } + + /// + /// Called when a player loses in Snake. + /// + /// The instance. + public static void OnGameOver(GameOverEventArgs ev) + { + GameOver.InvokeSafely(ev); + } + + /// + /// Called when a player starts a new game in Snake. + /// + /// The instance. + public static void OnNewGame(NewGameEventArgs ev) + { + NewGame.InvokeSafely(ev); + } + } +} \ No newline at end of file diff --git a/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs new file mode 100644 index 0000000000..100f869de5 --- /dev/null +++ b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs @@ -0,0 +1,53 @@ +using Exiled.Events.Attributes; + +namespace Exiled.Events.Patches.Events.Snake +{ + using System.Collections.Generic; + using System.Reflection.Emit; + + using Exiled.API.Enums; + using Exiled.API.Features.Items; + using HarmonyLib; + using InventorySystem.Items.Keycards; + using InventorySystem.Items.Keycards.Snake; + + using static HarmonyLib.AccessTools; + + [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.GainedScore))] + [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.GameOver))] + [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.NewGame))] + [HarmonyPatch(typeof(ChaosKeycardItem), nameof(ChaosKeycardItem.ServerProcessCustomCmd))] + internal static class ChaosKeycard + { + private static IEnumerable Transpiler(IEnumerable instructions) + { + CodeMatcher matcher = new CodeMatcher(instructions) + .MatchEndForward(new CodeMatch(OpCodes.Ldc_I4_1)) + .Advance(-1) + .Insert( + new(OpCodes.Ldarg_0), + new(OpCodes.Ldloc_1), + new(OpCodes.Call, Method(typeof(ChaosKeycard), nameof(OnCardUse)))); + + return matcher.InstructionEnumeration(); + } + + private static void OnCardUse(ChaosKeycardItem itemBase, SnakeNetworkMessage message) + { + Keycard item = Item.Get(itemBase); + API.Features.Player player = item.Owner; + + if (!ChaosKeycardItem.SnakeSessions.TryGetValue(item.Serial, out SnakeEngine engine)) + return; + + bool isNewGame = message.HasFlag(SnakeNetworkMessage.SyncFlags.GameReset); + + if(message.HasFlag(SnakeNetworkMessage.SyncFlags.HasNewFood) && !isNewGame) + Handlers.Snake.OnGainedScore(new (engine, player, item)); + else if (message.HasFlag(SnakeNetworkMessage.SyncFlags.GameOver)) + Handlers.Snake.OnGameOver(new(engine, player, item)); + else if (isNewGame) + Handlers.Snake.OnNewGame(new(engine, player, item)); + } + } +} \ No newline at end of file From bc57bb751c298b3eabdd99cecf5191afe8ed71a9 Mon Sep 17 00:00:00 2001 From: Lumi Date: Sun, 25 May 2025 23:21:55 +0100 Subject: [PATCH 2/4] fix: stylecop errors --- .../EventArgs/Snake/GainedScoreEventArgs.cs | 7 +++---- EXILED/Exiled.Events/Handlers/Snake.cs | 16 +++++++++------- .../Patches/Events/Snake/ChaosKeycard.cs | 9 +++++---- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs index 53e0ac549c..b514bc29c3 100644 --- a/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs @@ -1,8 +1,7 @@ -using Exiled.API.Features.Items; - -namespace Exiled.Events.EventArgs.Snake +namespace Exiled.Events.EventArgs.Snake { - using Exiled.Events.EventArgs.Interfaces; + using Exiled.API.Features.Items; + using Interfaces; using InventorySystem.Items.Keycards.Snake; /// diff --git a/EXILED/Exiled.Events/Handlers/Snake.cs b/EXILED/Exiled.Events/Handlers/Snake.cs index 2933d0f82b..8224c47840 100644 --- a/EXILED/Exiled.Events/Handlers/Snake.cs +++ b/EXILED/Exiled.Events/Handlers/Snake.cs @@ -1,25 +1,27 @@ -using Exiled.Events.EventArgs.Snake; - -namespace Exiled.Events.Handlers +namespace Exiled.Events.Handlers { - using Exiled.Events.Features; + using Exiled.Events.EventArgs.Snake; + using Features; + /// + /// Handles Snake related events. + /// public class Snake { /// /// Invoked when gaining score in Snake. /// - public static Event GainedScore = new(); + public static Event GainedScore { get; set; } = new(); /// /// Invoked when a player loses in Snake. /// - public static Event GameOver = new(); + public static Event GameOver { get; set; } = new(); /// /// Invoked when a player starts a new game. /// - public static Event NewGame = new(); + public static Event NewGame { get; set; } = new(); /// /// Called when a player gains score in Snake. diff --git a/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs index 100f869de5..651e877f4c 100644 --- a/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs +++ b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs @@ -1,11 +1,9 @@ -using Exiled.Events.Attributes; - -namespace Exiled.Events.Patches.Events.Snake +namespace Exiled.Events.Patches.Events.Snake { using System.Collections.Generic; using System.Reflection.Emit; - using Exiled.API.Enums; + using Attributes; using Exiled.API.Features.Items; using HarmonyLib; using InventorySystem.Items.Keycards; @@ -13,6 +11,9 @@ namespace Exiled.Events.Patches.Events.Snake using static HarmonyLib.AccessTools; + /// + /// Patches . + /// [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.GainedScore))] [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.GameOver))] [EventPatch(typeof(Handlers.Snake), nameof(Handlers.Snake.NewGame))] From 86b343fa06f1aad436802aeb7a41a913c7984bae Mon Sep 17 00:00:00 2001 From: Lumi Date: Mon, 26 May 2025 11:29:29 +0100 Subject: [PATCH 3/4] fix: stylecop errors --- .../EventArgs/Snake/GainedScoreEventArgs.cs | 9 ++++++++- .../EventArgs/Snake/GameOverEventArgs.cs | 9 ++++++++- .../Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs | 11 +++++++++-- EXILED/Exiled.Events/Handlers/Snake.cs | 11 ++++++++++- .../Patches/Events/Snake/ChaosKeycard.cs | 9 ++++++++- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs index b514bc29c3..d1ac92e0ee 100644 --- a/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Snake/GainedScoreEventArgs.cs @@ -1,4 +1,11 @@ -namespace Exiled.Events.EventArgs.Snake +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Snake { using Exiled.API.Features.Items; using Interfaces; diff --git a/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs index a3574d77f5..fe9498324e 100644 --- a/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Snake/GameOverEventArgs.cs @@ -1,4 +1,11 @@ -namespace Exiled.Events.EventArgs.Snake +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Snake { using Exiled.API.Features.Items; using Interfaces; diff --git a/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs b/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs index 2a0d85e9b2..4a96c0df1e 100644 --- a/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Snake/NewGameEventArgs.cs @@ -1,11 +1,18 @@ -namespace Exiled.Events.EventArgs.Snake +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Snake { using Exiled.API.Features.Items; using Interfaces; using InventorySystem.Items.Keycards.Snake; /// - /// Contains all information when a player starts a new snake game + /// Contains all information when a player starts a new snake game. /// public class NewGameEventArgs : ISnakeEvent { diff --git a/EXILED/Exiled.Events/Handlers/Snake.cs b/EXILED/Exiled.Events/Handlers/Snake.cs index 8224c47840..8b2d3e2e89 100644 --- a/EXILED/Exiled.Events/Handlers/Snake.cs +++ b/EXILED/Exiled.Events/Handlers/Snake.cs @@ -1,5 +1,14 @@ -namespace Exiled.Events.Handlers +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Handlers { +#pragma warning disable SA1623 // Property summary documentation should match accessors + using Exiled.Events.EventArgs.Snake; using Features; diff --git a/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs index 651e877f4c..f17b99c056 100644 --- a/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs +++ b/EXILED/Exiled.Events/Patches/Events/Snake/ChaosKeycard.cs @@ -1,4 +1,11 @@ -namespace Exiled.Events.Patches.Events.Snake +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.Patches.Events.Snake { using System.Collections.Generic; using System.Reflection.Emit; From 5f916c329422c3fe363b70df142e5913459fc651 Mon Sep 17 00:00:00 2001 From: Lumi Date: Mon, 26 May 2025 11:32:41 +0100 Subject: [PATCH 4/4] fix: no copyright header --- EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs b/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs index 57df681811..b2a3cda8ca 100644 --- a/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs +++ b/EXILED/Exiled.Events/EventArgs/Interfaces/ISnakeEvent.cs @@ -1,4 +1,11 @@ -namespace Exiled.Events.EventArgs.Interfaces +// ----------------------------------------------------------------------- +// +// Copyright (c) ExMod Team. All rights reserved. +// Licensed under the CC BY-SA 3.0 license. +// +// ----------------------------------------------------------------------- + +namespace Exiled.Events.EventArgs.Interfaces { using Exiled.API.Features.Items; using InventorySystem.Items.Keycards.Snake;