Validate map templates uploaded by admins (#39674)

* Move the preloader datum to its own file

* Prettify some of the map loader docs

* Use src rather than usr in map template verbs

* Cache parsed templates between upload and first use

* Validate map templates uploaded by admins before use

* Add href token to validation report links
This commit is contained in:
Tad Hardesty
2018-08-16 10:09:21 +02:00
committed by AnturK
parent 3a4a232fac
commit b4ce7bc1f1
6 changed files with 191 additions and 70 deletions
+15 -6
View File
@@ -4,21 +4,25 @@
var/height = 0
var/mappath = null
var/loaded = 0 // Times loaded this round
var/datum/parsed_map/cached_map
var/keep_cached_map = FALSE
/datum/map_template/New(path = null, rename = null)
/datum/map_template/New(path = null, rename = null, cache = FALSE)
if(path)
mappath = path
if(mappath)
preload_size(mappath)
preload_size(mappath, cache)
if(rename)
name = rename
/datum/map_template/proc/preload_size(path)
var/datum/parsed_map/parsed = load_map(file(path), 1, 1, 1, cropMap=FALSE, measureOnly=TRUE)
/datum/map_template/proc/preload_size(path, cache = FALSE)
var/datum/parsed_map/parsed = new(file(path))
var/bounds = parsed?.bounds
if(bounds)
width = bounds[MAP_MAXX] // Assumes all templates are rectangular, have a single Z level, and begin at 1,1,1
height = bounds[MAP_MAXY]
if(cache)
cached_map = parsed
return bounds
/datum/parsed_map/proc/initTemplateBounds()
@@ -77,8 +81,13 @@
if(T.y+height > world.maxy)
return
var/datum/parsed_map/parsed = load_map(file(mappath), T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)
var/list/bounds = parsed?.bounds
// Accept cached maps, but don't save them automatically - we don't want
// ruins clogging up memory for the whole round.
var/datum/parsed_map/parsed = cached_map || new(file(mappath))
cached_map = keep_cached_map ? parsed : null
if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE))
return
var/list/bounds = parsed.bounds
if(!bounds)
return