Page 1 of 1

[Mod] PvP Areas [pvp_areas]

PostPosted: Wed Sep 07, 2016 18:56
by everamzah
Description: Mark areas for PvP, but disallow elsewhere by default. The inversion of this can be achieved by setting Settings -> Mods -> pvp_areas -> PvP by Default.
Usage: /pvp_areas pos1 and /pvp_areas pos2, following by /pvp_areas set. /pvp_areas without argument lists areas. /pvp_areas remove n removes that entry.
Requires: 403dada (Sep. 9 2016) or later.

Areas are stored in the world path as "pvp_areas_store.dat".

This mod is a reply to viewtopic.php?f=10&t=15479

Git repository:
License: LGPL v2.1+

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Thu Sep 08, 2016 10:25
by taikedz
I added some things and sent a PR

When testing I found that I could not inflict damage either inside or outside the area... though looking at protector mod's code, it should indeed work.... will look further into that later....

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Thu Sep 08, 2016 12:06
by taikedz
Some additional changes have been made and my dev branch seems funcitonal..... beta tests to now be done ;-)

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Thu Sep 08, 2016 12:16
by everamzah
taikedz dev branch is here:

I haven't made any changes to my version yet, still waiting to see if I can get the total number of entries in an AreaStore without tracking it separately. get_area(n), where n does not exist, crashes Minetest without error:

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Fri Sep 09, 2016 13:17
by everamzah
Some preliminary management of the areas has been implemented. You may now /pvp_area remove n, where n is some AreaStore id number. For now, you'll have to count from 0 using the output of /pvp_areas with no arguments (sent to console). /pvp_areas now lists areas to chat, when issued without argument.

This update requires a change to the engine, for which there is a PR:
Update: This change was merged. 403dada or later is required.

Also, PvP is now on off by default, and disallowed in set areas only. This can be toggled by going to Settings -> Mods -> pvp_areas and setting `PvP by Default' to false true, or by setting pvp_areas_enable_pvp = false true in minetest.conf.

Edit: I should probably invert that default so the name of the mod makes sense.
Edit: Done.

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Wed Nov 09, 2016 16:24
by Fixer

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Tue Jan 09, 2018 12:00
by Downad
i found an error in the init.lua file.
Code: Select all
local safemode = minetest.setting_getbool("pvp_areas.safemode") or false

does not work - the error i found is in the minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) -
the return value is the final KILL_NO or KILL_OK i changed this.

a second thing i found - mos does no damage so i check if the hitter is a player or a mob
here is my code
Code: Select all
-- pvp_areas
-- Original   : Copyright 2016 James Stevenson (everamzah)
-- Additional : Copyright Tai Kedzierski (DuCake)
-- 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_store = AreaStore()
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

local function save_pvp_areas()
   pvp_areas_store:to_file(pvp_areas_worlddir .. "/pvp_areas_store.dat")

local function areas_entity(pos,num)
   if hasareasmod then
      local obj = minetest.add_entity(pos, "areas:pos"..tostring(num))
      local ent = obj:get_luaentity() = true

-- Register privilege and chat command.
minetest.register_privilege("pvp_areas_admin", "Can set and remove PvP areas.")

minetest.register_chatcommand("pvp_areas", {
   description = "Mark and set areas for PvP.",
   params = "<pos1> <pos2> <set> <remove>",
   privs = "pvp_areas_admin",
   func = function(name, param)
      local pos = vector.round(minetest.get_player_by_name(name):getpos())
      if param == "pos1" then
         if not pvp_areas_players[name] then
            pvp_areas_players[name] = {pos1 = pos}
            pvp_areas_players[name].pos1 = pos
         minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(pos))
      elseif param == "pos2" then
         if not pvp_areas_players[name] then
            pvp_areas_players[name] = {pos2 = pos}
            pvp_areas_players[name].pos2 = pos
         minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(pos))
      elseif param == "set" 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.")
         elseif not pvp_areas_players[name].pos2 then
            minetest.chat_send_player(name, "Position 2 missing, use \"/pvp_areas pos2\" to set.")
            pvp_areas_store:insert_area(pvp_areas_players[name].pos1, pvp_areas_players[name].pos2, "pvp_areas", #pvp_areas)
            table.insert(pvp_areas, pvp_areas_store:get_area(#pvp_areas))
            pvp_areas_players[name] = nil
            minetest.chat_send_player(name, "Area set.")
      elseif param:sub(1, 6) == "remove" then
         local n = tonumber(param:sub(8, -1))
         if n and pvp_areas_store:get_area(n) then
            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)
            minetest.chat_send_player(name, "Removed " .. tostring(n))
            minetest.chat_send_player(name, "Invalid argument.  You must enter a valid area identifier.")
      elseif param ~= "" then
         minetest.chat_send_player(name, "Invalid usage.  Type \"/help pvp_areas\" for more information.")
         for k, v in pairs(pvp_areas) do
            minetest.chat_send_player(name, k - 1 .. ": " ..
                  minetest.pos_to_string(v.min) .. " " ..

local KILL_NO = true
local KILL_OK = false


local savemodeToString = "FALSCH" -- only for debugging
if safemode then
   savemodeToString = "WAHR"

-- Register punchplayer callback.
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
   local isPlayer = hitter:is_player()
   local IsPlayerToString = "PLAYER"   -- only for debugging
   if isplayer then
      IsPlayerToString = "PLAYER"         -- only for debugging
      IsPlayerToString = "MOB"            -- only for debugging
      return false -- if this is a MOB then give Damage
   local playername = player:get_player_name()
   for k, v in pairs(pvp_areas_store:get_areas_for_pos(player:getpos())) do
      if k then
         --minetest.chat_send_player(playername, "in loop - safemode"..savemodeToString.." isPlayer "..IsPlayerToString)
         return AREA_ACTIVATE --KILL_NO
   --minetest.chat_send_player(playername, "after - safemode"..savemodeToString.." isPlayer "..IsPlayerToString)

if hasareasmod then
   if areas.registerHudHandler then

      local function advertise_nokillzone(pos, list)
         for k, v in pairs(pvp_areas_store:get_areas_for_pos(pos)) do
            if k then
               table.insert(list, {
                  id = "PvP Control Area "..tostring(k),
                  name = area_label,
               } )

      minetest.log("info","Your version of `areas` does not support registering hud handlers.")

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Tue Jan 09, 2018 15:51
by taikedz
I added fix for the setting erroneously assigned

For the extra code, can you make a pull request on github, or send URL to your own git repository ? If not able, I'll have a look over it when I get a moment

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Tue Jan 09, 2018 20:02
by Downad
now my code is on my github

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Wed Jan 10, 2018 14:18
by taikedz
Hi Downad,

Thanks for proposing changes, always good!

The proper way to submit a change through Github (both parties using Github) is to "fork" the original, then copy your changed files in, and then make a pull request - makes communication easier.

I've put your changes in to a separate branch, unfortunately they're too inconsistent for me to pull them into master, see review

As you can see, I'm essentially communicating with myself on this pull request. Ideally you would make the pull request from your fork of the same repo and we could engage in the discussion more appropriately there.

Re: [Mod] PvP Areas [pvp_areas]

PostPosted: Thu Dec 19, 2019 08:22
by amadin
I would like to set the area of pvp for only the Y axis, for use with Huge caves at deep depth and some mods: Nether [nether], Underground Realms [0.8] [caverealms], Hallelujah Mountains [cloudlands] etc.