fixes to copying coordinates from chat
This commit is contained in:
parent
6c369e2b6b
commit
fd520efce6
104
init.lua
104
init.lua
@ -509,18 +509,18 @@ local last_coords_log_limit = 5 -- how many to keep
|
|||||||
-- Stores personal points for players
|
-- Stores personal points for players
|
||||||
local last_coords_log_personal = {}
|
local last_coords_log_personal = {}
|
||||||
|
|
||||||
local function add_coords_log(pos, name, message)
|
local function add_coords_log(pos, message)
|
||||||
table.insert(last_coords_log, 1, {pos=pos, name=name, message=message})
|
table.insert(last_coords_log, 1, {pos=pos, message=message, timestamp=os.clock()})
|
||||||
last_coords_log[last_coords_log_limit] = nil
|
last_coords_log[last_coords_log_limit] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function add_coords_log_personal(playername, pos, name, message)
|
local function add_coords_log_personal(playername, pos, message)
|
||||||
if not last_coords_log_personal[playername] then
|
if not last_coords_log_personal[playername] then
|
||||||
last_coords_log_personal[playername] = {}
|
last_coords_log_personal[playername] = {}
|
||||||
end
|
end
|
||||||
local personal = last_coords_log_personal[playername]
|
local personal = last_coords_log_personal[playername]
|
||||||
table.insert(personal, 1, {pos=pos, name=name, message=message})
|
table.insert(personal, 1, {pos=pos, message=message, timestamp=os.clock()})
|
||||||
personal[last_coords_log_limit] = nil
|
personal[last_coords_log_limit] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -528,55 +528,67 @@ end
|
|||||||
-- Trying to mach any three integer numbers separated at least by
|
-- Trying to mach any three integer numbers separated at least by
|
||||||
-- spaces or punctuation.
|
-- spaces or punctuation.
|
||||||
--local FUZZY_COORD_PATTERN = ".-(%d+)%D?[%s.,:;]%D?(%d+)%D?[%s.,:;]%D?(%d+)"
|
--local FUZZY_COORD_PATTERN = ".-(%d+)%D?[%s.,:;]%D?(%d+)%D?[%s.,:;]%D?(%d+)"
|
||||||
local FUZZY_COORD_PATTERN = ".-(%d+)[^.%d]?[%s,:;]%D?(%d+)[^.%d]?[%s,:;]%D?(%d+)"
|
local FUZZY_COORD_PATTERN = "(%-?%d+)[^.%d]?[%s,:;]%D?(%-?%d+)[^.%d]?[%s,:;]%D?(%-?%d+)"
|
||||||
|
|
||||||
|
|
||||||
-- "usafe" means it may throw errors, use pcall()
|
local function fuzzy_parse_coords(str)
|
||||||
local function fuzzy_parse_coords_unsafe(str)
|
|
||||||
-- find any 3 numbers in a string separated by punctuarion/spaces
|
-- find any 3 numbers in a string separated by punctuarion/spaces
|
||||||
local x,y,z = str:match(FUZZY_COORD_PATTERN)
|
local x,y,z = str:match(FUZZY_COORD_PATTERN)
|
||||||
x = clamp(tonumber(x), -32000, 32000)
|
x = tonumber(x)
|
||||||
y = clamp(tonumber(y), -32000, 32000)
|
y = tonumber(y)
|
||||||
z = clamp(tonumber(z), -32000, 32000)
|
z = tonumber(z)
|
||||||
return {x=x,y=y,z=z}
|
if x and y and z then
|
||||||
|
return vector.new(
|
||||||
|
clamp(tonumber(x), -30912, 30927),
|
||||||
|
clamp(tonumber(y), -30912, 30927),
|
||||||
|
clamp(tonumber(z), -30912, 30927)
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
_format_recent_dropbox = function(playername)
|
_format_recent_dropbox = function(playername)
|
||||||
|
local logs = table.copy(last_coords_log)
|
||||||
|
table.insert_all(logs, last_coords_log_personal[playername] or {})
|
||||||
|
table.sort(logs, function(a, b) return a.timestamp > b.timestamp end)
|
||||||
|
|
||||||
local out = {}
|
local out = {}
|
||||||
for k,v in ipairs(last_coords_log) do
|
for _, v in ipairs(logs) do
|
||||||
local item = string.format("%d,%d,%d | %s> %s",
|
local item = string.format("%d,%d,%d | %s",
|
||||||
v.pos.x, v.pos.y, v.pos.z,
|
v.pos.x, v.pos.y, v.pos.z,
|
||||||
v.name,
|
|
||||||
v.message:sub(1,50))
|
v.message:sub(1,50))
|
||||||
table.insert(out, minetest.formspec_escape(item))
|
table.insert(out, minetest.formspec_escape(item))
|
||||||
end
|
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,",")
|
return table.concat(out,",")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function scan_chat_for_coords(name, message)
|
local function scan_chat_for_coords(message)
|
||||||
local success, coords = pcall(fuzzy_parse_coords_unsafe, message)
|
local coords = fuzzy_parse_coords(message)
|
||||||
if success then
|
if coords then
|
||||||
add_coords_log(coords, name, message)
|
add_coords_log(coords, message)
|
||||||
end
|
end
|
||||||
return nil -- do not handle messages, just check them
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local old_chat_send_all = minetest.chat_send_all
|
||||||
|
function minetest.chat_send_all(text)
|
||||||
|
scan_chat_for_coords(text)
|
||||||
|
return old_chat_send_all(text)
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_on_chat_message(scan_chat_for_coords)
|
local function scan_player_chat_for_coords(name, message)
|
||||||
|
local coords = fuzzy_parse_coords(message)
|
||||||
|
if coords then
|
||||||
|
add_coords_log_personal(name, coords, message)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local old_chat_send_player = minetest.chat_send_player
|
||||||
|
function minetest.chat_send_player(name, text)
|
||||||
|
scan_player_chat_for_coords(name, text)
|
||||||
|
return old_chat_send_player(name, text)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -591,22 +603,20 @@ end
|
|||||||
|
|
||||||
-- A hook for "fake" global chat messages, that don't trigger the
|
-- A hook for "fake" global chat messages, that don't trigger the
|
||||||
-- on_chat_message hooks.
|
-- on_chat_message hooks.
|
||||||
function waypoint_compass.process_message(name, message)
|
function waypoint_compass.process_message(message)
|
||||||
name = name or "none"
|
scan_chat_for_coords(message)
|
||||||
message = message or ""
|
|
||||||
scan_chat_for_coords(name, message)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Add a custom point to global list (name/message can be any strings)
|
-- Add a custom point to global list (name/message can be any strings)
|
||||||
-- `pos` is table like {x=1,y=2,z=2}
|
-- `pos` is table like {x=1,y=2,z=2}
|
||||||
function waypoint_compass.add_point_to_recent_global(pos, name, message)
|
function waypoint_compass.add_point_to_recent_global(pos, message)
|
||||||
local success, ret = pcall(add_coords_log, pos, name, message)
|
local success, ret = pcall(add_coords_log, pos, message)
|
||||||
if not success then
|
if not success then
|
||||||
minetest.log(
|
minetest.log(
|
||||||
string.format(
|
string.format(
|
||||||
"error [MOD] waypoint_compass: Failed add_point_to_recent_global(%s %s %s)",
|
"error [MOD] waypoint_compass: Failed add_point_to_recent_global(%s %s %s)",
|
||||||
pos, name, message))
|
pos, message))
|
||||||
end
|
end
|
||||||
return success
|
return success
|
||||||
end
|
end
|
||||||
@ -614,30 +624,20 @@ end
|
|||||||
|
|
||||||
-- Add a custom point to personal player's list (name/message can be any strings)
|
-- 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}
|
-- `pos` is table like {x=1,y=2,z=2}
|
||||||
function waypoint_compass.add_point_to_recent_personal(playername, pos, name, message)
|
function waypoint_compass.add_point_to_recent_personal(playername, pos, message)
|
||||||
local success, ret = pcall(add_coords_log_personal, playername, pos, name, message)
|
local success, ret = pcall(add_coords_log_personal, playername, pos, message)
|
||||||
if not success then
|
if not success then
|
||||||
minetest.log(
|
minetest.log(
|
||||||
string.format(
|
string.format(
|
||||||
"error [MOD] waypoint_compass: Failed add_point_to_recent_personal(%s %s %s %s)",
|
"error [MOD] waypoint_compass: Failed add_point_to_recent_personal(%s %s %s %s)",
|
||||||
playername, pos, name, message))
|
playername, pos, message))
|
||||||
end
|
end
|
||||||
return success
|
return success
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- -- Usage example:
|
-- -- Usage example:
|
||||||
-- waypoint_compass.add_point_to_recent_personal('singleplayer', {x=0,y=1,z=2}, "death", "from lava")
|
-- waypoint_compass.add_point_to_recent_personal('singleplayer', {x=0,y=1,z=2}, "death from lava")
|
||||||
|
|
||||||
if waypoint_announce and waypoint_announce.post_announcement_hooks then
|
|
||||||
local _announcement_callback = function(announcer_name, message, pointed_pos)
|
|
||||||
waypoint_compass.add_point_to_recent_global(pointed_pos, announcer_name, message)
|
|
||||||
end
|
|
||||||
|
|
||||||
local hooks = waypoint_announce.post_announcement_hooks
|
|
||||||
hooks["waypoint_compass"] = _announcement_callback
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
return waypoint_compass
|
return waypoint_compass
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user