diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm
index d80f7d1bc4..a6825b32ef 100644
--- a/code/datums/supplypacks/supply.dm
+++ b/code/datums/supplypacks/supply.dm
@@ -57,6 +57,7 @@
/obj/item/weapon/reagent_containers/spray/cleaner,
/obj/item/weapon/reagent_containers/glass/rag,
/obj/item/weapon/grenade/chem_grenade/cleaner = 3,
+ /obj/item/device/vac_attachment, //CHOMPAdd
/obj/structure/mopbucket
)
cost = 10
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 86cb04e20d..0492608962 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -80,6 +80,7 @@
/obj/item/device/lightreplacer,
/obj/item/weapon/storage/bag/trash,
/obj/item/weapon/storage/belt/janitor,
+ /obj/item/device/vac_attachment, //CHOMPAdd
/obj/item/clothing/shoes/galoshes
)
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 142e130493..63c117a8fa 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -43,6 +43,9 @@
var/recycles = FALSE
var/medsensor = TRUE //Does belly sprite come with patient ok/dead light?
var/obj/item/device/healthanalyzer/med_analyzer = null
+ var/ore_storage = FALSE //CHOMPAdd
+ var/max_ore_storage = 500 //CHOMPAdd
+ var/current_capacity = 0 //CHOMPAdd
/obj/item/device/dogborg/sleeper/New()
..()
@@ -281,6 +284,9 @@
dat += "Current load: [length(contents)] / [max_item_count] objects.
"
dat += "([contents.Join(", ")])
"
+ if(ore_storage) //CHOMPAdd
+ dat += "Current ore capacity: [current_capacity] / [max_ore_storage].
"
+
if(delivery && length(contents))
dat += "Current load: [length(contents)] / [max_item_count] objects.
"
dat += "Cargo compartment slot: Cargo 1.
"
@@ -769,10 +775,53 @@
/obj/item/device/dogborg/sleeper/compactor/supply //Miner borg belly
name = "Supply Satchel"
- desc = "A mounted survival unit with fuel processor."
+ desc = "A mounted survival unit with fuel processor and ore storage." //CHOMPEdit Start
icon_state = "sleeperc"
injection_chems = list("glucose","inaprovaline","tricordrazine")
- max_item_count = 1
+ max_item_count = 20
+ ore_storage = TRUE
+ var/list/stored_ore = list(
+ "sand" = 0,
+ "hematite" = 0,
+ "carbon" = 0,
+ "raw copper" = 0,
+ "raw tin" = 0,
+ "void opal" = 0,
+ "painite" = 0,
+ "quartz" = 0,
+ "raw bauxite" = 0,
+ "phoron" = 0,
+ "silver" = 0,
+ "gold" = 0,
+ "marble" = 0,
+ "uranium" = 0,
+ "diamond" = 0,
+ "platinum" = 0,
+ "lead" = 0,
+ "mhydrogen" = 0,
+ "verdantium" = 0,
+ "rutile" = 0)
+
+/obj/item/device/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc)
+ . = ..()
+ if(istype(thing, /obj/item/weapon/ore))
+ var/obj/item/weapon/ore/ore = thing
+ stored_ore[ore.material]++
+ current_capacity++
+ qdel(ore)
+
+/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/device/dogborg/sleeper/compactor/supply))
+ var/obj/item/device/dogborg/sleeper/compactor/supply/S = W
+ for(var/ore in S.stored_ore)
+ if(S.stored_ore[ore] > 0)
+ var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have?
+ stored_ore[ore] += ore_amount // Add the ore to the machine.
+ S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0.
+ S.current_capacity = 0 // Set the amount of ore in the satchel to 0.
+ to_chat(user, "You empty the satchel into the box.")
+ return
+ ..() //CHOMPEdit End
/obj/item/device/dogborg/sleeper/command //Command borg belly //CHOMP addition
name = "Bluespace Filing Belly"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index 6b6a5cb9c6..8f2f79bc48 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -593,6 +593,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/mop(src)
src.modules += new /obj/item/pupscrubber(src)
src.modules += new /obj/item/device/lightreplacer(src)
+ src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
@@ -766,6 +767,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
src.modules += new /obj/item/weapon/gripper/miner(src)
src.modules += new /obj/item/weapon/mining_scanner(src)
+ src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd
// New Emag gear for the minebots!
src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index 29d56e57b5..df844ca6a1 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -525,6 +525,7 @@
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/pupscrubber(src)
+ src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
//Starts empty. Can only recharge with recycled material.
@@ -951,6 +952,7 @@
src.modules += new /obj/item/weapon/mining_scanner(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/weapon/gun/energy/locked/phasegun/unlocked/mounted/cyborg(src) //Chompedit To let the borg defend themselves
+ src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd
// New Emag gear for the minebots!
src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src)
diff --git a/modular_chomp/code/game/objects/items/devices/vacpack.dm b/modular_chomp/code/game/objects/items/devices/vacpack.dm
new file mode 100644
index 0000000000..a1d3df449c
--- /dev/null
+++ b/modular_chomp/code/game/objects/items/devices/vacpack.dm
@@ -0,0 +1,235 @@
+//Vac attachment
+/obj/item/device/vac_attachment
+ name = "Vac-Pack attachment"
+ desc = "Useful for slurping mess off the floors. Even things and stuff depending on settings. Can be connected to a trash bag or vore belly. On-mob sprites can be toggled via verb in Objects tab."
+ icon = 'modular_chomp/icons/mob/vacpack.dmi'
+ icon_override = 'modular_chomp/icons/mob/vacpack.dmi'
+ icon_state = "sucker_drop"
+ item_state = "sucker"
+ var/vac_power = 0
+ var/output_dest = null
+ var/list/vac_settings = list(
+ "power off" = 0,
+ "dust and grime" = 1,
+ "tiny objects" = 2,
+ "pests and small objects" = 3,
+ "medium objects" = 4,
+ "large objects" = 5,
+ "large pests" = 6,
+ "output destination" = 7,
+ )
+
+/obj/item/device/vac_attachment/New()
+ ..()
+ flags |= NOBLUDGEON //No more attack messages
+
+/obj/item/device/vac_attachment/attack_self(mob/living/user)
+ var/set_input = null
+ if(!output_dest)
+ set_input = "output destination"
+ if(!set_input)
+ set_input = tgui_input_list(user, "Set your vacuum attachment's power level or output mode.", "Vac Settings", vac_settings)
+ if(set_input)
+ if(set_input == "output destination")
+ var/set_output = tgui_input_list(user, "Set your vacuum attachment's connection port", "Vac Settings", list("Vore Belly", "Borg Belly", "Trash Bag"))
+ if(set_output)
+ if(set_output == "Borg Belly")
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ var/obj/item/weapon/robot_module/M = R.module
+ for(var/obj/item/device/dogborg/sleeper/S in M.modules)
+ if(istype(S))
+ output_dest = S
+ return
+ to_chat(user, "Borg belly not found.")
+ if(set_output == "Trash Bag")
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ var/obj/item/weapon/robot_module/M = R.module
+ for(var/obj/item/weapon/storage/bag/trash/T in M.modules)
+ if(istype(T))
+ output_dest = T
+ return
+ for(var/obj/item/weapon/storage/bag/trash/T in user.contents)
+ if(istype(T))
+ output_dest = T
+ return
+ to_chat(user, "Trash bag not found.")
+ if(set_output == "Vore Belly")
+ if(user.vore_selected)
+ output_dest = user.vore_selected
+ return
+ else
+ vac_power = vac_settings[set_input]
+ icon_state = "sucker-[vac_power]"
+
+/obj/item/device/vac_attachment/afterattack(atom/target, mob/living/user, proximity)
+ if(vac_power < 1)
+ return
+ if(!proximity)
+ return
+ if(!output_dest)
+ return
+ if(istype(output_dest,/obj/item/weapon/storage/bag/trash))
+ if(get_turf(output_dest) != get_turf(user))
+ vac_power = 0
+ icon_state = "sucker-0"
+ output_dest = null
+ to_chat(user, "Trash bag not found. Shutting down.")
+ return
+ var/obj/item/weapon/storage/bag/trash/B = output_dest
+ if(LAZYLEN(B.contents) >= B.max_storage_space) //A bit more lenient than the w_class system to avoid complicated spaghetti.
+ to_chat(user, "Trash bag full. Empty trash bag contents to continue.")
+ return
+ if(istype(output_dest,/obj/item/device/dogborg/sleeper))
+ var/obj/item/device/dogborg/sleeper/B = output_dest
+ if(LAZYLEN(B.contents) >= B.max_item_count)
+ to_chat(user, "[B.name] full. Empty or process contents to continue.")
+ return
+ if(B.ore_storage)
+ if(B.current_capacity >= B.max_ore_storage)
+ to_chat(user, "Ore storage full. Deposit ore contents to a box continue.")
+ return
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ if(isturf(target))
+ user.visible_message("[user] begins vacuuming the mess off \the [target.name]...", "You begin vacuuming the mess off \the [target.name]...")
+ var/list/suckables = list()
+ if(vac_power >= 1)
+ for(var/obj/effect/decal/cleanable/C in target)
+ suckables |= C
+ if(vac_power >= 2)
+ for(var/obj/item/I in target)
+ if(I.anchored || I.w_class > 1)
+ continue
+ else
+ suckables |= I
+ if(vac_power >= 3)
+ for(var/obj/item/I in target)
+ if(I.anchored || I.w_class > 2)
+ continue
+ else
+ suckables |= I
+ for(var/mob/living/L in target)
+ if(L.anchored || !L.devourable || L == user || L.buckled)
+ continue
+ if(L.size_multiplier < 0.5)
+ suckables |= L
+ if(istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard) || istype(L,/mob/living/simple_mob/animal/passive/cockroach))
+ suckables |= L
+ if(vac_power >= 4)
+ for(var/obj/item/I in target)
+ if(I.anchored || I.w_class > 3)
+ continue
+ else
+ suckables |= I
+ if(vac_power >= 5)
+ for(var/obj/item/I in target)
+ if(I.anchored)
+ continue
+ else
+ suckables |= I
+ if(vac_power >= 6)
+ for(var/mob/living/L in target)
+ if(L.anchored || !L.devourable || L == user || L.buckled)
+ continue
+ suckables |= L
+ if(LAZYLEN(suckables))
+ playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1)
+ var/vac_conga = 0
+ for(var/atom/movable/F in suckables)
+ if(is_type_in_list(F,item_vore_blacklist) || F.loc != target)
+ continue
+ if(istype(F,/obj/effect/decal/cleanable))
+ qdel(F)
+ continue
+ if(vac_conga < 100)
+ vac_conga += 3
+ spawn(3 + vac_conga)
+ if(!F.Adjacent(user) || src.loc != user || vac_power < 2) //Cancel if moved/unpowered/dropped
+ break
+ F.SpinAnimation(5,1)
+ spawn(5)
+ if(F.loc == target)
+ if(isitem(F))
+ var/obj/item/I = F
+ if(I.drop_sound)
+ playsound(src, I.drop_sound, vac_power * 5, 1, -1)
+ playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1)
+ F.forceMove(output_dest)
+ if(istype(target, /turf/simulated))
+ var/turf/simulated/T = target
+ T.dirt = 0
+ T.clean_blood()
+ return
+ if(!isturf(target.loc))
+ return
+ if(istype(target,/obj/item))
+ var/obj/item/I = target
+ if(is_type_in_list(I,item_vore_blacklist))
+ return
+ if(vac_power > I.w_class)
+ playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1)
+ user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...")
+ I.SpinAnimation(5,1)
+ spawn(5)
+ if(I.drop_sound)
+ playsound(src, I.drop_sound, vac_power * 5, 1, -1)
+ playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1)
+ I.forceMove(output_dest)
+ else if(istype(target,/obj/effect/decal/cleanable))
+ playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1)
+ user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...")
+ qdel(target)
+ else if(isliving(target))
+ var/mob/living/L = target
+ var/valid_to_suck = FALSE
+ if(L.anchored || !L.devourable || L == user || L.buckled)
+ return
+ if(vac_power >= 3)
+ if(L.size_multiplier > 0.5 || istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard))
+ valid_to_suck = TRUE
+ if(vac_power >= 6)
+ valid_to_suck = TRUE
+ if(valid_to_suck)
+ playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1)
+ user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...")
+ L.SpinAnimation(5,1)
+ spawn(5)
+ playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1)
+ L.forceMove(output_dest)
+ return
+
+/obj/item/device/vac_attachment/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters)
+ if(istype(A,/obj/structure) && vac_power > 0)
+ afterattack(A.loc, user, click_parameters)
+ return TRUE
+ return ..()
+
+/obj/item/device/vac_attachment/pickup(mob/user)
+ .=..()
+ icon_state = "sucker-[vac_power]"
+
+/obj/item/device/vac_attachment/dropped(mob/user as mob)
+ .=..()
+ icon_state = "sucker_drop"
+
+/obj/item/device/vac_attachment/verb/hide_pack()
+ set name = "Toggle Vac-Pack Sprites"
+ set desc = "Toggle Vac-Pack sprite visibility"
+ set category = "Object"
+ var/choice = tgui_input_list(usr, "Vac-Pack Visibility Options", "Vac-Pack Visibility Options", list("Show Pack", "Show Tube", "Hidden"))
+ if(choice == "Show Pack")
+ item_state = "sucker"
+ if(choice == "Show Tube")
+ item_state = "sucker_nobag"
+ if(choice == "Hidden")
+ item_state = null
+ usr.update_inv_r_hand()
+ usr.update_inv_l_hand()
+
+/obj/item/weapon/storage/Entered(atom/movable/thing, atom/OldLoc) //Holder the mob so they don't get stuck in trashbags etc.
+ . = ..()
+ if(isliving(thing))
+ var/mob/living/L = thing
+ var/mob_holder_type = L.holder_type || /obj/item/weapon/holder
+ new mob_holder_type(src, L)
\ No newline at end of file
diff --git a/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 54465130be..d9ad755156 100644
--- a/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -610,4 +610,4 @@
/obj/item/weapon/handcuffs,
/obj/item/toy,
/obj/item/petrifier
- )
\ No newline at end of file
+ )
diff --git a/modular_chomp/icons/mob/vacpack.dmi b/modular_chomp/icons/mob/vacpack.dmi
new file mode 100644
index 0000000000..644b09f83d
Binary files /dev/null and b/modular_chomp/icons/mob/vacpack.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index d6d6ed0d14..b1b4c640ae 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4552,6 +4552,7 @@
#include "modular_chomp\code\game\objects\items\petrifier.dm"
#include "modular_chomp\code\game\objects\items\clockwork\ratvarian_spear.dm"
#include "modular_chomp\code\game\objects\items\devices\flipper.dm"
+#include "modular_chomp\code\game\objects\items\devices\vacpack.dm"
#include "modular_chomp\code\game\objects\items\weapons\capture_crystal.dm"
#include "modular_chomp\code\game\objects\random\mapping.dm"
#include "modular_chomp\code\game\objects\structures\desert_planet_structures.dm"