mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-20 14:45:05 +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>
44 lines
1.6 KiB
Plaintext
44 lines
1.6 KiB
Plaintext
/datum/component/mirv
|
|
var/projectile_type
|
|
var/radius // shoots a projectile for every turf on this radius from the hit target
|
|
var/override_projectile_range
|
|
|
|
/datum/component/mirv/Initialize(projectile_type, radius=1, override_projectile_range)
|
|
if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent) && !isgrenade(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
src.projectile_type = projectile_type
|
|
src.radius = radius
|
|
src.override_projectile_range = override_projectile_range
|
|
|
|
if(isgrenade(parent))
|
|
parent.AddComponent(/datum/component/pellet_cloud, projectile_type=projectile_type)
|
|
|
|
/datum/component/mirv/RegisterWithParent()
|
|
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
|
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
|
|
|
/datum/component/mirv/UnregisterFromParent()
|
|
UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT))
|
|
|
|
/datum/component/mirv/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
|
SIGNAL_HANDLER_DOES_SLEEP
|
|
|
|
do_shrapnel(firer, target)
|
|
|
|
/datum/component/mirv/proc/do_shrapnel(mob/firer, atom/target)
|
|
if(radius < 1)
|
|
return
|
|
var/turf/target_turf = get_turf(target)
|
|
for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target))
|
|
|
|
var/obj/projectile/P = new projectile_type(target_turf)
|
|
//Shooting Code:
|
|
P.range = radius+1
|
|
if(override_projectile_range)
|
|
P.range = override_projectile_range
|
|
P.preparePixelProjectile(shootat_turf, target)
|
|
P.firer = firer // don't hit ourself that would be really annoying
|
|
P.permutated += target // don't hit the target we hit already with the flak
|
|
P.fire()
|