From 527812fa96b6c73c71c7a3bf8a48cb651ec90438 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 6 Jul 2014 17:39:20 -0400 Subject: [PATCH] Make waypoints optional and use external datastorage mod This also fixes waypoints not showing up on join. --- datastorage.lua | 83 ------------------ depends.txt | 2 + init.lua | 6 +- waypoints.lua | 224 ++++++++++++++++++++++++++---------------------- 4 files changed, 126 insertions(+), 189 deletions(-) delete mode 100644 datastorage.lua diff --git a/datastorage.lua b/datastorage.lua deleted file mode 100644 index 096e35e..0000000 --- a/datastorage.lua +++ /dev/null @@ -1,83 +0,0 @@ -datastorage={} -datastorage["!registered_players"]={} - -datastorage.save_data = function(table_pointer) - local data = minetest.serialize( datastorage[table_pointer] ) - local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data" - local file = io.open( path, "w" ) - if( file ) then - file:write( data ) - file:close() - return true - else return nil - end -end - -datastorage.load_data = function(table_pointer) - local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data" - local file = io.open( path, "r" ) - if( file ) then - local data = file:read("*all") - datastorage[table_pointer] = minetest.deserialize( data ) - file:close() - return true - else return nil - end -end - -datastorage.get_container = function (player, key) - local player_name = player:get_player_name() - local container = datastorage[player_name] - if container[key] == nil then - container[key] = {} - end - datastorage.save_data(player_name) - return container[key] -end - --- forced save of all player's data -datastorage.save_container = function (player) - local player_name = player:get_player_name() - datastorage.save_data(player_name) -end - - --- Init -if datastorage.load_data("!registered_players") == nil then - datastorage["!registered_players"]={} - datastorage.save_data("!registered_players") -end - -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - local registered = nil - for __,tab in ipairs(datastorage["!registered_players"]) do - if tab["player_name"] == player_name then registered = true break end - end - if registered == nil then - local new={} - new["player_name"]=player_name - table.insert(datastorage["!registered_players"],new) - datastorage[player_name]={} - datastorage.save_data("!registered_players") - datastorage.save_data(player_name) - else - datastorage.load_data(player_name) - end -end -) - -minetest.register_on_leaveplayer(function(player) - local player_name = player:get_player_name() - datastorage.save_data(player_name) - datastorage[player_name] = nil -end -) - -minetest.register_on_shutdown(function() - for __,tab in ipairs(datastorage["!registered_players"]) do - if datastorage[tab["player_name"]] == nil then break end - datastorage.save_data(tab["player_name"]) - end -end -) diff --git a/depends.txt b/depends.txt index 9e4d23a..a1ea556 100644 --- a/depends.txt +++ b/depends.txt @@ -1,2 +1,4 @@ creative? intllib? +datastorage? + diff --git a/init.lua b/init.lua index 0542e36..e1d2c02 100644 --- a/init.lua +++ b/init.lua @@ -38,7 +38,6 @@ if creative_inventory then end end -dofile(modpath.."/datastorage.lua") dofile(modpath.."/group.lua") dofile(modpath.."/api.lua") dofile(modpath.."/internal.lua") @@ -46,4 +45,7 @@ dofile(modpath.."/callbacks.lua") dofile(modpath.."/register.lua") dofile(modpath.."/bags.lua") dofile(modpath.."/item_names.lua") -dofile(modpath.."/waypoints.lua") +if minetest.get_modpath("datastorage") then + dofile(modpath.."/waypoints.lua") +end + diff --git a/waypoints.lua b/waypoints.lua index e991a5d..062814d 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -5,88 +5,105 @@ else S = function(s) return s end end -unified_inventory.hud_colors = { - {"#FFFFFF", 0xFFFFFF, S("White")}, - {"#DBBB00", 0xf1d32c, S("Yellow")}, - {"#DD0000", 0xDD0000, S("Red")}, - {"#2cf136", 0x2cf136, S("Green")}, - {"#2c4df1", 0x2c4df1, S("Blue")}, - } -unified_inventory.hud_colors_max = #unified_inventory.hud_colors - +local hud_colors = { + {"#FFFFFF", 0xFFFFFF, S("White")}, + {"#DBBB00", 0xf1d32c, S("Yellow")}, + {"#DD0000", 0xDD0000, S("Red")}, + {"#2cf136", 0x2cf136, S("Green")}, + {"#2c4df1", 0x2c4df1, S("Blue")}, +} + +local hud_colors_max = #hud_colors + +-- Stores temporary player data (persists until player leaves) +local waypoints_temp = {} + unified_inventory.register_page("waypoints", { get_formspec = function(player) - local waypoints = datastorage.get_container (player, "waypoints") + local player_name = player:get_player_name() + local waypoints = datastorage.get(player_name, "waypoints") local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" .. "image[0,0;1,1;ui_waypoints_icon.png]" .. - "label[1,0;" .. S("Waypoints") .. "]" + "label[1,0;" .. S("Waypoints") .. "]" -- Tabs buttons: - local i for i = 1, 5, 1 do formspec = formspec .. "image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" .. (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. "ui_" .. i .. "_icon.png;" .. "select_waypoint" .. i .. ";]" .. - "tooltip[select_waypoint" .. i .. ";" .. minetest.formspec_escape(S("Select Waypoint #%d"):format(i)).."]" + "tooltip[select_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Select Waypoint #%d"):format(i)).."]" end - - i = waypoints.selected - + + local i = waypoints.selected or 1 + local waypoint = waypoints[i] or {} + local temp = waypoints_temp[player_name][i] or {} + local default_name = "Waypoint "..i + -- Main buttons: - formspec = formspec .. + formspec = formspec .. "image_button[4.5,3.7;.8,.8;".. "ui_waypoint_set_icon.png;".. "set_waypoint"..i..";]".. - "tooltip[set_waypoint" .. i .. ";" .. minetest.formspec_escape(S("Set waypoint to current location")).."]" + "tooltip[set_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Set waypoint to current location")).."]" formspec = formspec .. "image_button[5.2,3.7;.8,.8;".. - (waypoints[i].active and "ui_on_icon.png" or "ui_off_icon.png")..";".. + (waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";".. "toggle_waypoint"..i..";]".. - "tooltip[toggle_waypoint" .. i .. ";" .. minetest.formspec_escape(S("Make waypoint "..(waypoints[i].active and "invisible" or "visible"))).."]" + "tooltip[toggle_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Make waypoint " + ..(waypoint.active and "invisible" or "visible"))).."]" - formspec = formspec .. + formspec = formspec .. "image_button[5.9,3.7;.8,.8;".. - (waypoints[i].display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. + (waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. "toggle_display_pos" .. i .. ";]".. - "tooltip[toggle_display_pos" .. i .. ";" .. minetest.formspec_escape(S((waypoints[i].display_pos and "Disable" or "Enable").." display of waypoint coordinates")).."]" + "tooltip[toggle_display_pos" .. i .. ";" + .. minetest.formspec_escape(S((waypoint.display_pos and "Disable" or "Enable") + .." display of waypoint coordinates")).."]" formspec = formspec .. "image_button[6.6,3.7;.8,.8;".. "ui_circular_arrows_icon.png;".. "toggle_color"..i..";]".. - "tooltip[toggle_color" .. i .. ";" .. minetest.formspec_escape(S("Change color of waypoint display")).."]" + "tooltip[toggle_color" .. i .. ";" + .. minetest.formspec_escape(S("Change color of waypoint display")).."]" formspec = formspec .. "image_button[7.3,3.7;.8,.8;".. "ui_pencil_icon.png;".. "rename_waypoint"..i..";]".. - "tooltip[rename_waypoint" .. i .. ";" .. minetest.formspec_escape(S("Edit waypoint name")).."]" - - -- Waypoint's info: - if waypoints[i].active then + "tooltip[rename_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Edit waypoint name")).."]" + + -- Waypoint's info: + if waypoint.active then formspec = formspec .. "label[1,0.8;"..S("Waypoint active").."]" - else + else formspec = formspec .. "label[1,0.8;"..S("Waypoint inactive").."]" end - if waypoints[i].edit then + if temp.edit then formspec = formspec .. - "field[1.3,3.2;6,.8;rename_box" .. i .. ";;"..waypoints[i].name.."]" .. + "field[1.3,3.2;6,.8;rename_box" .. i .. ";;" + ..(waypoint.name or default_name).."]" .. "image_button[7.3,2.9;.8,.8;".. "ui_ok_icon.png;".. "confirm_rename"..i.. ";]".. - "tooltip[confirm_rename" .. i .. ";" .. minetest.formspec_escape(S("Finish editing")).."]" + "tooltip[confirm_rename" .. i .. ";" + .. minetest.formspec_escape(S("Finish editing")).."]" end - - formspec = formspec .. "label[1,1.3;"..S("World position")..": " .. - minetest.pos_to_string(waypoints[i].world_pos) .. "]" .. - "label[1,1.8;"..S("Name")..": ".. waypoints[i].name .. "]" .. + + formspec = formspec .. "label[1,1.3;"..S("World position")..": " .. + minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" .. + "label[1,1.8;"..S("Name")..": ".. (waypoint.name or default_name) .. "]" .. "label[1,2.3;"..S("HUD text color")..": " .. - unified_inventory.hud_colors[waypoints[i].color][3] .. "]" - + hud_colors[waypoint.color or 1][3] .. "]" + return {formspec=formspec} end, }) @@ -97,133 +114,132 @@ unified_inventory.register_button("waypoints", { tooltip = S("Waypoints"), }) -unified_inventory.update_hud = function (player, waypoint) +local function update_hud(player, waypoints, temp, i) + local waypoint = waypoints[i] + if not waypoint then return end + temp[i] = temp[i] or {} + temp = temp[i] + local pos = waypoint.world_pos or vector.new() local name if waypoint.display_pos then - name = "(".. - waypoint.world_pos.x .. "," .. - waypoint.world_pos.y .. "," .. - waypoint.world_pos.z .. ")" - if waypoint.name ~= "" then - name = name .. ", " .. - waypoint.name + name = minetest.pos_to_string(pos) + if waypoint.name then + name = name..", "..waypoint.name end else - name = waypoint.name + name = waypoint.name or "Waypoint "..i end - if waypoint.hud then - player:hud_remove(waypoint.hud) + if temp.hud then + player:hud_remove(temp.hud) end if waypoint.active then - waypoint.hud = player:hud_add({ + temp.hud = player:hud_add({ hud_elem_type = "waypoint", - number = unified_inventory.hud_colors[waypoint.color][2] , + number = hud_colors[waypoint.color or 1][2] , name = name, text = "m", - world_pos = waypoint.world_pos + world_pos = pos }) - else - waypoint.hud = nil + else + temp.hud = nil end end minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "" then - return - end + if formname ~= "" then return end + local player_name = player:get_player_name() local update_formspec = false - local update_hud = false - - local waypoints = datastorage.get_container (player, "waypoints") - for i = 1, 5, 1 do + local need_update_hud = false + local hit = false + local waypoints = datastorage.get(player_name, "waypoints") + local temp = waypoints_temp[player_name] + for i = 1, 5, 1 do if fields["select_waypoint"..i] then + hit = true waypoints.selected = i update_formspec = true end if fields["toggle_waypoint"..i] then + hit = true + waypoints[i] = waypoints[i] or {} waypoints[i].active = not (waypoints[i].active) - update_hud = true + need_update_hud = true update_formspec = true end - + if fields["set_waypoint"..i] then + hit = true local pos = player:getpos() pos.x = math.floor(pos.x) pos.y = math.floor(pos.y) pos.z = math.floor(pos.z) + waypoints[i] = waypoints[i] or {} waypoints[i].world_pos = pos - update_hud = true + need_update_hud = true update_formspec = true end - + if fields["rename_waypoint"..i] then - waypoints[i].edit = true + hit = true + waypoints[i] = waypoints[i] or {} + temp[i].edit = true update_formspec = true end if fields["toggle_display_pos"..i] then + hit = true + waypoints[i] = waypoints[i] or {} waypoints[i].display_pos = not waypoints[i].display_pos - update_hud = true + need_update_hud = true update_formspec = true end if fields["toggle_color"..i] then - local color = waypoints[i].color + hit = true + waypoints[i] = waypoints[i] or {} + local color = waypoints[i].color or 1 color = color + 1 - if color > unified_inventory.hud_colors_max then + if color > hud_colors_max then color = 1 end waypoints[i].color = color - update_hud = true + need_update_hud = true update_formspec = true end if fields["confirm_rename"..i] then - waypoints[i].edit = false - waypoints[i].name = fields["rename_box"..i] - update_hud = true + hit = true + waypoints[i] = waypoints[i] or {} + temp[i].edit = false + waypoints[i].name = fields["rename_box"..i] + need_update_hud = true update_formspec = true end - - if update_hud then - unified_inventory.update_hud (player, waypoints[i]) + if need_update_hud then + update_hud(player, waypoints, temp, i) end - if update_formspec then unified_inventory.set_inventory_formspec(player, "waypoints") end - + if hit then return end end end) -minetest.register_on_joinplayer(function(player) - local waypoints = datastorage.get_container (player, "waypoints") - local need_save = false - -- Create new waypoints data - for i = 1, 5, 1 do - if waypoints[i] == nil then - need_save = true - waypoints[i] = { - edit = false, - active = false, - display_pos = true, - color = 1, - name = "Waypoint ".. i, - world_pos = {x = 0, y = 0, z = 0}, - } - end - end - if need_save then datastorage.save_container (player) end - -- Initialize waypoints - minetest.after(0.5, function() - waypoints.selected = 1 - for i = 1, 5, 1 do - waypoints[i].edit = false - unified_inventory.update_hud (player, waypoints[i]) - end - end) +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local waypoints = datastorage.get(player_name, "waypoints") + local temp = {} + waypoints_temp[player_name] = temp + for i = 1, 5 do + update_hud(player, waypoints, temp, i) + end end) + +minetest.register_on_leaveplayer(function(player) + waypoints_temp[player:get_player_name()] = nil +end) +