buildmode fix + blueprints fix (#2261)

* Fixes Admin Buildmode Mass-Deletion making people nude, gives GetAllContents() an ignore typecache.

* sync turf.dm
This commit is contained in:
CitadelStationBot
2017-08-04 11:46:11 -07:00
committed by kevinz000
parent 32a7158a72
commit f5bc18bb55
3 changed files with 46 additions and 20 deletions
+15 -6
View File
@@ -491,17 +491,26 @@ Turf and target are separate in case you want to teleport some distance from a t
var/y=arcsin(x/sqrt(1+x*x)) var/y=arcsin(x/sqrt(1+x*x))
return y return y
/atom/proc/GetAllContents() /atom/proc/GetAllContents(list/ignore_typecache)
var/list/processing_list = list(src) var/list/processing_list = list(src)
var/list/assembled = list() var/list/assembled = list()
if(ignore_typecache) //If there's a typecache, use it.
while(processing_list.len)
var/atom/A = processing_list[1]
processing_list -= A
if(ignore_typecache[A.type])
continue
processing_list |= (A.contents - assembled)
assembled |= A
while(processing_list.len) else //If there's none, only make this check once for performance.
var/atom/A = processing_list[1] while(processing_list.len)
processing_list -= A var/atom/A = processing_list[1]
processing_list -= A
processing_list |= (A.contents - assembled) processing_list |= (A.contents - assembled)
assembled |= A assembled |= A
return assembled return assembled
+17 -8
View File
@@ -77,6 +77,7 @@
return return
SSair.remove_from_active(src) SSair.remove_from_active(src)
visibilityChanged() visibilityChanged()
QDEL_LIST(blueprint_data)
initialized = FALSE initialized = FALSE
requires_activation = FALSE requires_activation = FALSE
..() ..()
@@ -224,9 +225,15 @@
var/old_affecting_lights = affecting_lights var/old_affecting_lights = affecting_lights
var/old_lighting_object = lighting_object var/old_lighting_object = lighting_object
var/old_corners = corners var/old_corners = corners
var/old_exl = explosion_level
var/old_exi = explosion_id
var/old_bp = blueprint_data
blueprint_data = null
var/old_baseturf = baseturf var/old_baseturf = baseturf
changing_turf = TRUE changing_turf = TRUE
qdel(src) //Just get the side effects and call Destroy qdel(src) //Just get the side effects and call Destroy
var/turf/W = new path(src) var/turf/W = new path(src)
@@ -235,9 +242,14 @@
else else
W.baseturf = old_baseturf W.baseturf = old_baseturf
W.explosion_id = old_exi
W.explosion_level = old_exl
if(!defer_change) if(!defer_change)
W.AfterChange(ignore_air) W.AfterChange(ignore_air)
W.blueprint_data = old_bp
if(SSlighting.initialized) if(SSlighting.initialized)
recalc_atom_opacity() recalc_atom_opacity()
lighting_object = old_lighting_object lighting_object = old_lighting_object
@@ -432,27 +444,24 @@
I.setDir(AM.dir) I.setDir(AM.dir)
I.alpha = 128 I.alpha = 128
if(!blueprint_data) LAZYADD(blueprint_data, I)
blueprint_data = list()
blueprint_data += I
/turf/proc/add_blueprints_preround(atom/movable/AM) /turf/proc/add_blueprints_preround(atom/movable/AM)
if(!SSticker.HasRoundStarted()) if(!SSticker.HasRoundStarted())
add_blueprints(AM) add_blueprints(AM)
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, delmobs = TRUE, forceop = FALSE) /turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
// Remove all atoms except observers, landmarks, docking ports // Remove all atoms except observers, landmarks, docking ports
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object)) var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(),delmobs? ignored_atoms : ignored_atoms + typecacheof(list(/mob))) var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms)
allowed_contents -= src allowed_contents -= src
for(var/i in 1 to allowed_contents.len) for(var/i in 1 to allowed_contents.len)
var/thing = allowed_contents[i] var/thing = allowed_contents[i]
qdel(thing, force=TRUE) qdel(thing, force=TRUE)
var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop = forceop) var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop = forceop)
SSair.remove_from_active(newT) SSair.remove_from_active(newT)
newT.CalculateAdjacentTurfs() newT.CalculateAdjacentTurfs()
SSair.add_to_active(newT,1) SSair.add_to_active(newT,1)
@@ -537,4 +546,4 @@
limit-- limit--
else else
return I return I
return I return I
@@ -20,26 +20,34 @@
/datum/mapGeneratorModule/bottomLayer/massdelete /datum/mapGeneratorModule/bottomLayer/massdelete
spawnableAtoms = list() spawnableAtoms = list()
spawnableTurfs = list() spawnableTurfs = list()
var/deletemobs = TRUE var/deleteturfs = TRUE //separate var for the empty type.
var/deleteturfs = TRUE var/list/ignore_typecache
/datum/mapGeneratorModule/bottomLayer/massdelete/generate() /datum/mapGeneratorModule/bottomLayer/massdelete/generate()
if(!mother) if(!mother)
return return
for(var/V in mother.map) for(var/V in mother.map)
var/turf/T = V var/turf/T = V
T.empty(deleteturfs? null : T.type, delmobs = deletemobs, forceop = TRUE) T.empty(deleteturfs? null : T.type, ignore_typecache = ignore_typecache, forceop = TRUE)
/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs /datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs/New()
deletemobs = FALSE ..()
ignore_typecache = typecacheof(list(/mob))
/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs /datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs
deleteturfs = FALSE deleteturfs = FALSE
/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs/New()
..()
ignore_typecache = typecacheof(list(/turf))
/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete /datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete
deletemobs = FALSE
deleteturfs = FALSE deleteturfs = FALSE
/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete/New()
..()
ignore_typecache = typecacheof(list(/mob, /turf))
//Only places atoms/turfs on area borders //Only places atoms/turfs on area borders
/datum/mapGeneratorModule/border /datum/mapGeneratorModule/border
clusterCheckFlags = CLUSTER_CHECK_NONE clusterCheckFlags = CLUSTER_CHECK_NONE