147 lines
4.3 KiB
Lua
147 lines
4.3 KiB
Lua
|
|
|
|
-- Copyright (C) 2021 Sandro Del Toro De Ana
|
|
-- Copyright (C) 2022 PICCORO Lenz McKAY
|
|
|
|
-- This file is part of antimod minenux Minetest Mod.
|
|
|
|
-- Load support for MT game translation.
|
|
-- Check for translation method
|
|
local S
|
|
if minetest.get_translator ~= nil then
|
|
S = minetest.get_translator(core.get_current_modname()) -- 5.x translation function
|
|
else
|
|
if minetest.get_modpath("intllib") then
|
|
dofile(minetest.get_modpath("intllib") .. "/init.lua")
|
|
if intllib.make_gettext_pair then
|
|
gettext, ngettext = intllib.make_gettext_pair() -- new gettext method
|
|
else
|
|
gettext = intllib.Getter() -- old text file method
|
|
end
|
|
S = gettext
|
|
else -- boilerplate function
|
|
S = function(str, ...)
|
|
local args = {...}
|
|
return str:gsub("@%d+", function(match)
|
|
return args[tonumber(match:sub(2))]
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
|
|
local kill_hitter = core.settings:get_bool("antipvp_kill_hitter") or false
|
|
|
|
local admin_privs = core.settings:get_bool("antipvp_admin_privs") or true
|
|
|
|
local send_notify = core.settings:get_bool("antipvp_send_notify") or true
|
|
|
|
local send_to_all = core.settings:get_bool("antipvp_send_to_all") or false
|
|
|
|
local area_ratio = tonumber(minetest.setting_get("antipvp_area_ratio") or 3)
|
|
|
|
if kill_hitter == nil then kill_hitter = false end
|
|
if admin_privs == nil then admin_privs = true end
|
|
if send_notify == nil then send_notify = true end
|
|
if send_to_all == nil then send_to_all = false end
|
|
if area_ratio == nil then area_ratio = 3 end
|
|
|
|
-- compat with irc mod fork
|
|
if core.get_modpath("irc") then
|
|
if irc.saysec == nil then
|
|
irc.saysec = irc.say
|
|
end
|
|
end
|
|
|
|
local privs_give_to_admin = false
|
|
|
|
if admin_privs then privs_give_to_admin = true end
|
|
|
|
-- priv
|
|
core.register_privilege("antipvp", {
|
|
description = S("Invulnerable in PVP"),
|
|
give_to_singleplayer = false,
|
|
give_to_admin = privs_give_to_admin,
|
|
})
|
|
|
|
-- block
|
|
core.register_node("antipvp:quiet", {
|
|
description = "Anti PVP place",
|
|
tiles = {"default_obsidian.png^[colorize:white:36^heart.png"},
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
is_ground_content = false,
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
groups = {choppy=3, level=3}
|
|
})
|
|
|
|
-- craft
|
|
minetest.register_craft({
|
|
output = "antipvp:quiet",
|
|
recipe = {
|
|
{ "default:obsidianbrick", "default:goldblock", "default:obsidianbrick" },
|
|
{ "default:goldblock", "flowers:rose", "default:goldblock" },
|
|
{ "default:obsidianbrick", "default:goldblock", "default:obsidianbrick" },
|
|
}
|
|
})
|
|
|
|
-- action
|
|
core.register_on_punchplayer(
|
|
function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
|
|
|
-- only in pvp
|
|
if not hitter:is_player() or not player:is_player() then
|
|
return
|
|
end
|
|
|
|
local player_name = player:get_player_name()
|
|
local hitter_name = hitter:get_player_name()
|
|
local player_invul = core.check_player_privs(player_name, {antipvp=true})
|
|
local hitter_invul = core.check_player_privs(hitter_name, {antipvp=true})
|
|
local player_ppos = player:getpos()
|
|
|
|
-- first we check if player its invulnerable
|
|
if player_invul then
|
|
if kill_hitter and not hitter_invul then
|
|
hitter:set_hp(0)
|
|
end
|
|
|
|
if send_notify then
|
|
core.chat_send_player(hitter_name, S("You can not hurt a God") )
|
|
core.chat_send_player(player_name, S("@1 try hurt you", hitter_name) )
|
|
if core.get_modpath("irc") then
|
|
if send_to_all then
|
|
irc.saysec(hitter_name.." try hurt to "..player_name)
|
|
else
|
|
irc.saysec(player_name, hitter_name.." try hurt you")
|
|
end
|
|
end
|
|
end
|
|
minetest.log("action","[antipvp] "..hitter_name.." try hurt to "..player_name)
|
|
return true
|
|
end
|
|
|
|
if not player_ppos then
|
|
return false
|
|
end
|
|
-- not a invulnerable player.. then check if are over protected place
|
|
if core.find_node_near(player_ppos, area_ratio, "antipvp:quiet") then
|
|
if send_notify then
|
|
core.chat_send_player(hitter_name, "is at a peaceful area... ")
|
|
if core.get_modpath("irc") then
|
|
if send_to_all then
|
|
irc.saysec(hitter_name.." try hurt on of the peacefull areas")
|
|
else
|
|
irc.saysec(hitter_name, "Dont try hurt the peacefull area")
|
|
end
|
|
end
|
|
end
|
|
minetest.log("action","[antipvp] "..hitter_name.." try hurt to "..player_name)
|
|
return true
|
|
end
|
|
|
|
end
|
|
)
|
|
|
|
print("[MOD] antipvp loaded")
|