diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f8f042eab02..049daa8a0e5 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -694,9 +694,9 @@ var/global/list/default_medbay_channels = list(
if(!SSradio)
src.name = "broken radio"
return
-
secure_radio_connections[ch_name] = SSradio.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+ setupRadioDescription()
return
/obj/item/device/radio/borg/Topic(href, href_list)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 94e29d6da9b..7180600b3a5 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -565,7 +565,7 @@
return
if(empty_delay)
- visible_message("\The [usr] starts to empty the contents of \the [src].")
+ usr.visible_message("\The [usr] starts to empty the contents of \the [src]...", SPAN_NOTICE("You start emptying the contents of \the [src]..."))
if(!do_after(usr, contents.len * empty_delay, act_target=usr))
return
@@ -578,9 +578,7 @@
CHECK_TICK
post_remove_from_storage_deferred(loc, usr)
-
- if(empty_delay)
- visible_message("\The [usr] empties the contents of \the [src].")
+ usr.visible_message("\The [usr] empties the contents of \the [src].", , SPAN_NOTICE("You empty the contents of \the [src]."))
// Override this to fill the storage object with stuff.
/obj/item/storage/proc/fill()
@@ -658,6 +656,13 @@
src.quick_empty()
return 1
+/obj/item/storage/CtrlClick(mob/user)
+ if(user.get_active_hand() == src)
+ if(src.verbs.Find(/obj/item/storage/verb/quick_empty))
+ src.quick_empty()
+ return
+ ..()
+
/obj/item/storage/proc/make_exact_fit()
storage_slots = contents.len
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index 687f5a905bc..076f20caf08 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -196,11 +196,33 @@
if(!active)
if(default_deconstruction_screwdriver(user, O))
return
- if (!panel_open)
- if(default_deconstruction_crowbar(user, O))
- return
- if(default_part_replacement(user, O))
+ if(default_part_replacement(user, O))
+ return
+
+ if(istype(O, /obj/item/mining_scanner))
+ if(!length(resource_field))
+ to_chat(user, SPAN_WARNING("\The [src] has no resource field to draw data from!"))
+ return
+ to_chat(user, SPAN_NOTICE("You start drawing the data from \the [src]..."))
+ if(do_after(user, 50, TRUE))
+ if(!length(resource_field))
+ to_chat(user, SPAN_WARNING("\The [src] has no resource field to draw data from!"))
return
+ var/list/ore_data = list()
+ for(var/ore_type in ore_types)
+ ore_data[ore_type] = 0
+ for(var/field in resource_field)
+ var/turf/T = field
+ if(!T.resources)
+ continue
+ for(var/ore in ore_types)
+ if(T.resources[ore])
+ ore_data[ore] += T.resources[ore]
+ to_chat(user, SPAN_NOTICE("\The [src] has found this ore in the vicinity, and is able to gather it:"))
+ for(var/entry in ore_data)
+ to_chat(user, SPAN_NOTICE(" | [entry] - [ore_data[entry]]"))
+ return
+
if(active)
return ..()
@@ -237,16 +259,37 @@
return
if(O.iscrowbar())
- if (panel_open)
+ if(panel_open)
if(cell)
- to_chat(user, SPAN_NOTICE("You wrench out \the [cell]."))
+ to_chat(user, SPAN_NOTICE("You shimmy out \the [cell]."))
cell.forceMove(get_turf(user))
component_parts -= cell
+ user.put_in_hands(cell)
cell = null
return
else
to_chat(user, SPAN_WARNING("There's no cell to remove!"))
return
+ else
+ to_chat(user, SPAN_WARNING("The hatch must be open to take out a power cell."))
+ return
+
+ if(istype(O, /obj/item/gripper/miner)) // the gripper will always be empty, because it passes its wrapped object's attack if it has one
+ var/obj/item/gripper/miner/M = O
+ if(panel_open)
+ if(cell)
+ to_chat(user, SPAN_NOTICE("You use your gripper to squeeze the cell out of its case."))
+ cell.forceMove(get_turf(user))
+ component_parts -= cell
+ M.grip_item(cell, user, FALSE)
+ cell = null
+ return
+ else
+ to_chat(user, SPAN_WARNING("There's no cell to remove!"))
+ return
+ else
+ to_chat(user, SPAN_WARNING("The hatch must be open to take out a power cell."))
+ return
if(istype(O, /obj/item/cell))
if(panel_open)
@@ -259,11 +302,11 @@
cell = O
component_parts += O
O.add_fingerprint(user)
- visible_message(span("notice", "\The [user] inserts a power cell into \the [src]."),
- span("notice", "You insert the power cell into \the [src]."))
+ visible_message("\The [user] inserts a power cell into \the [src].",
+ SPAN_NOTICE("You insert the power cell into \the [src]."))
power_change()
else
- to_chat(user, span("notice", "The hatch must be open to insert a power cell."))
+ to_chat(user, SPAN_WARNING("The hatch must be open to insert a power cell."))
return
else
..()
diff --git a/code/modules/mob/living/silicon/robot/gripper.dm b/code/modules/mob/living/silicon/robot/gripper.dm
index cc05a6790f4..d0c390922f5 100644
--- a/code/modules/mob/living/silicon/robot/gripper.dm
+++ b/code/modules/mob/living/silicon/robot/gripper.dm
@@ -59,6 +59,8 @@
to_chat(user, SPAN_NOTICE("You collect \the [I]."))
I.forceMove(src)
wrapped = I
+ wrapped.pixel_x = 0
+ wrapped.pixel_y = 0
update_icon()
return TRUE
if(feedback)
@@ -90,6 +92,12 @@
update_icon()
return ..()
+/obj/item/gripper/CtrlClick(mob/user)
+ if(wrapped)
+ drop(get_turf(src))
+ return
+ to_chat(user, SPAN_WARNING("\The [src] isn't gripping anything!"))
+
/obj/item/gripper/verb/drop_item()
set name = "Drop Item"
set desc = "Release an item from your magnetic gripper."
@@ -98,8 +106,13 @@
drop(get_turf(src))
/obj/item/gripper/proc/drop(var/atom/target)
- if(wrapped?.loc == src)
- wrapped.forceMove(target)
+ if(wrapped)
+ if(wrapped.loc == src)
+ if(force_holder)
+ wrapped.force = force_holder
+ wrapped.forceMove(target)
+ force_holder = null
+ to_chat(loc, SPAN_NOTICE("You release \the [wrapped].")) // loc will always be the cyborg
wrapped = null
update_icon()
return TRUE
@@ -153,6 +166,8 @@
if(!isturf(target.loc))
return
grip_item(target, user)
+ else if (istype(target, /obj/machinery/mining)) // to prevent them from activating it by accident
+ return
else if (!just_dropped)
target.attack_ai(user)
just_dropped = FALSE
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 60944f0f535..af03da1cc3e 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -685,6 +685,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful.
src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
+ src.modules += new /obj/item/storage/part_replacer(src)
src.emag = new /obj/item/gun/energy/plasmacutter/mounted(src)
/obj/item/robot_module/research
@@ -730,6 +731,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful.
src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
+ src.modules += new /obj/item/storage/part_replacer(src)
src.emag = new /obj/item/hand_tele(src)
var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000)
diff --git a/html/changelogs/geeves-drill_tweaks.yml b/html/changelogs/geeves-drill_tweaks.yml
new file mode 100644
index 00000000000..6ba29922f24
--- /dev/null
+++ b/html/changelogs/geeves-drill_tweaks.yml
@@ -0,0 +1,16 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - bugfix: "Mining drills can now be properly upgraded by part replacers."
+ - rscadd: "Mining grippers can now remove cells from mining drills, if the panel is open."
+ - bugfix: "Cyborg radio descriptions now update when they reset modules."
+ - rscadd: "Mining and science cyborgs now get part replacers in their modules."
+ - bugfix: "Grippers now position their items correctly, spritewise."
+ - rscadd: "Control-clicking your gripper will now make it drop its held item."
+ - bugfix: "Clicking a mining drill with a gripper will no longer activate or deactivate it, which will prevent a lot of accidents."
+ - tweak: "Taking a cell out of a mining drill will now place it in one of your hands, if one is open."
+ - bugfix: "Emptying a bag's contents onto the floor with the verb will now always display the message of you doing it."
+ - rscadd: "Control-clicking a storage item in your active hand will now attempt to empty it onto the floor, if it has that verb."
+ - rscadd: "Using an ore detector on a drill will now give a detailed readout of the ore in the vicinity that it has access to and call pull out."
\ No newline at end of file