mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 21:18:37 +01:00
Adjust objects to tabletop when wrenched (#75671)
 ## About The Pull Request Added a variable to `/obj/` that can be set to adjust the object sprite when it mapspawns or being wrenched on top of a table. Set this variable for some popular tabletop machines, removing the default `pixel_y` offsets for some of them. Also moved the wrenching logic to /obj/. It was under machinery for some reason. ## Why It's Good For The Game Did you ever unwrench something from the table by accident and then was annoyed that you can't revet it back? ## Changelog 🆑 qol: Objects have a variable to adjust them visually when they're wrenched or spawned on a table refactor: Removed redundant code that had similar purpose, moved `obj` wrenching logic into the `objs.dm` qol: food/slime processor can be moved on table and adjusts to it when wrenched /🆑
This commit is contained in:
@@ -289,7 +289,6 @@
|
||||
/obj/machinery/proc/process_atmos()//If you dont use process why are you here
|
||||
return PROCESS_KILL
|
||||
|
||||
|
||||
///Called when we want to change the value of the machine_stat variable. Holds bitflags.
|
||||
/obj/machinery/proc/set_machine_stat(new_value)
|
||||
if(new_value == machine_stat)
|
||||
@@ -914,46 +913,6 @@
|
||||
to_chat(user, span_notice("You rotate [src]."))
|
||||
return TRUE
|
||||
|
||||
/obj/proc/can_be_unfasten_wrench(mob/user, silent) //if we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't.
|
||||
if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored)
|
||||
to_chat(user, span_warning("[src] needs to be on the floor to be secured!"))
|
||||
return FAILED_UNFASTEN
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY
|
||||
if((flags_1 & NODECONSTRUCT_1) || wrench.tool_behaviour != TOOL_WRENCH)
|
||||
return CANT_UNFASTEN
|
||||
|
||||
var/turf/ground = get_turf(src)
|
||||
if(!anchored && ground.is_blocked_turf(exclude_mobs = TRUE, source_atom = src))
|
||||
to_chat(user, span_notice("You fail to secure [src]."))
|
||||
return CANT_UNFASTEN
|
||||
var/can_be_unfasten = can_be_unfasten_wrench(user)
|
||||
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
|
||||
return can_be_unfasten
|
||||
if(time)
|
||||
to_chat(user, span_notice("You begin [anchored ? "un" : ""]securing [src]..."))
|
||||
wrench.play_tool_sound(src, 50)
|
||||
var/prev_anchored = anchored
|
||||
//as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state
|
||||
if(!wrench.use_tool(src, user, time, extra_checks = CALLBACK(src, PROC_REF(unfasten_wrench_check), prev_anchored, user)))
|
||||
return FAILED_UNFASTEN
|
||||
if(!anchored && ground.is_blocked_turf(exclude_mobs = TRUE, source_atom = src))
|
||||
to_chat(user, span_notice("You fail to secure [src]."))
|
||||
return CANT_UNFASTEN
|
||||
to_chat(user, span_notice("You [anchored ? "un" : ""]secure [src]."))
|
||||
set_anchored(!anchored)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored)
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/obj/proc/unfasten_wrench_check(prev_anchored, mob/user) //for the do_after, this checks if unfastening conditions are still valid
|
||||
if(anchored != prev_anchored)
|
||||
return FALSE
|
||||
if(can_be_unfasten_wrench(user, TRUE) != SUCCESSFUL_UNFASTEN) //if we aren't explicitly successful, cancel the fuck out
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer_tool)
|
||||
if(!istype(replacer_tool))
|
||||
return FALSE
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
/// Icon to use as a 32x32 preview in crafting menus and such
|
||||
var/icon_preview
|
||||
var/icon_state_preview
|
||||
/// The vertical pixel offset applied when the object is anchored on a tile with table
|
||||
/// Ignored when set to 0 - to avoid shifting directional wall-mounted objects above tables
|
||||
var/anchored_tabletop_offset = 0
|
||||
|
||||
var/damtype = BRUTE
|
||||
var/force = 0
|
||||
@@ -62,6 +65,8 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
|
||||
/obj/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
check_on_table()
|
||||
|
||||
if (id_tag)
|
||||
GLOB.objects_by_id_tag[id_tag] = src
|
||||
|
||||
@@ -351,7 +356,7 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
|
||||
var/datum/reagent/R = reagent
|
||||
. |= R.expose_obj(src, reagents[R])
|
||||
|
||||
///attempt to freeze this obj if possible. returns TRUE if it succeeded, FALSE otherwise.
|
||||
/// Attempt to freeze this obj if possible. returns TRUE if it succeeded, FALSE otherwise.
|
||||
/obj/proc/freeze()
|
||||
if(HAS_TRAIT(src, TRAIT_FROZEN))
|
||||
return FALSE
|
||||
@@ -361,6 +366,55 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
|
||||
AddElement(/datum/element/frozen)
|
||||
return TRUE
|
||||
|
||||
///unfreezes this obj if its frozen
|
||||
/// Unfreezes this obj if its frozen
|
||||
/obj/proc/unfreeze()
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_UNFREEZE)
|
||||
|
||||
/// If we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't.
|
||||
/obj/proc/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored)
|
||||
to_chat(user, span_warning("[src] needs to be on the floor to be secured!"))
|
||||
return FAILED_UNFASTEN
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/// Try to unwrench an object in a WONDERFUL DYNAMIC WAY
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench, time = 20)
|
||||
if((flags_1 & NODECONSTRUCT_1) || wrench.tool_behaviour != TOOL_WRENCH)
|
||||
return CANT_UNFASTEN
|
||||
|
||||
var/turf/ground = get_turf(src)
|
||||
if(!anchored && ground.is_blocked_turf(exclude_mobs = TRUE, source_atom = src))
|
||||
to_chat(user, span_notice("You fail to secure [src]."))
|
||||
return CANT_UNFASTEN
|
||||
var/can_be_unfasten = can_be_unfasten_wrench(user)
|
||||
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
|
||||
return can_be_unfasten
|
||||
if(time)
|
||||
to_chat(user, span_notice("You begin [anchored ? "un" : ""]securing [src]..."))
|
||||
wrench.play_tool_sound(src, 50)
|
||||
var/prev_anchored = anchored
|
||||
//as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state
|
||||
if(!wrench.use_tool(src, user, time, extra_checks = CALLBACK(src, PROC_REF(unfasten_wrench_check), prev_anchored, user)))
|
||||
return FAILED_UNFASTEN
|
||||
if(!anchored && ground.is_blocked_turf(exclude_mobs = TRUE, source_atom = src))
|
||||
to_chat(user, span_notice("You fail to secure [src]."))
|
||||
return CANT_UNFASTEN
|
||||
to_chat(user, span_notice("You [anchored ? "un" : ""]secure [src]."))
|
||||
set_anchored(!anchored)
|
||||
check_on_table()
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored)
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/// For the do_after, this checks if unfastening conditions are still valid
|
||||
/obj/proc/unfasten_wrench_check(prev_anchored, mob/user)
|
||||
if(anchored != prev_anchored)
|
||||
return FALSE
|
||||
if(can_be_unfasten_wrench(user, TRUE) != SUCCESSFUL_UNFASTEN) //if we aren't explicitly successful, cancel the fuck out
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Adjusts the vertical pixel offset when the object is anchored on a tile with table
|
||||
/obj/proc/check_on_table()
|
||||
if(anchored_tabletop_offset != 0 && !istype(src, /obj/structure/table) && locate(/obj/structure/table) in loc)
|
||||
pixel_y = anchored ? anchored_tabletop_offset : initial(pixel_y)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
base_icon_state = "coffeemaker"
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
circuit = /obj/item/circuitboard/machine/coffeemaker
|
||||
pixel_y = 4 //needed to make it sit nicely on tables
|
||||
anchored_tabletop_offset = 4
|
||||
var/obj/item/reagent_containers/cup/coffeepot/coffeepot = null
|
||||
var/brewing = FALSE
|
||||
var/brew_time = 20 SECONDS
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
pass_flags = PASSTABLE
|
||||
light_color = LIGHT_COLOR_DIM_YELLOW
|
||||
light_power = 3
|
||||
anchored_tabletop_offset = 6
|
||||
var/wire_disabled = FALSE // is its internal wire cut?
|
||||
var/operating = FALSE
|
||||
/// How dirty is it?
|
||||
@@ -53,8 +54,6 @@
|
||||
wires = new /datum/wires/microwave(src)
|
||||
create_reagents(100)
|
||||
soundloop = new(src, FALSE)
|
||||
set_on_table()
|
||||
|
||||
update_appearance(UPDATE_ICON)
|
||||
|
||||
/obj/machinery/microwave/Exited(atom/movable/gone, direction)
|
||||
@@ -78,10 +77,6 @@
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/microwave/set_anchored(anchorvalue)
|
||||
. = ..()
|
||||
set_on_table()
|
||||
|
||||
/obj/machinery/microwave/RefreshParts()
|
||||
. = ..()
|
||||
efficiency = 0
|
||||
@@ -518,14 +513,6 @@
|
||||
open = FALSE
|
||||
update_appearance()
|
||||
|
||||
/// Go on top of a table if we're anchored & not varedited
|
||||
/obj/machinery/microwave/proc/set_on_table()
|
||||
var/obj/structure/table/counter = locate(/obj/structure/table) in get_turf(src)
|
||||
if(anchored && counter && !pixel_y)
|
||||
pixel_y = 6
|
||||
else if(!anchored)
|
||||
pixel_y = initial(pixel_y)
|
||||
|
||||
/// Type of microwave that automatically turns it self on erratically. Probably don't use this outside of the holodeck program "Microwave Paradise".
|
||||
/// You could also live your life with a microwave that will continously run in the background of everything while also not having any power draw. I think the former makes more sense.
|
||||
/obj/machinery/microwave/hell
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
icon_state = "processor1"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
density = TRUE
|
||||
pass_flags = PASSTABLE
|
||||
circuit = /obj/item/circuitboard/machine/processor
|
||||
anchored_tabletop_offset = 8
|
||||
///Is the processor blending items at the moment
|
||||
var/processing = FALSE
|
||||
///The speed at which the processor processes items
|
||||
|
||||
@@ -28,8 +28,7 @@
|
||||
icon_keyboard = null
|
||||
circuit = /obj/item/circuitboard/computer/libraryconsole
|
||||
desc = "Checked out books MUST be returned on time."
|
||||
// This fixes consoles to be ON the tables, rather than their keyboards floating a bit
|
||||
pixel_y = 8
|
||||
anchored_tabletop_offset = 8
|
||||
///The current title we're searching for
|
||||
var/title = ""
|
||||
///The category we're searching for
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
has_panel_overlay = FALSE
|
||||
dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP // magical mystery temperature of 274.5, where ice does not melt, and water does not freeze
|
||||
amount = 10
|
||||
pixel_y = 6
|
||||
anchored_tabletop_offset = 6
|
||||
circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks
|
||||
working_state = null
|
||||
nopower_state = null
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
circuit = /obj/item/circuitboard/machine/reagentgrinder
|
||||
pass_flags = PASSTABLE
|
||||
resistance_flags = ACID_PROOF
|
||||
anchored_tabletop_offset = 8
|
||||
var/operating = FALSE
|
||||
var/obj/item/reagent_containers/beaker = null
|
||||
var/limit = 10
|
||||
|
||||
Reference in New Issue
Block a user