Files
Bubberstation/code/datums/components/deployable.dm
SkyratBot f342a4bb67 [MIRROR] Improves the deployable component [MDB IGNORE] (#24627)
* Improves the deployable component (#79199)

## About The Pull Request

The deployable component had a few random things I noticed when I tried
actually using it that kinda sucked so I'm:

Making the examine message more generic, we did NOT need to make it that
complicated.
Letting anything with hands deploy stuff, because mobs other than humans
can hold things.
Giving the option to let something be deployed more than once.
Letting direction setting be optional.
Tweaking the check for if something can be placed somewhere to be a bit
better.
## Why It's Good For The Game

I want to use the deployable component for stuff but I made it awful.
## Changelog
🆑
code: the deployable component has been tweaked and improved with some
new options to it
/🆑

---------

Co-authored-by: Jacquerel <hnevard@ gmail.com>

* Improves the deployable component

* Modular

---------

Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
2023-10-27 21:45:23 -04:00

89 lines
3.8 KiB
Plaintext

/**
* Deployable - Bring your big guns with you, and smack em' down where you want.
*
* Allows items to spawn other items (usually objects) in front of the user after a short delay.
* If attaching this to something:
* Set deploy_time to a number in seconds for the deploy delay
* Set thing_to_be_deployed to an obj path for the thing that gets spawned
* Multiple deployments and deployments work together to allow a thing to be placed down several times. If multiple deployments is false then don't worry about deployments
* Direction setting true means the object spawned will face the direction of the person who deployed it, false goes to the default direction
*/
/datum/component/deployable
/// The time it takes to deploy the object
var/deploy_time
/// The object that gets spawned if deployed successfully
var/obj/thing_to_be_deployed
/// Can the parent be deployed multiple times
var/multiple_deployments
/// How many times we can deploy the parent, if multiple deployments is set to true and this gets below zero, the parent will be deleted
var/deployments
/// If the component adds a little bit into the parent's description
var/add_description_hint
/// If the direction of the thing we place is changed upon placing
var/direction_setting
/// Used in getting the name of the deployed object
var/deployed_name
/datum/component/deployable/Initialize(deploy_time = 5 SECONDS, thing_to_be_deployed, multiple_deployments = FALSE, deployments = 1, add_description_hint = TRUE, direction_setting = TRUE)
. = ..()
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.deploy_time = deploy_time
src.thing_to_be_deployed = thing_to_be_deployed
src.add_description_hint = add_description_hint
src.direction_setting = direction_setting
src.deployments = deployments
src.multiple_deployments = multiple_deployments
if(add_description_hint)
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine))
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_hand))
var/obj/item/typecast = thing_to_be_deployed
deployed_name = initial(typecast.name)
/datum/component/deployable/proc/examine(datum/source, mob/user, list/examine_list)
SIGNAL_HANDLER
examine_list += span_notice("It can be used <b>in hand</b> to deploy into [((deployments > 1) && multiple_deployments) ? "[deployments]" : "a"] [deployed_name].")
/datum/component/deployable/proc/on_attack_hand(datum/source, mob/user, location, direction)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(deploy), source, user, location, direction)
/datum/component/deployable/proc/deploy(obj/source, mob/user, location, direction) //If there's no user, location and direction are used
// The object we are going to create
var/atom/deployed_object
// The turf our object is going to be deployed to
var/turf/deploy_location
// What direction will the deployed object be placed facing
var/new_direction
if(user)
deploy_location = get_step(user, user.dir) //Gets spawn location for thing_to_be_deployed if there is a user
if(deploy_location.is_blocked_turf(TRUE, parent))
source.balloon_alert(user, "insufficient room to deploy here.")
return
new_direction = user.dir //Gets the direction for thing_to_be_deployed if there is a user
source.balloon_alert(user, "deploying...")
playsound(source, 'sound/items/ratchet.ogg', 50, TRUE)
if(!do_after(user, deploy_time))
return
else // If there is for some reason no user, then the location and direction are set here
deploy_location = location
new_direction = direction
deployed_object = new thing_to_be_deployed(deploy_location)
deployed_object.setDir(new_direction)
// Sets the direction of the resulting object if the variable says to
if(direction_setting)
deployed_object.update_icon_state()
deployments -= 1
if(!multiple_deployments || deployments < 1)
qdel(source)