From 3922514ac07c7fe3808bf3996306fecbefd564a2 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Thu, 14 Aug 2014 21:20:03 +0200 Subject: [PATCH 1/2] dont use conductor --- mesecons_random/init.lua | 126 ++++++++++++++++++++++++++++++--------- 1 file changed, 99 insertions(+), 27 deletions(-) diff --git a/mesecons_random/init.lua b/mesecons_random/init.lua index 670bea4..d708e8b 100644 --- a/mesecons_random/init.lua +++ b/mesecons_random/init.lua @@ -25,6 +25,50 @@ minetest.register_craft({ -- GHOSTSTONE +local function get_tab(pos, func) + local tab = {pos} + local tab_avoid = {[pos.x.." "..pos.y.." "..pos.z] = true} + local tab_done,num = {pos},2 + while tab[1] do + for n,p in pairs(tab) do + for i = -1,1,2 do + for _,p2 in pairs({ + {x=p.x+i, y=p.y, z=p.z}, + {x=p.x, y=p.y+i, z=p.z}, + {x=p.x, y=p.y, z=p.z+i}, + }) do + local pstr = p2.x.." "..p2.y.." "..p2.z + if not tab_avoid[pstr] + and func(p2) then + tab_avoid[pstr] = true + tab_done[num] = p2 + num = num+1 + table.insert(tab, p2) + end + end + end + tab[n] = nil + end + end + return tab_done +end + +local function is_ghoststone(pos) + return minetest.get_node(pos).name == "mesecons_random:ghoststone" +end + +local function is_ghoststone_active(pos) + return minetest.get_node(pos).name == "mesecons_random:ghoststone_active" +end + +local function update_ghoststones(pos, func, name) + func = func or is_ghoststone + name = name or "mesecons_random:ghoststone_active" + for _,p in pairs(get_tab(pos, func)) do + minetest.set_node(p, {name=name}) + end +end + minetest.register_node("mesecons_random:ghoststone", { description="ghoststone", tiles = {"jeija_ghoststone.png"}, @@ -32,18 +76,32 @@ minetest.register_node("mesecons_random:ghoststone", { inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"), groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), - mesecons = {conductor = { - state = mesecon.state.off, - rules = { --axes - {x = -1, y = 0, z = 0}, - {x = 1, y = 0, z = 0}, - {x = 0, y = -1, z = 0}, - {x = 0, y = 1, z = 0}, - {x = 0, y = 0, z = -1}, - {x = 0, y = 0, z = 1}, - }, - onstate = "mesecons_random:ghoststone_active" - }} + mesecons = {--[[conductor = { + state = mesecon.state.off, + rules = { --axes + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + onstate = "mesecons_random:ghoststone_active" + },]] + effector = { + rules = { + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + action_on = function(pos) + update_ghoststones(pos) + end + } + } }) minetest.register_node("mesecons_random:ghoststone_active", { @@ -53,23 +111,37 @@ minetest.register_node("mesecons_random:ghoststone_active", { diggable = false, sunlight_propagates = true, paramtype = "light", - mesecons = {conductor = { - state = mesecon.state.on, - rules = { - {x = -1, y = 0, z = 0}, - {x = 1, y = 0, z = 0}, - {x = 0, y = -1, z = 0}, - {x = 0, y = 1, z = 0}, - {x = 0, y = 0, z = -1}, - {x = 0, y = 0, z = 1}, - }, - offstate = "mesecons_random:ghoststone" - }}, + mesecons = {--[[conductor = { + state = mesecon.state.on, + rules = { + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + offstate = "mesecons_random:ghoststone" + },]] + effector = { + rules = { + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + action_off = function(pos) + update_ghoststones(pos, is_ghoststone_active, "mesecons_random:ghoststone") + end + } + }, on_construct = function(pos) --remove shadow - pos2 = {x = pos.x, y = pos.y + 1, z = pos.z} - if ( minetest.get_node(pos2).name == "air" ) then - minetest.dig_node(pos2) + pos.y = pos.y+1 + if minetest.get_node(pos).name == "air" then + minetest.dig_node(pos) end end }) From 4b0c0dec63f3f6d151197c708a1da55ff231f500 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Thu, 14 Aug 2014 21:37:55 +0200 Subject: [PATCH 2/2] use vm to improve speed for giant/big ghostblock constructions --- mesecons_random/init.lua | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/mesecons_random/init.lua b/mesecons_random/init.lua index d708e8b..8591749 100644 --- a/mesecons_random/init.lua +++ b/mesecons_random/init.lua @@ -61,12 +61,44 @@ local function is_ghoststone_active(pos) return minetest.get_node(pos).name == "mesecons_random:ghoststone_active" end +local c = {} local function update_ghoststones(pos, func, name) func = func or is_ghoststone name = name or "mesecons_random:ghoststone_active" - for _,p in pairs(get_tab(pos, func)) do - minetest.set_node(p, {name=name}) + local tab = get_tab(pos, func) + if #tab < 50 then + for _,p in pairs(tab) do + minetest.set_node(p, {name=name}) + end + return end + + local p = tab[1] + local min = vector.new(p) + local max = vector.new(p) + for _,p in pairs(tab) do + for _,coord in pairs({"x", "y", "z"}) do + min[coord] = math.min(min[coord], p[coord]) + max[coord] = math.max(max[coord], p[coord]) + end + end + + c[name] = c[name] or minetest.get_content_id(name) + local c_name = c[name] + + local manip = minetest.get_voxel_manip() + local emerged_pos1, emerged_pos2 = manip:read_from_map(min, max) + local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + local nodes = manip:get_data() + + for _,p in pairs(tab) do + nodes[area:indexp(p)] = c_name + end + + manip:set_data(nodes) + manip:write_to_map() + manip:update_map() + --print(string.format("[mesecons] ghostblocks updated after ca. %.2fs", os.clock() - --t1)) end minetest.register_node("mesecons_random:ghoststone", {