diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm
index 2c6d71d2529..4bfb579d38e 100644
--- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm
+++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm
@@ -50,5 +50,9 @@
#define COMSIG_ATOM_ATTACK_ROBOT "atom_attack_robot"
/// from base of atom/attack_robot_secondary(): (mob/user)
#define COMSIG_ATOM_ATTACK_ROBOT_SECONDARY "atom_attack_robot_secondary"
-///from relay_attackers element: (atom/attacker)
+///from relay_attackers element: (atom/attacker, attack_flags)
#define COMSIG_ATOM_WAS_ATTACKED "atom_was_attacked"
+ ///The damage type of the weapon projectile is non-lethal stamina
+ #define ATTACKER_STAMINA_ATTACK (1<<0)
+ ///the attacker is shoving the source
+ #define ATTACKER_SHOVING (1<<1)
diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm
index 23503bfbcc2..faf4122e27d 100644
--- a/code/datums/elements/relay_attackers.dm
+++ b/code/datums/elements/relay_attackers.dm
@@ -34,12 +34,13 @@
/datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker)
SIGNAL_HANDLER
if(weapon.force)
- relay_attacker(target, attacker)
+ relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers)
SIGNAL_HANDLER
- if(attacker.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK))
- relay_attacker(target, attacker)
+ var/shoving = LAZYACCESS(modifiers, RIGHT_CLICK) ? ATTACKER_SHOVING : NONE
+ if(attacker.combat_mode || shoving)
+ relay_attacker(target, attacker, shoving)
/datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker)
SIGNAL_HANDLER
@@ -52,7 +53,7 @@
return
if(!ismob(hit_projectile.firer))
return
- relay_attacker(target, hit_projectile.firer)
+ relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
SIGNAL_HANDLER
@@ -64,7 +65,7 @@
var/mob/thrown_by = hit_item.thrownby?.resolve()
if(!ismob(thrown_by))
return
- relay_attacker(target, thrown_by)
+ relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker)
SIGNAL_HANDLER
@@ -75,5 +76,5 @@
relay_attacker(target, mecha_attacker)
/// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret)
-/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker)
- SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker)
+/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags)
+ SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker, attack_flags)
diff --git a/code/modules/religion/honorbound/honorbound_trauma.dm b/code/modules/religion/honorbound/honorbound_trauma.dm
index fc0f317154c..29152e5bc72 100644
--- a/code/modules/religion/honorbound/honorbound_trauma.dm
+++ b/code/modules/religion/honorbound/honorbound_trauma.dm
@@ -15,13 +15,10 @@
//checking spells cast by honorbound
RegisterSignal(owner, COMSIG_MOB_CAST_SPELL, PROC_REF(spell_check))
RegisterSignal(owner, COMSIG_MOB_FIRED_GUN, PROC_REF(staff_check))
- //signals that check for guilt
- RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_guilt))
- RegisterSignal(owner, COMSIG_ATOM_HULK_ATTACK, PROC_REF(hulk_guilt))
- RegisterSignal(owner, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hand_guilt))
- RegisterSignal(owner, COMSIG_ATOM_ATTACK_PAW, PROC_REF(paw_guilt))
- RegisterSignal(owner, COMSIG_ATOM_BULLET_ACT, PROC_REF(bullet_guilt))
- RegisterSignal(owner, COMSIG_ATOM_HITBY, PROC_REF(thrown_guilt))
+
+ //adds the relay_attackers element to the owner so whoever attacks him becomes guilty.
+ owner.AddElement(/datum/element/relay_attackers)
+ RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked))
//signal that checks for dishonorable attacks
RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(attack_honor))
@@ -32,12 +29,7 @@
/datum/brain_trauma/special/honorbound/on_lose(silent)
owner.clear_mood_event("honorbound")
UnregisterSignal(owner, list(
- COMSIG_ATOM_ATTACKBY,
- COMSIG_ATOM_HULK_ATTACK,
- COMSIG_ATOM_ATTACK_HAND,
- COMSIG_ATOM_ATTACK_PAW,
- COMSIG_ATOM_BULLET_ACT,
- COMSIG_ATOM_HITBY,
+ COMSIG_ATOM_WAS_ATTACKED,
COMSIG_MOB_CLICKON,
COMSIG_MOB_CAST_SPELL,
COMSIG_MOB_FIRED_GUN,
@@ -77,7 +69,7 @@
if(user in guilty)
return
var/datum/mind/guilty_conscience = user.mind
- if(guilty_conscience) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways)
+ if(guilty_conscience && !declaration) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways)
var/datum/job/job = guilty_conscience.assigned_role
if(job.departments_bitflags & (DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY))
return
@@ -88,6 +80,12 @@
to_chat(user, span_danger("[GLOB.deity] no longer considers you innocent!"))
guilty += user
+///Signal sent by the relay_attackers element. It makes the attacker guilty unless the damage was stamina or it was a shove.
+/datum/brain_trauma/special/honorbound/proc/on_attacked(mob/source, mob/attacker, attack_flags)
+ SIGNAL_HANDLER
+ if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING)))
+ guilty(attacker)
+
/**
* Called by attack_honor signal to check whether an attack should be allowed or not
*
@@ -111,7 +109,7 @@
if(is_holy || (job?.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY))
to_chat(honorbound_human, span_warning("There is nothing righteous in attacking the just."))
return FALSE
- if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL)
+ if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL && !is_guilty)
to_chat(honorbound_human, span_warning("If you truly think this healer is not innocent, declare them guilty."))
return FALSE
//THE INNOCENT
@@ -120,49 +118,6 @@
return FALSE
return TRUE
-// SIGNALS THAT ARE FOR BEING ATTACKED FIRST (GUILTY)
-/datum/brain_trauma/special/honorbound/proc/attackby_guilt(datum/source, obj/item/I, mob/attacker)
- SIGNAL_HANDLER
- if(I.force && I.damtype != STAMINA)
- guilty(attacker)
-
-/datum/brain_trauma/special/honorbound/proc/hulk_guilt(datum/source, mob/attacker)
- SIGNAL_HANDLER
- guilty(attacker)
-
-/datum/brain_trauma/special/honorbound/proc/hand_guilt(datum/source, mob/living/attacker)
- SIGNAL_HANDLER
- if(attacker.combat_mode)
- guilty(attacker)
-
-/datum/brain_trauma/special/honorbound/proc/paw_guilt(datum/source, mob/living/attacker)
- SIGNAL_HANDLER
- guilty(attacker)
-
-/datum/brain_trauma/special/honorbound/proc/bullet_guilt(datum/source, obj/projectile/proj)
- SIGNAL_HANDLER
- var/mob/living/shot_honorbound = source
- var/static/list/guilty_projectiles = typecacheof(list(
- /obj/projectile/beam,
- /obj/projectile/bullet,
- /obj/projectile/magic,
- ))
- if(!is_type_in_typecache(proj, guilty_projectiles))
- return
- if(proj.damage_type == STAMINA || !proj.is_hostile_projectile())
- return
- if(proj.damage > 0 && proj.damage < shot_honorbound.health && isliving(proj.firer))
- guilty(proj.firer)
-
-/datum/brain_trauma/special/honorbound/proc/thrown_guilt(datum/source, atom/movable/thrown_movable, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
- SIGNAL_HANDLER
- if(isitem(thrown_movable))
- var/mob/living/honorbound = source
- var/obj/item/thrown_item = thrown_movable
- var/mob/thrown_by = thrown_item.thrownby?.resolve()
- if(thrown_item.throwforce < honorbound.health && ishuman(thrown_by))
- guilty(thrown_by)
-
//spell checking
/datum/brain_trauma/special/honorbound/proc/spell_check(mob/user, datum/action/cooldown/spell/spell_cast)
SIGNAL_HANDLER