diff --git a/init.lua b/init.lua index 17e63fc..b9aa0f7 100644 --- a/init.lua +++ b/init.lua @@ -277,6 +277,7 @@ end local _format_recent_dropbox -- defined later local function show_basic_dialog(itemstack, player) + local player_name = player:get_player_name() local meta = itemstack:get_meta() -- set focus to "close" button to prevent accidental edting local formspec_head = "formspec_version[4]size[14,4]set_focus[close;]" @@ -286,7 +287,7 @@ local function show_basic_dialog(itemstack, player) local field_destination = ("field[4.5,0.6;7,0.8;label;Label;%s]"):format(minetest.formspec_escape(label)) local color = ("%06X"):format(get_compass_meta_color(meta)) local field_color = ("field[11.5,0.6;2.0,0.8;color;Color;%s]"):format(minetest.formspec_escape(color)) - local dropdown_recent = ("dropdown[2.0,1.7;11.5,0.5;recent;%s;1,false]"):format(_format_recent_dropbox()) + local dropdown_recent = ("dropdown[2.0,1.7;11.5,0.5;recent;%s;1,false]"):format(_format_recent_dropbox(player_name)) local formspec = { formspec_head, field_coords, @@ -299,7 +300,6 @@ local function show_basic_dialog(itemstack, player) minetest.show_formspec(player:get_player_name(), "waypoint_compass:basic", table.concat(formspec, "")) - local player_name = player:get_player_name() compass_dialog_context[player_name] = itemstack end @@ -497,25 +497,34 @@ local function make_compass(pos, owner_name, label, color) return itemstack end -waypoint_compass={} - -function waypoint_compass.make_compass(pos,owner_name, label, color) - return make_compass(pos,owner_name, label, color) -end - -------------------------------------------------------------------------------- -- TODO move chat scanner into separate file, make enabling optional -- TODO API to add/rm "sticky" coordinates (that won't be pushed out of the list)? local last_coords_log = {} -local last_coords_log_limit = 10 -- how many to keep +local last_coords_log_limit = 5 -- how many to keep -local function add_coords_log(pos, playername, message) - table.insert(last_coords_log, 1, {pos=pos, playername=playername, message=message}) +-- TODO when should we clear this? Should keep this even if player is +-- left (for some time at least) +-- Stores personal points for players +local last_coords_log_personal = {} + +local function add_coords_log(pos, name, message) + table.insert(last_coords_log, 1, {pos=pos, name=name, message=message}) last_coords_log[last_coords_log_limit] = nil end +local function add_coords_log_personal(playername, pos, name, message) + if not last_coords_log_personal[playername] then + last_coords_log_personal[playername] = {} + end + local personal = last_coords_log_personal[playername] + table.insert(personal, 1, {pos=pos, name=name, message=message}) + personal[last_coords_log_limit] = nil +end + + -- Trying to mach any three integer numbers separated at least by -- spaces or punctuation. --local FUZZY_COORD_PATTERN = ".-(%d+)%D?[%s.,:;]%D?(%d+)%D?[%s.,:;]%D?(%d+)" @@ -533,15 +542,27 @@ local function fuzzy_parse_coords_unsafe(str) end -_format_recent_dropbox = function() +_format_recent_dropbox = function(playername) local out = {} for k,v in ipairs(last_coords_log) do local item = string.format("%d,%d,%d | %s> %s", v.pos.x, v.pos.y, v.pos.z, - v.playername, + v.name, v.message:sub(1,50)) table.insert(out, minetest.formspec_escape(item)) end + + if last_coords_log_personal[playername] then + table.insert(out, '------------------------------ Your personal points: ------------------------------') + for k,v in ipairs(last_coords_log_personal[playername]) do + local item = string.format("%d,%d,%d | %s> %s", + v.pos.x, v.pos.y, v.pos.z, + v.name, + v.message:sub(1,50)) + table.insert(out, minetest.formspec_escape(item)) + end + end + return table.concat(out,",") end @@ -557,3 +578,57 @@ end minetest.register_on_chat_message(scan_chat_for_coords) + +-------------------------------------------------------------------------------- + +waypoint_compass={} + + +function waypoint_compass.make_compass(pos, owner_name, label, color) + return make_compass(pos,owner_name, label, color) +end + + +-- A hook for "fake" global chat messages, that don't trigger the +-- on_chat_message hooks. +function waypoint_compass.process_message(name, message) + name = name or "none" + message = message or "" + scan_chat_for_coords(name, message) +end + + +-- Add a custom point to global list (name/message can be any strings) +-- `pos` is table like {x=1,y=2,z=2} +function waypoint_compass.add_point_to_recent_global(pos, name, message) + local success, ret = pcall(add_coords_log, pos, name, message) + if not success then + minetest.log( + string.format( + "error [MOD] waypoint_compass: Failed add_point_to_recent_global(%s %s %s)", + pos, name, message)) + end + return success +end + + +-- Add a custom point to personal player's list (name/message can be any strings) +-- `pos` is table like {x=1,y=2,z=2} +function waypoint_compass.add_point_to_recent_personal(playername, pos, name, message) + local success, ret = pcall(add_coords_log_personal, playername, pos, name, message) + if not success then + minetest.log( + string.format( + "error [MOD] waypoint_compass: Failed add_point_to_recent_personal(%s %s %s %s)", + playername, pos, name, message)) + end + return success +end + + +-- -- Usage example: +-- waypoint_compass.add_point_to_recent_personal('singleplayer', {x=0,y=1,z=2}, "death", "from lava") + + +return waypoint_compass +