diff --git a/aurorastation.dme b/aurorastation.dme
index 6d2c00f6aea..8ad151ada25 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1752,6 +1752,7 @@
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\ore.dm"
#include "code\modules\mining\ore_datum.dm"
+#include "code\modules\mining\ore_satchel.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\drilling\drill.dm"
#include "code\modules\mining\drilling\scanner.dm"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index be382509ad1..2dbbe477741 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -115,26 +115,6 @@
cant_hold = list(/obj/item/disk/nuclear)
drop_sound = 'sound/items/drop/wrapper.ogg'
-// -----------------------------
-// Mining Satchel
-// -----------------------------
-
-/obj/item/storage/bag/ore
- name = "mining satchel"
- desc = "This little bugger can be used to store and transport ores."
- icon = 'icons/obj/mining.dmi'
- icon_state = "satchel"
- slot_flags = SLOT_BELT | SLOT_POCKET
- w_class = 3
- max_storage_space = 100
- max_w_class = 3
- can_hold = list(/obj/item/ore)
-
-/obj/item/storage/bag/ore/drone
- // this used to be 400. The inventory system FUCKING DIED at this.
- max_storage_space = 200
-
-
// -----------------------------
// Plant bag
// -----------------------------
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index fe04bd9de49..b36787e4c75 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -8,6 +8,7 @@
/obj/machinery/mining/drill
name = "mining drill head"
desc = "A large industrial drill. Its bore does not penetrate deep enough to access the sublevels."
+ description_info = "You can upgrade this machine with better matter bins, capacitors, micro lasers, and power cells. You can also attach a mining satchel that has a warp pack and a linked ore box to it, to bluespace teleport any mined ore directly into the linked ore box."
icon_state = "mining_drill"
obj_flags = OBJ_FLAG_ROTATABLE
var/braces_needed = 2
@@ -34,6 +35,7 @@
var/capacity
var/charge_use
var/obj/item/cell/cell
+ var/obj/item/storage/bag/ore/attached_satchel
//Flags
var/need_update_field = FALSE
@@ -54,6 +56,7 @@
spark_system = bind_spark(src, 3)
/obj/machinery/mining/drill/Destroy()
+ QDEL_NULL(attached_satchel)
QDEL_NULL(spark_system)
return ..()
@@ -84,6 +87,10 @@
var/turf/unsimulated/floor/asteroid/T = get_turf(src)
if(!T.dug)
T.gets_dug()
+ for(var/obj/item/ore/ore in range(1, src)) // gets_dug causes ore to spawn, this picks that ore up as well
+ ore.forceMove(src)
+ if(attached_satchel?.linked_box)
+ attached_satchel.insert_into_storage(ore)
else if(istype(get_turf(src), /turf/simulated/floor))
var/turf/simulated/floor/T = get_turf(src)
T.ex_act(2.0)
@@ -98,7 +105,7 @@
resource_field -= harvesting
harvesting = pick(resource_field)
- if(!harvesting)
+ if(!harvesting)
return
var/total_harvest = harvest_speed //Ore harvest-per-tick.
@@ -132,7 +139,9 @@
for(var/i = 1, i <= create_ore, i++)
var/oretype = ore_types[ore]
- new oretype(src)
+ var/obj/stored_ore = new oretype(src)
+ if(attached_satchel?.linked_box)
+ attached_satchel.insert_into_storage(stored_ore)
if(!found_resource)
harvesting.has_resources = FALSE
@@ -152,6 +161,8 @@
if(panel_open)
to_chat(user, "The power cell is [cell ? "installed" : "missing"].")
to_chat(user, "The cell charge meter reads [cell ? round(cell.percent(),1) : 0]%")
+ if(attached_satchel && user.Adjacent(src))
+ to_chat(user, FONT_SMALL(SPAN_NOTICE("It has a [attached_satchel] attached to it.")))
return
@@ -170,6 +181,32 @@
if(active)
return ..()
+ if(istype(O, /obj/item/storage/bag/ore))
+ var/obj/item/storage/bag/ore/S = O
+ if(attached_satchel)
+ to_chat(user, SPAN_WARNING("\The [src] already has a satchel attached to it!"))
+ return
+ if(!S.linked_beacon)
+ to_chat(user, SPAN_WARNING("\The [S] doesn't have an extraction pack in it!"))
+ return
+ if(!S.linked_box)
+ to_chat(user, SPAN_WARNING("\The [S] doesn't have a linked ore box!"))
+ return
+ user.drop_from_inventory(S, src)
+ attached_satchel = S
+ to_chat(user, SPAN_NOTICE("You attach \the [S] to \the [src]."))
+ return
+
+ if(O.iswrench())
+ if(!attached_satchel)
+ to_chat(user, SPAN_WARNING("\The [src] doesn't have a satchel attached to it!"))
+ return
+ attached_satchel.forceMove(get_turf(user))
+ user.put_in_hands(attached_satchel)
+ to_chat(user, SPAN_NOTICE("You detach \the [attached_satchel]."))
+ attached_satchel = null
+ return
+
if(O.iscrowbar())
if (panel_open)
if(cell)
@@ -340,17 +377,18 @@
set category = "Object"
set src in oview(1)
- if(usr.stat) return
+ if(use_check_and_message(usr))
+ return
var/obj/structure/ore_box/B = locate() in orange(1)
if(B)
for(var/obj/item/ore/O in contents)
O.forceMove(B)
- to_chat(usr, "You unload the drill's storage cache into the ore box.")
+ to_chat(usr, SPAN_NOTICE("You unload \the [src]'s storage cache into the ore box."))
else
for(var/obj/item/ore/O in contents)
- O.forceMove(src.loc)
- to_chat(usr, "You spill the content's of the drill's storage box all over the ground. Idiot.")
+ O.forceMove(get_turf(src))
+ to_chat(usr, SPAN_NOTICE("You spill the contents of \the [src]'s storage box all over the ground"))
/obj/machinery/mining/brace
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 8d728f5ef1e..9e59da57aa6 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -851,8 +851,10 @@ var/list/total_extraction_beacons = list()
beacon = A
/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user)
+ if(istype(A, /obj/item/storage/bag/ore))
+ return
if(!beacon)
- to_chat(user, "\The [src] is not linked to a beacon, and cannot be used.")
+ to_chat(user, SPAN_WARNING("\The [src] is not linked to a beacon, and cannot be used."))
return
if(!istype(A))
return
@@ -885,6 +887,7 @@ var/list/total_extraction_beacons = list()
/obj/item/warp_core
name = "warp extraction beacon signaller"
desc = "Emits a signal which Warp-Item recovery devices can lock onto. Activate in hand to create a beacon."
+ description_info = "You can activate this item in-hand to create a static beacon, or you can click on an ore box with it to allow the ore box to be linked to warp packed mining satchels."
icon = 'icons/obj/stock_parts.dmi'
icon_state = "subspace_amplifier"
origin_tech = list(TECH_BLUESPACE = 1, TECH_PHORON = 1, TECH_ENGINEERING = 2)
diff --git a/code/modules/mining/ore_satchel.dm b/code/modules/mining/ore_satchel.dm
new file mode 100644
index 00000000000..231ada2d471
--- /dev/null
+++ b/code/modules/mining/ore_satchel.dm
@@ -0,0 +1,74 @@
+/obj/item/storage/bag/ore
+ name = "mining satchel"
+ desc = "This little bugger can be used to store and transport ores."
+ description_info = "You can attach a warp extraction pack to it, then click on an ore box that has a warp extraction beacon signaller attached to it to link them. Then ore put into this will be bluespace teleported into the ore box."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "satchel"
+ slot_flags = SLOT_BELT | SLOT_POCKET
+ max_storage_space = 100
+ can_hold = list(/obj/item/ore)
+ var/obj/structure/ore_box/linked_box
+ var/linked_beacon = FALSE // can't hold an actual beacon beclause storage code a shit
+ var/linked_beacon_uses = 3 // to hold the amount of uses the beacon had, storage code a shit.
+
+/obj/item/storage/bag/ore/examine(mob/user)
+ ..()
+ if(user.Adjacent(src))
+ to_chat(user, FONT_SMALL(SPAN_NOTICE("It has a warp extraction pack inside.")))
+
+/obj/item/storage/bag/ore/drone
+ // this used to be 400. The inventory system FUCKING DIED at this.
+ max_storage_space = 200
+
+/obj/item/storage/bag/ore/Destroy()
+ linked_box = null
+ linked_beacon = FALSE
+ return ..()
+
+/obj/item/storage/bag/ore/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/extraction_pack))
+ var/obj/item/extraction_pack/E = W
+ if(linked_beacon)
+ to_chat(user, SPAN_WARNING("\The [src] already has a warp extraction pack!"))
+ return
+ linked_beacon = TRUE
+ linked_beacon_uses = E.uses_left
+ to_chat(user, SPAN_NOTICE("You attach \the [E] to \the [src]."))
+ qdel(E)
+ else if(W.isscrewdriver())
+ if(!linked_beacon)
+ to_chat(user, SPAN_WARNING("\The [src] doesn't have a linked extraction pack!"))
+ return
+ var/obj/item/extraction_pack/E = new /obj/item/extraction_pack(get_turf(user))
+ E.uses_left = linked_beacon_uses
+ user.put_in_hands(linked_beacon)
+ to_chat(user, SPAN_NOTICE("You detach the warp extraction pack."))
+ linked_box = null
+ linked_beacon = FALSE
+ else
+ ..()
+
+// called when you click on a turf to pick up ores
+/obj/item/storage/bag/ore/handle_storage_deferred(mob/user)
+ if(check_linked_box(user))
+ move_ore_to_ore_box()
+ ..()
+
+// called when you attack the bag with the ore to put one in
+/obj/item/storage/bag/ore/handle_item_insertion(obj/item/W, prevent_warning = FALSE, mob/user = usr)
+ ..()
+ if(check_linked_box(user))
+ move_ore_to_ore_box()
+
+/obj/item/storage/bag/ore/proc/check_linked_box(var/mob/user)
+ if(linked_box)
+ if(!linked_box.warp_core)
+ to_chat(user, SPAN_WARNING("\The [linked_box] lost its warp beacon!"))
+ linked_box = null
+ return FALSE
+ return TRUE
+
+/obj/item/storage/bag/ore/proc/move_ore_to_ore_box()
+ for(var/obj/ore in contents)
+ remove_from_storage_deferred(ore, get_turf(src))
+ ore.forceMove(linked_box)
\ No newline at end of file
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 3a558977dcf..6158ae4e4fb 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -4,29 +4,54 @@
/obj/structure/ore_box
name = "ore box"
desc = "A heavy box used for storing ore."
+ description_info = "You can attach a warp extraction beacon signaller to this, then click on it with an ore satchel that has a warp extraction pack attached, to link them."
icon = 'icons/obj/mining.dmi'
icon_state = "orebox0"
density = TRUE
var/last_update = 0
+ var/obj/item/warp_core/warp_core // to set up the bluespace network
var/list/stored_ore = list()
/obj/structure/ore_box/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/ore))
- user.remove_from_mob(W)
- src.contents += W
+ user.drop_from_inventory(W, src)
+ if(istype(W, /obj/item/storage/bag/ore))
+ var/obj/item/storage/bag/ore/satchel = W
+ if(satchel.linked_beacon)
+ if(!warp_core)
+ to_chat(user, SPAN_WARNING("\The [src] doesn't have a warp beacon!"))
+ return
+ satchel.linked_box = src
+ to_chat(user, SPAN_NOTICE("You link \the [satchel] to \the [src]."))
+ return
if(istype(W, /obj/item/storage))
var/obj/item/storage/S = W
S.hide_from(user)
for(var/obj/item/ore/O in S.contents)
S.remove_from_storage_deferred(O, src, user) //This will move the item to this item's contents
CHECK_TICK
-
S.post_remove_from_storage_deferred(loc, user)
to_chat(user, span("notice", "You empty the satchel into the box."))
+ if(istype(W, /obj/item/warp_core))
+ if(warp_core)
+ to_chat(user, SPAN_WARNING("\The [src] already has a warp core attached!"))
+ return
+ user.drop_from_inventory(W, src)
+ warp_core = W
+ to_chat(user, SPAN_NOTICE("You carefully attach \the [W] to \the [src], connecting it to the bluespace network."))
update_ore_count()
return
+/obj/structure/ore_box/attack_hand(mob/user)
+ if(warp_core)
+ warp_core.forceMove(get_turf(user))
+ user.put_in_hands(warp_core)
+ to_chat(user, SPAN_NOTICE("You detach \the [warp_core] from \the [src], disconnecting it from the bluespace network."))
+ warp_core = null
+ else
+ ..()
+
/obj/structure/ore_box/proc/update_ore_count()
stored_ore = list()
for(var/obj/item/ore/O in contents)
@@ -45,6 +70,9 @@
add_fingerprint(user)
+ if(warp_core)
+ to_chat(user, FONT_SMALL(SPAN_NOTICE("It has a warp extraction beacon signaller attached to it.")))
+
if(!length(contents))
to_chat(user, SPAN_NOTICE("It is empty."))
return
diff --git a/html/changelogs/geeves-bluespace_mining.yml b/html/changelogs/geeves-bluespace_mining.yml
new file mode 100644
index 00000000000..954a86657d4
--- /dev/null
+++ b/html/changelogs/geeves-bluespace_mining.yml
@@ -0,0 +1,8 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Bluespace mining is now possible, to do so, attach a warp extraction pack to a mining satchel, then a warp extraction beacon signaller to an ore box. Link them by clicking on the ore box with the satchel."
+ - rscadd: "You can attach a linked mining satchel to a mining drill to teleport mined ores to the connected ore box."
+ - rscadd: "Mining satchel beacons can be removed with a screwdriver, mining drill satchels by wrench, and ore box beacons by hand."
\ No newline at end of file