diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm
index 20fa1eb49d..b9db3915d0 100644
--- a/code/__HELPERS/text_vr.dm
+++ b/code/__HELPERS/text_vr.dm
@@ -18,7 +18,7 @@ proc/TextPreview(var/string,var/len=40)
return "[copytext(string, 1, 37)]..."
var/list/mentor_log = list ( )
-var/list/admintickets = list()
+//var/list/admintickets = list()
var/global/list/whitelisted_species_list[0]
/proc/log_mentor(text)
mentor_log.Add(text)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index cfb4c5e5e7..3e38526ebc 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -24,10 +24,6 @@ var/list/admin_verbs_default = list(
/client/proc/stop_sounds
)
var/list/admin_verbs_admin = list(
- /client/proc/resolvehandlingahelp,
- /client/proc/listhandlingahelp,
- /datum/adminticket/proc/listunresolvedtickets,
- /datum/adminticket/proc/listtickets,
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
@@ -738,7 +734,6 @@ var/list/admin_verbs_hideable = list(
testing("Spawned test mob at [tile.x],[tile.y],[tile.z]")
while (!area && --j > 0)
-
/client/proc/toggle_AI_interact()
set name = "Toggle Admin AI Interact"
set category = "Admin"
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 68f0ea15bc..f9e2f792a2 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -91,48 +91,24 @@
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
-
- var/datum/adminticket/ticket
- var/ref_client = "\ref[src]"
- for(var/I in admintickets)
- var/datum/adminticket/T = I
- if(T.permckey == src.ckey && T.resolved == TICKET_UNRESOLVED)
- if(alert(usr,"You already have an adminhelp open, would you like to bump it?", "Bump Adminhelp", "Yes", "No") == "Yes")
- T.ticket_logs += "[src.ckey] has bumped this adminhelp!"
- if(T.admin == TICKET_UNASSIGNED)
- usr << "Due to the fact your Adminhelp had no assigned admin, admins have been pinged."
- message_admins("[src.ckey] has bumped their adminhelp #[T.id], still no assigned admin!")
- msg = "HELP: [key_name(src)] [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (REJT) (IC) (R): [msg]"
- for(var/client/X in admins)
- if(X.prefs.toggles & SOUND_ADMINHELP)
- X << 'sound/effects/adminhelp.ogg'
- X << msg
- else
- usr << "Admins have been notified."
- message_admins("[src.ckey] has bumped their adminhelp #[T.id].")
- src.verbs -= /client/verb/adminhelp
- adminhelptimerid = addtimer(CALLBACK(src, .proc/giveadminhelpverb), 1200, TIMER_STOPPABLE) //2 minute cooldown of admin helps
- return
- usr << "Thank you for your patience."
- return
-
- src.verbs -= /client/verb/adminhelp
- adminhelptimerid = addtimer(CALLBACK(src, .proc/giveadminhelpverb), 1200, TIMER_STOPPABLE)
-
//clean the input msg
- if(!msg) return
+ if(!msg)
+ return
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg) return
var/original_msg = msg
+ //remove our adminhelp verb temporarily to prevent spamming of admins.
+ src.verbs -= /client/verb/adminhelp
+ adminhelptimerid = addtimer(CALLBACK(src, .proc/giveadminhelpverb), 1200, TIMER_STOPPABLE) //2 minute cooldown of admin helps
+
msg = keywords_lookup(msg)
if(!mob)
return //this doesn't happen
- createticket(src, msg, src.ckey, mob)
-
- msg = "HELP: [key_name(src)] [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (REJT) (IC) (R): [msg]"
+ var/ref_client = "\ref[src]"
+ msg = "HELP: [key_name(src)] [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (REJT) (IC): [msg]"
//send this msg to all admins
@@ -142,14 +118,13 @@
window_flash(X, ignorepref = TRUE)
X << msg
+
//show it to the person adminhelping too
src << "PM to-Admins: [original_msg]"
//send it to irc if nobody is on and tell us how many were on
var/admin_number_present = send2irc_adminless_only(ckey,original_msg)
- send2irc(ckey,original_msg)
-
- log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins who have +BAN.")
+ log_admin_private("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins who have +BAN.")
if(admin_number_present <= 0)
src << "No active admins are online, your adminhelp was sent to the admin irc."
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -185,6 +160,7 @@
send2irc(source,final)
send2otherserver(source,final)
+
/proc/send2irc(msg,msg2)
if(config.useircbot)
shell("python nudge.py [msg] [msg2]")
@@ -201,6 +177,7 @@
world.Export("[global.cross_address]?[list2params(message)]")
+
/proc/ircadminwho()
var/list/message = list("Admins: ")
var/list/admin_keys = list()
@@ -214,4 +191,4 @@
else
message += "[admin]"
- return jointext(message, "")
\ No newline at end of file
+ return jointext(message, "")
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 1f8cc73a2a..81f160769f 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -1,4 +1,6 @@
#define IRCREPLYCOUNT 2
+
+
//allows right clicking mobs to send an admin PM to their client, forwards the selected mob's client to cmd_admin_pm
/client/proc/cmd_admin_pm_context(mob/M in mob_list)
set category = null
@@ -48,45 +50,11 @@
if(holder)
src << "Error: Admin-PM: Client not found."
return
-
- var/datum/adminticket/ticket
-
- for(var/I in admintickets)
- var/datum/adminticket/T = I
-
- if(T.active == TICKET_INACTIVE && T.replying == TICKET_UNREPLIED)
- message_admins("[key_name_admin(src)] has been assigned to [key_name(C, 0, 0)]'s admin help. This is the first reply. ([T.uID])")
- T.replying = TICKET_REPLIED
- T.user << "[src.ckey] has been assigned to your admin help, please await a reply."
- else if(T.replying == TICKET_REPLIED)
- src << "Error, this ticket is already being replied to!"
- return
- else if(T.admin != TICKET_UNASSIGNED && T.replying == TICKET_UNREPLIED)
- if(T.admin != src.ckey)
- if(alert(src, "This adminhelp already has an admin assigned: [T.admin]! Are you sure you want to take it over?", "Conflict", "Yes", "No") == "Yes")
- message_admins("[key_name_admin(src)] has been assigned to [key_name(C, 0, 0)]'s admin help. Override: [T.admin]. ([T.uID])")
- T.user << "[src.ckey] has been assigned to your admin help, please await a reply."
- T.replying = TICKET_REPLIED
- else
- message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help. They did not have an active ahelp.")
-
+ message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
-
if (!msg)
- if(ticket)
- if(ticket.admin != src.ckey)
- message_admins("[key_name_admin(src)] has been unassigned from [key_name(C, 0, 0)]'s admin help. Cancelled reply. ([ticket.uID])")
- ticket.user << "[src.ckey] has been unassigned from your admin help. (reply cancelled)"
- ticket.replying = TICKET_UNREPLIED
- else
- message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help. No active ahelp.")
+ message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
return
-
- if(ticket)
- ticket.replying = TICKET_UNREPLIED
- ticket.admin = src.ckey
- ticket.active = TICKET_ACTIVE
-
cmd_admin_pm(whom, msg)
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
@@ -97,126 +65,130 @@
return
var/client/C
+ var/irc = 0
if(istext(whom))
if(cmptext(copytext(whom,1,2),"@"))
whom = findStealthKey(whom)
- C = directory[whom]
+ if(whom == "IRCKEY")
+ irc = 1
+ else
+ C = directory[whom]
else if(istype(whom,/client))
C = whom
- if(!C)
- if(holder) src << "Error: Admin-PM: Client not found."
- else adminhelp(msg) //admin we are replying to left. adminhelp instead
- return
-
- //get message text, limit it's length.and clean/escape html
- if(!msg)
- msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
+ if(irc)
+ if(!ircreplyamount) //to prevent people from spamming irc
+ return
+ if(!msg)
+ msg = input(src,"Message:", "Private message to Administrator") as text|null
if(!msg)
return
- if(!C)
- if(holder) src << "Error: Admin-PM: Client not found."
- else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
+ if(holder)
+ src << "Error: Use the admin IRC channel, nerd."
return
+
+ else
+ if(!C)
+ if(holder)
+ src << "Error: Admin-PM: Client not found."
+ else
+ adminhelp(msg) //admin we are replying to left. adminhelp instead
+ return
+
+ //get message text, limit it's length.and clean/escape html
+ if(!msg)
+ msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
+
+ if(!msg)
+ return
+
+ if(prefs.muted & MUTE_ADMINHELP)
+ src << "Error: Admin-PM: You are unable to use admin PM-s (muted)."
+ return
+
+ if(!C)
+ if(holder)
+ src << "Error: Admin-PM: Client not found."
+ else
+ adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
+ return
+
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the message if it's not sent by a high-rank admin
- if(!check_rights(R_SERVER|R_DEBUG,0))
+ if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg)
return
- msg = emoji_parse(msg)
- var/keywordparsedmsg = keywords_lookup(msg)
- var/datum/adminticket/ticket
+ var/rawmsg = msg
- if(C.holder)
- if(holder) //both are admins
- for(var/I in admintickets)
- var/datum/adminticket/T = I
- if(T.permckey == src.ckey && T.resolved == TICKET_UNRESOLVED)
- T.ticket_logs += "[src] TO [C]: [msg] "
- ticket = T
- break
- else if(T.permckey == src.ckey)
- ticket = T
- break
- if(ticket && ticket.resolved == TICKET_UNRESOLVED)
- C << "Admin PM from-[key_name(src, C, 1)]: [keywordparsedmsg] (R)"
- src << "Admin PM to-[key_name(C, src, 1)]: [keywordparsedmsg] (R)"
- else
+ if(holder)
+ msg = emoji_parse(msg)
+
+ var/keywordparsedmsg = keywords_lookup(msg)
+
+ if(irc)
+ src << "PM to-Admins: [rawmsg]"
+ ircreplyamount--
+ send2irc("Reply: [ckey]",rawmsg)
+ else
+ if(C.holder)
+ if(holder) //both are admins
C << "Admin PM from-[key_name(src, C, 1)]: [keywordparsedmsg]"
src << "Admin PM to-[key_name(C, src, 1)]: [keywordparsedmsg]"
- else //recipient is an admin but sender is not
- for(var/I in admintickets)
- var/datum/adminticket/T = I
- if(T.permckey == src.ckey && T.resolved == TICKET_UNRESOLVED)
- T.ticket_logs += "[src] TO [C]: [msg] "
- ticket = T
- break
- else if(T.permckey == src.ckey)
- ticket = T
- break
- if(ticket && ticket.resolved == TICKET_UNRESOLVED)
- C << "Reply PM from-[key_name(src, C, 1)]: [keywordparsedmsg] (R)"
- else
+
+ else //recipient is an admin but sender is not
C << "Reply PM from-[key_name(src, C, 1)]: [keywordparsedmsg]"
- src << "PM to-Admins: [msg]"
+ src << "PM to-Admins: [msg]"
- //play the recieving admin the adminhelp sound (if they have them enabled)
- if(C.prefs.toggles & SOUND_ADMINHELP)
- C << 'sound/effects/adminhelp.ogg'
+ //play the recieving admin the adminhelp sound (if they have them enabled)
+ if(C.prefs.toggles & SOUND_ADMINHELP)
+ C << 'sound/effects/adminhelp.ogg'
- else
- if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
- for(var/I in admintickets)
- var/datum/adminticket/T = I
- if(T.permckey == C.ckey && T.resolved == TICKET_UNRESOLVED)
- T.ticket_logs += "[src] TO [C]: [msg] "
- ticket = T
- break
- else if(T.permckey == C.ckey)
- ticket = T
- break
- C << "-- Administrator private message --"
- C << "Admin PM from-[key_name(src, C, 0)]: [msg]"
- C << "Click on the administrator's name to reply."
- if(ticket && ticket.resolved == TICKET_UNRESOLVED)
- src << "Admin PM to-[key_name(C, src, 1)]: [msg] (R)"
- else
+ else
+ if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
+ C << "-- Administrator private message --"
+ C << "Admin PM from-[key_name(src, C, 0)]: [msg]"
+ C << "Click on the administrator's name to reply."
src << "Admin PM to-[key_name(C, src, 1)]: [msg]"
- //always play non-admin recipients the adminhelp sound
- C << 'sound/effects/adminhelp.ogg'
- //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
- if(config.popup_admin_pm)
- spawn() //so we don't hold the caller proc up
- var/sender = src
- var/sendername = key
- var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
- if(C && reply)
- if(sender)
- C.cmd_admin_pm(sender,reply)
- for(var/I in admintickets)
- var/datum/adminticket/T = I
- if(T.permckey == C.ckey && T.resolved == TICKET_UNRESOLVED)
- T.ticket_logs += "[sendername] TO [C]: [msg] " //sender is still about, let's reply to them
- else
- adminhelp(reply) //sender has left, adminhelp instead
- return
+ //always play non-admin recipients the adminhelp sound
+ C << 'sound/effects/adminhelp.ogg'
+
+ //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
+ if(config.popup_admin_pm)
+ spawn() //so we don't hold the caller proc up
+ var/sender = src
+ var/sendername = key
+ var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
+ if(C && reply)
+ if(sender)
+ C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
+ else
+ adminhelp(reply) //sender has left, adminhelp instead
+ return
+
+ else //neither are admins
+ src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."
+ return
+
+ if(irc)
+ log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]")
+ for(var/client/X in admins)
+ X << "PM: [key_name(src, X, 0)]->IRC: \blue [keywordparsedmsg]" //inform X
+ else
+ window_flash(C, ignorepref = TRUE)
+ log_admin_private("PM: [key_name(src)]->[key_name(C)]: [rawmsg]")
+ //we don't use message_admins here because the sender/receiver might get it too
+ for(var/client/X in admins)
+ if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient
+ X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [keywordparsedmsg]" //inform X
- else //neither are admins
- src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."
- return
- log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
- //we don't use message_admins here because the sender/receiver might get it too
- for(var/client/X in admins)
- if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient
- X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [keywordparsedmsg]" //inform X
/proc/IrcPm(target,msg,sender)
@@ -236,7 +208,7 @@
return "No message"
message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]")
- log_admin("IRC PM: [sender] -> [key_name(C)] : [msg]")
+ log_admin_private("IRC PM: [sender] -> [key_name(C)] : [msg]")
msg = emoji_parse(msg)
C << "-- Administrator private message --"
@@ -250,6 +222,8 @@
return "Message Successful"
+
+
/proc/GenIrcStealthKey()
var/num = (rand(0,1000))
var/i = 0
@@ -263,4 +237,4 @@
stealthminID["IRCKEY"] = stealth
return stealth
-#undef IRCREPLYCOUNT
\ No newline at end of file
+#undef IRCREPLYCOUNT
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index c0e603e977..6ae9ae4c4b 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -197,10 +197,10 @@ var/next_external_rsc = 0
verbs += /client/proc/cmd_mentor_say
verbs += /client/proc/show_mentor_memo
mentors += src
-
+ /*
if(check_rights(R_ADMIN))
if(ahelp_count(0) > 0)
- list_ahelps(src, 0)
+ list_ahelps(src, 0)*/
//preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum)
prefs = preferences_datums[ckey]
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
deleted file mode 100644
index 0c0bfb227d..0000000000
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ /dev/null
@@ -1,81 +0,0 @@
-/obj/item/weapon/gun/energy/gun
- name = "energy gun"
- desc = "A basic hybrid energy gun with two settings: disable and kill."
- icon_state = "energy"
- item_state = null //so the human update icon uses the icon_state instead.
- ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
- origin_tech = "combat=4;magnets=3"
- modifystate = 2
- can_flashlight = 1
- ammo_x_offset = 3
- flight_x_offset = 15
- flight_y_offset = 10
-
-/obj/item/weapon/gun/energy/gun/mini
- name = "miniature energy gun"
- desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: stun and kill."
- icon_state = "mini"
- item_state = "gun"
- w_class = 2
- cell_type = /obj/item/weapon/stock_parts/cell{charge = 600; maxcharge = 600}
- ammo_x_offset = 2
- charge_sections = 3
- can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
-
-/obj/item/weapon/gun/energy/gun/mini/New()
- F = new /obj/item/device/flashlight/seclite(src)
- ..()
-
-/obj/item/weapon/gun/energy/gun/mini/update_icon()
- ..()
- if(F && F.on)
- add_overlay("mini-light")
-
-/obj/item/weapon/gun/energy/gun/hos
- name = "\improper X-01 MultiPhase Energy Gun"
- desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
- icon_state = "hoslaser"
- origin_tech = null
- force = 10
- ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
- ammo_x_offset = 4
-
-/obj/item/weapon/gun/energy/gun/dragnet
- name = "\improper DRAGnet"
- desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
- icon_state = "dragnet"
- origin_tech = "combat=4;magnets=3;bluespace=4"
- ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
- can_flashlight = 0
- ammo_x_offset = 1
-
-/obj/item/weapon/gun/energy/gun/dragnet/snare
- name = "Energy Snare Launcher"
- desc = "Fires an energy snare that slows the target down"
- ammo_type = list(/obj/item/ammo_casing/energy/trap)
-
-/obj/item/weapon/gun/energy/gun/turret
- name = "hybrid turret gun"
- desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
- icon_state = "turretlaser"
- item_state = "turretlaser"
- slot_flags = null
- w_class = 5
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- weapon_weight = WEAPON_MEDIUM
- can_flashlight = 0
- trigger_guard = TRIGGER_GUARD_NONE
- ammo_x_offset = 2
-
-/obj/item/weapon/gun/energy/gun/nuclear
- name = "advanced energy gun"
- desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell."
- icon_state = "nucgun"
- item_state = "nucgun"
- origin_tech = "combat=4;magnets=4;powerstorage=4"
- charge_delay = 5
- pin = null
- can_charge = 0
- ammo_x_offset = 1
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler)
- selfcharge = 1
diff --git a/tgstation.dme b/tgstation.dme
index 3e71a67f8e..6f6e4bf9a6 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -998,7 +998,6 @@
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\fps.dm"
#include "code\modules\admin\verbs\getlogs.dm"
-#include "code\modules\admin\verbs\listahelps.dm"
#include "code\modules\admin\verbs\machine_upgrade.dm"
#include "code\modules\admin\verbs\manipulate_organs.dm"
#include "code\modules\admin\verbs\map_template_loadverb.dm"