Change indirect and defense flags to get sets

This commit is contained in:
Atony committed 2026-08-13 10:07:40 -05:00
1 parent 22716b29ab
commit 83d55d409b
2 files changed
+49 -20

No files matched your search

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