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,
|
||||
_trading_players = {}, -- list of playernames currently trading with villager (open formspec)
|
||||
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.
|
||||
if not self._player_scan_timer then
|
||||
self._player_scan_timer = 0
|
||||
|
|
|
@ -317,7 +317,7 @@ end
|
|||
|
||||
local function init_nodes(p1, rotation, pr, size)
|
||||
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
|
||||
local name = 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
|
||||
|
||||
--
|
||||
-- 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", {
|
||||
description = S("Chiseled Stone Village Bricks"),
|
||||
_doc_items_longdesc = doc.sub.items.temp.build,
|
||||
|
@ -383,35 +377,18 @@ minetest.register_node("mcl_villages:stonebrickcarved", {
|
|||
is_ground_content = false,
|
||||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 1.5,
|
||||
on_construct = spawn_villager,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
label = "Spawn villagers",
|
||||
nodenames = {"mcl_villages:stonebrickcarved"},
|
||||
interval = 60,
|
||||
chance = 3,
|
||||
action = function(pos, node)
|
||||
-- check the space above
|
||||
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
|
||||
local function spawn_villagers(minp,maxp)
|
||||
local beds=minetest.find_nodes_in_area(minp,maxp,{"mcl_beds:bed_red_bottom"})
|
||||
for _,bed in pairs(beds) do
|
||||
minetest.get_meta(bed):set_string("villagebed","true")
|
||||
local v=minetest.add_entity(bed,"mobs_mc:villager")
|
||||
if v then
|
||||
v:get_luaentity().bed = bed
|
||||
end
|
||||
spawn_villager(pos)
|
||||
end
|
||||
})
|
||||
|
||||
|
||||
end
|
||||
|
||||
--
|
||||
-- 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)
|
||||
villages[#villages + 1] = minp
|
||||
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
|
||||
|
||||
-- Disable natural generation in singlenode.
|
||||
|
|
Loading…
Reference in New Issue