From 2df1e626005a6a17f116f85e3ce93f175acf0bd7 Mon Sep 17 00:00:00 2001 From: IRacle Date: Mon, 12 Aug 2024 18:03:24 +0300 Subject: [PATCH] sound argument --- .../Scp330/InteractingScp330EventArgs.cs | 9 +++- .../Events/Scp330/InteractingScp330.cs | 44 ++++++++++++++----- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/EXILED/Exiled.Events/EventArgs/Scp330/InteractingScp330EventArgs.cs b/EXILED/Exiled.Events/EventArgs/Scp330/InteractingScp330EventArgs.cs index b87238842..45a587755 100644 --- a/EXILED/Exiled.Events/EventArgs/Scp330/InteractingScp330EventArgs.cs +++ b/EXILED/Exiled.Events/EventArgs/Scp330/InteractingScp330EventArgs.cs @@ -35,6 +35,7 @@ public InteractingScp330EventArgs(Player player, int usage) Candy = Scp330Candies.GetRandom(); UsageCount = usage; ShouldSever = usage >= 2; + ShouldPlaySound = true; IsAllowed = Player.IsHuman; } @@ -53,10 +54,16 @@ public InteractingScp330EventArgs(Player player, int usage) /// public bool ShouldSever { get; set; } + /// + /// Gets or sets a value indicating whether the sound should be played. + /// + /// It won't work if = . + public bool ShouldPlaySound { get; set; } + /// /// Gets or sets a value indicating whether the player is allowed to interact with SCP-330. /// - public bool IsAllowed { get; set; } = true; + public bool IsAllowed { get; set; } /// /// Gets the triggering the event. diff --git a/EXILED/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs b/EXILED/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs index 9b7e66a27..2e4bc3801 100644 --- a/EXILED/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs +++ b/EXILED/Exiled.Events/Patches/Events/Scp330/InteractingScp330.cs @@ -74,6 +74,27 @@ private static IEnumerable Transpiler(IEnumerable instruction.Calls(PropertyGetter(typeof(PlayerInteractScp330Event), nameof(PlayerInteractScp330Event.PlaySound)))) + offset; + + newInstructions.InsertRange( + index, + new[] + { + // load ev.ShouldPlaySound and or operation with nw property. + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex), + new(OpCodes.Callvirt, PropertyGetter(typeof(InteractingScp330EventArgs), nameof(InteractingScp330EventArgs.ShouldPlaySound))), + new(OpCodes.Or), + }); + /* next code will used to override Sever check by EXILED * old: * if (args.AllowPunishment && uses >= 2) @@ -82,26 +103,26 @@ private static IEnumerable Transpiler(IEnumerable instruction.LoadsField(Field(typeof(Scp330Interobject), nameof(Scp330Interobject._takenCandies)))) + addTakenCandiesOffset; + offset = -1; + index = newInstructions.FindLastIndex( + instruction => instruction.LoadsField(Field(typeof(Scp330Interobject), nameof(Scp330Interobject._takenCandies)))) + offset; - Label notSeverLabel = newInstructions[addTakenCandiesIndex].labels[0]; + Label notSeverLabel = newInstructions[index].labels[0]; - int allowPunishmentOffset = 2; - int allowPunishmentIndex = newInstructions.FindLastIndex( - instruction => instruction.Calls(PropertyGetter(typeof(PlayerInteractScp330Event), nameof(PlayerInteractScp330Event.AllowPunishment)))) + allowPunishmentOffset; + offset = 2; + index = newInstructions.FindLastIndex( + instruction => instruction.Calls(PropertyGetter(typeof(PlayerInteractScp330Event), nameof(PlayerInteractScp330Event.AllowPunishment)))) + offset; // remove `uses >= 2` check, to override that by ev.ShouldSever - newInstructions.RemoveRange(allowPunishmentIndex, 3); + newInstructions.RemoveRange(index, 3); newInstructions.InsertRange( - allowPunishmentIndex, + index, new[] { // if (!ev.ShouldSever) // goto shouldNotSever; - new CodeInstruction(OpCodes.Ldloc, ev.LocalIndex), + new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex), new(OpCodes.Callvirt, PropertyGetter(typeof(InteractingScp330EventArgs), nameof(InteractingScp330EventArgs.ShouldSever))), new(OpCodes.Brfalse_S, notSeverLabel), }); @@ -109,7 +130,10 @@ private static IEnumerable Transpiler(IEnumerable.Pool.Return(newInstructions); }