From 402c00a584c924e07af30a2dc4154c80ecacdc02 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Fri, 14 Feb 2020 22:59:16 +0100 Subject: [PATCH] improvements on distributor, hopper, and liquidsampler --- basic_machines/autocrafter.lua | 3 - basic_machines/distributor.lua | 35 +++++-- basic_machines/liquidsampler.lua | 31 +++--- basic_machines/pusher.lua | 4 +- basis/command.lua | 11 +- basis/node_states.lua | 47 +-------- iron_age/hopper.lua | 170 +++++++------------------------ mod.conf | 4 +- 8 files changed, 92 insertions(+), 213 deletions(-) diff --git a/basic_machines/autocrafter.lua b/basic_machines/autocrafter.lua index 9e24a80..d3a2d29 100644 --- a/basic_machines/autocrafter.lua +++ b/basic_machines/autocrafter.lua @@ -359,9 +359,6 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = diff --git a/basic_machines/distributor.lua b/basic_machines/distributor.lua index 5c8de71..59a71bc 100644 --- a/basic_machines/distributor.lua +++ b/basic_machines/distributor.lua @@ -164,8 +164,10 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) if listname == "src" then CRD(pos).State:start_if_standby(pos) return stack:get_count() - elseif (list[index]:get_count() == 0 or stack:get_name() ~= list[index]:get_name()) then - return 1 + elseif not inv:contains_item(listname, {name = stack:get_name()}) then + stack:set_count(1) + inv:set_stack(listname, index, stack) + return 0 end return 0 end @@ -174,16 +176,35 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player if minetest.is_protected(pos, player:get_player_name()) then return 0 end - return stack:get_count() + if listname == "src" then + return stack:get_count() + else + local inv = M(pos):get_inventory() + inv:set_stack(listname, index, nil) + return 0 + end end local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = M(pos) - local inv = meta:get_inventory() + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = minetest.get_meta(pos):get_inventory() local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end + if from_list == "src" and to_list ~= "src" and not inv:contains_item(to_list, {name = stack:get_name()}) then + stack:set_count(1) + inv:set_stack(to_list, to_index, stack) + return 0 + elseif from_list ~= "src" and to_list == "src" then + inv:set_stack(from_list, from_index, nil) + return 0 + elseif not inv:contains_item(to_list, {name = stack:get_name()}) then + return 1 + else + return 0 + end +end local function push_item(pos, filter, item_name, num_items, nvm) local idx = 1 diff --git a/basic_machines/liquidsampler.lua b/basic_machines/liquidsampler.lua index 2947b72..4ef92ba 100644 --- a/basic_machines/liquidsampler.lua +++ b/basic_machines/liquidsampler.lua @@ -66,30 +66,22 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return stack:get_count() end -local function test_liquid(node) - local liquiddef = bucket.liquids[node.name] - if liquiddef ~= nil and liquiddef.itemname ~= nil and - node.name == liquiddef.source then - return liquiddef.itemname +local function can_start(pos, nvm, state) + local water_pos = minetest.string_to_pos(M(pos):get_string("water_pos")) + if not techage.is_ocean(water_pos) then + return S("no usable water") end + return true end local function sample_liquid(pos, crd, nvm, inv) - local meta = M(pos) - local water_pos = minetest.string_to_pos(meta:get_string("water_pos")) - local giving_back = test_liquid(techage.get_node_lvm(water_pos)) - if giving_back then - if inv:room_for_item("dst", ItemStack(giving_back)) and - inv:contains_item("src", ItemStack("bucket:bucket_empty")) then - minetest.remove_node(water_pos) - inv:remove_item("src", ItemStack("bucket:bucket_empty")) - inv:add_item("dst", ItemStack(giving_back)) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - else - crd.State:idle(pos, nvm) - end + if inv:room_for_item("dst", {name = "bucket:bucket_water"}) and + inv:contains_item("src", {name = "bucket:bucket_empty"}) then + inv:remove_item("src", {name = "bucket:bucket_empty"}) + inv:add_item("dst", {name = "bucket:bucket_water"}) + crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) else - crd.State:fault(pos, nvm) + crd.State:idle(pos, nvm) end end @@ -184,6 +176,7 @@ local node_name_ta2, node_name_ta3, _ = standby_ticks = STANDBY_TICKS, formspec = formspec, tubing = tubing, + can_start = can_start, after_place_node = function(pos, placer) local inv = M(pos):get_inventory() inv:set_size("src", 4) diff --git a/basic_machines/pusher.lua b/basic_machines/pusher.lua index 46678dd..73057df 100644 --- a/basic_machines/pusher.lua +++ b/basic_machines/pusher.lua @@ -29,8 +29,8 @@ local S = techage.S -- Consumer Related Data local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end -local STANDBY_TICKS = 10 -local COUNTDOWN_TICKS = 10 +local STANDBY_TICKS = 5 +local COUNTDOWN_TICKS = 5 local CYCLE_TIME = 2 local function pushing(pos, crd, meta, nvm) diff --git a/basis/command.lua b/basis/command.lua index 24b9b97..3748a2e 100644 --- a/basis/command.lua +++ b/basis/command.lua @@ -17,6 +17,7 @@ local S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P = minetest.string_to_pos local M = minetest.get_meta +local check_cart = minecart.check_cart local function deserialize(s) local tbl = {} @@ -179,6 +180,14 @@ local function item_handling_node(name) end end +local function is_air_like(name) + local ndef = minetest.registered_nodes[name] + if ndef and ndef.buildable_to then + return true + end + return false +end + ------------------------------------------------------------------- -- API helper functions ------------------------------------------------------------------- @@ -399,7 +408,7 @@ function techage.push_items(pos, out_dir, stack) local npos, in_dir, name = get_dest_node(pos, out_dir) if npos and NodeDef[name] and NodeDef[name].on_push_item then return NodeDef[name].on_push_item(npos, in_dir, stack) - elseif name == "air" then + elseif is_air_like(name) or check_cart(npos) then minetest.add_item(npos, stack) return true end diff --git a/basis/node_states.lua b/basis/node_states.lua index 84751a8..a159e92 100644 --- a/basis/node_states.lua +++ b/basis/node_states.lua @@ -469,51 +469,8 @@ function NodeStates:on_receive_message(pos, topic, payload) end -- repair corrupt node data -function NodeStates:on_node_load(pos, not_start_timer) - local nvm = techage.get_nvm(pos) - - -- Meta data corrupt? - local number = M(pos):get_string("node_number") - if number == "" then - minetest.log("warning", "[TA] Node at "..S(pos).." has no node_number") - local name = techage.get_node_lvm(pos).name - local number = techage.add_node(pos, name) - self:node_init(pos, nvm, number) - return - end - - -- wrong number and no dummy number? - if number ~= "-" then - local info = techage.get_node_info(number) - if not info or not info.pos or not vector.equals(pos, info.pos) then - if not info then - minetest.log("warning", "[TA] Node at "..S(pos).." has no info") - elseif not info.pos then - minetest.log("warning", "[TA] Node at "..S(pos).." has no info.pos") - elseif not vector.equals(pos, info.pos) then - print(S(pos), S(info.pos)) - minetest.log("warning", "[TA] Node at "..S(pos).." is pos ~= info.pos") - end - swap_node(pos, "techage:defect_dummy") - return - end - end - - -- state corrupt? - local state = nvm.techage_state or 0 - if state == 0 then - if minetest.get_node_timer(pos):is_started() then - nvm.techage_state = RUNNING - else - nvm.techage_state = STOPPED - end - elseif state == RUNNING and not not_start_timer then - minetest.get_node_timer(pos):start(self.cycle_time) - elseif state == STANDBY then - minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) - elseif state == BLOCKED then - minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) - end +function NodeStates:on_node_load(pos) + -- tbd end minetest.register_node("techage:defect_dummy", { diff --git a/iron_age/hopper.lua b/iron_age/hopper.lua index ccb2b2a..1621bdd 100644 --- a/iron_age/hopper.lua +++ b/iron_age/hopper.lua @@ -12,141 +12,43 @@ ]]-- --- for lazy programmers -local M = minetest.get_meta -local S = techage.S +-- use the minecart hopper +minetest.register_alias("techage:hopper_ta1", "minecart:hopper") -local function scan_for_objects(pos, inv) - for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do - local lua_entity = object:get_luaentity() - if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then - if lua_entity.itemstring ~= "" then - local stack = ItemStack(lua_entity.itemstring) - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - object:remove() + +minecart.register_inventory( + { + "techage:chest_ta3", "techage:chest_ta4", + "techage:meltingpot", "techage:meltingpot_active", + }, + { + put = { + listname = "main", + }, + take = { + listname = "main", + }, + } +) + +minecart.register_inventory( + { + "techage:sieve0", "techage:sieve1", "techage:sieve2", "techage:sieve3", + }, + { + put = { + allow_inventory_put = function(pos, stack, player_name) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("src") then + minetest.get_node_timer(pos):start(1) + return true end - end - end - end -end - -local function pull_push_item(pos, meta) - local items = techage.neighbour_pull_items(pos, 6, 1) - if items then - if techage.neighbour_push_items(pos, meta:get_int("push_dir"), items) then - return true - end - -- place item back - techage.neighbour_unpull_items(pos, 6, items) - end - return false -end - - -local function push_item(pos, inv, meta) - if not inv:is_empty("main") then - local stack = inv:get_stack("main", 1) - local taken = stack:take_item(1) - if techage.neighbour_push_items(pos, meta:get_int("push_dir"), taken) then - inv:set_stack("main", 1, stack) - end - end -end - -local function node_timer(pos, elapsed) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv then - if not pull_push_item(pos, meta) then - scan_for_objects({x=pos.x, y=pos.y+1, z=pos.z}, inv) - push_item(pos, inv, meta) - end - end - return true -end - -minetest.register_node("techage:hopper_ta1", { - description = S("TA1 Hopper"), - tiles = { - -- up, down, right, left, back, front - "default_cobble.png^techage_appl_hopper_top.png", - "default_cobble.png^techage_appl_hopper.png", - "default_cobble.png^techage_appl_hopper_right.png", - "default_cobble.png^techage_appl_hopper.png", - "default_cobble.png^techage_appl_hopper.png", - "default_cobble.png^techage_appl_hopper.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, 2/16, -8/16, 8/16, 8/16, -6/16}, - {-8/16, 2/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, 2/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, 2/16, -8/16, 8/16, 8/16, 8/16}, - {-6/16, 0/16, -6/16, 6/16, 3/16, 6/16}, - {-5/16, -4/16, -5/16, 5/16, 0/16, 5/16}, - { 0/16, -4/16, -3/16, 11/16, 2/16, 3/16}, + end, + listname = "src", }, - }, - selection_box = { - type = "fixed", - fixed = { - {-8/16, 2/16, -8/16, 8/16, 8/16, 8/16}, - {-5/16, -4/16, -5/16, 5/16, 0/16, 5/16}, - { 0/16, -4/16, -3/16, 11/16, 2/16, 3/16}, + take = { + listname = "src", }, - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 1) - end, - - after_place_node = function(pos, placer) - techage.add_node(pos, "techage:hopper_ta1") - local node = minetest.get_node(pos) - M(pos):set_int("push_dir", techage.side_to_indir("L", node.param2)) - minetest.get_node_timer(pos):start(2) - end, - - on_timer = node_timer, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos) - tubelib2.del_mem(pos) - end, - - on_rotate = screwdriver.disallow, - 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_craft({ - output = "techage:hopper_ta1", - recipe = { - {"default:stone", "", "default:stone"}, - {"default:stone", "default:gold_ingot", "default:stone"}, - {"", "default:stone", ""}, - }, -}) - -techage.register_node({"techage:hopper_ta1"}, { - on_pull_item = nil, -- not needed - on_unpull_item = nil, -- not needed - - on_push_item = function(pos, in_dir, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.put_items(inv, "main", stack) - end, -}) - + } +) diff --git a/mod.conf b/mod.conf index 6b99e00..4ffed44 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = techage -depends = default,tubelib2,basic_materials,bucket,stairs,screwdriver -optional_depends = unified_inventory,wielded_light,minecart,unifieddyes +depends = default,tubelib2,basic_materials,bucket,stairs,screwdriver,minecart +optional_depends = unified_inventory,wielded_light,unifieddyes description = Techage, go through 4 tech ages in search of wealth and power! \ No newline at end of file