mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-21 10:46:42 +01:00
80 lines
2.7 KiB
Plaintext
80 lines
2.7 KiB
Plaintext
// todo: /obj/effect/shield_matrix
|
|
// This is the actual shield. The projector is a different item.
|
|
/obj/effect/directional_shield
|
|
name = "directional combat shield"
|
|
desc = "A wide shield, which has the property to block incoming projectiles but allow outgoing projectiles to pass it. \
|
|
Slower moving objects are not blocked, so people can walk in and out of the barrier, and things can be thrown into and out \
|
|
of it."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "directional_shield"
|
|
density = FALSE // People can move pass these shields.
|
|
opacity = FALSE
|
|
anchored = TRUE
|
|
integrity_flags = INTEGRITY_ACIDPROOF | INTEGRITY_FIREPROOF | INTEGRITY_LAVAPROOF
|
|
layer = MOB_LAYER + 0.1
|
|
mouse_opacity = FALSE
|
|
var/obj/item/shield_projector/projector = null // The thing creating the shield.
|
|
var/x_offset = 0 // Offset from the 'center' of where the projector is, so that if it moves, the shield can recalc its position.
|
|
var/y_offset = 0 // Ditto.
|
|
|
|
/obj/effect/directional_shield/Initialize(mapload, new_projector)
|
|
if(new_projector)
|
|
projector = new_projector
|
|
var/turf/us = get_turf(src)
|
|
var/turf/them = get_turf(projector)
|
|
if(them)
|
|
x_offset = us.x - them.x
|
|
y_offset = us.y - them.y
|
|
else
|
|
update_color()
|
|
return ..()
|
|
|
|
/obj/effect/directional_shield/proc/relocate()
|
|
if(!projector)
|
|
return // Nothing to follow.
|
|
var/turf/T = get_turf(projector)
|
|
if(!T)
|
|
return
|
|
var/turf/new_pos = locate(T.x + x_offset, T.y + y_offset, T.z)
|
|
if(new_pos)
|
|
forceMove(new_pos)
|
|
else
|
|
qdel(src)
|
|
|
|
/obj/effect/directional_shield/proc/update_color(var/new_color)
|
|
if(!projector)
|
|
color = "#0099FF"
|
|
else
|
|
animate(src, color = new_color, 5)
|
|
// color = new_color
|
|
|
|
/obj/effect/directional_shield/Destroy()
|
|
if(projector)
|
|
projector.active_shields -= src
|
|
projector = null
|
|
return ..()
|
|
|
|
/obj/effect/directional_shield/CanPass(atom/movable/mover, turf/target)
|
|
. = ..()
|
|
if(istype(mover, /obj/projectile))
|
|
var/obj/projectile/P = mover
|
|
if(P.projectile_type & PROJECTILE_TYPE_TRACE)
|
|
return TRUE
|
|
if(check_defensive_arc_tile(src, P, 90, null, dir))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/effect/directional_shield/on_bullet_act(obj/projectile/proj, impact_flags, list/bullet_act_args)
|
|
impact_flags &= ~PROJECTILE_IMPACT_FLAGS_SHOULD_NOT_HIT
|
|
. = ..()
|
|
if(. & PROJECTILE_IMPACT_FLAGS_UNCONDITIONAL_ABORT)
|
|
return
|
|
adjust_health(-proj.get_structure_damage())
|
|
playsound(src, 'sound/effects/EMPulse.ogg', 75, 1)
|
|
|
|
// All the shields tied to their projector are one 'unit', and don't have individualized health values like most other shields.
|
|
/obj/effect/directional_shield/proc/adjust_health(amount)
|
|
if(projector)
|
|
projector.adjust_health(amount) // Projector will kill the shield if needed.
|
|
// If the shield lacks a projector, then it was probably spawned in by an admin for bus, so it's indestructable.
|