diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 2747f1ba77b..6e64040b184 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -182,7 +182,7 @@
H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/pickaxe/drill(H), slot_r_hand)
+ H.equip_or_collect(new /obj/item/weapon/pickaxe/drill(H), slot_belt)
// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index c30969bea07..e8dd96e844d 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -496,16 +496,20 @@
"[user] drills a hole in \the [src] and pushes \a [P] into the void", \
"\blue You have finished drilling in \the [src] and push the [P] into the void.", \
"You hear ratchet.")
- /*
- new /obj/item/pipe(loc, make_from=src)
- for (var/obj/machinery/meter/meter in T)
- if (meter.target == src)
- new /obj/item/pipe_meter(T)
- del(meter)
- qdel(src)
- */
+
user.drop_item()
- P.dir = user.dir
+ if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm
+ P.dir = 5
+ if (user.dir == 1)
+ P.dir = 6
+ if (user.dir == 2)
+ P.dir = 9
+ if (user.dir == 4)
+ P.dir = 10
+ if (user.dir == 5)
+ P.dir = 8
+ else
+ P.dir = user.dir
P.x = src.x
P.y = src.y
P.z = src.z
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index a74299cfb69..f16106cef99 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -327,16 +327,20 @@
"[user] drills a hole in \the [src] and pushes \a [P] into the void", \
"\blue You have finished drilling in \the [src] and push the [P] into the void.", \
"You hear ratchet.")
- /*
- new /obj/item/pipe(loc, make_from=src)
- for (var/obj/machinery/meter/meter in T)
- if (meter.target == src)
- new /obj/item/pipe_meter(T)
- del(meter)
- qdel(src)
- */
+
user.drop_item()
- P.dir = user.dir
+ if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm
+ P.dir = 5
+ if (user.dir == 1)
+ P.dir = 6
+ if (user.dir == 2)
+ P.dir = 9
+ if (user.dir == 4)
+ P.dir = 10
+ if (user.dir == 5)
+ P.dir = 8
+ else
+ P.dir = user.dir
P.x = src.x
P.y = src.y
P.z = src.z
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 5e4042c3870..4f874619a16 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -23,6 +23,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
+ /client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
@@ -168,6 +169,7 @@ var/list/admin_verbs_rejuv = list(
var/list/admin_verbs_mod = list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
+ /client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
/client/proc/toggledebuglogs,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 39f983fe3eb..83f43ba6d9c 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -12,7 +12,7 @@
//shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm
/client/proc/cmd_admin_pm_panel()
set category = "Admin"
- set name = "Admin PM"
+ set name = "Admin PM Name"
if(!holder)
src << "Error: Admin-PM-Panel: Only administrators may use this command."
return
@@ -32,6 +32,29 @@
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!
+//shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm
+/client/proc/cmd_admin_pm_by_key_panel()
+ set category = "Admin"
+ set name = "Admin PM Key"
+ if(!holder)
+ src << "Error: Admin-PM-Panel: Only administrators may use this command."
+ return
+ var/list/client/targets[0]
+ for(var/client/T)
+ if(T.mob)
+ if(istype(T.mob, /mob/new_player))
+ targets["[T] - (New Player)"] = T
+ else if(istype(T.mob, /mob/dead/observer))
+ targets["[T] - [T.mob.name](Ghost)"] = T
+ else
+ targets["[T] - [T.mob.real_name](as [T.mob.name])"] = 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
+ 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!
+
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
//Fetching a message if needed. src is the sender and C is the target client
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index 3a55077f695..7281163dc5b 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -61,7 +61,7 @@
mob.antibodies |= antigen
if(mob.radiation > 50)
if(prob(1))
- majormutate()
+ majormutateinactivate(mob)
//Space antibiotics stop disease completely
if(mob.reagents.has_reagent("spaceacillin"))
@@ -117,6 +117,26 @@
if (prob(5) && all_species.len)
affected_species = get_infectable_species()
+/datum/disease2/disease/proc/majormutateinactivate(var/mob/living/carbon/mob) //Bone White - Duplicate of majormutate() with adminlogs, for use only in activate()
+ var/oldID = uniqueID
+ uniqueID = rand(0,10000)
+ var/datum/disease2/effectholder/holder = pick(effects)
+ holder.majormutate()
+ if (prob(5))
+ var/oldAntigen = antigen
+ antigen = text2num(pick(ANTIGENS))
+ antigen |= text2num(pick(ANTIGENS))
+ log_admin("Stamm #[oldID] ([oldAntigen]) mutated antigens in [mob.name] to Stamm #[uniqueID] ([antigen])")
+ message_admins("Stamm #[oldID] ([oldAntigen]) mutated antigens in [mob.name] to Stamm #[uniqueID] ([antigen])")
+ else if (prob(10) && all_species.len)
+ var/old_species = affected_species
+ affected_species = get_infectable_species()
+ log_admin("Stamm #[oldID] ([old_species]) mutated affected species in [mob.name] to Stamm #[uniqueID] ([affected_species])")
+ message_admins("Stamm #[oldID] ([old_species]) mutated affected species in [mob.name] to Stamm #[uniqueID] ([affected_species])")
+ else
+ log_admin("Stamm #[oldID] mutated in [mob.name] to Stamm #[uniqueID] ([antigen])")
+ message_admins("Stamm #[oldID] mutated in a [mob.name] to Stamm #[uniqueID] ([antigen])")
+
/datum/disease2/disease/proc/getcopy()
var/datum/disease2/disease/disease = new /datum/disease2/disease
disease.infectionchance = infectionchance