-- We could depend on WorldEdit for this, but you need to have the -- 'worldedit' permission to use those commands and you don't have -- /eregion_pos{1,2} [X Y Z|X,Y,Z] -- Since this is mostly copied from WorldEdit, it is mostly -- licensed under the AGPL (select_eregion is a exception) eregions.marker1 = {} eregions.marker2 = {} eregions.set_pos = {} eregions.pos1 = {} eregions.pos2 = {} -- =================================================================== local cmdtab_select_eregion = { params = "", description = "Select a eregion by id.", func = function(name, param) local id = tonumber(param) if not id then return false, "Invalid usage, see /help select_eregion." end if not eregions.eregions[id] then return false, "The eregion "..id.." does not exist." end eregions:setPos1(name, eregions.eregions[id].pos1) eregions:setPos2(name, eregions.eregions[id].pos2) return true, "ERegion "..id.." selected." end, } minetest.register_chatcommand ("selecteregion" , cmdtab_select_eregion) minetest.register_chatcommand ("select_eregion" , cmdtab_select_eregion) minetest.register_chatcommand ("/selecteregion" , cmdtab_select_eregion) minetest.register_chatcommand ("/select_eregion" , cmdtab_select_eregion) -- =================================================================== local cmdtab_eregion_pos1 = { params = "[X Y Z|X,Y,Z]", description = "Set eregion protection region position 1 to your" .." location or the one specified", privs = {}, func = function(name, param) local pos = nil local found, _, x, y, z = param:find( "^(-?%d+)[, ](-?%d+)[, ](-?%d+)$") if found then pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} elseif param == "" then local player = minetest.get_player_by_name(name) if player then pos = player:getpos() else return false, "Unable to get position." end else return false, "Invalid usage, see /help eregion_pos1." end pos = vector.round(pos) eregions:setPos1(name, pos) return true, "ERegion position 1 set to " ..minetest.pos_to_string(pos) end, } minetest.register_chatcommand ("epos1" , cmdtab_eregion_pos1) minetest.register_chatcommand ("eregion_pos1" , cmdtab_eregion_pos1) minetest.register_chatcommand ("/epos1" , cmdtab_eregion_pos1) minetest.register_chatcommand ("/eregion_pos1" , cmdtab_eregion_pos1) -- =================================================================== local cmdtab_eregion_pos2 = { params = "[X Y Z|X,Y,Z]", description = "Set eregion protection region position 2 to your" .." location or the one specified", func = function(name, param) local pos = nil local found, _, x, y, z = param:find( "^(-?%d+)[, ](-?%d+)[, ](-?%d+)$") if found then pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} elseif param == "" then local player = minetest.get_player_by_name(name) if player then pos = player:getpos() else return false, "Unable to get position." end else return false, "Invalid usage, see /help eregion_pos2." end pos = vector.round(pos) eregions:setPos2(name, pos) return true, "ERegion position 2 set to " ..minetest.pos_to_string(pos) end, } minetest.register_chatcommand ("epos2" , cmdtab_eregion_pos2) minetest.register_chatcommand ("eregion_pos2" , cmdtab_eregion_pos2) minetest.register_chatcommand ("/epos2" , cmdtab_eregion_pos2) minetest.register_chatcommand ("/eregion_pos2" , cmdtab_eregion_pos2) -- =================================================================== function eregions:getPos (playerName) local pos1, pos2 = eregions.pos1 [playerName], eregions.pos2 [playerName] if not (pos1 and pos2) then return nil end -- Copy positions so that the eregion table doesn't contain multiple -- references to the same position. pos1, pos2 = vector.new(pos1), vector.new(pos2) return eregions:sortPos(pos1, pos2) end function eregions:setPos1(playerName, pos) eregions.pos1[playerName] = pos eregions.markPos1(playerName) end function eregions:setPos2(playerName, pos) eregions.pos2[playerName] = pos eregions.markPos2(playerName) end minetest.register_on_punchnode(function(pos, node, puncher) local name = puncher:get_player_name() -- Currently setting position if name ~= "" and eregions.set_pos[name] then if eregions.set_pos[name] == "pos1" then eregions.pos1[name] = pos eregions.markPos1(name) eregions.set_pos[name] = "pos2" minetest.chat_send_player(name, "Position 1 set to " ..minetest.pos_to_string(pos)) elseif eregions.set_pos[name] == "pos1only" then eregions.pos1[name] = pos eregions.markPos1(name) eregions.set_pos[name] = nil minetest.chat_send_player(name, "Position 1 set to " ..minetest.pos_to_string(pos)) elseif eregions.set_pos[name] == "pos2" then eregions.pos2[name] = pos eregions.markPos2(name) eregions.set_pos[name] = nil minetest.chat_send_player(name, "Position 2 set to " ..minetest.pos_to_string(pos)) end end end) -- Modifies positions `pos1` and `pos2` so that each component of `pos1` -- is less than or equal to its corresponding component of `pos2`, -- returning the two positions. function eregions:sortPos(pos1, pos2) if pos1.x > pos2.x then pos2.x, pos1.x = pos1.x, pos2.x end if pos1.y > pos2.y then pos2.y, pos1.y = pos1.y, pos2.y end if pos1.z > pos2.z then pos2.z, pos1.z = pos1.z, pos2.z end return pos1, pos2 end -- Marks eregion position 1 eregions.markPos1 = function(name) local pos = eregions.pos1[name] if eregions.marker1[name] ~= nil then -- Marker already exists eregions.marker1[name]:remove() -- Remove marker eregions.marker1[name] = nil end if pos ~= nil then -- Add marker eregions.marker1[name] = minetest.add_entity(pos, "eregions:pos1") eregions.marker1[name]:get_luaentity().active = true end end -- Marks eregion position 2 eregions.markPos2 = function(name) local pos = eregions.pos2[name] if eregions.marker2[name] ~= nil then -- Marker already exists eregions.marker2[name]:remove() -- Remove marker eregions.marker2[name] = nil end if pos ~= nil then -- Add marker eregions.marker2[name] = minetest.add_entity(pos, "eregions:pos2") eregions.marker2[name]:get_luaentity().active = true end end minetest.register_entity("eregions:pos1", { initial_properties = { visual = "cube", visual_size = {x=1.1, y=1.1}, textures = {"eregions_pos1.png", "eregions_pos1.png", "eregions_pos1.png", "eregions_pos1.png", "eregions_pos1.png", "eregions_pos1.png"}, collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, }, on_step = function(self, dtime) if self.active == nil then self.object:remove() end end, on_punch = function(self, hitter) self.object:remove() local name = hitter:get_player_name() eregions.marker1[name] = nil end, }) minetest.register_entity("eregions:pos2", { initial_properties = { visual = "cube", visual_size = {x=1.1, y=1.1}, textures = {"eregions_pos2.png", "eregions_pos2.png", "eregions_pos2.png", "eregions_pos2.png", "eregions_pos2.png", "eregions_pos2.png"}, collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, }, on_step = function(self, dtime) if self.active == nil then self.object:remove() end end, on_punch = function(self, hitter) self.object:remove() local name = hitter:get_player_name() eregions.marker2[name] = nil end, })