add an API to push recent locations from code
This commit is contained in:
parent
1193508202
commit
73bb4a1eab
101
init.lua
101
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue