Files
VOREStation/code/modules/recycling/sortingmachinery.dm
Kashargul f881d54dbf Panel port test [IDB IGNORE] (#17350)
* no more self callbacks on update fullness

* fix missing code

* Belly test

* import type

* full partiy

* .

* fix preview

* in belly to late join

* robot nutri

* .

* .

* update export

* finish open todos

* code cleanup

* fix some old slacking

* move this to a define

* fixing

* ,

* .

* Creates a Consume Belly Reagents pref (#10)

* Creates a Consume Belly Reagents pref

Added a Consume Belly Reagents pref that blocks the consumption of all reagents produced by a belly via reagent containers such as food, drink, beakers, pills, syringes and hyposprays. Seems to work well as intended.

* These changes at least do not cause any problems

* Missed this one

* Reverts reagent_names

* _BELLY versions

* Fixed typo

* .

* fix admin spawn mobs bellies

* also fix that bug

* hints

* fix that

* .

* initial

* should be all

* that is no longer needed

* fluids into hand items

I was convinced this was broken until it was pointed out that the item has to be ON THE GROUND to fill it...Instead of in your hand. That seems so convoluted.

ARC = active-hand reagent container. IRC = inactive-hand reagent container.

* some stuff

---------

Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-03-16 17:08:47 -04:00

482 lines
15 KiB
Plaintext
Executable File

/obj/structure/bigDelivery
desc = "A big wrapped package."
name = "large parcel"
icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit
icon_state = "deliverycloset"
var/obj/wrapped = null
density = TRUE
var/sortTag = null
flags = NOBLUDGEON
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/examtext = null
var/nameset = 0
var/label_y
var/label_x
var/tag_x
/obj/structure/bigDelivery/attack_hand(mob/user as mob)
unwrap()
/obj/structure/bigDelivery/proc/unwrap()
playsound(src, 'sound/items/package_unwrap.ogg', 50, 1)
// Destroy will drop our wrapped object on the turf, so let it.
qdel(src)
/obj/structure/bigDelivery/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/destTagger))
var/obj/item/destTagger/O = W
if(O.currTag)
if(src.sortTag != O.currTag)
to_chat(user, span_notice("You have labeled the destination as [O.currTag]."))
if(!src.sortTag)
src.sortTag = O.currTag
update_icon()
else
src.sortTag = O.currTag
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
else
to_chat(user, span_warning("The package is already labeled for [O.currTag]."))
else
to_chat(user, span_warning("You need to set a destination first!"))
else if(istype(W, /obj/item/pen))
switch(tgui_alert(user, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel")))
if("Title")
var/str = sanitizeSafe(tgui_input_text(user,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, span_warning(" Invalid text."))
return
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
span_notice("You title \the [src]: \"[str]\""),\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
name = "[name] ([str])"
if(!examtext && !nameset)
nameset = 1
update_icon()
else
nameset = 1
if("Description")
var/str = sanitize(tgui_input_text(user,"Label text?","Set label",""))
if(!str || !length(str))
to_chat(user, span_red("Invalid text."))
return
if(!examtext && !nameset)
examtext = str
update_icon()
else
examtext = str
user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\
span_notice("You label \the [src]: \"[examtext]\""),\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
return
/obj/structure/bigDelivery/update_icon()
cut_overlays()
if(nameset || examtext)
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
if(icon_state == "deliverycloset")
I.pixel_x = 2
if(label_y == null)
label_y = rand(-6, 11)
I.pixel_y = label_y
else if(icon_state == "deliverycrate")
if(label_x == null)
label_x = rand(-8, 6)
I.pixel_x = label_x
I.pixel_y = -3
add_overlay(I)
if(src.sortTag)
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
if(icon_state == "deliverycloset")
if(tag_x == null)
tag_x = rand(-2, 3)
I.pixel_x = tag_x
I.pixel_y = 9
else if(icon_state == "deliverycrate")
if(tag_x == null)
tag_x = rand(-8, 6)
I.pixel_x = tag_x
I.pixel_y = -3
add_overlay(I)
/obj/structure/bigDelivery/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 4)
if(sortTag)
. += span_notice("It is labeled \"[sortTag]\"")
if(examtext)
. += span_notice("It has a note attached which reads, \"[examtext]\"")
/obj/item/smallDelivery
desc = "A small wrapped package."
name = "small parcel"
icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit
icon_state = "deliverycrate3"
drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
var/obj/item/wrapped = null
var/sortTag = null
var/examtext = null
var/nameset = 0
var/tag_x
/obj/item/smallDelivery/attack_self(mob/user as mob)
if (src.wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
wrapped.loc = user.loc
if(ishuman(user))
user.put_in_hands(wrapped)
else
wrapped.loc = get_turf(src)
qdel(src)
return
/obj/item/smallDelivery/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/destTagger))
var/obj/item/destTagger/O = W
if(O.currTag)
if(src.sortTag != O.currTag)
to_chat(user, span_notice("You have labeled the destination as [O.currTag]."))
if(!src.sortTag)
src.sortTag = O.currTag
update_icon()
else
src.sortTag = O.currTag
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
else
to_chat(user, span_warning("The package is already labeled for [O.currTag]."))
else
to_chat(user, span_warning("You need to set a destination first!"))
else if(istype(W, /obj/item/pen))
switch(tgui_alert(user, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel")))
if("Title")
var/str = sanitizeSafe(tgui_input_text(user,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, span_warning(" Invalid text."))
return
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
span_notice("You title \the [src]: \"[str]\""),\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
name = "[name] ([str])"
if(!examtext && !nameset)
nameset = 1
update_icon()
else
nameset = 1
if("Description")
var/str = sanitize(tgui_input_text(user,"Label text?","Set label",""))
if(!str || !length(str))
to_chat(user, span_red("Invalid text."))
return
if(!examtext && !nameset)
examtext = str
update_icon()
else
examtext = str
user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\
span_notice("You label \the [src]: \"[examtext]\""),\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
return
/obj/item/smallDelivery/update_icon()
cut_overlays()
if((nameset || examtext) && icon_state != "deliverycrate1")
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
if(icon_state == "deliverycrate5")
I.pixel_y = -1
add_overlay(I)
if(src.sortTag)
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
switch(icon_state)
if("deliverycrate1")
I.pixel_y = -5
if("deliverycrate2")
I.pixel_y = -2
if("deliverycrate3")
I.pixel_y = 0
if("deliverycrate4")
if(tag_x == null)
tag_x = rand(0,5)
I.pixel_x = tag_x
I.pixel_y = 3
if("deliverycrate5")
I.pixel_y = -3
add_overlay(I)
/obj/item/smallDelivery/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 4)
if(sortTag)
. += span_notice("It is labeled \"[sortTag]\"")
if(examtext)
. += span_notice("It has a note attached which reads, \"[examtext]\"")
/obj/item/packageWrap
name = "package wrapper"
desc = "Like wrapping paper, but less festive."
icon = 'icons/obj/items.dmi'
icon_state = "deliveryPaper"
w_class = ITEMSIZE_NORMAL
var/amount = 25.0
drop_sound = 'sound/items/drop/wrapper.ogg'
/obj/item/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity)
if(!proximity) return
if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete
return
if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \
|| istype(target, /obj/item/gift) || istype(target, /obj/item/evidencebag))
return
if(target.anchored)
return
if(!isturf(target.loc)) //no wrapping things inside other things, just breaks things, put it on the ground first.
return
if(user in target) //no wrapping closets that you are inside - it's not physically possible
return
user.attack_log += text("\[[time_stamp()]\] [span_blue("Has used [src.name] on \ref[target]")]")
if (istype(target, /obj/item) && !(istype(target, /obj/item/storage) && !istype(target,/obj/item/storage/box)))
var/obj/item/O = target
if (src.amount > 1)
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
if(!istype(O.loc, /turf))
if(user.client)
user.client.screen -= O
P.wrapped = O
O.forceMove(P)
P.w_class = O.w_class
var/i = round(O.w_class)
if(i in list(1,2,3,4,5))
P.icon_state = "deliverycrate[i]"
switch(i)
if(1) P.name = "tiny parcel"
if(3) P.name = "normal-sized parcel"
if(4) P.name = "large parcel"
if(5) P.name = "huge parcel"
if(i < 1)
P.icon_state = "deliverycrate1"
P.name = "tiny parcel"
if(i > 5)
P.icon_state = "deliverycrate5"
P.name = "huge parcel"
P.add_fingerprint(user)
O.add_fingerprint(user)
src.add_fingerprint(user)
src.amount -= 1
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
span_notice("You wrap \the [target], leaving [amount] units of paper on \the [src]."),\
"You hear someone taping paper around a small object.")
playsound(src, 'sound/items/package_wrap.ogg', 50, 1)
else if (istype(target, /obj/structure/closet/crate))
var/obj/structure/closet/crate/O = target
if (src.amount > 3 && !O.opened)
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.icon_state = "deliverycrate"
P.wrapped = O
O.loc = P
src.amount -= 3
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
span_notice("You wrap \the [target], leaving [amount] units of paper on \the [src]."),\
"You hear someone taping paper around a large object.")
playsound(src, 'sound/items/package_wrap.ogg', 50, 1)
else if(src.amount < 3)
to_chat(user, span_warning("You need more paper."))
else if (istype (target, /obj/structure/closet))
var/obj/structure/closet/O = target
if (src.amount > 3 && !O.opened)
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.wrapped = O
O.sealed = 1
O.loc = P
src.amount -= 3
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
span_notice("You wrap \the [target], leaving [amount] units of paper on \the [src]."),\
"You hear someone taping paper around a large object.")
playsound(src, 'sound/items/package_wrap.ogg', 50, 1)
else if(src.amount < 3)
to_chat(user, span_warning("You need more paper."))
else
to_chat(user, span_blue("The object you are trying to wrap is unsuitable for the sorting machinery!"))
if (src.amount <= 0)
new /obj/item/c_tube( src.loc )
qdel(src)
return
return
/obj/item/packageWrap/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 0)
. += span_blue("There are [amount] units of package wrap left!")
/obj/structure/bigDelivery/Destroy()
if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
wrapped.forceMove(get_turf(src))
if(istype(wrapped, /obj/structure/closet))
var/obj/structure/closet/O = wrapped
O.sealed = 0
wrapped = null
var/turf/T = get_turf(src)
for(var/atom/movable/AM in contents)
AM.forceMove(T)
return ..()
/obj/item/destTagger
name = "destination tagger"
desc = "Used to set the destination of properly wrapped packages."
icon = 'icons/obj/device.dmi'
icon_state = "dest_tagger"
var/currTag = 0
w_class = ITEMSIZE_SMALL
item_state = "electronic"
slot_flags = SLOT_BELT
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'
/obj/item/destTagger/tgui_state(mob/user)
return GLOB.tgui_inventory_state
/obj/item/destTagger/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "DestinationTagger", name)
ui.open()
/obj/item/destTagger/tgui_static_data(mob/user)
var/list/data = ..()
var/list/taggers = list()
var/list/tagger_levels = list()
for(var/tag in GLOB.tagger_locations)
var/z_level = GLOB.tagger_locations[tag]
taggers += list(list("tag" = tag, "level" = z_level))
tagger_levels += list(list("z" = z_level, "location" = using_map.get_zlevel_name(z_level)))
data["taggerLevels"] = tagger_levels
data["taggerLocs"] = taggers
return data
/obj/item/destTagger/tgui_data(mob/user, datum/tgui/ui)
var/list/data = ..()
data["currTag"] = currTag
return data
/obj/item/destTagger/attack_self(mob/user as mob)
tgui_interact(user)
/obj/item/destTagger/tgui_act(action, params, datum/tgui/ui)
if(..())
return TRUE
add_fingerprint(ui.user)
switch(action)
if("set_tag")
var/new_tag = params["tag"]
if(!(new_tag in GLOB.tagger_locations))
return FALSE
currTag = new_tag
. = TRUE
/obj/machinery/disposal/deliveryChute
name = "Delivery chute"
desc = "A chute for big and small packages alike!"
density = TRUE
icon_state = "intake"
var/c_mode = 0
/obj/machinery/disposal/deliveryChute/Initialize(mapload)
. = ..()
trunk = locate() in src.loc
if(trunk)
trunk.linked = src // link the pipe trunk to self
/obj/machinery/disposal/deliveryChute/interact()
return
/obj/machinery/disposal/deliveryChute/update()
return
/obj/machinery/disposal/deliveryChute/Bumped(var/atom/movable/AM) //Go straight into the chute
if(istype(AM, /obj/item/projectile) || istype(AM, /obj/effect) || istype(AM, /obj/mecha)) return
switch(dir)
if(NORTH)
if(AM.loc.y != src.loc.y+1) return
if(EAST)
if(AM.loc.x != src.loc.x+1) return
if(SOUTH)
if(AM.loc.y != src.loc.y-1) return
if(WEST)
if(AM.loc.x != src.loc.x-1) return
if(istype(AM, /obj))
var/obj/O = AM
O.loc = src
else if(istype(AM, /mob))
var/mob/M = AM
M.loc = src
src.flush()
/obj/machinery/disposal/deliveryChute/flush()
flushing = 1
flick("intake-closing", src)
var/obj/structure/disposalholder/H = new() // virtual holder object which actually
// travels through the pipes.
air_contents = new() // new empty gas resv.
sleep(10)
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
sleep(5) // wait for animation to finish
H.init(src) // copy the contents of disposer to holder
H.start(src) // start the holder processing movement
flushing = 0
// now reset disposal state
flush = 0
if(mode == 2) // if was ready,
mode = 1 // switch to charging
update()
return
/obj/machinery/disposal/deliveryChute/attackby(var/obj/item/I, var/mob/user)
if(!I || !user)
return
if(I.has_tool_quality(TOOL_SCREWDRIVER))
c_mode = !c_mode
playsound(src, I.usesound, 50, 1)
to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.")
return
if(I.has_tool_quality(TOOL_WELDER) && c_mode==1)
var/obj/item/weldingtool/W = I.get_welder()
if(!W.remove_fuel(0,user))
to_chat(user, "You need more welding fuel to complete this task.")
return
playsound(src, W.usesound, 50, 1)
to_chat(user, "You start slicing the floorweld off the delivery chute.")
if(do_after(user,20 * W.toolspeed))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
C.ptype = 8 // 8 = Delivery chute
C.update()
C.anchored = TRUE
C.density = TRUE
qdel(src)
return
/obj/machinery/disposal/deliveryChute/Destroy()
if(trunk)
trunk.linked = null
. = ..()