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);
}