mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-15 04:01:41 +00:00
## About The Pull Request Adds the ability for explosions to be directional. This is achieved by adding an angle check to `prepare_explosion_turfs()` to drop any turfs outside the cone of the explosion. If the arc covers a full 360 degrees, as is the default, it will accept all the turfs without performing the angle check. Uses this functionality to rework both rocket launcher backblast and X4 explosions. Rocket launcher backblast has been changed from a shotgun of indendiary bullets to a directional explosion of similar length. X4 now uses a directional explosion to "ensure user safety". Apparently the old method of moving the explosion one tile away didn't even work, as it blew up `target` before trying to check its density for the directional behaviour. https://youtu.be/Mzdt7d7Le2Y ## Why It's Good For The Game Directional explosions - Useful functionality for a range of potential use cases, which can be implemented with minimal extra processing cost (Worst case scenario being very large directional explosions) Backblast - Looks way cooler than a bunch of projectiles, and should be significantly more functional in high-lag situations where projectile code tends to get fucky X4 - More predictable for players wanting to use it as a breaching charge, you can actually stand near the charge and not have to worry about being hoist upon your own petard. ## Changelog 🆑 add: Added support for directional explosions. add: Rocket launcher backblast is now 271% more explosive, check your six for friendlies! add: X4 charges now explode in a cone away from the user when placed on a sufficiently solid object. fix: X4 charges will now behave correctly when placed on dense atoms (note: don't try to read a variable from an atom you just blew up) /🆑
44 lines
1.7 KiB
Plaintext
44 lines
1.7 KiB
Plaintext
/**
|
|
* When attached to a gun and the gun is successfully fired, this element creates a "backblast", like you'd find in a rocket launcher or recoilless rifle
|
|
*
|
|
* The backblast is simulated by a directional explosion 180 degrees from the direction of the fired projectile.
|
|
*/
|
|
/datum/element/backblast
|
|
element_flags = ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
|
|
/// Devasatation range of the explosion
|
|
var/dev_range
|
|
/// HGeavy damage range of the explosion
|
|
var/heavy_range
|
|
/// Light damage range of the explosion
|
|
var/light_range
|
|
/// Flame range of the explosion
|
|
var/flame_range
|
|
/// What angle do we want the backblast to cover
|
|
var/blast_angle
|
|
|
|
/datum/element/backblast/Attach(datum/target, dev_range = 0, heavy_range = 0, light_range = 6, flame_range = 6, blast_angle = 60)
|
|
. = ..()
|
|
if(!isgun(target) || dev_range < 0 || heavy_range < 0 || light_range < 0 || flame_range < 0 || blast_angle < 1)
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
src.dev_range = dev_range
|
|
src.heavy_range = heavy_range
|
|
src.light_range = light_range
|
|
src.flame_range = flame_range
|
|
src.blast_angle = blast_angle
|
|
|
|
RegisterSignal(target, COMSIG_GUN_FIRED, PROC_REF(pew))
|
|
|
|
/datum/element/backblast/Detach(datum/source)
|
|
if(source)
|
|
UnregisterSignal(source, COMSIG_GUN_FIRED)
|
|
return ..()
|
|
|
|
/// For firing an actual backblast pellet
|
|
/datum/element/backblast/proc/pew(obj/item/gun/weapon, mob/living/user, atom/target)
|
|
var/turf/origin = get_turf(weapon)
|
|
var/backblast_angle = get_angle(target, origin)
|
|
explosion(weapon, devastation_range = dev_range, heavy_impact_range = heavy_range, light_impact_range = light_range, flame_range = flame_range, adminlog = FALSE, protect_epicenter = TRUE, explosion_direction = backblast_angle, explosion_arc = blast_angle)
|