mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-19 06:03:14 +00:00
* Adds SIGNAL_HANDLER and SIGNAL_HANDLER_DOES_SLEEP to prevent signal callbacks from blocking (#52761) Adds SIGNAL_HANDLER, a macro that sets SHOULD_NOT_SLEEP(TRUE). This should ideally be required on all new signal callbacks. Adds BLOCKING_SIGNAL_HANDLER, a macro that does nothing except symbolize "this is an older signal that didn't necessitate a code rewrite". It should not be allowed for new work. This comes from discussion around #52735, which yields by calling input, and (though it sets the return type beforehand) will not properly return the flag to prevent attack from slapping. To fix 60% of the yielding cases, WrapAdminProcCall no longer waits for another admin's proc call to finish. I'm not an admin, so I don't know how many behinds this has saved, but if this is problematic for admins I can just make it so that it lets you do it anyway. I'm not sure what the point of this babysitting was anyway. Requested by @optimumtact. Changelog cl admin: Calling a proc while another admin is calling one will no longer wait for the first to finish. You will simply just have to call it again. /cl * Adds SIGNAL_HANDLER and SIGNAL_HANDLER_DOES_SLEEP to prevent signal callbacks from blocking Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
60 lines
1.8 KiB
Plaintext
60 lines
1.8 KiB
Plaintext
/datum/component/swarming
|
|
var/offset_x = 0
|
|
var/offset_y = 0
|
|
var/is_swarming = FALSE
|
|
var/list/swarm_members = list()
|
|
|
|
/datum/component/swarming/Initialize(max_x = 24, max_y = 24)
|
|
if(!ismovable(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
offset_x = rand(-max_x, max_x)
|
|
offset_y = rand(-max_y, max_y)
|
|
|
|
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm)
|
|
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
|
|
|
|
/datum/component/swarming/Destroy()
|
|
for(var/other in swarm_members)
|
|
var/datum/component/swarming/other_swarm = other
|
|
other_swarm.swarm_members -= src
|
|
if(!other_swarm.swarm_members.len)
|
|
other_swarm.unswarm()
|
|
swarm_members = null
|
|
return ..()
|
|
|
|
/datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM)
|
|
SIGNAL_HANDLER
|
|
|
|
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
|
if(!other_swarm)
|
|
return
|
|
swarm()
|
|
swarm_members |= other_swarm
|
|
other_swarm.swarm()
|
|
other_swarm.swarm_members |= src
|
|
|
|
/datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM)
|
|
SIGNAL_HANDLER
|
|
|
|
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
|
if(!other_swarm || !(other_swarm in swarm_members))
|
|
return
|
|
swarm_members -= other_swarm
|
|
if(!swarm_members.len)
|
|
unswarm()
|
|
other_swarm.swarm_members -= src
|
|
if(!other_swarm.swarm_members.len)
|
|
other_swarm.unswarm()
|
|
|
|
/datum/component/swarming/proc/swarm()
|
|
var/atom/movable/owner = parent
|
|
if(!is_swarming)
|
|
is_swarming = TRUE
|
|
animate(owner, pixel_x = owner.pixel_x + offset_x, pixel_y = owner.pixel_y + offset_y, time = 2)
|
|
|
|
/datum/component/swarming/proc/unswarm()
|
|
var/atom/movable/owner = parent
|
|
if(is_swarming)
|
|
animate(owner, pixel_x = owner.pixel_x - offset_x, pixel_y = owner.pixel_y - offset_y, time = 2)
|
|
is_swarming = FALSE
|