Files
Bubberstation/code/modules/admin/verbs/maprotation.dm
SkyratBot 6d23bf28dd [MIRROR] Adding the ability to load the configuration of custom maps. [MDB IGNORE] (#17565)
* Adding the ability to load the configuration of custom maps. (#71277)

## About The Pull Request

By default, all custom maps are assigned one standard configuration.
This option rather limits the possibilities for creating custom levels.
For example, you can not use multilevel maps, because with this
configuration will always be loaded only one level. With this PR I want
to provide the ability to load a configuration file for a custom map
similar to the standard map.json configs.

![ZpdpfZWq2V](https://user-images.githubusercontent.com/88540658/201946344-fdf8589c-0e20-475c-a9d8-b21c9ff32dd8.png)

## Why It's Good For The Game

Allows administrators to flexibly configure custom maps. For example for
events, etc.

## Changelog
🆑
admin: Adding the ability to load the configuration of custom maps
/🆑

Co-authored-by: twilightwanderer <twilightwanderer@ users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>

* Adding the ability to load the configuration of custom maps.

Co-authored-by: twilightwanderer <88540658+twilightwanderer@users.noreply.github.com>
Co-authored-by: twilightwanderer <twilightwanderer@ users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>
2022-11-18 13:19:03 -05:00

136 lines
5.0 KiB
Plaintext

/client/proc/forcerandomrotate()
set category = "Server"
set name = "Trigger Random Map Rotation"
var/rotate = tgui_alert(usr,"Force a random map rotation to trigger?", "Rotate map?", list("Yes", "Cancel"))
if (rotate != "Yes")
return
message_admins("[key_name_admin(usr)] is forcing a random map rotation.")
log_admin("[key_name(usr)] is forcing a random map rotation.")
SSmapping.maprotate()
/client/proc/adminchangemap()
set category = "Server"
set name = "Change Map"
var/list/maprotatechoices = list()
for (var/map in config.maplist)
var/datum/map_config/virtual_map = config.maplist[map]
var/mapname = virtual_map.map_name
if (virtual_map == config.defaultmap)
mapname += " (Default)"
if (virtual_map.config_min_users > 0 || virtual_map.config_max_users > 0)
mapname += " \["
if (virtual_map.config_min_users > 0)
mapname += "[virtual_map.config_min_users]"
else
mapname += "0"
mapname += "-"
if (virtual_map.config_max_users > 0)
mapname += "[virtual_map.config_max_users]"
else
mapname += "inf"
mapname += "\]"
maprotatechoices[mapname] = virtual_map
var/chosenmap = tgui_input_list(usr, "Choose a map to change to", "Change Map", sort_list(maprotatechoices)|"Custom")
if (isnull(chosenmap))
return
if(chosenmap == "Custom")
message_admins("[key_name_admin(usr)] is changing the map to a custom map")
log_admin("[key_name(usr)] is changing the map to a custom map")
var/datum/map_config/virtual_map = new
var/map_file = input("Pick file:", "Map File") as null|file
if(isnull(map_file))
return
if(copytext("[map_file]", -4) != ".dmm")//4 == length(".dmm")
to_chat(src, span_warning("Filename must end in '.dmm': [map_file]"))
return
if(fexists("_maps/custom/[map_file]"))
fdel("_maps/custom/[map_file]")
if(!fcopy(map_file, "_maps/custom/[map_file]"))
return
// This is to make sure the map works so the server does not start without a map.
var/datum/parsed_map/M = new (map_file)
if(!M)
to_chat(src, span_warning("Map '[map_file]' failed to parse properly."))
return
if(!M.bounds)
to_chat(src, span_warning("Map '[map_file]' has non-existant bounds."))
qdel(M)
return
qdel(M)
var/config_file = null
var/list/json_value = list()
var/config = tgui_alert(usr,"Would you like to upload an additional config for this map?", "Map Config", list("Yes", "No"))
if(config == "Yes")
config_file = input("Pick file:", "Config JSON File") as null|file
if(isnull(config_file))
return
if(copytext("[config_file]", -5) != ".json")
to_chat(src, span_warning("Filename must end in '.json': [config_file]"))
return
if(fexists("data/custom_map_json/[config_file]"))
fdel("data/custom_map_json/[config_file]")
if(!fcopy(config_file, "data/custom_map_json/[config_file]"))
return
if (virtual_map.LoadConfig("data/custom_map_json/[config_file]", TRUE) != TRUE)
to_chat(src, span_warning("Failed to load config: [config_file]. Check that the fields are filled out correctly. \"map_path\": \"custom\" and \"map_file\": \"your_map_name.dmm\""))
return
json_value = list(
"version" = MAP_CURRENT_VERSION,
"map_name" = virtual_map.map_name,
"map_path" = virtual_map.map_path,
"map_file" = virtual_map.map_file,
"shuttles" = virtual_map.shuttles,
"traits" = virtual_map.traits,
"job_changes" = virtual_map.job_changes,
"library_areas" = virtual_map.library_areas,
)
else
virtual_map = load_map_config()
virtual_map.map_name = input("Choose the name for the map", "Map Name") as null|text
if(isnull(virtual_map.map_name))
virtual_map.map_name = "Custom"
var/shuttles = tgui_alert(usr,"Do you want to modify the shuttles?", "Map Shuttles", list("Yes", "No"))
if(shuttles == "Yes")
for(var/s in virtual_map.shuttles)
var/shuttle = input(s, "Map Shuttles") as null|text
if(!shuttle)
continue
if(!SSmapping.shuttle_templates[shuttle])
to_chat(usr, span_warning("No such shuttle as '[shuttle]' exists, using default."))
continue
virtual_map.shuttles[s] = shuttle
json_value = list(
"version" = MAP_CURRENT_VERSION,
"map_name" = virtual_map.map_name,
"map_path" = CUSTOM_MAP_PATH,
"map_file" = "[map_file]",
"shuttles" = virtual_map.shuttles,
)
// If the file isn't removed text2file will just append.
if(fexists(PATH_TO_NEXT_MAP_JSON))
fdel(PATH_TO_NEXT_MAP_JSON)
text2file(json_encode(json_value), PATH_TO_NEXT_MAP_JSON)
if(SSmapping.changemap(virtual_map))
message_admins("[key_name_admin(usr)] has changed the map to [virtual_map.map_name]")
SSmapping.map_force_chosen = TRUE
fdel("data/custom_map_json/[config_file]")
else
var/datum/map_config/virtual_map = maprotatechoices[chosenmap]
message_admins("[key_name_admin(usr)] is changing the map to [virtual_map.map_name]")
log_admin("[key_name(usr)] is changing the map to [virtual_map.map_name]")
if (SSmapping.changemap(virtual_map))
message_admins("[key_name_admin(usr)] has changed the map to [virtual_map.map_name]")
SSmapping.map_force_chosen = TRUE