diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index f79dd3522..d4f843ef3 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -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 diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 37052a9b6..1f94da389 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -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.