diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2718fcf55ef..01d50fba7d0 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -389,412 +389,384 @@ client return html -#define TOPIC_SPAM_DELAY 5 //5 tick delay is a little under half a second -//All BYOND links pass through client/Topic() FIRST and are then directed to [hsrc]/Topic() by the ..() call at the end. -client/Topic(href, href_list, hsrc) +/client/proc/view_var_Topic(href,href_list,hsrc) + //This will all be moved over to datum/admins/Topic() ~Carn + if( (usr.client == src) && src.holder ) + . = 1 //default return + if (href_list["Vars"]) + debug_variables(locate(href_list["Vars"])) - if(next_allowed_topic_time > world.time) - //we have previously sent a Topic() call withing the last [TOPIC_SPAM_DELAY] ticks. - //drop the Topic call to preventc crashing/lagging the server via link-spamming -// src << "\red Error: SPAM" - return - next_allowed_topic_time = world.time + TOPIC_SPAM_DELAY + //~CARN: for renaming mobs (updates their real_name and their ID/PDA if applicable). + else if (href_list["rename"]) + var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name") as text|null),1,MAX_NAME_LEN) + if(!new_name) return + var/mob/M = locate(href_list["rename"]) + if(!istype(M)) return - //search the href for script injection //This is a temporary measure - if( findtext(href,"= 10) + if( !C.holder && (C.inactivity >= INACTIVITY_KICK) ) if(C.mob) if(!istype(C.mob, /mob/dead/)) log_access("AFK: [key_name(C)]") C << "\red You have been inactive for more than 10 minutes and have been disconnected." - C.mob.logged_in = 0 del(C) spawn(3000) KickInactiveClients()//more or less five minutes diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm new file mode 100644 index 00000000000..7e4b1ab3bfe --- /dev/null +++ b/code/modules/admin/IsBanned.dm @@ -0,0 +1,16 @@ +//Blocks an attempt to connect before even creating our client datum thing. +world/IsBanned(key,address,computer_id) + //Guest Checking + if( !guests_allowed && IsGuestKey(key) ) + log_access("Failed Login: [key] - Guests not allowed") + message_admins("\blue Failed Login: [key] - Guests not allowed") + return list("reason"="guest", "desc"="\nReason: Guests not allowed.brb") + + //Ban Checking + . = CheckBan( ckey(key), computer_id, address ) + if(.) + log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") + message_admins("\blue Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") + return . + + return ..() //default pager ban stuff diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 09a324b0b15..273529eaa37 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -2,45 +2,58 @@ var/CMinutes = null var/savefile/Banlist -/proc/CheckBan(var/client/clientvar) - - var/id = clientvar.computer_id - var/key = clientvar.ckey - +/proc/CheckBan(var/ckey, var/id, var/address) if(!Banlist) // if Banlist cannot be located for some reason LoadBans() // try to load the bans if(!Banlist) // uh oh, can't find bans! return 0 // ABORT ABORT ABORT + . = list() + var/appeal + if(config && config.banappeals) + appeal = "\nFor more information on your ban, or to appeal, head to [config.banappeals]" Banlist.cd = "/base" - if (Banlist.dir.Find("[key][id]")) - Banlist.cd = "[key][id]" + if( "[ckey][id]" in Banlist.dir ) + Banlist.cd = "[ckey][id]" if (Banlist["temp"]) if (!GetExp(Banlist["minutes"])) ClearTempbans() return 0 else - return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetExp(Banlist["minutes"])].)" + .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]" else - Banlist.cd = "/base/[key][id]" - return "[Banlist["reason"]]\n(This is a permanent ban)" + Banlist.cd = "/base/[ckey][id]" + .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]" + .["reason"] = "ckey/id" + return . + else + for (var/A in Banlist.dir) + Banlist.cd = "/base/[A]" + var/matches + if( ckey == Banlist["key"] ) + matches += "ckey" + if( id == Banlist["id"] ) + if(matches) + matches += "/" + matches += "id" +// if( address == Banlist["ip"] ) +// if(matches) +// matches += "/" +// matches += "ip" - Banlist.cd = "/base" - for (var/A in Banlist.dir) - Banlist.cd = "/base/[A]" - if (id == Banlist["id"] || key == Banlist["key"]) - if(Banlist["temp"]) - if (!GetExp(Banlist["minutes"])) - ClearTempbans() - return 0 + if(matches) + if(Banlist["temp"]) + if (!GetExp(Banlist["minutes"])) + ClearTempbans() + return 0 + else + .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]" else - return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetExp(Banlist["minutes"])].)" - else - return "[Banlist["reason"]]\n(This is a permanent ban)" - + .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]" + .["reason"] = matches + return . return 0 - /proc/UpdateTime() //No idea why i made this a proc. CMinutes = (world.realtime / 10) / 60 return 1 diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm new file mode 100644 index 00000000000..07f851d6580 --- /dev/null +++ b/code/modules/client/client defines.dm @@ -0,0 +1,52 @@ +//Some of this is being changed to a datum to cut down on uneccessary variables at the client level. ~Carn +/client + //////////////// + //ADMIN THINGS// + //////////////// + var/obj/admins/holder = null + var/buildmode = 0 + var/stealth = 0 + var/fakekey = null + var/seeprayers = 0 + var/ooccolor = "#b82e00" + var/muted = null //Can't talk in OOC, say, whisper, emote... anything except for adminhelp and admin-pm. An admin punishment + var/muted_complete = null //Can't talk in any way shape or form (muted + can't adminhelp or respond to admin pm-s). An admin punishment + var/warned = 0 + var/sound_adminhelp = 0 //If set to 1 this will play a sound when adminhelps are received. + + ///////// + //OTHER// + ///////// + var/listen_ooc = 1 + var/move_delay = 1 + var/moving = null + var/adminobs = null + var/deadchat = 0 + var/changes = 0 + var/area = null + var/played = 0 + var/team = null + var/be_alien = 0 //Check if that guy wants to be an alien + var/be_pai = 1 //Consider client when searching for players to recruit as a pAI + var/vote = null + var/showvote = null + var/STFU_ghosts //80+ people rounds are fun to admin when text flies faster than airport security + var/STFU_radio //80+ people rounds are fun to admin when text flies faster than airport security + + /////////////// + //SOUND STUFF// + /////////////// + var/canplaysound = 1 + var/ambience_playing= null + var/no_ambi = 0 //Toggle Ambience + var/midis = 1 //Toggle Midis + + //////////// + //SECURITY// + //////////// + var/next_allowed_topic_time = 10 + // comment out the line below when debugging locally to enable the options & messages menu + control_freak = 1 + + + diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm new file mode 100644 index 00000000000..00fb8ac898a --- /dev/null +++ b/code/modules/client/client procs.dm @@ -0,0 +1,94 @@ + //////////// + //SECURITY// + //////////// +#define TOPIC_SPAM_DELAY 5 //5 tick delay is a little under half a second +#define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower. + /* + When somebody clicks a link in game, this Topic is called first. + It does the stuff in this proc and then is redirected to the Topic() proc for the src=[0xWhatever] + (if specified in the link). ie locate(hsrc).Topic() + + Such links can be spoofed. + + Because of this certain things MUST be considered whenever adding a Topic() for something: + - Can it be fed harmful values which could cause runtimes? + - Is the Topic call an admin-only thing? + - If so, does it have checks to see if the person who called it (usr.client) is an admin? + - Are the processes being called by Topic() particularly laggy? + - If so, is there any protection against somebody spam-clicking a link? + */ +/client/Topic(href, href_list, hsrc) + //Reduces spamming of links by dropping calls that happen during the delay period + if(next_allowed_topic_time > world.time) +// src << "\red DEBUG: Error: SPAM" + return + next_allowed_topic_time = world.time + TOPIC_SPAM_DELAY + + //search the href for script injection + if( findtext(href," UPLOAD_LIMIT) + src << "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB." + return 0 +/* //Don't need this at the moment. But it's here if it's needed later. + //Helps prevent multiple files being uploaded at once. Or right after eachother. + var/time_to_wait = fileaccess_timer - world.time + if(time_to_wait > 0) + src << "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds." + return 0 + fileaccess_timer = world.time + FTPDELAY */ + return 1 + + + /////////// + //CONNECT// + /////////// +/client/New() + //Connection-Type Checking + if( connection != "seeker" ) + del(src) + return + + if (((world.address == address || !(address)) && !(host))) + host = key + world.update_status() + + ..() //calls mob.Login() + + //Admin Authorisation + if( ckey in admins ) + holder = new /obj/admins(src) + holder.rank = admins[ckey] + update_admins(admins[ckey]) + admin_memo_show() + + + ////////////// + //DISCONNECT// + ////////////// +/client/Del() + spawn(0) + if(holder) + del(holder) + return ..() diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm new file mode 100644 index 00000000000..a60280bd606 --- /dev/null +++ b/code/modules/mob/living/login.dm @@ -0,0 +1,12 @@ +/mob/living/Login() + ..() + if(ticker && ticker.mode) + switch(ticker.mode.name) + if("sandbox") + CanBuild() + if("revolution") + if ((src.mind in ticker.mode:revolutionaries) || (src.mind in ticker.mode:head_revolutionaries)) + ticker.mode:update_rev_icons_added(src.mind) + if("cult") + if (src.mind in ticker.mode:cult) + ticker.mode:update_cult_icons_added(src.mind) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 959a83abcf3..e4f8f576430 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -1,4 +1,8 @@ /mob/living/silicon/ai/Login() + for(var/obj/effect/rune/rune in world) + var/image/blood = image('blood.dmi', loc = rune, icon_state = "floor[rand(1,7)]") + blood.override = 1 + client.images += blood ..() update_clothing() for(var/S in src.client.screen) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index e7a8d19da5b..5d55ee62c7f 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -1,32 +1,32 @@ -/mob/Login() - log_access("Login: [key_name(src)] from [src.client.address ? src.client.address : "localhost"]") - src.lastKnownIP = src.client.address - src.computer_id = src.client.computer_id - if (config.log_access) - for (var/mob/M in world) - if(M == src) - continue - if(M.client && M.client.address == src.client.address) - log_access("Notice: [key_name(src)] has same IP address as [key_name(M)]") - message_admins("Notice: [key_name_admin(src)] has the same IP address as [key_name_admin(M)]", 1) - else if (M.lastKnownIP && M.lastKnownIP == src.client.address && M.ckey != src.ckey && M.key) - log_access("Notice: [key_name(src)] has same IP address as [key_name(M)] did ([key_name(M)] is no longer logged in).") - message_admins("Notice: [key_name_admin(src)] has the same IP address as [key_name_admin(M)] did ([key_name_admin(M)] is no longer logged in).", 1) - if(M.client && M.client.computer_id == src.client.computer_id) - log_access("Notice: [key_name(src)] has same computer ID as [key_name(M)]") - message_admins("Notice: [key_name_admin(src)] has the same computer ID as [key_name_admin(M)]", 1) - spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") - else if (M.computer_id && M.computer_id == src.client.computer_id && M.ckey != src.ckey && M.key) - log_access("Notice: [key_name(src)] has same computer ID as [key_name(M)] did ([key_name(M)] is no longer logged in).") - message_admins("Notice: [key_name_admin(src)] has the same computer ID as [key_name_admin(M)] did ([key_name_admin(M)] is no longer logged in).", 1) - spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") - if(!src.dna) src.dna = new /datum/dna(null) - //src.client.screen -= main_hud1.contents - world.update_status() - //if (!src.hud_used) - // src.hud_used = main_hud1 +//handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying +/mob/proc/update_Login_details() + lastKnownIP = client.address + computer_id = client.computer_id + log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]") + if(config.log_access) + for(var/mob/M in world) + if(M == src) continue + if( M.key && (M.key != key) ) + var/matches + if( (M.lastKnownIP == client.address) ) + matches += "IP ([client.address])" + if( (M.computer_id == client.computer_id) ) + if(matches) matches += " and " + matches += "ID ([client.computer_id])" + spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") + if(matches) + if(M.client) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") + else + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") - if (!src.hud_used) +/mob/Login() + update_Login_details() + if(!src.dna) src.dna = new /datum/dna(null) + world.update_status() + if(!src.hud_used) src.hud_used = new/obj/hud( src ) else del(src.hud_used) @@ -34,20 +34,4 @@ src.next_move = 1 src.sight |= SEE_SELF - src.logged_in = 1 - - if(istype (src, /mob/living)) - if(ticker) - if(ticker.mode) - if(ticker.mode.name == "revolution") - if ((src.mind in ticker.mode:revolutionaries) || (src.mind in ticker.mode:head_revolutionaries)) - ticker.mode:update_rev_icons_added(src.mind) - if(ticker.mode.name == "cult") - if (src.mind in ticker.mode:cult) - ticker.mode:update_cult_icons_added(src.mind) - if(isAI(src)) - for(var/obj/effect/rune/rune in world) - var/image/blood = image('blood.dmi', loc = rune, icon_state = "floor[rand(1,7)]") - blood.override = 1 - client.images += blood - ..() + ..() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 8f9ad4c9732..b58ae225fb7 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -2,7 +2,6 @@ log_access("Logout: [key_name(src)]") if (admins[src.ckey]) message_admins("Admin logout: [key_name(src)]") - src.logged_in = 0 ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 941ee737595..6e2d865dbeb 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -645,46 +645,6 @@ //usr << "[name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]" return -/client/New() - if( connection != "seeker" ) - src << "Sorry, this game does not support [connection] connections." //doesn't work - del(src) - var/isbanned = CheckBan(src) - if (isbanned) - log_access("Failed Login: [src] - Banned") - message_admins("\blue Failed Login: [src] - Banned") - alert(src,"You have been banned.\nReason : [isbanned]","Ban","Ok") //doesn't work - del(src) - - if (!guests_allowed && IsGuestKey(key)) - log_access("Failed Login: [src] - Guests not allowed") - message_admins("\blue Failed Login: [src] - Guests not allowed") - alert(src,"You cannot play here.\nReason : Guests not allowed","Guests not allowed","Ok") //doesn't work - del(src) - - if (((world.address == address || !(address)) && !(host))) - host = key - world.update_status() - - ..() - -// authorize() //old gooncode - - if( ckey in admins ) - holder = new /obj/admins(src) - holder.rank = admins[ckey] - update_admins(admins[ckey]) - admin_memo_show() - - if(ticker && ticker.mode && ticker.mode.name =="sandbox") - mob.CanBuild() - -/client/Del() - spawn(0) - if(holder) - del(holder) - return ..() - /mob/proc/can_use_hands() if(handcuffed) return 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2c299b2e089..615280cbde0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -169,7 +169,6 @@ var/job = null//Living var/nodamage = 0 - var/logged_in = 0 var/underwear = 1//Human var/backbag = 2//Human diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm new file mode 100644 index 00000000000..7561c463710 --- /dev/null +++ b/code/modules/mob/new_player/login.dm @@ -0,0 +1,91 @@ +/mob/new_player/Login() + update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying + if (join_motd) + src << "
[join_motd]
" + + if(!preferences) + preferences = new + + if(!mind) + mind = new + mind.key = key + mind.current = src + + spawn() Playmusic() // git some tunes up in heeyaa~ + + var/starting_loc = pick(newplayer_start) + if(!starting_loc) starting_loc = locate(1,1,1) + loc = starting_loc + lastarea = starting_loc + + sight |= SEE_TURFS + + var/list/watch_locations = list() + for(var/obj/effect/landmark/landmark in world) + if(landmark.tag == "landmark*new_player") + watch_locations += landmark.loc + + if(watch_locations.len>0) + loc = pick(watch_locations) + + if(!preferences.savefile_load(src, 0)) + preferences.ShowChoices(src) + if(!client.changes) + changes() + else + var/lastchangelog = length('changelog.html') + if(!client.changes && preferences.lastchangelog!=lastchangelog) + changes() + preferences.lastchangelog = lastchangelog + preferences.savefile_save(src) + + spawn(10) + if(client) + new_player_panel() + //PDA Resource Initialisation =======================================================> + /* + Quick note: local dream daemon instances don't seem to cache images right. Might be + a local problem with my machine but it's annoying nontheless. + */ + if(client) + //load the PDA iconset into the client + src << browse_rsc('pda_atmos.png') + src << browse_rsc('pda_back.png') + src << browse_rsc('pda_bell.png') + src << browse_rsc('pda_blank.png') + src << browse_rsc('pda_boom.png') + src << browse_rsc('pda_bucket.png') + src << browse_rsc('pda_crate.png') + src << browse_rsc('pda_cuffs.png') + src << browse_rsc('pda_eject.png') + src << browse_rsc('pda_exit.png') + src << browse_rsc('pda_flashlight.png') + src << browse_rsc('pda_honk.png') + src << browse_rsc('pda_mail.png') + src << browse_rsc('pda_medical.png') + src << browse_rsc('pda_menu.png') + src << browse_rsc('pda_mule.png') + src << browse_rsc('pda_notes.png') + src << browse_rsc('pda_power.png') + src << browse_rsc('pda_rdoor.png') + src << browse_rsc('pda_reagent.png') + src << browse_rsc('pda_refresh.png') + src << browse_rsc('pda_scanner.png') + src << browse_rsc('pda_signaler.png') + src << browse_rsc('pda_status.png') + //Loads icons for SpiderOS into client + src << browse_rsc('sos_1.png') + src << browse_rsc('sos_2.png') + src << browse_rsc('sos_3.png') + src << browse_rsc('sos_4.png') + src << browse_rsc('sos_5.png') + src << browse_rsc('sos_6.png') + src << browse_rsc('sos_7.png') + src << browse_rsc('sos_8.png') + src << browse_rsc('sos_9.png') + src << browse_rsc('sos_10.png') + src << browse_rsc('sos_11.png') + src << browse_rsc('sos_12.png') + src << browse_rsc('sos_13.png') + src << browse_rsc('sos_14.png') + //End PDA Resource Initialisation =====================================================> \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index bd3f0ea0713..e0b1cd10869 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -15,96 +15,6 @@ anchored = 1 // don't get pushed around - Login() - if (join_motd) - src << "
[join_motd]
" - - if(!preferences) - preferences = new - - if(!mind) - mind = new - mind.key = key - mind.current = src - - spawn() Playmusic() // git some tunes up in heeyaa~ - - var/starting_loc = pick(newplayer_start) - if(!starting_loc) starting_loc = locate(1,1,1) - loc = starting_loc - lastarea = starting_loc - - sight |= SEE_TURFS - - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in world) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) - - if(!preferences.savefile_load(src, 0)) - preferences.ShowChoices(src) - if(!client.changes) - changes() - else - var/lastchangelog = length('changelog.html') - if(!client.changes && preferences.lastchangelog!=lastchangelog) - changes() - preferences.lastchangelog = lastchangelog - preferences.savefile_save(src) - - new_player_panel() - //PDA Resource Initialisation =======================================================> - /* - Quick note: local dream daemon instances don't seem to cache images right. Might be - a local problem with my machine but it's annoying nontheless. - */ - if(client) - //load the PDA iconset into the client - src << browse_rsc('pda_atmos.png') - src << browse_rsc('pda_back.png') - src << browse_rsc('pda_bell.png') - src << browse_rsc('pda_blank.png') - src << browse_rsc('pda_boom.png') - src << browse_rsc('pda_bucket.png') - src << browse_rsc('pda_crate.png') - src << browse_rsc('pda_cuffs.png') - src << browse_rsc('pda_eject.png') - src << browse_rsc('pda_exit.png') - src << browse_rsc('pda_flashlight.png') - src << browse_rsc('pda_honk.png') - src << browse_rsc('pda_mail.png') - src << browse_rsc('pda_medical.png') - src << browse_rsc('pda_menu.png') - src << browse_rsc('pda_mule.png') - src << browse_rsc('pda_notes.png') - src << browse_rsc('pda_power.png') - src << browse_rsc('pda_rdoor.png') - src << browse_rsc('pda_reagent.png') - src << browse_rsc('pda_refresh.png') - src << browse_rsc('pda_scanner.png') - src << browse_rsc('pda_signaler.png') - src << browse_rsc('pda_status.png') - //Loads icons for SpiderOS into client - src << browse_rsc('sos_1.png') - src << browse_rsc('sos_2.png') - src << browse_rsc('sos_3.png') - src << browse_rsc('sos_4.png') - src << browse_rsc('sos_5.png') - src << browse_rsc('sos_6.png') - src << browse_rsc('sos_7.png') - src << browse_rsc('sos_8.png') - src << browse_rsc('sos_9.png') - src << browse_rsc('sos_10.png') - src << browse_rsc('sos_11.png') - src << browse_rsc('sos_12.png') - src << browse_rsc('sos_13.png') - src << browse_rsc('sos_14.png') - //End PDA Resource Initialisation =====================================================> - - Logout() ready = 0 ..() diff --git a/tgstation.dme b/tgstation.dme index 0c84c7db8f8..9a93d8f229e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -86,6 +86,7 @@ #define FILE_DIR "code/modules/admin/verbs" #define FILE_DIR "code/modules/assembly" #define FILE_DIR "code/modules/chemical" +#define FILE_DIR "code/modules/client" #define FILE_DIR "code/modules/clothing" #define FILE_DIR "code/modules/clothing/glasses" #define FILE_DIR "code/modules/clothing/spacesuits" @@ -179,7 +180,6 @@ #define FILE_DIR "icons/vending_icons" #define FILE_DIR "interface" #define FILE_DIR "maps" -#define FILE_DIR "maps/backup" #define FILE_DIR "maps/RandomZLevels" #define FILE_DIR "sound" #define FILE_DIR "sound/AI" @@ -284,7 +284,6 @@ #include "code\datums\spells\turf_teleport.dm" #include "code\datums\spells\wizard.dm" #include "code\defines\atom.dm" -#include "code\defines\client.dm" #include "code\defines\global.dm" #include "code\defines\hub.dm" #include "code\defines\obj.dm" @@ -750,6 +749,7 @@ #include "code\modules\admin\create_mob.dm" #include "code\modules\admin\create_object.dm" #include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\NewBan.dm" #include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_panel.dm" @@ -790,6 +790,8 @@ #include "code\modules\chemical\Chemistry-Reagents.dm" #include "code\modules\chemical\Chemistry-Recipes.dm" #include "code\modules\chemical\Chemistry-Tools.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" #include "code\modules\clothing\glasses.dm" #include "code\modules\clothing\hardhat.dm" #include "code\modules\clothing\spacesuit.dm" @@ -862,6 +864,7 @@ #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\blob\blob.dm" #include "code\modules\mob\living\carbon\carbon.dm" @@ -965,6 +968,7 @@ #include "code\modules\mob\living\silicon\robot\say.dm" #include "code\modules\mob\living\silicon\robot\wires.dm" #include "code\modules\mob\new_player\hud.dm" +#include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\new_player.dm" #include "code\modules\mob\new_player\preferences.dm" #include "code\modules\mob\new_player\preferences_setup.dm"