mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-11 17:35:05 +00:00
* Wooden tables now obey The Law of Conservation of Mass (#56156) ## About The Pull Request Fixes Issue https://github.com/tgstation/tgstation/issues/56152 making wood tables deconstruct at they should be. Bug vivisection: Okay, see here? This is the proc for creating a table, we can introduce three arguments. One of them is _buildstack. _buildstack overrides Buildstack on initialize, a variable used for storing the type of raw "ore" that the table is supposed to drop in deconstruction. Here is supposed to be null unless we want to override the buildstack with another ore. ```DM /obj/structure/table_frame/proc/make_new_table(table_type, custom_materials, _buildstack) var/obj/structure/table/T = new table_type(loc, _buildstack) T.frame = type T.framestack = framestack T.framestackamount = framestackamount if(custom_materials) T.set_custom_materials(custom_materials) qdel(src) ``` What happened? The proc for building a wood table from a wooden frame, shown below, passed the "type" variable, used for storing the type of table_frame, as a _buildstack argument to the make_new_table proc. This overrides the buildstack variable of the final wooden table, causing it to drop a wooden frame as it was an ore on deconstruction. ```DM /obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params) [...] if (toConstruct) if(material.get_amount() < 1) to_chat(user, "<span class='warning'>You need one [material.name] sheet to do this!</span>") return to_chat(user, "<span class='notice'>You start adding [material] to [src]...</span>") if(do_after(user, 20, target = src) && material.use(1)) make_new_table(toConstruct, null, type) ``` This is funnier (not very much, to be honest) when we consider that deconstructing with a screwdriver would drop a frame normally, causing it to drop two frames. We could repeat this ad nauseam, essentially cloning wood frames in place as we pleased. So TL;DR: this is another of those simple but hard to hunt bugs that would be prevented with testing and a null on its right place. * Wooden tables now obey The Law of Conservation of Mass Co-authored-by: Manybones <miguelbasket1@gmail.com>
117 lines
3.9 KiB
Plaintext
117 lines
3.9 KiB
Plaintext
/* Table Frames
|
|
* Contains:
|
|
* Frames
|
|
* Wooden Frames
|
|
*/
|
|
|
|
|
|
/*
|
|
* Normal Frames
|
|
*/
|
|
|
|
/obj/structure/table_frame
|
|
name = "table frame"
|
|
desc = "Four metal legs with four framing rods for a table. You could easily pass through this."
|
|
icon = 'icons/obj/structures.dmi'
|
|
icon_state = "nu_table_frame"
|
|
density = FALSE
|
|
anchored = FALSE
|
|
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
|
|
max_integrity = 100
|
|
var/framestack = /obj/item/stack/rods
|
|
var/framestackamount = 2
|
|
|
|
|
|
/obj/structure/table_frame/wrench_act(mob/living/user, obj/item/I)
|
|
to_chat(user, "<span class='notice'>You start disassembling [src]...</span>")
|
|
I.play_tool_sound(src)
|
|
if(!I.use_tool(src, user, 3 SECONDS))
|
|
return TRUE
|
|
playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
|
|
deconstruct(TRUE)
|
|
return TRUE
|
|
|
|
|
|
/obj/structure/table_frame/attackby(obj/item/I, mob/user, params)
|
|
if(isstack(I))
|
|
var/obj/item/stack/material = I
|
|
if(material.tableVariant)
|
|
if(material.get_amount() < 1)
|
|
to_chat(user, "<span class='warning'>You need one [material.name] sheet to do this!</span>")
|
|
return
|
|
if(locate(/obj/structure/table) in loc)
|
|
to_chat(user, "<span class='warning'>There's already a table built here!</span>")
|
|
return
|
|
to_chat(user, "<span class='notice'>You start adding [material] to [src]...</span>")
|
|
if(!do_after(user, 2 SECONDS, target = src) || !material.use(1) || (locate(/obj/structure/table) in loc))
|
|
return
|
|
make_new_table(material.tableVariant)
|
|
else if(istype(material, /obj/item/stack/sheet))
|
|
if(material.get_amount() < 1)
|
|
to_chat(user, "<span class='warning'>You need one sheet to do this!</span>")
|
|
return
|
|
if(locate(/obj/structure/table) in loc)
|
|
to_chat(user, "<span class='warning'>There's already a table built here!</span>")
|
|
return
|
|
to_chat(user, "<span class='notice'>You start adding [material] to [src]...</span>")
|
|
if(!do_after(user, 2 SECONDS, target = src) || !material.use(1) || (locate(/obj/structure/table) in loc))
|
|
return
|
|
var/list/material_list = list()
|
|
if(material.material_type)
|
|
material_list[material.material_type] = MINERAL_MATERIAL_AMOUNT
|
|
make_new_table(/obj/structure/table/greyscale, material_list)
|
|
return
|
|
return ..()
|
|
|
|
|
|
/obj/structure/table_frame/proc/make_new_table(table_type, custom_materials, carpet_type) //makes sure the new table made retains what we had as a frame
|
|
var/obj/structure/table/T = new table_type(loc)
|
|
T.frame = type
|
|
T.framestack = framestack
|
|
T.framestackamount = framestackamount
|
|
if (carpet_type)
|
|
T.buildstack = carpet_type
|
|
if(custom_materials)
|
|
T.set_custom_materials(custom_materials)
|
|
qdel(src)
|
|
|
|
/obj/structure/table_frame/deconstruct(disassembled = TRUE)
|
|
new framestack(get_turf(src), framestackamount)
|
|
qdel(src)
|
|
|
|
/obj/structure/table_frame/narsie_act()
|
|
new /obj/structure/table_frame/wood(src.loc)
|
|
qdel(src)
|
|
|
|
/*
|
|
* Wooden Frames
|
|
*/
|
|
|
|
/obj/structure/table_frame/wood
|
|
name = "wooden table frame"
|
|
desc = "Four wooden legs with four framing wooden rods for a wooden table. You could easily pass through this."
|
|
icon_state = "nu_wood_frame"
|
|
framestack = /obj/item/stack/sheet/mineral/wood
|
|
framestackamount = 2
|
|
resistance_flags = FLAMMABLE
|
|
|
|
/obj/structure/table_frame/wood/attackby(obj/item/I, mob/user, params)
|
|
if (istype(I, /obj/item/stack))
|
|
var/obj/item/stack/material = I
|
|
var/toConstruct // stores the table variant
|
|
var/carpet_type // stores the carpet type used for construction in case of poker tables
|
|
if(istype(I, /obj/item/stack/sheet/mineral/wood))
|
|
toConstruct = /obj/structure/table/wood
|
|
else if(istype(I, /obj/item/stack/tile/carpet))
|
|
toConstruct = /obj/structure/table/wood/poker
|
|
carpet_type = I.type
|
|
if (toConstruct)
|
|
if(material.get_amount() < 1)
|
|
to_chat(user, "<span class='warning'>You need one [material.name] sheet to do this!</span>")
|
|
return
|
|
to_chat(user, "<span class='notice'>You start adding [material] to [src]...</span>")
|
|
if(do_after(user, 20, target = src) && material.use(1))
|
|
make_new_table(toConstruct, null, carpet_type)
|
|
else
|
|
return ..()
|