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.