place_to = {x = under.x, y = under.y, z = under.z}
end
+ if minetest.is_protected(place_to, placer:get_player_name()) then
+ minetest.log("action", placer:get_player_name()
+ .. " tried to place " .. def.name
+ .. " at protected position "
+ .. minetest.pos_to_string(place_to))
+ minetest.record_protection_violation(place_to, placer:get_player_name())
+ return itemstack
+ end
+
minetest.log("action", placer:get_player_name() .. " places node "
.. def.name .. " at " .. minetest.pos_to_string(place_to))
return
end
+ if minetest.is_protected(pos, digger:get_player_name()) then
+ minetest.log("action", digger:get_player_name()
+ .. " tried to dig " .. node.name
+ .. " at protected position "
+ .. minetest.pos_to_string(pos))
+ minetest.record_protection_violation(pos, digger:get_player_name())
+ return
+ end
+
minetest.log('action', digger:get_player_name() .. " digs "
.. node.name .. " at " .. minetest.pos_to_string(pos))
return minetest.string_to_pos(value)
end
+-- To be overriden by protection mods
+function minetest.is_protected(pos, name)
+ return false
+end
+
+function minetest.record_protection_violation(pos, name)
+ for _, func in pairs(minetest.registered_on_protection_violation) do
+ func(pos, name)
+ end
+end
+
minetest.registered_on_cheats, minetest.register_on_cheat = make_registration()
minetest.registered_on_crafts, minetest.register_on_craft = make_registration()
minetest.registered_craft_predicts, minetest.register_craft_predict = make_registration()
+minetest.registered_on_protection_violation, minetest.register_on_protection_violation = make_registration()
minetest.register_craft_predict(func(itemstack, player, old_craft_grid, craft_inv))
^ The same as before, except that it is called before the player crafts, to make
^ craft prediction, and it should not change anything.
+minetest.register_on_protection_violation(func(pos, name))
+^ Called by builtin and mods when a player violates protection at a position
+ (eg, digs a node or punches a protected entity).
+^ The registered functions can be called using minetest.record_protection_violation
+^ The provided function should check that the position is protected by the mod
+ calling this function before it prints a message, if it does, to allow for
+ multiple protection mods.
Other registration functions:
minetest.register_chatcommand(cmd, chatcommand definition)
^ Example: deserialize('return { ["foo"] = "bar" }') -> {foo='bar'}
^ Example: deserialize('print("foo")') -> nil (function call fails)
^ error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)
+minetest.is_protected(pos, name) -> bool
+^ This function should be overriden by protection mods and should be used to
+ check if a player can interact at a position.
+^ This function should call the old version of itself if the position is not
+ protected by the mod.
+^ Example:
+ local old_is_protected = minetest.is_protected
+ function minetest.is_protected(pos, name)
+ if mymod:position_protected_from(pos, name) then
+ return true
+ end
+ return old_is_protected(pos, name)
+ end
+minetest.record_protection_violation(pos, name)
+^ This function calls functions registered with
+ minetest.register_on_protection_violation.
Global objects:
minetest.env - EnvRef of the server environment and world.