diff --git a/SQL/aurora_schema.sql b/SQL/aurora_schema.sql index 1bf4898f..e9e42f08 100644 --- a/SQL/aurora_schema.sql +++ b/SQL/aurora_schema.sql @@ -157,3 +157,15 @@ CREATE TABLE `ss13_connection_log` ( `computerid` VARCHAR(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1; + +-- ------------------------------ +-- The missing connection log table +-- tgstation.ss13_ipc_tracking +-- ------------------------------ +CREATE TABLE `ss13_ipc_tracking` ( + `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `player_ckey` VARCHAR(32) NOT NULL, + `character_name` VARCHAR(255) NOT NULL, + `tag_status` TINYINT(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE = InnoDB DEFAULT CHARSET = latin1; diff --git a/aurora.dme b/aurora.dme index 6ddcd549..50ca5836 100644 --- a/aurora.dme +++ b/aurora.dme @@ -959,6 +959,7 @@ #include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\viral_infection.dm" #include "code\modules\events\wallrot.dm" +#include "code\modules\ext_scripts\discord.dm" #include "code\modules\ext_scripts\irc.dm" #include "code\modules\ext_scripts\python.dm" #include "code\modules\flufftext\Dreaming.dm" diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm index aa478f45..85a40eeb 100644 --- a/code/WorkInProgress/kilakk/fax.dm +++ b/code/WorkInProgress/kilakk/fax.dm @@ -1,6 +1,48 @@ var/list/obj/machinery/faxmachine/allfaxes = list() var/list/alldepartments = list("Central Command") +/datum/fax_repository + var/list/received_faxes = list() + var/list/sent_faxes = list() + +/datum/fax_repository/proc/add_fax(var/data, var/subject, var/sender, var/received = 1) + if (!data || !subject || !sender) + return + + var/list/new_fax = list("data" = data, "subject" = subject, "sender" = sender) + switch (received) + if (1) + received_faxes.Add(list(new_fax)) + return received_faxes.len + if (0) + sent_faxes.Add(list(new_fax)) + return sent_faxes.len + +/datum/fax_repository/proc/get_fax(var/id, var/received = 1) + if (!id) + return + + switch (received) + if (1) + return received_faxes[id] + if (0) + return sent_faxes[id] + +/datum/fax_repository/proc/get_subjects(var/received = 1) + var/list/target_list = null + switch (received) + if (1) + target_list = received_faxes + if (0) + target_list = sent_faxes + + var/list/return_list = list() + for (var/i = 1, i <= target_list.len, i++) + return_list.Add(target_list[i]["subject"]) + return_list[target_list[i]["subject"]] = i + + return return_list + /obj/machinery/faxmachine name = "fax machine" icon = 'icons/obj/library.dmi' @@ -179,6 +221,11 @@ var/list/alldepartments = list("Central Command") /proc/Centcomm_fax(var/sent, var/sentname, var/mob/Sender) + if (!ticker) + return + + var/fax_id = ticker.fax_repository.add_fax(sent, sentname, Sender.name) + for(var/client/C in admins) var/msg = "\blue CENTCOMM FAX: " if(C.holder.rights & (R_ADMIN|R_FUN|R_MOD)) @@ -186,12 +233,14 @@ var/list/alldepartments = list("Central Command") else msg += "[key_name(Sender,0,1,0)]" - msg += " (RPLY): Receiving '[sentname]' via secure connection ... view message" + msg += " (RPLY): Receiving '[sentname]' via secure connection ... view message" if(C.holder.rights & (R_ADMIN|R_DUTYOFF|R_FUN)) C << msg -proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt) + send_to_discord("cciaa_channel", "@everyone Received fax from [Sender]. Subject: [sentname].") + +/proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt) for(var/obj/machinery/faxmachine/F in allfaxes) if( F.department == dpt ) @@ -249,4 +298,4 @@ proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt) L = get(PDA, /mob/living/silicon) if(L) - L << "\icon[PDA] Message from [sender], \"[message]\" (Unable to Reply)" \ No newline at end of file + L << "\icon[PDA] Message from [sender], \"[message]\" (Unable to Reply)" diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 1c423657..8871475e 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -7,7 +7,7 @@ //Returns the world time in english proc/worldtime2text(time = world.time) //return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" - return time2text(time + world_timeofday_at_start, "hh:mm:ss") + return time2text(time + world_timeofday_at_start, "hh:mm") proc/time_stamp() return time2text(world.timeofday, "hh:mm:ss") diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 1a60f756..ed42f2de 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -161,6 +161,13 @@ var/list/age_restrictions = list() // Holds all of the age restrictions for jobs and antag roles in a single associated list + var/use_discord_bot = 0 + var/discord_login = "" + var/discord_password = "" + var/discord_mention_everyone = 1 + var/discord_admin_url = "" + var/discord_cciaa_url = "" + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -533,6 +540,24 @@ if ("whitelists_on_sql") config.whitelists_on_sql = 1 + if ("use_discord_bot") + config.use_discord_bot = 1 + + if ("discord_login") + config.discord_login = value + + if ("discord_password") + config.discord_password = value + + if ("discord_mention_everyone") + config.discord_mention_everyone = text2num(value) + + if ("discord_admin_url") + config.discord_admin_url = value + + if ("discord_cciaa_url") + config.discord_cciaa_url = value + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 773999fb..546adf79 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1365,3 +1365,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containertype = /obj/structure/closet/crate containername = "security magnetic locks" group = "Security" + +/datum/supply_packs/ipc_tag_pack + name = "IPC/Shell Tag Implanter Crate" + contains = list(/obj/item/weapon/implanter/ipc_tag, + /obj/item/weapon/implanter/ipc_tag) + cost = 40 + containertype = /obj/structure/closet/crate + containername = "IPC/Shell tag implanters" + group = "Medical / Science" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7f360633..d5f1a77a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -162,11 +162,14 @@ Implants; if(M.client) clients++ if(ishuman(M)) + var/mob/living/carbon/human/H = M if(!M.stat) surviving_humans++ if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations) escaped_humans++ - var/mob/living/carbon/human/H = M + if (istype(H.species, /datum/species/machine)) + var/datum/species/machine/machine = H.species + machine.update_tag(H, H.client) if (H.species) switch (H.species.name) if ("Human") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 8a7758ed..c5386cf3 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -39,6 +39,8 @@ var/global/datum/controller/gameticker/ticker var/round_end_announced = 0 // Spam Prevention. Announce round end only once. + var/datum/fax_repository/fax_repository + /datum/controller/gameticker/proc/pregame() login_music = pick(\ /*'sound/music/halloween/skeletons.ogg',\ @@ -135,6 +137,8 @@ var/global/datum/controller/gameticker/ticker //here to initialize the random events nicely at round start setup_economy() + fax_repository = new() + shuttle_controller.setup_shuttle_docks() spawn(0)//Forking here so we dont have to wait for this to finish @@ -158,6 +162,7 @@ var/global/datum/controller/gameticker/ticker admins_number++ if(admins_number == 0) send2adminirc("Round has started with no admins online.") + send_to_discord("admin_channel", "@everyone Round has started with no staff online.") supply_controller.process() //Start the supply shuttle regenerating points -- TLE master_controller.process() //Start master_controller.process() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index d2a7d0e2..159cb333 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -326,6 +326,8 @@ toggle_filter() if(!src.occupant) return + for(var/obj/O in src) //why was this never here? + O.loc = src.loc if(src.occupant.client) src.occupant.client.eye = src.occupant.client.mob src.occupant.client.perspective = MOB_PERSPECTIVE @@ -465,4 +467,4 @@ if(user.pulling == L) user.pulling = null return - return \ No newline at end of file + return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index bb3641de..48d913f6 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -54,7 +54,8 @@ /obj/item/robot_parts/robot_component/law_computer, /obj/item/robot_parts/robot_component/armour, /obj/item/robot_parts/robot_component/radiator, - /obj/item/robot_parts/robot_component/bladder + /obj/item/robot_parts/robot_component/bladder, + /obj/item/robot_parts/robot_component/ipc_tag ), "Ripley"=list( /obj/item/mecha_parts/chassis/ripley, diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm index 9b261401..c3376454 100644 --- a/code/game/objects/items/devices/magnetic_lock.dm +++ b/code/game/objects/items/devices/magnetic_lock.dm @@ -115,7 +115,11 @@ return if (istype(I, /obj/item/weapon/crowbar)) user << "You remove \the [powercell] from \the [src]." - powercell.loc = loc + if (ismob(loc)) + var/mob/M = loc + M.put_in_hands(powercell) + else + powercell.loc = loc powercell = null return if (istype(I, /obj/item/weapon/weldingtool)) @@ -149,6 +153,20 @@ visible_message("[src] beeps loudly and falls off \the [target]; its powercell having run out of power.") setstatus(STATUS_INACTIVE) +/obj/item/device/magnetic_lock/update_icon() + if (constructionstate && status != STATUS_BROKEN) + icon_state = "deconstruct_[constructionstate]" + return + else + switch (status) + if (STATUS_INACTIVE) + icon_state = "inactive" + if (STATUS_ACTIVE) + icon_state = "active" + if (STATUS_BROKEN) + icon_state = "broken" + return + /obj/item/device/magnetic_lock/proc/attachto(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob) if (status == STATUS_BROKEN) user << "[src] is damaged beyond repair! It cannot be used!" @@ -191,7 +209,6 @@ return detach() - icon_state = "inactive" status = newstatus if (STATUS_ACTIVE) @@ -201,7 +218,6 @@ return attach(newtarget) - icon_state = "active" status = newstatus if (STATUS_BROKEN) @@ -214,22 +230,19 @@ detach(playflick) - icon_state = "broken" status = newstatus + update_icon() + /obj/item/device/magnetic_lock/proc/setconstructionstate(var/newstate) constructionstate = newstate - if (newstate == 0) - if (status == STATUS_ACTIVE) - icon_state = "active" - else - icon_state = "inactive" - else if (newstate == 2) + if (newstate == 2) flick("deconstruct_2_anim", src) - else if (newstate == 4) + + if (newstate == 4) setstatus(STATUS_BROKEN) - else - icon_state = "deconstruct_[constructionstate]" + + update_icon() /obj/item/device/magnetic_lock/proc/detach(var/playflick = 1) if (target) @@ -241,6 +254,7 @@ layer = LAYER_NORMAL target.bracer = null + target = null processing_objects.Remove(src) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 694f5b09..8a21f4b3 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -114,6 +114,10 @@ assembly.head = src move_into_robot(user,assembly) +/obj/item/robot_parts/head/New() + ..() + + law_computer = new() /obj/item/robot_parts/robot_suit name = "robot endoskeleton" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 110a94b7..d4997ade 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -483,6 +483,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_on = "zippoon" icon_off = "zippo" +/obj/item/weapon/lighter/green + icon_on = "lighter-g-on" + icon_off = "lighter-g" + +/obj/item/weapon/lighter/red + icon_on = "lighter-r-on" + icon_off = "lighter-r" + +/obj/item/weapon/lighter/yellow + icon_on = "lighter-y-on" + icon_off = "lighter-y" + +/obj/item/weapon/lighter/cyan + icon_on = "lighter-c-on" + icon_off = "lighter-c" + /obj/item/weapon/lighter/random New() var/color = pick("r","c","y","g") @@ -508,7 +524,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM else user.apply_damage(2,BURN,"r_hand") user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") - user.SetLuminosity(user.luminosity + 2) processing_objects.Add(src) else @@ -554,7 +569,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/lighter/pickup(mob/user) - if(lit) + if(lit && !(user.resting)) SetLuminosity(0) user.SetLuminosity(user.luminosity+2) return diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 3c0c3384..9e324c43 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -44,6 +44,8 @@ I.reagents.trans_to(src.imp, 5) user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." else if (istype(I, /obj/item/weapon/implanter)) + if (istype(I, /obj/item/weapon/implanter/ipc_tag)) + return if (I:imp) if ((src.imp || I:imp.implanted)) return @@ -172,4 +174,3 @@ src.imp = new /obj/item/weapon/implant/compressed( src ) ..() return - diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 8beee93a..f87a409f 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -129,3 +129,68 @@ S.remove_from_storage(A) A.loc.contents.Remove(A) update() + +/obj/item/weapon/implanter/ipc_tag + name = "IPC/Shell tag implanter" + desc = "A special implanter used for implanting synthetics with a special tag." + var/obj/item/robot_parts/robot_component/ipc_tag/ipc_tag = null + +/obj/item/weapon/implanter/ipc_tag/New() + ipc_tag = new(src) + ..() + update() + +/obj/item/weapon/implanter/ipc_tag/update() + if (ipc_tag) + icon_state = "cimplanter1" + else + icon_state = "cimplanter0" + return + +/obj/item/weapon/implanter/ipc_tag/attack(mob/M as mob, mob/user as mob) + if (!ishuman(M)) + return + + if (!ipc_tag) + user << "\red [src] is empty!" + return + + var/mob/living/carbon/human/H = M + if (!H.species || !istype(H.species, /datum/species/machine) || !H.organs_by_name["head"]) + user << "\red You cannot use this on a non-synthetic organism!" + return + + if (H.internal_organs_by_name["ipc tag"]) + user << "\red [H] is already tagged!" + return + + for (var/mob/O in viewers(M, null)) + O.show_message("\red [M] has been implanted by [user].", 1) + + M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.ipc_tag.name]) by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.ipc_tag.name]) to implant [M.name] ([M.ckey])") + msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + + user.show_message("\red You implanted the implant into [M].") + + ipc_tag.organ_type.replaced(H, H.organs_by_name["head"]) + + del(ipc_tag) + update() + + var/datum/species/machine/machine = H.species + machine.update_tag(H, H.client) + +/obj/item/weapon/implanter/ipc_tag/attackby(var/obj/item/robot_parts/robot_component/ipc_tag/new_tag, mob/user as mob) + ..() + + if (!istype(new_tag)) + return + + if (ipc_tag) + return + + ipc_tag = new_tag + user.drop_item() + new_tag.loc = src + update() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index af695044..f14d71ec 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -31,12 +31,7 @@ var/global/normal_ooc_colour = "#002eb8" if(prefs.muted & MUTE_OOC) src << "\red You cannot use OOC (muted)." return - if(handle_spam_prevention(msg,MUTE_OOC)) - return - if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." - log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") - message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") + if(handle_spam_prevention(msg,MUTE_OOC,0)) return if(holder) @@ -148,12 +143,7 @@ var/global/normal_ooc_colour = "#002eb8" if(prefs.muted & MUTE_OOC) src << "\red You cannot use OOC (muted)." return - if(handle_spam_prevention(msg,MUTE_OOC)) - return - if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." - log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") - message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") + if(handle_spam_prevention(msg,MUTE_OOC,0)) return if(holder) @@ -206,4 +196,4 @@ var/global/normal_ooc_colour = "#002eb8" var/prefix = "(R)LOOC" if (C.mob in heard) prefix = "LOOC" - C << "[stealth][prefix]: [src.key]: [msg]" \ No newline at end of file + C << "[stealth][prefix]: [src.key]: [msg]" diff --git a/code/modules/admin/permissionverbs/permsission lists.dm b/code/modules/admin/permissionverbs/permsission lists.dm index bfddf36a..2502ac52 100644 --- a/code/modules/admin/permissionverbs/permsission lists.dm +++ b/code/modules/admin/permissionverbs/permsission lists.dm @@ -89,7 +89,9 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_view_range, /*changes how far we can see*/ /client/proc/toggle_visibily, /client/proc/secrets, - /client/proc/set_ooc + /client/proc/set_ooc, + /client/proc/send_admin_fax, + /client/proc/check_fax_history ) var/list/admin_verbs_ban = list( @@ -145,7 +147,9 @@ var/list/admin_verbs_fun = list( /client/proc/player_panel, /client/proc/secrets, /client/proc/send_space_ninja, - /client/proc/toggle_view_range + /client/proc/toggle_view_range, + /client/proc/send_admin_fax, + /client/proc/check_fax_history ) var/list/admin_verbs_dev = list( @@ -403,7 +407,9 @@ var/list/admin_verbs_duty = list( /client/proc/cmd_admin_create_centcom_report, /client/proc/cmd_duty_say, /client/proc/returntobody, - /client/proc/view_duty_log + /client/proc/view_duty_log, + /client/proc/send_admin_fax, + /client/proc/check_fax_history ) /client/proc/add_admin_verbs() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d9ebaf85..9590af78 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1531,49 +1531,18 @@ H << "An encripted connection was made and a file was uploaded to your systems. \"Please stand by for a message from Central Command. Message as follows. \"[input]\" Message ends.\"" else if(href_list["CentcommFaxView"]) - var/info = locate(href_list["CentcommFaxView"]) + if (!href_list["CentcommFaxReceived"] || !ticker) + return - usr << browse("Centcomm Fax Message[info]", "window=Centcomm Fax Message") + var/list/fax = ticker.fax_repository.get_fax(text2num(href_list["CentcommFaxView"]), text2num(href_list["CentcommFaxReceived"])) + + usr << browse("Centcomm Fax Message[fax["data"]]", "window=Centcomm Fax Message") else if(href_list["CentcommFaxReply"]) - var/mob/living/carbon/human/H = locate(href_list["CentcommFaxReply"]) - - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
for line breaks.", "Outgoing message from Centcomm", "") as message|null - if(!input) return - - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - - //so that we alert people with certain cartidges with a PDA message. - alertFaxes() - - for(var/obj/machinery/faxmachine/F in machines) - if(! (F.stat & (BROKEN|NOPOWER) ) ) - - // animate! it's alive! - flick("faxreceive", F) - - // give the sprite some time to flick - spawn(20) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc ) - P.name = "[command_name()]- [customname]" - P.info = input - P.update_icon() - - playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1) - - // Stamps - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/weapon/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped by the Central Command Quantum Relay." - - src.owner << "Message reply to transmitted successfully." - log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]") - message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)] view message", 1) + usr.client.send_admin_fax() + else if (href_list["CentcommFaxHistory"]) + usr.client.check_fax_history(text2num(href_list["CentcommFaxHistory"])) else if(href_list["jumpto"]) if(!check_rights(R_ADMIN|R_FUN)) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 41ff2003..bb6261d5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -15,7 +15,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(prefs.muted & MUTE_ADMINHELP) src << "Error: Admin-PM: You cannot send adminhelps (Muted)." return - if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if(src.handle_spam_prevention(msg,MUTE_ADMINHELP,0)) return adminhelped = 2 //Determines if they get the message to reply by clicking the name. @@ -124,8 +124,10 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(admin_number_present <= 0) if(!admin_number_afk) send2adminirc("ADMINHELP from [key_name(src)]: [html_decode(original_msg)] - !!No admins online!!") + send_to_discord("admin_channel", "@everyone ADMINHELP from [key_name(src)]: [html_decode(original_msg)] - !!No admins online!!") else send2adminirc("ADMINHELP from [key_name(src)]: [html_decode(original_msg)] - !!All admins AFK ([admin_number_afk])!!") + send_to_discord("admin_channel", "@everyone ADMINHELP from [key_name(src)]: [html_decode(original_msg)] - !!All admins AFK ([admin_number_afk])!!") else send2adminirc("ADMINHELP from [key_name(src)]: [html_decode(original_msg)]") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 8fb8c70f..fd49a3c9 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -56,7 +56,7 @@ else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return - if (src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if (src.handle_spam_prevention(msg,MUTE_ADMINHELP,0)) return //clean the message if it's not sent by a high-rank admin @@ -161,4 +161,3 @@ continue if(X.holder.rights & (R_ADMIN|R_MOD)) X << "PM: [key_name(src, X, 0)]->IRC-Admins: \blue [msg]" - diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 33e78ef4..0993a9a0 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -15,9 +15,6 @@ src << "\red You have deadchat muted." return - if (src.handle_spam_prevention(msg,MUTE_DEADCHAT)) - return - var/stafftype = null if (src.holder.rights & R_MOD) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 776c5355..c0893f6f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -13,7 +13,7 @@ if(usr.client.prefs.muted & MUTE_PRAY) usr << "\red You cannot pray (muted)." return - if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) + if(src.client.handle_spam_prevention(msg,MUTE_PRAY,0)) return var/image/cross = image('icons/obj/storage.dmi',"bible") @@ -53,9 +53,11 @@ else C << "[msg_start][key_name(Sender, 0, 1, 0)][msg_end]" + send_to_discord("cciaa_channel", "@everyone **Emergency Message** from [Sender]: [text]!") + /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(C.holder.rights & (R_ADMIN|R_MOD|R_FUN)) - C << msg \ No newline at end of file + C << msg diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm index d222bb5e..932ca4e6 100644 --- a/code/modules/admin/verbs/warning.dm +++ b/code/modules/admin/verbs/warning.dm @@ -42,7 +42,7 @@ feedback_inc("ban_warn",1) else if(C) - C << "You have been formally warned by an administrator.
Further warnings will result in an autoban.
" + C << "You have been warned by an administrator.
Further warnings will result in an autoban.
" message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") message_mods("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") else @@ -122,7 +122,7 @@ feedback_add_details("admin_verb","WARN-DB") if(C) - C << "You have been formally warned by an administrator.
Click here to review and acknowledge them!
" + C << "You have been warned by an administrator.
Click here to review and acknowledge them!
" message_admins("[key_name_admin(src)] has warned [warned_ckey] for: [reason].") message_mods("[key_name_admin(src)] has warned [warned_ckey].") diff --git a/code/modules/aurora/duty_officer/duty officer.dm b/code/modules/aurora/duty_officer/duty officer.dm index d8867b2a..37211207 100644 --- a/code/modules/aurora/duty_officer/duty officer.dm +++ b/code/modules/aurora/duty_officer/duty officer.dm @@ -246,3 +246,99 @@ var/oldjob = M.mind.assigned_role job_master.FreeRole(oldjob) return + +/client/proc/send_admin_fax() + set name = "Send admin fax" + set desc = "Send a fax from Central Command" + set category = "Special Verbs" + + if (!check_rights(R_ADMIN|R_DUTYOFF|R_FUN)) + usr << "\red You do not have enough powers to do this." + return + + if (!ticker) + usr << "\red No ticker! Bad!" + return + + if (ticker.current_state < GAME_STATE_PLAYING) + usr << "\red The game hasn't started yet!" + return + + var/input = input(usr, "Please enter a message to send to [station_name()] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
for line breaks.", "Outgoing message from Centcomm", "") as message|null + + if (!input) + usr << "\red Cancelled." + return + + var/customsender = input(usr, "Pick a Duty Officer name to use", "Name") as text|null + if (!customsender) + usr << "\red Name required! Cancelled." + return + + var/customname = input(usr, "Pick a title for the report", "Title") as text|null + + //so that we alert people with certain cartidges with a PDA message. + alertFaxes() + + for (var/obj/machinery/faxmachine/F in machines) + if (!(F.stat & (BROKEN|NOPOWER))) + + // animate! it's alive! + flick("faxreceive", F) + + // give the sprite some time to flick + spawn(20) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(F.loc) + P.name = "[command_name()]- [customname]" + P.info = input + P.update_icon() + + playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1) + + // Stamps + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if (!P.stamped) + P.stamped = new + P.stamped += /obj/item/weapon/stamp + P.overlays += stampoverlay + P.stamps += "
This paper has been stamped by the Central Command Quantum Relay." + + var/fax_id = ticker.fax_repository.add_fax(input, customname, customsender, 0) + + usr << "Message reply to transmitted successfully." + log_admin("[key_name(usr)] sent a Central Command fax message: [input]") + message_admins("[key_name_admin(usr)] sent a Central Command fax message: view message", 1) + +/client/proc/check_fax_history() + set name = "Check fax history" + set desc = "Look up the faxes sent this round." + set category = "Special Verbs" + + if (!check_rights(R_ADMIN|R_DUTYOFF|R_FUN)) + usr << "\red You do not have enough powers to do this." + return + + if (!ticker) + usr << "\red No ticker! Bad!" + return + + if (ticker.current_state < GAME_STATE_PLAYING) + usr << "\red The game hasn't started yet!" + return + + var/data = "
Send New Fax
" + data += "
" + data += "
Received Faxes:

" + var/list/faxes = ticker.fax_repository.get_subjects(1) + + for (var/i in faxes) + data += "[i]
" + + faxes = ticker.fax_repository.get_subjects(0) + + data += "
Sent Faxes:

" + for (var/i in faxes) + data += "[i]
" + + usr << browse("Centcomm Fax History[data]", "window=Centcomm Fax History") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 135262c9..2052558e 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -87,9 +87,17 @@ if(href_list["warnview"]) warnings_check() + if(href_list["preference"]) + if(istype(mob, /mob/new_player)) + var/mob/new_player/P = mob + if(P.ready) + return + prefs.process_link(src, href_list) ..() //redirect to hsrc.Topic() -/client/proc/handle_spam_prevention(var/message, var/mute_type) +/client/proc/handle_spam_prevention(var/message, var/mute_type, var/pass = 1) + if (pass) + return 0 if(config.automute_on && !holder) if(src.last_message_time > world.time - SPAM_TIMER * 10) if(src.last_message_timer > SPAM_TRIGGER_AUTOMUTE) @@ -333,3 +341,9 @@ 'icons/spideros_icons/sos_13.png', 'icons/spideros_icons/sos_14.png' ) + +/client/verb/edit_character() + set name = "Edit Character" + set category = "Preferences" + set desc = "Allows you to edit your character and preferences" + prefs.ShowChoices(src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index cea406ad..9590702f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -203,7 +203,7 @@ datum/preferences if(24 to 1000) return "God" -/datum/preferences/proc/SetSkills(mob/user) +/datum/preferences/proc/SetSkills(client/user) if(SKILLS == null) setup_skills() @@ -239,8 +239,8 @@ datum/preferences user << browse(HTML, "window=show_skills;size=600x800") return -/datum/preferences/proc/ShowChoices(mob/user) - if(!user || !user.client) return +/datum/preferences/proc/ShowChoices(client/user) + if(!user) return update_preview_icon() user << browse_rsc(preview_icon_side, "previewicon2.png") user << browse_rsc(preview_icon_front, "previewicon1.png") @@ -437,7 +437,7 @@ datum/preferences banned = jobban_isbanned(user, "pAI") if (banned == "Age Restricted") - var/time = config.age_restrictions[i] - user.client.player_age + var/time = config.age_restrictions[i] - user.player_age dat += "Be [i]: \[IN [time] DAYS]
" else if (banned) dat += "Be [i]: \[BANNED]
" @@ -455,7 +455,7 @@ datum/preferences user << browse(dat, "window=preferences;size=560x736") -/datum/preferences/proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660) +/datum/preferences/proc/SetChoices(client/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660) if(!job_master) return @@ -497,8 +497,8 @@ datum/preferences else if(jobban_isbanned(user, rank)) HTML += "[rank] \[BANNED]" continue - if(!job.player_old_enough(user.client)) - var/available_in_days = job.available_in_days(user.client) + if(!job.player_old_enough(user)) + var/available_in_days = job.available_in_days(user) HTML += "[rank] \[IN [(available_in_days)] DAYS]" continue if((job_civilian_low & ASSISTANT) && (rank != "Assistant")) @@ -552,7 +552,7 @@ datum/preferences user << browse(HTML, "window=mob_occupation;size=[width]x[height]") return -/datum/preferences/proc/SetDisabilities(mob/user) +/datum/preferences/proc/SetDisabilities(client/user) var/HTML = "" HTML += "
" HTML += "Choose disabilities
" @@ -572,7 +572,7 @@ datum/preferences user << browse(HTML, "window=disabil;size=350x300") return -/datum/preferences/proc/SetRecords(mob/user) +/datum/preferences/proc/SetRecords(client/user) var/HTML = "" HTML += "
" HTML += "Set Character Records
" @@ -597,7 +597,7 @@ datum/preferences user << browse(HTML, "window=records;size=350x300") return -/datum/preferences/proc/SetAntagoptions(mob/user) +/datum/preferences/proc/SetAntagoptions(client/user) if(uplinklocation == "" || !uplinklocation) uplinklocation = "PDA" var/HTML = "" @@ -615,7 +615,7 @@ datum/preferences user << browse(HTML, "window=antagoptions") return -/datum/preferences/proc/SetFlavorText(mob/user) +/datum/preferences/proc/SetFlavorText(client/user) var/HTML = "" HTML += "
" HTML += "Set Flavour Text
" @@ -667,7 +667,7 @@ datum/preferences if(job.title != new_title) player_alt_titles[job.title] = new_title -/datum/preferences/proc/SetJob(mob/user, role) +/datum/preferences/proc/SetJob(client/user, role) var/datum/job/job = job_master.GetJob(role) if(!job) user << browse(null, "window=mob_occupation") @@ -786,10 +786,10 @@ datum/preferences job_engsec_low |= job.flag return 1 -/datum/preferences/proc/process_link(mob/user, list/href_list) +/datum/preferences/proc/process_link(client/user, list/href_list) if(!user) return - if(!istype(user, /mob/new_player)) return + //if(!istype(user, /mob/new_player)) return //WE CAN EDIT CHARACTER WHENEVER if(href_list["preference"] == "job") switch(href_list["task"]) if("close") @@ -1554,7 +1554,7 @@ datum/preferences message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.") character.gender = MALE -/datum/preferences/proc/open_load_dialog(mob/user) +/datum/preferences/proc/open_load_dialog(client/user) var/dat = "" dat += "
" @@ -1576,7 +1576,7 @@ datum/preferences user << browse(dat, "window=saves;size=300x390") -/datum/preferences/proc/close_load_dialog(mob/user) +/datum/preferences/proc/close_load_dialog(client/user) user << browse(null, "window=saves") @@ -1596,7 +1596,7 @@ datum/preferences return temp.hair_species -/datum/preferences/proc/custom_robot_limb(mob/user,) +/datum/preferences/proc/custom_robot_limb(client/user,) var/covering_name = input(user, "What kind of covering do you want?") as null|anything in get_limb_covering_names() if (!covering_name) return @@ -1637,7 +1637,7 @@ var/list/limb_connection_data return limb_connection_data -/datum/preferences/proc/pick_organ_to_customize(mob/user,var/is_organic_species) +/datum/preferences/proc/pick_organ_to_customize(client/user,var/is_organic_species) var/list/valid_targets = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") if (!is_organic_species) valid_targets.Add(list("Head","Chest","Groin")) @@ -1648,7 +1648,7 @@ var/list/limb_connection_data return limb_info[limb_name] -/datum/preferences/proc/customize_limbs(mob/user,var/is_organic_species) +/datum/preferences/proc/customize_limbs(client/user,var/is_organic_species) var/list/limb_info = pick_organ_to_customize(user,is_organic_species) if (!limb_info) return diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 142e7a01..c0d0457b 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -232,23 +232,63 @@ proc/populate_gear_list() cost = 1 // slot = slot_gloves +/datum/gear/black_gloves_unathi + display_name = "black gloves, unathi" + path = /obj/item/clothing/gloves/black/unathi + cost = 1 + +/datum/gear/black_gloves_tajara + display_name = "black gloves, tajaran" + path = /obj/item/clothing/gloves/black/tajara + cost = 1 + /datum/gear/red_gloves display_name = "red gloves" path = /obj/item/clothing/gloves/red cost = 1 // slot = slot_gloves +/datum/gear/red_gloves_unathi + display_name = "red gloves, unathi" + path = /obj/item/clothing/gloves/red/unathi + cost = 1 + +/datum/gear/red_gloves_tajaran + display_name = "red gloves, tajaran" + path = /obj/item/clothing/gloves/red/tajara + cost = 1 + /datum/gear/blue_gloves display_name = "blue gloves" path = /obj/item/clothing/gloves/blue cost = 1 // slot = slot_gloves +/datum/gear/blue_gloves_unathi + display_name = "blue gloves, unathi" + path = /obj/item/clothing/gloves/blue/unathi + cost = 1 + +/datum/gear/blue_gloves_tajaran + display_name = "blue gloves, tajaran" + path = /obj/item/clothing/gloves/blue/tajara + cost = 1 + /datum/gear/orange_gloves display_name = "orange gloves" path = /obj/item/clothing/gloves/orange cost = 1 -// slot = slot_gloves + // slot = slot_gloves + +/datum/gear/orange_gloves_unathi + display_name = "orange gloves, unathi" + path = /obj/item/clothing/gloves/orange/unathi + cost = 1 + +/datum/gear/orange_gloves_tajaran + display_name = "orange gloves, tajaran" + path = /obj/item/clothing/gloves/orange/tajara + cost = 1 /datum/gear/purple_gloves display_name = "purple gloves" @@ -256,24 +296,64 @@ proc/populate_gear_list() cost = 1 // slot = slot_gloves +/datum/gear/purple_gloves_unathi + display_name = "purple gloves, unathi" + path = /obj/item/clothing/gloves/purple/unathi + cost = 1 + +/datum/gear/purple_gloves_tajaran + display_name = "purple gloves, tajaran" + path = /obj/item/clothing/gloves/purple/tajara + cost = 1 + /datum/gear/brown_gloves display_name = "brown gloves" path = /obj/item/clothing/gloves/brown cost = 1 // slot = slot_gloves +/datum/gear/brown_gloves_unathi + display_name = "brown gloves, unathi" + path = /obj/item/clothing/gloves/brown/unathi + cost = 1 + +/datum/gear/brown_gloves_tajaran + display_name = "brown gloves, tajaran" + path = /obj/item/clothing/gloves/brown/tajara + cost = 1 + /datum/gear/green_gloves display_name = "green gloves" path = /obj/item/clothing/gloves/green cost = 1 // slot = slot_gloves +/datum/gear/green_gloves_unathi + display_name = "green gloves, unathi" + path = /obj/item/clothing/gloves/green/unathi + cost = 1 + +/datum/gear/green_gloves_tajaran + display_name = "green gloves, tajaran" + path = /obj/item/clothing/gloves/green/tajara + cost = 1 + /datum/gear/white_gloves display_name = "white gloves" path = /obj/item/clothing/gloves/white cost = 1 // slot = slot_gloves +/datum/gear/white_gloves_unathi + display_name = "white gloves, unathi" + path = /obj/item/clothing/gloves/white/unathi + cost = 1 + +/datum/gear/white_gloves_tajaran + display_name = "white gloves, tajaran" + path = /obj/item/clothing/gloves/white/tajara + cost = 1 + /datum/gear/black_shoes display_name = "black shoes" path = /obj/item/clothing/shoes/black @@ -374,6 +454,11 @@ proc/populate_gear_list() path = /obj/item/clothing/tie/armband/medgreen cost = 1 +/datum/gear/armband_iac + display_name = "IAC armband" + path = /obj/item/clothing/tie/armband/iac_armband + cost = 1 + /datum/gear/skirt_blue display_name = "blue plaid skirt" path = /obj/item/clothing/under/dress/plaid_blue @@ -592,4 +677,66 @@ proc/populate_gear_list() /datum/gear/cigar_case display_name = "cigar case" path = /obj/item/weapon/storage/fancy/cigars - cost = 3 + cost = 2 + +/datum/gear/smoking_pipe + display_name = "smoking pipe" + path = /obj/item/clothing/mask/cigarette/pipe + cost = 2 + +/datum/gear/cigarettes + display_name = "pack of DromedaryCo cigarettes" + path = /obj/item/weapon/storage/fancy/cigarettes/dromedaryco + cost = 2 + +/datum/gear/red_lipstick + display_name = "lipstick, red" + path = /obj/item/weapon/lipstick + cost = 1 + +/datum/gear/purple_lipstick + display_name = "lipstick, purple" + path = /obj/item/weapon/lipstick/purple + cost = 1 + +/datum/gear/jade_lipstick + display_name = "lipstick, jade" + path = /obj/item/weapon/lipstick/jade + cost = 1 + +/datum/gear/black_lipstick + display_name = "lipstick, black" + path = /obj/item/weapon/lipstick/black + cost = 1 + +/datum/gear/cigarettes + display_name = "pack of cigarettes" + path = /obj/item/weapon/storage/fancy/cigarettes + cost = 1 + +datum/gear/lighterg + display_name = "lighter, green" + path = /obj/item/weapon/lighter/green + cost = 1 + +/datum/gear/lighterr + display_name = "lighter, red" + path = /obj/item/weapon/lighter/red + cost = 1 + +/datum/gear/lightery + display_name = "lighter, yellow" + path = /obj/item/weapon/lighter/yellow + cost = 1 + +/datum/gear/lighterc + display_name = "lighter, cyan" + path = /obj/item/weapon/lighter/cyan + cost = 1 + +datum/gear/matches + display_name = "matchbook" + path = /obj/item/weapon/storage/box/matches + cost = 1 + + diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 8630cfa0..34ed2063 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -48,9 +48,10 @@ /obj/item/clothing/glasses/science name = "Science Goggles" - desc = "The goggles do nothing!" + desc = "Protects against harmful chemicals!" icon_state = "purple" item_state = "glasses" + unacidable = 1 /obj/item/clothing/glasses/night name = "Night Vision Goggles" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 26eaf5fb..ba3dd00b 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -136,10 +136,80 @@ /obj/item/clothing/gloves/black/unathi name = "black gloves" - desc = "black gloves made for Unathi use." + desc = "Black gloves made for Unathi use." species_restricted = list("Unathi") /obj/item/clothing/gloves/black/tajara name = "black gloves" - desc = "black gloves made for Tajara use." + desc = "Black gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/red/unathi + name = "red gloves" + desc = "Red gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/red/tajara + name = "red gloves" + desc = "Red gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/blue/unathi + name = "blue gloves" + desc = "Blue gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/blue/tajara + name = "blue gloves" + desc = "Blue gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/orange/unathi + name = "orange gloves" + desc = "Orange gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/orange/tajara + name = "orange gloves" + desc = "Orange gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/purple/unathi + name = "purple gloves" + desc = "Purple gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/purple/tajara + name = "purple gloves" + desc = "Purple gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/brown/unathi + name = "brown gloves" + desc = "Brown gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/brown/tajara + name = "brown gloves" + desc = "Brown gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/green/unathi + name = "green gloves" + desc = "Green gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/green/tajara + name = "green gloves" + desc = "Green gloves made for Tajaran use." + species_restricted = list("Tajaran") + +/obj/item/clothing/gloves/white/unathi + name = "white gloves" + desc = "White gloves made for Unathi use." + species_restricted = list("Unathi") + +/obj/item/clothing/gloves/white/tajara + name = "white gloves" + desc = "White gloves made for Tajaran use." species_restricted = list("Tajaran") \ No newline at end of file diff --git a/code/modules/ext_scripts/discord.dm b/code/modules/ext_scripts/discord.dm new file mode 100644 index 00000000..fbf7ac42 --- /dev/null +++ b/code/modules/ext_scripts/discord.dm @@ -0,0 +1,14 @@ +/proc/send_to_discord(var/channel, var/message) + if (!config.use_discord_bot) + return + + if (channel == "admin_channel") + channel = config.discord_admin_url + else if (channel == "cciaa_channel") + channel = config.discord_cciaa_url + + if (!config.discord_mention_everyone && findtext(message, "@everyone")) + replacetextEx(message, "@everyone", "") + + ext_python("discordbot_message.py", "[config.discord_login] [config.discord_password] [channel] [message]") + return diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 6e64df73..1e004769 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -11,9 +11,6 @@ src << "\red You cannot talk in deadchat (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) - return - . = src.say_dead(message) @@ -33,9 +30,6 @@ src << "\red You cannot emote in deadchat (muted)." return - if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT)) - return - . = src.emote_dead(message) /* diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 0efcae7c..7c8eafb8 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -18,8 +18,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -124,4 +122,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index d0038f08..df135038 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -18,8 +18,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -132,4 +130,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index da325c04..f2fe2a58 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -18,8 +18,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -124,4 +122,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 2cf1cb37..ee41e3c0 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -19,8 +19,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -79,4 +77,4 @@ O.show_message(message, m_type) else if (m_type & 2) for (var/mob/O in hearers(src.loc, null)) - O.show_message(message, m_type) \ No newline at end of file + O.show_message(message, m_type) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 799a89fc..c056d2a5 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -74,8 +74,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -618,4 +616,4 @@ HTML += "
" HTML +="\[Done\]" HTML += "" - src << browse(HTML, "window=flavor_changes;size=430x300") \ No newline at end of file + src << browse(HTML, "window=flavor_changes;size=430x300") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8058315d..0db5f5e0 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -61,6 +61,9 @@ msg += "[src.name]!\n" + if (species && species.has_organ["ipc tag"] && internal_organs_by_name["ipc tag"]) + msg += "[t_He] [t_is] wearing a tag designating them as an Integrated Positronic Chassis/Shell.\n" + //uniform if(w_uniform && !skipjumpsuit) //Ties diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index cb8ab473..b8398366 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -610,6 +610,7 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. "radiator" = /datum/organ/internal/machine/radiator, "chemical containment" = /datum/organ/internal/machine/bladder, "diagnosis unit" = /datum/organ/internal/machine/diagnosis_unit, + "ipc tag" = /datum/organ/internal/machine/ipc_tag ) /datum/species/machine/create_organs(var/mob/living/carbon/human/H) ..() @@ -618,6 +619,56 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. if (isnull(brain_datum.machine_brain_type)) brain_datum.machine_brain_type="Posibrain" +/datum/species/machine/proc/check_tag(var/mob/living/carbon/human/new_machine, var/client/player) + if (!new_machine || !player) + return + + establish_db_connection() + + if (dbcon.IsConnected()) + var/datum/organ/internal/machine/ipc_tag/tag = new_machine.internal_organs_by_name["ipc tag"] + + var/status = 0 + var/list/query_details = list(":ckey" = player.ckey, ":character_name" = player.prefs.real_name) + var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name") + query.Execute(query_details) + + if (query.NextRow()) + status = text2num(query.item[1]) + else + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO ss13_ipc_tracking (player_ckey, character_name) VALUES (:ckey, :character_name)") + log_query.Execute(query_details) + + if (!status) + new_machine.internal_organs_by_name.Remove("ipc tag") + new_machine.internal_organs.Remove(tag) + del(tag) + +/datum/species/machine/proc/update_tag(var/mob/living/carbon/human/target, var/client/player) + if (!target || !player) + return + + establish_db_connection() + + if (dbcon.IsConnected()) + var/status = 0 + var/sql_status = 0 + if (target.internal_organs_by_name["ipc tag"]) + status = 1 + + var/list/query_details = list(":ckey" = player.ckey, ":character_name" = target.real_name) + var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name") + query.Execute(query_details) + + if (query.NextRow()) + sql_status = text2num(query.item[1]) + if (sql_status == status) + return + + query_details.Add(":status") + query_details[":status"] = status + var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ipc_tracking SET tag_status = :status WHERE player_ckey = :ckey AND character_name = :character_name") + update_query.Execute(query_details) /datum/species/bug name = "Vaurca" diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 6ecfd8f7..c1a918fe 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -12,8 +12,7 @@ if (src.client.prefs.muted & MUTE_IC) src << "\red You cannot whisper (muted)." return - - if (src.client.handle_spam_prevention(message,MUTE_IC)) + if (client.handle_spam_prevention(message, MUTE_IC, 0)) return if (src.stat == 2) @@ -78,12 +77,12 @@ temp_message[H] = ninjaspeak(temp_message[H]) pick_list -= H message = list2text(temp_message, " ") - message = replacetext(message, "o", "¤") - message = replacetext(message, "p", "þ") - message = replacetext(message, "l", "£") - message = replacetext(message, "s", "§") - message = replacetext(message, "u", "µ") - message = replacetext(message, "b", "ß") + message = replacetext(message, "o", "�") + message = replacetext(message, "p", "�") + message = replacetext(message, "l", "�") + message = replacetext(message, "s", "�") + message = replacetext(message, "u", "�") + message = replacetext(message, "b", "�") //TODO: handle_speech_problems if (src.stuttering) diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/metroid/emote.dm index 123bcbce..b315eb9c 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/metroid/emote.dm @@ -17,8 +17,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -73,4 +71,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm index 21057a0b..56ecf9dd 100644 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ b/code/modules/mob/living/carbon/monkey/emote.dm @@ -19,8 +19,6 @@ if (client.prefs.muted & MUTE_IC) src << "\red You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -137,4 +135,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm index b9658454..7cecb30b 100644 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -13,8 +13,6 @@ if(client.prefs.muted & MUTE_IC) src << "You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -99,4 +97,4 @@ else for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 8f836208..0a58d37d 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -206,6 +206,10 @@ icon_state_broken = "bladder_broken" organ_type = new /obj/item/organ/machine/bladder() +/obj/item/robot_parts/robot_component/ipc_tag + name = "IPC tag" + organ_type = new /obj/item/organ/machine/ipc_tag() + // //Robotic Component Analyser, basically a health analyser for robots // diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 1c55bed0..bec57287 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -14,8 +14,6 @@ if(client.prefs.muted & MUTE_IC) src << "You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (stat) return if(!(message)) @@ -217,4 +215,4 @@ else for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 8aa23f99..470837e6 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -31,8 +31,6 @@ if(client.prefs.muted & MUTE_IC) src << "You cannot send IC messages (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index bf47c80a..22d79e70 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -11,8 +11,6 @@ if(client.prefs.muted & MUTE_IC) src << "\red You cannot speak in IC (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if(istype(src.loc,/mob/living/simple_animal/borer)) @@ -135,8 +133,6 @@ if(client.prefs.muted & MUTE_IC) src << "\red You cannot speak in IC (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (copytext(message, 1, 2) == "*") return emote(copytext(message, 2)) diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index 936c810d..524cf493 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -9,8 +9,6 @@ if(client.prefs.muted & MUTE_IC) src << "\red You cannot speak in IC (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if(istype(src.loc,/mob/living/simple_animal/borer)) diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm index c0bfb071..156fce5e 100644 --- a/code/modules/mob/living/simple_animal/borer/say.dm +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -16,8 +16,6 @@ if(client.prefs.muted & MUTE_IC) src << "\red You cannot speak in IC (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return if (copytext(message, 1, 2) == "*") return emote(copytext(message, 2)) @@ -39,4 +37,4 @@ if (istype(M, /mob/new_player)) continue else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) - M << "[src.truename] whispers to [host], \"[message]\"" \ No newline at end of file + M << "[src.truename] whispers to [host], \"[message]\"" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 5032ffae..10a89bf0 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -219,10 +219,7 @@ usr << "Thank you for your vote!" usr << browse(null,"window=privacypoll") - if(!ready && href_list["preference"]) - if(client) - client.prefs.process_link(src, href_list) - else if(!href_list["late_join"]) + if(!href_list["late_join"]) new_player_panel() if(href_list["showpoll"]) @@ -404,6 +401,10 @@ if(is_species_whitelisted(chosen_species) || has_admin_rights()) new_character = new(loc, client.prefs.species) + if (istype(chosen_species, /datum/species/machine)) + var/datum/species/machine/chose_machine = chosen_species + chose_machine.check_tag(new_character, client) + if(!new_character) new_character = new(loc) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 454c962f..b5291cf8 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -12,6 +12,15 @@ if(say_disabled) //This is here to try to identify lag problems usr << "\red Speech is currently admin-disabled." return + + if (client) + if (istype(src, /mob/dead/observer)) + if (client.handle_spam_prevention(message, MUTE_DEADCHAT, 0)) + return + else + if (client.handle_spam_prevention(message, MUTE_IC, 0)) + return + //Let's try to make users fix their errors - we try to detect single, out-of-place letters and 'unintended' words /* var/first_letter = copytext(message,1,2) @@ -37,6 +46,14 @@ usr << "\red Speech is currently admin-disabled." return + if (client) + if (istype(src, /mob/dead/observer)) + if (client.handle_spam_prevention(message, MUTE_DEADCHAT, 0)) + return + else + if (client.handle_spam_prevention(message, MUTE_IC, 0)) + return + message = strip_html_properly(message) //We do not have typing indicator code yet - Waiting for the okay from Skull before considering adding - Jamini // set_typing_indicator(0) diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 39f63f81..d603e9de 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -228,36 +228,53 @@ /datum/organ/internal/machine removed_type = /obj/item/organ/machine + robotic = 2 /datum/organ/internal/machine/process() return +/obj/item/organ/machine + robotic = 2 + /datum/organ/internal/machine/radiator name = "internal cooling unit" parent_organ = "chest" - robotic = 2 min_bruised_damage = 15 min_broken_damage = 40 removed_type = /obj/item/organ/machine/radiator + var/seized = 0 + +/datum/organ/internal/machine/radiator/process() + if (seized && owner.internal_organs_by_name["diagnosis_unit"]) + var/datum/organ/internal/machine/diagnosis_unit/diagnosis_unit = owner.internal_organs_by_name["diagnosis_unit"] + seized = diagnosis_unit.overload + +/datum/organ/internal/machine/radiator/is_broken() + if (seized) + return 1 + + ..() /obj/item/organ/machine/radiator name = "internal cooling unit" icon_state = "radiator" organ_tag = "radiator" organ_type = /datum/organ/internal/machine/radiator - robotic = 2 /obj/item/organ/machine/radiator/exposed_to_the_world() var/obj/item/robot_parts/robot_component/radiator/Radiator = new(src.loc) if(organ_data.damage) Radiator.brute = organ_data.damage + if (organ_data) + var/datum/organ/internal/machine/radiator/old_radiator = organ_data + if (old_radiator.seized) + Radiator.desc += "It looks seized." del(src) return Radiator /datum/organ/internal/machine/bladder name = "chemical containment" parent_organ = "groin" - robotic = 2 removed_type = /obj/item/organ/machine/bladder /datum/organ/internal/machine/bladder/process() @@ -290,7 +307,6 @@ icon_state = "bladder" organ_tag = "chemical containment" organ_type = /datum/organ/internal/machine/bladder - robotic = 2 /obj/item/organ/machine/bladder/replaced(var/mob/living/carbon/human/target) if(istype(target) && (target.species.flags & IS_SYNTHETIC)) @@ -318,15 +334,25 @@ /datum/organ/internal/machine/diagnosis_unit name = "diagnosis unit" parent_organ = "head" - robotic = 2 removed_type = /obj/item/organ/machine/diagnosis_unit + var/overload = 0 + +/datum/organ/internal/machine/diagnosis_unit/process() + if (!overload) + return + + if (owner.internal_organs_by_name["radiator"]) + var/datum/organ/internal/machine/radiator/radiator = owner.internal_organs_by_name["radiator"] + radiator.seized = 1 + + var/list/pain_messages = list("ERROR: damage detected!", "System failure detected!", "Runtime errors present! System failure imminent!", "Software integrity compromised!", "Hardware malfunction detected!") + owner.custom_pain(pick(pain_messages), 1, 1) /obj/item/organ/machine/diagnosis_unit name = "diagnosis unit" icon_state = "diagnosis_unit" organ_tag = "diagnosis unit" organ_type = /datum/organ/internal/machine/diagnosis_unit - robotic = 2 /obj/item/organ/machine/diagnosis_unit/exposed_to_the_world() var/obj/item/robot_parts/robot_component/diagnosis_unit/Diagnosis_unit = new(src.loc) @@ -348,6 +374,30 @@ del(src) return Eyes +/datum/organ/internal/machine/ipc_tag + name = "IPC tag" + parent_organ = "head" + removed_type = /obj/item/organ/machine/ipc_tag + +/obj/item/organ/machine/ipc_tag + name = "IPC tag" + organ_tag = "ipc tag" + organ_type = /datum/organ/internal/machine/ipc_tag + +/obj/item/organ/machine/ipc_tag/removed(var/mob/living/carbon/human/target, var/mob/living/user) + ..() + + if (istype(target) && target.internal_organs_by_name["diagnosis unit"]) + var/datum/organ/internal/machine/diagnosis_unit/diagnosis_unit = target.internal_organs_by_name["diagnosis unit"] + diagnosis_unit.overload = 1 + +/obj/item/organ/machine/ipc_tag/exposed_to_the_world() + var/obj/item/robot_parts/robot_component/ipc_tag/tag = new(src.loc) + if (organ_data.damage) + tag.brute = organ_data.damage + del(src) + return tag + /obj/item/organ/vaurca/neuralsocket name = "neural socket" organ_tag = "neural socket" @@ -371,5 +421,6 @@ organ_tag = "tracheae" icon = 'icons/mob/alien_organs.dmi' icon_state = "tracheae" + /obj/item/organ/vaurca/tracheae/removed() return diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 49cc2073..2639c1f2 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -53,10 +53,10 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 // message is the custom message to be displayed // flash_strength is 0 for weak pain flash, 1 for strong pain flash -mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) +mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength, var/override_no_pain = 0) if(stat >= 1) return - if(species && species.flags & NO_PAIN) return + if(species && species.flags & NO_PAIN && !override_no_pain) return if(reagents.has_reagent("tramadol")) return @@ -72,7 +72,7 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time))) last_pain_message = msg src << msg - next_pain_time = world.time + 100 + next_pain_time = world.time + 200 mob/living/carbon/human/proc/handle_pain() // not when sleeping @@ -127,4 +127,4 @@ mob/living/carbon/human/proc/handle_pain() toxDamageMessage = "Your body aches all over, it's driving you mad." if(toxDamageMessage && prob(toxMessageProb)) - src.custom_pain(toxDamageMessage, getToxLoss() >= 15) \ No newline at end of file + src.custom_pain(toxDamageMessage, getToxLoss() >= 15) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 53c5dd8b..6d63f462 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2102,11 +2102,14 @@ datum H << "Your mask protects you from the acid." return - if(H.glasses) //Doesn't protect you from the acid but can melt anyways! + if(H.glasses) //Doesn't protect you from the acid but can melt anyways, unless SCIENCE! if(prob(meltprob) && !H.glasses.unacidable) H << "Your glasses melts away!" del (H.glasses) H.update_inv_glasses(0) + else + H << "Your glasses protect you from the acid!" + return else if(ismonkey(M)) var/mob/living/carbon/monkey/MK = M diff --git a/code/world.dm b/code/world.dm index 7046c23a..f4db2e53 100644 --- a/code/world.dm +++ b/code/world.dm @@ -22,7 +22,6 @@ world.log << "Your server's byond version does not meet the recommended requirements for this server. Please update BYOND" load_configuration() - load_visibility() if(config && config.server_name != null && config.server_suffix && world.port > 0) // dumb and hardcoded but I don't care~ @@ -254,24 +253,28 @@ var/master_server_password fdel(F) F << the_mode -/world/proc/load_visibility() - var/list/Lines = file2list("data/hubsetting.txt") - if (Lines.len) - if (Lines[1] && Lines[2]) - log_misc("Saved visibility is: [Lines[1]]; saved override is: [Lines[2]].") - if (text2num(Lines[2]) == 1) - visibility = text2num(Lines[1]) - else - if (time2text(realtime, "Day") == ("Saturday" || "Sunday")) - visibility = 0 - else - visibility = 1 - save_visibility(visibility, 0) +/hook/startup/proc/loadVisibility() + world.load_visibility() + return 1 -/world/proc/save_visibility(var/the_visibility, var/override = 0) +/world/proc/load_visibility() + var/list/saved_settings = file2list("data/hubsetting.txt") + var/list/invisible_days = list("Saturday", "Sunday") + if (saved_settings.len == 2) + log_misc("Saved visibility is: [saved_settings[1]]; saved override is: [saved_settings[2]].") + if (text2num(saved_settings[2]) == 1) + world.visibility = text2num(saved_settings[1]) + else + if (time2text(realtime, "Day") in invisible_days) + world.visibility = 0 + else + world.visibility = 1 + save_visibility(world.visibility, 0) + +/world/proc/save_visibility(var/visibility, var/override = 0) var/F = file("data/hubsetting.txt") fdel(F) - F << the_visibility + F << visibility F << override /hook/startup/proc/loadMOTD() @@ -442,4 +445,4 @@ var/world_timeofday_at_start hook/startup/proc/store_timeofday_at_start() world_timeofday_at_start = world.timeofday - return 1 \ No newline at end of file + return 1 diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 09e506cd..7550f0d8 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index b45ee521..b273a95e 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 01272c27..049a8632 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index 99ee56a1..4faba02d 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index bc0eafe0..27a5a780 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index a492b871..3f572820 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 5ebfbfd2..54e404f2 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index b4b3c859..6733bf5f 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index 74c29181..aec2d4bc 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index a016a3e6..7acd652b 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 7ec194b3..da780455 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi index 83547faf..9014597d 100644 Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi index eedbbf78..459bb4db 100644 Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi index 0de513c2..98345d20 100644 Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi index 7af157fd..6607276d 100644 Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi index 7f541867..9a59b4db 100644 Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi index 095313ee..a8309742 100644 Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 101915d6..ce2e3e3f 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index acb819e2..70e252fa 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -1157,7 +1157,7 @@ "awm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/cell_block) "awn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/cell_block) "awo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (NORTH)"; icon_state = "map-scrubbers"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/cell_block) -"awp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Lockup"; req_access_txt = "2;4;66"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/cell_block) +"awp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Lockup"; req_access_txt = "0"; req_one_access_txt = "2;4;66"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/cell_block) "awq" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/security/brig) "awr" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (EAST)"; icon_state = "map-scrubbers"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/security/brig) "aws" = (/turf/simulated/wall/r_wall,/area/security/warden) @@ -13559,4 +13559,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/scripts/discordbot_message.py b/scripts/discordbot_message.py new file mode 100644 index 00000000..cc819ad3 --- /dev/null +++ b/scripts/discordbot_message.py @@ -0,0 +1,34 @@ +import discord +import sys + +client = discord.Client() + +def run_bot(): + global invite + global message + global client + + login = sys.argv[1] + password = sys.argv[2] + invite_url = sys.argv[3] + + message = sys.argv[4] + if len(sys.argv) > 5: + for in_data in sys.argv[5:]: + message += " " + in_data + + client.login(login, password) + invite = client.get_invite(invite_url) + + client.run() + +@client.event +def on_ready(): + client.accept_invite(invite) + client.send_message(invite.channel, message) + + client.logout() + sys.exit() + +if __name__ == "__main__" and len(sys.argv) > 3: + run_bot()