mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-29 18:40:42 +00:00
🆑 coiax fix: Printed oxygen or plasma tanks at the protolathe are now empty. /🆑 The discrepency in behaviour was because the new /empty types were using Initialize, which for some reason wasn't working. However, when I ported the whole of /obj/item/tank into using Initialize() it works fine, and all the empty tanks are empty as intended, (and the ones that should have gas, do have gas).
255 lines
8.2 KiB
Plaintext
255 lines
8.2 KiB
Plaintext
/obj/item/tank/jetpack
|
|
name = "jetpack (empty)"
|
|
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
|
icon_state = "jetpack"
|
|
item_state = "jetpack"
|
|
lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
|
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
|
var/gas_type = /datum/gas/oxygen
|
|
var/on = FALSE
|
|
var/stabilizers = FALSE
|
|
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
|
var/datum/effect_system/trail_follow/ion/ion_trail
|
|
|
|
/obj/item/tank/jetpack/Initialize()
|
|
. = ..()
|
|
ion_trail = new
|
|
ion_trail.set_up(src)
|
|
|
|
/obj/item/tank/jetpack/populate_gas()
|
|
if(gas_type)
|
|
air_contents.assert_gas(gas_type)
|
|
air_contents.gases[gas_type][MOLES] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
|
|
|
|
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
|
|
if(istype(action, /datum/action/item_action/toggle_jetpack))
|
|
cycle(user)
|
|
else if(istype(action, /datum/action/item_action/jetpack_stabilization))
|
|
if(on)
|
|
stabilizers = !stabilizers
|
|
to_chat(user, "<span class='notice'>You turn the jetpack stabilization [stabilizers ? "on" : "off"].</span>")
|
|
else
|
|
toggle_internals(user)
|
|
|
|
|
|
/obj/item/tank/jetpack/proc/cycle(mob/user)
|
|
if(user.incapacitated())
|
|
return
|
|
|
|
if(!on)
|
|
turn_on(user)
|
|
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
|
|
else
|
|
turn_off(user)
|
|
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
|
|
for(var/X in actions)
|
|
var/datum/action/A = X
|
|
A.UpdateButtonIcon()
|
|
|
|
|
|
/obj/item/tank/jetpack/proc/turn_on(mob/user)
|
|
on = TRUE
|
|
icon_state = "[initial(icon_state)]-on"
|
|
ion_trail.start()
|
|
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
|
if(full_speed)
|
|
user.add_movespeed_modifier(MOVESPEED_ID_JETPACK, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
|
|
|
|
/obj/item/tank/jetpack/proc/turn_off(mob/user)
|
|
on = FALSE
|
|
stabilizers = FALSE
|
|
icon_state = initial(icon_state)
|
|
ion_trail.stop()
|
|
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
|
|
user.remove_movespeed_modifier(MOVESPEED_ID_JETPACK)
|
|
|
|
/obj/item/tank/jetpack/proc/move_react(mob/user)
|
|
allow_thrust(0.01, user)
|
|
|
|
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
|
|
if(!on)
|
|
return
|
|
if((num < 0.005 || air_contents.total_moles() < num))
|
|
turn_off(user)
|
|
return
|
|
|
|
var/datum/gas_mixture/removed = air_contents.remove(num)
|
|
if(removed.total_moles() < 0.005)
|
|
turn_off(user)
|
|
return
|
|
|
|
var/turf/T = get_turf(user)
|
|
T.assume_air(removed)
|
|
|
|
return TRUE
|
|
|
|
/obj/item/tank/jetpack/suicide_act(mob/user)
|
|
if (istype(user, /mob/living/carbon/human/))
|
|
var/mob/living/carbon/human/H = user
|
|
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
|
|
H.visible_message("<span class='suicide'>[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!</span>")
|
|
return (OXYLOSS)
|
|
else
|
|
..()
|
|
|
|
/obj/item/tank/jetpack/improvised
|
|
name = "improvised jetpack"
|
|
desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
|
|
icon_state = "jetpack-improvised"
|
|
item_state = "jetpack-sec"
|
|
volume = 20 //normal jetpacks have 70 volume
|
|
gas_type = null //it starts empty
|
|
full_speed = FALSE //moves at hardsuit jetpack speeds
|
|
|
|
/obj/item/tank/jetpack/improvised/allow_thrust(num, mob/living/user)
|
|
if(!on)
|
|
return
|
|
if((num < 0.005 || air_contents.total_moles() < num))
|
|
turn_off(user)
|
|
return
|
|
if(rand(0,250) == 0)
|
|
to_chat(user, "<span class='notice'>You feel your jetpack's engines cut out.</span>")
|
|
turn_off(user)
|
|
return
|
|
|
|
var/datum/gas_mixture/removed = air_contents.remove(num)
|
|
if(removed.total_moles() < 0.005)
|
|
turn_off(user)
|
|
return
|
|
|
|
var/turf/T = get_turf(user)
|
|
T.assume_air(removed)
|
|
|
|
return TRUE
|
|
|
|
/obj/item/tank/jetpack/void
|
|
name = "void jetpack (oxygen)"
|
|
desc = "It works well in a void."
|
|
icon_state = "jetpack-void"
|
|
item_state = "jetpack-void"
|
|
|
|
/obj/item/tank/jetpack/oxygen
|
|
name = "jetpack (oxygen)"
|
|
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
|
icon_state = "jetpack"
|
|
item_state = "jetpack"
|
|
|
|
/obj/item/tank/jetpack/oxygen/harness
|
|
name = "jet harness (oxygen)"
|
|
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
|
icon_state = "jetpack-mini"
|
|
item_state = "jetpack-mini"
|
|
volume = 40
|
|
throw_range = 7
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
|
|
/obj/item/tank/jetpack/oxygen/captain
|
|
name = "\improper Captain's jetpack"
|
|
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
|
icon_state = "jetpack-captain"
|
|
item_state = "jetpack-captain"
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
volume = 90
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
|
|
|
|
/obj/item/tank/jetpack/oxygen/security
|
|
name = "security jetpack (oxygen)"
|
|
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
|
icon_state = "jetpack-sec"
|
|
item_state = "jetpack-sec"
|
|
|
|
|
|
|
|
/obj/item/tank/jetpack/carbondioxide
|
|
name = "jetpack (carbon dioxide)"
|
|
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
|
icon_state = "jetpack-black"
|
|
item_state = "jetpack-black"
|
|
distribute_pressure = 0
|
|
gas_type = /datum/gas/carbon_dioxide
|
|
|
|
|
|
/obj/item/tank/jetpack/suit
|
|
name = "hardsuit jetpack upgrade"
|
|
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
|
|
icon_state = "jetpack-mining"
|
|
item_state = "jetpack-black"
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
|
volume = 1
|
|
slot_flags = null
|
|
gas_type = null
|
|
full_speed = FALSE
|
|
var/datum/gas_mixture/temp_air_contents
|
|
var/obj/item/tank/internals/tank = null
|
|
var/mob/living/carbon/human/cur_user
|
|
|
|
/obj/item/tank/jetpack/suit/Initialize()
|
|
. = ..()
|
|
STOP_PROCESSING(SSobj, src)
|
|
temp_air_contents = air_contents
|
|
|
|
/obj/item/tank/jetpack/suit/attack_self()
|
|
return
|
|
|
|
/obj/item/tank/jetpack/suit/cycle(mob/user)
|
|
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
|
|
to_chat(user, "<span class='warning'>\The [src] must be connected to a hardsuit!</span>")
|
|
return
|
|
|
|
var/mob/living/carbon/human/H = user
|
|
if(!istype(H.s_store, /obj/item/tank/internals))
|
|
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
|
|
return
|
|
..()
|
|
|
|
/obj/item/tank/jetpack/suit/turn_on(mob/user)
|
|
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc) || loc.loc != user)
|
|
return
|
|
var/mob/living/carbon/human/H = user
|
|
tank = H.s_store
|
|
air_contents = tank.air_contents
|
|
START_PROCESSING(SSobj, src)
|
|
cur_user = user
|
|
..()
|
|
|
|
/obj/item/tank/jetpack/suit/turn_off(mob/user)
|
|
tank = null
|
|
air_contents = temp_air_contents
|
|
STOP_PROCESSING(SSobj, src)
|
|
cur_user = null
|
|
..()
|
|
|
|
/obj/item/tank/jetpack/suit/process()
|
|
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
|
turn_off(cur_user)
|
|
return
|
|
var/mob/living/carbon/human/H = loc.loc
|
|
if(!tank || tank != H.s_store)
|
|
turn_off(cur_user)
|
|
return
|
|
..()
|
|
|
|
|
|
//Return a jetpack that the mob can use
|
|
//Back worn jetpacks, hardsuit internal packs, and so on.
|
|
//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
|
|
|
|
/mob/proc/get_jetpack()
|
|
return
|
|
|
|
/mob/living/carbon/get_jetpack()
|
|
var/obj/item/tank/jetpack/J = back
|
|
if(istype(J))
|
|
return J
|
|
|
|
/mob/living/carbon/human/get_jetpack()
|
|
var/obj/item/tank/jetpack/J = ..()
|
|
if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
|
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
|
J = C.jetpack
|
|
return J
|