Add long term storage of AreaStores for home nodes
This was a doozy to figure out: AreaStore's to_string method doesn't return a valid UTF8 string, which apparently means that StorageRef's set_string method won't save it properly. To counteract this, the serialized AreaStore must be converted to a valid UTF-8 string before saving. We do this by running it through minetest.encode_base64 and minetest.decode_base64 to prevent corruption. This introduces a performance impact that we need to keep in mind; thankfully, during normal gameplay it's unlikely that areas will be updated often enough for this to be an issue. Also, minor formatting and debugging changes.master
parent
707db6419f
commit
648cb421c0
24
init.lua
24
init.lua
|
@ -2,12 +2,10 @@ maggems_landmark = {}
|
|||
local modstore = minetest.get_mod_storage()
|
||||
|
||||
function maggems_landmark.is_protected(pos, name)
|
||||
minetest.debug("t-test")
|
||||
local homes = maggems_landmark.homes
|
||||
if (homes == nil) then return false end
|
||||
minetest.debug(dump(homes), dump(homes[name]))
|
||||
minetest.debug(dump(homes))
|
||||
for _, areas in pairs(homes) do
|
||||
minetest.debug(dump(areas))
|
||||
for _, area in pairs(areas:get_areas_for_pos(pos, true, true)) do
|
||||
minetest.debug("found an area!")
|
||||
end
|
||||
|
@ -27,11 +25,17 @@ minetest.register_on_joinplayer(function(player)
|
|||
maggems_landmark.homes[name] = AreaStore()
|
||||
local stored_homes = modstore:get(name .. "_homes")
|
||||
if (stored_homes) then
|
||||
stored_homes = minetest.decode_base64(stored_homes)
|
||||
maggems_landmark.homes[name]:from_string(stored_homes)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local function update_homes(name)
|
||||
local homes = maggems_landmark.homes[name]
|
||||
modstore:set_string(name .. "_homes", minetest.encode_base64(homes:to_string()))
|
||||
end
|
||||
|
||||
minetest.register_node("maggems_landmark:home", {
|
||||
description = "Misi Home",
|
||||
tiles = {"maggems_landmark_home_side.png"},
|
||||
|
@ -57,16 +61,18 @@ minetest.register_node("maggems_landmark:home", {
|
|||
" (" .. meta:get_string("owner") .. ")")
|
||||
meta:set_string("formspec", "size[11,5.5]real_coordinates[true]\
|
||||
field[1,2.5;9,0.5;name;Home name;${maggems_landmark:name}]")
|
||||
local homes = maggems_landmark.homes[placer:get_player_name()]
|
||||
local pos1 = {x=pos.x-3,y=pos.y-3,z=pos.z-3}
|
||||
local pos2 = {x=pos.x+4,y=pos.y+4,z=pos.z+4}
|
||||
local id = homes:insert_area(pos1, pos2, placer:get_player_name())
|
||||
assert(id ~= nil)
|
||||
meta:set_int("maggems_landmark:home_id", id)
|
||||
local homes = maggems_landmark.homes[placer:get_player_name()]
|
||||
local pos1 = {x=pos.x-3,y=pos.y-3,z=pos.z-3}
|
||||
local pos2 = {x=pos.x+4,y=pos.y+4,z=pos.z+4}
|
||||
local id = homes:insert_area(pos1, pos2, placer:get_player_name())
|
||||
assert(id ~= nil)
|
||||
update_homes(placer:get_player_name())
|
||||
meta:set_int("maggems_landmark:home_id", id)
|
||||
end,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local homes = maggems_landmark.homes[oldmetadata.fields.owner]
|
||||
homes:remove_area(oldmetadata.fields["maggems_landmark:home_id"])
|
||||
update_homes(oldmetadata.fields.owner)
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
|
Loading…
Reference in New Issue