Skip to content

Commit 75ecc37

Browse files
Absolucynotghosti
authored andcommitted
[PORT] Fancy boxed messages! (Monkestation#4676)
* [PORT] Fancy boxed messages! Ports tgstation/tgstation#88678 and tgstation/tgstation#88735 * fix highlights * also fix that * revert sass update and just backport the new scss * remove the big scary admin message as it's not really needed any more
1 parent ad0b103 commit 75ecc37

File tree

45 files changed

+327
-126
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+327
-126
lines changed

code/__DEFINES/chat.dm

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,14 @@
4545
/// Used for debug messages to the server
4646
#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]")
4747
/// Adds a generic box around whatever message you're sending in chat. Really makes things stand out.
48-
#define examine_block(str) ("<div class='examine_block'>" + str + "</div>")
48+
#define boxed_message(str) ("<div class='boxed_message'>" + str + "</div>")
49+
/// Adds a box around whatever message you're sending in chat. Can apply color and/or additional classes. Available colors: red, green, blue, purple. Use it like red_box
50+
#define custom_boxed_message(classes, str) ("<div class='boxed_message " + classes + "'>" + str + "</div>")
51+
/// Makes a fieldset with a neaty styled name. Can apply additional classes.
52+
#define fieldset_block(title, content, classes) ("<fieldset class='fieldset " + classes + "'><legend class='fieldset_legend'>" + title + "</legend>" + content + "</fieldset>")
53+
/// Makes a horizontal line with text in the middle
54+
#define separator_hr(str) ("<div class='separator'>" + str + "</div>")
55+
/// Emboldens runechat messages
56+
#define RUNECHAT_BOLD(str) "+[str]+"
57+
/// Helper which creates a chat message which may have a tooltip in some contexts, but not others.
58+
#define conditional_tooltip(normal_text, tooltip_text, condition) ((condition) ? (span_tooltip(tooltip_text, normal_text)) : (normal_text))

code/__HELPERS/game.dm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,16 +295,16 @@
295295
* Tips that starts with the @ character won't be html encoded. That's necessary for any tip containing markup tags,
296296
* just make sure they don't also have html characters like <, > and ' which will be garbled.
297297
*/
298-
/proc/send_tip_of_the_round(target, selected_tip)
298+
/proc/send_tip_of_the_round(target, selected_tip, source = "Tip of the round")
299299
var/message
300300
if(selected_tip)
301301
message = selected_tip
302302
else
303303
var/list/randomtips = world.file2list("strings/tips.txt")
304304
var/list/memetips = world.file2list("strings/sillytips.txt")
305-
if(randomtips.len && prob(95))
305+
if(length(randomtips) && prob(95))
306306
message = pick(randomtips)
307-
else if(memetips.len)
307+
else if(length(memetips))
308308
message = pick(memetips)
309309

310310
if(!message)
@@ -313,4 +313,4 @@
313313
message = html_encode(message)
314314
else
315315
message = copytext(message, 2)
316-
to_chat(target, span_purple(examine_block("<span class='oocplain'><b>Tip of the round: </b>[message]</span>")))
316+
to_chat(target, custom_boxed_message("purple_box", span_purple("<span class='oocplain'><b>[source]: </b>[message]</span>")))

code/_onclick/hud/new_player.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@
516516
var/server_link = "byond://[server_ip]:[server_port]"
517517
to_chat_immediate(
518518
target = hud.mymob,
519-
html = examine_block(span_info(span_big("Connecting you to [server_name]\nIf nothing happens, try manually connecting to the server ([server_link]), or the server may be down!"))),
519+
html = boxed_message(span_info(span_big("Connecting you to [server_name]\nIf nothing happens, try manually connecting to the server ([server_link]), or the server may be down!"))),
520520
type = MESSAGE_TYPE_INFO,
521521
)
522522
hud.mymob.client << link(server_link)

code/controllers/subsystem.dm

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,6 @@
205205
iter_count++
206206
if(iter_count >= ENQUEUE_SANITY)
207207
var/msg = "[src] subsystem has likely entered an infinite enqueue loop, restarting MC immediately!"
208-
to_chat_immediate(
209-
GLOB.admins,
210-
examine_block(span_userdanger("ERROR: [msg]")),
211-
type = MESSAGE_TYPE_DEBUG
212-
)
213208
/* log_enqueue(msg, list("enqueue_log" = enqueue_log.Copy())) */
214209
SSplexora.mc_alert("[src] has likely entered an infinite loop in enqueue(), we're restarting the MC immediately!")
215210
stack_trace("enqueue() entered an infinite loop, we're restarting the MC!")

code/controllers/subsystem/polling.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ SUBSYSTEM_DEF(polling)
181181
var/surrounding_icon
182182
if(surrounding_image)
183183
surrounding_icon = icon2html(surrounding_image, candidate_mob, extra_classes = "bigicon")
184-
var/final_message = examine_block("<span style='text-align:center;display:block'>[surrounding_icon] <span style='font-size:1.2em'>[span_ooc(question)]</span> [surrounding_icon]\n[act_jump] [act_signup] [act_never]</span>")
184+
var/final_message = boxed_message("<span style='text-align:center;display:block'>[surrounding_icon] <span style='font-size:1.2em'>[span_ooc(question)]</span> [surrounding_icon]\n[act_jump] [act_signup] [act_never]</span>")
185185
to_chat(candidate_mob, final_message)
186186

187187
// Start processing it so it updates visually the timer

code/controllers/subsystem/vote.dm

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ SUBSYSTEM_DEF(vote)
8787
var/to_display = current_vote.get_result_text(winners, final_winner, non_voters)
8888

8989
log_vote(to_display)
90-
to_chat(world, "\n" + examine_block(span_infoplain(vote_font("[to_display]"))) + "\n", type = MESSAGE_TYPE_OOC) // monkestation edit: wrap in examine block, use MESSAGE_TYPE_OOC
90+
if(to_display)
91+
to_chat(world, span_infoplain(vote_font("[to_display]")), type = MESSAGE_TYPE_OOC)
9192

9293
// Finally, doing any effects on vote completion
9394
if (final_winner) // if no one voted final_winner will be null
@@ -235,9 +236,9 @@ SUBSYSTEM_DEF(vote)
235236
var/to_display = current_vote.initiate_vote(vote_initiator_name, duration)
236237

237238
log_vote(to_display)
238-
to_chat(world, "\n" + examine_block(span_infoplain(vote_font("[span_bold(to_display)]\n\
239+
to_chat(world, custom_boxed_message("purple_box center", span_infoplain(vote_font("[span_bold(to_display)]<br>\
239240
Type <b>vote</b> or click <a href='byond://winset?command=vote'>here</a> to place your votes.\n\
240-
You have [DisplayTimeText(duration)] to vote."))) + "\n", type = MESSAGE_TYPE_OOC) // monkestation edit: wrap in examine block, use MESSAGE_TYPE_OOC
241+
You have [DisplayTimeText(duration)] to vote."))), type = MESSAGE_TYPE_OOC)
241242

242243
// And now that it's going, give everyone a voter action
243244
for(var/client/new_voter as anything in GLOB.clients)

code/datums/ai_laws/ai_laws.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ GLOBAL_VAR(round_default_lawset)
426426

427427
/datum/ai_laws/proc/show_laws(mob/to_who)
428428
var/list/printable_laws = get_law_list(include_zeroth = TRUE)
429-
to_chat(to_who, examine_block(jointext(printable_laws, "\n")))
429+
to_chat(to_who, boxed_message(jointext(printable_laws, "\n")))
430430

431431
/datum/ai_laws/proc/associate(mob/living/silicon/M)
432432
if(!owner)

code/datums/components/trader/trader.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ Can accept both a type path, and an instance of a datum. Type path has priority.
394394
else
395395
buy_info += span_notice("&bull; [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name][product_info[TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION]]; willing to buy [span_green("[tern_op_result]")]")
396396

397-
to_chat(customer, examine_block(buy_info.Join("\n")))
397+
to_chat(customer, boxed_message(buy_info.Join("\n")))
398398

399399
///Displays to the customer what the trader is selling and how much is in stock
400400
/datum/component/trader/proc/trader_sells_what(mob/customer)
@@ -413,7 +413,7 @@ Can accept both a type path, and an instance of a datum. Type path has priority.
413413
sell_info += span_notice("&bull; [span_red("(OUT OF STOCK)")] [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name]; [span_red("[tern_op_result]")] left in stock")
414414
else
415415
sell_info += span_notice("&bull; [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name]; [span_green("[tern_op_result]")] left in stock")
416-
to_chat(customer, examine_block(sell_info.Join("\n")))
416+
to_chat(customer, boxed_message(sell_info.Join("\n")))
417417

418418
///Sets quantity of all products to initial(quanity); this proc is currently called during initialize
419419
/datum/component/trader/proc/restock_products()

code/datums/elements/weapon_description.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
SIGNAL_HANDLER
5858

5959
if(href_list["examine"])
60-
to_chat(user, span_notice(examine_block("[build_label_text(source)]")))
60+
to_chat(user, span_notice(boxed_message("[build_label_text(source)]")))
6161

6262
/**
6363
*

code/datums/mind/skills.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@
7575
var/datum/skill/the_skill = i
7676
msg += "[initial(the_skill.name)] - [get_skill_level_name(the_skill)]\n"
7777
msg += "</span>"
78-
to_chat(user, examine_block(msg))
78+
to_chat(user, boxed_message(msg))

code/datums/mood.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@
399399

400400
if(LAZYLEN(mob_parent.quirks))
401401
msg += span_notice("You have these quirks: [mob_parent.get_quirk_string(FALSE, CAT_QUIRK_ALL)].")
402-
to_chat(user, examine_block(msg))
402+
to_chat(user, boxed_message(msg))
403403

404404
/// Updates the mob's moodies, if the area provides a mood bonus
405405
/datum/mood/proc/check_area_mood(datum/source, area/new_area)

code/datums/votes/_vote_datum.dm

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,22 +172,58 @@
172172
* Return a formatted string of text to be displayed to everyone.
173173
*/
174174
/datum/vote/proc/get_result_text(list/all_winners, real_winner, list/non_voters)
175-
if(length(all_winners) <= 0 || !real_winner)
176-
return span_bold("Vote Result: Inconclusive - No Votes!")
177-
175+
var/title_text = ""
178176
var/returned_text = ""
179177
if(override_question)
180-
returned_text += span_bold(override_question)
178+
title_text += span_bold(override_question)
181179
else
182-
returned_text += span_bold("[capitalize(name)] Vote")
183-
180+
title_text += span_bold("[capitalize(name)] Vote")
181+
182+
/*
183+
returned_text += "Winner Selection: "
184+
switch(winner_method)
185+
if(VOTE_WINNER_METHOD_NONE)
186+
returned_text += "None"
187+
if(VOTE_WINNER_METHOD_WEIGHTED_RANDOM)
188+
returned_text += "Weighted Random"
189+
else
190+
returned_text += "Simple"
191+
*/
192+
193+
var/total_votes = 0 // for determining percentage of votes
184194
for(var/option in choices)
195+
total_votes += choices[option]
185196
returned_text += "\n[span_bold(option)]: [choices[option]]"
186197

198+
if(total_votes <= 0)
199+
return span_bold("Vote Result: Inconclusive - No Votes!")
200+
201+
/*
202+
if (display_statistics)
203+
returned_text += "\nResults:"
204+
for(var/option in choices)
205+
returned_text += "\n"
206+
var/votes = choices[option]
207+
var/percentage_text = ""
208+
if(votes > 0)
209+
var/actual_percentage = round((votes / total_votes) * 100, 0.1)
210+
var/text = "[actual_percentage]"
211+
var/spaces_needed = 5 - length(text)
212+
for(var/_ in 1 to spaces_needed)
213+
returned_text += " "
214+
percentage_text += "[text]%"
215+
else
216+
percentage_text = " 0%"
217+
returned_text += "[percentage_text] | [span_bold(option)]: [choices[option]]"
218+
*/
219+
220+
if(!real_winner) // vote has no winner or cannot be won, but still had votes
221+
return returned_text
222+
187223
returned_text += "\n"
188224
returned_text += get_winner_text(all_winners, real_winner, non_voters)
189225

190-
return returned_text
226+
return fieldset_block(title_text, returned_text, "boxed_message purple_box")
191227

192228
/**
193229
* Gets the text that displays the winning options within the result text.

code/game/objects/items/AI_modules/_AI_modules.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
/obj/item/ai_module/attack_self(mob/user as mob)
3838
..()
39-
to_chat(user, examine_block(display_laws()))
39+
to_chat(user, boxed_message(display_laws()))
4040

4141
/// Returns a text display of the laws for the module.
4242
/obj/item/ai_module/proc/display_laws()

code/game/objects/items/devices/flashlight.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
render_list += "<span class='danger ml-1'>[M.p_their(TRUE)] pupils give an eerie glow!</span>\n"//mob has X-ray vision
148148

149149
//display our packaged information in an examine block for easy reading
150-
to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
150+
to_chat(user, boxed_message(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
151151

152152
if(BODY_ZONE_PRECISE_MOUTH)
153153

@@ -240,7 +240,7 @@
240240
render_list += "<span class='notice ml-1'>Color returns quickly.</span>\n"//they're okay :D
241241

242242
//display our packaged information in an examine block for easy reading
243-
to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
243+
to_chat(user, boxed_message(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
244244

245245
else
246246
return ..()

code/game/objects/items/devices/scanners/gas_analyzer.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@
212212
message += span_bold("Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.")
213213
message += span_notice("Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.")
214214
// we let the join apply newlines so we do need handholding
215-
to_chat(user, examine_block(jointext(message, "\n")), type = MESSAGE_TYPE_INFO)
215+
to_chat(user, boxed_message(jointext(message, "\n")), type = MESSAGE_TYPE_INFO)
216216
return TRUE
217217

218218
/proc/fusionpower2text(power) //used when displaying fusion power on analyzers

code/game/objects/items/devices/scanners/health_analyzer.dm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@
428428
// we handled the last <br> so we don't need handholding
429429

430430
if(tochat)
431-
to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
431+
to_chat(user, custom_boxed_message("blue_box", jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
432432
else
433433
return(jointext(render_list, ""))
434434

@@ -495,7 +495,7 @@
495495
render_list += "<span class='alert ml-2'>[allergies]</span>\n"
496496

497497
// we handled the last <br> so we don't need handholding
498-
to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
498+
to_chat(user, custom_boxed_message("blue_box", jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
499499

500500
/obj/item/healthanalyzer/AltClick(mob/user)
501501
..()
@@ -548,7 +548,7 @@
548548
simple_scanner.show_emotion(AID_EMOTION_HAPPY)
549549
to_chat(user, "<span class='notice ml-1'>No wounds detected in subject.</span>")
550550
else
551-
to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
551+
to_chat(user, custom_boxed_message("blue_box", jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
552552
if(simple_scan)
553553
var/obj/item/healthanalyzer/simple/simple_scanner = scanner
554554
simple_scanner.show_emotion(AID_EMOTION_WARN)

code/modules/admin/topic.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@
855855
exportable_text += "[special_role_description]<br>"
856856
exportable_text += ADMIN_FULLMONTY_NONAME(subject)
857857

858-
to_chat(src.owner, examine_block(exportable_text), confidential = TRUE)
858+
to_chat(src.owner, boxed_message(exportable_text), confidential = TRUE)
859859

860860
else if(href_list["addjobslot"])
861861
if(!check_rights(R_ADMIN))

code/modules/admin/verbs/adminhelp.dm

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,12 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
414414
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
415415
var/ref_src = "[REF(src)]"
416416
//Message to be sent to all admins
417-
var/admin_msg = span_adminnotice(span_adminhelp("Ticket [TicketHref("#[id]", ref_src)]</span><b>: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]:</b> [span_linkify(keywords_lookup(msg))]"))
417+
var/admin_msg = fieldset_block(
418+
span_adminhelp("Ticket [TicketHref("#[id]", ref_src)]"),
419+
"<b>[LinkedReplyName(ref_src)]</b>\n\n\
420+
[span_linkify(keywords_lookup(msg))]\n\n\
421+
<b class='smaller'>[FullMonty(ref_src)]</b>",
422+
"boxed_message red_box")
418423

419424
AddInteraction("<font color='red'>[LinkedReplyName(ref_src)]: [msg]</font>", player_message = "<font color='red'>[LinkedReplyName(ref_src)]: [msg]</font>")
420425
log_admin_private("Ticket #[id]: [key_name(initiator)]: [msg]")

code/modules/admin/verbs/adminpm.dm

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,6 @@
406406
recipient_ticket_id = recipient_ticket?.id
407407
SSblackbox.LogAhelp(recipient_ticket_id, "Ticket Opened", send_message, recipient.ckey, src.ckey)
408408

409-
to_chat(recipient,
410-
type = MESSAGE_TYPE_ADMINPM,
411-
html = "<font color='red' size='4'><b>-- Administrator private message --</b></font>",
412-
confidential = TRUE)
413-
414409
recipient.receive_ahelp(
415410
link_to_us,
416411
span_linkify(send_message),
@@ -424,10 +419,6 @@
424419
else
425420
SSplexora.aticket_pm(ticket || recipient_ticket, raw_send_message, src.ckey) // monkestation edit: PLEXORA
426421
// monkestation end: PLEXORA
427-
to_chat(recipient,
428-
type = MESSAGE_TYPE_ADMINPM,
429-
html = span_adminsay("<i>Click on the administrator's name to reply.</i>"),
430-
confidential = TRUE)
431422
to_chat(src,
432423
type = MESSAGE_TYPE_ADMINPM,
433424
html = span_notice("Admin PM to-<b>[their_name_with_link]</b>: [span_linkify(send_message)]"),
@@ -737,21 +728,11 @@
737728
message_admins("External message from [sender] to [recipient_name_linked] : [message]")
738729
log_admin_private("External PM: [sender] -> [recipient_name] : [message]")
739730

740-
to_chat(recipient,
741-
type = MESSAGE_TYPE_ADMINPM,
742-
html = "<font color='red' size='4'><b>-- Administrator private message --</b></font>",
743-
confidential = TRUE)
744-
745731
recipient.receive_ahelp(
746732
"<a href='?priv_msg=[stealthkey]'>[adminname]</a>",
747733
message,
748734
)
749735

750-
to_chat(recipient,
751-
type = MESSAGE_TYPE_ADMINPM,
752-
html = span_adminsay("<i>Click on the administrator's name to reply.</i>"),
753-
confidential = TRUE)
754-
755736
admin_ticket_log(recipient, "<font color='purple'>PM From [tgs_tagged]: [message]</font>", log_in_blackbox = FALSE)
756737

757738
window_flash(recipient, ignorepref = TRUE)
@@ -796,8 +777,13 @@
796777
to_chat(
797778
src,
798779
type = MESSAGE_TYPE_ADMINPM,
799-
html = "<span class='[span_class]'>Admin PM from-<b>[reply_to]</b>: [message]</span>",
800-
confidential = TRUE,
780+
html = fieldset_block(
781+
span_adminhelp("Administrator private message"),
782+
"<span class='[span_class]'>Admin PM from-<b>[reply_to]</b></span>\n\n\
783+
<span class='[span_class]'>[message]</span>\n\n\
784+
<i class='adminsay'>Click on the administrator's name to reply.</i>",
785+
"boxed_message red_box"),
786+
confidential = TRUE
801787
)
802788

803789
current_ticket?.player_replied = FALSE

code/modules/admin/verbs/mapping.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ GLOBAL_VAR_INIT(say_disabled, FALSE)
375375
messages += "<tr><td>[part.Join("</td><td>")]</td></tr>"
376376
messages += "</table>"
377377

378-
to_chat(src, examine_block(messages.Join("")), confidential = TRUE)
378+
to_chat(src, boxed_message(messages.Join("")), confidential = TRUE)
379379

380380
/client/proc/station_food_debug()
381381
set name = "Count Station Food"

code/modules/buildmode/submodes/map_export.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
to_chat(builder, "<span class='notice'>[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"].</span>")
2121

2222
/datum/buildmode_mode/map_export/show_help(client/builder)
23-
to_chat(builder, span_purple(examine_block(
23+
to_chat(builder, span_purple(boxed_message(
2424
"[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\
2525
[span_bold("Set export options")] -> Right Mouse Button on buildmode button"))
2626
)

0 commit comments

Comments
 (0)