2018-03-16 22:59:55 +00:00
|
|
|
----------- SET POINT
|
|
|
|
|
|
|
|
setpoint = {}
|
|
|
|
|
|
|
|
local point_file = minetest.get_worldpath() .. "/point"
|
|
|
|
local pointpos = {}
|
|
|
|
|
|
|
|
local function load_point()
|
|
|
|
local input = io.open(point_file, "r")
|
|
|
|
if not input then
|
|
|
|
return -- no longer an error
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Iterate over all stored positions in the format "x y z player" for each line
|
|
|
|
for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do
|
|
|
|
pointpos[name] = minetest.string_to_pos(pos)
|
|
|
|
end
|
|
|
|
input:close()
|
|
|
|
end
|
|
|
|
|
|
|
|
load_point()
|
|
|
|
|
|
|
|
setpoint.set = function(name, pos)
|
|
|
|
local player = minetest.get_player_by_name(name)
|
|
|
|
if not player or not pos then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local data = {}
|
|
|
|
local output, err = io.open(point_file, "w")
|
|
|
|
if output then
|
|
|
|
pointpos[name] = pos
|
|
|
|
for i, v in pairs(pointpos) do
|
|
|
|
table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i))
|
|
|
|
end
|
|
|
|
output:write(table.concat(data))
|
|
|
|
io.close(output)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
minetest.log("action", "Unable to write to player homes file: " .. err)
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
setpoint.get = function(name)
|
|
|
|
local pos = pointpos[name]
|
|
|
|
if pos then
|
|
|
|
return vector.new(pos)
|
|
|
|
else
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
setpoint.go = function(name)
|
|
|
|
local player = minetest.get_player_by_name(name)
|
|
|
|
if player and pointpos[name] then
|
|
|
|
player:setpos(pointpos[name])
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_privilege("home", {
|
|
|
|
description = "Can use /setpoint and /point",
|
|
|
|
give_to_singleplayer = false
|
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_chatcommand("point", {
|
|
|
|
description = "Teleport you to your second_home point",
|
|
|
|
privs = {home = true},
|
|
|
|
func = function(name)
|
|
|
|
if not mana.checkmana(name, 0.8) then return end
|
|
|
|
|
|
|
|
if setpoint.go(name) then
|
|
|
|
return true, "Teleported to point!"
|
|
|
|
end
|
|
|
|
return false, "Set a point using /setpoint"
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_chatcommand("setpoint", {
|
|
|
|
description = "Set your point",
|
|
|
|
privs = {home = true},
|
|
|
|
func = function(name)
|
|
|
|
name = name or "" -- fallback to blank name if nil
|
|
|
|
local player = minetest.get_player_by_name(name)
|
|
|
|
if player and setpoint.set(name, player:getpos()) then
|
|
|
|
return true, "Point set!"
|
|
|
|
end
|
|
|
|
return false, "Player not found!"
|
|
|
|
end,
|
|
|
|
})
|
2018-03-16 23:00:10 +00:00
|
|
|
|
|
|
|
------------- NO KILL
|
|
|
|
|
|
|
|
-- Prevent certain players from killing / PvP
|
|
|
|
|
|
|
|
minetest.register_privilege("nokill", "Per-player hit prevention")
|
|
|
|
|
|
|
|
-- The admin always has all privileges, including the hit prevention
|
|
|
|
-- so we track the admin as a special case
|
|
|
|
local ADMIN = minetest.setting_get("name")
|
|
|
|
|
|
|
|
local ALLOWPUNCH = false
|
|
|
|
local DENYPUNCH = true
|
|
|
|
|
|
|
|
minetest.register_on_punchplayer(function(target, hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
|
|
|
if not hitter:is_player() then
|
|
|
|
return ALLOWPUNCH
|
|
|
|
end
|
|
|
|
|
|
|
|
local hittername = hitter:get_player_name()
|
|
|
|
|
|
|
|
local preventkill = minetest.check_player_privs(hitter:get_player_name(), {nokill=true})
|
|
|
|
local isplayer = target:is_player()
|
|
|
|
|
|
|
|
return isplayer and preventkill and hittername ~= ADMIN
|
|
|
|
end)
|
|
|
|
|
|
|
|
--[[ Truth study
|
|
|
|
|
|
|
|
PLAYER NOKILL-on DENY
|
|
|
|
true true true
|
|
|
|
false true false
|
|
|
|
true false false
|
|
|
|
false false false
|
|
|
|
|
|
|
|
Operation: AND
|
|
|
|
--]]
|
|
|
|
|
2018-03-16 23:02:10 +00:00
|
|
|
-- Enable Sneak glitch
|
|
|
|
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
|
|
local override_table = player:get_physics_override()
|
|
|
|
override_table.sneak_glitch = true
|
|
|
|
player:set_physics_override(override_table)
|
|
|
|
end)
|
2018-03-16 23:02:29 +00:00
|
|
|
|
|
|
|
--------------- SPAWN COMMAND
|
|
|
|
|
|
|
|
spawn_command = {}
|
|
|
|
spawn_command.pos = {x=0, y=3, z=0}
|
|
|
|
|
|
|
|
if minetest.setting_get_pos("static_spawnpoint") then
|
|
|
|
spawn_command.pos = minetest.setting_get_pos("static_spawnpoint")
|
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_chatcommand("spawn", {
|
|
|
|
description = "Teleport you to spawn point.",
|
|
|
|
func = function(name)
|
|
|
|
if not mana.checkmana(name, 0.7) then return end
|
|
|
|
|
|
|
|
local player = minetest.get_player_by_name(name)
|
|
|
|
if player == nil then
|
|
|
|
-- just a check to prevent the server crashing
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
local pos = player:getpos()
|
|
|
|
if pos.x>-20 and pos.x<20 and pos.y>-20 and pos.z>-20 and pos.z<20 then return
|
|
|
|
else
|
|
|
|
player:setpos(spawn_command.pos)
|
|
|
|
minetest.chat_send_player(name, "Teleported to spawn!")
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
|