forked from MineClone5/MineClone5
Spawn villagers on villagegen, stay in village
This spawns a villager per bed on village gen and saves the bed position in the entity. If it moves too far from the village it gets teleported (for now) back.
This commit is contained in:
parent
be67954f89
commit
a9d5fdd625
|
@ -1041,6 +1041,9 @@ mobs:register_mob("mobs_mc:villager", {
|
||||||
_player_scan_timer = 0,
|
_player_scan_timer = 0,
|
||||||
_trading_players = {}, -- list of playernames currently trading with villager (open formspec)
|
_trading_players = {}, -- list of playernames currently trading with villager (open formspec)
|
||||||
do_custom = function(self, dtime)
|
do_custom = function(self, dtime)
|
||||||
|
if self.bed and vector.distance(self.object:get_pos(),self.bed) > 50 then
|
||||||
|
self.object:set_pos(self.bed)
|
||||||
|
end
|
||||||
-- Stand still if player is nearby.
|
-- Stand still if player is nearby.
|
||||||
if not self._player_scan_timer then
|
if not self._player_scan_timer then
|
||||||
self._player_scan_timer = 0
|
self._player_scan_timer = 0
|
||||||
|
|
|
@ -317,7 +317,7 @@ end
|
||||||
|
|
||||||
local function init_nodes(p1, rotation, pr, size)
|
local function init_nodes(p1, rotation, pr, size)
|
||||||
local p2 = vector.subtract(vector.add(p1, size), 1)
|
local p2 = vector.subtract(vector.add(p1, size), 1)
|
||||||
local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_itemframes:item_frame", "mcl_furnaces:furnace", "mcl_anvils:anvil", "mcl_chests:chest", "mcl_villages:stonebrickcarved"})
|
local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_itemframes:item_frame", "mcl_furnaces:furnace", "mcl_anvils:anvil", "mcl_chests:chest"})
|
||||||
for _, pos in pairs(nodes) do
|
for _, pos in pairs(nodes) do
|
||||||
local name = minetest_get_node(pos).name
|
local name = minetest_get_node(pos).name
|
||||||
local def = minetest_registered_nodes[minetest_get_node(pos).name]
|
local def = minetest_registered_nodes[minetest_get_node(pos).name]
|
||||||
|
@ -366,12 +366,6 @@ local function place_schematics(plan, pr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
|
||||||
-- register block for npc spawn
|
|
||||||
--
|
|
||||||
local function spawn_villager(pos)
|
|
||||||
minetest.add_entity({x = pos.x, y = pos.y + 1, z = pos.z}, "mobs_mc:villager")
|
|
||||||
end
|
|
||||||
minetest.register_node("mcl_villages:stonebrickcarved", {
|
minetest.register_node("mcl_villages:stonebrickcarved", {
|
||||||
description = S("Chiseled Stone Village Bricks"),
|
description = S("Chiseled Stone Village Bricks"),
|
||||||
_doc_items_longdesc = doc.sub.items.temp.build,
|
_doc_items_longdesc = doc.sub.items.temp.build,
|
||||||
|
@ -383,35 +377,18 @@ minetest.register_node("mcl_villages:stonebrickcarved", {
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
_mcl_blast_resistance = 6,
|
_mcl_blast_resistance = 6,
|
||||||
_mcl_hardness = 1.5,
|
_mcl_hardness = 1.5,
|
||||||
on_construct = spawn_villager,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_abm({
|
local function spawn_villagers(minp,maxp)
|
||||||
label = "Spawn villagers",
|
local beds=minetest.find_nodes_in_area(minp,maxp,{"mcl_beds:bed_red_bottom"})
|
||||||
nodenames = {"mcl_villages:stonebrickcarved"},
|
for _,bed in pairs(beds) do
|
||||||
interval = 60,
|
minetest.get_meta(bed):set_string("villagebed","true")
|
||||||
chance = 3,
|
local v=minetest.add_entity(bed,"mobs_mc:villager")
|
||||||
action = function(pos, node)
|
if v then
|
||||||
-- check the space above
|
v:get_luaentity().bed = bed
|
||||||
local p = table.copy(pos)
|
|
||||||
p.y = p.y + 1
|
|
||||||
if minetest_get_node(p).name ~= "air" then return end
|
|
||||||
p.y = p.y + 1
|
|
||||||
if minetest_get_node(p).name ~= "air" then return end
|
|
||||||
p.y = p.y - 1
|
|
||||||
local villagers_counter = 0
|
|
||||||
for _, obj in pairs(minetest.get_objects_inside_radius(p, 40)) do
|
|
||||||
local lua_entity = obj:get_luaentity()
|
|
||||||
if luaentity and luaentity.name == "mobs_mc:villager" then
|
|
||||||
villagers_counter = villagers_counter + 1
|
|
||||||
if villagers_counter > 7 then return end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
spawn_villager(pos)
|
|
||||||
end
|
end
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- on map generation, try to build a settlement
|
-- on map generation, try to build a settlement
|
||||||
|
@ -433,6 +410,27 @@ local function build_a_village(minp, maxp, pr, placer)
|
||||||
place_schematics(plan, pr)
|
place_schematics(plan, pr)
|
||||||
villages[#villages + 1] = minp
|
villages[#villages + 1] = minp
|
||||||
storage:set_string("villages", minetest.serialize(villages))
|
storage:set_string("villages", minetest.serialize(villages))
|
||||||
|
|
||||||
|
minetest.after(60,function()
|
||||||
|
spawn_villagers(minp,maxp)
|
||||||
|
end)
|
||||||
|
|
||||||
|
--[[ Enable for testing, but use MineClone2's own spawn code if/when merging.
|
||||||
|
--
|
||||||
|
-- register inhabitants
|
||||||
|
--
|
||||||
|
if minetest.get_modpath("mobs_mc") then
|
||||||
|
mobs:register_spawn("mobs_mc:villager", --name
|
||||||
|
{"mcl_core:stonebrickcarved"}, --nodes
|
||||||
|
15, --max_light
|
||||||
|
0, --min_light
|
||||||
|
20, --chance
|
||||||
|
7, --active_object_count
|
||||||
|
31000, --max_height
|
||||||
|
nil) --day_toggle
|
||||||
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Disable natural generation in singlenode.
|
-- Disable natural generation in singlenode.
|
||||||
|
|
Loading…
Reference in New Issue