Files
Bubberstation/code/datums/elements/ranged_attacks.dm

51 lines
1.8 KiB
Plaintext

///This proc is used by basic mobs to give them a simple ranged attack! In theory this could be extended to
/datum/element/ranged_attacks
element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
id_arg_index = 2
var/casingtype = /obj/item/ammo_casing/glockroach
var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg'
var/projectiletype
/datum/element/ranged_attacks/Attach(atom/movable/target, casingtype, projectilesound, projectiletype)
. = ..()
if(!isbasicmob(target))
return COMPONENT_INCOMPATIBLE
src.casingtype = casingtype
src.projectilesound = projectilesound
src.projectiletype = projectiletype
RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, .proc/fire_ranged_attack)
if(casingtype && projectiletype)
CRASH("Set both casing type and projectile type in [target]'s ranged attacks element! uhoh! stinky!")
/datum/element/ranged_attacks/Detach(datum/target)
UnregisterSignal(target, COMSIG_MOB_ATTACK_RANGED)
return ..()
/datum/element/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers)
SIGNAL_HANDLER
INVOKE_ASYNC(src, .proc/async_fire_ranged_attack, firer, target, modifiers)
/datum/element/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers)
var/turf/startloc = get_turf(firer)
if(casingtype)
var/obj/item/ammo_casing/casing = new casingtype(startloc)
playsound(firer, projectilesound, 100, TRUE)
casing.fire_casing(target, firer, null, null, null, ran_zone(), 0, firer)
else if(projectiletype)
var/obj/projectile/P = new projectiletype(startloc)
playsound(firer, projectilesound, 100, TRUE)
P.starting = startloc
P.firer = firer
P.fired_from = firer
P.yo = target.y - startloc.y
P.xo = target.x - startloc.x
P.original = target
P.preparePixelProjectile(target, firer)
P.fire()