From 8d152ce19c5fa482a3c88f44faa84f36df1a8aea Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Mon, 24 Dec 2018 14:31:13 +0100 Subject: [PATCH] autocrafter converted to new states class --- tubelib/forceload.lua | 1 - tubelib/node_states.lua | 8 + tubelib/textures/tubelib_defect.png | Bin 503 -> 301 bytes tubelib_addons1/autocrafter.lua | 366 ++++++++++++---------------- tubelib_addons1/grinder.lua | 2 +- 5 files changed, 162 insertions(+), 215 deletions(-) diff --git a/tubelib/forceload.lua b/tubelib/forceload.lua index ce41e20..3a6af35 100644 --- a/tubelib/forceload.lua +++ b/tubelib/forceload.lua @@ -35,7 +35,6 @@ local function remove_list_elem(list, x) if n then table.remove(list, n) end - print(dump(list)) return list end diff --git a/tubelib/node_states.lua b/tubelib/node_states.lua index 5047fd9..a497f4d 100644 --- a/tubelib/node_states.lua +++ b/tubelib/node_states.lua @@ -76,6 +76,10 @@ local DEFECT = tubelib.DEFECT tubelib.NodeStates = {} local NodeStates = tubelib.NodeStates +local function start_condition_fullfilled(pos, meta) + return true +end + function NodeStates:new(attr) local o = { -- mandatory @@ -87,6 +91,7 @@ function NodeStates:new(attr) node_name_active = attr.node_name_active, node_name_defect = attr.node_name_defect, infotext_name = attr.infotext_name, + start_condition_fullfilled = attr.start_condition_fullfilled or start_condition_fullfilled, } if attr.aging_factor then o.aging_level1 = attr.aging_factor * tubelib.machine_aging_value @@ -143,6 +148,9 @@ end function NodeStates:start(pos, meta, called_from_on_timer) local state = meta:get_int("tubelib_state") if state == STOPPED or state == STANDBY or state == BLOCKED then + if not self.start_condition_fullfilled(pos, meta) then + return false + end meta:set_int("tubelib_state", RUNNING) if called_from_on_timer then -- timer has to be stopped once to be able to be restarted diff --git a/tubelib/textures/tubelib_defect.png b/tubelib/textures/tubelib_defect.png index bf830f6c924d07cdfb57c4968abc8e4b6dd5a338..5cb0b7ced40d84ac27d13cc67a4061fb18ad62f2 100644 GIT binary patch delta 180 zcmV;l089V(1FZs(Bp44+OjJc>bS+9nM4O$N&CJ91-~e8?*Bg;tItUmGDi%=h6u^<6 zD}MlPNklg~W1frRCQI2x%8&Ou2 zh>MUF9TykjRCGREgstcTT!f|Q2BAob1N0*nz{U?1M2~M^(goufBmm4L3XkE9k9gr6 ivA##@9 1 local function after_recipe_change(pos, inventory) - local meta = minetest.get_meta(pos) + local meta = M(pos) -- if we emptied the grid, there's no point in keeping it running or cached if inventory:is_empty("recipe") then - minetest.get_node_timer(pos):stop() autocrafterCache[minetest.hash_node_position(pos)] = nil - local number = meta:get_string("number") - meta:set_string("infotext", "unconfigured Autocrafter: "..number) inventory:set_stack("output", 1, "") + State:stop(pos, meta) return end local recipe_changed = false @@ -208,10 +166,8 @@ local function after_recipe_change(pos, inventory) craft = craft or get_craft(pos, inventory, hash) local output_item = craft.output.item - local description, name = get_item_info(output_item) - local number = meta:get_string("number") - meta:set_string("infotext", string.format("'%s' Tubelib Autocrafter "..number.."(%s)", description, name)) inventory:set_stack("output", 1, output_item) + State:stop(pos, meta) end -- clean out unknown items and groups, which would be handled like unknown items in the crafting grid @@ -264,6 +220,8 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) elseif listname == "output" then on_output_change(pos, inv, stack) return 0 + elseif listname == "src" and State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, M(pos)) end return stack:get_count() end @@ -317,104 +275,61 @@ local function allow_metadata_inventory_move(pos, from_list, from_index, to_list return count end - - --- returns false if we shouldn't bother attempting to start the timer again after this -local function update_meta(meta, state) - -- toggling the button doesn't quite call for running a recipe change check - -- so instead we run a minimal version for infotext setting only - -- this might be more written code, but actually executes less - local number = meta:get_string("number") - local output = meta:get_inventory():get_stack("output", 1) - if output:is_empty() then -- doesn't matter if paused or not - meta:set_string("infotext", "unconfigured Autocrafter "..number) - meta:set_string("formspec",formspec(tubelib.STOPPED)) - return false - end - - local infotext - local description, name = get_item_info(output) - if state == tubelib.RUNNING then - infotext = string.format("'%s' Autocrafter %s (%s)", description, number, name) - else - infotext = string.format("stopped '%s' Autocrafter %s", description, number) - end - meta:set_string("infotext", infotext) - meta:set_string("formspec",formspec(state)) - return state == tubelib.RUNNING -end - -local function on_receive_fields(pos, formname, fields, sender) - if minetest.is_protected(pos, sender:get_player_name()) then +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then return end - local meta = minetest.get_meta(pos) - local running = meta:get_int("running") - if fields.button ~= nil then - if running > tubelib.STATE_STOPPED then - update_meta(meta, tubelib.STOPPED) - stop_crafter(pos) - meta:set_int("running", tubelib.STATE_STOPPED) - else - if update_meta(meta, tubelib.RUNNING) then - meta:set_int("running", tubelib.STATE_RUNNING) - start_crafter(pos) - else - stop_crafter(pos) - meta:set_int("running", tubelib.STATE_STOPPED) - end - end - end + State:state_button_event(pos, fields) end minetest.register_node("tubelib_addons1:autocrafter", { - description = "Autocrafter", + description = "Tubelib Autocrafter", drawtype = "normal", tiles = {'tubelib_front.png', 'tubelib_addons1_autocrafter.png'}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) + after_place_node = function(pos, placer) local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") - local inv = meta:get_inventory() + State:node_init(pos, number) + local inv = M(pos):get_inventory() inv:set_size("src", 2*8) inv:set_size("recipe", 3*3) inv:set_size("dst", 3*3) inv:set_size("output", 1) - meta:set_string("number", number) - meta:set_int("running", 0) - meta:set_int("item_counter", 0) - update_meta(meta, tubelib.STOPPED) end, + on_dig = function(pos, node, puncher, pointed_thing) + local inv = M(pos):get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + autocrafterCache[minetest.hash_node_position(pos)] = nil + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + State:after_dig_node(pos, oldnode, oldmetadata, digger) + end, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, on_receive_fields = on_receive_fields, - can_dig = function(pos, player) - --upgrade_autocrafter(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return (inv:is_empty("src") and inv:is_empty("dst")) - end, - - on_destruct = function(pos) - autocrafterCache[minetest.hash_node_position(pos)] = nil - tubelib.remove_node(pos) - end, - allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, - on_timer = run_autocrafter, + drop = "", paramtype = "light", sunlight_propagates = true, + paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("tubelib_addons1:autocrafter_active", { - description = "Autocrafter", + description = "Tubelib Autocrafter", drawtype = "normal", tiles = { 'tubelib_front.png', @@ -430,20 +345,59 @@ minetest.register_node("tubelib_addons1:autocrafter_active", { }, }, + on_rotate = screwdriver.disallow, + on_timer = keep_running, on_receive_fields = on_receive_fields, - allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_move = allow_metadata_inventory_move, - on_timer = run_autocrafter, paramtype = "light", sunlight_propagates = true, + paramtype2 = "facedir", groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) +minetest.register_node("tubelib_addons1:autocrafter_defect", { + description = "Tubelib Autocrafter", + drawtype = "normal", + tiles = {'tubelib_front.png', 'tubelib_addons1_autocrafter.png'}, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") + State:node_init(pos, number) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size("src", 2*8) + inv:set_size("recipe", 3*3) + inv:set_size("dst", 3*3) + inv:set_size("output", 1) + State:defect(pos, meta) + end, + + on_dig = function(pos, node, puncher, pointed_thing) + local inv = M(pos):get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + autocrafterCache[minetest.hash_node_position(pos)] = nil + end + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + minetest.register_craft({ output = "tubelib_addons1:autocrafter", recipe = { @@ -454,43 +408,29 @@ minetest.register_craft({ }) -tubelib.register_node("tubelib_addons1:autocrafter", {"tubelib_addons1:autocrafter_active"}, { +tubelib.register_node("tubelib_addons1:autocrafter", + {"tubelib_addons1:autocrafter_active", "tubelib_addons1:autocrafter_defect"}, { on_pull_item = function(pos, side) - local meta = minetest.get_meta(pos) - return tubelib.get_item(meta, "dst") + return tubelib.get_item(M(pos), "dst") end, on_push_item = function(pos, side, item) - local meta = minetest.get_meta(pos) - return tubelib.put_item(meta, "src", item) + return tubelib.put_item(M(pos), "src", item) end, on_unpull_item = function(pos, side, item) - local meta = minetest.get_meta(pos) - return tubelib.put_item(meta, "dst", item) + return tubelib.put_item(M(pos), "dst", item) end, on_recv_message = function(pos, topic, payload) - if topic == "on" then - return start_crafter(pos) - elseif topic == "off" then - return stop_crafter(pos) - elseif topic == "state" then - local meta = minetest.get_meta(pos) - local running = meta:get_int("running") - return tubelib.statestring(running) - elseif topic == "counter" then - local meta = minetest.get_meta(pos) - return meta:get_int("item_counter") - elseif topic == "clear_counter" then - local meta = minetest.get_meta(pos) - return meta:set_int("item_counter", 0) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp else return "unsupported" end end, - on_server_restart = function(pos) - local meta = minetest.get_meta(pos) - if meta:get_int("running") ~= tubelib.STATE_STOPPED then - meta:set_int("running", tubelib.STATE_STANDBY) - minetest.get_node_timer(pos):start(craft_time*SLEEP_CNT_START_VAL) - end + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) end, }) diff --git a/tubelib_addons1/grinder.lua b/tubelib_addons1/grinder.lua index f4b48a4..8fc393e 100644 --- a/tubelib_addons1/grinder.lua +++ b/tubelib_addons1/grinder.lua @@ -279,7 +279,7 @@ tubelib.register_node("tubelib_addons1:grinder", end end, on_node_load = function(pos) - return State:on_node_load(pos) + State:on_node_load(pos) end, on_node_repair = function(pos) return State:on_node_repair(pos)