Files
Bubberstation/code/datums/components/deployable.dm
SkyratBot bce50c3a84 [MIRROR] Deployable Component (Big Dakka Included) (#7380)
* Deployable Component (Big Dakka Included) (#60554)

* Deployable Component (Big Dakka Included)

Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
2021-08-04 15:08:40 +01:00

75 lines
3.0 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
* Lastly, set delete_on_use to TRUE or FALSE if you want the object you're deploying with to get deleted when used
*/
/datum/component/deployable
/// The time it takes to deploy the object
var/deploy_time = 5 SECONDS
/// The object that gets spawned if deployed successfully
var/obj/thing_to_be_deployed
/// Used in getting the name of the deployed object
var/deployed_name
/// If the item used to deploy gets deleted on use or not
var/delete_on_use = TRUE
/datum/component/deployable/Initialize(deploy_time, thing_to_be_deployed, delete_on_use)
. = ..()
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.deploy_time = deploy_time
src.thing_to_be_deployed = thing_to_be_deployed
src.delete_on_use = delete_on_use
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/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("[source.p_they()] look[source.p_s()] like [source.p_they()] can be deployed into \a [deployed_name].")
/datum/component/deployable/proc/on_attack_hand(datum/source, mob/user, location, direction)
SIGNAL_HANDLER
INVOKE_ASYNC(src, .proc/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
var/obj/deployed_object //Used for spawning the deployed object
var/turf/deploy_location //Where our deployed_object gets put
var/new_direction //What direction do we want our deployed object in
if(user)
if(!ishuman(user))
return
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))
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 integrity of the new deployed machine to that of the object it came from
deployed_object.modify_max_integrity(source.max_integrity)
deployed_object.update_icon_state()
if(delete_on_use)
qdel(source)