From d39797aad83ad02ed717cb52af8a28747ae60b45 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 3 Sep 2016 16:29:14 +0200 Subject: [PATCH] Handle CONTENT_IGNORE when checking windmill conditions. Windmills always span more than one mapblock, so even with a switching station next to the generators, they will stop working if unloaded due to the windmill check failing to handle CONTENT_IGNORE of the frames at the foot of the windmill, unless a second switching station would be placed there. The commit assumes, that a user has to load a block to modify it, and thus unloaded blocks to have the same windmill frame state as before. This also makes technic_run for windmills a little faster by being able to skip some unnecessary node lookups and generally avoiding creation of 20 tables per windmill per step. --- technic/machines/MV/wind_mill.lua | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/technic/machines/MV/wind_mill.lua b/technic/machines/MV/wind_mill.lua index 1377c67..28a075d 100644 --- a/technic/machines/MV/wind_mill.lua +++ b/technic/machines/MV/wind_mill.lua @@ -33,8 +33,15 @@ local function check_wind_mill(pos) if pos.y < 30 then return false end + pos = {x=pos.x, y=pos.y, z=pos.z} for i = 1, 20 do - local node = minetest.get_node({x=pos.x, y=pos.y-i, z=pos.z}) + pos.y = pos.y - 1 + local node = minetest.get_node_or_nil(pos) + if not node then + -- we reached CONTENT_IGNORE, we can assume, that nothing changed + -- as the user will have to load the block to change it + return + end if node.name ~= "technic:wind_mill_frame" then return false end @@ -45,17 +52,17 @@ end local run = function(pos, node) local meta = minetest.get_meta(pos) local machine_name = S("Wind %s Generator"):format("MV") - local power = math.min(pos.y * 100, 5000) - if not check_wind_mill(pos) then + local check = check_wind_mill(pos) + if check == false then meta:set_int("MV_EU_supply", 0) meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name)) - return - else + elseif check == true then + local power = math.min(pos.y * 100, 5000) meta:set_int("MV_EU_supply", power) + meta:set_string("infotext", S("@1 (@2 EU)", machine_name, technic.pretty_num(power))) end - - meta:set_string("infotext", S("@1 (@2 EU)", machine_name, technic.pretty_num(power))) + -- check == nil: assume nothing has changed end minetest.register_node("technic:wind_mill", {