mirror of
https://github.com/LeMagnesium/minetest-mod-metatools.git
synced 2025-01-04 21:40:20 +01:00
Add user alerts and check on node digging
- Bump to version 1.2.2 - Add `metatools.alert_users` which sends the string passed as argument to all players currently operating on nodes - Register a dignode callback in which we alert users about players trying to dig operated nodes, or open nodes in general. Only node operated by a person different from the person digging are blocked - Add `metatools.get_context_from_pos`. It receives a table, but does no assertions (yet?) - Move `playerlocks` over to `metatools.playerlocks` for similar reasons to why we moved `nodelock` - Create field `success` for meta_exec, a function run when the command is successful; it receives the executed function's parameters and its output (status, msg) as arguments - Update /meta help's message - Fix instances of `contexts` not replaced by `metatools.contexts` - Assert that the context id is correct upon running `metatools.show`
This commit is contained in:
parent
73c80b1201
commit
c875a96af7
@ -2,7 +2,7 @@ Minetest mod metatools
|
|||||||
######################
|
######################
|
||||||
|
|
||||||
A mod inspired by mgl512's itemframe issue
|
A mod inspired by mgl512's itemframe issue
|
||||||
Version : 1.2.1
|
Version : 1.2.2
|
||||||
|
|
||||||
# Authors
|
# Authors
|
||||||
- LeMagnesium / Mg / ElectronLibre : Source code writer
|
- LeMagnesium / Mg / ElectronLibre : Source code writer
|
||||||
|
@ -5,7 +5,7 @@ function assert_contextid(ctid)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function assert_ownership(ctid, name)
|
function assert_ownership(ctid, name)
|
||||||
return playerlocks[name] == ctid
|
return metatools.playerlocks[name] == ctid
|
||||||
end
|
end
|
||||||
|
|
||||||
function assert_pos(pos)
|
function assert_pos(pos)
|
||||||
|
101
init.lua
101
init.lua
@ -8,14 +8,14 @@
|
|||||||
-- - Lymkwi/LeMagnesium
|
-- - Lymkwi/LeMagnesium
|
||||||
-- - Paly2
|
-- - Paly2
|
||||||
--
|
--
|
||||||
-- Version: 1.2.1
|
-- Version: 1.2.2
|
||||||
--
|
--
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
metatools = {} -- Public namespace
|
metatools = {} -- Public namespace
|
||||||
metatools.contexts = {}
|
metatools.contexts = {}
|
||||||
local playerlocks = {} -- Selection locks of the players
|
metatools.playerlocks = {} -- Selection locks of the players
|
||||||
local version = "1.2.1"
|
local version = "1.2.2"
|
||||||
local nodelock = {}
|
local nodelock = {}
|
||||||
|
|
||||||
local modpath = minetest.get_modpath("metatools")
|
local modpath = minetest.get_modpath("metatools")
|
||||||
@ -40,9 +40,45 @@ minetest.register_craftitem("metatools:stick",{
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Useful callbacks
|
||||||
|
minetest.register_on_dignode(function(pos, node, digger)
|
||||||
|
local spos = minetest.pos_to_string(pos)
|
||||||
|
local ctxid = metatools.get_context_from_pos(pos)
|
||||||
|
if ctxid then
|
||||||
|
if not metatools.get_context_owner(ctxid) then
|
||||||
|
metatools.alert_users("Node at " .. spos .. " dug by " .. (digger:get_player_name() or " a drone ") .. " : context " .. ctxid .. " closed")
|
||||||
|
metatools.close_node(ctxid)
|
||||||
|
else
|
||||||
|
local owner = metatools.get_context_owner(ctxid)
|
||||||
|
if owner == digger:get_player_name() then
|
||||||
|
metatools.alert_users(owner .. " dug themselves out of node at " .. spos .. " : context " .. ctxid .. "closed")
|
||||||
|
metatools.close_node(ctxid)
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(digger:get_player_name() or "", "- meta - You are not allowed to dig the present node at " .. spos .. " : someone is operating on it")
|
||||||
|
minetest.chat_send_player(metatools.get_context_owner(ctxid), "- meta - " .. digger:get_player_name() .. " tried to dig the node you are operating on")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
-- Functions
|
-- Functions
|
||||||
function metatools.get_version() return version end
|
function metatools.get_version() return version end
|
||||||
|
|
||||||
|
function metatools.get_context_from_pos(pos)
|
||||||
|
for id, ctx in pairs(metatools.contexts) do
|
||||||
|
if minetest.pos_to_string(ctx.position) == minetest.pos_to_string(pos) then
|
||||||
|
return id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function metatools.alert_users(msg)
|
||||||
|
for name, _ in pairs(metatools.playerlocks) do
|
||||||
|
minetest.chat_send_player(name, ("- meta::alert - ALERT: %s"):format(msg))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function metatools.build_param_str(table, index, separator)
|
function metatools.build_param_str(table, index, separator)
|
||||||
local str = table[index]
|
local str = table[index]
|
||||||
for newindex = 1, #table-index do
|
for newindex = 1, #table-index do
|
||||||
@ -52,16 +88,16 @@ function metatools.build_param_str(table, index, separator)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function metatools.get_player_selection(name)
|
function metatools.get_player_selection(name)
|
||||||
return playerlocks[name]
|
return metatools.playerlocks[name]
|
||||||
end
|
end
|
||||||
|
|
||||||
function metatools.player_select(name, ctxid)
|
function metatools.player_select(name, ctxid)
|
||||||
playerlocks[name] = ctxid
|
metatools.playerlocks[name] = ctxid
|
||||||
return true, ("context %d selected"):format(ctxid)
|
return true, ("context %d selected"):format(ctxid)
|
||||||
end
|
end
|
||||||
|
|
||||||
function metatools.player_unselect(name)
|
function metatools.player_unselect(name)
|
||||||
playerlocks[name] = nil
|
metatools.playerlocks[name] = nil
|
||||||
return true, "context unselected"
|
return true, "context unselected"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -77,7 +113,7 @@ function metatools.switch(contextid)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function metatools.get_context_owner(ctxid)
|
function metatools.get_context_owner(ctxid)
|
||||||
for name, id in pairs(playerlocks) do
|
for name, id in pairs(metatools.playerlocks) do
|
||||||
if id == ctxid then
|
if id == ctxid then
|
||||||
return name
|
return name
|
||||||
end
|
end
|
||||||
@ -168,7 +204,7 @@ function meta_exec(struct)
|
|||||||
return false, ("- %s - Failure : Node already owned"):format(struct.scope)
|
return false, ("- %s - Failure : Node already owned"):format(struct.scope)
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif category == "some_ownership" and (not req or not playerlocks[req]) then
|
elseif category == "some_ownership" and (not req or not metatools.playerlocks[req]) then
|
||||||
return false, ("- %s - Failure : No context owned at the moment"):format(struct.scope)
|
return false, ("- %s - Failure : No context owned at the moment"):format(struct.scope)
|
||||||
|
|
||||||
elseif category == "specific_open_mode" then
|
elseif category == "specific_open_mode" then
|
||||||
@ -189,6 +225,9 @@ function meta_exec(struct)
|
|||||||
|
|
||||||
local ret, msg = struct.func(unpack(struct.params))
|
local ret, msg = struct.func(unpack(struct.params))
|
||||||
if ret then
|
if ret then
|
||||||
|
if struct.success then
|
||||||
|
struct.success(struct.params, {ret, msg})
|
||||||
|
end
|
||||||
return true, ("- %s - Success : %s"):format(struct.scope, msg)
|
return true, ("- %s - Success : %s"):format(struct.scope, msg)
|
||||||
else
|
else
|
||||||
return false, ("- %s - Failure : %s"):format(struct.scope, msg)
|
return false, ("- %s - Failure : %s"):format(struct.scope, msg)
|
||||||
@ -197,7 +236,7 @@ end
|
|||||||
|
|
||||||
function metatools.contexts_summary()
|
function metatools.contexts_summary()
|
||||||
local ctxs = {}
|
local ctxs = {}
|
||||||
for ctxid, ctx in pairs(contexts) do
|
for ctxid, ctx in pairs(metatools.contexts) do
|
||||||
table.insert(ctxs, 1, {
|
table.insert(ctxs, 1, {
|
||||||
id = ctxid,
|
id = ctxid,
|
||||||
pos = ctx.position,
|
pos = ctx.position,
|
||||||
@ -211,7 +250,7 @@ end
|
|||||||
function metatools.open_node(pos, mode, owner)
|
function metatools.open_node(pos, mode, owner)
|
||||||
local id = assign_context(pos, mode)
|
local id = assign_context(pos, mode)
|
||||||
if owner then
|
if owner then
|
||||||
playerlocks[owner] = id
|
metatools.playerlocks[owner] = id
|
||||||
end
|
end
|
||||||
return true, "opened node " .. minetest.get_node(pos).name .. " at " .. minetest.pos_to_string(pos) .. " in context ID " .. id
|
return true, "opened node " .. minetest.get_node(pos).name .. " at " .. minetest.pos_to_string(pos) .. " in context ID " .. id
|
||||||
end
|
end
|
||||||
@ -222,6 +261,9 @@ function metatools.close_node(contextid)--, closer)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function metatools.show(contextid)
|
function metatools.show(contextid)
|
||||||
|
if not assert_contextid(contextid) then
|
||||||
|
return false, "invalid or missing context id"
|
||||||
|
end
|
||||||
local ctx = metatools.contexts[contextid]
|
local ctx = metatools.contexts[contextid]
|
||||||
local metabase = minetest.get_meta(ctx.position):to_table()[ctx.mode]
|
local metabase = minetest.get_meta(ctx.position):to_table()[ctx.mode]
|
||||||
if assert_specific_mode(contextid, "inventory") and ctx.list ~= "" then
|
if assert_specific_mode(contextid, "inventory") and ctx.list ~= "" then
|
||||||
@ -316,7 +358,7 @@ function metatools.purge(contextid)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function metatools.prune()
|
function metatools.prune()
|
||||||
for id, ctx in pairs(contexts) do
|
for id, ctx in pairs(metatools.contexts) do
|
||||||
if not metatools.get_context_owner(id) then
|
if not metatools.get_context_owner(id) then
|
||||||
metatools.close_node(id)
|
metatools.close_node(id)
|
||||||
end
|
end
|
||||||
@ -471,7 +513,9 @@ minetest.register_chatcommand("meta", {
|
|||||||
"- meta::help - /meta version : Prints out the version\n" ..
|
"- meta::help - /meta version : Prints out the version\n" ..
|
||||||
"- meta::help - /meta help : This very command\n" ..
|
"- meta::help - /meta help : This very command\n" ..
|
||||||
"- meta::help - /meta open <(x,y,z) [mode] : Open not at (x,y,z) with mode 'mode' (either 'fields' or 'inventory'; default is 'fields')\n" ..
|
"- meta::help - /meta open <(x,y,z) [mode] : Open not at (x,y,z) with mode 'mode' (either 'fields' or 'inventory'; default is 'fields')\n" ..
|
||||||
"- meta::help - /meta select <contextid> : Select the node with context <contextid> for operations\n"..
|
"- meta::help - /meta select <contextid> : Select the node with context <contextid> for operations\n" ..
|
||||||
|
"- meta::help - /meta unselect : Unselect the context you are currently in\n" ..
|
||||||
|
"- meta::help - /meta contexts : Show all open contexts with id, operator, position and open mode\n" ..
|
||||||
"- meta::help - /meta switch : Switch open mode in the current context\n" ..
|
"- meta::help - /meta switch : Switch open mode in the current context\n" ..
|
||||||
"- meta::help - /meta close : Close the currently selected node\n" ..
|
"- meta::help - /meta close : Close the currently selected node\n" ..
|
||||||
"- meta::help - /meta prune : Close all currently unoperated nodes\n" ..
|
"- meta::help - /meta prune : Close all currently unoperated nodes\n" ..
|
||||||
@ -514,7 +558,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
required = {
|
required = {
|
||||||
mode = params[3],
|
mode = params[3],
|
||||||
no_nodelock = params[2],
|
no_nodelock = params[2],
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " opened node at " .. minetest.pos_to_string(fparams[1]))
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta close
|
-- meta close
|
||||||
@ -529,7 +576,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
contextid = metatools.get_player_selection(name),
|
contextid = metatools.get_player_selection(name),
|
||||||
name = name
|
name = name
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " closed node of id " .. fparams[1])
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta select <contextid>
|
-- meta select <contextid>
|
||||||
@ -540,7 +590,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
params = {name, tonumber(params[2])},
|
params = {name, tonumber(params[2])},
|
||||||
required = {
|
required = {
|
||||||
no_ownership = tonumber(params[2]),
|
no_ownership = tonumber(params[2]),
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " selected context of id " .. fparams[1])
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta unselect
|
-- meta unselect
|
||||||
@ -551,7 +604,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
params = {name},
|
params = {name},
|
||||||
required = {
|
required = {
|
||||||
some_ownership = name,
|
some_ownership = name,
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " unselected their context")
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta prune
|
-- meta prune
|
||||||
@ -560,6 +616,9 @@ minetest.register_chatcommand("meta", {
|
|||||||
scope = "meta::prune",
|
scope = "meta::prune",
|
||||||
func = metatools.prune,
|
func = metatools.prune,
|
||||||
params = {},
|
params = {},
|
||||||
|
success = function()
|
||||||
|
metatools.alert_users(name .. " is pruning contexts!")
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta switch
|
-- meta switch
|
||||||
@ -570,7 +629,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
params = {metatools.get_player_selection(name)},
|
params = {metatools.get_player_selection(name)},
|
||||||
required = {
|
required = {
|
||||||
some_ownership = name,
|
some_ownership = name,
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " switched context (ID=" .. fparams[1] .. ")'s open mode")
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta show
|
-- meta show
|
||||||
@ -649,7 +711,10 @@ minetest.register_chatcommand("meta", {
|
|||||||
params = {metatools.get_player_selection(name)},
|
params = {metatools.get_player_selection(name)},
|
||||||
required = {
|
required = {
|
||||||
some_ownership = name,
|
some_ownership = name,
|
||||||
}
|
},
|
||||||
|
success = function(fparams)
|
||||||
|
metatools.alert_users(name .. " purged context " .. fparams[1])
|
||||||
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
-- meta list...
|
-- meta list...
|
||||||
|
Loading…
Reference in New Issue
Block a user