Overhauls and 2/28 sync (#244)

* map tweaks/shuttle engines

* helpers and defines

* global/onclick

* controllers and datums

* mapping

* game folder

* some other stuff

* some modules

* modules that aren't mobs

* some mob stuff

* new player stuff

* mob living

* silicon stuff

* simple animal things

* carbon/ayylmao

* update_icons

* carbon/human

* sounds and tools

* icons and stuff

* hippie grinder changes + tgui

* kitchen.dmi

* compile issues fixed

* mapfix

* Mapfixes 2.0

* mapedit2.0

* mapmerger pls

* Revert "mapedit2.0"

This reverts commit 74139a3cacea10df7aafca06c0a10bd3daf3a481.

* clean up vore folder + 2 hotfixes

* admin ticket refinement

* Blob tweaks and LAZYADD

* LAZYADD IS LAZY

* Magic strings purged

* DEFINES NEED HIGHER PRIORITIES

* Only a sleepless idiot deals in absolute TRUE|FALSE

* u h g

* progress bar fix

* reverts ticket logs

* there's always that one guy

* fixes and stuff

* 2/27 fixes

* game folder stuff

* stats

* some modules again

* clothing stuff

gets vg clothing out of the main files

* everything not mobs again

* mob stuff

* maps, tgui, sql stuff

* icons

* additional fixes and compile errors

* don't need this anymore

* Oh right this isn't needed anymore

* maint bar re-added

* that doesn't need to be here

* stupid events

* wtfeven

* probably makes Travis happy

* don't care to fix the grinder atm

* fixes vending sprites, changes turret

* lethal, not lethals

* overylays are finicky creatures

* lazy fix for bleeding edgy (#252)

* map tweaks/shuttle engines

* helpers and defines

* global/onclick

* controllers and datums

* mapping

* game folder

* some other stuff

* some modules

* modules that aren't mobs

* some mob stuff

* new player stuff

* mob living

* silicon stuff

* simple animal things

* carbon/ayylmao

* update_icons

* carbon/human

* sounds and tools

* icons and stuff

* hippie grinder changes + tgui

* kitchen.dmi

* compile issues fixed

* mapfix

* Mapfixes 2.0

* mapedit2.0

* mapmerger pls

* Revert "mapedit2.0"

This reverts commit 74139a3cacea10df7aafca06c0a10bd3daf3a481.

* clean up vore folder + 2 hotfixes

* admin ticket refinement

* Blob tweaks and LAZYADD

* LAZYADD IS LAZY

* Magic strings purged

* DEFINES NEED HIGHER PRIORITIES

* Only a sleepless idiot deals in absolute TRUE|FALSE

* u h g

* progress bar fix

* reverts ticket logs

* there's always that one guy

* fixes and stuff

* 2/27 fixes

* game folder stuff

* stats

* some modules again

* clothing stuff

gets vg clothing out of the main files

* everything not mobs again

* mob stuff

* maps, tgui, sql stuff

* icons

* additional fixes and compile errors

* don't need this anymore

* Oh right this isn't needed anymore

* maint bar re-added

* that doesn't need to be here

* stupid events

* wtfeven

* probably makes Travis happy

* don't care to fix the grinder atm

* fixes vending sprites, changes turret

* lethal, not lethals

* overylays are finicky creatures
This commit is contained in:
Poojawa
2017-02-28 09:30:49 -06:00
committed by GitHub
parent 93782cf716
commit 0bca862419
544 changed files with 309981 additions and 81206 deletions
+16 -21
View File
@@ -76,7 +76,6 @@
src.verbs |= /client/verb/adminhelp
adminhelptimerid = 0
/client/verb/adminhelp(msg as text)
set category = "Admin"
set name = "Adminhelp"
@@ -92,22 +91,25 @@
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
var/datum/adminticket/ticket
var/ref_client = "\ref[src]"
for(var/datum/adminticket/T in admintickets)
if(T.permckey == src.ckey && T.resolved == "No")
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.logs += "[src.ckey] has bumped this adminhelp!"
if(T.admin == "N/A")
T.ticket_logs += "[src.ckey] has bumped this adminhelp!"
if(T.admin == TICKET_UNASSIGNED)
usr << "<b>Due to the fact your Adminhelp had no assigned admin, admins have been pinged.</b>"
message_admins("[src.ckey] has bumped their adminhelp #[T.ID], still no assigned admin!")
msg = "<span class='adminnotice'><b><font color=red>HELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) (<A HREF='?_src_=holder;icissue=[ref_client]'>IC</A>) (<A HREF='?_src_=ticket;resolve=[T.ID]'>R</a>):</b> [msg]</span>"
message_admins("[src.ckey] has bumped their adminhelp #[T.id], still no assigned admin!")
msg = "<span class='adminnotice'><b><font color='red'>HELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) (<A HREF='?_src_=holder;icissue=[ref_client]'>IC</A>) (<A HREF='?_src_=ticket;resolve=[T.id]'>R</a>):</b> [msg]</span>"
for(var/client/X in admins)
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
else
usr << "<b>Admins have been notified.</b>"
message_admins("[src.ckey] has bumped their adminhelp #[T.ID].")
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
@@ -125,16 +127,11 @@
msg = keywords_lookup(msg)
if(!mob) return //this doesn't happen
if(!mob)
return //this doesn't happen
createticket(src, msg, src.ckey, mob)
var/datum/adminticket/ticket
for(var/datum/adminticket/T in admintickets)
if(T.permckey == src.ckey)
ticket = T
msg = "<span class='adminnotice'><b><font color=red>HELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) (<A HREF='?_src_=holder;icissue=[ref_client]'>IC</A>) (<A HREF='?_src_=holder;resolve=[ticket]'>R</a>):</b> [msg]</span>"
//send this msg to all admins
@@ -142,22 +139,22 @@
for(var/client/X in admins)
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
window_flash(X)
window_flash(X, ignorepref = TRUE)
X << msg
//show it to the person adminhelping too
src << "<span class='adminnotice'>PM to-<b>Admins</b>: [original_msg]</span>"
//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.")
if(admin_number_present <= 0)
src << "<span class='notice'>No active admins are online, your adminhelp was sent to the admin irc.</span>"
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/proc/get_admin_counts(requiredflags = R_BAN)
. = list("total" = list(), "noflags" = list(), "afk" = list(), "stealth" = list(), "present" = list())
for(var/client/X in admins)
@@ -186,8 +183,7 @@
else
final = "[msg] - All admins stealthed\[[english_list(stealthmins)]\], AFK\[[english_list(afkmins)]\], or lacks +BAN\[[english_list(powerlessmins)]\]! Total: [allmins.len] "
send2irc(source,final)
// send2admindiscord(source,final)
send2otherserver(source,final)
/proc/send2irc(msg,msg2)
if(config.useircbot)
@@ -205,7 +201,6 @@
world.Export("[global.cross_address]?[list2params(message)]")
/proc/ircadminwho()
var/list/message = list("Admins: ")
var/list/admin_keys = list()
+55 -45
View File
@@ -6,7 +6,8 @@
if(!holder)
src << "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>"
return
if( !ismob(M) || !M.client ) return
if( !ismob(M) || !M.client )
return
cmd_admin_pm(M.client,null)
feedback_add_details("admin_verb","APMM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -20,16 +21,15 @@
var/list/client/targets[0]
for(var/client/T)
if(T.mob)
if(istype(T.mob, /mob/new_player))
if(isnewplayer(T.mob))
targets["(New Player) - [T]"] = T
else if(istype(T.mob, /mob/dead/observer))
else if(isobserver(T.mob))
targets["[T.mob.name](Ghost) - [T]"] = T
else
targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T
else
targets["(No Mob) - [T]"] = T
var/list/sorted = sortList(targets)
var/target = input(src,"To whom shall we send a message?","Admin PM",null) in sorted|null
var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sortList(targets)
cmd_admin_pm(targets[target],null)
feedback_add_details("admin_verb","APM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -45,31 +45,30 @@
else if(istype(whom,/client))
C = whom
if(!C)
if(holder) src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
if(holder)
src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
return
var/datum/adminticket/ticket
for(var/datum/adminticket/T in admintickets)
if(T.permckey == C.ckey)
ticket = T
for(var/I in admintickets)
var/datum/adminticket/T = I
if(ticket)
if(ticket.active == "No" && ticket.replying == 0)
message_admins("[key_name_admin(src)] has been assigned to [key_name(C, 0, 0)]'s admin help. This is the first reply. ([ticket.uID])")
ticket.replying = 1
ticket.user << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
else if(ticket.replying == 1)
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 << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
else if(T.replying == TICKET_REPLIED)
src << "<b>Error, this ticket is already being replied to!</b>"
return
else if(ticket.admin != "N/A" && ticket.replying == 0)
if(ticket.admin != src.ckey)
if(alert(src, "This adminhelp already has an admin assigned: [ticket.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: [ticket.admin]. ([ticket.uID])")
ticket.user << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
ticket.replying = 1
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.")
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 << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
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.")
var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
@@ -78,15 +77,15 @@
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 << "<b>[src.ckey] has been unassigned from your admin help. (reply cancelled)</b>"
ticket.replying = 0
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.")
return
if(ticket)
ticket.replying = 0
ticket.replying = TICKET_UNREPLIED
ticket.admin = src.ckey
ticket.active = "Yes"
ticket.active = TICKET_ACTIVE
cmd_admin_pm(whom, msg)
@@ -113,7 +112,8 @@
if(!msg)
msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
if(!msg) return
if(!msg)
return
if(!C)
if(holder) src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
@@ -125,7 +125,8 @@
//clean the message if it's not sent by a high-rank admin
if(!check_rights(R_SERVER|R_DEBUG,0))
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg) return
if(!msg)
return
msg = emoji_parse(msg)
var/keywordparsedmsg = keywords_lookup(msg)
@@ -133,26 +134,32 @@
if(C.holder)
if(holder) //both are admins
for(var/datum/adminticket/T in admintickets)
if(T.permckey == src.ckey && T.resolved == "No")
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == src.ckey && T.resolved == TICKET_UNRESOLVED)
T.ticket_logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
ticket = T
break
else if(T.permckey == src.ckey)
ticket = T
if(ticket && ticket.resolved == "No")
break
if(ticket && ticket.resolved == TICKET_UNRESOLVED)
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg] (<a href='?src=\ref[ticket];resolve=\ref[ticket]'>R</a>)</font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [keywordparsedmsg] (<a href='?src=\ref[ticket];resolve=\ref[ticket]'>R</a>)</font>"
else
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [keywordparsedmsg]</font>"
else //recipient is an admin but sender is not
for(var/datum/adminticket/T in admintickets)
if(T.permckey == src.ckey && T.resolved == "No")
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == src.ckey && T.resolved == TICKET_UNRESOLVED)
T.ticket_logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
ticket = T
break
else if(T.permckey == src.ckey)
ticket = T
if(ticket && ticket.resolved == "No")
break
if(ticket && ticket.resolved == TICKET_UNRESOLVED)
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg] (<a href='?src=\ref[ticket];resolve=\ref[ticket]'>R</a>)</font>"
else
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
@@ -164,17 +171,19 @@
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
for(var/datum/adminticket/T in admintickets)
if(T.permckey == C.ckey && T.resolved == "No")
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == C.ckey && T.resolved == TICKET_UNRESOLVED)
T.ticket_logs += "<span class='danger'>[src] TO [C]: [msg] </span>"
ticket = T
break
else if(T.permckey == C.ckey)
ticket = T
break
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
if(ticket && ticket.resolved == "No")
if(ticket && ticket.resolved == TICKET_UNRESOLVED)
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg] (<a href='?src=\ref[ticket];resolve=\ref[ticket]'>R</a>)</font>"
else
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
@@ -190,9 +199,10 @@
if(C && reply)
if(sender)
C.cmd_admin_pm(sender,reply)
for(var/datum/adminticket/T in admintickets)
if(T.permckey == C.ckey && T.resolved == "No")
T.logs += "<span class='danger'>[sendername] TO [C]: [msg] </span>" //sender is still about, let's reply to them
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == C.ckey && T.resolved == TICKET_UNRESOLVED)
T.ticket_logs += "<span class='danger'>[sendername] TO [C]: [msg] </span>" //sender is still about, let's reply to them
else
adminhelp(reply) //sender has left, adminhelp instead
return
@@ -232,7 +242,7 @@
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
C << "<font color='red'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
window_flash(C)
window_flash(C, ignorepref = TRUE)
//always play non-admin recipients the adminhelp sound
C << 'sound/effects/adminhelp.ogg'
+4 -1
View File
@@ -683,7 +683,6 @@ var/list/TYPES_SHORTCUTS = list(
set desc = "Displays a list of things that have failed to GC this round"
var/dat = "<B>List of things that failed to GC this round</B><BR><BR>"
for(var/path in SSgarbage.didntgc)
dat += "[path] - [SSgarbage.didntgc[path]] times<BR>"
@@ -691,6 +690,10 @@ var/list/TYPES_SHORTCUTS = list(
for(var/path in SSgarbage.noqdelhint)
dat += "[path]<BR>"
dat += "<B>List of paths that slept in Destroy()</B><BR><BR>"
for(var/path in SSgarbage.sleptDestroy)
dat += "[path]<BR>"
usr << browse(dat, "window=dellog")
/client/proc/debug_huds(i as num)
+108 -105
View File
@@ -1,65 +1,60 @@
/datum/adminticket
var/ID = "" //ID of the ticket, very important as its used to find adminhelps.
var/user = "" //The user of the ahelp.
var/uckey //The saved ckey of the adminheloing user.
var/admin = "N/A" //The handling admin? Like come on.
var/msg = "" //The adminhelp message.
var/resolved = "No" //Is it resolved? Its much easier to have a "Yes" or a "No", as you can directly concat it into strings making life that much easier.
var/permckey = "" //The perm ckey, never removed essentially.
var/permuser = "" //Same as above!
var/uID = "" //The UNIQUE id, made by putting part of the ckey and the ID together. Used internally in code.
var/active = "No" //Is the adminhelp active, eg admin responded? This is the same as above, it makes life easier.
var/logs = list() //The logs of the adminhelp.
var/replying = 0 //Is someone responding to the adminhelp?
var/mob //The mob adminhelping mob.
var/active = TICKET_INACTIVE //Is the adminhelp active, eg admin responded?
var/admin = TICKET_UNASSIGNED //The handling admin? Like come on.
var/id = "" //ID of the ticket, very important as its used to find adminhelps.
var/ticket_logs = list() //The logs of the adminhelp.
var/mob //The mob adminhelping mob.
var/msg = "" //The adminhelp message.
var/permckey = "" //The perm ckey, never removed essentially.
var/permuser = "" //Same as above!
var/replying = TICKET_UNREPLIED //Is someone responding to the adminhelp?
var/resolved = TICKET_UNRESOLVED //Is it resolved? Its much easier to have a "Yes" or a "No", as you can directly concat it into strings making life that much easier.
var/uckey //The saved ckey of the adminhelping user.
var/uID = "" //The UNIQUE id, made by putting part of the ckey and the ID together. Used internally in code.
var/user = "" //The user of the ahelp.
/client/proc/list_ahelps(user, resolved)
if(!check_rights(R_ADMIN))
src << "<font color='red'>Error: Only administrators may use this command.</font>"
return
if(resolved)
user << "Current Ahelps:"
for(var/datum/adminticket/T in admintickets)
var/ref_mob = "\ref[T.mob]"
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(resolved)
user << "Resolved Ahelps:"
usr << "<span class='adminnotice'><b><font color='red'>#[T.id] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique id:</b> [T.uID]</span>"
usr << " <b>Controls:</b> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)]"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
if(T.resolved == "No")
if(T.resolved == TICKET_UNRESOLVED)
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
else
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
else
user << "Current Unresolved Ahelps:"
for(var/datum/adminticket/T in admintickets)
if(T.resolved == "No")
var/ref_mob = "\ref[T.mob]"
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
else
user << "Current Unresolved Ahelps:"
if(T.resolved == TICKET_UNRESOLVED)
usr << "<span class='adminnotice'><b><font color=red>#[T.id] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)]"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
if(T.resolved == "No")
if(T.resolved == TICKET_UNRESOLVED)
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
else
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
/client/proc/ahelp_count(modifier)
var/amount
for(var/datum/adminticket/T in admintickets)
switch(modifier)
if(0)
if(T.resolved == "No")
amount++
if(1)
if(T.resolved == "Yes")
amount++
if(2)
amount++
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.resolved == TICKET_UNRESOLVED)
amount++
if(T.resolved == TICKET_RESOLVED)
amount++
return amount
@@ -82,15 +77,14 @@
if(count < 1)
usr << " None"
return
for(var/datum/adminticket/T in admintickets)
var/ref_mob = "\ref[T.mob]"
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
for(var/I in admintickets)
var/datum/adminticket/T = I
usr << "<span class='adminnotice'><b><font color=red>#[T.id] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)]"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
if(T.resolved == "No")
if(T.resolved == TICKET_UNRESOLVED)
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
else
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
@@ -106,8 +100,9 @@
var/count = 0
for(var/datum/adminticket/T in admintickets)
if(T.resolved =="No")
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.resolved == TICKET_UNRESOLVED)
count++
usr << "<b>Current Unresolved Ahelps:</b>"
@@ -116,15 +111,15 @@
usr << " None"
return
for(var/datum/adminticket/T in admintickets)
if(T.resolved == "No")
var/ref_mob = "\ref[T.mob]"
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.resolved == TICKET_UNRESOLVED)
usr << "<span class='adminnotice'><b><font color=red>#[T.id] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)]"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
if(T.resolved == "No")
if(T.resolved == TICKET_UNRESOLVED)
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
else
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
@@ -140,25 +135,23 @@
var/count = 0
for(var/datum/adminticket/T in admintickets)
if(T.resolved == "No" && T.admin == ckey)
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.resolved == TICKET_UNRESOLVED && T.admin == ckey)
count++
if(count < 1)
usr << "<b>You don't have any ACTIVE ahelps!</b>"
return
for(var/datum/adminticket/T in admintickets)
if(T.resolved == "No" && T.admin == ckey)
var/ref_mob = "\ref[T.mob]"
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.resolved == TICKET_UNRESOLVED && T.admin == ckey)
usr << "<span class='adminnotice'><b><font color=red>#[T.id] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
usr << " <b>Controls:</b> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)]"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
if(T.resolved == "No")
if(T.resolved == TICKET_UNRESOLVED)
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
else
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
@@ -170,7 +163,8 @@
var/count = 0
for(var/datum/adminticket/T in admintickets)
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == ckey)
count++
@@ -180,34 +174,37 @@
usr << "<b>Resolved Ahelps</b>"
var/rpass = 0
var/rpass = FALSE
for(var/datum/adminticket/T in admintickets)
if(T.permckey == ckey && T.resolved == "Yes")
rpass = 1
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.ID] </font></b></span>"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == ckey && T.resolved == TICKET_RESOLVED)
rpass = TRUE
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.id] </font></b></span>"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
usr << " <b>Resolved:</b> [T.resolved]"
if(rpass == 0)
if(rpass == FALSE)
usr << " None"
usr << "<b>Unresolved Ahelps</b>"
var/upass = 0
var/upass = FALSE
for(var/datum/adminticket/T in admintickets)
if(T.permckey == ckey && T.resolved == "No")
upass = 1
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.ID] </font></b></span>"
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == ckey && T.resolved == TICKET_UNRESOLVED)
upass = TRUE
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.id] </font></b></span>"
usr << " <b>Message:</b> [T.msg]"
usr << " <b>Handling Admin:</b> [T.admin]"
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
usr << " <b>Resolved:</b> [T.resolved]"
if(upass == 0)
if(upass == FALSE)
usr << " None"
/client/proc/createticket(player, message, uckey, mob)
@@ -218,14 +215,15 @@
A.permckey = uckey
A.permuser = A.user
admintickets += A
A.logs += "<b>ADMINHELP:</b> [A.permckey]([A.permuser]): [A.msg]"
A.ticket_logs += "<b>ADMINHELP:</b> [A.permckey]([A.permuser]): [A.msg]"
A.mob = mob
var/index = 0
for(var/datum/adminticket/T in admintickets)
for(var/I in admintickets)
var/datum/adminticket/T = I
index++
T.ID = index
T.uID = "[T.permckey][T.ID]"
T.id = index
T.uID = "[T.permckey][T.id]"
/client/verb/resolveticketself()
set category = "Admin"
@@ -234,17 +232,16 @@
var/pass = 0
var/datum/adminticket/ticket
for(var/datum/adminticket/T in admintickets)
if(T.permckey == ckey && T.resolved != "Yes")
T.resolved = "Yes"
ticket = T
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.permckey == ckey && T.resolved != TICKET_RESOLVED)
T.resolved = TICKET_RESOLVED
pass = 1
switch(pass)
if(1)
src << "<b>You have resolved your current adminhelp.</b>"
message_admins("[src] has resolved his adminhelp (#[ticket.ID])")
message_admins("[src] has resolved his adminhelp (#[ticket.id])")
if(0)
src << "<b>Error, you do not have any active adminhelps.</b>"
@@ -260,21 +257,20 @@
var/count = 0
var/datum/adminticket/ticket
for(var/datum/adminticket/T in admintickets)
if(T.admin == ckey && T.resolved != "Yes")
for(var/I in admintickets)
var/datum/adminticket/T = I
if(T.admin == ckey && T.resolved != TICKET_RESOLVED)
count++
ticket = T
if(count >= 1)
usr << "<b>Adminhelp #[ticket.ID]([ticket.uID]) resolved.</b>"
message_admins("Adminhelp ID: #[ticket.ID]([ticket.uID]) was resolved by [usr.ckey]")
ticket.user << "<b>Your adminhelp (#[ticket.ID]) has been resolved by [usr.ckey]</b>"
ticket.user << 'sound/machines/twobeep.ogg'
ticket.resolved = "Yes"
if(count >= 1)
usr << "<b>Adminhelp #[T.id]([T.uID]) resolved.</b>"
message_admins("Adminhelp ID: #[T.id]([T.uID]) was resolved by [usr.ckey]")
ticket.user << "<b>Your adminhelp (#[T.id]) has been resolved by [usr.ckey]</b>"
ticket.user << 'sound/machines/twobeep.ogg'
ticket.resolved = TICKET_RESOLVED
if(count < 1)
usr << "<b>You are not currently handling any adminhelps!</b>"
if(count < 1)
usr << "<b>You are not currently handling any adminhelps!</b>"
/datum/adminticket/proc/viewlogs(NuID, mob/user)
var/dat = "<h3>View Logs for ahelp [NuID]</h3>"
@@ -292,7 +288,7 @@
return
dat += "<table>"
for(var/text in ticket.logs)
for(var/text in ticket.ticket_logs)
dat += "<tr><td>[text]</td></tr>"
dat += "</table>"
@@ -301,12 +297,19 @@
popup.open()
/datum/adminticket/Topic(href, href_list)
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
if(href_list["view_logs"])
var/datum/adminticket/T = locate(href_list["view_logs"])
viewlogs(T.uID, usr)
if(href_list["resolve"])
var/datum/adminticket/T = locate(href_list["resolve"])
message_admins("Adminhelp ID: #[T.ID]([T.uID]) was [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]")
T.user << "<b>Your adminhelp (#[T.ID]) has been [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]</b>"
T.user << 'sound/machines/twobeep.ogg'
T.resolved = "[T.resolved == "Yes" ? "No" : "Yes"]"
var/datum/adminticket/T = locate(href_list["resolve"]) in admintickets
if(T && istype(T))
message_admins("Adminhelp ID: #[T.id]([T.uID]) was [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]")
T.user << "<b>Your adminhelp (#[T.id]) has been [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]</b>"
T.user << 'sound/machines/twobeep.ogg'
T.resolved = "[T.resolved == "Yes" ? "No" : "Yes"]"
@@ -4,10 +4,10 @@
var/datum/map_template/template
var/map = input(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in map_templates
var/map = input(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in SSmapping.map_templates
if(!map)
return
template = map_templates[map]
template = SSmapping.map_templates[map]
var/turf/T = get_turf(mob)
if(!T)
@@ -38,7 +38,7 @@
var/datum/map_template/M = new(map=map, rename="[map]")
if(M.preload_size(map))
usr << "Map template '[map]' ready to place ([M.width]x[M.height])"
map_templates[M.name] = M
SSmapping.map_templates[M.name] = M
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has uploaded a map template ([map])</span>")
else
usr << "Map template '[map]' failed to load properly"
+8 -3
View File
@@ -5,8 +5,7 @@ var/highlander = FALSE
return
highlander = TRUE
world << "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>"
world << sound('sound/misc/highlander.ogg')
send_to_playing_players("<span class='boldannounce'><font size=6>THERE CAN BE ONLY ONE</font></span>")
for(var/obj/item/weapon/disk/nuclear/N in poi_list)
N.relocate() //Gets it out of bags and such
@@ -20,6 +19,12 @@ var/highlander = FALSE
log_admin("[key_name(usr)] used THERE CAN BE ONLY ONE.")
addtimer(CALLBACK(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 1), 50)
/client/proc/only_one_delayed()
send_to_playing_players("<span class='userdanger'>Bagpipes begin to blare. You feel Scottish pride coming over you.</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] used (delayed) THERE CAN BE ONLY ONE!</span>")
log_admin("[key_name(usr)] used delayed THERE CAN BE ONLY ONE.")
addtimer(CALLBACK(src, .proc/only_one), 420)
/mob/living/carbon/human/proc/make_scottish()
ticker.mode.traitors += mind
mind.special_role = "highlander"
@@ -70,7 +75,7 @@ var/highlander = FALSE
antiwelder.icon_state = "bloodhand_right"
put_in_hands(antiwelder)
src << "<span class='boldannounce'>Your [H1.name] cries out for blood. Join in the slaughter, lest you be claimed yourself...\n\
src << "<span class='boldannounce'>Your [H1.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>"
/proc/only_me()
+3 -21
View File
@@ -190,25 +190,6 @@
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_add_random_ai_law()
set category = "Fun"
set name = "Add Random AI Law"
if(!holder)
src << "Only administrators may use this command."
return
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes")
return
log_admin("[key_name(src)] has added a random AI law.")
message_admins("[key_name_admin(src)] has added a random AI law.")
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
var/announce_ion_laws = (show_log == "Yes" ? 1 : -1)
new /datum/round_event/ion_storm(0, announce_ion_laws)
feedback_add_details("admin_verb","ION") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//I use this proc for respawn character too. /N
/proc/create_xeno(ckey)
if(!ckey)
@@ -439,8 +420,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
var/announce_ion_laws = (show_log == "Yes" ? 1 : -1)
var/datum/round_event/ion_storm/ion = new(0, announce_ion_laws, input)
ion.start()
var/datum/round_event/ion_storm/add_law_only/ion = new()
ion.announceEvent = announce_ion_laws
ion.ionMessage = input
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -15,7 +15,6 @@
return
dbcon.Disconnect()
failed_db_connections = 0
log_admin("[key_name(usr)] has forced the database to disconnect")
message_admins("[key_name_admin(usr)] has <b>forced</b> the database to disconnect!")
feedback_add_details("admin_verb","FRDB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -24,8 +23,8 @@
message_admins("[key_name_admin(usr)] is attempting to re-established the DB Connection")
feedback_add_details("admin_verb","RDB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
failed_db_connections = 0
if (!establish_db_connection())
dbcon.failed_connections = 0
if(!dbcon.Connect())
message_admins("Database connection failed: " + dbcon.ErrorMsg())
else
message_admins("Database connection re-established")