Files
Bubberstation/code/datums/components/strong_pull.dm
SkyratBot 60cb070bd6 [MIRROR] Improves H.A.U.L. gauntlets and /datum/component/strong_pull code, fixing a couple of little issues in the process (#6417)
* Improves H.A.U.L. gauntlets and /datum/component/strong_pull code, fixing a couple of little issues in the process (#59550)

Does a bit of a logic re-write on the cargo gauntlets and their strong_pull component.

Cargo gauntlets themselves have been converted to use signals for equipping and unequipping.

Their component reference has been changed to a weakref so if the component is ever Destroy()ed for any reason outside of the gauntlets it doesn't hard del.

The strong_pull component now registers signals with parent in RegisterWithParent() instead of Init() and removing the strong grip is no longer a SIGNAL_HANDLER proc. It is now called by the signal handler for no longer pulling things and in Destroy(). This stops instances where pulling things and removing the gloves didn't remove the pull effect appropriately.

* Improves H.A.U.L. gauntlets and /datum/component/strong_pull code, fixing a couple of little issues in the process

Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
2021-06-21 00:49:06 +01:00

58 lines
2.0 KiB
Plaintext

/*
This component attaches to mobs, and makes their pulls !strong!
Basically, the items they pull cannot be pulled (except by the puller)
*/
/datum/component/strong_pull
var/atom/movable/strongpulling
/datum/component/strong_pull/Initialize()
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
/datum/component/strong_pull/Destroy(force, silent)
if(strongpulling)
lose_strong_grip()
return ..()
/datum/component/strong_pull/RegisterWithParent()
. = ..()
RegisterSignal(parent, COMSIG_LIVING_START_PULL, .proc/on_pull)
/**
* Called when the parent grabs something, adds signals to the object to reject interactions
*/
/datum/component/strong_pull/proc/on_pull(datum/source, atom/movable/pulled, state, force)
SIGNAL_HANDLER
strongpulling = pulled
RegisterSignal(strongpulling, COMSIG_ATOM_CAN_BE_PULLED, .proc/reject_further_pulls)
RegisterSignal(strongpulling, COMSIG_ATOM_NO_LONGER_PULLED, .proc/on_no_longer_pulled)
if(istype(strongpulling, /obj/structure/closet) && !istype(strongpulling, /obj/structure/closet/body_bag))
var/obj/structure/closet/grabbed_closet = strongpulling
grabbed_closet.strong_grab = TRUE
/**
* Signal for rejecting further grabs
*/
/datum/component/strong_pull/proc/reject_further_pulls(datum/source, mob/living/puller)
SIGNAL_HANDLER
if(puller != parent) //for increasing grabs, you need to have a valid pull. thus, parent should be able to pull the same object again
return COMSIG_ATOM_CANT_PULL
/*
* Unregisters signals and stops any buffs to pulling.
*/
/datum/component/strong_pull/proc/lose_strong_grip()
UnregisterSignal(strongpulling, list(COMSIG_ATOM_CAN_BE_PULLED, COMSIG_ATOM_NO_LONGER_PULLED))
if(istype(strongpulling, /obj/structure/closet))
var/obj/structure/closet/ungrabbed_closet = strongpulling
ungrabbed_closet.strong_grab = FALSE
strongpulling = null
/**
* Called when the hooked object is no longer pulled and removes the strong grip.
*/
/datum/component/strong_pull/proc/on_no_longer_pulled(datum/source, atom/movable/last_puller)
SIGNAL_HANDLER
lose_strong_grip()