diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 5d5307cd50d..cfe37505e1c 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -884,3 +884,9 @@ proc/sort_atoms_by_layer(var/list/atoms)
icon = J
return J
return 0
+
+//Hook, override to run code on- wait this is images
+//Images have dir without being an atom, so they get their own definition.
+//Lame.
+/image/proc/setDir(newdir)
+ dir = newdir
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 0df047cdca3..e843fcf6a3c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -81,6 +81,10 @@
reagents = null
invisibility = 101
return ..()
+
+//Hook for running code when a dir change occurs
+/atom/proc/setDir(newdir)
+ dir = newdir
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 6e1fe9126fd..f3dc1cf4775 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -232,6 +232,10 @@
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more.")
return 0
return 1
+
+//Like for /atoms, but clients are their own snowflake FUCK
+/client/proc/setDir(newdir)
+ dir = newdir
/client/proc/handle_spam_prevention(var/message, var/mute_type, var/throttle = 0)
if(throttle)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index 757c8dfc1d4..8657a2529f2 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -195,7 +195,7 @@
to_chat(user, "You return the wisp to the lantern.")
if(wisp.orbiting)
- var/atom/A = wisp.orbiting.orbiting
+ var/atom/A = wisp.orbiting
if(isliving(A))
var/mob/living/M = A
M.sight &= ~SEE_MOBS
@@ -253,9 +253,9 @@
user.forceMove(get_turf(linked))
feedback_add_details("warp_cube","[src.type]")
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
- smoke.set_up(1, 0, user.loc)
- smoke.start()
+ var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
+ smoke2.set_up(1, 0, user.loc)
+ smoke2.start()
/obj/item/device/warp_cube/red
name = "red cube"
@@ -317,4 +317,63 @@
/obj/item/projectile/hook/Destroy()
qdel(chain)
- return ..()
\ No newline at end of file
+ return ..()
+
+//Immortality Talisman
+
+/obj/item/device/immortality_talisman
+ name = "Immortality Talisman"
+ desc = "A dread talisman that can render you completely invulnerable."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "talisman"
+ actions_types = list(/datum/action/item_action/immortality)
+ var/cooldown = 0
+
+/datum/action/item_action/immortality
+ name = "Immortality"
+
+/obj/item/device/immortality_talisman/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
+
+/obj/item/device/immortality_talisman/attack_self(mob/user)
+ if(cooldown < world.time)
+ feedback_add_details("immortality_talisman","U") // usage
+ cooldown = world.time + 600
+ user.visible_message("[user] vanishes from reality, leaving a a hole in their place!")
+ var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
+ Z.name = "hole in reality"
+ Z.desc = "It's shaped an awful lot like [user.name]."
+ Z.setDir(user.dir)
+ user.forceMove(Z)
+ user.notransform = 1
+ user.status_flags |= GODMODE
+ spawn(100)
+ user.status_flags &= ~GODMODE
+ user.notransform = 0
+ user.forceMove(get_turf(Z))
+ user.visible_message("[user] pops back into reality!")
+ Z.can_destroy = TRUE
+ qdel(Z)
+
+/obj/effect/immortality_talisman
+ icon_state = "blank"
+ icon = 'icons/effects/effects.dmi'
+ var/can_destroy = FALSE
+
+/obj/effect/immortality_talisman/attackby()
+ return
+
+/obj/effect/immortality_talisman/ex_act()
+ return
+
+/obj/effect/immortality_talisman/singularity_pull()
+ return 0
+
+/obj/effect/immortality_talisman/Destroy(force)
+ if(!can_destroy && !force)
+ return QDEL_HINT_LETMELIVE
+ else
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 61da8dc4d46..801b93d094f 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -52,7 +52,7 @@
if(15)
new /obj/item/weapon/guardiancreator(src)
if(16)
- new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src)/*
+ new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src)
if(17)
new /obj/item/device/warp_cube/red(src)
if(18)
@@ -70,4 +70,4 @@
new /obj/item/clothing/head/helmet/space/rig/ert/paranormal/inquisitor(src)
new /obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor(src)
if(24)
- new /obj/item/weapon/spellbook/oneuse/summonitem(src)*/
\ No newline at end of file
+ new /obj/item/weapon/spellbook/oneuse/summonitem(src)
\ No newline at end of file
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 93a175f3efc..a7962c37ec1 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ