Files
Bubberstation/code/modules/buildmode/submodes/map_export.dm
Aylong 7a817300fd Improve and extend fieldset_block and examine_block (#88678)
## About The Pull Request
Maked `fieldset_block` and `examine_block` more stylish and neat, also
`fieldset_block` no longer has a centred title.
Renamed `examine_block` to `boxed_message` and adds
`custom_boxed_message` which can be colored.

- AdminPMs, admin tickets and vote results has been wrapped into
`fieldset_block` for comfort and visibility
- Health Analyzer results painted to blue
- Vote notice and tips of the round wrapped to purple
`custom_boxed_message`
- Tooltip text border color, now uses text color, not just white

## Why It's Good For The Game
Demonstration in both themes

<details><summary>Dark</summary>


![image](https://github.com/user-attachments/assets/7175379b-b053-4fb7-bd25-65c744a21c56)

![image](https://github.com/user-attachments/assets/1728e72b-0110-4b81-9d61-8779f5fdc3a0)

![image](https://github.com/user-attachments/assets/5e6f9604-35b8-4840-b6b4-35a68f49a997)

</details>

<details><summary>Light</summary>


![image](https://github.com/user-attachments/assets/6a3d693b-e0dc-4a4b-b4d7-2ded54ce0d67)

![image](https://github.com/user-attachments/assets/c4f5e089-180f-4d13-806a-fa64f01740a3)

![image](https://github.com/user-attachments/assets/a46d52c4-ad37-4637-8cae-c4b00139efc1)

</details>

## Changelog

🆑
qol: AdminPMs, admin tickets, vote results and started vote notification
are now much more visible in the chat.
qol: Boxed messages in chat (like examine), has been restyled.
/🆑
2024-12-24 11:32:38 -08:00

92 lines
3.9 KiB
Plaintext

/datum/buildmode_mode/map_export
key = "mapexport"
use_corner_selection = TRUE
/// Variable with the flag value to understand how to treat the shuttle zones.
var/shuttle_flag = SAVE_SHUTTLEAREA_DONTCARE
/// Variable with a flag value to indicate what should be saved (for example, only objects or only mobs).
var/save_flag = ALL
/datum/buildmode_mode/map_export/change_settings(client/builder)
var/static/list/options = list(
"Object Saving" = SAVE_OBJECTS,
"Mob Saving" = SAVE_MOBS,
"Turf Saving" = SAVE_TURFS,
"Area Saving" = SAVE_AREAS,
"Space Turf Saving" = SAVE_SPACE,
"Object Property Saving" = SAVE_OBJECT_PROPERTIES,
)
var/what_to_change = tgui_input_list(builder, "What export setting would you like to toggle?", "Map Exporter", options)
if (!what_to_change)
return
save_flag ^= options[what_to_change]
to_chat(builder, span_notice("[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"]."))
/datum/buildmode_mode/map_export/show_help(client/builder)
to_chat(builder, span_purple(boxed_message(
"[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\
[span_bold("Set export options")] -> Right Mouse Button on buildmode button"))
)
/datum/buildmode_mode/map_export/handle_selected_area(client/builder, params)
var/list/listed_params = params2list(params)
var/left_click = listed_params.Find("left")
//Ensure the selection is actually done
if(!left_click)
to_chat(builder, span_warning("Invalid selection."))
return
//If someone somehow gets build mode, stop them from using this.
if(!check_rights(R_DEBUG))
message_admins("[ckey(builder)] tried to run the map save generator but was rejected due to insufficient perms.")
to_chat(builder, span_warning("You must have +ADMIN rights to use this."))
return
//Emergency check
if(get_dist(cornerA, cornerB) > 60 || cornerA.z != cornerB.z)
var/confirm = tgui_alert(builder, "Are you sure about this? Exporting large maps may take quite a while.", "Map Exporter", list("Yes", "No"))
if(confirm != "Yes")
return
if(cornerA == cornerB)
return
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(_save_map), cornerA, cornerB, save_flag, shuttle_flag)
/// A guard variable to prevent more than one map export process from occurring at the same time.
GLOBAL_VAR_INIT(map_writing_running, FALSE)
/// Hey bud don't call this directly, it exists so we can invoke async and prevent the buildmode datum being qdel'd from halting this proc
/proc/_save_map(turf/cornerA, turf/cornerB, save_flag, shuttle_flag)
if(!check_rights(R_DEBUG))
message_admins("[ckey(usr)] tried to run the map save generator but was rejected due to insufficient perms.")
to_chat(usr, span_warning("You must have +ADMIN rights to use this."))
return
if(GLOB.map_writing_running)
to_chat(usr, span_warning("Someone is already running the generator! Try again in a little bit."))
return
to_chat(usr, span_warning("Saving, please wait..."))
GLOB.map_writing_running = TRUE
//I put this before the actual saving of the map because it likely won't log if it crashes the fucking server
log_admin("Build Mode: [key_name(usr)] is exporting the map area from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]")
//oversimplified for readability and understandibility
var/minx = min(cornerA.x, cornerB.x)
var/miny = min(cornerA.y, cornerB.y)
var/minz = min(cornerA.z, cornerB.z)
var/maxx = max(cornerA.x, cornerB.x)
var/maxy = max(cornerA.y, cornerB.y)
var/maxz = max(cornerA.z, cornerB.z)
//Step 1: Get the data (This can take a while)
var/dat = write_map(minx, miny, minz, maxx, maxy, maxz, save_flag, shuttle_flag)
//Step 2: Write the data to a file and give map to client
var/date = time2text(world.timeofday, "YYYY-MM-DD_hh-mm-ss")
var/file_name = sanitize_filename(tgui_input_text(usr, "Filename?", "Map Exporter", "exported_map_[date]"))
send_exported_map(usr, file_name, dat)
to_chat(usr, span_green("The map was successfully saved!"))
GLOB.map_writing_running = FALSE