diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 567eed9bf6..9814f3e46e 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -65,14 +65,14 @@ SUBSYSTEM_DEF(throwing)
var/last_move = 0
/datum/thrownthing/Destroy()
+ if(HAS_TRAIT_FROM(thrownthing, TRAIT_SPOOKY_THROW, "revenant"))
+ REMOVE_TRAIT(thrownthing, TRAIT_SPOOKY_THROW, "revenant")
SSthrowing.processing -= thrownthing
thrownthing.throwing = null
thrownthing = null
target = null
thrower = null
callback = null
- if(HAS_TRAIT(thrownthing, TRAIT_SPOOKY_THROW)
- REMOVE_TRAIT(thrownthing, TRAIT_SPOOKY_THROW)
return ..()
/datum/thrownthing/proc/tick()
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index f93d40bb04..2fa5a20d7a 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -449,6 +449,10 @@
// this must come before the screen objects only block, dunno why it wasn't before
if(over_object == M)
user_show_to_mob(M)
+ return
+ if(isrevenant(M))
+ RevenantThrow(over_object, M, source)
+ return
if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
dump_content_at(over_object, M)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index c9d471e82a..09a0fad645 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -492,13 +492,13 @@
return TRUE
//TODO: Better floating
-/atom/movable/proc/float(on, float_height)
- if(throwing)
+/atom/movable/proc/float(on, throw_override)
+ if(throwing || !throw_override)
return
if(on && (!(movement_type & FLOATING) || floating_need_update))
- animate(src, pixel_y = pixel_y + 2 + float_height, time = 10, loop = -1)
+ animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
sleep(10)
- animate(src, pixel_y = pixel_y - 2 - float_height, time = 10, loop = -1)
+ animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
if(!(movement_type & FLOATING))
setMovetype(movement_type | FLOATING)
else if (!on && movement_type & FLOATING)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 846e49682f..fa5ab19fba 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -469,22 +469,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
usr.FlushCurrentAction()
return TRUE //returning TRUE as a "is this overridden?" flag
if(isrevenant(usr))
- var/mob/living/simple_animal/revenant/spooker = usr
- if(!anchored && !spooker.telekinesis_cooldown)
- spooker.change_essence_amount(-5, FALSE, "telekinesis")
- spooker.stun(10)
- spooker.reveal(30)
- spooker.telekinesis_cooldown = TRUE
- float(TRUE, 1)
- sleep(10)
- safe_throw_at(over, 10, 2)
- ADD_TRAIT(src, TRAIT_SPOOKY_THROW)
- DoRevenantThrowEffects(over)
- log_combat(usr, over, "spooky telekinesised at", src)
- var/obj/effect/temp_visual/telekinesis/T = new(get_turf(src))
- T.color = purple
- addtimer(CALLBACK(src, /atom/movable.proc/float, FALSE), 2)
- addtimer(CALLBACK(spooker, /mob/living/simple_animal/revenant.proc/telekinesis_cooldown_end), 50)
+ if(RevenantThrow(over, usr, src))
return
if(!Adjacent(usr) || !over.Adjacent(usr))
@@ -493,12 +478,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
over.MouseDrop_T(src,usr)
return
-//Use this for effects you want to happen when a revenant throws itself, check the TRAIT_SPOOKY_THROW if you want to know if its still being thrown
-/obj/item/proc/DoRevenantThrowEffects(atom/target)
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- if(STR)
-
-
// called after an item is placed in an equipment slot
// user is mob that equipped it
// slot uses the slot_X defines found in setup.dm
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index a21c7780b2..4280e7105f 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -137,7 +137,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
. = ..()
/obj/item/clothing/mask/cigarette/DoRevenantThrowEffects(atom/target)
- attackby(src)
+ if(lit)
+ attackby()
+ else
+ light()
/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
if(!lit && smoketime > 0)
@@ -520,6 +523,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
overlay_state = pick(overlay_list)
update_icon()
+/obj/item/lighter/DoRevenantThrowEffects(atom/target)
+ set_lit()
+
/obj/item/lighter/suicide_act(mob/living/carbon/user)
if (lit)
user.visible_message("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index a2459bce9f..e29519406a 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -37,11 +37,14 @@
/obj/item/flashlight/attack_self(mob/user)
on = !on
update_brightness(user)
- playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
+ playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
- return 1
+ return TRUE
+
+/obj/item/flashlight/DoRevenantThrowEffects(atom/target)
+ attack_self()
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
if (user.eye_blind)
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 3470d5e2c8..a5a3762a4f 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -46,7 +46,7 @@
set_snowflake_from_config(id)
/obj/item/toy/plush/DoRevenantThrowEffects(atom/target)
- var/datum/component/squeak/squeaker = GetComponent(datum/component/squeak)
+ var/datum/component/squeak/squeaker = GetComponent(/datum/component/squeak)
squeaker.do_play_squeak(TRUE)
/obj/item/toy/plush/Initialize(mapload, set_snowflake_id)
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 6cd00f3434..1db5cdd526 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -44,12 +44,11 @@
START_PROCESSING(SSobj, src)
/obj/item/pneumatic_cannon/DoRevenantThrowEffects(atom/target)
- var/target
+ var/picked_target
var/list/possible_targets = range(3,src)
- target = pick(possible_targets)
+ picked_target = pick(possible_targets)
if(target)
- discharge = TRUE
- Fire(null, target)
+ Fire(null, picked_target)
/obj/item/pneumatic_cannon/process()
if(++charge_tick >= charge_ticks && charge_type)
@@ -148,7 +147,7 @@
if(!isliving(user))
return
var/discharge = 0
- if(!can_trigger_gun(user))
+ if(user && !can_trigger_gun(user))
return
if(!loadedItems || !loadedWeightClass)
if(user)
@@ -174,14 +173,13 @@
var/list/possible_targets = range(3,src)
target = pick(possible_targets)
discharge = TRUE
- if(!discharge)
+ if(!discharge && user)
user.visible_message("[user] fires \the [src]!", \
"You fire \the [src]!")
- if(user)
- log_combat(user, target, "fired at", src)
var/turf/T = get_target(target, get_turf(src))
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
if(user)
+ log_combat(user, target, "fired at", src)
fire_items(T, user)
else
fire_items(T)
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 92b222aed7..6b92b885bb 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -57,6 +57,9 @@
else
item_state = "[initial(item_state)]"
+/obj/item/weldingtool/DoRevenantThrowEffects(atom/target)
+ attack_self()
+
/obj/item/weldingtool/update_overlays()
. = ..()
if(change_icons)
@@ -208,12 +211,14 @@
//Switches the welder on
/obj/item/weldingtool/proc/switched_on(mob/user)
if(!status)
- to_chat(user, "[src] can't be turned on while unsecured!")
+ if(user)
+ to_chat(user, "[src] can't be turned on while unsecured!")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
- to_chat(user, "You switch [src] on.")
+ if(user)
+ to_chat(user, "You switch [src] on.")
playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 1a45663ff7..f4ad961d54 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -441,6 +441,30 @@
qdel(revenant)
..()
+/proc/RevenantThrow(over, mob/user, obj/item/throwable)
+ var/mob/living/simple_animal/revenant/spooker = user
+ if(!istype(throwable))
+ return
+ if(!throwable.anchored && !spooker.telekinesis_cooldown && spooker.castcheck(-5))
+ spooker.change_essence_amount(-5, FALSE, "telekinesis")
+ spooker.stun(20)
+ spooker.reveal(50)
+ spooker.telekinesis_cooldown = TRUE
+ throwable.float(TRUE)
+ sleep(10)
+ throwable.DoRevenantThrowEffects(over)
+ throwable.throw_at(over, 10, 2)
+ ADD_TRAIT(throwable, TRAIT_SPOOKY_THROW, "revenant")
+ throwable.float(FALSE, TRUE)
+ log_combat(throwable, over, "spooky telekinesised at", throwable)
+ var/obj/effect/temp_visual/telekinesis/T = new(get_turf(throwable))
+ T.color = "#8715b4"
+ addtimer(CALLBACK(spooker, /mob/living/simple_animal/revenant.proc/telekinesis_cooldown_end), 50)
+
+//Use this for effects you want to happen when a revenant throws itself, check the TRAIT_SPOOKY_THROW if you want to know if its still being thrown
+/obj/item/proc/DoRevenantThrowEffects(atom/target)
+ return TRUE
+
//objectives
/datum/objective/revenant
var/targetAmount = 100
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 8a0645f311..07a9f499f8 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -30,6 +30,9 @@
attack(user,user)
return FIRELOSS
+/obj/item/assembly/flash/DoRevenantThrowEffects(atom/target)
+ AOE_flash()
+
/obj/item/assembly/flash/update_icon(flash = FALSE)
cut_overlays()
attached_overlays = list()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 1f5280a5ce..a00145f9dc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -193,16 +193,13 @@
user.visible_message(ignition_message)
add_fingerprint(user)
fire_act(I.get_temperature())
-
+//I would have it become a paper plane before the throw, but that would risk runtimes
/obj/item/paper/DoRevenantThrowEffects(atom/target)
- sleep(5)
+ sleep(10)
if(HAS_TRAIT(src, TRAIT_SPOOKY_THROW))
- sleep(5)
- DoRevenantThrowEffects(atom/target)
return
- var/obj/item/paperplane/plane = new(get_turf(src))
+ new /obj/item/paperplane(get_turf(src))
qdel(src)
- plane.safe_throw_at(over, 10, 2)
/obj/item/paper/attackby(obj/item/P, mob/living/user, params)
if(burn_paper_product_attackby_check(P, user))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 9e8af0cd00..eb75a37f19 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -626,10 +626,10 @@
if(user && !user.has_gravity())
. = recoil*5
+
/obj/item/gun/DoRevenantThrowEffects(atom/target)
- while(HAS_TRAIT(src, TRAIT_SPOOKY_THROW))
- var/target
- var/list/possible_targets = range(3,src)
- target = pick(possible_targets)
- if(target)
- process_fire(null, target)
+ var/picked_target
+ var/list/possible_targets = range(3,src)
+ picked_target = pick(possible_targets)
+ if(picked_target)
+ process_fire(null, picked_target)