From ade365df1bedc3203c316b87f699b37d770e3637 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Tue, 19 Sep 2017 22:57:40 -0600 Subject: making formspecs more systematic and upgradable --- init.lua | 143 +++++++-------------------------------------- nodes/node_builders.lua | 1 + nodes/node_controllers.lua | 2 +- nodes/node_crate.lua | 1 + nodes/node_diggers.lua | 17 +++--- nodes/node_storage.lua | 96 ++++++++++++++++-------------- upgrades.lua | 57 ++++++++++++++++++ 7 files changed, 143 insertions(+), 174 deletions(-) create mode 100644 upgrades.lua diff --git a/init.lua b/init.lua index d4d7832..7beb8ee 100644 --- a/init.lua +++ b/init.lua @@ -20,21 +20,25 @@ digtron.builder_read_item_substitutions = { ["farming:desert_sand_soil_wet"] = "default:desert_sand", } -dofile( minetest.get_modpath( "digtron" ) .. "/config.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/util.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/doc.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/awards.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/class_pointset.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/class_layout.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/entities.lua" ) -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_misc.lua" ) -- contains structure and light nodes -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_storage.lua" ) -- contains inventory and fuel storage nodes -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_diggers.lua" ) -- contains all diggers -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_builders.lua" ) -- contains all builders (there's just one currently) -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_controllers.lua" ) -- controllers -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_axle.lua" ) -- Rotation controller -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/node_crate.lua" ) -- Digtron portability support -dofile( minetest.get_modpath( "digtron" ) .. "/nodes/recipes.lua" ) +local digtron_modpath = minetest.get_modpath( "digtron" ) + +dofile( digtron_modpath .. "/config.lua" ) +dofile( digtron_modpath .. "/util.lua" ) +dofile( digtron_modpath .. "/doc.lua" ) +dofile( digtron_modpath .. "/awards.lua" ) +dofile( digtron_modpath .. "/class_pointset.lua" ) +dofile( digtron_modpath .. "/class_layout.lua" ) +dofile( digtron_modpath .. "/entities.lua" ) +dofile( digtron_modpath .. "/nodes/node_misc.lua" ) -- contains structure and light nodes +dofile( digtron_modpath .. "/nodes/node_storage.lua" ) -- contains inventory and fuel storage nodes +dofile( digtron_modpath .. "/nodes/node_diggers.lua" ) -- contains all diggers +dofile( digtron_modpath .. "/nodes/node_builders.lua" ) -- contains all builders (there's just one currently) +dofile( digtron_modpath .. "/nodes/node_controllers.lua" ) -- controllers +dofile( digtron_modpath .. "/nodes/node_axle.lua" ) -- Rotation controller +dofile( digtron_modpath .. "/nodes/node_crate.lua" ) -- Digtron portability support +dofile( digtron_modpath .. "/nodes/recipes.lua" ) + +dofile( digtron_modpath .. "/upgrades.lua" ) -- various LBMs for upgrading older versions of Digtron. -- digtron group numbers: -- 1 - generic digtron node, nothing special is done with these. They're just dragged along. @@ -44,113 +48,8 @@ dofile( minetest.get_modpath( "digtron" ) .. "/nodes/recipes.lua" ) -- 5 - fuel-holding digtron, has a "fuel" invetory that the control node can draw fuel items from. Separate from general inventory, nothing gets put here automatically. -- 6 - holds both fuel and main inventories -minetest.register_lbm({ - name = "digtron:sand_digger_upgrade", - nodenames = {"digtron:sand_digger"}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - local offset = meta:get_string("offset") - local period = meta:get_string("period") - minetest.set_node(pos, {name = "digtron:soft_digger", - param2 = node.param2}) - meta:set_string("offset", offset) - meta:set_string("period", period) - end -}) - -minetest.register_lbm({ - name = "digtron:fuelstore_upgrade", - nodenames = {"digtron:fuelstore"}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local list = inv:get_list("main") - inv:set_list("main", {}) - inv:set_list("fuel", list) - meta:set_string("formspec", - "size[8,9.3]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "label[0,0;Fuel items]" .. - "list[current_name;fuel;0,0.6;8,4;]" .. - "list[current_player;main;0,5.15;8,1;]" .. - "list[current_player;main;0,6.38;8,3;8]" .. - "listring[current_name;fuel]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,5.15) - ) - end -}) - -minetest.register_lbm({ - name = "digtron:autocontroller_lateral_upgrade", - nodenames = {"digtron:auto_controller"}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - local cycles = meta:get_int("offset") - meta:set_int("cycles", cycles) - meta:set_int("offset", 0) - meta:set_int("slope", 0) - meta:set_string("formspec", - "size[3.5,2]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "field[0.5,0.8;1,0.1;cycles;Cycles;${cycles}]" .. - "tooltip[cycles;When triggered, this controller will try to run for the given number of cycles.\nThe cycle count will decrement as it runs, so if it gets halted by a problem\nyou can fix the problem and restart.]" .. - "button_exit[1.2,0.5;1,0.1;set;Set]" .. - "tooltip[set;Saves the cycle setting without starting the controller running]" .. - "button_exit[2.2,0.5;1,0.1;execute;Set &\nExecute]" .. - "tooltip[execute;Begins executing the given number of cycles]" .. - "field[0.5,2.0;1,0.1;slope;Slope;${slope}]" .. - "tooltip[slope;For diagonal digging. After every X nodes the auto controller moves forward,\nthe controller will add an additional cycle moving the digtron laterally in the\ndirection of the arrows on the side of this controller.\nSet to 0 for no lateral digging.]" .. - "field[1.5,2.0;1,0.1;offset;Offset;${offset}]" .. - "tooltip[offset;Sets the offset of the lateral motion defined in the Slope field.\nNote: this offset is relative to the controller's location.\nThe controller will move down when it reaches the indicated point.]" .. - "field[2.5,2.0;1,0.1;period;Delay;${period}]" .. - "tooltip[period;Number of seconds to wait between each cycle]" - ) - end -}) - --- internationalization boilerplate -local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP.."/intllib.lua") - -minetest.register_lbm({ - name = "digtron:builder_extrusion_upgrade", - nodenames = {"digtron:builder"}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_int("extrusion", 1) - meta:set_string("formspec", - "size[8,5.2]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[current_name;main;0.5,0;1,1;]" .. - "label[0.5,0.8;" .. S("Block to build") .. "]" .. - "field[2.3,0.8;1,0.1;extrusion;" .. S("Extrusion") .. ";${extrusion}]" .. - "tooltip[extrusion;" .. S("Builder will extrude this many blocks in the direction it is facing.\nCan be set from 1 to @1.\nNote that Digtron won't build into unloaded map regions.", digtron.config.maximum_extrusion) .. "]" .. - "field[3.3,0.8;1,0.1;period;" .. S("Periodicity") .. ";${period}]" .. - "tooltip[period;" .. S("Builder will build once every n steps.\nThese steps are globally aligned, so all builders with the\nsame period and offset will build on the same location.") .. "]" .. - "field[4.3,0.8;1,0.1;offset;" .. S("Offset") .. ";${offset}]" .. - "tooltip[offset;" .. S("Offsets the start of periodicity counting by this amount.\nFor example, a builder with period 2 and offset 0 builds\nevery even-numbered block and one with period 2 and\noffset 1 builds every odd-numbered block.") .. "]" .. - "button_exit[5.0,0.5;1,0.1;set;" .. S("Save &\nShow") .. "]" .. - "tooltip[set;" .. S("Saves settings") .. "]" .. - "field[6.3,0.8;1,0.1;build_facing;" .. S("Facing") .. ";${build_facing}]" .. - "tooltip[build_facing;" .. S("Value from 0-23. Not all block types make use of this.\nUse the 'Read & Save' button to copy the facing of the block\ncurrently in the builder output location.") .. "]" .. - "button_exit[7.0,0.5;1,0.1;read;" .. S("Read &\nSave") .. "]" .. - "tooltip[read;" .. S("Reads the facing of the block currently in the build location,\nthen saves all settings.") .. "]" .. - "list[current_player;main;0,1.3;8,1;]" .. - default.get_hotbar_bg(0,1.3) .. - "list[current_player;main;0,2.5;8,3;8]" .. - "listring[current_player;main]" .. - "listring[current_name;main]" - ) - end -}) - +-- This code was added for use with FaceDeer's fork of the [catacomb] mod. Paramat's version doesn't support customized protected nodes, which causes +-- it to "eat" Digtrons sometimes. if minetest.get_modpath("catacomb") and catacomb ~= nil and catacomb.chamber_protected_nodes ~= nil and catacomb.passage_protected_nodes ~= nil then local digtron_nodes = { minetest.get_content_id("digtron:inventory"), diff --git a/nodes/node_builders.lua b/nodes/node_builders.lua index fa8bb0a..fac1d4b 100644 --- a/nodes/node_builders.lua +++ b/nodes/node_builders.lua @@ -45,6 +45,7 @@ minetest.register_node("digtron:builder", { description = S("Digtron Builder Module"), _doc_items_longdesc = digtron.doc.builder_longdesc, _doc_items_usagehelp = digtron.doc.builder_usagehelp, + _digtron_formspec = builder_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 4}, drop = "digtron:builder", sounds = digtron.metal_sounds, diff --git a/nodes/node_controllers.lua b/nodes/node_controllers.lua index 76bb40b..a7eda2e 100644 --- a/nodes/node_controllers.lua +++ b/nodes/node_controllers.lua @@ -172,6 +172,7 @@ minetest.register_node("digtron:auto_controller", { description = S("Digtron Automatic Control Module"), _doc_items_longdesc = digtron.doc.auto_controller_longdesc, _doc_items_usagehelp = digtron.doc.auto_controller_usagehelp, + _digtron_formspec = auto_formspec, groups = {cracky = 3, oddly_breakable_by_hand = 3, digtron = 1}, drop = "digtron:auto_controller", sounds = digtron.metal_sounds, @@ -289,7 +290,6 @@ minetest.register_node("digtron:auto_controller", { on_timer = function(pos, elapsed) minetest.get_meta(pos):set_string("waiting", nil) end, - }) --------------------------------------------------------------------------------------------------------------- diff --git a/nodes/node_crate.lua b/nodes/node_crate.lua index 017023d..7e30207 100644 --- a/nodes/node_crate.lua +++ b/nodes/node_crate.lua @@ -80,6 +80,7 @@ minetest.register_node("digtron:loaded_crate", { description = S("Digtron Crate (Loaded)"), _doc_items_longdesc = digtron.doc.loaded_crate_longdesc, _doc_items_usagehelp = digtron.doc.loaded_crate_usagehelp, + _digtron_formspec = loaded_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, not_in_creative_inventory=1, digtron_protected=1}, stack_max = 1, sounds = default.node_sound_wood_defaults(), diff --git a/nodes/node_diggers.lua b/nodes/node_diggers.lua index c12b46c..78d5200 100644 --- a/nodes/node_diggers.lua +++ b/nodes/node_diggers.lua @@ -36,17 +36,17 @@ local intermittent_formspec = "button_exit[2.2,0.5;1,0.1;set;" .. S("Save") .. "]" .. "tooltip[set;" .. S("Saves settings") .. "]" -local intermittent_on_construct = function(pos) - local formspec = intermittent_formspec - if minetest.get_modpath("doc") then - formspec = "size[4.5,1]" .. formspec .. +if minetest.get_modpath("doc") then + intermittent_formspec = "size[4.5,1]" .. intermittent_formspec .. "button_exit[3.2,0.5;1,0.1;help;" .. S("Help") .. "]" .. "tooltip[help;" .. S("Show documentation about this block") .. "]" else - formspec = "size[3.5,1]" .. formspec + intermittent_formspec = "size[3.5,1]" .. intermittent_formspec end + +local intermittent_on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec) + meta:set_string("formspec", intermittent_formspec) meta:set_int("period", 1) meta:set_int("offset", 0) end @@ -72,6 +72,7 @@ minetest.register_node("digtron:digger", { description = S("Digtron Digger Head"), _doc_items_longdesc = digtron.doc.digger_longdesc, _doc_items_usagehelp = digtron.doc.digger_usagehelp, + _digtron_formspec = intermittent_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3}, drop = "digtron:digger", sounds = digtron.metal_sounds, @@ -125,6 +126,7 @@ minetest.register_node("digtron:intermittent_digger", { description = S("Digtron Intermittent Digger Head"), _doc_items_longdesc = digtron.doc.intermittent_digger_longdesc, _doc_items_usagehelp = digtron.doc.intermittent_digger_usagehelp, + _digtron_formspec = intermittent_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3}, drop = "digtron:intermittent_digger", sounds = digtron.metal_sounds, @@ -250,6 +252,7 @@ minetest.register_node("digtron:intermittent_soft_digger", { description = S("Digtron Intermittent Soft Material Digger Head"), _doc_items_longdesc = digtron.doc.intermittent_soft_digger_longdesc, _doc_items_usagehelp = digtron.doc.intermittent_soft_digger_usagehelp, + _digtron_formspec = intermittent_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3}, drop = "digtron:intermittent_soft_digger", sounds = digtron.metal_sounds, @@ -283,7 +286,7 @@ minetest.register_node("digtron:intermittent_soft_digger", { on_construct = intermittent_on_construct, on_receive_fields = intermittent_on_receive_fields, - + execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig) if lateral_dig == true then return 0, {} diff --git a/nodes/node_storage.lua b/nodes/node_storage.lua index 826aa20..56d19aa 100644 --- a/nodes/node_storage.lua +++ b/nodes/node_storage.lua @@ -2,12 +2,27 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") + +local inventory_formspec = + "size[8,9.3]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "label[0,0;" .. S("Inventory items") .. "]" .. + "list[current_name;main;0,0.6;8,4;]" .. + "list[current_player;main;0,5.15;8,1;]" .. + "list[current_player;main;0,6.38;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,5.15) + -- Storage buffer. Builder nodes draw from this inventory and digger nodes deposit into it. -- Note that inventories are digtron group 2. minetest.register_node("digtron:inventory", { description = S("Digtron Inventory Storage"), _doc_items_longdesc = digtron.doc.inventory_longdesc, _doc_items_usagehelp = digtron.doc.inventory_usagehelp, + _digtron_formspec = inventory_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 2, tubedevice = 1, tubedevice_receiver = 1}, drop = "digtron:inventory", sounds = digtron.metal_sounds, @@ -26,19 +41,7 @@ minetest.register_node("digtron:inventory", { on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[8,9.3]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "label[0,0;" .. S("Inventory items") .. "]" .. - "list[current_name;main;0,0.6;8,4;]" .. - "list[current_player;main;0,5.15;8,1;]" .. - "list[current_player;main;0,6.38;8,3;8]" .. - "listring[current_name;main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,5.15) - ) + meta:set_string("formspec", inventory_formspec) local inv = meta:get_inventory() inv:set_size("main", 8*4) end, @@ -48,7 +51,7 @@ minetest.register_node("digtron:inventory", { local inv = meta:get_inventory() return inv:is_empty("main") end, - + -- Pipeworks compatibility ---------------------------------------------------------------- @@ -71,12 +74,26 @@ minetest.register_node("digtron:inventory", { after_dig_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_dig end end)() }) +local fuelstore_formspec = + "size[8,9.3]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "label[0,0;" .. S("Fuel items") .. "]" .. + "list[current_name;fuel;0,0.6;8,4;]" .. + "list[current_player;main;0,5.15;8,1;]" .. + "list[current_player;main;0,6.38;8,3;8]" .. + "listring[current_name;fuel]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,5.15) + -- Fuel storage. Controller node draws fuel from here. -- Note that fuel stores are digtron group 5. minetest.register_node("digtron:fuelstore", { description = S("Digtron Fuel Storage"), _doc_items_longdesc = digtron.doc.fuelstore_longdesc, _doc_items_usagehelp = digtron.doc.fuelstore_usagehelp, + _digtron_formspec = fuelstore_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 5, tubedevice = 1, tubedevice_receiver = 1}, drop = "digtron:fuelstore", sounds = digtron.metal_sounds, @@ -95,19 +112,7 @@ minetest.register_node("digtron:fuelstore", { on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[8,9.3]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "label[0,0;" .. S("Fuel items") .. "]" .. - "list[current_name;fuel;0,0.6;8,4;]" .. - "list[current_player;main;0,5.15;8,1;]" .. - "list[current_player;main;0,6.38;8,3;8]" .. - "listring[current_name;fuel]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,5.15) - ) + meta:set_string("formspec", fuelstore_formspec) local inv = meta:get_inventory() inv:set_size("fuel", 8*4) end, @@ -129,7 +134,7 @@ minetest.register_node("digtron:fuelstore", { local inv = meta:get_inventory() return inv:is_empty("fuel") end, - + -- Pipeworks compatibility ---------------------------------------------------------------- @@ -158,11 +163,28 @@ minetest.register_node("digtron:fuelstore", { after_dig_node = (function() if minetest.get_modpath("pipeworks")then return pipeworks.after_dig end end)() }) +local combined_storage_formspec = + "size[8,9.9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "label[0,0;" .. S("Inventory items") .. "]" .. + "list[current_name;main;0,0.6;8,3;]" .. + "label[0,3.5;" .. S("Fuel items") .. "]" .. + "list[current_name;fuel;0,4.1;8,1;]" .. + "list[current_player;main;0,5.75;8,1;]" .. + "list[current_player;main;0,6.98;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,5.75) + + -- Combined storage. Group 6 has both an inventory and a fuel store minetest.register_node("digtron:combined_storage", { description = S("Digtron Combined Storage"), _doc_items_longdesc = digtron.doc.combined_storage_longdesc, _doc_items_usagehelp = digtron.doc.combined_storage_usagehelp, + _digtron_formspec = combined_storage_formspec, groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 6, tubedevice = 1, tubedevice_receiver = 1}, drop = "digtron:combined_storage", sounds = digtron.metal_sounds, @@ -179,21 +201,7 @@ minetest.register_node("digtron:combined_storage", { }, on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[8,9.9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "label[0,0;" .. S("Inventory items") .. "]" .. - "list[current_name;main;0,0.6;8,3;]" .. - "label[0,3.5;" .. S("Fuel items") .. "]" .. - "list[current_name;fuel;0,4.1;8,1;]" .. - "list[current_player;main;0,5.75;8,1;]" .. - "list[current_player;main;0,6.98;8,3;8]" .. - "listring[current_name;main]" .. - "listring[current_player;main]" .. - default.get_hotbar_bg(0,5.75) - ) + meta:set_string("formspec", combined_storage_formspec) local inv = meta:get_inventory() inv:set_size("main", 8*3) inv:set_size("fuel", 8*1) @@ -230,7 +238,7 @@ minetest.register_node("digtron:combined_storage", { local inv = meta:get_inventory() return inv:is_empty("fuel") and inv:is_empty("main") end, - + -- Pipeworks compatibility ---------------------------------------------------------------- tube = (function() if minetest.get_modpath("pipeworks") then return { diff --git a/upgrades.lua b/upgrades.lua new file mode 100644 index 0000000..8f0c6fb --- /dev/null +++ b/upgrades.lua @@ -0,0 +1,57 @@ +-- re-applies the "_digtron_formspec" property from all digtron node defs to the digtron node's metadata. +minetest.register_lbm({ + name = "digtron:generic_formspec_sanitizer", + nodenames = {"group:digtron"}, + action = function(pos, node) + local node_def = minetest.registered_nodes[node.name] + local meta = minetest.get_meta(pos) + meta:set_string("formspec", node_def._digtron_formspec) + end +}) + +minetest.register_lbm({ + name = "digtron:sand_digger_upgrade", + nodenames = {"digtron:sand_digger"}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local offset = meta:get_string("offset") + local period = meta:get_string("period") + minetest.set_node(pos, {name = "digtron:soft_digger", + param2 = node.param2}) + meta:set_string("offset", offset) + meta:set_string("period", period) + end +}) + +minetest.register_lbm({ + name = "digtron:fuelstore_upgrade", + nodenames = {"digtron:fuelstore"}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local list = inv:get_list("main") + inv:set_list("main", {}) + inv:set_list("fuel", list) + end +}) + +minetest.register_lbm({ + name = "digtron:autocontroller_lateral_upgrade", + nodenames = {"digtron:auto_controller"}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local cycles = meta:get_int("offset") + meta:set_int("cycles", cycles) + meta:set_int("offset", 0) + meta:set_int("slope", 0) + end +}) + +minetest.register_lbm({ + name = "digtron:builder_extrusion_upgrade", + nodenames = {"digtron:builder"}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_int("extrusion", 1) + end +}) \ No newline at end of file -- cgit v1.2.3