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"