Skip to content

Commit

Permalink
Ports 'Ports 'Pointing at something on yourself now shows the item'' (#…
Browse files Browse the repository at this point in the history
…2290)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Ports BeeStation/BeeStation-Hornet#8553, which
is in turn a port of tgstation/tgstation#68642

## Why It's Good For The Game

Good for rp, allows you to visually show off items without relying on
chat. Previous to this, it visually looked like you were pointing to
yourself, which could very easily lead to confusion.

## Changelog

:cl:
add: pointing at something on yourself now shows the item
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put
your name to the right of the first :cl: if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
  • Loading branch information
Skies-Of-Blue authored Sep 5, 2023
1 parent 9c1ceba commit 3a90cfe
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 56 deletions.
3 changes: 2 additions & 1 deletion code/__DEFINES/dcs/signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,8 @@
///from base of mob/swap_hand(): (obj/item)
#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
#define COMPONENT_BLOCK_SWAP (1<<0)

///from base of /mob/verb/pointed: (atom/A)
#define COMSIG_MOB_POINTED "mob_pointed"
///from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_RESIST "living_resist"
///from base of mob/living/look_up() (/mob/living)
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
/// Used in show_hud(); Please ensure this is the same as the maximum index.
#define HUD_VERSIONS 3

#define HOVER_OUTLINE_FILTER "hover_outline"

//1:1 HUD layout stuff
#define UI_BOXCRAFT "EAST-4:22,SOUTH+1:6"
#define UI_BOXAREA "EAST-4:6,SOUTH+1:6"
Expand Down
5 changes: 5 additions & 0 deletions code/game/atoms.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1516,6 +1516,11 @@
custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags)
custom_materials[custom_material] += materials[x] * multiplier

/// Returns the indice in filters of the given filter name.
/// If it is not found, returns null.
/atom/proc/get_filter_index(name)
return filter_data?.Find(name)

/**
* Returns true if this atom has gravity for the passed in turf
*
Expand Down
15 changes: 0 additions & 15 deletions code/game/objects/effects/decals/misc.dm
Original file line number Diff line number Diff line change
@@ -1,18 +1,3 @@
/obj/effect/temp_visual/point
name = "pointer"
icon = 'icons/hud/screen_gen.dmi'
icon_state = "arrow"
layer = POINT_LAYER
duration = 25

/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
. = ..()
var/atom/old_loc = loc
abstract_move(get_turf(src))
pixel_x = old_loc.pixel_x
pixel_y = old_loc.pixel_y
invisibility = set_invis

//Used by spraybottles.
/obj/effect/decal/chempuff
name = "chemicals"
Expand Down
10 changes: 3 additions & 7 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -882,15 +882,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
colour = COLOR_BLUE_GRAY
else
colour = COLOR_BLUE_GRAY
if(outline_filter)
filters -= outline_filter
outline_filter = filter(type="outline", size=1, color=colour)
filters += outline_filter
add_filter(HOVER_OUTLINE_FILTER, 1, list(type="outline", size=1, color=colour))


/obj/item/proc/remove_outline()
if(outline_filter)
filters -= outline_filter
outline_filter = null
remove_filter(HOVER_OUTLINE_FILTER)

/// Called when a mob tries to use the item as a tool.Handles most checks.
/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
Expand Down
33 changes: 0 additions & 33 deletions code/modules/mob/mob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -565,39 +565,6 @@
var/msg = "<span class='smallnotice'>[src] makes eye contact with you.</span>"
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, examined_mob, msg), 3)

/**
* Point at an atom
*
* mob verbs are faster than object verbs. See
* [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716)
* for why this isn't atom/verb/pointed()
*
* note: ghosts can point, this is intended
*
* visible_message will handle invisibility properly
*
* overridden 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 FALSE
if(client && !(A in view(client.view, src)))
return FALSE
if(istype(A, /obj/effect/temp_visual/point))
return FALSE

var/turf/tile = get_turf(A)
if (!tile)
return FALSE

var/turf/our_tile = get_turf(src)
var/obj/visual = new /obj/effect/temp_visual/point(our_tile, invisibility)
animate(visual, pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, time = 1.7, easing = EASE_OUT)

return TRUE

///Can this mob resist (default FALSE)
/mob/proc/can_resist()
Expand Down
107 changes: 107 additions & 0 deletions code/modules/point/point.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#define POINT_TIME (2.5 SECONDS)

/**
* Point at an atom
*
* Intended to enable and standardise the pointing animation for all atoms
*
* Not intended as a replacement for the mob verb
*/
/atom/movable/proc/point_at(atom/pointed_atom)
if(!isturf(loc))
return

if (pointed_atom in src)
create_point_bubble(pointed_atom)
return

var/turf/tile = get_turf(pointed_atom)
if (!tile)
return

var/turf/our_tile = get_turf(src)
var/obj/visual = new /obj/effect/temp_visual/point(our_tile, invisibility)

animate(visual, pixel_x = (tile.x - our_tile.x) * world.icon_size + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * world.icon_size + pointed_atom.pixel_y, time = 1.7, easing = EASE_OUT)

/atom/movable/proc/create_point_bubble(atom/pointed_atom)
var/obj/effect/thought_bubble_effect = new

var/mutable_appearance/thought_bubble = mutable_appearance(
'icons/effects/effects.dmi',
"thought_bubble",
layer = POINT_LAYER,
appearance_flags = KEEP_APART,
)

var/mutable_appearance/pointed_atom_appearance = new(pointed_atom.appearance)
pointed_atom_appearance.blend_mode = BLEND_INSET_OVERLAY
pointed_atom_appearance.plane = thought_bubble.plane
pointed_atom_appearance.layer = FLOAT_LAYER
pointed_atom_appearance.pixel_x = 0
pointed_atom_appearance.pixel_y = 0
thought_bubble.overlays += pointed_atom_appearance

var/hover_outline_index = pointed_atom.get_filter_index(HOVER_OUTLINE_FILTER)
if (!isnull(hover_outline_index))
pointed_atom_appearance.filters.Cut(hover_outline_index, hover_outline_index + 1)

thought_bubble.pixel_x = 16
thought_bubble.pixel_y = 32
thought_bubble.alpha = 200
thought_bubble.mouse_opacity = MOUSE_OPACITY_TRANSPARENT

var/mutable_appearance/point_visual = mutable_appearance(
'icons/hud/screen_gen.dmi',
"arrow",
plane = thought_bubble.plane,
)

thought_bubble.overlays += point_visual

// vis_contents is used to preserve mouse opacity
thought_bubble_effect.appearance = thought_bubble
vis_contents += thought_bubble_effect

QDEL_IN(thought_bubble_effect, POINT_TIME)

/obj/effect/temp_visual/point
name = "pointer"
icon = 'icons/hud/screen_gen.dmi'
icon_state = "arrow"
layer = POINT_LAYER
duration = POINT_TIME

/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
. = ..()
var/atom/old_loc = loc
abstract_move(get_turf(src))
pixel_x = old_loc.pixel_x
pixel_y = old_loc.pixel_y
invisibility = set_invis

#undef POINT_TIME

/**
* Point at an atom
*
* mob verbs are faster than object verbs. See
* [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716)
* for why this isn't atom/verb/pointed()
*
* note: ghosts can point, this is intended
*
* visible_message will handle invisibility properly
*
* overridden 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(client && !(A in view(client.view, src)))
return FALSE
if(istype(A, /obj/effect/temp_visual/point))
return FALSE
point_at(A)
SEND_SIGNAL(src, COMSIG_MOB_POINTED, A)
return TRUE
Binary file modified icons/effects/effects.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions shiptest.dme
Original file line number Diff line number Diff line change
Expand Up @@ -2883,6 +2883,7 @@
#include "code\modules\plumbing\plumbers\reaction_chamber.dm"
#include "code\modules\plumbing\plumbers\splitters.dm"
#include "code\modules\plumbing\plumbers\synthesizer.dm"
#include "code\modules\point\point.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cell.dm"
Expand Down

0 comments on commit 3a90cfe

Please sign in to comment.