@@ -0,0 +1,255 @@
|
||||
/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/New()
|
||||
..()
|
||||
if(gas_type)
|
||||
air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
|
||||
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
|
||||
/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 = 30 //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."
|
||||
volume = 60
|
||||
icon_state = "jetpack-void"
|
||||
item_state = "jetpack-void"
|
||||
full_speed = FALSE //Old pre-hardsuit tech
|
||||
|
||||
/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 = 50
|
||||
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"
|
||||
full_speed = FALSE
|
||||
|
||||
/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/carbondioxide/eva
|
||||
name = "surplus 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. Rated for less than stellar EVA speeds!"
|
||||
full_speed = FALSE
|
||||
|
||||
/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/New()
|
||||
..()
|
||||
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
|
||||
|
||||
@@ -0,0 +1,459 @@
|
||||
//Hydroponics tank and base code
|
||||
/obj/item/watertank
|
||||
name = "backpack water tank"
|
||||
desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "waterbackpack"
|
||||
item_state = "waterbackpack"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
slowdown = 1
|
||||
actions_types = list(/datum/action/item_action/toggle_mister)
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
var/obj/item/noz
|
||||
var/volume = 500
|
||||
|
||||
/obj/item/watertank/Initialize()
|
||||
. = ..()
|
||||
create_reagents(volume, OPENCONTAINER)
|
||||
noz = make_noz()
|
||||
|
||||
/obj/item/watertank/ui_action_click(mob/user)
|
||||
toggle_mister(user)
|
||||
|
||||
/obj/item/watertank/item_action_slot_check(slot, mob/user, datum/action/A)
|
||||
if(slot == user.getBackSlot())
|
||||
return 1
|
||||
|
||||
/obj/item/watertank/proc/toggle_mister(mob/living/user)
|
||||
if(!istype(user))
|
||||
return
|
||||
if(user.get_item_by_slot(user.getBackSlot()) != src)
|
||||
to_chat(user, "<span class='warning'>The watertank must be worn properly to use!</span>")
|
||||
return
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(QDELETED(noz))
|
||||
noz = make_noz()
|
||||
if(noz in src)
|
||||
//Detach the nozzle into the user's hands
|
||||
if(!user.put_in_hands(noz))
|
||||
to_chat(user, "<span class='warning'>You need a free hand to hold the mister!</span>")
|
||||
return
|
||||
else
|
||||
//Remove from their hands and put back "into" the tank
|
||||
remove_noz()
|
||||
|
||||
/obj/item/watertank/verb/toggle_mister_verb()
|
||||
set name = "Toggle Mister"
|
||||
set category = "Object"
|
||||
toggle_mister(usr)
|
||||
|
||||
/obj/item/watertank/proc/make_noz()
|
||||
return new /obj/item/reagent_containers/spray/mister(src)
|
||||
|
||||
/obj/item/watertank/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot != SLOT_BACK)
|
||||
remove_noz()
|
||||
|
||||
/obj/item/watertank/proc/remove_noz()
|
||||
if(!QDELETED(noz))
|
||||
if(ismob(noz.loc))
|
||||
var/mob/M = noz.loc
|
||||
M.temporarilyRemoveItemFromInventory(noz, TRUE)
|
||||
noz.forceMove(src)
|
||||
|
||||
/obj/item/watertank/Destroy()
|
||||
QDEL_NULL(noz)
|
||||
return ..()
|
||||
|
||||
/obj/item/watertank/attack_hand(mob/user)
|
||||
if (user.get_item_by_slot(user.getBackSlot()) == src)
|
||||
toggle_mister(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/watertank/MouseDrop(obj/over_object)
|
||||
var/mob/M = loc
|
||||
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
return ..()
|
||||
|
||||
/obj/item/watertank/attackby(obj/item/W, mob/user, params)
|
||||
if(W == noz)
|
||||
remove_noz()
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/watertank/dropped(mob/user)
|
||||
..()
|
||||
remove_noz()
|
||||
|
||||
// This mister item is intended as an extension of the watertank and always attached to it.
|
||||
// Therefore, it's designed to be "locked" to the player's hands or extended back onto
|
||||
// the watertank backpack. Allowing it to be placed elsewhere or created without a parent
|
||||
// watertank object will likely lead to weird behaviour or runtimes.
|
||||
/obj/item/reagent_containers/spray/mister
|
||||
name = "water mister"
|
||||
desc = "A mister nozzle attached to a water tank."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "mister"
|
||||
item_state = "mister"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
amount_per_transfer_from_this = 50
|
||||
possible_transfer_amounts = list(25,50,100)
|
||||
volume = 500
|
||||
item_flags = NOBLUDGEON | ABSTRACT // don't put in storage
|
||||
slot_flags = 0
|
||||
|
||||
var/obj/item/watertank/tank
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/Initialize()
|
||||
. = ..()
|
||||
tank = loc
|
||||
if(!istype(tank))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/doMove(atom/destination)
|
||||
if(destination && (destination != tank.loc || !ismob(destination)))
|
||||
if (loc != tank)
|
||||
to_chat(tank.loc, "<span class='notice'>The mister snaps back onto the watertank.</span>")
|
||||
destination = tank
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity)
|
||||
if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it
|
||||
return
|
||||
..()
|
||||
|
||||
//Janitor tank
|
||||
/obj/item/watertank/janitor
|
||||
name = "backpack water tank"
|
||||
desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti."
|
||||
icon_state = "waterbackpackjani"
|
||||
item_state = "waterbackpackjani"
|
||||
|
||||
/obj/item/watertank/janitor/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("cleaner", 500)
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/janitor
|
||||
name = "janitor spray nozzle"
|
||||
desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "misterjani"
|
||||
item_state = "misterjani"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list()
|
||||
|
||||
/obj/item/watertank/janitor/make_noz()
|
||||
return new /obj/item/reagent_containers/spray/mister/janitor(src)
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/janitor/attack_self(var/mob/user)
|
||||
amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10)
|
||||
to_chat(user, "<span class='notice'>You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.</span>")
|
||||
|
||||
//ATMOS FIRE FIGHTING BACKPACK
|
||||
|
||||
#define EXTINGUISHER 0
|
||||
#define RESIN_LAUNCHER 1
|
||||
#define RESIN_FOAM 2
|
||||
|
||||
/obj/item/watertank/atmos
|
||||
name = "backpack firefighter tank"
|
||||
desc = "A refrigerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, resin launcher and a smaller scale resin foamer."
|
||||
item_state = "waterbackpackatmos"
|
||||
icon_state = "waterbackpackatmos"
|
||||
volume = 200
|
||||
slowdown = 0
|
||||
|
||||
/obj/item/watertank/atmos/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("water", 200)
|
||||
|
||||
/obj/item/watertank/atmos/make_noz()
|
||||
return new /obj/item/extinguisher/mini/nozzle(src)
|
||||
|
||||
/obj/item/watertank/atmos/dropped(mob/user)
|
||||
..()
|
||||
icon_state = "waterbackpackatmos"
|
||||
if(istype(noz, /obj/item/extinguisher/mini/nozzle))
|
||||
var/obj/item/extinguisher/mini/nozzle/N = noz
|
||||
N.nozzle_mode = 0
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle
|
||||
name = "extinguisher nozzle"
|
||||
desc = "A heavy duty nozzle attached to a firefighter's backpack tank."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "atmos_nozzle"
|
||||
item_state = "nozzleatmos"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
|
||||
safety = 0
|
||||
max_water = 200
|
||||
power = 8
|
||||
force = 10
|
||||
precision = 1
|
||||
cooling_power = 5
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = ABSTRACT // don't put in storage
|
||||
var/obj/item/watertank/tank
|
||||
var/nozzle_mode = 0
|
||||
var/metal_synthesis_cooldown = 0
|
||||
var/resin_cooldown = 0
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle/Initialize()
|
||||
. = ..()
|
||||
tank = loc
|
||||
if (!istype(tank))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
reagents = tank.reagents
|
||||
max_water = tank.volume
|
||||
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle/doMove(atom/destination)
|
||||
if(destination && (destination != tank.loc || !ismob(destination)))
|
||||
if(loc != tank)
|
||||
to_chat(tank.loc, "<span class='notice'>The nozzle snaps back onto the tank!</span>")
|
||||
destination = tank
|
||||
..()
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle/attack_self(mob/user)
|
||||
switch(nozzle_mode)
|
||||
if(EXTINGUISHER)
|
||||
nozzle_mode = RESIN_LAUNCHER
|
||||
tank.icon_state = "waterbackpackatmos_1"
|
||||
to_chat(user, "Swapped to resin launcher")
|
||||
return
|
||||
if(RESIN_LAUNCHER)
|
||||
nozzle_mode = RESIN_FOAM
|
||||
tank.icon_state = "waterbackpackatmos_2"
|
||||
to_chat(user, "Swapped to resin foamer")
|
||||
return
|
||||
if(RESIN_FOAM)
|
||||
nozzle_mode = EXTINGUISHER
|
||||
tank.icon_state = "waterbackpackatmos_0"
|
||||
to_chat(user, "Swapped to water extinguisher")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle/afterattack(atom/target, mob/user)
|
||||
if(nozzle_mode == EXTINGUISHER)
|
||||
..()
|
||||
return
|
||||
var/Adj = user.Adjacent(target)
|
||||
if(Adj)
|
||||
AttemptRefill(target, user)
|
||||
if(nozzle_mode == RESIN_LAUNCHER)
|
||||
if(Adj)
|
||||
return //Safety check so you don't blast yourself trying to refill your tank
|
||||
var/datum/reagents/R = reagents
|
||||
if(R.total_volume < 100)
|
||||
to_chat(user, "<span class='warning'>You need at least 100 units of water to use the resin launcher!</span>")
|
||||
return
|
||||
if(resin_cooldown)
|
||||
to_chat(user, "<span class='warning'>Resin launcher is still recharging...</span>")
|
||||
return
|
||||
resin_cooldown = TRUE
|
||||
R.remove_any(100)
|
||||
var/obj/effect/resin_container/A = new (get_turf(src))
|
||||
log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
|
||||
playsound(src,'sound/items/syringeproj.ogg',40,1)
|
||||
for(var/a=0, a<5, a++)
|
||||
step_towards(A, target)
|
||||
sleep(2)
|
||||
A.Smoke()
|
||||
spawn(100)
|
||||
if(src)
|
||||
resin_cooldown = FALSE
|
||||
return
|
||||
if(nozzle_mode == RESIN_FOAM)
|
||||
if(!Adj|| !isturf(target))
|
||||
return
|
||||
for(var/S in target)
|
||||
if(istype(S, /obj/effect/particle_effect/foam/metal/resin) || istype(S, /obj/structure/foamedmetal/resin))
|
||||
to_chat(user, "<span class='warning'>There's already resin here!</span>")
|
||||
return
|
||||
if(metal_synthesis_cooldown < 5)
|
||||
var/obj/effect/particle_effect/foam/metal/resin/F = new (get_turf(target))
|
||||
F.amount = 0
|
||||
metal_synthesis_cooldown++
|
||||
spawn(100)
|
||||
metal_synthesis_cooldown--
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Resin foam mix is still being synthesized...</span>")
|
||||
return
|
||||
|
||||
/obj/effect/resin_container
|
||||
name = "resin container"
|
||||
desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "frozen_smoke_capsule"
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
pass_flags = PASSTABLE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/resin_container/proc/Smoke()
|
||||
var/obj/effect/particle_effect/foam/metal/resin/S = new /obj/effect/particle_effect/foam/metal/resin(get_turf(loc))
|
||||
S.amount = 4
|
||||
playsound(src,'sound/effects/bamf.ogg',100,1)
|
||||
qdel(src)
|
||||
|
||||
#undef EXTINGUISHER
|
||||
#undef RESIN_LAUNCHER
|
||||
#undef RESIN_FOAM
|
||||
|
||||
/obj/item/reagent_containers/chemtank
|
||||
name = "backpack chemical injector"
|
||||
desc = "A chemical autoinjector that can be carried on your back."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "waterbackpackatmos"
|
||||
item_state = "waterbackpackatmos"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
slowdown = 1
|
||||
actions_types = list(/datum/action/item_action/activate_injector)
|
||||
|
||||
var/on = FALSE
|
||||
volume = 300
|
||||
var/usage_ratio = 5 //5 unit added per 1 removed
|
||||
var/injection_amount = 1
|
||||
amount_per_transfer_from_this = 5
|
||||
reagent_flags = OPENCONTAINER
|
||||
spillable = FALSE
|
||||
possible_transfer_amounts = list(5,10,15)
|
||||
|
||||
/obj/item/reagent_containers/chemtank/ui_action_click()
|
||||
toggle_injection()
|
||||
|
||||
/obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user, datum/action/A)
|
||||
if(slot == SLOT_BACK)
|
||||
return 1
|
||||
|
||||
/obj/item/reagent_containers/chemtank/proc/toggle_injection()
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!istype(user))
|
||||
return
|
||||
if (user.get_item_by_slot(SLOT_BACK) != src)
|
||||
to_chat(user, "<span class='warning'>The chemtank needs to be on your back before you can activate it!</span>")
|
||||
return
|
||||
if(on)
|
||||
turn_off()
|
||||
else
|
||||
turn_on()
|
||||
|
||||
//Todo : cache these.
|
||||
/obj/item/reagent_containers/chemtank/proc/update_filling()
|
||||
cut_overlays()
|
||||
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpack-10")
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 15)
|
||||
filling.icon_state = "backpack-10"
|
||||
if(16 to 60)
|
||||
filling.icon_state = "backpack50"
|
||||
if(61 to INFINITY)
|
||||
filling.icon_state = "backpack100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
|
||||
/obj/item/reagent_containers/chemtank/worn_overlays(var/isinhands = FALSE) //apply chemcolor and level
|
||||
. = list()
|
||||
//inhands + reagent_filling
|
||||
if(!isinhands && reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10")
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 15)
|
||||
filling.icon_state = "backpackmob-10"
|
||||
if(16 to 60)
|
||||
filling.icon_state = "backpackmob50"
|
||||
if(61 to INFINITY)
|
||||
filling.icon_state = "backpackmob100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
. += filling
|
||||
|
||||
/obj/item/reagent_containers/chemtank/proc/turn_on()
|
||||
on = TRUE
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>[src] turns on.</span>")
|
||||
|
||||
/obj/item/reagent_containers/chemtank/proc/turn_off()
|
||||
on = FALSE
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>[src] turns off.</span>")
|
||||
|
||||
/obj/item/reagent_containers/chemtank/process()
|
||||
if(!ishuman(loc))
|
||||
turn_off()
|
||||
return
|
||||
if(!reagents.total_volume)
|
||||
turn_off()
|
||||
return
|
||||
var/mob/living/carbon/human/user = loc
|
||||
if(user.back != src)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/used_amount = injection_amount/usage_ratio
|
||||
reagents.reaction(user, INJECT,injection_amount,0)
|
||||
reagents.trans_to(user,used_amount,multiplier=usage_ratio)
|
||||
update_filling()
|
||||
user.update_inv_back() //for overlays update
|
||||
|
||||
//Operator backpack spray
|
||||
/obj/item/watertank/op
|
||||
name = "backpack water tank"
|
||||
desc = "A New Russian backpack spray for systematic cleansing of carbon lifeforms."
|
||||
icon_state = "waterbackpackjani"
|
||||
item_state = "waterbackpackjani"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
volume = 2000
|
||||
slowdown = 0
|
||||
|
||||
/obj/item/watertank/op/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("mutagen",350)
|
||||
reagents.add_reagent("napalm",125)
|
||||
reagents.add_reagent("welding_fuel",125)
|
||||
reagents.add_reagent("clf3",300)
|
||||
reagents.add_reagent("cryptobiolin",350)
|
||||
reagents.add_reagent("plasma",250)
|
||||
reagents.add_reagent("condensedcapsaicin",500)
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/op
|
||||
desc = "A mister nozzle attached to several extended water tanks. It suspiciously has a compressor in the system and is labelled entirely in New Cyrillic."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "misterjani"
|
||||
item_state = "misterjani"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/mister_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/mister_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
amount_per_transfer_from_this = 100
|
||||
possible_transfer_amounts = list(75,100,150)
|
||||
|
||||
/obj/item/watertank/op/make_noz()
|
||||
return new /obj/item/reagent_containers/spray/mister/op(src)
|
||||
Reference in New Issue
Block a user