add an API to push recent locations from code

This commit is contained in:
whosit 2023-05-14 16:39:35 +03:00
parent 1193508202
commit 73bb4a1eab
1 changed files with 88 additions and 13 deletions

101
init.lua
View File

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