9 Commits

Author SHA1 Message Date
6d278538a9 Merge remote-tracking branch 'upstream/master' into dev 2020-08-08 10:14:25 +02:00
4d7508ae70 Recompress the textures
This reduces the PNG file sizes and fixes the invalid sRGB profile warnings.
I have additionally reduced the moremesecons_luablock.png resolution to 32x32.
2020-08-07 20:53:37 +02:00
67875f9c6e Fix bug allowing timegate duplication
Fixes #13
2020-05-10 10:09:34 +02:00
de765f7f7b LuaBlock: run in separate environment, add a "mem" table 2020-05-09 13:18:44 +02:00
7ba7a5cceb MapDataStorage: replace "%a" format with "%.17g" 2020-04-29 18:06:17 +02:00
f2de7c89b1 MapDataStorage: change serialization in mod storage
Use minetest.serialize on the full values table instead of serializing
each value independently and concatenating.
2020-04-29 12:43:29 +02:00
0000cfb474 Remove old vector_extras code and use the MapDataStorage 2020-04-14 08:49:21 +02:00
9aa0e6ab3d Add MapDataStorage code as replacement for get_data_from_pos etc.
In comparison to using Minetest's hash_node_position, this saves additional information about the z-only and zy-only components, which is what the vector_extras code did.
In comparison to the old vector_extras code, this does not create lots of lua tables, which is slow, but instead uses one table as hashmap.
2020-04-14 08:49:21 +02:00
23b96b9db6 Ajoute messages de chargement des mods dans le journal "action" 2018-12-31 17:26:41 +01:00
56 changed files with 412 additions and 97 deletions

View File

@ -1,11 +1,11 @@
# MoreMesecons # MoreMesecons
Based on Mesecons by Jeija Based on Mesecons by Jeija <br/>
By @paly2 and @HybridDog By @paly2 and @HybridDog <br/>
With the participation of @LeMagnesium (bugfix), @Ataron (textures), @JAPP (texture). With the participation of @LeMagnesium (bugfix), @Ataron (textures), @JAPP (texture).
Dependencies: [Mesecons](https://github.com/Jeija/minetest-mod-mesecons/) Dependencies: [Mesecons](https://github.com/Jeija/minetest-mod-mesecons/) <br/>
Optional dependencies: [vector_extras](https://github.com/HybridDog/vector_extras/) [digilines](https://github.com/minetest-mods/digilines) Optional dependencies: [digilines](https://github.com/minetest-mods/digilines)
MoreMesecons is a mod for minetest which adds some mesecons items. MoreMesecons is a mod for minetest which adds some mesecons items.

View File

@ -64,3 +64,5 @@ minetest.register_craft({
recipe = { {"mesecons_blinkyplant:blinky_plant_off"}, recipe = { {"mesecons_blinkyplant:blinky_plant_off"},
{"default:mese_crystal_fragment"},} {"default:mese_crystal_fragment"},}
}) })
minetest.log("action", "[moremesecons_adjustable_blinky_plant] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

After

Width:  |  Height:  |  Size: 237 B

View File

@ -156,3 +156,5 @@ minetest.register_abm({
end end
end, end,
}) })
minetest.log("action", "[moremesecons_adjustable_player_detector] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 B

After

Width:  |  Height:  |  Size: 622 B

View File

@ -172,3 +172,5 @@ minetest.register_craft({
{"group:mesecon_conductor_craftable","default:mese_crystal","group:mesecon_conductor_craftable"} {"group:mesecon_conductor_craftable","default:mese_crystal","group:mesecon_conductor_craftable"}
} }
}) })
minetest.log("action", "[moremesecons_commandblock] loaded.")

View File

@ -79,3 +79,5 @@ minetest.register_craft({
output = "moremesecons_conductor_signalchanger:conductor_signalchanger_off", output = "moremesecons_conductor_signalchanger:conductor_signalchanger_off",
recipe = {{"group:mesecon_conductor_craftable","moremesecons_signalchanger:signalchanger_off"}} recipe = {{"group:mesecon_conductor_craftable","moremesecons_signalchanger:signalchanger_off"}}
}) })
minetest.log("action", "[moremesecons_conductor_signalchanger] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 B

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 112 B

View File

@ -93,3 +93,5 @@ minetest.register_craft({
output = "moremesecons_dual_delayer:dual_delayer_00 2", output = "moremesecons_dual_delayer:dual_delayer_00 2",
recipe = {"mesecons_delayer:delayer_off_1", "mesecons_delayer:delayer_off_1"} recipe = {"mesecons_delayer:delayer_off_1", "mesecons_delayer:delayer_off_1"}
}) })
minetest.log("action", "[moremesecons_dual_delayer] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 B

After

Width:  |  Height:  |  Size: 78 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 B

After

Width:  |  Height:  |  Size: 77 B

View File

@ -139,3 +139,5 @@ minetest.register_abm({
end end
end, end,
}) })
minetest.log("action", "[moremesecons_entity_detector] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

After

Width:  |  Height:  |  Size: 554 B

View File

@ -46,3 +46,5 @@ minetest.register_craft({
recipe = { {"default:torch"}, recipe = { {"default:torch"},
{"default:mese_crystal_fragment"},} {"default:mese_crystal_fragment"},}
}) })
minetest.log("action", "[moremesecons_igniter] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 B

After

Width:  |  Height:  |  Size: 674 B

View File

@ -102,3 +102,5 @@ minetest.register_craft({
{"", "default:mese_crystal_fragment", ""} {"", "default:mese_crystal_fragment", ""}
} }
}) })
minetest.log("action", "[moremesecons_induction_transmitter] loaded.")

View File

@ -82,3 +82,5 @@ minetest.register_craft({
output = "moremesecons_injector_controller:injector_controller_off", output = "moremesecons_injector_controller:injector_controller_off",
recipe = {{"mesecons_blinkyplant:blinky_plant_off","mesecons_gates:and_off"}} recipe = {{"mesecons_blinkyplant:blinky_plant_off","mesecons_gates:and_off"}}
}) })
minetest.log("action", "[moremesecons_injector_controller] loaded.")

View File

@ -1,47 +1,37 @@
-- see wireless jammer -- see wireless jammer
local get = vector.get_data_from_pos
local set = vector.set_data_to_pos
local remove = vector.remove_data_from_pos
local storage = minetest.get_mod_storage() local storage = minetest.get_mod_storage()
local jammers = minetest.deserialize(storage:get_string("jammers")) or {} local jammers = moremesecons.load_MapDataStorage_legacy(storage, "jammers_v2",
"jammers")
local function update_mod_storage() local function update_mod_storage()
storage:set_string("jammers", minetest.serialize(jammers)) storage:set_string("jammers_v2", jammers:serialize())
end end
local function add_jammer(pos) local function add_jammer(pos)
if get(jammers, pos.z,pos.y,pos.x) then if jammers:getAt(pos) then
return return
end end
set(jammers, pos.z,pos.y,pos.x, true) jammers:setAt(pos, true)
update_mod_storage() update_mod_storage()
end end
local function remove_jammer(pos) local function remove_jammer(pos)
remove(jammers, pos.z,pos.y,pos.x) jammers:removeAt(pos)
update_mod_storage() update_mod_storage()
end end
local function is_jammed(pos) local function is_jammed(pos)
local JAMMER_MAX_DISTANCE = moremesecons.setting("jammer", "max_distance", 10, 1) local JAMMER_MAX_DISTANCE = moremesecons.setting("jammer", "max_distance", 10, 1)
local pz,py,px = vector.unpack(pos) local minp = vector.subtract(pos, JAMMER_MAX_DISTANCE)
for z,yxs in pairs(jammers) do local maxp = vector.add(pos, JAMMER_MAX_DISTANCE)
if math.abs(pz-z) <= JAMMER_MAX_DISTANCE then for p in jammers:iter(minp, maxp) do
for y,xs in pairs(yxs) do local d = vector.subtract(pos, p)
if math.abs(py-y) <= JAMMER_MAX_DISTANCE then if d.x ^ 2 + d.y ^ 2 + d.z ^ 2 <= JAMMER_MAX_DISTANCE^2 then
for x in pairs(xs) do
if math.abs(px-x) <= JAMMER_MAX_DISTANCE
and (px-x)^2+(py-y)^2+(pz-z)^2 <= JAMMER_MAX_DISTANCE^2 then
return true return true
end end
end end
end
end
end
end
return false return false
end end
@ -141,3 +131,5 @@ if moremesecons.setting("jammer", "enable_lbm", false) then
action = add_jammer action = add_jammer
}) })
end end
minetest.log("action", "[moremesecons_jammer] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 B

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 B

After

Width:  |  Height:  |  Size: 112 B

View File

@ -120,25 +120,30 @@ minetest.register_node("moremesecons_luablock:luablock", {
minetest.log("warning", "[moremesecons_luablock] Metadata of LuaBlock at pos "..minetest.pos_to_string(npos).." does not match its mod storage data!") minetest.log("warning", "[moremesecons_luablock] Metadata of LuaBlock at pos "..minetest.pos_to_string(npos).." does not match its mod storage data!")
return return
end end
-- We do absolutely no check there.
-- There is no limitation in the number of instruction the LuaBlock can execute local env = {}
-- or the usage it can make of loops. for k, v in pairs(_G) do
-- It is executed in the global namespace. env[k] = v
-- Remember: *The LuaBlock is highly dangerous and should be manipulated cautiously!* end
local func, err = loadstring(code) env.pos = table.copy(npos)
env.mem = minetest.deserialize(meta:get_string("mem")) or {}
local func, err
if _VERSION == "Lua 5.1" then
func, err = loadstring(code)
if func then
setfenv(func, env)
end
else
func, err = load(code, nil, "t", env)
end
if not func then if not func then
meta:set_string("errmsg", err) meta:set_string("errmsg", err)
make_formspec(meta, pos) make_formspec(meta, pos)
return return
end end
-- Set the "pos" global
local old_pos
if minetest.global_exists("pos") then
old_pos = pos -- In case there's already an existing "pos" global
end
pos = table.copy(npos)
local good, err = pcall(func) local good, err = pcall(func)
pos = old_pos
if not good then -- Runtime error if not good then -- Runtime error
meta:set_string("errmsg", err) meta:set_string("errmsg", err)
@ -146,8 +151,12 @@ minetest.register_node("moremesecons_luablock:luablock", {
return return
end end
meta:set_string("mem", minetest.serialize(env.mem))
meta:set_string("errmsg", "") meta:set_string("errmsg", "")
make_formspec(meta, pos) make_formspec(meta, pos)
end end
}} }}
}) })
minetest.log("action", "[moremesecons_luablock] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,7 +1,3 @@
--[[
vector_extras there: https://github.com/HybridDog/vector_extras
]]
local templates = {MoreMesecons = { local templates = {MoreMesecons = {
logic = [[-- AND logic = [[-- AND
port.a = pin.b and pin.c port.a = pin.b and pin.c
@ -356,3 +352,5 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return return
end end
end) end)
minetest.log("action", "[moremesecons_luacontroller_tool] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 227 B

View File

@ -116,3 +116,5 @@ minetest.register_craft({
output = "default:mesechest_locked", output = "default:mesechest_locked",
recipe = {{"group:mesecon_conductor_craftable", "default:chest_locked", "group:mesecon_conductor_craftable"}} recipe = {{"group:mesecon_conductor_craftable", "default:chest_locked", "group:mesecon_conductor_craftable"}}
}) })
minetest.log("action", "[moremesecons_mesechest] loaded.")

View File

@ -60,3 +60,5 @@ minetest.register_node("moremesecons_playerkiller:playerkiller", {
end, end,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
minetest.log("action", "[moremesecons_playerkiller] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 454 B

View File

@ -121,3 +121,5 @@ minetest.register_craft({
recipe = {{"mesecons_luacontroller:luacontroller0000", "mesecons_noteblock:noteblock"}, recipe = {{"mesecons_luacontroller:luacontroller0000", "mesecons_noteblock:noteblock"},
{"group:wood", "group:wood"}} {"group:wood", "group:wood"}}
}) })
minetest.log("action", "[moremesecons_sayer] loaded.")

View File

@ -79,3 +79,5 @@ minetest.register_craft({
output = "moremesecons_signalchanger:signalchanger_off", output = "moremesecons_signalchanger:signalchanger_off",
recipe = {{"group:mesecon_conductor_craftable","moremesecons_switchtorch:switchtorch_off","group:mesecon_conductor_craftable"}} recipe = {{"group:mesecon_conductor_craftable","moremesecons_switchtorch:switchtorch_off","group:mesecon_conductor_craftable"}}
}) })
minetest.log("action", "[moremesecons_signalchanger] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

After

Width:  |  Height:  |  Size: 112 B

View File

@ -127,3 +127,5 @@ minetest.register_abm({
-- 2 = x+1 -- 2 = x+1
-- 0 = y+1 -- 0 = y+1
-- 1 = y-1 -- 1 = y-1
minetest.log("action", "[moremesecons_switchtorch] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 B

After

Width:  |  Height:  |  Size: 119 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 B

After

Width:  |  Height:  |  Size: 111 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 B

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 B

After

Width:  |  Height:  |  Size: 114 B

View File

@ -1,19 +1,19 @@
local storage = minetest.get_mod_storage() local storage = minetest.get_mod_storage()
local teleporters = minetest.deserialize(storage:get_string("teleporters")) or {} local teleporters = minetest.deserialize(storage:get_string("teleporters")) or {}
local teleporters_rids = minetest.deserialize(storage:get_string("teleporters_rids")) or {} local teleporters_rids = moremesecons.load_MapDataStorage_legacy(storage,
local jammers = minetest.deserialize(storage:get_string("jammers")) or {} "teleporters_rids_v2", "teleporters_rids")
local function update_mod_storage() local function update_mod_storage()
storage:set_string("teleporters", minetest.serialize(teleporters)) storage:set_string("teleporters", minetest.serialize(teleporters))
storage:set_string("teleporters_rids", minetest.serialize(teleporters_rids)) storage:set_string("teleporters_rids_v2", teleporters_rids:serialize())
end end
local function register(pos) local function register(pos)
if not vector.get_data_from_pos(teleporters_rids, pos.z,pos.y,pos.x) then if not teleporters_rids:getAt(pos) then
table.insert(teleporters, pos) table.insert(teleporters, pos)
vector.set_data_to_pos(teleporters_rids, pos.z,pos.y,pos.x, #teleporters) teleporters_rids:setAt(pos, #teleporters)
update_mod_storage() update_mod_storage()
end end
end end
@ -89,10 +89,10 @@ minetest.register_node("moremesecons_teleporter:teleporter", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_construct = register, on_construct = register,
on_destruct = function(pos) on_destruct = function(pos)
local RID = vector.get_data_from_pos(teleporters_rids, pos.z,pos.y,pos.x) local RID = teleporters_rids:getAt(pos)
if RID then if RID then
table.remove(teleporters, RID) table.remove(teleporters, RID)
vector.remove_data_from_pos(teleporters_rids, pos.z,pos.y,pos.x) teleporters_rids:removeAt(pos)
update_mod_storage() update_mod_storage()
end end
end, end,
@ -106,3 +106,5 @@ if moremesecons.setting("teleporter", "enable_lbm", false) then
action = register action = register
}) })
end end
minetest.log("action", "[moremesecons_teleporter] loaded.")

View File

@ -25,11 +25,14 @@ local function timegate_activate(pos, node)
node.name = "moremesecons_timegate:timegate_on" node.name = "moremesecons_timegate:timegate_on"
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
mesecon.receptor_on(pos) mesecon.receptor_on(pos)
minetest.after(time, function(pos, node) minetest.after(time, function()
local node = minetest.get_node(pos)
if node.name == "moremesecons_timegate:timegate_on" then
mesecon.receptor_off(pos) mesecon.receptor_off(pos)
node.name = "moremesecons_timegate:timegate_off" node.name = "moremesecons_timegate:timegate_off"
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
end, pos, node) end
end)
end end
boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
@ -125,3 +128,5 @@ minetest.register_craft({
minetest.register_alias("moremesecons_temporarygate:temporarygate_off", "moremesecons_timegate:timegate_off") minetest.register_alias("moremesecons_temporarygate:temporarygate_off", "moremesecons_timegate:timegate_off")
minetest.register_alias("moremesecons_temporarygate:temporarygate_on", "moremesecons_timegate:timegate_on") minetest.register_alias("moremesecons_temporarygate:temporarygate_on", "moremesecons_timegate:timegate_on")
minetest.log("action", "[moremesecons_timegate] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

After

Width:  |  Height:  |  Size: 168 B

View File

@ -1 +0,0 @@
vector_extras?

View File

@ -52,53 +52,331 @@ function moremesecons.remove_data_from_pos(sto, pos)
sto.storage:set_string(sto.name, minetest.serialize(sto.tab)) sto.storage:set_string(sto.name, minetest.serialize(sto.tab))
end end
-- Vector helpers -- Some additional vector helpers
-- All the following functions are from the vector_extras mod (https://github.com/HybridDog/vector_extras).
-- If you enable that mod, its functions will be used instead of the ones defined below
if not vector.get_data_from_pos then -- The same as minetest.hash_node_position; I copied it to ensure backwards
function vector.get_data_from_pos(tab, z,y,x) -- compatibility and used hexadecimal number notation
local data = tab[z] local function node_position_key(pos)
if data then return (pos.z + 0x8000) * 0x10000 * 0x10000
data = data[y] + (pos.y + 0x8000) * 0x10000
if data then + pos.x + 0x8000
return data[x]
end
end
end
end end
if not vector.set_data_to_pos then local MapDataStorage = {}
function vector.set_data_to_pos(tab, z,y,x, data) setmetatable(MapDataStorage, {__call = function()
if tab[z] then local obj = {}
if tab[z][y] then setmetatable(obj, MapDataStorage)
tab[z][y][x] = data return obj
end})
MapDataStorage.__index = {
getAt = function(self, pos)
return self[node_position_key(pos)]
end,
setAt = function(self, pos, data)
-- If x, y or z is omitted, the key corresponds to a position outside
-- of the map (hopefully), so it can be used to skip lines and planes
local vi_z = (pos.z + 0x8000) * 0x10000 * 0x10000
local vi_zy = vi_z + (pos.y + 0x8000) * 0x10000
local vi = vi_zy + pos.x + 0x8000
local is_new = self[vi] == nil
self[vi] = data
if is_new then
self[vi_z] = (self[vi_z] or 0) + 1
self[vi_zy] = (self[vi_zy] or 0) + 1
end
end,
setAtI = function(self, vi, data)
local vi_zy = vi - vi % 0x10000
local vi_z = vi - vi % (0x10000 * 0x10000)
local is_new = self[vi] == nil
self[vi] = data
if is_new then
self[vi_z] = (self[vi_z] or 0) + 1
self[vi_zy] = (self[vi_zy] or 0) + 1
end
end,
removeAt = function(self, pos)
local vi_z = (pos.z + 0x8000) * 0x10000 * 0x10000
local vi_zy = vi_z + (pos.y + 0x8000) * 0x10000
local vi = vi_zy + pos.x + 0x8000
if self[vi] == nil then
-- Nothing to remove
return return
end end
tab[z][y] = {[x] = data} self[vi] = nil
-- Update existence information for the xy plane and x line
self[vi_z] = self[vi_z] - 1
if self[vi_z] == 0 then
self[vi_z] = nil
self[vi_zy] = nil
return return
end end
tab[z] = {[y] = {[x] = data}} self[vi_zy] = self[vi_zy] - 1
if self[vi_zy] == 0 then
self[vi_zy] = nil
end end
end end,
iter = function(self, pos1, pos2)
local ystride = 0x10000
local zstride = 0x10000 * 0x10000
if not vector.remove_data_from_pos then -- Skip z values where no data can be found
function vector.remove_data_from_pos(tab, z,y,x) pos1 = vector.new(pos1)
if vector.get_data_from_pos(tab, z,y,x) == nil then local vi_z = (pos1.z + 0x8000) * 0x10000 * 0x10000
while not self[vi_z] do
pos1.z = pos1.z + 1
vi_z = vi_z + zstride
if pos1.z > pos2.z then
-- There are no values to iterate through
return function() return end
end
end
-- Skipping y values is not yet implemented and may require much code
local xrange = pos2.x - pos1.x + 1
local yrange = pos2.y - pos1.y + 1
local zrange = pos2.z - pos1.z + 1
-- x-only and y-only parts of the vector index of pos1
local vi_y = (pos1.y + 0x8000) * 0x10000
local vi_x = pos1.x + 0x8000
local y = 0
local z = 0
local vi = node_position_key(pos1)
local pos = vector.new(pos1)
local nextaction = vi + xrange
pos.x = pos.x - 1
vi = vi - 1
local function iterfunc()
-- continue along x until it needs to jump
vi = vi + 1
pos.x = pos.x + 1
if vi ~= nextaction then
local v = self[vi]
if v == nil then
-- No data here
return iterfunc()
end
-- The returned position must not be changed
return pos, v
end
-- Reset x position
vi = vi - xrange
-- Go along y until pos2.y is exceeded
while true do
y = y + 1
pos.y = pos.y + 1
-- Set vi to index(pos1.x, pos1.y + y, pos1.z + z)
vi = vi + ystride
if y == yrange then
break
end
if self[vi - vi_x] then
nextaction = vi + xrange
vi = vi - 1
pos.x = pos1.x - 1
return iterfunc()
end
-- Nothing along this x line, so increase y again
end
-- Go back along y
vi = vi - yrange * ystride
y = 0
pos.y = pos1.y
-- Go along z until pos2.z is exceeded
while true do
z = z + 1
pos.z = pos.z + 1
vi = vi + zstride
if z == zrange then
-- Cuboid finished, return nil
return return
end end
tab[z][y][x] = nil if self[vi - vi_x - vi_y] then
if not next(tab[z][y]) then y = 0
tab[z][y] = nil nextaction = vi + xrange
vi = vi - 1
pos.x = pos1.x - 1
return iterfunc()
end end
if not next(tab[z]) then -- Nothing in this xy plane, so increase z again
tab[z] = nil
end end
end end
return iterfunc
end,
iterAll = function(self)
local previous_vi = nil
local function iterfunc()
local vi, v = next(self, previous_vi)
previous_vi = vi
if not vi then
return
end
local z = math.floor(vi / (0x10000 * 0x10000))
vi = vi - z * 0x10000 * 0x10000
local y = math.floor(vi / 0x10000)
if y == 0 or z == 0 then
-- The index does not refer to a position inside the map
return iterfunc()
end
local x = vi - y * 0x10000 - 0x8000
y = y - 0x8000
z = z - 0x8000
return {x=x, y=y, z=z}, v
end
return iterfunc
end,
serialize = function(self)
local indices = {}
local values = {}
local i = 1
for pos, v in self:iterAll() do
local vi = node_position_key(pos)
-- Convert the double reversible to a string;
-- minetest.serialize does not (yet) do this
indices[i] = ("%.17g"):format(vi)
values[i] = v
end
result = {
version = "MapDataStorage_v1",
indices = "return {" .. table.concat(indices, ",") .. "}",
values = minetest.serialize(values),
}
return minetest.serialize(result)
end,
}
MapDataStorage.deserialize = function(txtdata)
local data = minetest.deserialize(txtdata)
if data.version ~= "MapDataStorage_v1" then
minetest.log("error", "Unknown MapDataStorage version: " ..
data.version)
end
-- I assume that minetest.deserialize correctly deserializes the indices,
-- which are in the %a format
local indices = minetest.deserialize(data.indices)
local values = minetest.deserialize(data.values)
if not indices or not values then
return MapDataStorage()
end
data = MapDataStorage()
for i = 1,#indices do
local vi = indices[i]
local v = values[i]
data:setAtI(vi, v)
end
return data
end
moremesecons.MapDataStorage = MapDataStorage
-- Legacy
-- vector_extras there: https://github.com/HybridDog/vector_extras
-- Creates a MapDataStorage object from old vector_extras generated table
function moremesecons.load_old_data_from_pos(t)
local data = MapDataStorage()
for z, yxv in pairs(t) do
for y, xv in pairs(yxv) do
for x, v in pairs(xv) do
data:setAt({x=x, y=y, z=z}, v)
end
end
end
return data
end end
if not vector.unpack then function moremesecons.load_old_dfp_storage(modstorage, name)
function vector.unpack(pos) local data = minetest.deserialize(modstorage:get_string(name))
return pos.z, pos.y, pos.x if not data then
return
end end
return moremesecons.load_old_data_from_pos(data)
end end
function moremesecons.load_MapDataStorage_legacy(modstorage, name, oldname)
local t_old = moremesecons.load_old_dfp_storage(modstorage, oldname)
local t
if t_old and t_old ~= "" then
t = t_old
modstorage:set_string(name, t:serialize())
modstorage:set_string(oldname, nil)
return t
end
t = modstorage:get_string(name)
if t and t ~= "" then
return MapDataStorage.deserialize(t)
end
return MapDataStorage()
end
-- This testing code shows an example usage of the MapDataStorage code
local function do_test()
print("Test if iter returns correct positions when a lot is set")
local data = MapDataStorage()
local k = 0
for x = -5, 3 do
for y = -5, 3 do
for z = -5, 3 do
k = k + 1
data:setAt({x=x, y=y, z=z}, k)
end
end
end
local expected_positions = {}
for z = -4, 2 do
for y = -4, 2 do
for x = -4, 2 do
expected_positions[#expected_positions+1] = {x=x, y=y, z=z}
end
end
end
local i = 0
for pos, v in data:iter({x=-4, y=-4, z=-4}, {x=2, y=2, z=2}) do
i = i + 1
assert(vector.equals(pos, expected_positions[i]))
end
print("Test if iter works correctly on a corner")
local found = false
for pos, v in data:iter({x=-8, y=-7, z=-80}, {x=-5, y=-5, z=-5}) do
assert(not found)
found = true
assert(vector.equals(pos, {x=-5, y=-5, z=-5}))
end
assert(found)
print("Test if iter finds all corners")
local expected_positions = {}
local k = 1
for _, z in ipairs({-9, -6}) do
for _, y in ipairs({-9, -6}) do
for _, x in ipairs({-8, -6}) do
local pos = {x=x, y=y, z=z}
expected_positions[#expected_positions+1] = pos
data:setAt(pos, k)
k = k + 1
end
end
end
local i = 1
for pos, v in data:iter({x=-8, y=-9, z=-9}, {x=-6, y=-6, z=-6}) do
assert(v == i)
assert(vector.equals(pos, expected_positions[i]))
i = i + 1
--~ print("found " .. minetest.pos_to_string(pos))
end
assert(i == 8 + 1, "Not enough or too many corners found")
--~ data:iterAll()
end
--~ do_test()
minetest.log("action", "[moremesecons_utils] loaded.")

View File

@ -458,16 +458,18 @@ if storage:get_string("wireless_meta_2") == "" then
minetest.log("action", "[moremesecons_wireless] Migrating mod storage data...") minetest.log("action", "[moremesecons_wireless] Migrating mod storage data...")
local jammers_1 = minetest.deserialize(storage:get_string("jammers")) local jammers_1 = minetest.deserialize(storage:get_string("jammers"))
local get = vector.get_data_from_pos local get = function(t, pos)
local set = vector.set_data_to_pos -- FIXME: this does not test explicitly for false,
local remove = vector.remove_data_from_pos -- but channel is never false
return t[pos.z] and t[pos.z][pos.y] and t[pos.z][pos.y][pos.x]
end
for z, data_z in pairs(wireless_meta_1.owners) do for z, data_z in pairs(wireless_meta_1.owners) do
for y, data_y in pairs(data_z) do for y, data_y in pairs(data_z) do
for x, owner in pairs(data_y) do for x, owner in pairs(data_y) do
local pos = {x = x, y = y, z = z} local pos = {x = x, y = y, z = z}
set_owner(pos, owner) set_owner(pos, owner)
set_channel(pos, get(wireless_meta_1.channels, z,y,x)) set_channel(pos, get(wireless_meta_1.channels, pos))
end end
end end
end end
@ -482,3 +484,5 @@ if storage:get_string("wireless_meta_2") == "" then
end end
minetest.log("action", "[moremesecons_wireless] Done!") minetest.log("action", "[moremesecons_wireless] Done!")
end end
minetest.log("action", "[moremesecons_wireless] loaded.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 592 B