diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index a40a9e16e55..799d5ee8ee0 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -190,7 +190,7 @@
Only used for swapping hands
*/
/mob/proc/MiddleClickOn(var/atom/A)
- A.point()
+ pointed(A)
return
// See click_override.dm
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 1dcd785db7d..fd54407f19e 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -111,7 +111,7 @@
if(istype(src, /mob/living/silicon/robot/drone))
// Drones cannot point.
return
- A.point()
+ pointed(A)
return
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index 4f80ff5e4fe..e7f0fb03cad 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -5,7 +5,7 @@
icon_state = "arrow"
layer = 16.0
anchored = 1
-
+ mouse_opacity = 0
// Used for spray that you spray at walls, tables, hydrovats etc
/obj/effect/decal/spraystill
diff --git a/code/game/verbs/atom_verbs.dm b/code/game/verbs/atom_verbs.dm
index b758f11cea1..4f77bf52f4c 100644
--- a/code/game/verbs/atom_verbs.dm
+++ b/code/game/verbs/atom_verbs.dm
@@ -6,31 +6,3 @@
if(Adjacent(usr))
usr.start_pulling(src)
return
-
-/atom/verb/point()
- set name = "Point To"
- set category = null
- set popup_menu = 0
- set src in oview()
- var/atom/this = src//detach proc from src
- src = null
-
- if(!usr || !isturf(usr.loc))
- return
- if(usr.stat || usr.restrained())
- return
- if(usr.status_flags & FAKEDEATH)
- return
- if(usr.next_move > world.time)
- return
-
- var/tile = get_turf(this)
- if (!tile)
- return
-
- var/P = new /obj/effect/decal/point(tile)
- usr.changeNext_move(CLICK_CD_POINT)
- spawn (20)
- if(P) qdel(P)
-
- usr.visible_message("[usr] points to [this]")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index b16e94e2abb..96df9455e00 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -630,4 +630,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 0
/mob/dead/observer/can_admin_interact()
- return check_rights(R_ADMIN, 0, src)
\ No newline at end of file
+ return check_rights(R_ADMIN, 0, src)
+
+//this is a mob verb instead of atom for performance reasons
+//see /mob/verb/examinate() in mob.dm for more info
+//overriden here and in /mob/living for different point span classes and sanity checks
+/mob/dead/observer/pointed(atom/A as mob|obj|turf in view())
+ if(!..())
+ return 0
+ usr.visible_message("[src] points to [A].")
+ return 1
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index abbe2d2cf3d..229e4c93d8a 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -518,9 +518,9 @@
if ("point")
if (!src.restrained())
- var/mob/M = null
+ var/atom/M = null
if (param)
- for (var/atom/A as mob|obj|turf|area in view(null, null))
+ for (var/atom/A as mob|obj|turf in view())
if (param == A.name)
M = A
break
@@ -528,11 +528,7 @@
if (!M)
message = "[src] points."
else
- M.point()
-
- if (M)
- message = "[src] points to [M]."
- else
+ pointed(M)
m_type = 1
if ("raise")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index ddc46419e7f..15a9f473212 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -25,6 +25,18 @@
special_role = null
current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now..(You don't remember who enslaved you)"
*/
+
+//same as above
+/mob/living/pointed(atom/A as mob|obj|turf in view())
+ if(src.stat || !src.canmove || src.restrained())
+ return 0
+ if(src.status_flags & FAKEDEATH)
+ return 0
+ if(!..())
+ return 0
+ visible_message("[src] points to [A]")
+ return 1
+
/mob/living/verb/succumb()
set hidden = 1
if (InCritical())
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 18c26f9cb4f..89dbeb14740 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -46,11 +46,6 @@
set src = usr.contents
return 0
-/mob/aiEye/point()
- set popup_menu = 0
- set src = usr.contents
- return 0
-
// Use this when setting the aiEye's location.
// It will also stream the chunk that the new loc is in.
/mob/aiEye/setLoc(var/T, var/cancel_tracking = 1)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 098f2f10914..c1cbd8d9671 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -73,6 +73,8 @@
/mob/visible_message(var/message, var/self_message, var/blind_message)
for(var/mob/M in viewers(src))
+ if(M.see_invisible < invisibility)
+ continue //can't view the invisible
var/msg = message
if(self_message && M==src)
msg = self_message
@@ -494,6 +496,31 @@ var/list/slot_equipment_priority = list( \
face_atom(A)
A.examine(src)
+//same as above
+//note: ghosts can point, this is intended
+//visible_message will handle invisibility properly
+//overriden here and in /mob/dead/observer for different point span classes and sanity checks
+/mob/verb/pointed(atom/A as mob|obj|turf in view())
+ set name = "Point To"
+ set category = "Object"
+
+ if(!src || !isturf(src.loc))
+ return 0
+ if(istype(A, /obj/effect/decal/point))
+ return 0
+
+ var/tile = get_turf(A)
+ if (!tile)
+ return 0
+
+ var/obj/P = new /obj/effect/decal/point(tile)
+ P.invisibility = invisibility
+ spawn (20)
+ if(P)
+ qdel(P)
+
+ return 1
+
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
if (!( L ))