mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Leverage the TGS4 chat tagging system for the new game message (#41697)
Allows specifying the tag to send the game announce message to on TGS4 Needed by downstreams
This commit is contained in:
committed by
yogstation13-bot
parent
750e93deb1
commit
d61c037a35
@@ -107,6 +107,22 @@
|
|||||||
var/commit //full sha of compiled commit
|
var/commit //full sha of compiled commit
|
||||||
var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch
|
var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch
|
||||||
|
|
||||||
|
//represents a version of tgstation-server
|
||||||
|
/datum/tgs_version
|
||||||
|
var/suite //The suite version, can be >=3
|
||||||
|
|
||||||
|
//this group of variables can be null to represent a wild card
|
||||||
|
var/major //The major version
|
||||||
|
var/minor //The minor version
|
||||||
|
var/patch //The patch version
|
||||||
|
|
||||||
|
var/raw_parameter //The unparsed parameter
|
||||||
|
var/deprefixed_parameter //The version only bit of raw_parameter
|
||||||
|
|
||||||
|
//if the tgs_version is a wildcard version
|
||||||
|
/datum/tgs_version/proc/Wildcard()
|
||||||
|
return
|
||||||
|
|
||||||
//represents a merge of a GitHub pull request
|
//represents a merge of a GitHub pull request
|
||||||
/datum/tgs_revision_information/test_merge
|
/datum/tgs_revision_information/test_merge
|
||||||
var/number //pull request number
|
var/number //pull request number
|
||||||
@@ -155,22 +171,22 @@
|
|||||||
|
|
||||||
//FUNCTIONS
|
//FUNCTIONS
|
||||||
|
|
||||||
//Returns the respective string version of the API
|
//Returns the respective supported /datum/tgs_version of the API
|
||||||
/world/proc/TgsMaximumAPIVersion()
|
/world/proc/TgsMaximumAPIVersion()
|
||||||
return
|
return
|
||||||
|
|
||||||
/world/proc/TgsMinimumAPIVersion()
|
/world/proc/TgsMinimumAPIVersion()
|
||||||
return
|
return
|
||||||
|
|
||||||
//Gets the current version of the server tools running the server
|
|
||||||
/world/proc/TgsVersion()
|
|
||||||
return
|
|
||||||
|
|
||||||
//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
|
//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
|
||||||
//No function below this succeeds if it returns FALSE
|
//No function below this succeeds if it returns FALSE
|
||||||
/world/proc/TgsAvailable()
|
/world/proc/TgsAvailable()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
//Gets the current /datum/tgs_version of the server tools running the server
|
||||||
|
/world/proc/TgsVersion()
|
||||||
|
return
|
||||||
|
|
||||||
/world/proc/TgsInstanceName()
|
/world/proc/TgsInstanceName()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -1535,3 +1535,26 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
|||||||
for(var/each_item in items_list)
|
for(var/each_item in items_list)
|
||||||
for(var/i in 1 to items_list[each_item])
|
for(var/i in 1 to items_list[each_item])
|
||||||
new each_item(where_to)
|
new each_item(where_to)
|
||||||
|
|
||||||
|
//sends a message to chat
|
||||||
|
//config_setting should be one of the following
|
||||||
|
//null - noop
|
||||||
|
//empty string - use TgsTargetBroadcast with admin_only = FALSE
|
||||||
|
//other string - use TgsChatBroadcast with the tag that matches config_setting, only works with TGS4, if using TGS3 the above method is used
|
||||||
|
/proc/send2chat(message, config_setting)
|
||||||
|
if(config_setting == null || !world.TgsAvailable())
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/tgs_version/version = world.TgsVersion()
|
||||||
|
if(config_setting == "" || version.suite == 3)
|
||||||
|
world.TgsTargetedChatBroadcast(message, FALSE)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/list/channels_to_use = list()
|
||||||
|
for(var/I in world.TgsChatChannelInfo())
|
||||||
|
var/datum/tgs_chat_channel/channel = I
|
||||||
|
if(channel.tag == config_setting)
|
||||||
|
channels_to_use += channel
|
||||||
|
|
||||||
|
if(channels_to_use.len)
|
||||||
|
world.TgsChatBroadcast()
|
||||||
|
|||||||
@@ -390,6 +390,13 @@
|
|||||||
integer = FALSE
|
integer = FALSE
|
||||||
|
|
||||||
/datum/config_entry/flag/irc_announce_new_game
|
/datum/config_entry/flag/irc_announce_new_game
|
||||||
|
deprecated_by = /datum/config_entry/string/chat_announce_new_game
|
||||||
|
|
||||||
|
/datum/config_entry/flag/irc_announce_new_game/DeprecationUpdate(value)
|
||||||
|
return "" //default broadcast
|
||||||
|
|
||||||
|
/datum/config_entry/string/chat_announce_new_game
|
||||||
|
config_entry_value = null
|
||||||
|
|
||||||
/datum/config_entry/flag/debug_admin_hrefs
|
/datum/config_entry/flag/debug_admin_hrefs
|
||||||
|
|
||||||
|
|||||||
@@ -136,8 +136,7 @@ SUBSYSTEM_DEF(ticker)
|
|||||||
for(var/client/C in GLOB.clients)
|
for(var/client/C in GLOB.clients)
|
||||||
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
|
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
|
||||||
to_chat(world, "<span class='boldnotice'>Welcome to [station_name()]!</span>")
|
to_chat(world, "<span class='boldnotice'>Welcome to [station_name()]!</span>")
|
||||||
if(CONFIG_GET(flag/irc_announce_new_game))
|
send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/chat_announce_new_game))
|
||||||
world.TgsTargetedChatBroadcast("New round starting on [SSmapping.config.map_name]!", FALSE)
|
|
||||||
current_state = GAME_STATE_PREGAME
|
current_state = GAME_STATE_PREGAME
|
||||||
//Everyone who wants to be an observer is now spawned
|
//Everyone who wants to be an observer is now spawned
|
||||||
create_observers()
|
create_observers()
|
||||||
|
|||||||
@@ -1,24 +1,46 @@
|
|||||||
/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
|
/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
|
||||||
var/current_api = TGS_READ_GLOBAL(tgs)
|
var/current_api = TGS_READ_GLOBAL(tgs)
|
||||||
if(current_api)
|
if(current_api)
|
||||||
TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])!")
|
TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])! Was TgsNew() called more than once?")
|
||||||
return
|
return
|
||||||
|
|
||||||
#ifdef TGS_V3_API
|
#ifdef TGS_V3_API
|
||||||
minimum_required_security_level = TGS_SECURITY_TRUSTED
|
minimum_required_security_level = TGS_SECURITY_TRUSTED
|
||||||
#endif
|
#endif
|
||||||
|
var/raw_parameter = world.params[TGS_VERSION_PARAMETER]
|
||||||
var/tgs_version = world.params[TGS_VERSION_PARAMETER]
|
if(!raw_parameter)
|
||||||
if(!tgs_version)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
var/path = SelectTgsApi(tgs_version)
|
var/datum/tgs_version/version = new(raw_parameter)
|
||||||
if(!path)
|
if(!version.Valid(FALSE))
|
||||||
TGS_ERROR_LOG("Found unsupported API version: [tgs_version]. If this is a valid version please report this, backporting is done on demand.")
|
TGS_ERROR_LOG("Failed to validate TGS version parameter: [raw_parameter]!")
|
||||||
return
|
return
|
||||||
|
|
||||||
TGS_INFO_LOG("Activating API for version [tgs_version]")
|
var/api_datum
|
||||||
var/datum/tgs_api/new_api = new path
|
switch(version.suite)
|
||||||
|
if(3)
|
||||||
|
#ifndef TGS_V3_API
|
||||||
|
TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!")
|
||||||
|
#else
|
||||||
|
switch(version.major)
|
||||||
|
if(2)
|
||||||
|
api_datum = /datum/tgs_api/v3210
|
||||||
|
#endif
|
||||||
|
if(4)
|
||||||
|
switch(version.major)
|
||||||
|
if(0)
|
||||||
|
api_datum = /datum/tgs_api/v4
|
||||||
|
|
||||||
|
if(version.suite != null && version.major != null && version.minor != null && version.patch != null && version.deprefixed_parameter > TgsMaximumAPIVersion())
|
||||||
|
TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.")
|
||||||
|
api_datum = /datum/tgs_api/latest
|
||||||
|
|
||||||
|
if(!api_datum)
|
||||||
|
TGS_ERROR_LOG("Found unsupported API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.")
|
||||||
|
return
|
||||||
|
|
||||||
|
TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]")
|
||||||
|
var/datum/tgs_api/new_api = new api_datum(version)
|
||||||
|
|
||||||
TGS_WRITE_GLOBAL(tgs, new_api)
|
TGS_WRITE_GLOBAL(tgs, new_api)
|
||||||
|
|
||||||
@@ -27,40 +49,11 @@
|
|||||||
TGS_WRITE_GLOBAL(tgs, null)
|
TGS_WRITE_GLOBAL(tgs, null)
|
||||||
TGS_ERROR_LOG("Failed to activate API!")
|
TGS_ERROR_LOG("Failed to activate API!")
|
||||||
|
|
||||||
/world/proc/SelectTgsApi(tgs_version)
|
|
||||||
//remove the old 3.0 header
|
|
||||||
tgs_version = replacetext(tgs_version, "/tg/station 13 Server v", "")
|
|
||||||
|
|
||||||
var/list/version_bits = splittext(tgs_version, ".")
|
|
||||||
|
|
||||||
var/super = text2num(version_bits[1])
|
|
||||||
var/major = text2num(version_bits[2])
|
|
||||||
var/minor = text2num(version_bits[3])
|
|
||||||
var/patch = text2num(version_bits[4])
|
|
||||||
|
|
||||||
switch(super)
|
|
||||||
if(3)
|
|
||||||
#ifndef TGS_V3_API
|
|
||||||
TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!")
|
|
||||||
#else
|
|
||||||
switch(major)
|
|
||||||
if(2)
|
|
||||||
return /datum/tgs_api/v3210
|
|
||||||
#endif
|
|
||||||
if(4)
|
|
||||||
switch(major)
|
|
||||||
if(0)
|
|
||||||
return /datum/tgs_api/v4
|
|
||||||
|
|
||||||
if(super != null && major != null && minor != null && patch != null && tgs_version > TgsMaximumAPIVersion())
|
|
||||||
TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.")
|
|
||||||
return /datum/tgs_api/latest
|
|
||||||
|
|
||||||
/world/TgsMaximumAPIVersion()
|
/world/TgsMaximumAPIVersion()
|
||||||
return "4.0.0.0"
|
return new /datum/tgs_version("4.0.x.x")
|
||||||
|
|
||||||
/world/TgsMinimumAPIVersion()
|
/world/TgsMinimumAPIVersion()
|
||||||
return "3.2.0.0"
|
return new /datum/tgs_version("3.2.0.0")
|
||||||
|
|
||||||
/world/TgsInitializationComplete()
|
/world/TgsInitializationComplete()
|
||||||
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
|
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
|
||||||
@@ -90,7 +83,9 @@
|
|||||||
return TGS_READ_GLOBAL(tgs) != null
|
return TGS_READ_GLOBAL(tgs) != null
|
||||||
|
|
||||||
/world/TgsVersion()
|
/world/TgsVersion()
|
||||||
return world.params[TGS_VERSION_PARAMETER]
|
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
|
||||||
|
if(api)
|
||||||
|
return api.version
|
||||||
|
|
||||||
/world/TgsInstanceName()
|
/world/TgsInstanceName()
|
||||||
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
|
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
|
TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
|
||||||
|
|
||||||
/datum/tgs_api
|
/datum/tgs_api
|
||||||
|
var/datum/tgs_version/version
|
||||||
|
|
||||||
|
/datum/tgs_api/New(datum/tgs_version/version)
|
||||||
|
. = ..()
|
||||||
|
src.version = version
|
||||||
|
|
||||||
/datum/tgs_api/latest
|
/datum/tgs_api/latest
|
||||||
parent_type = /datum/tgs_api/v4
|
parent_type = /datum/tgs_api/v4
|
||||||
|
|||||||
22
code/modules/tgs/core/tgs_version.dm
Normal file
22
code/modules/tgs/core/tgs_version.dm
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/datum/tgs_version/New(raw_parameter)
|
||||||
|
src.raw_parameter = raw_parameter
|
||||||
|
deprefixed_parameter = replacetext(raw_parameter, "/tg/station 13 Server v", "")
|
||||||
|
var/list/version_bits = splittext(deprefixed_parameter, ".")
|
||||||
|
|
||||||
|
suite = text2num(version_bits[1])
|
||||||
|
if(version_bits.len > 1)
|
||||||
|
major = text2num(version_bits[2])
|
||||||
|
if(version_bits.len > 2)
|
||||||
|
minor = text2num(version_bits[3])
|
||||||
|
if(version_bits.len == 4)
|
||||||
|
patch = text2num(version_bits[4])
|
||||||
|
|
||||||
|
/datum/tgs_version/proc/Valid(allow_wildcards = FALSE)
|
||||||
|
if(suite == null)
|
||||||
|
return FALSE
|
||||||
|
if(allow_wildcards)
|
||||||
|
return TRUE
|
||||||
|
return !Wildcard()
|
||||||
|
|
||||||
|
/datum/tgs_version/Wildcard()
|
||||||
|
return major == null || minor == null || patch == null
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "core\_definitions.dm"
|
#include "core\_definitions.dm"
|
||||||
#include "core\core.dm"
|
#include "core\core.dm"
|
||||||
#include "core\datum.dm"
|
#include "core\datum.dm"
|
||||||
|
#include "core\tgs_version.dm"
|
||||||
#ifdef TGS_V3_API
|
#ifdef TGS_V3_API
|
||||||
#include "v3210\api.dm"
|
#include "v3210\api.dm"
|
||||||
#include "v3210\commands.dm"
|
#include "v3210\commands.dm"
|
||||||
|
|||||||
@@ -1,69 +1,69 @@
|
|||||||
/datum/tgs_api/v4/proc/ListCustomCommands()
|
/datum/tgs_api/v4/proc/ListCustomCommands()
|
||||||
var/results = list()
|
var/results = list()
|
||||||
custom_commands = list()
|
custom_commands = list()
|
||||||
for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command)
|
for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command)
|
||||||
var/datum/tgs_chat_command/stc = new I
|
var/datum/tgs_chat_command/stc = new I
|
||||||
var/command_name = stc.name
|
var/command_name = stc.name
|
||||||
if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\""))
|
if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\""))
|
||||||
TGS_ERROR_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!")
|
TGS_ERROR_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(results[command_name])
|
if(results[command_name])
|
||||||
var/datum/other = custom_commands[command_name]
|
var/datum/other = custom_commands[command_name]
|
||||||
TGS_ERROR_LOG("Custom commands [other.type] and [I] have the same name (\"[command_name]\"), only [other.type] will be available!")
|
TGS_ERROR_LOG("Custom commands [other.type] and [I] have the same name (\"[command_name]\"), only [other.type] will be available!")
|
||||||
continue
|
continue
|
||||||
results += list(list("name" = command_name, "help_text" = stc.help_text, "admin_only" = stc.admin_only))
|
results += list(list("name" = command_name, "help_text" = stc.help_text, "admin_only" = stc.admin_only))
|
||||||
custom_commands[command_name] = stc
|
custom_commands[command_name] = stc
|
||||||
|
|
||||||
var/commands_file = chat_commands_json_path
|
var/commands_file = chat_commands_json_path
|
||||||
if(!commands_file)
|
if(!commands_file)
|
||||||
return
|
return
|
||||||
text2file(json_encode(results), commands_file)
|
text2file(json_encode(results), commands_file)
|
||||||
|
|
||||||
/datum/tgs_api/v4/proc/HandleCustomCommand(command_json)
|
/datum/tgs_api/v4/proc/HandleCustomCommand(command_json)
|
||||||
var/list/data = json_decode(command_json)
|
var/list/data = json_decode(command_json)
|
||||||
var/command = data["command"]
|
var/command = data["command"]
|
||||||
var/user = data["user"]
|
var/user = data["user"]
|
||||||
var/params = data["params"]
|
var/params = data["params"]
|
||||||
|
|
||||||
var/datum/tgs_chat_user/u = new
|
var/datum/tgs_chat_user/u = new
|
||||||
u.id = user["id"]
|
u.id = user["id"]
|
||||||
u.friendly_name = user["friendlyName"]
|
u.friendly_name = user["friendlyName"]
|
||||||
u.mention = user["mention"]
|
u.mention = user["mention"]
|
||||||
u.channel = DecodeChannel(user["channel"])
|
u.channel = DecodeChannel(user["channel"])
|
||||||
|
|
||||||
var/datum/tgs_chat_command/sc = custom_commands[command]
|
var/datum/tgs_chat_command/sc = custom_commands[command]
|
||||||
if(sc)
|
if(sc)
|
||||||
var/result = sc.Run(u, params)
|
var/result = sc.Run(u, params)
|
||||||
if(result == null)
|
if(result == null)
|
||||||
result = ""
|
result = ""
|
||||||
return result
|
return result
|
||||||
return "Unknown command: [command]!"
|
return "Unknown command: [command]!"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 2017 Jordan Brown
|
Copyright (c) 2017 Jordan Brown
|
||||||
|
|
||||||
Permission is hereby granted, free of charge,
|
Permission is hereby granted, free of charge,
|
||||||
to any person obtaining a copy of this software and
|
to any person obtaining a copy of this software and
|
||||||
associated documentation files (the "Software"), to
|
associated documentation files (the "Software"), to
|
||||||
deal in the Software without restriction, including
|
deal in the Software without restriction, including
|
||||||
without limitation the rights to use, copy, modify,
|
without limitation the rights to use, copy, modify,
|
||||||
merge, publish, distribute, sublicense, and/or sell
|
merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom
|
copies of the Software, and to permit persons to whom
|
||||||
the Software is furnished to do so,
|
the Software is furnished to do so,
|
||||||
subject to the following conditions:
|
subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice
|
The above copyright notice and this permission notice
|
||||||
shall be included in all copies or substantial portions of the Software.
|
shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -423,8 +423,16 @@ MINUTE_CLICK_LIMIT 400
|
|||||||
##How long to wait between messaging admins about occurences of a unique error
|
##How long to wait between messaging admins about occurences of a unique error
|
||||||
#ERROR_MSG_DELAY 50
|
#ERROR_MSG_DELAY 50
|
||||||
|
|
||||||
## Send a message to IRC when starting a new game
|
|
||||||
#IRC_ANNOUNCE_NEW_GAME
|
## Chat Announce Options
|
||||||
|
## Various messages to be sent to game chats
|
||||||
|
## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS4
|
||||||
|
## If using TGS4, the string option can be set as a chat channel tag to limit the message to channels of that tag type (case-sensitive)
|
||||||
|
## i.e. CHAT_ANNOUNCE_NEW_GAME chat_channel_tag
|
||||||
|
|
||||||
|
## Send a message with the station name starting a new game
|
||||||
|
#CHAT_ANNOUNCE_NEW_GAME
|
||||||
|
|
||||||
|
|
||||||
## Allow admin hrefs that don't use the new token system, will eventually be removed
|
## Allow admin hrefs that don't use the new token system, will eventually be removed
|
||||||
DEBUG_ADMIN_HREFS
|
DEBUG_ADMIN_HREFS
|
||||||
|
|||||||
@@ -2647,6 +2647,7 @@
|
|||||||
#include "code\modules\surgery\organs\vocal_cords.dm"
|
#include "code\modules\surgery\organs\vocal_cords.dm"
|
||||||
#include "code\modules\tgs\event_handler.dm"
|
#include "code\modules\tgs\event_handler.dm"
|
||||||
#include "code\modules\tgs\includes.dm"
|
#include "code\modules\tgs\includes.dm"
|
||||||
|
#include "code\modules\tgs\core\tgs_version.dm"
|
||||||
#include "code\modules\tgui\external.dm"
|
#include "code\modules\tgui\external.dm"
|
||||||
#include "code\modules\tgui\states.dm"
|
#include "code\modules\tgui\states.dm"
|
||||||
#include "code\modules\tgui\subsystem.dm"
|
#include "code\modules\tgui\subsystem.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user