diff --git a/MiraAPI/Events/Vanilla/Gameplay/BeforeMurderEvent.cs b/MiraAPI/Events/Vanilla/Gameplay/BeforeMurderEvent.cs
index 8a770dc..00a977e 100644
--- a/MiraAPI/Events/Vanilla/Gameplay/BeforeMurderEvent.cs
+++ b/MiraAPI/Events/Vanilla/Gameplay/BeforeMurderEvent.cs
@@ -23,15 +23,15 @@ public sealed class BeforeMurderEvent : MiraCancelableEvent
public PlayerControl? Framed { get; }
///
- /// Gets a value indicating whether the murder is done indirectly.
+ /// Gets or sets a value indicating whether the murder is done indirectly.
/// This is commonly used to prevent the from being killed.
///
- public bool IsIndirectAttack { get; }
+ public bool IsIndirectAttack { get; set; }
///
- /// Gets a value indicating whether the murder should bypass protective roles or general defense, such as .
+ /// Gets or sets a value indicating whether the murder should bypass protective roles or general defense, such as .
///
- public bool IgnoreDefense { get; }
+ public bool IgnoreDefense { get; set; }
///
/// Gets whether the murder was meant to be done in a meeting, via an enum.
diff --git a/MiraAPI/Networking/CustomMurderRpc.cs b/MiraAPI/Networking/CustomMurderRpc.cs
index b53fd85..0622492 100644
--- a/MiraAPI/Networking/CustomMurderRpc.cs
+++ b/MiraAPI/Networking/CustomMurderRpc.cs
@@ -84,13 +84,15 @@ public static class CustomMurderRpc
var beforeMurderEvent = new BeforeMurderEvent(source, target, inMeeting);
MiraEventManager.InvokeEvent(beforeMurderEvent);
+ var defenseFlag = beforeMurderEvent.IgnoreDefense;
+ var indirectFlag = beforeMurderEvent.IsIndirectAttack;
var isMeetingActive = MeetingHud.Instance != null || ExileController.Instance != null;
if ((inMeeting is MeetingCheck.ForMeeting && !isMeetingActive) || (inMeeting is MeetingCheck.OutsideMeeting && isMeetingActive))
{
beforeMurderEvent.Cancel();
}
- if (target.ProtectedByGa())
+ if (!defenseFlag && target.ProtectedByGa())
{
beforeMurderEvent.Cancel();
murderResultFlags = MurderResultFlags.FailedProtected;
@@ -114,6 +116,8 @@ public static class CustomMurderRpc
PlayerControl.LocalPlayer,
source,
target,
+ indirectFlag,
+ defenseFlag,
murderResultFlags,
resetKillTimer,
createDeadBody,
@@ -128,6 +132,8 @@ public static class CustomMurderRpc
/// The game host.
/// The killer.
/// The player to murder.
+ /// Should the kill be indirect.
+ /// Should the kill ignore defense.
/// End result for the murder.
/// Should the kill timer be reset.
/// Should a dead body be created.
@@ -139,6 +145,8 @@ public static class CustomMurderRpc
this PlayerControl host,
PlayerControl source,
PlayerControl target,
+ bool isIndirect,
+ bool ignoreDefense,
MurderResultFlags murderResultFlags,
bool resetKillTimer = true,
bool createDeadBody = true,
@@ -154,14 +162,31 @@ public static class CustomMurderRpc
var murderResultFlags2 = MurderResultFlags.DecisionByHost | murderResultFlags;
- source.CustomMurder(
- target,
- murderResultFlags2,
- resetKillTimer,
- createDeadBody,
- teleportMurderer,
- showKillAnim,
- playKillSound);
+ if (isIndirect || ignoreDefense)
+ {
+ source.CustomMurder(
+ target,
+ null,
+ isIndirect,
+ ignoreDefense,
+ murderResultFlags2,
+ resetKillTimer,
+ createDeadBody,
+ teleportMurderer,
+ showKillAnim,
+ playKillSound);
+ }
+ else
+ {
+ source.CustomMurder(
+ target,
+ murderResultFlags2,
+ resetKillTimer,
+ createDeadBody,
+ teleportMurderer,
+ showKillAnim,
+ playKillSound);
+ }
}
///
@@ -200,13 +225,15 @@ public static class CustomMurderRpc
var beforeMurderEvent = new BeforeMurderEvent(source, target, isIndirect, ignoreDefense, inMeeting);
MiraEventManager.InvokeEvent(beforeMurderEvent);
+ var defenseFlag = beforeMurderEvent.IgnoreDefense;
+ var indirectFlag = beforeMurderEvent.IsIndirectAttack;
var isMeetingActive = MeetingHud.Instance != null || ExileController.Instance != null;
if ((inMeeting is MeetingCheck.ForMeeting && !isMeetingActive) || (inMeeting is MeetingCheck.OutsideMeeting && isMeetingActive))
{
beforeMurderEvent.Cancel();
}
- if (!ignoreDefense && target.ProtectedByGa())
+ if (!defenseFlag && target.ProtectedByGa())
{
beforeMurderEvent.Cancel();
murderResultFlags = MurderResultFlags.FailedProtected;
@@ -230,8 +257,8 @@ public static class CustomMurderRpc
PlayerControl.LocalPlayer,
source,
target,
- isIndirect,
- ignoreDefense,
+ indirectFlag,
+ defenseFlag,
murderResultFlags,
resetKillTimer,
createDeadBody,
@@ -327,13 +354,15 @@ public static class CustomMurderRpc
var beforeMurderEvent = new BeforeMurderEvent(source, target, framed, isIndirect, ignoreDefense, inMeeting);
MiraEventManager.InvokeEvent(beforeMurderEvent);
+ var defenseFlag = beforeMurderEvent.IgnoreDefense;
+ var indirectFlag = beforeMurderEvent.IsIndirectAttack;
var isMeetingActive = MeetingHud.Instance != null || ExileController.Instance != null;
if ((inMeeting is MeetingCheck.ForMeeting && !isMeetingActive) || (inMeeting is MeetingCheck.OutsideMeeting && isMeetingActive))
{
beforeMurderEvent.Cancel();
}
- if (!ignoreDefense && target.ProtectedByGa())
+ if (!defenseFlag && target.ProtectedByGa())
{
beforeMurderEvent.Cancel();
murderResultFlags = MurderResultFlags.FailedProtected;
@@ -358,8 +387,8 @@ public static class CustomMurderRpc
source,
target,
framed,
- isIndirect,
- ignoreDefense,
+ indirectFlag,
+ defenseFlag,
murderResultFlags,
resetKillTimer,
createDeadBody,
@@ -420,7 +449,7 @@ public static class CustomMurderRpc
}
///
- /// Custom Murder method without networking. If you need a networked version, use .
+ /// Custom Murder method without networking. If you need a networked version, use or .
///
/// The killer.
/// The player to murder.