mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 17:52:36 +00:00
* Micro-optimize qdel by only permitting one parameter (#80628) Productionizes #80615. The core optimization is this: ```patch - var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up. ``` We avoid a heap allocation in the form of copying the args over to a new list. A/B testing shows this results in 33% better overtime, and in a real round shaving off a full second of self time and 0.4 seconds of overtime--both of these would be doubled in the event this is merged as the new proc was only being run 50% of the time. * Micro-optimize qdel by only permitting one parameter --------- Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
59 lines
2.1 KiB
Plaintext
59 lines
2.1 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)
|
|
if(strongpulling)
|
|
lose_strong_grip()
|
|
return ..()
|
|
|
|
/datum/component/strong_pull/RegisterWithParent()
|
|
. = ..()
|
|
RegisterSignal(parent, COMSIG_LIVING_START_PULL, PROC_REF(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_REF(reject_further_pulls))
|
|
RegisterSignal(strongpulling, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(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
|
|
strongpulling.balloon_alert(puller, "gripped too tightly!")
|
|
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()
|