Places: Add truly owned nodes. NPCs shouldn't override ownership
anymore. Spawner: Add command "/restore_area" to clear up node ownership & usage in manually spawned places. "/restore_plotmarkers" now clean up node ownership & usage in mg_villages.
This commit is contained in:
parent
8a5e80e2cb
commit
d95c8504ec
@ -166,7 +166,9 @@ end
|
|||||||
function npc.places.add_owned_accessible_place(self, nodes, place_type, walkables)
|
function npc.places.add_owned_accessible_place(self, nodes, place_type, walkables)
|
||||||
for i = 1, #nodes do
|
for i = 1, #nodes do
|
||||||
-- Check if node has owner
|
-- Check if node has owner
|
||||||
if nodes[i].owner == "" then
|
local owner = minetest.get_meta(nodes[i].node_pos):get_string("advanced_npc:owner")
|
||||||
|
--minetest.log("Condition: "..dump(owner == ""))
|
||||||
|
if owner == "" then
|
||||||
-- If node has no owner, check if it is accessible
|
-- If node has no owner, check if it is accessible
|
||||||
local empty_nodes = npc.places.find_orthogonal_accessible_node(
|
local empty_nodes = npc.places.find_orthogonal_accessible_node(
|
||||||
nodes[i].node_pos, nil, 0, true, walkables)
|
nodes[i].node_pos, nil, 0, true, walkables)
|
||||||
@ -556,6 +558,38 @@ function npc.places.scan_area_for_usable_nodes(pos1, pos2)
|
|||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Helper function to clear metadata in an array of nodes
|
||||||
|
-- Metadata that will be cleared is:
|
||||||
|
-- advanced_npc:used
|
||||||
|
-- advanced_npc:owner
|
||||||
|
local function clear_metadata(nodes)
|
||||||
|
local c = 0
|
||||||
|
for i = 1, #nodes do
|
||||||
|
local meta = minetest.get_meta(nodes[i].node_pos)
|
||||||
|
meta:set_string("advanced_npc:owner", "")
|
||||||
|
meta:set_string("advanced_npc:used", npc.places.USE_STATE.NOT_USED)
|
||||||
|
c = c + 1
|
||||||
|
end
|
||||||
|
return c
|
||||||
|
end
|
||||||
|
|
||||||
|
function npc.places.clear_metadata_usable_nodes_in_area(node_data)
|
||||||
|
local count = 0
|
||||||
|
count = count + clear_metadata(node_data.bed_type)
|
||||||
|
count = count + clear_metadata(node_data.sittable_type)
|
||||||
|
count = count + clear_metadata(node_data.furnace_type)
|
||||||
|
count = count + clear_metadata(node_data.storage_type)
|
||||||
|
count = count + clear_metadata(node_data.openable_type)
|
||||||
|
-- Clear workplace nodes
|
||||||
|
for i = 1, #node_data.workplace_type do
|
||||||
|
local meta = minetest.get_meta(node_data.workplace_type[i].node_pos)
|
||||||
|
meta:set_string("work_data", nil)
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Specialized function to find doors that are an entrance to a building.
|
-- Specialized function to find doors that are an entrance to a building.
|
||||||
-- The definition of an entrance is:
|
-- The definition of an entrance is:
|
||||||
-- The openable node with the shortest path to the plotmarker node
|
-- The openable node with the shortest path to the plotmarker node
|
||||||
@ -579,7 +613,6 @@ function npc.places.find_entrance_from_openable_nodes(all_openable_nodes, marker
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
for i = 1, #openable_nodes do
|
for i = 1, #openable_nodes do
|
||||||
|
|
||||||
local open_pos = openable_nodes[i].node_pos
|
local open_pos = openable_nodes[i].node_pos
|
||||||
|
40
spawner.lua
40
spawner.lua
@ -509,7 +509,7 @@ function npc.spawner.assign_places(self, entrance, node_data, pos)
|
|||||||
|
|
||||||
-- Assign beds
|
-- Assign beds
|
||||||
if #node_data.bed_type > 0 then
|
if #node_data.bed_type > 0 then
|
||||||
-- Assign a specific sittable node to a NPC.
|
-- Assign a specific bed node to a NPC.
|
||||||
npc.places.add_owned_accessible_place(self, node_data.bed_type,
|
npc.places.add_owned_accessible_place(self, node_data.bed_type,
|
||||||
npc.places.PLACE_TYPE.BED.PRIMARY)
|
npc.places.PLACE_TYPE.BED.PRIMARY)
|
||||||
-- Store changes to node_data
|
-- Store changes to node_data
|
||||||
@ -1081,6 +1081,10 @@ minetest.register_chatcommand("restore_plotmarkers", {
|
|||||||
meta:set_int("plot_nr", plot_nr)
|
meta:set_int("plot_nr", plot_nr)
|
||||||
meta:set_string("infotext", infotext)
|
meta:set_string("infotext", infotext)
|
||||||
-- Clear NPC stats, NPC data and node data
|
-- Clear NPC stats, NPC data and node data
|
||||||
|
-- Clear node_data metadata
|
||||||
|
local node_data = minetest.deserialize(meta:get_string("node_data"))
|
||||||
|
npc.places.clear_metadata_usable_nodes_in_area(node_data)
|
||||||
|
|
||||||
meta:set_string("node_data", nil)
|
meta:set_string("node_data", nil)
|
||||||
meta:set_string("npcs", nil)
|
meta:set_string("npcs", nil)
|
||||||
meta:set_string("npc_stats", nil)
|
meta:set_string("npc_stats", nil)
|
||||||
@ -1089,3 +1093,37 @@ minetest.register_chatcommand("restore_plotmarkers", {
|
|||||||
minetest.chat_send_player(name, "Finished replacement of "..dump(#nodes).." auto-spawners successfully")
|
minetest.chat_send_player(name, "Finished replacement of "..dump(#nodes).." auto-spawners successfully")
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_chatcommand("restore_area", {
|
||||||
|
description = "",
|
||||||
|
privs = {server = true},
|
||||||
|
func = function(name, param)
|
||||||
|
local args = npc.utils.split(param, " ")
|
||||||
|
minetest.log("Params: "..dump(args))
|
||||||
|
if #args < 2 then
|
||||||
|
minetest.chat_send_player("Please specify horizontal and vertical radius.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local radius = args[1]
|
||||||
|
local y_adj = args[2]
|
||||||
|
-- Get player position
|
||||||
|
local pos = {}
|
||||||
|
for _,player in pairs(minetest.get_connected_players()) do
|
||||||
|
if player:get_player_name() == name then
|
||||||
|
pos = player:get_pos()
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Search for nodes
|
||||||
|
-- Calculate positions
|
||||||
|
local start_pos = {x=pos.x-radius, y=pos.y-y_adj, z=pos.z-radius }
|
||||||
|
local end_pos = {x=pos.x+radius, y=pos.y+y_adj, z=pos.z+radius }
|
||||||
|
|
||||||
|
-- Scan for usable nodes
|
||||||
|
local node_data = npc.places.scan_area_for_usable_nodes(start_pos, end_pos)
|
||||||
|
local removed_count = npc.places.clear_metadata_usable_nodes_in_area(node_data)
|
||||||
|
|
||||||
|
minetest.chat_send_player(name, "Restored "..dump(removed_count).." nodes in area from "
|
||||||
|
..minetest.pos_to_string(start_pos).." to "..minetest.pos_to_string(end_pos))
|
||||||
|
end
|
||||||
|
})
|
||||||
|
13
utils.lua
13
utils.lua
@ -3,6 +3,19 @@
|
|||||||
|
|
||||||
npc.utils = {}
|
npc.utils = {}
|
||||||
|
|
||||||
|
function npc.utils.split(inputstr, sep)
|
||||||
|
if sep == nil then
|
||||||
|
sep = "%s"
|
||||||
|
end
|
||||||
|
local t={}
|
||||||
|
local i=1
|
||||||
|
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
|
||||||
|
t[i] = str
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
function npc.utils.array_contains(array, item)
|
function npc.utils.array_contains(array, item)
|
||||||
--minetest.log("Array: "..dump(array))
|
--minetest.log("Array: "..dump(array))
|
||||||
--minetest.log("Item being searched: "..dump(item))
|
--minetest.log("Item being searched: "..dump(item))
|
||||||
|
Loading…
Reference in New Issue
Block a user