Skip to content

Commit 9a99142

Browse files
committed
Clean up implant-related code
1 parent cf9e09d commit 9a99142

File tree

29 files changed

+460
-446
lines changed

29 files changed

+460
-446
lines changed

code/__defines/misc.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
#define STATUS_HUD 2 // Alive, dead, diseased, etc.
5454
#define ID_HUD 3 // The job asigned to your ID.
5555
#define WANTED_HUD 4 // Wanted, released, paroled, security status.
56-
#define IMPLOYAL_HUD 5 // Loyality implant.
56+
#define IMPLOYAL_HUD 5 // Loyalty implant.
5757
#define IMPCHEM_HUD 6 // Chemical implant.
5858
#define IMPTRACK_HUD 7 // Tracking implant.
5959
#define SPECIALROLE_HUD 8 // AntagHUD image.

code/datums/uplink/uplink_sources.dm

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,16 @@ var/global/list/default_uplink_source_priority = list(
6868
name = "Implant"
6969
desc = "Teleports an uplink implant into your head. Costs 20% of the initial TC amount."
7070

71-
/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/H, var/amount)
72-
if(!istype(H))
71+
/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/recipient, var/amount)
72+
if(!istype(recipient))
7373
return SETUP_FAILED
7474

75-
var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD)
75+
var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(recipient, BP_HEAD)
7676
if(!head)
7777
return SETUP_FAILED
7878

79-
var/obj/item/implant/uplink/U = new(H, round(amount * 0.8))
80-
U.imp_in = H
81-
U.implanted = TRUE
82-
U.part = head
83-
LAZYADD(head.implants, U)
84-
85-
U.implanted(H) // This proc handles the installation feedback
79+
var/obj/item/implant/uplink/uplink_implant = new(recipient, round(amount * 0.8))
80+
uplink_implant.implant_in_mob(recipient, recipient, head)
8681

8782
/decl/uplink_source/unit
8883
name = "Uplink Unit"

code/game/machinery/computer/prisoner.dm

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,76 +7,86 @@
77
icon_screen = "explosive"
88
light_color = "#a91515"
99
initial_access = list(access_armory)
10-
var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
10+
var/locked = FALSE
1111

1212
/obj/machinery/computer/prisoner/interface_interact(user)
1313
interact(user)
1414
return TRUE
1515

1616
/obj/machinery/computer/prisoner/interact(var/mob/user)
17-
var/dat
17+
var/dat = list()
1818
dat += "<B>Prisoner Implant Manager System</B><BR>"
19-
if(screen == 0)
19+
if(locked)
2020
dat += "<HR><A href='byond://?src=\ref[src];lock=1'>Unlock Console</A>"
21-
else if(screen == 1)
21+
else
2222
dat += "<HR>Chemical Implants<BR>"
23-
var/turf/Tr = null
24-
for(var/obj/item/implant/chem/C in global.chem_implants)
25-
Tr = get_turf(C)
26-
if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
27-
if(!C.implanted) continue
28-
dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
29-
dat += "<A href='byond://?src=\ref[src];inject1=\ref[C]'>(<font color=red>(1)</font>)</A>"
30-
dat += "<A href='byond://?src=\ref[src];inject5=\ref[C]'>(<font color=red>(5)</font>)</A>"
31-
dat += "<A href='byond://?src=\ref[src];inject10=\ref[C]'>(<font color=red>(10)</font>)</A><BR>"
23+
for(var/obj/item/implant/chem/chem_implant in global.chem_implants)
24+
var/turf/implant_turf = get_turf(chem_implant)
25+
if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
26+
continue // Out of range
27+
if(!chem_implant.implanted)
28+
continue
29+
dat += "[chem_implant.imp_in.name] | Remaining Units: [chem_implant.reagents.total_volume] | Inject: "
30+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=1'>(<font color=red>(1)</font>)</A>"
31+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=5'>(<font color=red>(5)</font>)</A>"
32+
dat += "<A href='byond://?src=\ref[src];inject=\ref[chem_implant];amount=10'>(<font color=red>(10)</font>)</A><BR>"
3233
dat += "********************************<BR>"
3334
dat += "<HR>Tracking Implants<BR>"
34-
for(var/obj/item/implant/tracking/T in global.tracking_implants)
35-
Tr = get_turf(T)
36-
if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
37-
if(!T.implanted) continue
38-
var/loc_display = "Space"
39-
var/mob/living/M = T.imp_in
40-
if(!isspaceturf(M.loc))
41-
var/turf/mob_loc = get_turf(M)
42-
loc_display = mob_loc.loc
43-
if(T.malfunction)
35+
for(var/obj/item/implant/tracking/tracking_implant in global.tracking_implants)
36+
var/turf/implant_turf = get_turf(tracking_implant)
37+
if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
38+
continue // Out of range
39+
if(!tracking_implant.implanted)
40+
continue
41+
var/area/tracked_area = get_area(tracking_implant)
42+
var/loc_display = tracked_area.proper_name
43+
if(tracking_implant.malfunction)
4444
loc_display = pick(teleportlocs)
45-
dat += "ID: [T.id] | Location: [loc_display]<BR>"
46-
dat += "<A href='byond://?src=\ref[src];warn=\ref[T]'>(<font color=red><i>Message Holder</i></font>)</A> |<BR>"
45+
dat += "ID: [tracking_implant.id] | Location: [loc_display]<BR>"
46+
dat += "<A href='byond://?src=\ref[src];warn=\ref[tracking_implant]'>(<font color=red><i>Message Holder</i></font>)</A> |<BR>"
4747
dat += "********************************<BR>"
4848
dat += "<HR><A href='byond://?src=\ref[src];lock=1'>Lock Console</A>"
4949

50-
show_browser(user, dat, "window=computer;size=400x500")
50+
show_browser(user, JOINTEXT(dat), "window=computer;size=400x500")
5151
onclose(user, "computer")
5252

5353
/obj/machinery/computer/prisoner/OnTopic(mob/user, href_list)
5454
if((. = ..()))
5555
return
56-
. = TOPIC_REFRESH
5756

58-
if(href_list["inject1"])
59-
var/obj/item/implant/I = locate(href_list["inject1"])
60-
if(I) I.activate(1)
61-
62-
else if(href_list["inject5"])
63-
var/obj/item/implant/I = locate(href_list["inject5"])
64-
if(I) I.activate(5)
65-
66-
else if(href_list["inject10"])
67-
var/obj/item/implant/I = locate(href_list["inject10"])
68-
if(I) I.activate(10)
57+
if(href_list["inject"])
58+
var/obj/item/implant/chem/chem_implant = locate(href_list["inject"])
59+
if(!chem_implant)
60+
return TOPIC_REFRESH // evidently their copy of the UI is out of date
61+
if(!istype(chem_implant)) // exists but is not a chem implant
62+
// warn that this is likely an href hacking attempt
63+
PRINT_STACK_TRACE("Possible HREF hacking attempt, chem implant inject called on non-chem-implant!")
64+
message_admins("Possible HREF hacking attempt, chem implant inject called on [href_list["inject"]] by [user] (ckey [(user.ckey)])!")
65+
return TOPIC_HANDLED
66+
var/amount_to_inject = clamp(text2num(href_list["amount"]), 1, 10) // don't let href hacking give more than 10 units at once
67+
chem_implant.activate(amount_to_inject)
68+
return TOPIC_HANDLED
6969

7070
else if(href_list["lock"])
7171
if(allowed(user))
72-
screen = !screen
72+
locked = !locked
73+
return TOPIC_REFRESH
7374
else
7475
to_chat(user, "Unauthorized Access.")
76+
return TOPIC_HANDLED
7577

7678
else if(href_list["warn"])
7779
var/warning = sanitize(input(user,"Message:","Enter your message here!",""))
78-
if(!warning) return TOPIC_HANDLED
79-
var/obj/item/implant/I = locate(href_list["warn"])
80-
if(I?.imp_in)
81-
var/mob/living/victim = I.imp_in
82-
to_chat(victim, "<span class='notice'>You hear a voice in your head saying: '[warning]'</span>")
80+
if(!warning)
81+
return TOPIC_HANDLED
82+
var/obj/item/implant/tracking/tracker = locate(href_list["warn"])
83+
if(!tracker)
84+
return TOPIC_REFRESH // evidently their copy of the UI is out of date
85+
if(!istype(tracker)) // exists but is not a tracking implant
86+
// warn that this is likely an href hacking attempt
87+
PRINT_STACK_TRACE("Possible HREF hacking attempt, tracking implant warn called on non-tracking-implant!")
88+
message_admins("Possible HREF hacking attempt, tracking implant warn called on [href_list["warn"]] by [user] (ckey [(user.ckey)])!")
89+
return TOPIC_HANDLED
90+
to_chat(tracker.imp_in, SPAN_NOTICE("You hear a voice in your head saying: '[warning]'"))
91+
return TOPIC_HANDLED
92+
return TOPIC_NOACTION

code/game/machinery/teleporter.dm

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,13 @@
8686
for(var/obj/item/radio/beacon/radio in global.radio_beacons)
8787
if(!radio.functioning)
8888
continue
89-
var/turf/T = get_turf(radio)
90-
if (!T)
89+
var/turf/radio_turf = get_turf(radio)
90+
if (!radio_turf)
9191
continue
92-
if(!isPlayerLevel(T.z))
92+
if(!isPlayerLevel(radio_turf.z))
9393
continue
94-
var/tmpname = T.loc.name
94+
var/area/radio_area = get_area(radio)
95+
var/tmpname = radio_area.proper_name
9596
if(areaindex[tmpname])
9697
tmpname = "[tmpname] ([++areaindex[tmpname]])"
9798
else
@@ -101,22 +102,21 @@
101102
for (var/obj/item/implant/tracking/used_item in global.tracking_implants)
102103
if (!used_item.implanted || !ismob(used_item.loc))
103104
continue
105+
var/mob/victim = used_item.loc
106+
// Can only track dead people up to 10 minutes after death
107+
if (victim.stat == DEAD && world.time > victim.timeofdeath + 10 MINUTES)
108+
continue
109+
var/turf/victim_turf = get_turf(victim)
110+
if(!victim_turf)
111+
continue
112+
if(!isPlayerLevel(victim_turf.z))
113+
continue
114+
var/tmpname = victim.real_name
115+
if(areaindex[tmpname])
116+
tmpname = "[tmpname] ([++areaindex[tmpname]])"
104117
else
105-
var/mob/M = used_item.loc
106-
if (M.stat == DEAD)
107-
if (M.timeofdeath + 6000 < world.time)
108-
continue
109-
var/turf/T = get_turf(M)
110-
if(!T)
111-
continue
112-
if(!isPlayerLevel(T.z))
113-
continue
114-
var/tmpname = M.real_name
115-
if(areaindex[tmpname])
116-
tmpname = "[tmpname] ([++areaindex[tmpname]])"
117-
else
118-
areaindex[tmpname] = 1
119-
L[tmpname] = used_item
118+
areaindex[tmpname] = 1
119+
L[tmpname] = used_item
120120

121121
var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null
122122
if(!desc)
@@ -127,16 +127,16 @@
127127
audible_message(SPAN_NOTICE("Locked in."))
128128
return
129129

130-
/obj/machinery/computer/teleporter/verb/set_id(t as text)
130+
/obj/machinery/computer/teleporter/verb/set_id(new_tag as text)
131131
set category = "Object"
132132
set name = "Set teleporter ID"
133133
set src in oview(1)
134134
set desc = "ID Tag:"
135135

136136
if(stat & (NOPOWER|BROKEN) || !isliving(usr))
137137
return
138-
if (t)
139-
src.id = t
138+
if (new_tag)
139+
src.id = new_tag
140140
return
141141

142142
/obj/machinery/computer/teleporter/proc/target_lost()

code/game/objects/items/weapons/locator.dm

Lines changed: 61 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -34,79 +34,68 @@ Frequency:
3434
onclose(user, "radio")
3535
return
3636

37-
/obj/item/locator/Topic(href, href_list)
38-
..()
39-
if (usr.stat || usr.restrained())
37+
/obj/item/locator/OnTopic(mob/user, href_list, datum/topic_state/state)
38+
var/turf/current_location = get_turf(user) //What turf is the user on?
39+
if(!current_location || isAdminLevel(current_location.z)) //If turf was not found or they're on an admin Z-level
40+
to_chat(user, "\The [src] is malfunctioning.")
4041
return
41-
var/turf/current_location = get_turf(usr)//What turf is the user on?
42-
if(!current_location||current_location.z==2)//If turf was not found or they're on z level 2.
43-
to_chat(usr, "\The [src] is malfunctioning.")
42+
if(!CanPhysicallyInteract(user))
4443
return
45-
if ((usr.contents.Find(src) || (in_range(src, usr) && isturf(src.loc))))
46-
usr.set_machine(src)
47-
if (href_list["refresh"])
48-
src.temp = "<B>Persistent Signal Locator</B><HR>"
49-
var/turf/sr = get_turf(src)
50-
51-
if (sr)
52-
src.temp += "<B>Located Beacons:</B><BR>"
53-
54-
for(var/obj/item/radio/beacon/radio in global.radio_beacons)
55-
if(!radio.functioning)
56-
continue
57-
if (radio.frequency == src.frequency)
58-
var/turf/tr = get_turf(radio)
59-
if (tr.z == sr.z && tr)
60-
var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y))
61-
if (direct < 5)
62-
direct = "very strong"
63-
else
64-
if (direct < 10)
65-
direct = "strong"
66-
else
67-
if (direct < 20)
68-
direct = "weak"
69-
else
70-
direct = "very weak"
71-
src.temp += "[radio.code]-[dir2text(get_dir(sr, tr))]-[direct]<BR>"
72-
73-
src.temp += "<B>Extranneous Signals:</B><BR>"
74-
for (var/obj/item/implant/tracking/implant in global.tracking_implants)
75-
if (!implant.implanted || !(istype(implant.loc,/obj/item/organ/external) || ismob(implant.loc)))
76-
continue
77-
else
78-
var/mob/M = implant.loc
79-
if (M.stat == DEAD)
80-
if (M.timeofdeath + 6000 < world.time)
81-
continue
44+
user.set_machine(src)
45+
if (href_list["refresh"])
46+
src.temp = "<B>Persistent Signal Locator</B><HR>"
47+
var/turf/source_turf = get_turf(src)
48+
if (!source_turf)
49+
src.temp += "<B><FONT color='red'>Processing Error:</FONT></B> Unable to locate orbital position.<BR>"
50+
return TOPIC_REFRESH
51+
src.temp += "<B>Located Beacons:</B><BR>"
52+
for(var/obj/item/radio/beacon/radio in global.radio_beacons)
53+
if(!radio.functioning)
54+
continue
55+
if (radio.frequency != frequency)
56+
continue
57+
var/turf/radio_turf = get_turf(radio)
58+
if (radio_turf.z != source_turf.z || !radio_turf)
59+
continue
60+
var/distance
61+
switch(get_dist(radio_turf, source_turf))
62+
if(0 to 5)
63+
distance = "very strong"
64+
if(6 to 10)
65+
distance = "strong"
66+
if(11 to 20)
67+
distance = "weak"
68+
else
69+
continue
70+
if(distance)
71+
src.temp += "[radio.code]-[dir2text(get_dir(source_turf, radio_turf))]-[distance]<BR>"
8272

83-
var/turf/tr = get_turf(implant)
84-
if (tr.z == sr.z && tr)
85-
var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y))
86-
if (direct < 20)
87-
if (direct < 5)
88-
direct = "very strong"
89-
else
90-
if (direct < 10)
91-
direct = "strong"
92-
else
93-
direct = "weak"
94-
src.temp += "[implant.id]-[dir2text(get_dir(sr, tr))]-[direct]<BR>"
73+
src.temp += "<B>Extraneous Signals:</B><BR>"
74+
for (var/obj/item/implant/tracking/implant in global.tracking_implants)
75+
if (!implant.implanted || !(istype(implant.loc,/obj/item/organ/external) || ismob(implant.loc)))
76+
continue
77+
var/mob/victim = implant.loc
78+
// Don't show dead people that have been dead for a while
79+
if (victim.stat == DEAD && world.time > victim.timeofdeath + 10 MINUTES)
80+
continue
81+
var/turf/implant_turf = get_turf(implant)
82+
if (implant_turf?.z != source_turf.z)
83+
continue
84+
var/distance
85+
switch(get_dist(implant_turf, source_turf))
86+
if(0 to 5)
87+
distance = "very strong"
88+
if(6 to 10)
89+
distance = "strong"
90+
if(11 to 20)
91+
distance = "weak"
92+
if(distance)
93+
src.temp += "[implant.id]-[dir2text(get_dir(source_turf, implant_turf))]-[distance]<BR>"
9594

96-
src.temp += "<B>You are at \[[sr.x],[sr.y],[sr.z]\]</B> in orbital coordinates.<BR><BR><A href='byond://?src=\ref[src];refresh=1'>Refresh</A><BR>"
97-
else
98-
src.temp += "<B><FONT color='red'>Processing Error:</FONT></B> Unable to locate orbital position.<BR>"
99-
else
100-
if (href_list["freq"])
101-
src.frequency += text2num(href_list["freq"])
102-
src.frequency = sanitize_frequency(src.frequency)
103-
else
104-
if (href_list["temp"])
105-
src.temp = null
106-
if (ismob(src.loc))
107-
attack_self(src.loc)
108-
else
109-
for(var/mob/M in viewers(1, src))
110-
if (M.client)
111-
src.attack_self(M)
112-
return
95+
src.temp += "<B>You are at \[[source_turf.x],[source_turf.y],[source_turf.z]\]</B> in orbital coordinates.<BR><BR><A href='byond://?src=\ref[src];refresh=1'>Refresh</A><BR>"
96+
else if (href_list["freq"])
97+
src.frequency += text2num(href_list["freq"])
98+
src.frequency = sanitize_frequency(src.frequency)
99+
else if (href_list["temp"])
100+
src.temp = null
101+
return TOPIC_REFRESH

code/modules/client/preference_setup/loadout/lists/augmentations.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
custom_setup_proc = /obj/item/proc/AttemptAugmentation
99
custom_setup_proc_arguments = list(BP_CHEST)
1010

11-
/obj/item/proc/AttemptAugmentation(mob/user, target_zone)
11+
/obj/item/proc/AttemptAugmentation(mob/living/user, target_zone)
1212
to_chat(user, SPAN_DANGER("Was unable to augment you with \the [src]."))
1313
qdel(src)
1414

15-
/obj/item/implant/AttemptAugmentation(mob/user, target_zone)
15+
/obj/item/implant/AttemptAugmentation(mob/living/user, target_zone)
1616
if(can_implant(user, user, target_zone) && implant_in_mob(user, user, target_zone))
1717
var/obj/item/organ/organ = GET_EXTERNAL_ORGAN(user, target_zone)
1818
to_chat(user, SPAN_NOTICE("You have \a [src] implanted in your [organ.name]."))

0 commit comments

Comments
 (0)