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
codefairy 2019-08-20 21:05:21 -04:00
parent 707db6419f
commit 648cb421c0
1 changed files with 15 additions and 9 deletions

View File

@ -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)