diff --git a/basic_machines/legacy_nodes.lua b/basic_machines/legacy_nodes.lua index c6ace16..121807f 100644 --- a/basic_machines/legacy_nodes.lua +++ b/basic_machines/legacy_nodes.lua @@ -14,6 +14,23 @@ ]]-- +local OwnerCache = { +} + +-- Check if the chest is in the protected area of the owner +local function is_owner(pos, meta) + local owner = meta:get_string("owner") + local key = minetest.hash_node_position(pos) + -- If successfull, store info in cache + if OwnerCache[key] ~= owner then + if not minetest.is_protected(pos, owner) then + OwnerCache[key] = owner + end + end + return OwnerCache[key] == owner +end + + techage.register_node("default:chest", {"default:chest_open"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) @@ -32,6 +49,26 @@ techage.register_node("default:chest", {"default:chest_open"}, { end, }) +techage.register_node("default:chest_locked", {"default:chest_locked_open"}, { + on_pull_item = function(pos, in_dir, num) + local meta = minetest.get_meta(pos) + if is_owner(pos, meta) then + local inv = meta:get_inventory() + return techage.get_items(inv, "main", num) + end + end, + 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, + on_unpull_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, +}) + techage.register_node("default:furnace", {"default:furnace_active"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) diff --git a/basis/gravel_lib.lua b/basis/gravel_lib.lua index 4ffc005..135d71b 100644 --- a/basis/gravel_lib.lua +++ b/basis/gravel_lib.lua @@ -19,6 +19,12 @@ local PROBABILITY_FACTOR = 2 local ore_probability = { } +local ProbabilityCorrections = { + ["default:coal_lump"] = 0.5, -- extensively used + ["default:iron_lump"] = 0.5, -- extensively used + ["techage:baborium_lump"] = 99999, -- mining required +} + -- collect all registered ores and calculate the probability local function add_ores() for _,item in pairs(minetest.registered_ores) do @@ -44,6 +50,12 @@ local function add_ores() end end end + -- some corrections + for key, correction in pairs(ProbabilityCorrections) do + if ore_probability[key] then + ore_probability[key] = ore_probability[key] * correction + end + end local overall_probability = 0.0 for name,probability in pairs(ore_probability) do minetest.log("info", string.format("[techage] %-32s %u", name, probability)) diff --git a/init.lua b/init.lua index 39e5f31..09dd687 100644 --- a/init.lua +++ b/init.lua @@ -36,6 +36,9 @@ else dofile(MP.."/tools/trowel.lua") --dofile(MP.."/tools/repairkit.lua") + -- Nodes + dofile(MP.."/nodes/baborium.lua") + -- Power networks dofile(MP.."/power/drive_axle.lua") dofile(MP.."/power/steam_pipe.lua") @@ -91,8 +94,6 @@ else --dofile(MP.."/coal_power_station/cooler.lua") - - dofile(MP.."/test/battery.lua") --dofile(MP.."/test/test.lua") dofile(MP.."/test/generator.lua") diff --git a/iron_age/charcoalpile.lua b/iron_age/charcoalpile.lua index 7565d2e..a053a4c 100644 --- a/iron_age/charcoalpile.lua +++ b/iron_age/charcoalpile.lua @@ -18,7 +18,7 @@ local MP = minetest.get_modpath("techage") local S, NS = dofile(MP.."/intllib.lua") local PILE_BURN_TIME = 1200 -local COAL_BURN_TIME = 700 +local COAL_BURN_TIME = 300 -- determine the number of wood nodes local function num_wood(pos) diff --git a/iron_age/coalburner.lua b/iron_age/coalburner.lua index e40e72a..0fee789 100644 --- a/iron_age/coalburner.lua +++ b/iron_age/coalburner.lua @@ -17,6 +17,10 @@ local MP = minetest.get_modpath("techage") local S, NS = dofile(MP.."/intllib.lua") +local COAL_BURN_TIME = 700 +local CYCLE_TIME = 5 + + local function num_coal(pos) local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} local pos2 = {x=pos.x, y=pos.y+32, z=pos.z} @@ -31,10 +35,19 @@ local function num_cobble(pos, height) return #nodes end +local function num_air(pos) + local pos1 = {x=pos.x-1, y=pos.y, z=pos.z-1} + local pos2 = {x=pos.x+1, y=pos.y, z=pos.z+1} + local nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"}) + return #nodes +end + local function start_burner(pos, height) local pos1 = {x=pos.x-1, y=pos.y+1, z=pos.z-1} local pos2 = {x=pos.x+1, y=pos.y+height, z=pos.z+1} - techage.ironage_swap_nodes(pos1, pos2, "techage:charcoal", "techage:charcoal_burn") + for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, "techage:charcoal")) do + minetest.swap_node(p, "techage:charcoal_burn") + end end local function remove_flame(pos, height) @@ -51,6 +64,17 @@ local function remove_flame(pos, height) end end +local function calc_num_coal(meta) + local t = minetest.get_gametime() - meta:get_int("ignite") + local num = meta:get_int("height") + t = t - COAL_BURN_TIME + if t > 0 then + local x = (COAL_BURN_TIME * 0.2) / num + num = math.max(num - math.floor(t/x), 0) + end + return num +end + local function flame(pos, height, heat, first_time) local idx pos = {x=pos.x, y=pos.y+height, z=pos.z} @@ -76,8 +100,9 @@ local function flame(pos, height, heat, first_time) end -lRatio = {120, 110, 95, 75, 55, 28, 0} -lColor = {"000080", "400040", "800000", "800000", "800000", "800000", "800000"} +local lRatio = {120, 110, 95, 75, 55, 28, 0} +local lColor = {"000080", "400040", "800000", "800000", "800000", "800000", "800000"} + for idx,ratio in ipairs(lRatio) do local color = "techage_flame_animated.png^[colorize:#"..lColor[idx].."B0:"..ratio minetest.register_node("techage:flame"..idx, { @@ -150,7 +175,7 @@ function techage.start_burner(pos, playername) gain = height/12.0, loop = true}) meta:set_int("handle", handle) - minetest.get_node_timer(pos):start(5) + minetest.get_node_timer(pos):start(CYCLE_TIME) end end @@ -164,13 +189,18 @@ function techage.keep_running_burner(pos) meta:set_int("handle", 0) end if num_cobble(pos, height) == height * 8 then - local new_height = num_coal(pos) - if new_height > 0 then - flame(pos, height, new_height, false) + local num = calc_num_coal(meta) + if num > 0 then + if num_air(pos) == 0 then + -- pause the burner + meta:set_int("ignite", meta:get_int("ignite") + CYCLE_TIME) + return true + end + flame(pos, height, num, false) handle = minetest.sound_play("techage_gasflare", { pos = {x=pos.x, y=pos.y+height, z=pos.z}, max_hear_distance = 32, - gain = new_height/12.0, + gain = num/12.0, loop = true}) meta:set_int("handle", handle) else @@ -199,6 +229,7 @@ local BurnerHelp = S([[Coal Burner to heat the melting pot: - fill the tower from the top with charcoal - ignite the lighter - place the pot in the flame, (one block above the tower) +- to pause the burner, close the hole temporarily with e.g. dirt (see plan)]]) local BurnerImages = {