Improve SSCSM communication and /mrkr there
This commit is contained in:
parent
69b7857466
commit
42c3b25ec9
13
README.md
13
README.md
|
@ -8,14 +8,21 @@ Unlike the [CSM], this mod is standalone, and conflicts with the marker mod.
|
|||
|
||||
`advmarkers` introduces the following chatcommands:
|
||||
|
||||
- `/mrkr`: Opens a formspec allowing you to display or delete markers. If you give this command a parameter (`h`/`here`, `t`/`there` or co-ordinates), it will set your HUD position to those co-ordinates.
|
||||
- `/add_mrkr`: Adds markers. You can use `.add_mrkr x,y,z Marker name` to add markers. Adding a marker with (exactly) the same name as another will overwrite the original marker. If you replace `x,y,z` with `here`, the marker will be set to your current position, and replacing it with `there` will set the marker to the last `.coords` position.
|
||||
- `/wp`, `/mrkr`: Opens a formspec allowing you to display or delete waypoints. If you give this command a parameter (`h`/`here`, `t`/`there` or co-ordinates), it will set your HUD position to those co-ordinates.
|
||||
- `/add_wp`, `/add_mrkr`: Adds markers. You can use `.add_mrkr x,y,z Marker name` to add markers. Adding a marker with (exactly) the same name as another will overwrite the original marker.
|
||||
- `/mrkr_export`: Exports your markers to an advmarkers string. Remember to not modify the text before copying it. You can use `/mrkr_export old` if you want an export string compatible with older versions of the advmarkers CSM (it should start with `M` instead of `J`). This old format does **not** work with this mod, so only use it if you know what you are doing!
|
||||
- `/mrkr_import`: Imports your markers from an advmarkers string (`.mrkr_import <advmarkers string>`). Any markers with the same name will not be overwritten, and if they do not have the same co-ordinates, `_` will be appended to the imported one.
|
||||
- `/mrkrthere`: Alias for `/mrkr there`.
|
||||
|
||||
If you die, a marker is automatically added at your death position, and will
|
||||
update the last `.coords` position.
|
||||
update the "there" position.
|
||||
|
||||
### "Here" and "there" positions
|
||||
|
||||
Both /wp and /add_wp accept "here"/"h" and "there"/"t" in place of
|
||||
co-ordinates. Using "here" will set the waypoint to your current position, and
|
||||
"there" will set it to the most recent co-ordinates that appear in chat (or
|
||||
your last death position).
|
||||
|
||||
## Chat channels integration
|
||||
|
||||
|
|
59
init.lua
59
init.lua
|
@ -14,6 +14,8 @@ local hud = {}
|
|||
local use_sscsm = false
|
||||
advmarkers.last_coords = {}
|
||||
|
||||
local abs, type = math.abs, type
|
||||
|
||||
-- Convert positions to/from strings
|
||||
local function pos_to_string(pos)
|
||||
if type(pos) == 'table' then
|
||||
|
@ -28,7 +30,8 @@ local function string_to_pos(pos)
|
|||
if type(pos) == 'string' then
|
||||
pos = minetest.string_to_pos(pos)
|
||||
end
|
||||
if type(pos) == 'table' then
|
||||
if type(pos) == 'table' and abs(pos.x) < 31000 and abs(pos.y) < 31000 and
|
||||
abs(pos.z) < 31000 then
|
||||
return vector.round(pos)
|
||||
end
|
||||
end
|
||||
|
@ -288,7 +291,7 @@ function advmarkers.get_chatcommand_pos(player, pos)
|
|||
pos = player:get_pos()
|
||||
elseif pos == 't' or pos == 'there' then
|
||||
if not advmarkers.last_coords[pname] then
|
||||
return false, 'No-one has used ".coords" and you have not died!'
|
||||
return false, 'No "there" position found!'
|
||||
end
|
||||
pos = advmarkers.last_coords[pname]
|
||||
else
|
||||
|
@ -498,25 +501,19 @@ minetest.register_chatcommand('mrkr_import', {
|
|||
|
||||
register_chatcommand_alias('mrkr_import', 'wp_import', 'waypoint_import')
|
||||
|
||||
-- Chat channels .coords integration.
|
||||
-- You do not need to have chat channels installed for this to work.
|
||||
local function get_coords(msg, strict)
|
||||
local str = 'Current Position: %-?[0-9]+, %-?[0-9]+, %-?[0-9]+%.'
|
||||
if strict then
|
||||
str = '^' .. str
|
||||
-- Find co-ordinates sent in chat messages
|
||||
local function get_coords(msg)
|
||||
if msg:byte(1) == 1 or #msg > 1000 then return end
|
||||
local pos = msg:match('%-?[0-9%.]+, *%-?[0-9%.]+, *%-?[0-9%.]+')
|
||||
if pos then
|
||||
return string_to_pos(pos)
|
||||
end
|
||||
local s, e = msg:find(str)
|
||||
local pos = false
|
||||
if s and e then
|
||||
pos = string_to_pos(msg:sub(s + 18, e - 1))
|
||||
end
|
||||
return pos
|
||||
end
|
||||
|
||||
-- Get global co-ords
|
||||
table.insert(minetest.registered_on_chat_messages, 1, function(_, msg)
|
||||
if msg:sub(1, 1) == '/' then return end
|
||||
local pos = get_coords(msg, true)
|
||||
local pos = get_coords(msg)
|
||||
if pos then
|
||||
advmarkers.last_coords = {}
|
||||
for _, player in ipairs(get_connected_players()) do
|
||||
|
@ -590,31 +587,27 @@ sscsm.register({
|
|||
})
|
||||
|
||||
-- SSCSM communication
|
||||
-- TODO: Make this use a table (or multiple channels).
|
||||
sscsm.register_on_com_receive('advmarkers:cmd', function(name, param)
|
||||
if type(param) ~= 'string' then
|
||||
return
|
||||
sscsm.register_on_com_receive('advmarkers:delete', function(name, param)
|
||||
if type(param) == 'string' then
|
||||
advmarkers.delete_waypoint(name, param)
|
||||
end
|
||||
end)
|
||||
|
||||
local cmd = param:sub(1, 1)
|
||||
if cmd == 'D' then
|
||||
-- D: Delete
|
||||
advmarkers.delete_waypoint(name, param:sub(2))
|
||||
elseif cmd == 'S' then
|
||||
-- S: Set
|
||||
local s, e = param:find(' ', nil, true)
|
||||
if s and e then
|
||||
local pos = string_to_pos(param:sub(2, s - 1))
|
||||
sscsm.register_on_com_receive('advmarkers:set', function(name, param)
|
||||
if type(param) == 'table' and type(param.name) == 'string' and
|
||||
type(param.pos) == 'string' then
|
||||
local pos = string_to_pos(param.pos)
|
||||
if pos then
|
||||
advmarkers.set_waypoint(name, pos, param:sub(e + 1))
|
||||
advmarkers.set_waypoint(name, pos, param.name)
|
||||
end
|
||||
end
|
||||
elseif cmd == '0' then
|
||||
-- 0: Display
|
||||
if not advmarkers.display_waypoint(name, param:sub(2)) then
|
||||
end)
|
||||
|
||||
sscsm.register_on_com_receive('advmarkers:display', function(name, param)
|
||||
if type(param) ~= 'string' or
|
||||
not advmarkers.display_waypoint(name, param) then
|
||||
minetest.chat_send_player(name, 'Error displaying waypoint!')
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Send waypoint list once SSCSMs are loaded.
|
||||
|
|
16
sscsm.lua
16
sscsm.lua
|
@ -21,16 +21,10 @@ local function string_to_pos(pos)
|
|||
end
|
||||
end
|
||||
|
||||
-- Run remote command
|
||||
-- TODO: Use separate SSCSM com channels
|
||||
local function run_remote_command(cmd, param)
|
||||
sscsm.com_send('advmarkers:cmd', cmd .. (param or ''))
|
||||
end
|
||||
|
||||
-- Display a waypoint
|
||||
function advmarkers.display_waypoint(name)
|
||||
if data[name] then
|
||||
run_remote_command('0', name)
|
||||
sscsm.com_send('advmarkers:display', name)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
|
@ -46,7 +40,7 @@ advmarkers.get_marker = advmarkers.get_waypoint
|
|||
function advmarkers.delete_waypoint(name)
|
||||
if data[name] ~= nil then
|
||||
data[name] = nil
|
||||
run_remote_command('D', name)
|
||||
sscsm.com_send('advmarkers:delete', name)
|
||||
end
|
||||
end
|
||||
advmarkers.delete_marker = advmarkers.delete_waypoint
|
||||
|
@ -57,8 +51,10 @@ function advmarkers.set_waypoint(pos, name)
|
|||
if not pos then return end
|
||||
name = tostring(name)
|
||||
data[name] = pos
|
||||
run_remote_command('S', minetest.pos_to_string(pos):gsub(' ', '') ..
|
||||
' ' .. name)
|
||||
sscsm.com_send('advmarkers:set', {
|
||||
name = name,
|
||||
pos = minetest.pos_to_string(pos),
|
||||
})
|
||||
return true
|
||||
end
|
||||
advmarkers.set_marker = advmarkers.set_waypoint
|
||||
|
|
Loading…
Reference in New Issue