diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 6aaedf5bd68..b18b912c6b5 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -375,7 +375,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
revert_cast(user)
return
- perform(targets)
+ perform(targets, user=user)
return
@@ -390,7 +390,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
revert_cast()
return
- perform(targets)
+ perform(targets, user=user)
return
diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm
index 522bb62a9fa..badf94d60d6 100644
--- a/code/datums/spells/area_teleport.dm
+++ b/code/datums/spells/area_teleport.dm
@@ -8,7 +8,7 @@
var/sound1 = "sound/weapons/ZapBang.ogg"
var/sound2 = "sound/weapons/ZapBang.ogg"
-/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1)
+/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
var/thearea = before_cast(targets)
if(!thearea || !cast_check(1))
revert_cast()
diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
index a972c6e32f7..0b23b12b9f2 100644
--- a/code/datums/spells/bloodcrawl.dm
+++ b/code/datums/spells/bloodcrawl.dm
@@ -15,7 +15,7 @@
/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr)
for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user)))
if(target.can_bloodcrawl_in())
- perform(target)
+ perform(target, user = user)
return
revert_cast()
to_chat(user, "There must be a nearby source of blood!")
diff --git a/code/datums/spells/dumbfire.dm b/code/datums/spells/dumbfire.dm
index e4a3d2f56c0..27969c9a1ab 100644
--- a/code/datums/spells/dumbfire.dm
+++ b/code/datums/spells/dumbfire.dm
@@ -28,7 +28,7 @@
if(new_turf.density)
break
T = new_turf
- perform(list(T))
+ perform(list(T), user = user)
/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr)
diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm
index 55d607d852e..258925653d8 100644
--- a/code/datums/spells/projectile.dm
+++ b/code/datums/spells/projectile.dm
@@ -75,7 +75,7 @@
qdel(trail)
if(projectile.loc in range(target.loc,proj_trigger_range))
- projectile.perform(list(target))
+ projectile.perform(list(target), user = user)
break
current_loc = projectile.loc
diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm
index 6c21153bb83..bba1f22cb1a 100644
--- a/code/datums/spells/trigger.dm
+++ b/code/datums/spells/trigger.dm
@@ -22,8 +22,8 @@
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
for(var/obj/effect/proc_holder/spell/spell in contents)
- spell.perform(list(target),0)
+ spell.perform(list(target), 0, user = user)
for(var/obj/effect/proc_holder/spell/spell in linked_spells)
- spell.perform(list(target),0)
+ spell.perform(list(target), 0, user = user)
return
\ No newline at end of file
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 778fed2ef9f..fd57ae5b471 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -296,7 +296,7 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
if(!targets.len)
@@ -540,7 +540,7 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr)
if(!ishuman(user)) return
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index a194ddfeed1..ed18f2acb58 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -28,17 +28,17 @@
action_icon_state = "genetic_morph"
-/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets)
- if(!ishuman(usr)) return
+/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets, mob/user = usr)
+ if(!ishuman(user)) return
- if(istype(usr.loc,/mob/))
- to_chat(usr, "You can't change your appearance right now!")
+ if(istype(user.loc,/mob/))
+ to_chat(user, "You can't change your appearance right now!")
return
- var/mob/living/carbon/human/M=usr
+ var/mob/living/carbon/human/M = user
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = M.get_int_organ(/obj/item/organ/internal/eyes)
- var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
+ var/new_gender = alert(user, "Please select gender.", "Character Generation", "Male", "Female")
if(new_gender)
if(new_gender == "Male")
M.change_gender(MALE)
@@ -219,7 +219,7 @@
validtargets += M
if(!validtargets.len)
- to_chat(usr, "There are no valid targets!")
+ to_chat(user, "There are no valid targets!")
start_recharge()
return
@@ -229,24 +229,24 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
-/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets)
- if(!ishuman(usr)) return
+/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets, mob/user = usr)
+ if(!ishuman(user)) return
var/say = input("What do you wish to say") as text|null
if(!say)
return
say = strip_html(say)
for(var/mob/living/target in targets)
- log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]")
+ log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]")
if(REMOTE_TALK in target.mutations)
- target.show_message("You hear [usr.real_name]'s voice: [say]")
+ target.show_message("You hear [user.real_name]'s voice: [say]")
else
target.show_message("You hear a voice that seems to echo around the room: [say]")
- usr.show_message("You project your mind into [target.real_name]: [say]")
+ user.show_message("You project your mind into [target.real_name]: [say]")
for(var/mob/dead/observer/G in player_list)
- G.show_message("Telepathic message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]")
+ G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]")
/datum/dna/gene/basic/grant_spell/remoteview
name="Remote Viewing"
@@ -283,39 +283,39 @@
if(REMOTE_VIEW in M.mutations)
remoteviewers += M
if(!remoteviewers.len || remoteviewers.len == 1)
- to_chat(usr, "No valid targets with remote view were found!")
+ to_chat(user, "No valid targets with remote view were found!")
start_recharge()
return
targets += input("Choose the target to spy on.", "Targeting") as mob in remoteviewers
- perform(targets)
+ perform(targets, user = user)
-/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets)
- var/mob/living/carbon/human/user
- if(ishuman(usr))
- user = usr
+/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets, mob/user = usr)
+ var/mob/living/carbon/human/H
+ if(ishuman(user))
+ H = user
else
return
var/mob/target
- if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/))
- to_chat(user, "Your mind is too busy with that telekinetic grab.")
- user.remoteview_target = null
- user.reset_view(0)
+ if(istype(H.l_hand, /obj/item/tk_grab) || istype(H.r_hand, /obj/item/tk_grab/))
+ to_chat(H, "Your mind is too busy with that telekinetic grab.")
+ H.remoteview_target = null
+ H.reset_view(0)
return
- if(user.client.eye != user.client.mob)
- user.remoteview_target = null
- user.reset_view(0)
+ if(H.client.eye != user.client.mob)
+ H.remoteview_target = null
+ H.reset_view(0)
return
for(var/mob/living/L in targets)
target = L
if(target)
- user.remoteview_target = target
- user.reset_view(target)
+ H.remoteview_target = target
+ H.reset_view(target)
else
- user.remoteview_target = null
- user.reset_view(0)
+ H.remoteview_target = null
+ H.reset_view(0)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 17f26d8753d..eb3aed6485b 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -117,7 +117,7 @@
revert_cast(user)
return
- perform(list(T))
+ perform(list(T), user = user)
/obj/effect/proc_holder/spell/vampire/self/choose_targets(mob/user = usr)
perform(list(user))
@@ -131,7 +131,7 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
/datum/vampire_passive
var/gain_desc
@@ -387,7 +387,7 @@
for(var/i = locs.len + 1 to num_bats)
locs += user.loc
- perform(locs)
+ perform(locs, user = user)
/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets, mob/user = usr)
for(var/T in targets)
@@ -492,7 +492,7 @@
to_chat(user, "\red You cannot find darkness to step to.")
return
- perform(turfs)
+ perform(turfs, user = user)
/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets, mob/user = usr)
if(usr.buckled)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index ed0092cf60d..9f33ea61a04 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -49,30 +49,13 @@
return 1
/obj/structure/closet/proc/dump_contents()
- //Cham Projector Exception
- for(var/obj/effect/dummy/chameleon/AD in src)
- AD.forceMove(loc)
-
- for(var/obj/I in src)
- I.forceMove(loc)
-
- for(var/mob/M in src)
- moveMob(M, loc)
- if(M.client)
- M.client.eye = M.client.mob
- M.client.perspective = MOB_PERSPECTIVE
-
-/obj/structure/closet/proc/moveMob(var/mob/M, var/atom/destination)
- loc.Exited(M)
- M.loc = destination
- if(isturf(loc))
- loc.Entered(M, src, ignoreRest = 1)
- else
- loc.Entered(M, src)
- for(var/atom/movable/AM in loc)
- if(istype(AM, /obj/item))
- continue
- AM.Crossed(M)
+ var/turf/T = get_turf(src)
+ for(var/atom/movable/AM in src)
+ AM.forceMove(T)
+ if(throwing) // you keep some momentum when getting out of a thrown closet
+ step(AM, dir)
+ if(throwing)
+ throwing = 0
/obj/structure/closet/proc/open()
if(src.opened)
@@ -126,7 +109,7 @@
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
- moveMob(M, src)
+ M.forceMove(src)
itemcount++
src.icon_state = src.icon_closed
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 3f49d3e3bde..f08f0a6f7e5 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -60,10 +60,9 @@
qdel(src)
/obj/structure/closet/statue/dump_contents()
-
- if(istype(src.loc, /mob/living/simple_animal/hostile/statue))
- var/mob/living/simple_animal/hostile/statue/S = src.loc
- src.loc = S.loc
+ if(istype(loc, /mob/living/simple_animal/hostile/statue))
+ var/mob/living/simple_animal/hostile/statue/S = loc
+ forceMove(S.loc)
if(S.mind)
for(var/mob/M in contents)
S.mind.transfer_to(M)
@@ -71,24 +70,19 @@
break
qdel(S)
-
- for(var/obj/O in src)
- O.loc = src.loc
-
for(var/mob/living/M in src)
- M.loc = src.loc
+ M.forceMove(loc)
M.disabilities -= MUTE
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
if(M.client)
M.client.eye = M.client.mob
M.client.perspective = MOB_PERSPECTIVE
-
+
+ ..()
/obj/structure/closet/statue/open()
return
-
-
/obj/structure/closet/statue/open()
return
diff --git a/code/modules/mining/lavaland/colossus_loot.dm b/code/modules/mining/lavaland/colossus_loot.dm
index 5df742bd9f6..d680edd4def 100644
--- a/code/modules/mining/lavaland/colossus_loot.dm
+++ b/code/modules/mining/lavaland/colossus_loot.dm
@@ -483,11 +483,12 @@
if(!isfloorturf(user.loc))
return
var/datum/mind/target_mind = user.mind
+ var/mob/living/current = user // Saving the current mob here to gib as usr seems to get confused after the mind's been transferred, due to delay in transfer_to
for(var/i in user)
if(istype(i, /obj/structure/closet/stasis))
var/obj/structure/closet/stasis/S = i
S.dump_contents(0)
qdel(S)
break
- user.gib()
+ current.gib()
target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)