diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index f265f39955..2aa6d84cb6 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -131,12 +131,13 @@ SUBSYSTEM_DEF(job)
return department_datums[primary_department]
+/datum/controller/subsystem/job/proc/get_ping_role(var/role)
+ var/datum/job/J = get_job(role)
+ if(J.requestable)
+ return get_primary_department_of_job(J)
+
// Someday it might be good to port code/game/jobs/job_controller.dm to here and clean it up.
-
-
-
-
/datum/controller/subsystem/job/proc/job_debug_message(message)
if(debug_messages)
log_debug("JOB DEBUG: [message]")
\ No newline at end of file
diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm
index 7bfdadca50..8be9393505 100644
--- a/code/game/jobs/job/assistant_vr.dm
+++ b/code/game/jobs/job/assistant_vr.dm
@@ -27,6 +27,7 @@
job_description = "An Intern does whatever is requested of them, often doing so in process of learning \
another job. Though they are part of the crew, they have no real authority."
timeoff_factor = 0 // Interns, noh
+ requestable = FALSE
/datum/alt_title/intern_eng
title = "Apprentice Engineer"
@@ -96,6 +97,7 @@
supervisors = "nobody! You don't work here"
job_description = "A Visitor is just there to visit the place. They have no real authority or responsibility."
timeoff_factor = 0
+ requestable = FALSE
alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler)
/datum/job/assistant/New()
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
index 4fe380e063..8e2a16fec5 100644
--- a/code/game/jobs/job/engineering_vr.dm
+++ b/code/game/jobs/job/engineering_vr.dm
@@ -23,6 +23,9 @@
/datum/alt_title/maintenance_manager
title = "Maintenance Manager"
+/datum/job/chief_engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary")
+
/datum/job/engineer
pto_type = PTO_ENGINEERING
@@ -38,6 +41,9 @@
title = "Engineering Contractor"
title_blurb = "An Engineering Contractor fulfills similar duties to other engineers, but isn't directly employed by NT proper."
+/datum/job/engineer/get_request_reasons()
+ return list("Engine setup", "Construction project", "Repairs necessary")
+
@@ -56,6 +62,9 @@
title = "Disposals Technician"
title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
+/datum/job/atmos/get_request_reasons()
+ return list("Construction project", "Repairs necessary")
+
// YW Alt Titles
/datum/alt_title/station_engineer
title = "Station Engineer"
diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm
index 0f2599b8aa..ac8b6be0b4 100644
--- a/code/game/jobs/job/job_vr.dm
+++ b/code/game/jobs/job/job_vr.dm
@@ -20,6 +20,8 @@
//Do we forbid ourselves from earning PTO?
var/playtime_only = FALSE
+ var/requestable = TRUE
+
// Check client-specific availability rules.
/datum/job/proc/player_has_enough_pto(client/C)
return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0)
@@ -58,4 +60,7 @@
if(isnum(C.play_hours[PTO_EXPLORATION]))
remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION])
return remaining_time_needed
- return 0
\ No newline at end of file
+ return 0
+
+/datum/job/proc/get_request_reasons()
+ return list()
\ No newline at end of file
diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm
index 601c616e4f..0cf24400bb 100644
--- a/code/game/jobs/job/medical_vr.dm
+++ b/code/game/jobs/job/medical_vr.dm
@@ -21,6 +21,9 @@
/datum/alt_title/healthcare_manager
title = "Healthcare Manager"
+/datum/job/cmo/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak")
+
/datum/job/doctor
spawn_positions = 5
@@ -29,7 +32,6 @@
"Emergency Physician" = /datum/alt_title/emergency_physician, "Nurse" = /datum/alt_title/nurse, "Orderly" = /datum/alt_title/orderly,
"Virologist" = /datum/alt_title/virologist, "Medical Contractor" = /datum/alt_title/medical_contractor)
-
/datum/alt_title/physician
title = "Physician"
@@ -46,6 +48,9 @@
title = "Medical Contractor"
title_blurb = "A Medical Contractor can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper."
+/datum/job/doctor/get_request_reasons()
+ return list("Surgery pending", "Viral outbreak")
+
/datum/job/chemist
pto_type = PTO_MEDICAL
diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm
index 94f1468b6a..2ab3925c31 100644
--- a/code/game/jobs/job/security_vr.dm
+++ b/code/game/jobs/job/security_vr.dm
@@ -16,6 +16,9 @@
/datum/alt_title/security_manager
title = "Security Manager"
+/datum/job/hos/get_request_reasons()
+ return list("Wildlife management", "Forensic investigation")
+
/datum/job/warden
pto_type = PTO_SECURITY
@@ -28,6 +31,9 @@
/datum/alt_title/armory_superintendent
title = "Armory Superintendent"
+/datum/job/warden/get_request_reasons()
+ return list("Wildlife management")
+
/datum/job/detective
pto_type = PTO_SECURITY
@@ -39,6 +45,9 @@
/datum/alt_title/security_inspector
title = "Security Inspector"
+/datum/job/detective/get_request_reasons()
+ return list("Forensic investigation")
+
/datum/job/officer
total_positions = 5
@@ -57,4 +66,7 @@
title = "Security Deputy"
/datum/alt_title/security_contractor
- title = "Security Contractor"
\ No newline at end of file
+ title = "Security Contractor"
+
+/datum/job/officer/get_request_reasons()
+ return list("Wildlife management")
\ No newline at end of file
diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm
index fff0c70ec4..06416527e2 100644
--- a/code/game/jobs/job/special_vr.dm
+++ b/code/game/jobs/job/special_vr.dm
@@ -76,6 +76,7 @@
job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!"
whitelist_only = 1
latejoin_only = 0
+ requestable = FALSE
outfit_type = /decl/hierarchy/outfit/job/clown
pto_type = PTO_CIVILIAN
alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool)
@@ -107,6 +108,7 @@
alt_titles = list("Poseur" = /datum/alt_title/poseur)
whitelist_only = 1
latejoin_only = 0
+ requestable = FALSE
outfit_type = /decl/hierarchy/outfit/job/mime
pto_type = PTO_CIVILIAN
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 03caecae80..4f956ab8fa 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -186,6 +186,7 @@
GLOB.directory[ckey] = src
GLOB.ahelp_tickets.ClientLogin(src)
+ GLOB.mhelp_tickets.ClientLogin(src)
//Admin Authorisation
holder = admin_datums[ckey]
@@ -278,6 +279,7 @@
mentorholder.owner = null
GLOB.mentors -= src
GLOB.ahelp_tickets.ClientLogout(src)
+ GLOB.mhelp_tickets.ClientLogout(src)
GLOB.directory -= ckey
GLOB.clients -= src
return ..()
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
index 27858d0bd3..cdea0fc339 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
@@ -91,7 +91,7 @@
/datum/gear/uniform/pants/New()
..()
var/list/pants = list()
- for(var/obj/item/clothing/under/pants/pant_type as anything in typesof(/obj/item/clothing/under/pants))
+ for(var/obj/item/clothing/under/pants/pant_type as anything in (typesof(/obj/item/clothing/under/pants) - typesof(/obj/item/clothing/under/pants/altevian)))
pants[initial(pant_type.name)] = pant_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pants))
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
index 08c667e780..809add95e0 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
@@ -36,7 +36,7 @@
/datum/gear/uniform/job_khi/med
display_name = "khi uniform, med"
path = /obj/item/clothing/under/rank/khi/med
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic","Psychiatrist")
/datum/gear/uniform/job_khi/eng
display_name = "khi uniform, eng"
@@ -280,3 +280,38 @@ Talon jumpsuit
display_name = "undersuit, command (SM/HoP)"
allowed_roles = list("Site Manager", "Head of Personnel")
path = /obj/item/clothing/under/undersuit/command
+
+//Altevian Uniforms
+/datum/gear/uniform/job_altevian/cmd
+ display_name = "altevian uniform, cmd"
+ path = /obj/item/clothing/under/pants/altevian/command
+ allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer")
+
+/datum/gear/uniform/job_altevian/sec
+ display_name = "altevian uniform, sec"
+ path = /obj/item/clothing/under/pants/altevian/security
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
+
+/datum/gear/uniform/job_altevian/med
+ display_name = "altevian uniform, med"
+ path = /obj/item/clothing/under/pants/altevian/medical
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Field Medic","Psychiatrist")
+
+/datum/gear/uniform/job_altevian/eng
+ display_name = "altevian uniform, eng"
+ path = /obj/item/clothing/under/pants/altevian/engineering
+ allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer")
+
+/datum/gear/uniform/job_altevian/sci
+ display_name = "altevian uniform, sci"
+ path = /obj/item/clothing/under/pants/altevian/science
+ allowed_roles = list("Research Director", "Scientist", "Roboticist", "Xenobiologist", "Xenobotanist")
+
+/datum/gear/uniform/job_altevian/crg
+ display_name = "altevian uniform, cargo"
+ path = /obj/item/clothing/under/pants/altevian/cargo
+ allowed_roles = list("Quartermaster", "Cargo Technician", "Shaft Miner")
+
+/datum/gear/uniform/job_altevian/civ
+ display_name = "altevian uniform, civ"
+ path = /obj/item/clothing/under/pants/altevian
diff --git a/code/modules/clothing/under/accessories/altevian_vr.dm b/code/modules/clothing/under/accessories/altevian_vr.dm
new file mode 100644
index 0000000000..ec3322d185
--- /dev/null
+++ b/code/modules/clothing/under/accessories/altevian_vr.dm
@@ -0,0 +1,78 @@
+/obj/item/clothing/accessory/jacket/altevian
+ name = "Altevian Hegemony Civilian Jacket"
+ desc = "A form fitting jacket that looks more for fashion than for work with it leaving ones mid-riff exposed to the outside elements, but when looking so good it isn't really ones worry by that point! "
+ icon = 'icons/inventory/accessory/item_vr.dmi'
+ icon_override = 'icons/inventory/accessory/mob_vr.dmi'
+ icon_state = "altevian-jacket-civ"
+ item_state = "altevian-jacket-civ"
+ overlay_state = "altevian-jacket-civ"
+
+/obj/item/clothing/accessory/jacket/altevian/command
+ name = "Altevian Hegemony Command Jacket"
+ icon_state = "altevian-jacket-com"
+ item_state = "altevian-jacket-com"
+ overlay_state = "altevian-jacket-com"
+
+/obj/item/clothing/accessory/jacket/altevian/security
+ name = "Altevian Hegemony Security Jacket"
+ icon_state = "altevian-jacket-sec"
+ item_state = "altevian-jacket-sec"
+ overlay_state = "altevian-jacket-sec"
+
+/obj/item/clothing/accessory/jacket/altevian/medical
+ name = "Altevian Hegemony Command Jacket"
+ icon_state = "altevian-jacket-med"
+ item_state = "altevian-jacket-med"
+ overlay_state = "altevian-jacket-med"
+
+/obj/item/clothing/accessory/jacket/altevian/engineering
+ name = "Altevian Hegemony Engineering Jacket"
+ icon_state = "altevian-jacket-eng"
+ item_state = "altevian-jacket-eng"
+ overlay_state = "altevian-jacket-eng"
+
+/obj/item/clothing/accessory/jacket/altevian/science
+ name = "Altevian Hegemony Science Jacket"
+ icon_state = "altevian-jacket-sci"
+ item_state = "altevian-jacket-sci"
+ overlay_state = "altevian-jacket-sci"
+
+/obj/item/clothing/accessory/jacket/altevian/cargo
+ name = "Altevian Hegemony Cargo Jacket"
+ icon_state = "altevian-jacket-cargo"
+ item_state = "altevian-jacket-cargo"
+ overlay_state = "altevian-jacket-cargo"
+
+
+/obj/item/clothing/accessory/scarf/altevian
+ name = "Blue Comfortable Scarf"
+ desc = "A scarf made of synthetic material that would be common among a people who don't really have the leisure of organic crops for luxury goods. They seemed to of refined this process though and one wouldn't be able to tell the difference between it and ones made normally."
+ icon = 'icons/inventory/accessory/item_vr.dmi'
+ icon_override = 'icons/inventory/accessory/mob_vr.dmi'
+ icon_state = "altevian-scarf-blue"
+ item_state = "altevian-scarf-blue"
+ overlay_state = "altevian-scarf-blue"
+
+/obj/item/clothing/accessory/scarf/altevian/red
+ name = "Red Comfortable Scarf"
+ icon_state = "altevian-scarf-red"
+ item_state = "altevian-scarf-red"
+ overlay_state = "altevian-scarf-red"
+
+/obj/item/clothing/accessory/scarf/altevian/yellow
+ name = "Yellow Comfortable Scarf"
+ icon_state = "altevian-scarf-yellow"
+ item_state = "altevian-scarf-yellow"
+ overlay_state = "altevian-scarf-yellow"
+
+/obj/item/clothing/accessory/scarf/altevian/green
+ name = "Green Comfortable Scarf"
+ icon_state = "altevian-scarf-green"
+ item_state = "altevian-scarf-green"
+ overlay_state = "altevian-scarf-green"
+
+/obj/item/clothing/accessory/scarf/altevian/purple
+ name = "Purple Comfortable Scarf"
+ icon_state = "altevian-scarf-purple"
+ item_state = "altevian-scarf-purple"
+ overlay_state = "altevian-scarf-purple"
\ No newline at end of file
diff --git a/code/modules/clothing/under/altevian_vr.dm b/code/modules/clothing/under/altevian_vr.dm
new file mode 100644
index 0000000000..51f3bbef3b
--- /dev/null
+++ b/code/modules/clothing/under/altevian_vr.dm
@@ -0,0 +1,46 @@
+/obj/item/clothing/under/pants/altevian
+ name = "Altevian Hegemony Civilian Pants"
+ desc = "An extremely comfortable set of clothing that's made to help people handle their day to day work around the fleets with little to no discomfort."
+ icon = 'icons/inventory/uniform/item_vr.dmi'
+ icon_override = 'icons/inventory/uniform/mob_vr.dmi'
+ icon_state = "altevian-pants-civ"
+ worn_state = "altevian-pants-civ"
+ gender = PLURAL
+ body_parts_covered = LOWER_TORSO|LEGS
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian)
+
+/obj/item/clothing/under/pants/altevian/command
+ name = "Altevian Hegemony Command Pants"
+ icon_state = "altevian-pants-com"
+ worn_state = "altevian-pants-com"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/command)
+
+/obj/item/clothing/under/pants/altevian/security
+ name = "Altevian Hegemony Security Pants"
+ icon_state = "altevian-pants-sec"
+ worn_state = "altevian-pants-sec"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/security)
+
+/obj/item/clothing/under/pants/altevian/engineering
+ name = "Altevian Hegemony Engineering Pants"
+ icon_state = "altevian-pants-eng"
+ worn_state = "altevian-pants-eng"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/engineering)
+
+/obj/item/clothing/under/pants/altevian/medical
+ name = "Altevian Hegemony Medical Pants"
+ icon_state = "altevian-pants-med"
+ worn_state = "altevian-pants-med"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/medical)
+
+/obj/item/clothing/under/pants/altevian/science
+ name = "Altevian Hegemony Science Pants"
+ icon_state = "altevian-pants-sci"
+ worn_state = "altevian-pants-sci"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/science)
+
+/obj/item/clothing/under/pants/altevian/cargo
+ name = "Altevian Hegemony Cargo Pants"
+ icon_state = "altevian-pants-cargo"
+ worn_state = "altevian-pants-cargo"
+ starting_accessories = list(/obj/item/clothing/accessory/jacket/altevian/cargo)
diff --git a/code/modules/mentor/mentor.dm b/code/modules/mentor/mentor.dm
index f897e1632c..bf3259d61a 100644
--- a/code/modules/mentor/mentor.dm
+++ b/code/modules/mentor/mentor.dm
@@ -107,7 +107,7 @@ var/list/mentor_verbs_default = list(
if(href_list["mhelp"])
var/mhelp_ref = href_list["mhelp"]
var/datum/mentor_help/MH = locate(mhelp_ref)
- if (MH)
+ if (MH && istype(MH, /datum/mentor_help))
MH.Action(href_list["mhelp_action"])
else
to_chat(C, "Ticket [mhelp_ref] has been deleted!")
@@ -168,7 +168,8 @@ var/list/mentor_verbs_default = list(
to_chat(src, "Error: Mentor-PM: You are unable to use admin PM-s (muted).")
return
- if(!(has_mentor_powers(src)) && !current_mentorhelp)
+ //Not a mentor and no open ticket
+ if(!has_mentor_powers(src) && !current_mentorhelp)
to_chat(src, "You can no longer reply to this ticket, please open another one by using the Mentorhelp verb if need be.")
to_chat(src, "Message: [msg]")
return
@@ -181,16 +182,7 @@ var/list/mentor_verbs_default = list(
else if(istype(whom,/client))
recipient = whom
- if(!recipient)
- if(has_mentor_powers(src))
- to_chat(src, "Error: Mentor-PM: Client not found.")
- to_chat(src, msg)
- else
- log_admin("Mentorhelp: [key_name(src)] sent [msg]")
- current_mentorhelp.MessageNoRecipient(msg)
- return
-
- //get message text, limit it's length.and clean/escape html
+ //get message text, limit it's length.and clean/escape html
if(!msg)
msg = tgui_input_text(src,"Message:", "Mentor-PM to [whom]")
@@ -204,11 +196,18 @@ var/list/mentor_verbs_default = list(
if(!recipient)
if(has_mentor_powers(src))
to_chat(src, "Error:Mentor-PM: Client not found.")
+ to_chat(src, msg)
else
- log_admin("Mentorhelp: [key_name(src)] sent [msg]")
+ log_admin("Mentorhelp: [key_name(src)]: [msg]")
current_mentorhelp.MessageNoRecipient(msg)
return
+ //Has mentor powers but the recipient no longer has an open ticket
+ if(has_mentor_powers(src) && !recipient.current_mentorhelp)
+ to_chat(src, "You can no longer reply to this ticket.")
+ to_chat(src, "Message: [msg]")
+ return
+
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
@@ -233,7 +232,7 @@ var/list/mentor_verbs_default = list(
to_chat(recipient, "Mentor-PM from-[src]: [msg]")
to_chat(src, "Mentor-PM to-[recipient]: [msg]")
- log_admin("[key_name(src)] sent [msg] to [key_name(recipient)]")
+ log_admin("[key_name(src)]->[key_name(recipient)]: [msg]")
if(recipient.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping))
recipient << 'sound/effects/mentorhelp.mp3'
diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm
index 1cce0702b1..e5f7ac49d8 100644
--- a/code/modules/mentor/mentorhelp.dm
+++ b/code/modules/mentor/mentorhelp.dm
@@ -143,7 +143,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
name = msg
initiator = C
- initiator_ckey = initiator.ckey
+ initiator_ckey = C.ckey
initiator_key_name = key_name(initiator, FALSE, TRUE)
if(initiator.current_mentorhelp) //This is a bug
log_debug("Ticket erroneously left open by code")
@@ -154,7 +154,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
statclick = new(null, src)
_interactions = list()
- log_admin("Mentorhelp: [key_name(C)] sent [msg]")
+ log_admin("Mentorhelp: [key_name(C)]: [msg]")
MessageNoRecipient(msg)
//show it to the person adminhelping too
to_chat(C, "Mentor-PM to-Mentors: [name]")
@@ -190,7 +190,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
//message from the initiator without a target, all people with mentor powers will see this
/datum/mentor_help/proc/MessageNoRecipient(msg)
var/ref_src = "\ref[src]"
- var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)]: [msg]"
+ var/chat_msg = "(ESCALATE) Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)]: [msg]"
AddInteraction("[LinkedReplyName(ref_src)]: [msg]")
for (var/client/C in GLOB.mentors)
if (C.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping))
@@ -287,11 +287,29 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
usr << browse(dat.Join(), "window=mhelp[id];size=620x480")
+//Kick ticket to admins
+/datum/mentor_help/proc/Escalate()
+ if(tgui_alert(usr, "Really escalate this ticket to admins? No mentors will ever be able to interact with it again if you do.","Escalate",list("Yes","No")) != "Yes")
+ return
+ if (src.initiator == null) // You can't escalate a mentorhelp of someone who's logged out because it won't create the adminhelp properly
+ to_chat(usr, "Error: client not found, unable to escalate.")
+ return
+ var/datum/admin_help/AH = new /datum/admin_help(src.name, src.initiator, FALSE)
+ message_mentors("[usr.ckey] escalated Ticket [TicketHref("#[id]")]")
+ log_admin("[key_name(usr)] escalated mentorhelp [src.name]")
+ to_chat(src.initiator, "[usr.ckey] escalated your mentorhelp to admins.")
+ AH._interactions = src._interactions
+ GLOB.mhelp_tickets.active_tickets -= src
+ GLOB.mhelp_tickets.resolved_tickets -= src
+ qdel(src)
+
/datum/mentor_help/proc/Context(ref_src)
if(!ref_src)
ref_src = "\ref[src]"
if(state == AHELP_ACTIVE)
. += ClosureLinks(ref_src)
+ if(state != AHELP_RESOLVED)
+ . += " (ESCALATE)"
//Forwarded action from admin/Topic OR mentor/Topic depending on which rank the caller has
/datum/mentor_help/proc/Action(action)
@@ -304,6 +322,8 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
Resolve()
if("reopen")
Reopen()
+ if("escalate")
+ Escalate()
//
// TICKET STATCLICK
@@ -357,9 +377,9 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
if(current_mentorhelp)
if(tgui_alert(usr, "You already have a ticket open. Is this for the same issue?","Duplicate?",list("Yes","No")) != "No")
if(current_mentorhelp)
- log_admin("Mentorhelp: [key_name(src)] sent [msg]")
+ log_admin("Mentorhelp: [key_name(src)]: [msg]")
current_mentorhelp.MessageNoRecipient(msg)
- to_chat(usr, "Mentor-PM to-Mentors: [msg]")
+ to_chat(usr, "Mentor-PM to-Mentors: [msg]")
return
else
to_chat(usr, "Ticket not found, creating new one...")
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 2e880f5e4a..0f8b69cb31 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -42,8 +42,8 @@
var/mob/living/carbon/human/H = M
if(H.size_multiplier > L.size_multiplier)
. += 1
- if(H.weight > L.weight)
- . += 1
+ //if(H.weight > L.weight) weight should not have mechanical impact
+ //. += 1
//VOREstation end
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 07098750b8..fd483fdeec 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1931,8 +1931,10 @@
// increase your body temperature beyond 250C, but it's possible something else (atmos) has heated us up beyond it,
// so don't worry about the firestacks at that point. Really, we should be cooling the room down, because it has
// to expend energy to heat our body up! But let's not worry about that.
- if((bodytemperature + fire_temp_add) > HUMAN_COMBUSTION_TEMP)
- return
+
+ // This whole section above is ABSOLUTELY STUPID and makes no sense and this would prevent too-high-heat from even being able to hurt someone. No. We will heat up for as long as needed.
+ //if((bodytemperature + fire_temp_add) > HUMAN_COMBUSTION_TEMP)
+ // return
bodytemperature += fire_temp_add
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index a85af45962..f008f661fd 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1247,7 +1247,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//If you have a custom tail selected
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)))
var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style.can_loaf && resting) ? "[tail_style.icon_state]_loaf" : (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) // VOREStation Edit: Taur Loafing
- pixel_y = (tail_style.can_loaf && resting) ? -tail_style.loaf_offset : 0 //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
+ if(tail_style.can_loaf && !is_shifted)
+ pixel_y = (resting) ? -tail_style.loaf_offset : 0 //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
if(tail_style.do_colouration)
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
if(tail_style.extra_overlay)
diff --git a/code/modules/paperwork/faxmachine_vr.dm b/code/modules/paperwork/faxmachine_vr.dm
index 60b99117d4..f0e5410f50 100644
--- a/code/modules/paperwork/faxmachine_vr.dm
+++ b/code/modules/paperwork/faxmachine_vr.dm
@@ -1,3 +1,5 @@
+var/global/last_fax_role_request
+
/obj/machinery/photocopier/faxmachine
req_one_access = list()
@@ -50,6 +52,20 @@
world.TgsTargetedChatBroadcast("FAX: [sanitize(faxname)] / [sanitize(sent.name)] - SENT BY: [sanitize(sender.name)] - FAXID: **[sanitize(faxid)]**", TRUE)
//YW EDIT END
+/**
+ * Call the chat webhook to transmit a notification of a job request
+ */
+/obj/machinery/photocopier/faxmachine/proc/message_chat_rolerequest(var/font_colour="#006100", var/role_to_ping, var/reason, var/jobname)
+ if(config.chat_webhook_url)
+ spawn(0)
+ var/query_string = "type=rolerequest"
+ query_string += "&key=[url_encode(config.chat_webhook_key)]"
+ query_string += "&ping=[url_encode(role_to_ping)]"
+ query_string += "&color=[url_encode(font_colour)]"
+ query_string += "&reason=[url_encode(reason)]"
+ query_string += "&job=[url_encode(jobname)]"
+ world.Export("[config.chat_webhook_url]?[query_string]")
+
//
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
@@ -58,3 +74,84 @@
var/chat_webhook_url = "" // URL of the webhook for sending announcements/faxes to discord chat.
var/chat_webhook_key = "" // Shared secret for authenticating to the chat webhook
var/fax_export_dir = "data/faxes" // Directory in which to write exported fax HTML files.
+
+
+/obj/machinery/photocopier/faxmachine/verb/request_roles()
+ set name = "Staff Request Form"
+ set category = "Object"
+ set src in oview(1)
+
+ var/mob/living/L = usr
+
+ if(!L || !isturf(L.loc) || !isliving(L))
+ return
+ if(!ishuman(L) && !issilicon(L))
+ return
+ if(L.stat || L.restrained())
+ return
+ if(last_fax_role_request && (world.time - last_fax_role_request < 5 MINUTES))
+ to_chat(L, "The global automated relays are still recalibrating. Try again later or relay your request in written form for processing.")
+ return
+
+ var/confirmation = tgui_alert(L, "Are you sure you want to send automated crew request?", "Confirmation", list("Yes", "No", "Cancel"))
+ if(confirmation != "Yes")
+ return
+
+ var/list/jobs = list()
+ for(var/datum/department/dept as anything in SSjob.get_all_department_datums())
+ if(!dept.assignable || dept.centcom_only)
+ continue
+ for(var/job in SSjob.get_job_titles_in_department(dept.name))
+ var/datum/job/J = SSjob.get_job(job)
+ if(J.requestable)
+ jobs |= job
+
+ var/role = tgui_input_list(L, "Pick the job to request.", "Job Request", jobs)
+ if(!role)
+ return
+
+ var/datum/job/job_to_request = SSjob.get_job(role)
+ var/reason = "Unspecified"
+ var/list/possible_reasons = list("Unspecified", "General duties", "Emergency situation")
+ possible_reasons += job_to_request.get_request_reasons()
+ reason = tgui_input_list(L, "Pick request reason.", "Request reason", possible_reasons)
+
+ var/final_conf = tgui_alert(L, "You are about to request [role]. Are you sure?", "Confirmation", list("Yes", "No", "Cancel"))
+ if(final_conf != "Yes")
+ return
+
+ var/datum/department/ping_dept = SSjob.get_ping_role(role)
+ if(!ping_dept)
+ to_chat(L, "Selected job cannot be requested for \[ERRORDEPTNOTFOUND] reason. Please report this to system administrator.")
+ return
+ var/message_color = "#FFFFFF"
+ var/ping_name = null
+ switch(ping_dept.name)
+ if(DEPARTMENT_COMMAND)
+ ping_name = "Command"
+ if(DEPARTMENT_SECURITY)
+ ping_name = "Security"
+ if(DEPARTMENT_ENGINEERING)
+ ping_name = "Engineering"
+ if(DEPARTMENT_MEDICAL)
+ ping_name = "Medical"
+ if(DEPARTMENT_RESEARCH)
+ ping_name = "Research"
+ if(DEPARTMENT_CARGO)
+ ping_name = "Supply"
+ if(DEPARTMENT_CIVILIAN)
+ ping_name = "Service"
+ if(DEPARTMENT_PLANET)
+ ping_name = "Expedition"
+ if(DEPARTMENT_SYNTHETIC)
+ ping_name = "Silicon"
+ //if(DEPARTMENT_TALON)
+ // ping_name = "Offmap"
+ if(!ping_name)
+ to_chat(L, "Selected job cannot be requested for \[ERRORUNKNOWNDEPT] reason. Please report this to system administrator.")
+ return
+ message_color = ping_dept.color
+
+ message_chat_rolerequest(message_color, ping_name, reason, role)
+ last_fax_role_request = world.time
+ to_chat(L, "Your request was transmitted.")
diff --git a/code/modules/research/designs/medical_vr.dm b/code/modules/research/designs/medical_vr.dm
index 0cb7251e8f..4171f881e9 100644
--- a/code/modules/research/designs/medical_vr.dm
+++ b/code/modules/research/designs/medical_vr.dm
@@ -30,6 +30,15 @@
build_path = /obj/item/weapon/reagent_containers/hypospray/science
sort_string = "KCAVB"
+/datum/design/item/medical/recombobray
+ name = "recombobulation ray"
+ desc = "The Type Gamma Medical Recombobulation ray! A mysterious looking ray gun! It works to change people who have had their form significantly altered back into their original forms!"
+ id = "recombobray"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_POWER = 4, TECH_BIO = 5, TECH_BLUESPACE = 4) //Not like these matter. *Glares at circuit printer.*
+ materials = list(MAT_STEEL = 1000, MAT_GLASS = 2000, MAT_URANIUM = 500, MAT_PHORON = 1500)
+ build_path = /obj/item/weapon/gun/energy/mouseray/medical
+ sort_string = "KCAVC"
+
// ML-3M medigun and cells
/datum/design/item/medical/cell_based/AssembleDesignName()
..()
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index be65e90cda..1512552107 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -814,62 +814,62 @@
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly. '%countprey' will be replaced with the number of living prey in your belly."
switch(params["msgtype"])
if("dmp")
- var/new_message = tgui_input_text(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmp")
if("dmo")
- var/new_message = tgui_input_text(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmo")
if("amp")
- var/new_message = tgui_input_text(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("amp"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("amp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amp")
if("amo")
- var/new_message = tgui_input_text(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("amo"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("amo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amo")
if("uamp")
- var/new_message = tgui_input_text(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("uamp"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("uamp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamp")
if("uamo")
- var/new_message = tgui_input_text(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("uamo"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("uamo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamo")
if("smo")
- var/new_message = tgui_input_text(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smo")
if("smi")
- var/new_message = tgui_input_text(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smi")
if("asmo")
- var/new_message = tgui_input_text(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (outside)",host.vore_selected.get_messages("asmo"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (outside)",host.vore_selected.get_messages("asmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmo")
if("asmi")
- var/new_message = tgui_input_text(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (inside)",host.vore_selected.get_messages("asmi"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (inside)",host.vore_selected.get_messages("asmi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmi")
if("em")
- var/new_message = tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"em")
if("ema")
- var/new_message = tgui_input_text(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"ema")
@@ -882,7 +882,7 @@
if("Clear")
host.nutrition_messages[index] = ""
if("Edit")
- var/new_message = tgui_input_text(user, "Input a message", "Input", host.nutrition_messages[index], multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user, "Input a message", "Input", host.nutrition_messages[index], multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.nutrition_messages[index] = new_message
@@ -895,62 +895,62 @@
if("Clear")
host.weight_messages[index] = ""
if("Edit")
- var/new_message = tgui_input_text(user, "Input a message", "Input", host.weight_messages[index], multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user, "Input a message", "Input", host.weight_messages[index], multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.weight_messages[index] = new_message
if("im_digest")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_digest")
if("im_hold")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_hold")
if("im_holdabsorbed")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_holdabsorbed")
if("im_absorb")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_absorb")
if("im_heal")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_heal")
if("im_drain")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_drain")
if("im_steal")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_steal")
if("im_egg")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_egg")
if("im_shrink")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_shrink")
if("im_grow")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_grow")
if("im_unabsorb")
- var/new_message = tgui_input_text(user,"These are sent to prey every minute when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb"), multiline = TRUE, prevent_enter = TRUE)
+ var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every minute when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_unabsorb")
diff --git a/icons/inventory/accessory/item_vr.dmi b/icons/inventory/accessory/item_vr.dmi
index b1e6a60a0e..91e3c4e7d6 100644
Binary files a/icons/inventory/accessory/item_vr.dmi and b/icons/inventory/accessory/item_vr.dmi differ
diff --git a/icons/inventory/accessory/mob_vr.dmi b/icons/inventory/accessory/mob_vr.dmi
index cab7916a32..a738336ba1 100644
Binary files a/icons/inventory/accessory/mob_vr.dmi and b/icons/inventory/accessory/mob_vr.dmi differ
diff --git a/icons/inventory/head/item_vr_altevian.dmi b/icons/inventory/head/item_vr_altevian.dmi
index 63f3e13437..acedeb864c 100644
Binary files a/icons/inventory/head/item_vr_altevian.dmi and b/icons/inventory/head/item_vr_altevian.dmi differ
diff --git a/icons/inventory/uniform/item_vr.dmi b/icons/inventory/uniform/item_vr.dmi
index 4e92cd6710..305bdc3efb 100644
Binary files a/icons/inventory/uniform/item_vr.dmi and b/icons/inventory/uniform/item_vr.dmi differ
diff --git a/icons/inventory/uniform/mob_vr.dmi b/icons/inventory/uniform/mob_vr.dmi
index e4295298d3..f04df19f3e 100644
Binary files a/icons/inventory/uniform/mob_vr.dmi and b/icons/inventory/uniform/mob_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 3182941b42..97b91edfd2 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2148,6 +2148,7 @@
#include "code\modules\clothing\suits\aliens\teshari_yw.dm"
#include "code\modules\clothing\suits\aliens\unathi.dm"
#include "code\modules\clothing\suits\aliens\vox.dm"
+#include "code\modules\clothing\under\altevian_vr.dm"
#include "code\modules\clothing\under\color.dm"
#include "code\modules\clothing\under\extrauniforms_yw.dm"
#include "code\modules\clothing\under\imperial_vr.dm"
@@ -2164,6 +2165,7 @@
#include "code\modules\clothing\under\accessories\accessory.dm"
#include "code\modules\clothing\under\accessories\accessory_vr.dm"
#include "code\modules\clothing\under\accessories\accessory_yw.dm"
+#include "code\modules\clothing\under\accessories\altevian_vr.dm"
#include "code\modules\clothing\under\accessories\armband.dm"
#include "code\modules\clothing\under\accessories\armor.dm"
#include "code\modules\clothing\under\accessories\badges.dm"