mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-21 15:14:17 +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>
32 lines
1.3 KiB
Plaintext
32 lines
1.3 KiB
Plaintext
/datum/component/rad_insulation
|
|
var/amount // Multiplier for radiation strength passing through
|
|
|
|
/datum/component/rad_insulation/Initialize(_amount=RAD_MEDIUM_INSULATION, protects=TRUE, contamination_proof=TRUE)
|
|
if(!isatom(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
if(protects) // Does this protect things in its contents from being affected?
|
|
RegisterSignal(parent, COMSIG_ATOM_RAD_PROBE, .proc/rad_probe_react)
|
|
if(contamination_proof) // Can this object be contaminated?
|
|
RegisterSignal(parent, COMSIG_ATOM_RAD_CONTAMINATING, .proc/rad_contaminating)
|
|
if(_amount != 1) // If it's 1 it won't have any impact on radiation passing through anyway
|
|
RegisterSignal(parent, COMSIG_ATOM_RAD_WAVE_PASSING, .proc/rad_pass)
|
|
|
|
amount = _amount
|
|
|
|
/datum/component/rad_insulation/proc/rad_probe_react(datum/source)
|
|
SIGNAL_HANDLER
|
|
|
|
return COMPONENT_BLOCK_RADIATION
|
|
|
|
/datum/component/rad_insulation/proc/rad_contaminating(datum/source, strength)
|
|
SIGNAL_HANDLER
|
|
|
|
return COMPONENT_BLOCK_CONTAMINATION
|
|
|
|
/datum/component/rad_insulation/proc/rad_pass(datum/source, datum/radiation_wave/wave, width)
|
|
SIGNAL_HANDLER
|
|
|
|
wave.intensity = wave.intensity*(1-((1-amount)/width)) // The further out the rad wave goes the less it's affected by insulation (larger width)
|
|
return COMPONENT_RAD_WAVE_HANDLED
|