VChat: Redone chat output done in Vue.js

This commit is contained in:
Aronai Sieyes
2020-03-27 17:07:28 -04:00
committed by VirgoBot
parent 0313b8d342
commit 8a33afaff6
15 changed files with 142 additions and 40 deletions

View File

@@ -78,8 +78,12 @@
#define COLOR_RED_LIGHT "#FF3333"
#define COLOR_DEEP_SKY_BLUE "#00e1ff"
<<<<<<< HEAD
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : null))
=======
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (isclient(I) ? I : null))
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
// Shuttles.

View File

@@ -49,6 +49,7 @@
Log(message, message_title)
datum/announcement/proc/Message(message as text, message_title as text)
<<<<<<< HEAD
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", announcer ? announcer : ANNOUNCER_NAME)
datum/announcement/minor/Message(message as text, message_title as text)
@@ -62,6 +63,40 @@ datum/announcement/priority/command/Message(message as text, message_title as te
datum/announcement/priority/security/Message(message as text, message_title as text)
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", ANNOUNCER_NAME)
=======
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, "<h2 class='alert'>[title]</h2>")
to_chat(M, "<span class='alert'>[message]</span>")
if (announcer)
to_chat(M, "<span class='alert'> -[html_encode(announcer)]</span>")
datum/announcement/minor/Message(message as text, message_title as text)
to_world("<b>[message]</b>")
datum/announcement/priority/Message(message as text, message_title as text)
to_world("<h1 class='alert'>[message_title]</h1>")
to_world("<span class='alert'>[message]</span>")
if(announcer)
to_world("<span class='alert'> -[html_encode(announcer)]</span>")
to_world("<br>")
datum/announcement/priority/command/Message(message as text, message_title as text)
var/command
command += "<h1 class='alert'>[command_name()] Update</h1>"
if (message_title)
command += "<br><h2 class='alert'>[message_title]</h2>"
command += "<br><span class='alert'>[message]</span><br>"
command += "<br>"
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, command)
datum/announcement/priority/security/Message(message as text, message_title as text)
to_world("<font size=4 color='red'>[message_title]</font>")
to_world("<font color='red'>[message]</font>")
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
datum/announcement/proc/NewsCast(message as text, message_title as text)
if(!newscast)

View File

@@ -538,15 +538,15 @@ proc/get_nt_opposed()
set category = "OOC"
if(!ticker || !ticker.mode)
to_chat(usr, "Something is terribly wrong; there is no gametype.")
to_chat(usr, "<span class='warning'>Something is terribly wrong; there is no gametype.</span>")
return
if(master_mode != "secret")
to_chat(usr, "<b>The roundtype is [capitalize(ticker.mode.name)]</b>")
to_chat(usr, "<span class='notice'><b>The roundtype is [capitalize(ticker.mode.name)]</b></span>")
if(ticker.mode.round_description)
to_chat(usr, "<i>[ticker.mode.round_description]</i>")
to_chat(usr, "<span class='notice'><i>[ticker.mode.round_description]</i></span>")
if(ticker.mode.extended_round_description)
to_chat(usr, "[ticker.mode.extended_round_description]")
to_chat(usr, "<span class='notice'>[ticker.mode.extended_round_description]</span>")
else
to_chat(usr, "<i>Shhhh</i>. It's a secret.")
to_chat(usr, "<span class='notice'><i>Shhhh</i>. It's a secret.</span>")
return

View File

@@ -177,6 +177,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
message_log += "<B>Message sent to [recipient]</B><BR>[message]"
else
audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
<<<<<<< HEAD
//Handle printing
if (href_list["print"])
@@ -187,6 +188,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/obj/item/weapon/paper/R = new(src.loc)
R.name = "[department] Message"
R.info = "<H3>[department] Requests Console</H3><div>[msg]</div>"
=======
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
//Handle screen switching
if(href_list["setScreen"])

View File

@@ -71,4 +71,5 @@
msg += "[line]\n"
msg += "<b>Total Players: [length(Lines)]</b>"
msg = "<span class='info'>" + msg + "</span>"
to_chat(src, msg)

View File

@@ -6,7 +6,7 @@
set category = null
set name = "Admin PM Mob"
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM-Context: Only administrators may use this command.</span>")
return
if( !ismob(M) || !M.client )
return
@@ -18,7 +18,7 @@
set category = "Admin"
set name = "Admin PM"
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM-Panel: Only administrators may use this command.</span>")
return
var/list/client/targets[0]
for(var/client/T)
@@ -37,7 +37,7 @@
/client/proc/cmd_ahelp_reply(whom)
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
return
var/client/C
if(istext(whom))
@@ -48,16 +48,16 @@
C = whom
if(!C)
if(holder)
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: Client not found.</span>")
return
var/datum/admin_help/AH = C.current_ticket
if(AH)
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
message_admins("<span class='pm'>[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.</span>")
var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
if (!msg)
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
message_admins("<span class='pm'>[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.</span>")
return
cmd_admin_pm(whom, msg, AH)
@@ -65,12 +65,12 @@
//Fetching a message if needed. src is the sender and C is the target client
/client/proc/cmd_admin_pm(whom, msg, datum/admin_help/AH)
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
return
if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo
to_chat(src, "<font color='red'>You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.</font>")
to_chat(src, "<font color='blue'>Message: [msg]</font>")
to_chat(src, "<span class='pm warning'>You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.</span>")
to_chat(src, "<span class='pm notice'>Message: [msg]</span>")
return
var/client/recipient
@@ -95,14 +95,14 @@
if(!msg)
return
if(holder)
to_chat(src, "<font color='red'>Error: Use the admin IRC channel, nerd.</font>")
to_chat(src, "<span class='pm warning'>Error: Use the admin IRC channel, nerd.</span>")
return
else
if(!recipient)
if(holder)
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: Client not found.</span>")
to_chat(src, msg)
else
current_ticket.MessageNoRecipient(msg)
@@ -116,12 +116,12 @@
return
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
return
if(!recipient)
if(holder)
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: Client not found.</span>")
else
current_ticket.MessageNoRecipient(msg)
return
@@ -140,27 +140,27 @@
var/keywordparsedmsg = keywords_lookup(msg)
if(irc)
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: [rawmsg]</font>")
admin_ticket_log(src, "<font color='red'>Reply PM from-<b>[key_name(src, TRUE, TRUE)]</b> to <i>IRC</i>: [keywordparsedmsg]</font>")
to_chat(src, "<span class='pm notice'>PM to-<b>Admins</b>: [rawmsg]</span>")
admin_ticket_log(src, "<span class='pm warning'>Reply PM from-<b>[key_name(src, TRUE, TRUE)]</b> to <i>IRC</i>: [keywordparsedmsg]</span>")
ircreplyamount--
send2irc("Reply: [ckey]",rawmsg)
else
if(recipient.holder)
if(holder) //both are admins
to_chat(recipient, "<font color='red'>Admin PM from-<b>[key_name(src, recipient, 1)]</b>: [keywordparsedmsg]</font>")
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: [keywordparsedmsg]</font>")
to_chat(recipient, "<span class='pm warning'>Admin PM from-<b>[key_name(src, recipient, 1)]</b>: [keywordparsedmsg]</span>")
to_chat(src, "<span class='pm notice'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: [keywordparsedmsg]</span>")
//omg this is dumb, just fill in both their tickets
var/interaction_message = "<font color='purple'>PM from-<b>[key_name(src, recipient, 1)]</b> to-<b>[key_name(recipient, src, 1)]</b>: [keywordparsedmsg]</font>"
var/interaction_message = "<span class='pm notice'>PM from-<b>[key_name(src, recipient, 1)]</b> to-<b>[key_name(recipient, src, 1)]</b>: [keywordparsedmsg]</span>"
admin_ticket_log(src, interaction_message)
if(recipient != src) //reeee
admin_ticket_log(recipient, interaction_message)
else //recipient is an admin but sender is not
var/replymsg = "<font color='red'>Reply PM from-<b>[key_name(src, recipient, 1)]</b>: [keywordparsedmsg]</font>"
var/replymsg = "<span class='pm warning'>Reply PM from-<b>[key_name(src, recipient, 1)]</b>: [keywordparsedmsg]</span>"
admin_ticket_log(src, replymsg)
to_chat(recipient, replymsg)
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>")
to_chat(src, "<span class='pm notice'>PM to-<b>Admins</b>: [msg]</span>")
//play the recieving admin the adminhelp sound (if they have them enabled)
if(recipient.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
@@ -171,12 +171,12 @@
if(!recipient.current_ticket)
new /datum/admin_help(msg, recipient, TRUE)
to_chat(recipient, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
to_chat(recipient, "<font color='red'>Admin PM from-<b>[key_name(src, recipient, 0)]</b>: [msg]</font>")
to_chat(recipient, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: [msg]</font>")
to_chat(recipient, "<span class='pm warning' size='4'><b>-- Administrator private message --</b></span>")
to_chat(recipient, "<span class='pm warning'>Admin PM from-<b>[key_name(src, recipient, 0)]</b>: [msg]</span>")
to_chat(recipient, "<span class='pm warning'><i>Click on the administrator's name to reply.</i></span>")
to_chat(src, "<span class='pm notice'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: [msg]</span>")
admin_ticket_log(recipient, "<font color='blue'>PM From [key_name_admin(src)]: [keywordparsedmsg]</font>")
admin_ticket_log(recipient, "<span class='pm notice'>PM From [key_name_admin(src)]: [keywordparsedmsg]</span>")
//always play non-admin recipients the adminhelp sound
recipient << 'sound/effects/adminhelp.ogg'
@@ -195,19 +195,19 @@
return
else //neither are admins
to_chat(src, "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>")
to_chat(src, "<span class='pm warning'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</span>")
return
if(irc)
log_admin("PM: [key_name(src)]->IRC: [rawmsg]")
for(var/client/X in admins)
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]-&gt;IRC:</B> [keywordparsedmsg]</font>")
to_chat(X, "<span class='pm notice'><B>PM: [key_name(src, X, 0)]-&gt;IRC:</B> [keywordparsedmsg]</span>")
else
log_admin("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in admins)
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]-&gt;[key_name(recipient, X, 0)]:</B> [keywordparsedmsg]</font>" )
to_chat(X, "<span class='pm notice'><B>PM: [key_name(src, X, 0)]-&gt;[key_name(recipient, X, 0)]:</B> [keywordparsedmsg]</span>" )
/proc/IrcPm(target,msg,sender)
var/client/C = GLOB.directory[target]
@@ -256,11 +256,11 @@
message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]")
log_admin("IRC PM: [sender] -> [key_name(C)] : [msg]")
to_chat(C, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
to_chat(C, "<font color='red'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</font>")
to_chat(C, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
to_chat(C, "<span class='pm warning'><font size='4'><b>-- Administrator private message --</b></font></span>")
to_chat(C, "<span class='pm warning'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</span>")
to_chat(C, "<span class='pm warning'><i>Click on the administrator's name to reply.</i></span>")
admin_ticket_log(C, "<font color='blue'>PM From [irc_tagged]: [msg]</font>")
admin_ticket_log(C, "<span class='pm notice'>PM From [irc_tagged]: [msg]</span>")
window_flash(C, ignorepref = TRUE)
//always play non-admin recipients the adminhelp sound

View File

@@ -29,6 +29,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
//This proc sends the asset to the client, but only if it needs it.
//This proc blocks(sleeps) unless verify is set to false
/proc/send_asset(var/client/client, var/asset_name, var/verify = TRUE)
<<<<<<< HEAD
if(!istype(client))
if(ismob(client))
var/mob/M = client
@@ -40,6 +41,11 @@ You can set verify to TRUE if you want send() to sleep until the client has the
else
return 0
=======
client = CLIENT_FROM_VAR(client) // Will get client from a mob, or accept a client, or return null
if(!istype(client))
return 0
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
return 0
@@ -73,6 +79,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
//This proc blocks(sleeps) unless verify is set to false
/proc/send_asset_list(var/client/client, var/list/asset_list, var/verify = TRUE)
<<<<<<< HEAD
if(!istype(client))
if(ismob(client))
var/mob/M = client
@@ -84,6 +91,11 @@ You can set verify to TRUE if you want send() to sleep until the client has the
else
return 0
=======
client = CLIENT_FROM_VAR(client) // Will get client from a mob, or accept a client, or return null
if(!istype(client))
return 0
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
var/list/unreceived = asset_list - (client.cache + client.sending)
if(!unreceived || !unreceived.len)

View File

@@ -124,7 +124,10 @@ body.inverted {
.emote {}
.alert {color: #ff0000;}
h1.alert, h2.alert {color: #000000;}
<<<<<<< HEAD
.nif {} /* VOREStation Add */
=======
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
/* Game Messages */
@@ -157,7 +160,11 @@ h1.alert, h2.alert {color: #000000;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
.changeling {color: #800080;}
<<<<<<< HEAD
.sergal {color: #0077FF;}
=======
.sergal {color: #0077FF; font-family: "Comic Sans MS";}
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
.birdsongc {color: #CC9900;}
.vulpkanin {color: #B97A57;}
.enochian {color: #848A33; letter-spacing:-1pt; word-spacing:4pt; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;}

View File

@@ -152,7 +152,11 @@ function start_vue() {
admin: false
},
{
<<<<<<< HEAD
matches: ".notice, .adminnotice, .info, .sinister, .cult",
=======
matches: ".notice:not(.pm), .adminnotice, .info, .sinister, .cult",
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
becomes: "vc_info",
pretty: "Notices",
tooltip: "Non-urgent messages from the game and items",
@@ -160,7 +164,11 @@ function start_vue() {
admin: false
},
{
<<<<<<< HEAD
matches: ".critical, .danger, .userdanger, .warning, .italics",
=======
matches: ".critical, .danger, .userdanger, .warning:not(.pm), .italics",
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
becomes: "vc_warnings",
pretty: "Warnings",
tooltip: "Urgent messages from the game and items",
@@ -183,6 +191,7 @@ function start_vue() {
required: false,
admin: false
},
<<<<<<< HEAD
//VOREStation Add Start
{
matches: ".nif",
@@ -193,6 +202,8 @@ function start_vue() {
admin: false
},
//VOREStation Add End
=======
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
{
matches: ".pm",
becomes: "vc_adminpm",
@@ -674,7 +685,11 @@ function start_vue() {
hiddenElement.target = '_blank';
hiddenElement.download = filename;
hiddenElement.click();
<<<<<<< HEAD
//Probably what will end up getting used
=======
//Probably what will end up getting used
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
} else {
var blob = new Blob([textToSave], {type: 'text/html;charset=utf8;'});
saved = window.navigator.msSaveOrOpenBlob(blob, filename);

View File

@@ -103,7 +103,11 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
owner << browse(file2text("code/modules/vchat/html/vchat.html"), "window=htmloutput")
//Check back later
<<<<<<< HEAD
spawn(15 SECONDS)
=======
spawn(60 SECONDS)
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
if(!src)
return
if(!src.loaded)
@@ -140,6 +144,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
/datum/chatOutput/proc/become_broken()
broken = TRUE
loaded = FALSE
<<<<<<< HEAD
=======
if(!owner)
qdel(src)
return
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
update_vis()

View File

@@ -110,7 +110,7 @@
if(holder)
to_chat(holder, "the [bicon(src)] [src] held by [holder] shudders in your grasp.")
else
src.loc.visible_message("the \icon[src] [src] shudders.")
src.loc.visible_message("the [bicon(src)] [src] shudders.")
//consume power
inserted_battery.use_power(energy_consumed_on_touch)

View File

@@ -16,10 +16,10 @@ em {font-style: normal;font-weight: bold;}
/* OOC */
.ooc {font-weight: bold;}
.looc {color: #3A9696;}
.ooc img.text_tag {width: 32px; height: 10px;}
.ooc .everyone {color: #002eb8;}
.ooc .looc {color: #3A9696;}
.ooc .elevated {color: #2e78d9;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}

View File

@@ -474,9 +474,12 @@ macro "hotkeymode"
elem
name = "5"
command = ".me"
<<<<<<< HEAD
elem
name = "6"
command = "subtle"
=======
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
elem
name = "A+REP"
command = ".moveleft"
@@ -1251,6 +1254,10 @@ window "outputwindow"
style = ".system {color:#FF0000;}"
max-lines = 0
saved-params = ""
<<<<<<< HEAD
=======
enable-http-images = true
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
window "rpane"
elem "rpane"
@@ -1417,6 +1424,10 @@ window "infowindow"
is-default = true
saved-params = ""
highlight-color = #00aa00
<<<<<<< HEAD
=======
allow-html = true
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761)
on-show = ".winset\"rpane.infob.is-visible=true;rpane.browseb.is-visible=true?rpane.infob.pos=130,0:rpane.infob.pos=65,0 rpane.textb.is-visible=true rpane.infob.is-checked=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=infowindow\""
on-hide = ".winset\"rpane.infob.is-visible=false;rpane.browseb.is-visible=true?rpane.browseb.is-checked=true rpane.rpanewindow.left=browserwindow:rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=\""

View File

@@ -121,7 +121,7 @@
if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
for(var/mob/O in viewers(world.view, src.loc))
to_chat(O, "<font color='red'>[M] triggered the \icon[src] [src]</font>")
to_chat(O, "<font color='red'>[M] triggered the [bicon(src)] [src]</font>")
triggered = 1
call(src,triggerproc)(M)

View File

@@ -1654,7 +1654,10 @@
#include "code\modules\catalogue\catalogue_data_vr.dm"
#include "code\modules\catalogue\cataloguer.dm"
#include "code\modules\catalogue\cataloguer_visuals.dm"
<<<<<<< HEAD:vorestation.dme
#include "code\modules\catalogue\cataloguer_vr.dm"
=======
>>>>>>> 715de43... VChat: Redone chat output done in Vue.js (#6761):polaris.dme
#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"