e4db7a8477
The issue was that when casting rod form, the wizard is forceMoved() into the rod. When an epicenter explosion happens, explosion.dm forcibly goes through the contents of EVERYTHING, and calls ex_act(). This caused the wizard in the contents of the rod to get damaged by epicenter explosions (ie if they hit a fuel tank in rod form)
170 lines
5.4 KiB
Plaintext
170 lines
5.4 KiB
Plaintext
/*
|
|
Immovable rod random event.
|
|
The rod will spawn at some location outside the station, and travel in a straight line to the opposite side of the station
|
|
Everything solid in the way will be ex_act()'d
|
|
In my current plan for it, 'solid' will be defined as anything with density == 1
|
|
|
|
--NEOFite
|
|
*/
|
|
|
|
/datum/round_event_control/immovable_rod
|
|
name = "Immovable Rod"
|
|
typepath = /datum/round_event/immovable_rod
|
|
min_players = 15
|
|
max_occurrences = 5
|
|
var/atom/special_target
|
|
|
|
|
|
/datum/round_event_control/immovable_rod/admin_setup()
|
|
if(!check_rights(R_FUN))
|
|
return
|
|
|
|
var/aimed = alert("Aimed at current location?","Sniperod", "Yes", "No")
|
|
if(aimed == "Yes")
|
|
special_target = get_turf(usr)
|
|
|
|
/datum/round_event/immovable_rod
|
|
announceWhen = 5
|
|
|
|
/datum/round_event/immovable_rod/announce(fake)
|
|
priority_announce("What the fuck was that?!", "General Alert")
|
|
|
|
/datum/round_event/immovable_rod/start()
|
|
var/datum/round_event_control/immovable_rod/C = control
|
|
var/startside = pick(GLOB.cardinals)
|
|
var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION))
|
|
var/turf/startT = spaceDebrisStartLoc(startside, z)
|
|
var/turf/endT = spaceDebrisFinishLoc(startside, z)
|
|
new /obj/effect/immovablerod(startT, endT, C.special_target)
|
|
|
|
/obj/effect/immovablerod
|
|
name = "immovable rod"
|
|
desc = "What the fuck is that?"
|
|
icon = 'icons/obj/objects.dmi'
|
|
icon_state = "immrod"
|
|
throwforce = 100
|
|
move_force = INFINITY
|
|
move_resist = INFINITY
|
|
pull_force = INFINITY
|
|
density = TRUE
|
|
anchored = TRUE
|
|
var/mob/living/wizard
|
|
var/z_original = 0
|
|
var/destination
|
|
var/notify = TRUE
|
|
var/atom/special_target
|
|
|
|
/obj/effect/immovablerod/New(atom/start, atom/end, aimed_at)
|
|
..()
|
|
SSaugury.register_doom(src, 2000)
|
|
z_original = z
|
|
destination = end
|
|
special_target = aimed_at
|
|
if(notify)
|
|
notify_ghosts("\A [src] is inbound!",
|
|
enter_link="<a href=?src=[REF(src)];orbit=1>(Click to orbit)</a>",
|
|
source=src, action=NOTIFY_ORBIT)
|
|
GLOB.poi_list += src
|
|
|
|
var/special_target_valid = FALSE
|
|
if(special_target)
|
|
var/turf/T = get_turf(special_target)
|
|
if(T.z == z_original)
|
|
special_target_valid = TRUE
|
|
if(special_target_valid)
|
|
walk_towards(src, special_target, 1)
|
|
else if(end && end.z==z_original)
|
|
walk_towards(src, destination, 1)
|
|
|
|
/obj/effect/immovablerod/Topic(href, href_list)
|
|
if(href_list["orbit"])
|
|
var/mob/dead/observer/ghost = usr
|
|
if(istype(ghost))
|
|
ghost.ManualFollow(src)
|
|
|
|
/obj/effect/immovablerod/Destroy()
|
|
GLOB.poi_list -= src
|
|
. = ..()
|
|
|
|
/obj/effect/immovablerod/Moved()
|
|
if((z != z_original) || (loc == destination))
|
|
qdel(src)
|
|
if(special_target && loc == get_turf(special_target))
|
|
complete_trajectory()
|
|
return ..()
|
|
|
|
/obj/effect/immovablerod/proc/complete_trajectory()
|
|
//We hit what we wanted to hit, time to go
|
|
special_target = null
|
|
destination = get_edge_target_turf(src, dir)
|
|
walk(src,0)
|
|
walk_towards(src, destination, 1)
|
|
|
|
/obj/structure/closet/supplypod/prevent_content_explosion()
|
|
return TRUE
|
|
|
|
/obj/effect/immovablerod/ex_act(severity, target)
|
|
return 0
|
|
|
|
/obj/effect/immovablerod/singularity_act()
|
|
return
|
|
|
|
/obj/effect/immovablerod/singularity_pull()
|
|
return
|
|
|
|
/obj/effect/immovablerod/Bump(atom/clong)
|
|
if(prob(10))
|
|
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
|
audible_message("<span class='danger'>You hear a CLANG!</span>")
|
|
|
|
if(clong && prob(25))
|
|
x = clong.x
|
|
y = clong.y
|
|
|
|
if(special_target && clong == special_target)
|
|
complete_trajectory()
|
|
|
|
if(isturf(clong) || isobj(clong))
|
|
if(clong.density)
|
|
clong.ex_act(EXPLODE_HEAVY)
|
|
|
|
else if(isliving(clong))
|
|
penetrate(clong)
|
|
else if(istype(clong, type))
|
|
var/obj/effect/immovablerod/other = clong
|
|
visible_message("<span class='danger'>[src] collides with [other]!\
|
|
</span>")
|
|
var/datum/effect_system/smoke_spread/smoke = new
|
|
smoke.set_up(2, get_turf(src))
|
|
smoke.start()
|
|
qdel(src)
|
|
qdel(other)
|
|
|
|
/obj/effect/immovablerod/proc/penetrate(mob/living/L)
|
|
L.visible_message("<span class='danger'>[L] is penetrated by an immovable rod!</span>" , "<span class='userdanger'>The rod penetrates you!</span>" , "<span class ='danger'>You hear a CLANG!</span>")
|
|
if(ishuman(L))
|
|
var/mob/living/carbon/human/H = L
|
|
H.adjustBruteLoss(160)
|
|
if(L && (L.density || prob(10)))
|
|
L.ex_act(EXPLODE_HEAVY)
|
|
|
|
/obj/effect/immovablerod/attack_hand(mob/living/user)
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/U = user
|
|
if(U.job in list("Research Director"))
|
|
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
|
|
for(var/mob/M in urange(8, src))
|
|
if(!M.stat)
|
|
shake_camera(M, 2, 3)
|
|
if(wizard)
|
|
U.visible_message("<span class='boldwarning'>[src] transforms into [wizard] as [U] suplexes them!</span>", "<span class='warning'>As you grab [src], it suddenly turns into [wizard] as you suplex them!</span>")
|
|
to_chat(wizard, "<span class='boldwarning'>You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!</span>")
|
|
wizard.Stun(60)
|
|
wizard.apply_damage(25, BRUTE)
|
|
qdel(src)
|
|
else
|
|
SSmedals.UnlockMedal(MEDAL_RODSUPLEX,U.client) //rod-form wizards would probably make this a lot easier to get so keep it to regular rods only
|
|
U.visible_message("<span class='boldwarning'>[U] suplexes [src] into the ground!</span>", "<span class='warning'>You suplex [src] into the ground!</span>")
|
|
new /obj/structure/festivus/anchored(drop_location())
|
|
new /obj/effect/anomaly/flux(drop_location())
|
|
qdel(src) |