/
tactical.dm
93 lines (77 loc) · 2.71 KB
/
tactical.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
///A simple component that replacess the user's appearance with that of the parent item when equipped.
/datum/component/tactical
///The allowed slots for the effect.
var/allowed_slots
///A cached of where the item is currently equipped.
var/current_slot
/datum/component/tactical/Initialize(allowed_slots)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.allowed_slots = allowed_slots
/datum/component/tactical/Destroy()
unmodify()
return ..()
/datum/component/tactical/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(modify))
var/obj/item/item = parent
if(ismob(item.loc))
var/mob/holder = item.loc
modify(item, holder, holder.get_slot_by_item(item))
/datum/component/tactical/UnregisterFromParent()
UnregisterSignal(parent, list(
COMSIG_ITEM_EQUIPPED,
))
unmodify()
/datum/component/tactical/proc/modify(obj/item/source, mob/user, slot)
SIGNAL_HANDLER
if(current_slot == slot)
return
if(allowed_slots && !(slot & allowed_slots))
if(current_slot)
unmodify(source, user)
return
RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(tactical_update))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(unmodify))
RegisterSignal(parent, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_icon_update))
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
current_slot = slot
on_icon_update(source)
/datum/component/tactical/proc/on_icon_update(obj/item/source)
SIGNAL_HANDLER
var/mob/user = source.loc
if(!istype(user))
return
user.remove_alt_appearance("sneaking_mission[REF(src)]")
var/obj/item/master = parent
var/image/image = image(master, loc = user)
image.copy_overlays(master)
image.override = TRUE
image.layer = ABOVE_MOB_LAYER
image.plane = FLOAT_PLANE
user.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission[REF(src)]", image)
/datum/component/tactical/proc/unmodify(obj/item/source, mob/user)
SIGNAL_HANDLER
if(!source)
source = parent
if(!user)
user = source.loc
if(!istype(user))
return
UnregisterSignal(source, list(
COMSIG_MOVABLE_Z_CHANGED,
COMSIG_ITEM_DROPPED,
COMSIG_MOVABLE_MOVED,
COMSIG_ATOM_UPDATED_ICON,
))
current_slot = null
user.remove_alt_appearance("sneaking_mission[REF(src)]")
///Checks if a mob is holding us, and if so we will modify our appearance to properly match w/ the mob.
/datum/component/tactical/proc/tactical_update(obj/item/source)
SIGNAL_HANDLER
if(!ismob(source.loc))
return
modify(source, source.loc, current_slot)
///We really want to make sure that, if things ever slightly breaks, that the alt appearance will be removed anyway.
/datum/component/tactical/proc/on_moved(obj/item/source, atom/oldloc, direction, forced)
SIGNAL_HANDLER
unmodify(source, oldloc)