diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm
index 4a5851d9036..3a6d9407f6d 100644
--- a/code/game/algorithm.dm
+++ b/code/game/algorithm.dm
@@ -191,3 +191,11 @@ proc/countJob(rank)
for(var/mob/living/silicon/ai/M in world)
if ((M.client && M.machine == subject))
subject.attack_ai(M)
+
+/proc/AutoUpdateTK(obj/subject)
+ if (subject!=null)
+ for(var/obj/item/tk_grab/T in world)
+ if (T.host)
+ var/mob/M = T.host
+ if(M.client && M.machine == subject)
+ subject.attack_hand(M)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 590fa2635b2..49892a3331e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -158,8 +158,19 @@ Class Procs:
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return 1
- if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon))
- return 1
+
+ var/norange = 0
+ if(istype(usr, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ if(istype(H.l_hand, /obj/item/tk_grab))
+ norange = 1
+ else if(istype(H.r_hand, /obj/item/tk_grab))
+ norange = 1
+
+ if(!norange)
+ if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon))
+ return 1
+
src.add_fingerprint(usr)
return 0
@@ -174,9 +185,9 @@ Class Procs:
return 1
if(user.lying || user.stat)
return 1
- if ( ! (istype(user, /mob/living/carbon/human) || \
- istype(user, /mob/living/silicon) || \
- istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
+ if ( ! (istype(usr, /mob/living/carbon/human) || \
+ istype(usr, /mob/living/silicon) || \
+ istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return 1
/*
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 7307c525518..4eff5bf31ac 100755
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -376,9 +376,18 @@ mob/proc/flash_weak_pain()
step_away(Metroid, user)
Metroid.canmove = 1
+ var/showname = "."
+ if(user)
+ showname = " by [user]."
+ if(!(user in viewers(M, null)))
+ showname = "."
for(var/mob/O in viewers(messagesource, null))
- O.show_message(text("\red [] has been attacked with [][] ", M, src, (user ? text(" by [].", user) : ".")), 1)
+ O.show_message(text("\red [] has been attacked with [][] ", M, src, showname), 1)
+
+ if(!showname && user)
+ if(user.client)
+ user << "\red You attack [M] with [src]. "
diff --git a/code/game/objects/items/tk_grab.dm b/code/game/objects/items/tk_grab.dm
index 920194386fe..a506cf43087 100644
--- a/code/game/objects/items/tk_grab.dm
+++ b/code/game/objects/items/tk_grab.dm
@@ -43,7 +43,7 @@
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)//TODO: go over this
if(!target || !user) return
- if(last_throw+4 > world.time) return
+ if(last_throw+3 > world.time) return
if(!host)
del(src)
return
@@ -51,19 +51,24 @@
del(src)
return
if(!focus)
- focus_object(target)
+ focus_object(target, user)
return
+ var/focusturf = get_turf(focus)
+ if(get_dist(focusturf, target) <= 1 && !istype(target, /turf))
+ target.attackby(focus, user, user:get_organ_target())
- if((get_dist(target, user) <= 16) && (get_dist(focus, user) <= 10))
+ else if(get_dist(focusturf, target) <= 16)
apply_focus_overlay()
focus.throw_at(target, 10, 1)
last_throw = world.time
return
- proc/focus_object(var/obj/target)
+ proc/focus_object(var/obj/target, var/mob/living/user)
if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
- if(target.anchored) return//No throwing anchored things
+ if(target.anchored)
+ target.attack_hand(user) // you can use shit now!
+ return//No throwing anchored things
focus = target
update_icon()
apply_focus_overlay()
diff --git a/code/game/objects/object_procs.dm b/code/game/objects/object_procs.dm
index 92e48974f4a..7e230546fcf 100644
--- a/code/game/objects/object_procs.dm
+++ b/code/game/objects/object_procs.dm
@@ -8,12 +8,21 @@
if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
src.attack_ai(usr)
+ // check for TK users
+ AutoUpdateTK(src)
+ if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
+ if(!(usr in nearby))
+ if(usr.client && usr.machine==src)
+ src.attack_hand(usr)
+
/obj/proc/updateDialog()
var/list/nearby = viewers(1, src)
for(var/mob/M in nearby)
if ((M.client && M.machine == src))
src.attack_hand(M)
AutoUpdateAI(src)
+ //AutoUpdateTK(src)
/obj/proc/update_icon()
return
diff --git a/code/game/objects/shooting_range.dm b/code/game/objects/shooting_range.dm
index 4af1363c874..d678e9d88c4 100644
--- a/code/game/objects/shooting_range.dm
+++ b/code/game/objects/shooting_range.dm
@@ -174,7 +174,7 @@
bmark.pixel_x--
bmark.pixel_y--
- if(Proj.damage >= 20)
+ if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
bmark.icon_state = "scorch"
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index baa8b5d0e0e..1aa5520c6aa 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -213,7 +213,7 @@ proc/check_panel(mob/M)
if (istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai))
if(M.hallucination < 15)
return 1
- return 0 */
+ return 0*/
/obj/fake_attacker
icon = null
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index ba8e3acc6e6..60ce612f9dc 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -1,12 +1,13 @@
/obj/item/weapon/gun/energy/gun
- icon_state = "energy"
- name = "\improper Energy Gun"
+ icon_state = "energystun100"
+ name = "energy gun"
desc = "A basic energy-based gun with two settings: Stun and kill."
fire_sound = 'Taser.ogg'
charge_cost = 100 //How much energy is needed to fire.
projectile_type = "/obj/item/projectile/energy/electrode"
origin_tech = "combat=3;magnets=2"
+ modifystate = "energystun"
var
mode = 0 //0 = stun, 1 = kill
@@ -19,14 +20,16 @@
mode = 1
charge_cost = 100
fire_sound = 'Laser.ogg'
- user << "\red [src] is now set to kill."
+ user << "\red [src.name] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
+ modifystate = "energykill"
if(1)
mode = 0
charge_cost = 100
fire_sound = 'Taser.ogg'
- user << "\red [src] is now set to stun."
+ user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
+ modifystate = "energystun"
update_icon()
return