diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 84cfa9a8264..c212e3132c5 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -153,6 +153,8 @@ obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/a
/obj/machinery/atmospherics/relaymove(mob/living/user, direction)
if(!(direction & initialize_directions)) //can't go in a way we aren't connecting to
return
+ if(user.machine == src) //temporary fix until we overhaul movement code
+ return
var/obj/machinery/atmospherics/target_move = findConnecting(direction)
if(target_move)
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 7cdd9579e13..76ac8b25344 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -26,6 +26,20 @@
entry += " - DEAD"
else
entry += " - DEAD"
+
+ var/age
+ if(isnum(C.player_age))
+ age = C.player_age
+ else
+ age = 0
+
+ if(age <= 1)
+ age = "[age]"
+ else if(age < 10)
+ age = "[age]"
+
+ entry += " - [age]"
+
if(is_special_character(C.mob))
entry += " - Antagonist"
entry += " (?)"
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index f0fa25224b5..da0c6d64e60 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -1,5 +1,5 @@
-datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null)
+datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null)
if(!check_rights(R_BAN)) return
@@ -45,6 +45,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
ip = banned_mob.client.address
else if(banckey)
ckey = ckey(banckey)
+ computerid = bancid
+ ip = banip
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_player WHERE ckey = '[ckey]'")
query.Execute()
@@ -268,7 +270,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
holder.DB_ban_panel()
-/datum/admins/proc/DB_ban_panel(var/playerckey = null, var/adminckey = null, var/playerip = null, var/pban = null, var/tban = null, var/jpban = null, var/jtban = null)
+/datum/admins/proc/DB_ban_panel(var/playerckey = null, var/adminckey = null, var/playerip = null, var/playercid = null, var/dbbantype = null, var/match = null)
if(!usr.client)
return
@@ -291,7 +293,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
output += "
"
- output += "Please note that all jobban bans or unbans are in-effect the following round."
+ output += "Please note that all jobban bans or unbans are in-effect the following round.
"
+ output += "This search shows only last 100 bans."
-
-
-
- if(adminckey || playerckey || playerip || pban || tban || jpban || jtban)
-
- var/blcolor = "#ffeeee" //banned light
- var/bdcolor = "#ffdddd" //banned dark
- var/ulcolor = "#eeffee" //unbanned light
- var/udcolor = "#ddffdd" //unbanned dark
-
- output += ""
- output += ""
- output += "| TYPE | "
- output += "CKEY | "
- output += "TIME APPLIED | "
- output += "ADMIN | "
- output += "OPTIONS | "
- output += "
"
+ if(adminckey || playerckey || playerip || playercid || dbbantype)
adminckey = ckey(adminckey)
playerckey = ckey(playerckey)
+ playerip = sql_sanitize_text(playerip)
+ playercid = sql_sanitize_text(playercid)
- var/adminsearch = ""
- var/playersearch = ""
- var/playeripsearch = ""
- var/pbansearch = ""
- var/tbansearch = ""
- var/jpbansearch = ""
- var/jtbansearch = ""
- if(adminckey)
- adminsearch = "AND a_ckey = '[adminckey]' "
- if(playerckey)
- playersearch = "AND ckey = '[playerckey]' "
- if(playerip)
- playeripsearch = "AND ip = '[playerip]' "
- if(pban != null)
- pbansearch = "AND bantype = 'PERMABAN'"
- if(tban != null)
- tbansearch = "AND bantype = 'TEMPBAN'"
- if(jpban != null)
- jpbansearch = "AND bantype = 'JOB_PERMABAN'"
- if(jtban != null)
- jtbansearch = "AND bantype = 'JOB_TEMPBAN'"
+ if(adminckey || playerckey || playerip || playercid || dbbantype)
+ var/blcolor = "#ffeeee" //banned light
+ var/bdcolor = "#ffdddd" //banned dark
+ var/ulcolor = "#eeffee" //unbanned light
+ var/udcolor = "#ddffdd" //unbanned dark
-
- var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, ip FROM erro_ban WHERE 1 [pbansearch] [tbansearch] [jpbansearch] [jtbansearch] [playersearch] [adminsearch] [playeripsearch] ORDER BY bantime DESC")
- select_query.Execute()
-
- while(select_query.NextRow())
- var/banid = select_query.item[1]
- var/bantime = select_query.item[2]
- var/bantype = select_query.item[3]
- var/reason = select_query.item[4]
- var/job = select_query.item[5]
- var/duration = select_query.item[6]
- var/expiration = select_query.item[7]
- var/ckey = select_query.item[8]
- var/ackey = select_query.item[9]
- var/unbanned = select_query.item[10]
- var/unbanckey = select_query.item[11]
- var/unbantime = select_query.item[12]
- var/edits = select_query.item[13]
- var/ip = select_query.item[14]
-
- var/lcolor = blcolor
- var/dcolor = bdcolor
- if(unbanned)
- lcolor = ulcolor
- dcolor = udcolor
-
- var/typedesc =""
- switch(bantype)
- if("PERMABAN")
- typedesc = "PERMABAN"
- if("TEMPBAN")
- typedesc = "TEMPBAN
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]"
- if("JOB_PERMABAN")
- typedesc = "JOBBAN
([job])"
- if("JOB_TEMPBAN")
- typedesc = "TEMP JOBBAN
([job])
([duration] minutes
Expires [expiration]"
- if("APPEARANCE_BAN")
- typedesc = "APPEARANCE/NAME BAN"
-
-
- output += ""
- output += "| [typedesc] | "
- output += "[ckey] | "
- output += "[bantime] | "
- output += "[ackey] | "
- output += "[(unbanned) ? "" : "Unban"] | "
+ output += ""
+ output += ""
+ output += "| TYPE | "
+ output += "CKEY | "
+ output += "TIME APPLIED | "
+ output += "ADMIN | "
+ output += "OPTIONS | "
output += "
"
- output += ""
- output += "| Reason: [(unbanned) ? "" : "(Edit)"] \"[reason]\" | "
- output += "IP: [ip] | "
- output += "
"
- if(edits)
+
+ var/adminsearch = ""
+ var/playersearch = ""
+ var/ipsearch = ""
+ var/cidsearch = ""
+ var/bantypesearch = ""
+
+ if(!match)
+ if(adminckey)
+ adminsearch = "AND a_ckey = '[adminckey]' "
+ if(playerckey)
+ playersearch = "AND ckey = '[playerckey]' "
+ if(playerip)
+ ipsearch = "AND ip = '[playerip]' "
+ if(playercid)
+ cidsearch = "AND computerid = '[playercid]' "
+ else
+ if(adminckey && lentext(adminckey) >= 3)
+ adminsearch = "AND a_ckey LIKE '[adminckey]%' "
+ if(playerckey && lentext(playerckey) >= 3)
+ playersearch = "AND ckey LIKE '[playerckey]%' "
+ if(playerip && lentext(playerip) >= 3)
+ ipsearch = "AND ip LIKE '[playerip]%' "
+ if(playercid && lentext(playercid) >= 7)
+ cidsearch = "AND computerid LIKE '[playercid]%' "
+
+ if(dbbantype)
+ bantypesearch = "AND bantype = "
+
+ switch(dbbantype)
+ if(BANTYPE_TEMP)
+ bantypesearch += "'TEMPBAN' "
+ if(BANTYPE_JOB_PERMA)
+ bantypesearch += "'JOB_PERMABAN' "
+ if(BANTYPE_JOB_TEMP)
+ bantypesearch += "'JOB_TEMPBAN' "
+ if(BANTYPE_APPEARANCE)
+ bantypesearch += "'APPEARANCE_BAN' "
+ else
+ bantypesearch += "'PERMABAN' "
+
+
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, ip, computerid FROM erro_ban WHERE 1 [playersearch] [adminsearch] [ipsearch] [cidsearch] [bantypesearch] ORDER BY bantime DESC LIMIT 100")
+ select_query.Execute()
+
+ while(select_query.NextRow())
+ var/banid = select_query.item[1]
+ var/bantime = select_query.item[2]
+ var/bantype = select_query.item[3]
+ var/reason = select_query.item[4]
+ var/job = select_query.item[5]
+ var/duration = select_query.item[6]
+ var/expiration = select_query.item[7]
+ var/ckey = select_query.item[8]
+ var/ackey = select_query.item[9]
+ var/unbanned = select_query.item[10]
+ var/unbanckey = select_query.item[11]
+ var/unbantime = select_query.item[12]
+ var/edits = select_query.item[13]
+ var/ip = select_query.item[14]
+ var/cid = select_query.item[15]
+
+ var/lcolor = blcolor
+ var/dcolor = bdcolor
+ if(unbanned)
+ lcolor = ulcolor
+ dcolor = udcolor
+
+ var/typedesc =""
+ switch(bantype)
+ if("PERMABAN")
+ typedesc = "PERMABAN"
+ if("TEMPBAN")
+ typedesc = "TEMPBAN
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]"
+ if("JOB_PERMABAN")
+ typedesc = "JOBBAN
([job])"
+ if("JOB_TEMPBAN")
+ typedesc = "TEMP JOBBAN
([job])
([duration] minutes
Expires [expiration]"
+ if("APPEARANCE_BAN")
+ typedesc = "APPEARANCE/NAME BAN"
+
output += ""
- output += "| EDITS | "
+ output += "[typedesc] | "
+ output += "[ckey] | "
+ output += "[bantime] | "
+ output += "[ackey] | "
+ output += "[(unbanned) ? "" : "Unban"] | "
+ output += "
"
+ output += ""
+ output += "| IP: [ip] | "
+ output += "CIP: [cid] | "
output += "
"
output += ""
- output += "| [edits] | "
+ output += "Reason: [(unbanned) ? "" : "(Edit)"] \"[reason]\" | "
output += "
"
- if(unbanned)
- output += ""
- output += "| UNBANNED by admin [unbanckey] on [unbantime] | "
+ if(edits)
+ output += "
"
+ output += "| EDITS | "
+ output += "
"
+ output += ""
+ output += "| [edits] | "
+ output += "
"
+ if(unbanned)
+ output += ""
+ output += "| UNBANNED by admin [unbanckey] on [unbantime] | "
+ output += "
"
+ output += ""
+ output += "|   | "
output += "
"
- output += ""
- output += "|   | "
- output += "
"
- output += "
"
+ output += "
"
-
-
-
- else
-
- var/DBQuery/select_query = dbcon.NewQuery("SELECT bantype, COUNT(*) FROM erro_ban GROUP BY bantype")
- select_query.Execute()
-
- while(select_query.NextRow())
- var/bantype = select_query.item[1]
- var/count = select_query.item[2]
-
-
- output +="
"
- output += "| [bantype]:[count] | "
- output += "
"
- output += ""
-
-/*
- var/blcolor = "#ffeeee" //banned light
- var/bdcolor = "#ffdddd" //banned dark
- var/ulcolor = "#eeffee" //unbanned light
- var/udcolor = "#ddffdd" //unbanned dark
-
- output += ""
- output += ""
- output += "| TYPE | "
- output += "CKEY | "
- output += "TIME APPLIED | "
- output += "ADMIN | "
- output += "OPTIONS | "
- output += "
"
-
-
- var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, ip FROM erro_ban ORDER BY bantime DESC")
- select_query.Execute()
-
- while(select_query.NextRow())
- var/banid = select_query.item[1]
- var/bantime = select_query.item[2]
- var/bantype = select_query.item[3]
- var/reason = select_query.item[4]
- var/job = select_query.item[5]
- var/duration = select_query.item[6]
- var/expiration = select_query.item[7]
- var/ckey = select_query.item[8]
- var/ackey = select_query.item[9]
- var/unbanned = select_query.item[10]
- var/unbanckey = select_query.item[11]
- var/unbantime = select_query.item[12]
- var/edits = select_query.item[13]
- var/ip = select_query.item[14]
-
- var/lcolor = blcolor
- var/dcolor = bdcolor
- if(unbanned)
- lcolor = ulcolor
- dcolor = udcolor
-
- var/typedesc =""
- switch(bantype)
- if("PERMABAN")
- typedesc = "PERMABAN"
- if("TEMPBAN")
- typedesc = "TEMPBAN
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]"
- if("JOB_PERMABAN")
- typedesc = "JOBBAN
([job])"
- if("JOB_TEMPBAN")
- typedesc = "TEMP JOBBAN
([job])
([duration] minutes
Expires [expiration]"
-
- output += ""
- output += "| [typedesc] | "
- output += "[ckey] | "
- output += "[bantime] | "
- output += "[ackey] | "
- output += "[(unbanned) ? "" : "Unban"] | "
- output += "
"
- output += ""
- output += "| Reason: [(unbanned) ? "" : "(Edit)"] \"[reason]\" | "
- output += "IP: [ip] | "
- output += "
"
- if(edits)
- output += ""
- output += "| EDITS | "
- output += "
"
- output += ""
- output += "| [edits] | "
- output += "
"
- if(unbanned)
- output += ""
- output += "| UNBANNED by admin [unbanckey] on [unbantime] | "
- output += "
"
- output += ""
- output += "|   | "
- output += "
"
-
- output += "
"
-*/
- usr << browse(output,"window=lookupbans;size=900x500")
\ No newline at end of file
+ usr << browse(output,"window=lookupbans;size=900x700")
\ No newline at end of file
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index a108dd54287..51edf9a4cdf 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -995,8 +995,9 @@ proc/formatPlayerPanel(var/mob/U,var/text="PP")
return //extra sanity check to make sure only observers are shoved into things
//same as assume-direct-control perm requirements.
- if (!check_rights(R_VAREDIT,0) || !check_rights(R_ADMIN|R_DEBUG,0))
- return 0
+ if (!check_rights(R_VAREDIT,0)) //no varedit, check if they have r_admin and r_debug
+ if(!check_rights(R_ADMIN|R_DEBUG,0)) //if they don't have r_admin and r_debug, return
+ return 0 //otherwise, if they have no varedit, but do have r_admin and r_debug, execute the rest of the code
if (!frommob.ckey)
return 0
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index fcf047784aa..1108c287461 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -62,6 +62,7 @@ var/list/admin_verbs_admin = list(
/client/proc/global_man_up,
/client/proc/delbook,
/client/proc/empty_ai_core_toggle_latejoin,
+ /client/proc/aooc,
/client/proc/freeze,
/client/proc/freezemecha,
/client/proc/alt_check
@@ -73,7 +74,8 @@ var/list/admin_verbs_ban = list(
)
var/list/admin_verbs_sounds = list(
/client/proc/play_local_sound,
- /client/proc/play_sound
+ /client/proc/play_sound,
+ /client/proc/play_server_sound
)
var/list/admin_verbs_event = list(
/client/proc/object_talk,
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index d9caa1eac15..210d020553f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -45,16 +45,18 @@
if(!src.makeVoxRaiders())
usr << "\red Unfortunately there weren't enough candidates available."
- else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbpban"] || href_list["dbtban"] || href_list["dbjpban"] || href_list["dbjtban"])
+ else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"])
var/adminckey = href_list["dbsearchadmin"]
var/playerckey = href_list["dbsearchckey"]
var/playerip = href_list["dbsearchip"]
- var/pban = href_list["dbpban"]
- var/tban = href_list["dbtban"]
- var/jpban = href_list["dbjpban"]
- var/jtban = href_list["dbjtban"]
+ var/playercid = href_list["dbsearchcid"]
+ var/dbbantype = text2num(href_list["dbsearchbantype"])
+ var/match = 0
- DB_ban_panel(playerckey, adminckey, playerip, pban, tban, jpban, jtban)
+ if("dbmatch" in href_list)
+ match = 1
+
+ DB_ban_panel(playerckey, adminckey, playerip, playercid, dbbantype, match)
return
else if(href_list["dbbanedit"])
@@ -66,11 +68,12 @@
DB_ban_edit(banid, banedit)
return
-
else if(href_list["dbbanaddtype"])
var/bantype = text2num(href_list["dbbanaddtype"])
var/banckey = href_list["dbbanaddckey"]
+ var/banip = href_list["dbbanaddip"]
+ var/bancid = href_list["dbbanaddcid"]
var/banduration = text2num(href_list["dbbaddduration"])
var/banjob = href_list["dbbanaddjob"]
var/banreason = href_list["dbbanreason"]
@@ -98,6 +101,12 @@
if(!banckey || !banreason || !banjob || !banduration)
usr << "Not enough parameters (Requires ckey, reason and job)"
return
+ if(BANTYPE_APPEARANCE)
+ if(!banckey || !banreason)
+ usr << "Not enough parameters (Requires ckey and reason)"
+ return
+ banduration = null
+ banjob = null
var/mob/playermob
@@ -106,9 +115,19 @@
playermob = M
break
+
banreason = "(MANUAL BAN) "+banreason
- DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey)
+ if(!playermob)
+ if(banip)
+ banreason = "[banreason] (CUSTOM IP)"
+ if(bancid)
+ banreason = "[banreason] (CUSTOM CID)"
+ else
+ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob")
+
+ DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
+
else if(href_list["editrights"])
if(!check_rights(R_PERMISSIONS))
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
new file mode 100644
index 00000000000..12064823184
--- /dev/null
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -0,0 +1,20 @@
+/client/proc/aooc(msg as text)
+ set category = "OOC"
+ set name = "AOOC"
+ set desc = "Antagonist OOC"
+
+ if(!check_rights(R_ADMIN)) return
+
+ msg = sanitize(msg)
+ if(!msg) return
+
+ var/display_name = src.key
+ if(holder && holder.fakekey)
+ display_name = holder.fakekey
+
+ for(var/mob/M in mob_list)
+ if((M.mind && M.mind.special_role && M.client) || (M.client && M.client.holder))
+ M << "AOOC: [display_name]: [msg]"
+
+
+ log_ooc("(ANTAG) [key] : [msg]")
\ No newline at end of file
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 7bbe4b3bff6..54b1377fd27 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -1,3 +1,5 @@
+var/list/sounds_cache = list()
+
/client/proc/play_sound(S as sound)
set category = "Event"
set name = "Play Global Sound"
@@ -6,6 +8,11 @@
var/sound/uploaded_sound = sound(S, repeat = 0, wait = 1, channel = 777)
uploaded_sound.priority = 250
+ sounds_cache += S
+
+ if(alert("Are you sure?\nSong: [S]\nNow you can also play this sound using \"Play Server Sound\".", "Confirmation request" ,"Play", "Cancel") == "Cancel")
+ return
+
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]", 1)
for(var/mob/M in player_list)
@@ -25,6 +32,21 @@
playsound(get_turf_loc(src.mob), S, 50, 0, 0)
feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/play_server_sound()
+ set category = "Event"
+ set name = "Play Server Sound"
+ if(!check_rights(R_SOUNDS)) return
+
+ var/list/sounds = file2list("sound/serversound_list.txt");
+ sounds += "--CANCEL--"
+ sounds += sounds_cache
+
+ var/melody = input("Select a sound from the server to play", "Server sound list", "--CANCEL--") in sounds
+
+ if(melody == "--CANCEL--") return
+
+ play_sound(melody)
+ feedback_add_details("admin_verb","PSS") //If you are copy-pasting this, ensure the 2nd paramter is unique to the new proc!
/*
/client/proc/cuban_pete()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b9a7a40c6f6..11342b903ca 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -48,6 +48,7 @@
// Set up DNA.
if(!delay_ready_dna)
dna.ready_dna(src)
+ UpdateAppearance()
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 028a7cb454c..ee55f6f2ef2 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -6,14 +6,14 @@
/mob/living/simple_animal/hostile/poison
var/poison_per_bite = 5
- var/poison_type = "venom"
+ var/poison_type = "spidertoxin"
/mob/living/simple_animal/hostile/poison/AttackingTarget()
..()
if(isliving(target))
var/mob/living/L = target
if(L.reagents)
- L.reagents.add_reagent("venom", poison_per_bite)
+ L.reagents.add_reagent("spidertoxin", poison_per_bite)
if(prob(poison_per_bite))
L << "You feel a tiny prick."
L.reagents.add_reagent(poison_type, poison_per_bite)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 54c3accb3ef..b04c0832350 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -96,6 +96,8 @@
affecting.Weaken(5) //Should keep you down unless you get help.
affecting.losebreath = min(affecting.losebreath + 2, 3)
+/obj/item/weapon/grab/attack_self(mob/user)
+ s_click(hud)
/obj/item/weapon/grab/proc/s_click(obj/screen/S)
if(!affecting)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 1cd6338a51c..92cec3e6441 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -321,6 +321,19 @@ datum
..()
return
+ spider_venom
+ name = "Spider venom"
+ id = "spidertoxin"
+ description = "A toxic venom injected by spacefaring arachnids."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+ on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1.5)
+ ..()
+ return
+
plasticide
name = "Plasticide"
id = "plasticide"
diff --git a/paradise.dme b/paradise.dme
index 6d15353b4a2..9fcb3074d16 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -848,6 +848,7 @@
#include "code\modules\admin\verbs\adminpm.dm"
#include "code\modules\admin\verbs\adminsay.dm"
#include "code\modules\admin\verbs\alt_check.dm"
+#include "code\modules\admin\verbs\antag-ooc.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
#include "code\modules\admin\verbs\cinematic.dm"
diff --git a/sound/serversound_list.txt b/sound/serversound_list.txt
new file mode 100644
index 00000000000..bb7e5f2950a
--- /dev/null
+++ b/sound/serversound_list.txt
@@ -0,0 +1,9 @@
+sound/music/b12_combined_start.ogg
+sound/music/main.ogg
+sound/music/space.ogg
+sound/music/title1.ogg
+sound/music/title2.ogg
+sound/music/traitor.ogg
+sound/items/bikehorn.ogg
+sound/effects/siren.ogg
+sound/ambience/song_game.ogg
\ No newline at end of file