From a717827dc8955cd46c08e3112268fe8c8f6429f0 Mon Sep 17 00:00:00 2001 From: PenguinDad Date: Sun, 6 Jul 2014 20:29:12 +0200 Subject: [PATCH] Rewrite sethome mod --- mods/sethome/init.lua | 140 +++++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 55 deletions(-) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index 20f77c01..07757048 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -1,65 +1,95 @@ -local homes_file = minetest.get_worldpath() .. "/homes" -local homepos = {} +local homes_file = minetest.get_worldpath() .. "/homes.txt" +local oldhomes_file = minetest.get_worldpath() .. "/homes" -local function loadhomes() - local input = io.open(homes_file, "r") - if input then - repeat - local x = input:read("*n") - if x == nil then - break - end - local y = input:read("*n") - local z = input:read("*n") - local name = input:read("*l") - homepos[name:sub(2)] = {x = x, y = y, z = z} - until input:read(0) == nil - io.close(input) - else - homepos = {} - end +local input, err = io.open(homes_file, "r") +if err then + minetest.log("error", "[sethome] Failed to open homes file: " .. err) +else + homepos = minetest.deserialize(input:read("*a")) + if type(homepos) ~= "table" then + homepos = {} + end + io.close(input) end -loadhomes() - minetest.register_privilege("home", "Can use /sethome and /home") -local changed = false - minetest.register_chatcommand("home", { - description = "Teleport you to your home point", - privs = {home=true}, - func = function(name) - local player = minetest.env:get_player_by_name(name) - if player == nil then - -- just a check to prevent the server crashing - return false - end - if homepos[player:get_player_name()] then - player:setpos(homepos[player:get_player_name()]) - minetest.chat_send_player(name, "Teleported to home!") - else - minetest.chat_send_player(name, "Set a home using /sethome") - end - end, + description = "Teleport you to your home point", + privs = {home=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if player == nil then + return false + end + if homepos[name] then + player:setpos(homepos[name]) + minetest.chat_send_player(name, "Teleported to home!") + else + minetest.chat_send_player(name, "Set a home using /sethome") + end + end }) minetest.register_chatcommand("sethome", { - description = "Set your home point", - privs = {home=true}, - func = function(name) - local player = minetest.env:get_player_by_name(name) - local pos = player:getpos() - homepos[player:get_player_name()] = pos - minetest.chat_send_player(name, "Home set!") - changed = true - if changed then - local output = io.open(homes_file, "w") - for i, v in pairs(homepos) do - output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n") - end - io.close(output) - changed = false - end - end, + description = "Set your home point", + privs = {home=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + local pos = vector.round(player:getpos()) + homepos[name] = pos + local homedata = minetest.serialize(homepos) + if not homedata then + minetest.log("error", "[sethome] Failed to serialize home data!") + minetest.chat_send_player(name, "Something failed while serializing the home data.") + return false + end + local output, err = io.open(homes_file, "w") + if err then + minetest.log("error", "[sethome] Failed to open homes file: " .. err) + minetest.chat_send_player(name, "Could not save your new home position.") + return false + end + output:write(homedata) + io.close(output) + minetest.chat_send_player(name, "Home set at " .. minetest.pos_to_string(pos)) + end +}) + +minetest.register_chatcommand("migrate_homes", { + description = "Migrate to new homes file format", + privs = {rollback=true} + func = function(name) + local input, err = io.open(oldhomes_file, "r") + if err then + minetest.log("error", "[sethome] Failed to open old homes file: " .. err) + return false + else + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + homepos[name:sub(2)] = vector.new(x, y, z) + until input:read(0) == nil + io.close(input) + local homedata = minetest.serialize(homepos) + if not homedata then + minetest.log("error", "[sethome] Failed to serialize old home data!") + minetest.chat_send_player(name, "Something failed while serializing the old home data.") + return false + end + local output, err = io.open(homes_file, "w") + if err then + minetest.log("error", "[sethome] Failed to open homes file: " .. err) + minetest.chat_send_player(name, "Could not save to new homes files.") + return false + end + output:write() + io.close(output) + end + end })