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()