]> git.lizzy.rs Git - Crafter.git/blob - mods/mob_spawners/init.lua
Stop mob spawners from creating insane amounts of mobs
[Crafter.git] / mods / mob_spawners / init.lua
1 dungeon_loot = {}
2
3 dungeon_loot.CHESTS_MIN = 10 -- not necessarily in a single dungeon
4 dungeon_loot.CHESTS_MAX = 50
5 dungeon_loot.STACKS_PER_CHEST_MAX = 10
6
7 mob_spawners = {}
8
9 function register_mob_spawner(mobname,texture,mesh)
10     minetest.register_node(":mob_spawners:"..mobname,{
11         description = mobname:gsub("^%l", string.upper).." Spawner",
12         drawtype = "allfaces",
13                 tiles = {"spawner.png"},
14                 groups = {stone = 3, pathable = 1},
15         sounds = main.stoneSound(),
16         sunlight_propagates = true,
17         paramtype = "light",
18         drop = "",
19         on_construct = function(pos)
20             minetest.add_entity(pos, "mob_spawners:"..mobname)
21         end,
22         after_destruct = function(pos)
23             for _,object in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
24                 if not object:is_player() then
25                     if object:get_luaentity().name == "mob_spawners:"..mobname then
26                         object:remove()
27                         return
28                     end
29                 end
30             end
31         end
32     })
33
34     table.insert(mob_spawners,"mob_spawners:"..mobname)
35
36     minetest.register_lbm({
37         name = ":mob_spawners:"..mobname,
38         nodenames = {"mob_spawners:"..mobname},
39         action = function(pos)
40             minetest.add_entity(pos, "mob_spawners:"..mobname)
41         end,
42     })
43
44     minetest.register_abm({
45         label = "mob_spawners:"..mobname,
46         nodenames = {"mob_spawners:"..mobname},
47         neighbors = {"air"},
48         interval = 5,
49         chance = 1,
50         action = function(pos)
51             --readd the mob visual
52             local found = false
53             for _,object in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
54                 if not object:is_player() then
55                     if object:get_luaentity().name == "mob_spawners:"..mobname then
56                         found = true
57                         break
58                     end
59                 end
60             end
61             if found == false then
62                 minetest.add_entity(pos, "mob_spawners:"..mobname)
63             end
64
65             local player_found = false
66             for _,object in ipairs(minetest.get_objects_inside_radius(pos, 7)) do
67                 if object:is_player() then
68                     player_found = true
69                 end
70             end
71
72             if not player_found then
73                 return
74             end
75
76             local mobcount = 0
77             for _,object in ipairs(minetest.get_objects_inside_radius(pos, 10)) do
78                 if not object:is_player() and object:get_luaentity().mobname then
79                     mobcount = mobcount + 1
80                     if mobcount > 5 then
81                         return
82                     end
83                 end
84             end
85
86             for i = 1,math.random(2,4) do
87                 local newpos = minetest.find_node_near(pos, 5, {"air"})
88                 if newpos then
89                     minetest.add_entity(newpos,"mob:"..mobname)
90                 end
91             end
92             end,
93     })
94
95     local spawner_entity = {}
96     spawner_entity.initial_properties = {
97         physical = false,
98         collide_with_objects = false,
99         collisionbox = {0,0,0,0,0,0},
100         visual = "mesh",
101         visual_size = {x=1,y=1,z=1},
102         mesh = mesh,
103         textures = texture,
104         is_visible = true,
105         pointable = false,
106         makes_footstep_sound = false,
107         static_save = false,
108         automatic_rotate = 3
109     }
110     spawner_entity.on_activate = function()
111         --do nothing
112     end
113     spawner_entity.on_step = function()
114         --do nothing
115     end
116     minetest.register_entity(":mob_spawners:"..mobname, spawner_entity)
117 end
118
119 dofile(minetest.get_modpath("mob_spawners") .. "/loot.lua")
120 dofile(minetest.get_modpath("mob_spawners") .. "/mapgen.lua")