diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 1bf6a0a7908..375c0b7e5e5 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -577,7 +577,7 @@
log_message("Hit by [AM].")
if(isitem(AM))
var/obj/item/I = AM
- add_attack_logs(I.thrownby, OCCUPANT_LOGGING, "threw [AM] at mech [src]")
+ add_attack_logs(locateUID(I.thrownby), OCCUPANT_LOGGING, "threw [AM] at mech [src]")
. = ..()
/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 307234f6946..a6b2f0116e1 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -82,7 +82,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
// non-clothing items
var/datum/dog_fashion/dog_fashion = null
- var/mob/thrownby = null
+ /// UID of a /mob
+ var/thrownby
//So items can have custom embedd values
//Because customisation is king
@@ -651,7 +652,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
return hit_atom.hitby(src, 0, itempush, throwingdatum = throwingdatum)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force)
- thrownby = thrower
+ thrownby = thrower.UID()
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
. = ..(target, range, speed, thrower, spin, diagonals_first, callback, force)
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index a0d8aeadca4..1efd1fe797f 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -315,7 +315,7 @@
diceroll(user)
/obj/item/dice/throw_impact(atom/target)
- diceroll(thrownby)
+ diceroll(locateUID(thrownby))
. = ..()
/obj/item/dice/proc/diceroll(mob/user)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 52ed1e9c24c..090e09895d8 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -206,7 +206,7 @@
visible_message("[owner] Deflects [I] directly back at the thrower! It's a home run!", "You deflect [I] directly back at the thrower! It's a home run!")
playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
- I.throw_at(I.thrownby, 20, 20, owner)
+ I.throw_at(locateUID(I.thrownby), 20, 20, owner)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
lastdeflect = world.time + 3000
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index 311a0bac2d8..62087f91513 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -76,7 +76,7 @@
return
if(H.l_hand == src)
return
- var/mob/A = thrownby
+ var/mob/A = locateUID(thrownby)
if((H in GLOB.team_alpha) && (A in GLOB.team_alpha))
to_chat(A, "He's on your team!")
return
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index e5d4f501c5d..fefe8a4b144 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -119,7 +119,7 @@
/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
if(!..()) //was it caught by a mob?
if(seed)
- log_action(thrownby, hit_atom, "Thrown [src] at")
+ log_action(locateUID(thrownby), hit_atom, "Thrown [src] at")
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_throw_impact(src, hit_atom)
if(seed.get_gene(/datum/plant_gene/trait/squash))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 1c893fe6ef5..e567899fe97 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -537,7 +537,7 @@ emp_act
if(istype(AM, /obj/item))
I = AM
throwpower = I.throwforce
- if(I.thrownby == src) //No throwing stuff at yourself to trigger reactions
+ if(locateUID(I.thrownby) == src) //No throwing stuff at yourself to trigger reactions
return ..()
if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK))
hitpush = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 95642f9f3c6..a15c9095ea2 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -465,7 +465,7 @@
var/obj/item/I
if(istype(AM, /obj/item))
I = AM
- if(I.thrownby == H) //No throwing stuff at yourself to trigger the teleport
+ if(locateUID(I.thrownby) == H) //No throwing stuff at yourself to trigger the teleport
return 0
else
reactive_teleport(H)
@@ -610,7 +610,7 @@
var/obj/item/I
if(istype(AM, /obj/item))
I = AM
- if(I.thrownby == H) //No throwing stuff at yourself to make bananas
+ if(locateUID(I.thrownby) == H) //No throwing stuff at yourself to make bananas
return 0
else
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 6edcec8c385..4e1508e44ba 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -110,9 +110,9 @@
if(blocked)
return TRUE
-
- if(thrown_item.thrownby)
- add_attack_logs(thrown_item.thrownby, src, "Hit with thrown [thrown_item]", !thrown_item.throwforce ? ATKLOG_ALMOSTALL : null) // Only message if the person gets damages
+ var/mob/thrower = locateUID(thrown_item.thrownby)
+ if(thrower)
+ add_attack_logs(thrower, src, "Hit with thrown [thrown_item]", !thrown_item.throwforce ? ATKLOG_ALMOSTALL : null) // Only message if the person gets damages
if(nosell_hit)
return ..()
visible_message("[src] is hit by [thrown_item]!", "You're hit by [thrown_item]!")
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 45e3f76d0e2..61e416a3492 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -557,9 +557,9 @@
/mob/living/simple_animal/bot/ed209/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
- var/mob/living/carbon/human/H = I.thrownby
- retaliate(H)
+ var/mob/thrower = locateUID(I.thrownby)
+ if(I.throwforce < src.health && ishuman(thrower))
+ retaliate(thrower)
..()
/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A, params)
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 84a87fbd51f..b93c430d6ea 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -142,9 +142,9 @@
if(istype(AM, /obj/item))
playsound(src, honksound, 50, TRUE, -1)
var/obj/item/I = AM
- if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
- var/mob/living/carbon/human/H = I.thrownby
- retaliate(H)
+ var/mob/thrower = locateUID(I.thrownby)
+ if(I.throwforce < src.health && ishuman(thrower))
+ retaliate(thrower)
..()
/mob/living/simple_animal/bot/honkbot/proc/bike_horn() //use bike_horn
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index dbac3728a37..bf8660d35a5 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -230,9 +230,9 @@
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
- var/mob/living/carbon/human/H = I.thrownby
- retaliate(H)
+ var/mob/thrower = locateUID(I.thrownby)
+ if(I.throwforce < src.health && ishuman(thrower))
+ retaliate(thrower)
..()