diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 1f5c28d3c2..3bb752b55a 100755
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -104,7 +104,7 @@
H.update_action_buttons_icon()
if(implants)
for(var/implant_type in implants)
- var/obj/item/implant/I = new implant_type(H)
+ var/obj/item/implant/I = new implant_type
I.implant(H, null, TRUE)
H.update_body()
diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm
index 5fb777f9c5..6118428547 100644
--- a/code/datums/radiation_wave.dm
+++ b/code/datums/radiation_wave.dm
@@ -103,7 +103,6 @@
/obj/structure/cable,
/obj/machinery/atmospherics,
/obj/item/ammo_casing,
- /obj/item/implant,
/obj/singularity
))
if(!can_contaminate || blacklisted[thing.type])
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index d76552982c..f8cf9d5fa1 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -154,9 +154,9 @@
var/obj/item/U = new uplink_type(H, H.key, tc)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
- var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
+ var/obj/item/implant/weapons_auth/W = new
W.implant(H)
- var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
+ var/obj/item/implant/explosive/E = new
E.implant(H)
H.faction |= ROLE_SYNDICATE
H.update_icons()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 00a5c8941d..2339a1fc6f 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -228,7 +228,7 @@
dat += "
[src.active_record.fields["name"]]
"
dat += "Scan ID [src.active_record.fields["id"]] Clone
"
- var/obj/item/implant/health/H = locate(src.active_record.fields["imp"])
+ var/obj/item/implant/health/H = locate(active_record.fields["imp"])
if ((H) && (istype(H)))
dat += "Health Implant Data:
[H.sensehealth()]
"
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 0bb9f51811..1de985ca3a 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -124,7 +124,7 @@
L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R
for(var/obj/item/implant/tracking/I in GLOB.tracked_implants)
- if(!I.imp_in || !isliving(I.loc))
+ if(!I.imp_in || !isliving(I.imp_in))
continue
else
var/mob/living/M = I.imp_in
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 78bdded601..24ee6d0966 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -103,22 +103,10 @@
radio.name = "internal radio"
radio.subspace_transmission = subspace_transmission
radio.canhear_range = 0
- radio.resistance_flags |= INDESTRUCTIBLE
- radio.item_flags |= DROPDEL
if(radio_key)
radio.keyslot = new radio_key
radio.recalculateChannels()
-/obj/item/implant/radio/implant(mob/living/target, mob/user, silent = FALSE)
- . = ..()
- if(.)
- radio.forceMove(imp_in)
-
-/obj/item/implant/radio/removed(mob/living/source, silent = FALSE, special = 0)
- . = ..()
- if(.)
- radio.forceMove(src)
-
/obj/item/implant/radio/mining
radio_key = /obj/item/encryptionkey/headset_cargo
diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm
index ec6b4d64c3..739873af00 100644
--- a/code/game/objects/items/implants/implant_storage.dm
+++ b/code/game/objects/items/implants/implant_storage.dm
@@ -4,30 +4,44 @@
icon_state = "storage"
item_color = "r"
var/max_slot_stacking = 4
+ var/obj/item/storage/bluespace_pocket/pocket
/obj/item/implant/storage/activate()
. = ..()
- SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE)
+ SEND_SIGNAL(pocket, COMSIG_TRY_STORAGE_SHOW, imp_in, TRUE)
/obj/item/implant/storage/removed(source, silent = FALSE, special = 0)
- . = ..()
- if(.)
- if(!special)
- qdel(GetComponent(/datum/component/storage/concrete/implant))
+ if(!special)
+ qdel(pocket)
+ else
+ pocket?.moveToNullspace()
+ return ..()
/obj/item/implant/storage/implant(mob/living/target, mob/user, silent = FALSE)
for(var/X in target.implants)
if(istype(X, type))
var/obj/item/implant/storage/imp_e = X
- GET_COMPONENT_FROM(STR, /datum/component/storage, imp_e)
+ GET_COMPONENT_FROM(STR, /datum/component/storage, imp_e.pocket)
if(!STR || (STR && STR.max_items < max_slot_stacking))
- imp_e.AddComponent(/datum/component/storage/concrete/implant)
+ imp_e.pocket.AddComponent(/datum/component/storage/concrete/implant)
qdel(src)
return TRUE
return FALSE
- AddComponent(/datum/component/storage/concrete/implant)
+ . = ..()
+ if(.)
+ if(pocket)
+ pocket.forceMove(target)
+ else
+ pocket = new(target)
- return ..()
+/obj/item/storage/bluespace_pocket
+ name = "internal bluespace pocket"
+ icon_state = "pillbox"
+ w_class = WEIGHT_CLASS_TINY
+ desc = "A tiny yet spacious pocket, usually found implanted inside sneaky syndicate agents and nowhere else."
+ component_type = /datum/component/storage/concrete/implant
+ resistance_flags = INDESTRUCTIBLE //A bomb!
+ item_flags = DROPDEL
/obj/item/implanter/storage
name = "implanter (storage)"
diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm
index c1fb396529..7c34ae87bf 100644
--- a/code/game/objects/items/stacks/telecrystal.dm
+++ b/code/game/objects/items/stacks/telecrystal.dm
@@ -9,9 +9,10 @@
item_flags = NOBLUDGEON
/obj/item/stack/telecrystal/attack(mob/target, mob/user)
- if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not.
- for(var/obj/item/implant/uplink/I in target)
- if(I && I.imp_in)
+ if(target == user && isliving(user)) //You can't go around smacking people with crystals to find out if they have an uplink or not.
+ var/mob/living/L = user
+ for(var/obj/item/implant/uplink/I in L.implants)
+ if(I?.imp_in)
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, I)
if(hidden_uplink)
hidden_uplink.telecrystals += amount
diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
index e2b881d147..2bdef9c90a 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
@@ -52,5 +52,5 @@
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(!visualsOnly)
- var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
+ var/obj/item/implant/abductor/beamplant = new
beamplant.implant(H)
diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm
index 2f08824c0b..075b9f13bc 100644
--- a/code/modules/antagonists/overthrow/overthrow.dm
+++ b/code/modules/antagonists/overthrow/overthrow.dm
@@ -107,9 +107,9 @@
/datum/antagonist/overthrow/proc/equip_overthrow()
if(!owner || !owner.current || !ishuman(owner.current)) // only equip existing human overthrow members. This excludes the AI, in particular.
return
- var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current
+ var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current.implants
if(!S)
- S = new(owner.current)
+ S = new
S.implant(owner.current)
var/I = pick(possible_useful_items)
if(ispath(I)) // in case some admin decides to fuck the list up for fun
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index e6cae518b6..8a20a81555 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -245,7 +245,7 @@
if(!istype(M))
return
- var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M)
+ var/obj/item/implant/exile/Implant = new
Implant.implant(M)
/datum/antagonist/wizard/academy/create_objectives()
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 57d8420fa8..41434f7a04 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -210,8 +210,6 @@
if(4)
//Destroy Equipment
for (var/obj/item/I in user)
- if (istype(I, /obj/item/implant))
- continue
qdel(I)
if(5)
//Monkeying
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index c6d657b271..897bdb5f96 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -10,7 +10,7 @@
if(visualsOnly)
return
- var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)
+ var/obj/item/implant/mindshield/L = new
L.implant(H, null, 1)
var/obj/item/radio/R = H.ears
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 325c124867..6c961dc250 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -399,7 +399,7 @@
R.set_frequency(FREQ_CENTCOM)
R.freqlock = TRUE
- var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn
+ var/obj/item/implant/mindshield/L = new //Here you go Deuryn
L.implant(H, null, 1)
@@ -426,7 +426,7 @@
/datum/outfit/debug //Debug objs plus hardsuit
name = "Debug outfit"
- uniform = /obj/item/clothing/under/patriotsuit
+ uniform = /obj/item/clothing/under/patriotsuit
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
shoes = /obj/item/clothing/shoes/magboots/advance
suit_store = /obj/item/tank/internals/oxygen
diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm
index cd8930641f..cd8115ac7d 100644
--- a/code/modules/clothing/outfits/vr.dm
+++ b/code/modules/clothing/outfits/vr.dm
@@ -29,9 +29,9 @@
. = ..()
var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
- var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
+ var/obj/item/implant/weapons_auth/W = new
W.implant(H)
- var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
+ var/obj/item/implant/explosive/E = new
E.implant(H)
H.faction |= ROLE_SYNDICATE
H.update_icons()
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 15ff372c47..997b117b25 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -49,7 +49,7 @@
toggle_mode_action.Grant(src)
var/datum/action/innate/minedrone/dump_ore/dump_ore_action = new()
dump_ore_action.Grant(src)
- var/obj/item/implant/radio/mining/imp = new(src)
+ var/obj/item/implant/radio/mining/imp = new
imp.implant(src)
access_card = new /obj/item/card/id(src)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index a0f619a7d6..a034849a37 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -344,8 +344,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return message
/mob/living/proc/radio(message, message_mode, list/spans, language)
- var/obj/item/implant/radio/imp = locate() in src
- if(imp && imp.radio.on)
+ var/obj/item/implant/radio/imp = locate() in implants
+ if(imp?.radio.on)
if(message_mode == MODE_HEADSET)
imp.radio.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 807c52ea46..76bd647e58 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -49,7 +49,7 @@
. = ..()
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
hidden_uplink.telecrystals = 30
- var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src)
+ var/obj/item/implant/weapons_auth/W = new
W.implant(src)
/mob/living/simple_animal/drone/snowflake
diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm
index a946cbf45b..f047a7aed1 100644
--- a/code/modules/mob/living/simple_animal/hostile/wizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm
@@ -46,7 +46,8 @@
fireball.human_req = 0
fireball.player_lock = 0
AddSpell(fireball)
- implants += new /obj/item/implant/exile(src)
+ var/obj/item/implant/exile/I = new
+ I.implant(src, null, TRUE)
mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
mm.clothes_req = 0
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index ca12accbed..8129c9b92e 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -699,7 +699,7 @@
desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems."
/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
- var/obj/item/implant/radio/syndicate/imp = new(src)
+ var/obj/item/implant/radio/syndicate/imp = new
imp.implant(SM, user)
SM.access_card = new /obj/item/card/id/syndicate(SM)
@@ -963,7 +963,7 @@
to_chat(user, "You feed the potion to [M].")
to_chat(M, "Your mind tingles as you are fed the potion. You can hear radio waves now!")
- var/obj/item/implant/radio/slime/imp = new(src)
+ var/obj/item/implant/radio/slime/imp = new
imp.implant(M, user)
qdel(src)