[MIRROR] Fixes not being dumped in space after jumping off the shuttle [MDB IGNORE] (#19402)

* Fixes not being dumped in space after jumping off the shuttle

* Update transit.dm

---------

Co-authored-by: Time-Green <timkoster1@hotmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
This commit is contained in:
SkyratBot
2023-03-10 02:40:47 +00:00
committed by GitHub
co-authored by Time-Green Gandalf
parent c338382a18
commit f9ce50bb89
2 changed files with 60 additions and 33 deletions
@@ -1,17 +1,22 @@
//Yes, they can only be rectangular.
//Yes, I'm sorry.
/datum/turf_reservation
var/list/reserved_turfs = list()
///Turfs around the reservation for cordoning
var/list/cordon_turfs = list()
///Area of turfs next to the cordon to fill with pre_cordon_area's
var/list/pre_cordon_turfs = list()
var/width = 0
var/height = 0
var/bottom_left_coords[3]
var/top_right_coords[3]
var/turf_type = /turf/open/space
///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen
var/pre_cordon_distance = 0
/datum/turf_reservation/transit
turf_type = /turf/open/space/transit
pre_cordon_distance = 7
/datum/turf_reservation/proc/Release()
var/list/reserved_copy = reserved_turfs.Copy()
@@ -40,6 +45,15 @@
if(!(cordon_turf.flags_1 & UNUSED_RESERVATION_TURF))
return FALSE
cordon_turfs = possible_turfs
pre_cordon_turfs.Cut()
if(pre_cordon_distance)
var/turf/offset_turf = locate(BL.x + pre_cordon_distance, BL.y + pre_cordon_distance, BL.z)
var/list/to_add = CORNER_OUTLINE(offset_turf, width - pre_cordon_distance * 2, height - pre_cordon_distance * 2) //we step-by-stop move inwards from the outer cordon
for(var/turf/turf_being_added as anything in to_add)
pre_cordon_turfs |= turf_being_added //add one by one so we can filter out duplicates
return TRUE
/// Actually generates the cordon around the reservation, and marking the cordon turfs as reserved
@@ -56,6 +70,42 @@
SSmapping.unused_turfs["[cordon_turf.z]"] -= cordon_turf
SSmapping.used_turfs[cordon_turf] = src
//swap the area with the pre-cordoning area
for(var/turf/pre_cordon_turf as anything in pre_cordon_turfs)
make_repel(pre_cordon_turf)
///Register signals in the cordon "danger zone" to do something with whoever trespasses
/datum/turf_reservation/proc/make_repel(turf/pre_cordon_turf)
SHOULD_CALL_PARENT(TRUE)
//Okay so hear me out. If we place a special turf IN the reserved area, it will be overwritten, so we can't do that
//But signals are preserved even between turf changes, so even if we register a signal now it will stay even if that turf is overriden by the template
RegisterSignals(pre_cordon_turf, list(COMSIG_PARENT_QDELETING, COMSIG_TURF_RESERVATION_RELEASED), PROC_REF(on_stop_repel))
/datum/turf_reservation/proc/on_stop_repel(turf/pre_cordon_turf)
SHOULD_CALL_PARENT(TRUE)
SIGNAL_HANDLER
stop_repel(pre_cordon_turf)
///Unregister all the signals we added in RegisterRepelSignals
/datum/turf_reservation/proc/stop_repel(turf/pre_cordon_turf)
UnregisterSignal(pre_cordon_turf, list(COMSIG_PARENT_QDELETING, COMSIG_TURF_RESERVATION_RELEASED))
/datum/turf_reservation/transit/make_repel(turf/pre_cordon_turf)
..()
RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump))
/datum/turf_reservation/transit/stop_repel(turf/pre_cordon_turf)
..()
UnregisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED)
/datum/turf_reservation/transit/proc/space_dump(atom/source, atom/movable/enterer)
SIGNAL_HANDLER
dump_in_space(enterer)
/datum/turf_reservation/proc/Reserve(width, height, zlevel)
src.width = width
src.height = height