From 8594d78bdd83ca0039f2526f0e73223d0ad7738a Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Wed, 7 Sep 2016 14:52:03 -0400 Subject: Initial commit. --- init.lua | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 init.lua (limited to 'init.lua') diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..0a461f3 --- /dev/null +++ b/init.lua @@ -0,0 +1,59 @@ +-- pvp_areas +-- Copyright 2016 James Stevenson (everamzah) +-- LGPL v2.1+ + + +local pvp_areas = {} +local pvp_areas_store = AreaStore() +pvp_areas_store:from_file(minetest.get_worldpath() .. "/pvp_areas_store.dat") + +-- 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 = " ", + 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[name] then + pvp_areas[name] = {pos1 = pos} + else + pvp_areas[name].pos1 = pos + end + minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(pos)) + elseif param == "pos2" then + if not pvp_areas[name] then + pvp_areas[name] = {pos2 = pos} + else + pvp_areas[name].pos2 = pos + end + minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(pos)) + elseif param == "set" then + if not pvp_areas[name] or not pvp_areas[name].pos1 then + minetest.chat_send_player(name, "Position 1 missing, use \"/pvp_areas pos1\" to set.") + elseif not pvp_areas[name].pos2 then + minetest.chat_send_player(name, "Position 2 missing, use \"/pvp_areas pos2\" to set.") + else + minetest.chat_send_player(name, "Setting.") + pvp_areas_store:insert_area(pvp_areas[name].pos1, pvp_areas[name].pos2, "pvp_areas") + pvp_areas_store:to_file(minetest.get_worldpath() .. "/pvp_areas_store.dat") + end + elseif param == "remove" then + minetest.chat_send_player(name, "Removing.") + else + minetest.chat_send_player(name, "Invalid usage. Type \"/help pvp_areas\" for more information.") + end + end +}) + +-- Register punchplayer callback. +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 + if k then + return false + end + end + return true +end) -- cgit v1.2.3 From 2d68136604d6e78ea7d0ecf6fc2418a1d281a332 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Thu, 8 Sep 2016 07:52:59 -0400 Subject: Some management of AreaStore. Preliminary. --- init.lua | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 82 insertions(+), 18 deletions(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 0a461f3..3859448 100644 --- a/init.lua +++ b/init.lua @@ -2,10 +2,35 @@ -- Copyright 2016 James Stevenson (everamzah) -- LGPL v2.1+ +local pvp_areas_worlddir = minetest.get_worldpath() +local pvp_areas_modname = minetest.get_current_modname() -local pvp_areas = {} 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.setting_getbool("pvp_areas_enable_pvp") +if pvp_default == nil then + pvp_default = true +end +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 + -- Register privilege and chat command. minetest.register_privilege("pvp_areas_admin", "Can set and remove PvP areas.") @@ -17,43 +42,82 @@ minetest.register_chatcommand("pvp_areas", { func = function(name, param) local pos = vector.round(minetest.get_player_by_name(name):getpos()) if param == "pos1" then - if not pvp_areas[name] then - pvp_areas[name] = {pos1 = pos} + if not pvp_areas_players[name] then + pvp_areas_players[name] = {pos1 = pos} else - pvp_areas[name].pos1 = pos + pvp_areas_players[name].pos1 = pos end minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(pos)) elseif param == "pos2" then - if not pvp_areas[name] then - pvp_areas[name] = {pos2 = pos} + if not pvp_areas_players[name] then + pvp_areas_players[name] = {pos2 = pos} else - pvp_areas[name].pos2 = pos + pvp_areas_players[name].pos2 = pos end minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(pos)) 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.") - 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.") else - minetest.chat_send_player(name, "Setting.") - pvp_areas_store:insert_area(pvp_areas[name].pos1, pvp_areas[name].pos2, "pvp_areas") - pvp_areas_store:to_file(minetest.get_worldpath() .. "/pvp_areas_store.dat") + pvp_areas_store:insert_area(pvp_areas_players[name].pos1, pvp_areas_players[name].pos2, "pvp_areas") + table.insert(pvp_areas, pvp_areas_store:get_area(#pvp_areas)) + update_pvp_areas() + save_pvp_areas() + pvp_areas_players[name] = nil + minetest.chat_send_player(name, "Area set.") end - elseif param == "remove" then - minetest.chat_send_player(name, "Removing.") - else + elseif param:sub(1, 6) == "remove" then + local n = tonumber(param:sub(8, -1)) + 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.") + else + minetest.chat_send_player(name, "Listing information to STDOUT.") + print() + print("---") + for i = 0, #pvp_areas - 1 do + print(dump(pvp_areas_store:get_area(i))) + end + print() end end }) -- Register punchplayer callback. minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + if damage < 1 then + return false + end + for k, v in pairs(pvp_areas_store:get_areas_for_pos(player:getpos())) do if k then - return false + if pvp_default then + return true + else + return false + end end end - return true + + -- player is not in a pvp_areas_store area. + if pvp_default then + return false + else + return true + end end) -- cgit v1.2.3 From 877ef09eedba7663b2c8e5be1e017499a6ffd5c0 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Fri, 9 Sep 2016 10:52:38 -0400 Subject: PvP by Default default false. --- init.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 3859448..9c6268e 100644 --- a/init.lua +++ b/init.lua @@ -8,10 +8,7 @@ local pvp_areas_modname = minetest.get_current_modname() local pvp_areas_store = AreaStore() pvp_areas_store:from_file(pvp_areas_worlddir .. "/pvp_areas_store.dat") -local pvp_default = minetest.setting_getbool("pvp_areas_enable_pvp") -if pvp_default == nil then - pvp_default = true -end +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 = {} -- cgit v1.2.3 From f46a279600c5fe5a6a23ad5b33a0504d9868fd15 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Fri, 9 Sep 2016 11:42:22 -0400 Subject: Show areas in chat /pvp_areas without arguments lists areas to chat. --- init.lua | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 9c6268e..3fec4d5 100644 --- a/init.lua +++ b/init.lua @@ -84,13 +84,12 @@ minetest.register_chatcommand("pvp_areas", { elseif param ~= "" then minetest.chat_send_player(name, "Invalid usage. Type \"/help pvp_areas\" for more information.") else - minetest.chat_send_player(name, "Listing information to STDOUT.") - print() - print("---") - for i = 0, #pvp_areas - 1 do - print(dump(pvp_areas_store:get_area(i))) + for k, v in pairs(pvp_areas) do + local id = k - 1 + local min = v.min + local max = v.max + minetest.chat_send_player(name, id .. ": " .. minetest.pos_to_string(min) .. " " .. minetest.pos_to_string(max)) end - print() end end }) -- cgit v1.2.3 From f2d08f1b4d12ca6ade72e6e05396ec14732b47f0 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Fri, 9 Sep 2016 13:25:14 -0400 Subject: Manage IDs. --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 3fec4d5..91c255a 100644 --- a/init.lua +++ b/init.lua @@ -58,7 +58,7 @@ minetest.register_chatcommand("pvp_areas", { elseif not pvp_areas_players[name].pos2 then minetest.chat_send_player(name, "Position 2 missing, use \"/pvp_areas pos2\" to set.") else - pvp_areas_store:insert_area(pvp_areas_players[name].pos1, pvp_areas_players[name].pos2, "pvp_areas") + 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)) update_pvp_areas() save_pvp_areas() -- cgit v1.2.3 From d9876ee60570c8619bcfb50562739d5743b2c90d Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Fri, 9 Sep 2016 14:17:22 -0400 Subject: Fewer vars. --- init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 91c255a..8068154 100644 --- a/init.lua +++ b/init.lua @@ -85,10 +85,9 @@ minetest.register_chatcommand("pvp_areas", { minetest.chat_send_player(name, "Invalid usage. Type \"/help pvp_areas\" for more information.") else for k, v in pairs(pvp_areas) do - local id = k - 1 - local min = v.min - local max = v.max - minetest.chat_send_player(name, id .. ": " .. minetest.pos_to_string(min) .. " " .. minetest.pos_to_string(max)) + minetest.chat_send_player(name, k - 1 .. ": " .. + minetest.pos_to_string(v.min) .. " " .. + minetest.pos_to_string(v.max)) end end end -- cgit v1.2.3