diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 31a72c2a65c..fe46f4e01b3 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -398,6 +398,13 @@ var/list/uplink_items = list()
cost = 5
excludefrom = list(/datum/game_mode/traitor/double_agents)
+/datum/uplink_item/device_tools/rad_laser
+ name = "Radioactive Microlaser"
+ desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a powerful burst of radiation, which, after a short delay, can incapitate all but the most protected of humanoids. \
+ It has two settings: intensity, which controls the power of the radiation, and wavelength, which controls how long the radiation delay is."
+ item = /obj/item/device/rad_laser
+ cost = 4
+
/datum/uplink_item/device_tools/syndicate_detonator
name = "Syndicate Detonator"
desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 31a6bcab760..83c900bee2f 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -87,21 +87,21 @@
if(1.0)
for(var/atom/movable/A in src)
A.loc = loc
- ex_act(severity)
+ A.ex_act(severity)
qdel(src)
return
if(2.0)
if(prob(50))
for(var/atom/movable/A in src)
A.loc = loc
- ex_act(severity)
+ A.ex_act(severity)
qdel(src)
return
if(3.0)
if(prob(25))
for(var/atom/movable/A in src)
A.loc = loc
- ex_act(severity)
+ A.ex_act(severity)
qdel(src)
@@ -131,11 +131,6 @@
..()
open_machine()
-/obj/machinery/sleeper/Destroy()
- var/turf/T = loc
- T.contents += contents
- ..()
-
/obj/machinery/sleeper/attack_hand(mob/user)
if(..())
return
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 2f5cb7d54b6..f5612c6aef8 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -116,6 +116,8 @@ Class Procs:
/obj/machinery/Destroy()
machines.Remove(src)
+ if(occupant)
+ open_machine()
..()
/obj/machinery/process()//If you dont use process or power why are you here
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 695fd3105aa..eb5a33d17d3 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -4,6 +4,7 @@ Miscellaneous traitor devices
BATTERER
+RADIOACTIVE MICROLASER
*/
@@ -56,6 +57,90 @@ effective or pretty fucking useless.
if(times_used >= max_uses)
icon_state = "battererburnt"
+/*
+ The radioactive microlaser, a device disguised as a health analyzer used to irradiate people.
+ The strength of the radiation is determined by the 'intensity' setting, while the delay between
+ the scan and the irradiation kicking in is determined by the wavelength.
+ Each scan will cause the microlaser to have a brief cooldown period. Higher intensity will increase
+ the cooldown, while higher wavelength will decrease it.
+ Wavelength is also slightly increased by the intensity as well.
+*/
+
+/obj/item/device/rad_laser
+ name = "health analyzer"
+ icon_state = "health"
+ item_state = "analyzer"
+ desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ throwforce = 3
+ w_class = 1.0
+ throw_speed = 3
+ throw_range = 7
+ m_amt = 400
+ origin_tech = "magnets=3;biotech=5;syndicate=3"
+ var/intensity = 5 // how much damage the radiation does
+ var/wavelength = 10 // time it takes for the radiation to kick in, in seconds
+ var/used = 0 // is it cooling down?
+
+/obj/item/device/rad_laser/attack(mob/living/M as mob, mob/living/user as mob)
+ if(!used)
+ ..()
+ user.visible_message(text("[] has analyzed []'s vitals.", user, M))
+ var/cooldown = round(max(100,(((intensity*8)-(wavelength/2))+(intensity*2))*10))
+ used = 1
+ icon_state = "health1"
+ handle_cooldown(cooldown) // splits off to handle the cooldown while handling wavelength
+ spawn((wavelength+(intensity*4))*10)
+ if(M)
+ if(intensity >= 5)
+ M.apply_effect(round(intensity/1.5), PARALYZE)
+ M.apply_effect(intensity*10, IRRADIATE)
+ else
+ user << "The radioactive microlaser is still recharging."
+
+/obj/item/device/rad_laser/proc/handle_cooldown(var/cooldown)
+ spawn(cooldown)
+ used = 0
+ icon_state = "health"
+
+/obj/item/device/rad_laser/attack_self(mob/user as mob)
+ ..()
+ interact(user)
+
+/obj/item/device/rad_laser/interact(mob/user as mob)
+ user.set_machine(src)
+
+ var/cooldown = round(max(10,((intensity*8)-(wavelength/2))+(intensity*2)))
+ var/dat = {"
+ Radiation Intensity: -- [intensity] ++
+ Radiation Wavelength: -- [(wavelength+(intensity*4))] ++
+ Laser Cooldown: [cooldown] Seconds
+ "}
+
+ var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/item/device/rad_laser/Topic(href, href_list)
+ if(!usr.canUseTopic(src))
+ return 1
+
+ usr.set_machine(src)
+
+ if(href_list["radint"])
+ var/amount = text2num(href_list["radint"])
+ amount += intensity
+ intensity = max(1,(min(10,amount)))
+
+ else if(href_list["radwav"])
+ var/amount = text2num(href_list["radwav"])
+ amount += wavelength
+ wavelength = max(1,(min(120,amount)))
+
+ updateUsrDialog()
+ add_fingerprint(usr)
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 79ccd28eec3..b22febb5900 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -521,6 +521,8 @@
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
else
return 0
@@ -559,16 +561,16 @@
if (istype(I, /obj/item/weapon/wrench))
table_destroy(2, user)
return
-
+
if (istype(I, /obj/item/weapon/storage/bag/tray))
var/obj/item/weapon/storage/bag/tray/T = I
if(T.contents.len > 0) // If the tray isn't empty
var/list/obj/item/oldContents = T.contents.Copy()
T.quick_empty()
-
+
for(var/obj/item/C in oldContents)
C.loc = src.loc
-
+
user.visible_message("[user] empties [I] on [src].")
return
// If the tray IS empty, continue on (tray will be placed on the table like other items)
diff --git a/config/admins.txt b/config/admins.txt
index c367783a872..e8a1826da82 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -59,4 +59,5 @@ hornygranny = Game Master
yota = Game Master
firecage = Game Master
donkieyo = Game Master
-argoneus = Game Master
\ No newline at end of file
+argoneus = Game Master
+paprka = Game Master
\ No newline at end of file
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 1e3090a1c63..db879f05ce4 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ