-- creative_regions mod by h3ndrik local S = minetest.get_translator("creative_regions") creative_regions = {} areas_interact_privs = minetest.settings:get("creative_regions.interact_privs") or "+creative, +fast, +fly" areas_guest_privs = minetest.settings:get("creative_regions.guest_privs") or "" noregion_privs = minetest.settings:get("creative_regions.noregion_privs") or "-creative, +fast, -fly" default_privs = minetest.settings:get("creative_regions.default_privs") or "+creative, +fast, +fly" non_sticky_privs = {"arena"} -- always remove areas priv when not explicitly requested by current area creative_regions.modpath = minetest.get_modpath("creative_regions") dofile(creative_regions.modpath.."/region.lua") dofile(creative_regions.modpath.."/player.lua") dofile(creative_regions.modpath.."/chatcommands.lua") dofile(creative_regions.modpath.."/items.lua") dofile(creative_regions.modpath.."/mod_areas.lua") dofile(creative_regions.modpath.."/arena.lua") dofile(creative_regions.modpath.."/nopvp.lua") dofile(creative_regions.modpath.."/vehicles.lua") function creative_regions:update_player(player, initialize) local name = player:get_player_name() local pos = vector.round(player:get_pos()) local pmeta = player:get_meta() -- pmeta:mark_as_private("creative_regions.active_regions") local current_regions_size = {} local player_active_region_str = "" local areas_owner = false local areas_guest = false local areas_open = false local areas_faction_open = false local areas_individual_override = false initialize = initialize or 0 -- skip for players with protection_bypass if minetest.check_player_privs(name, { protection_bypass=true }) then return end -- find active regions local current_regions = creative_regions.astore:get_areas_for_pos(pos, true, true) for astore_id, astore_area in pairs( current_regions ) do local id = "r"..tostring(astore_id) local size = creative_regions:get_region_size(astore_area) table.insert(current_regions_size, { ["id"]=id, ["size"]=size }) end -- find active areas from areas mod if minetest.get_modpath("areas") then local current_areas = areas:getAreasAtPos(pos) for areas_id, areas_area in pairs( current_areas ) do local id = "a"..tostring(areas_id) local size = creative_regions:get_areas_area_size(areas_area) table.insert(current_regions_size, { ["id"]=id, ["size"]=size }) if areas_area.owner == name then areas_owner = true elseif areas_area.open then areas_open = true elseif minetest.get_modpath("playerfactions") and areas_area.faction_open then for _, fname in ipairs(areas_area.faction_open or {}) do if factions.player_is_in_faction(fname, name) then areas_faction_open = true end end else areas_guest = true --continue end end end -- calculate privs starting with biggest region and overwriting conscutively local new_privs_table = {} creative_regions:add_privs_from_string(new_privs_table, noregion_privs) table.sort(current_regions_size, function(a,b) return a["size"] > b["size"] end) for _, region in ipairs(current_regions_size) do player_active_region_str = player_active_region_str .. "," .. region.id if creative_regions.region_privs[region.id] then creative_regions:add_privs_from_string(new_privs_table, creative_regions.region_privs[region.id]) if string.sub(region.id, 1, 1) == "a" then areas_individual_override = true end elseif string.sub(region.id, 1, 1) == "r" then -- region creative_regions:add_privs_from_string(new_privs_table, default_privs) elseif string.sub(region.id, 1, 1) == "a" then -- areas mod if not areas_individual_override then creative_regions:add_privs_from_string(new_privs_table, areas_guest_privs) end end end -- overwrite if areas_owner or areas_open or areas_faction_open then creative_regions:add_privs_from_string(new_privs_table, areas_interact_privs) creative_regions:add_privs_from_string(new_privs_table, "-arena") end -- did the regions change? update -- ToDo: Update on privileges changed local player_last_active_region_str = pmeta:get_string("creative_regions.active_regions") or "" if player_active_region_str ~= player_last_active_region_str or initialize == 1 then creative_regions:player_enter_region(player, new_privs_table, initialize) pmeta:set_string("creative_regions.active_regions", player_active_region_str) end -- print(dump(pmeta:to_table())) end creative_regions.load_regions() minetest.register_on_joinplayer(function(player) creative_regions:update_player(player, 1) end) local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime if timer >= 1 then for _, player in pairs(minetest.get_connected_players()) do creative_regions:update_player(player) end end end)