Files
Bubberstation/code/datums/components/knockoff.dm
SkyratBot 2c5479e9de [MIRROR] Was/Were grammar fix on Knock Off [MDB IGNORE] (#8551)
* Was/Were grammar fix on Knock Off (#61817)

Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@ users.noreply.github.com>

* Was/Were grammar fix on Knock Off

Co-authored-by: Mooshimi <85910816+Mooshimi@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@ users.noreply.github.com>
2021-10-02 21:12:25 +01:00

72 lines
2.4 KiB
Plaintext

///Items with these will have a chance to get knocked off when disarming or being knocked down
/datum/component/knockoff
///Chance to knockoff
var/knockoff_chance = 100
///Aiming for these zones will cause the knockoff, null means all zones allowed
var/list/target_zones
///Can be only knocked off from these slots, null means all slots allowed
var/list/slots_knockoffable
/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED,.proc/OnEquipped)
RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped)
src.knockoff_chance = knockoff_chance
if(zone_override)
target_zones = zone_override
if(slots_knockoffable)
src.slots_knockoffable = slots_knockoffable
///Tries to knockoff the item when disarmed
/datum/component/knockoff/proc/Knockoff(mob/living/carbon/human/wearer,mob/living/attacker,zone)
SIGNAL_HANDLER
var/obj/item/item = parent
if(!istype(wearer))
return
if(target_zones && !(zone in target_zones))
return
if(!prob(knockoff_chance))
return
if(!wearer.dropItemToGround(item))
return
wearer.visible_message(span_warning("[attacker] knocks off [wearer]'s [item.name]!"),span_userdanger("[attacker] knocks off your [item.name]!"))
///Tries to knockoff the item when user is knocked down
/datum/component/knockoff/proc/Knockoff_knockdown(mob/living/carbon/human/wearer,amount)
SIGNAL_HANDLER
if(amount <= 0)
return
var/obj/item/item = parent
if(!istype(wearer))
return
if(!prob(knockoff_chance))
return
if(!wearer.dropItemToGround(item))
return
wearer.visible_message(span_warning("[wearer]'s [item.name] get[item.p_s()] knocked off!"),span_userdanger("Your [item.name] [item.p_were()] knocked off!"))
/datum/component/knockoff/proc/OnEquipped(datum/source, mob/living/carbon/human/H,slot)
SIGNAL_HANDLER
if(!istype(H))
return
if(slots_knockoffable && !(slot in slots_knockoffable))
UnregisterSignal(H, COMSIG_HUMAN_DISARM_HIT)
UnregisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN)
return
RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE)
RegisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/Knockoff_knockdown, TRUE)
/datum/component/knockoff/proc/OnDropped(datum/source, mob/living/M)
SIGNAL_HANDLER
UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT)
UnregisterSignal(M, COMSIG_LIVING_STATUS_KNOCKDOWN)