Add support for areas hud and toggle settings
commit
59d811e8b6
|
@ -0,0 +1 @@
|
||||||
|
*.swp
|
|
@ -0,0 +1,28 @@
|
||||||
|
# PvP Areas
|
||||||
|
|
||||||
|
Sets an area for PvP control.
|
||||||
|
|
||||||
|
Use safemode to make areas be safe zones; otherwise they are killzones by default.
|
||||||
|
|
||||||
|
## Config
|
||||||
|
|
||||||
|
* `pvp_areas.safemode`
|
||||||
|
* safemode = true --> PvP Control areas are safe zones
|
||||||
|
* default is `false`, making PvP Control areas kill zones
|
||||||
|
|
||||||
|
* `pvp_areas.label`
|
||||||
|
* if ShadowNinja's `areas` mod is also present with HUD registration feature, this label will be displayed anywhere
|
||||||
|
a PvP Control area has been set.
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
* `/pvp_areas`
|
||||||
|
* without arguments lists areas, if any.
|
||||||
|
* `/pvp_areas pos1`
|
||||||
|
* selects the players current position as the area minimum.
|
||||||
|
* `/pvp_areas pos2`
|
||||||
|
* selects the players current position as the area maximum.
|
||||||
|
* `/pvp_areas set`
|
||||||
|
* adds an entry using pos1 and pos2 values.
|
||||||
|
* `/pvp_areas remove n`
|
||||||
|
* removes an area entry.
|
110
init.lua
110
init.lua
|
@ -1,11 +1,46 @@
|
||||||
-- pvp_areas
|
-- pvp_areas
|
||||||
-- Copyright 2016 James Stevenson (everamzah)
|
-- Original : Copyright 2016 James Stevenson (everamzah)
|
||||||
|
-- Additional : Copyright Tai Kedzierski (DuCake)
|
||||||
-- LGPL v2.1+
|
-- LGPL v2.1+
|
||||||
|
|
||||||
|
local pvp_areas_worlddir = minetest.get_worldpath()
|
||||||
|
local pvp_areas_modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local hasareasmod = minetest.get_modpath("areas")
|
||||||
|
|
||||||
|
local safemode = minetest.setting_getbool("pvp_areas.safemode") or false
|
||||||
|
local area_label = minetest.setting_get("pvp_areas.label") or "Defined area."
|
||||||
|
|
||||||
local pvp_areas = {}
|
|
||||||
local pvp_areas_store = AreaStore()
|
local pvp_areas_store = AreaStore()
|
||||||
pvp_areas_store:from_file(minetest.get_worldpath() .. "/pvp_areas_store.dat")
|
pvp_areas_store:from_file(pvp_areas_worlddir .. "/pvp_areas_store.dat")
|
||||||
|
|
||||||
|
local pvp_default = minetest.is_yes(minetest.setting_getbool("pvp_areas_enable_pvp"))
|
||||||
|
minetest.log("action", "[" .. pvp_areas_modname .. "] PvP by Default: " .. tostring(pvp_default))
|
||||||
|
|
||||||
|
local pvp_areas_players = {}
|
||||||
|
local pvp_areas = {}
|
||||||
|
|
||||||
|
local function update_pvp_areas()
|
||||||
|
local counter = 0
|
||||||
|
pvp_areas = {}
|
||||||
|
while pvp_areas_store:get_area(counter) do
|
||||||
|
table.insert(pvp_areas, pvp_areas_store:get_area(counter))
|
||||||
|
counter = counter + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
update_pvp_areas()
|
||||||
|
|
||||||
|
local function save_pvp_areas()
|
||||||
|
pvp_areas_store:to_file(pvp_areas_worlddir .. "/pvp_areas_store.dat")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function areas_entity(pos,num)
|
||||||
|
if hasareasmod then
|
||||||
|
local obj = minetest.add_entity(pos, "areas:pos"..tostring(num))
|
||||||
|
local ent = obj:get_luaentity()
|
||||||
|
ent.active = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Register privilege and chat command.
|
-- Register privilege and chat command.
|
||||||
minetest.register_privilege("pvp_areas_admin", "Can set and remove PvP areas.")
|
minetest.register_privilege("pvp_areas_admin", "Can set and remove PvP areas.")
|
||||||
|
@ -17,33 +52,56 @@ minetest.register_chatcommand("pvp_areas", {
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local pos = vector.round(minetest.get_player_by_name(name):getpos())
|
local pos = vector.round(minetest.get_player_by_name(name):getpos())
|
||||||
if param == "pos1" then
|
if param == "pos1" then
|
||||||
if not pvp_areas[name] then
|
if not pvp_areas_players[name] then
|
||||||
pvp_areas[name] = {pos1 = pos}
|
pvp_areas_players[name] = {pos1 = pos}
|
||||||
else
|
else
|
||||||
pvp_areas[name].pos1 = pos
|
pvp_areas_players[name].pos1 = pos
|
||||||
end
|
end
|
||||||
minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(pos))
|
minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(pos))
|
||||||
elseif param == "pos2" then
|
elseif param == "pos2" then
|
||||||
if not pvp_areas[name] then
|
if not pvp_areas_players[name] then
|
||||||
pvp_areas[name] = {pos2 = pos}
|
pvp_areas_players[name] = {pos2 = pos}
|
||||||
else
|
else
|
||||||
pvp_areas[name].pos2 = pos
|
pvp_areas_players[name].pos2 = pos
|
||||||
end
|
end
|
||||||
minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(pos))
|
minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(pos))
|
||||||
elseif param == "set" then
|
elseif param == "set" then
|
||||||
if not pvp_areas[name] or not pvp_areas[name].pos1 then
|
if not pvp_areas_players[name] or not pvp_areas_players[name].pos1 then
|
||||||
minetest.chat_send_player(name, "Position 1 missing, use \"/pvp_areas pos1\" to set.")
|
minetest.chat_send_player(name, "Position 1 missing, use \"/pvp_areas pos1\" to set.")
|
||||||
elseif not pvp_areas[name].pos2 then
|
elseif not pvp_areas_players[name].pos2 then
|
||||||
minetest.chat_send_player(name, "Position 2 missing, use \"/pvp_areas pos2\" to set.")
|
minetest.chat_send_player(name, "Position 2 missing, use \"/pvp_areas pos2\" to set.")
|
||||||
else
|
else
|
||||||
minetest.chat_send_player(name, "Setting.")
|
pvp_areas_store:insert_area(pvp_areas_players[name].pos1, pvp_areas_players[name].pos2, "pvp_areas", #pvp_areas)
|
||||||
pvp_areas_store:insert_area(pvp_areas[name].pos1, pvp_areas[name].pos2, "pvp_areas")
|
table.insert(pvp_areas, pvp_areas_store:get_area(#pvp_areas))
|
||||||
pvp_areas_store:to_file(minetest.get_worldpath() .. "/pvp_areas_store.dat")
|
update_pvp_areas()
|
||||||
|
save_pvp_areas()
|
||||||
|
pvp_areas_players[name] = nil
|
||||||
|
minetest.chat_send_player(name, "Area set.")
|
||||||
end
|
end
|
||||||
elseif param == "remove" then
|
elseif param:sub(1, 6) == "remove" then
|
||||||
minetest.chat_send_player(name, "Removing.")
|
local n = tonumber(param:sub(8, -1))
|
||||||
else
|
if n and pvp_areas_store:get_area(n) then
|
||||||
|
pvp_areas_store:remove_area(n)
|
||||||
|
if pvp_areas_store:get_area(n + 1) then
|
||||||
|
-- Insert last entry in new empty (removed) slot.
|
||||||
|
local a = pvp_areas_store:get_area(#pvp_areas - 1)
|
||||||
|
pvp_areas_store:remove_area(#pvp_areas - 1)
|
||||||
|
pvp_areas_store:insert_area(a.min, a.max, "pvp_areas", n)
|
||||||
|
end
|
||||||
|
update_pvp_areas()
|
||||||
|
save_pvp_areas()
|
||||||
|
minetest.chat_send_player(name, "Removed " .. tostring(n))
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(name, "Invalid argument. You must enter a valid area identifier.")
|
||||||
|
end
|
||||||
|
elseif param ~= "" then
|
||||||
minetest.chat_send_player(name, "Invalid usage. Type \"/help pvp_areas\" for more information.")
|
minetest.chat_send_player(name, "Invalid usage. Type \"/help pvp_areas\" for more information.")
|
||||||
|
else
|
||||||
|
for k, v in pairs(pvp_areas) do
|
||||||
|
minetest.chat_send_player(name, k - 1 .. ": " ..
|
||||||
|
minetest.pos_to_string(v.min) .. " " ..
|
||||||
|
minetest.pos_to_string(v.max))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -51,6 +109,14 @@ minetest.register_chatcommand("pvp_areas", {
|
||||||
local KILL_NO = true
|
local KILL_NO = true
|
||||||
local KILL_OK = false
|
local KILL_OK = false
|
||||||
|
|
||||||
|
local AREA_ACTIVATE = KILL_OK
|
||||||
|
local AREA_NOACTIVATE = KILL_NO
|
||||||
|
|
||||||
|
if safemode then
|
||||||
|
AREA_ACTIVATE = KILL_NO
|
||||||
|
AREA_NOACTIVATE = KILL_OK
|
||||||
|
end
|
||||||
|
|
||||||
-- Register punchplayer callback.
|
-- Register punchplayer callback.
|
||||||
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
||||||
for k, v in pairs(pvp_areas_store:get_areas_for_pos(player:getpos())) do
|
for k, v in pairs(pvp_areas_store:get_areas_for_pos(player:getpos())) do
|
||||||
|
@ -61,15 +127,15 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
|
||||||
return KILL_OK
|
return KILL_OK
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if areas then
|
if hasareasmod then
|
||||||
if areas.registerHudHandler then
|
if areas.registerHudHandler then
|
||||||
|
|
||||||
local function advertise_nokillzone(pos, list)
|
local function advertise_nokillzone(pos, list)
|
||||||
for k, v in pairs(pvp_areas_store:get_areas_for_pos(player:getpos())) do
|
for k, v in pairs(pvp_areas_store:get_areas_for_pos(pos)) do
|
||||||
if k then
|
if k then
|
||||||
list:insert( {
|
table.insert(list, {
|
||||||
id = "pvp_areas:"..tostring(k),
|
id = "PvP Control Area "..tostring(k),
|
||||||
name = k,
|
name = area_label,
|
||||||
} )
|
} )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Allow PvP by default.
|
||||||
|
pvp_areas_enable_pvp (PvP by Default) bool false
|
Loading…
Reference in New Issue