mirror of
https://codeberg.org/tenplus1/mobs_redo.git
synced 2025-02-15 18:00:21 +01:00
added 'mob_active_limit' to limit mobs in game
This commit is contained in:
parent
53cc10a16f
commit
85faeea604
76
api.lua
76
api.lua
@ -6,16 +6,11 @@ local use_cmi = minetest.global_exists("cmi")
|
|||||||
|
|
||||||
mobs = {
|
mobs = {
|
||||||
mod = "redo",
|
mod = "redo",
|
||||||
version = "20200515",
|
version = "20200516",
|
||||||
intllib = S,
|
intllib = S,
|
||||||
invis = minetest.global_exists("invisibility") and invisibility or {}
|
invis = minetest.global_exists("invisibility") and invisibility or {}
|
||||||
}
|
}
|
||||||
|
|
||||||
-- mob table and limit (not active)
|
|
||||||
local active_mobs = 0
|
|
||||||
local active_limit = 99
|
|
||||||
|
|
||||||
|
|
||||||
-- creative check
|
-- creative check
|
||||||
local creative_cache = minetest.settings:get_bool("creative_mode")
|
local creative_cache = minetest.settings:get_bool("creative_mode")
|
||||||
function mobs.is_creative(name)
|
function mobs.is_creative(name)
|
||||||
@ -59,7 +54,11 @@ local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0
|
|||||||
local show_health = minetest.settings:get_bool("mob_show_health") ~= false
|
local show_health = minetest.settings:get_bool("mob_show_health") ~= false
|
||||||
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
|
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
|
||||||
local mob_nospawn_range = tonumber(minetest.settings:get("mob_nospawn_range") or 12)
|
local mob_nospawn_range = tonumber(minetest.settings:get("mob_nospawn_range") or 12)
|
||||||
local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1)
|
local active_limit = tonumber(minetest.settings:get("mob_active_limit") or 0)
|
||||||
|
local mob_chance_multiplier =
|
||||||
|
tonumber(minetest.settings:get("mob_chance_multiplier") or 1)
|
||||||
|
local active_mobs = 0
|
||||||
|
|
||||||
|
|
||||||
-- Peaceful mode message so players will know there are no monsters
|
-- Peaceful mode message so players will know there are no monsters
|
||||||
if peaceful_only then
|
if peaceful_only then
|
||||||
@ -763,9 +762,9 @@ local remove_mob = function(self, decrease)
|
|||||||
|
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
|
|
||||||
if decrease then
|
if decrease and active_limit > 0 then
|
||||||
|
|
||||||
-- active_mobs = active_mobs - 1
|
active_mobs = active_mobs - 1
|
||||||
|
|
||||||
if active_mobs < 0 then
|
if active_mobs < 0 then
|
||||||
active_mobs = 0
|
active_mobs = 0
|
||||||
@ -1361,7 +1360,7 @@ function mob_class:breed()
|
|||||||
ent.hornytimer = 41
|
ent.hornytimer = 41
|
||||||
|
|
||||||
-- have we reached active mob limit
|
-- have we reached active mob limit
|
||||||
if active_mobs >= active_limit then
|
if active_limit > 0 and active_mobs >= active_limit then
|
||||||
minetest.chat_send_player(self.owner,
|
minetest.chat_send_player(self.owner,
|
||||||
S("Active Mob Limit Reached!")
|
S("Active Mob Limit Reached!")
|
||||||
.. " (" .. active_mobs
|
.. " (" .. active_mobs
|
||||||
@ -1391,8 +1390,6 @@ function mob_class:breed()
|
|||||||
local ent2 = mob:get_luaentity()
|
local ent2 = mob:get_luaentity()
|
||||||
local textures = self.base_texture
|
local textures = self.base_texture
|
||||||
|
|
||||||
-- active_mobs = active_mobs + 1
|
|
||||||
|
|
||||||
-- using specific child texture (if found)
|
-- using specific child texture (if found)
|
||||||
if self.child_texture then
|
if self.child_texture then
|
||||||
textures = self.child_texture[1]
|
textures = self.child_texture[1]
|
||||||
@ -2969,6 +2966,13 @@ end
|
|||||||
-- get entity staticdata
|
-- get entity staticdata
|
||||||
function mob_class:mob_staticdata()
|
function mob_class:mob_staticdata()
|
||||||
|
|
||||||
|
-- this handles mob count for mobs activated, unloaded, reloaded
|
||||||
|
if active_limit > 0 and self.active_toggle then
|
||||||
|
active_mobs = active_mobs + self.active_toggle
|
||||||
|
self.active_toggle = -self.active_toggle
|
||||||
|
--print("-- staticdata", active_mobs, active_limit, self.active_toggle)
|
||||||
|
end
|
||||||
|
|
||||||
-- remove mob when out of range unless tamed
|
-- remove mob when out of range unless tamed
|
||||||
if remove_far
|
if remove_far
|
||||||
and self.remove_ok
|
and self.remove_ok
|
||||||
@ -3005,9 +3009,7 @@ function mob_class:mob_staticdata()
|
|||||||
|
|
||||||
local t = type(stat)
|
local t = type(stat)
|
||||||
|
|
||||||
if t ~= "function"
|
if t ~= "function" and t ~= "nil" and t ~= "userdata"
|
||||||
and t ~= "nil"
|
|
||||||
and t ~= "userdata"
|
|
||||||
and _ ~= "_cmi_components" then
|
and _ ~= "_cmi_components" then
|
||||||
tmp[_] = self[_]
|
tmp[_] = self[_]
|
||||||
end
|
end
|
||||||
@ -3022,6 +3024,20 @@ end
|
|||||||
-- activate mob and reload settings
|
-- activate mob and reload settings
|
||||||
function mob_class:mob_activate(staticdata, def, dtime)
|
function mob_class:mob_activate(staticdata, def, dtime)
|
||||||
|
|
||||||
|
-- if dtime == 0 then entity has just been created
|
||||||
|
-- anything higher means it is respawning (thanks SorceryKid)
|
||||||
|
if dtime == 0 and active_limit > 0 then
|
||||||
|
self.active_toggle = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- remove mob if not tamed and mob total reached
|
||||||
|
if active_limit > 0 and active_mobs >= active_limit and not self.tamed then
|
||||||
|
|
||||||
|
remove_mob(self)
|
||||||
|
--print("-- mob limit reached, removing " .. self.name)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- remove monsters in peaceful mode
|
-- remove monsters in peaceful mode
|
||||||
if self.type == "monster" and peaceful_only then
|
if self.type == "monster" and peaceful_only then
|
||||||
|
|
||||||
@ -3030,14 +3046,6 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- remove mob if not tamed and mob total reached
|
|
||||||
if active_mobs >= active_limit and not self.tamed then
|
|
||||||
|
|
||||||
remove_mob(self)
|
|
||||||
--print("-- mob limit reached, removing " .. self.name)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- load entity variables
|
-- load entity variables
|
||||||
local tmp = minetest.deserialize(staticdata)
|
local tmp = minetest.deserialize(staticdata)
|
||||||
|
|
||||||
@ -3047,13 +3055,6 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- add currently spawned mobs to total
|
|
||||||
-- this is buggy as it doubles count when mobs unloaded and reloaded
|
|
||||||
if self.standing_in then
|
|
||||||
-- active_mobs = active_mobs + 1
|
|
||||||
--print("-- active mobs: " .. active_mobs .. " / " .. active_limit)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- force current model into mob
|
-- force current model into mob
|
||||||
self.mesh = def.mesh
|
self.mesh = def.mesh
|
||||||
self.base_mesh = def.mesh
|
self.base_mesh = def.mesh
|
||||||
@ -3101,10 +3102,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
|||||||
-- set child objects to half size
|
-- set child objects to half size
|
||||||
if self.child == true then
|
if self.child == true then
|
||||||
|
|
||||||
vis_size = {
|
vis_size = {x = self.base_size.x * .5, y = self.base_size.y * .5}
|
||||||
x = self.base_size.x * .5,
|
|
||||||
y = self.base_size.y * .5,
|
|
||||||
}
|
|
||||||
|
|
||||||
if def.child_texture then
|
if def.child_texture then
|
||||||
textures = def.child_texture[1]
|
textures = def.child_texture[1]
|
||||||
@ -3632,7 +3630,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- are we over active mob limit
|
-- are we over active mob limit
|
||||||
if active_mobs >= active_limit then
|
if active_limit > 0 and active_mobs >= active_limit then
|
||||||
--print("--- active mob limit reached", active_mobs, active_limit)
|
--print("--- active mob limit reached", active_mobs, active_limit)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -3780,8 +3778,6 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
|
|||||||
|
|
||||||
local mob = minetest.add_entity(pos, name)
|
local mob = minetest.add_entity(pos, name)
|
||||||
|
|
||||||
-- active_mobs = active_mobs + 1
|
|
||||||
|
|
||||||
-- print("[mobs] Spawned " .. name .. " at "
|
-- print("[mobs] Spawned " .. name .. " at "
|
||||||
-- .. minetest.pos_to_string(pos) .. " on "
|
-- .. minetest.pos_to_string(pos) .. " on "
|
||||||
-- .. node.name .. " near " .. neighbors[1])
|
-- .. node.name .. " near " .. neighbors[1])
|
||||||
@ -4056,8 +4052,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
|
|
||||||
if not ent then return end -- sanity check
|
if not ent then return end -- sanity check
|
||||||
|
|
||||||
-- active_mobs = active_mobs + 1
|
|
||||||
|
|
||||||
-- set owner if not a monster
|
-- set owner if not a monster
|
||||||
if ent.type ~= "monster" then
|
if ent.type ~= "monster" then
|
||||||
ent.owner = placer:get_player_name()
|
ent.owner = placer:get_player_name()
|
||||||
@ -4102,7 +4096,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- have we reached active mob limit
|
-- have we reached active mob limit
|
||||||
if active_mobs >= active_limit then
|
if active_limit > 0 and active_mobs >= active_limit then
|
||||||
minetest.chat_send_player(placer:get_player_name(),
|
minetest.chat_send_player(placer:get_player_name(),
|
||||||
S("Active Mob Limit Reached!")
|
S("Active Mob Limit Reached!")
|
||||||
.. " (" .. active_mobs
|
.. " (" .. active_mobs
|
||||||
@ -4117,8 +4111,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
|
|
||||||
if not ent then return end -- sanity check
|
if not ent then return end -- sanity check
|
||||||
|
|
||||||
-- active_mobs = active_mobs + 1
|
|
||||||
|
|
||||||
-- don't set owner if monster or sneak pressed
|
-- don't set owner if monster or sneak pressed
|
||||||
if ent.type ~= "monster"
|
if ent.type ~= "monster"
|
||||||
and not placer:get_player_control().sneak then
|
and not placer:get_player_control().sneak then
|
||||||
|
1
api.txt
1
api.txt
@ -636,6 +636,7 @@ External Settings for "minetest.conf"
|
|||||||
pathfinding level 2, replace functions or mobs:boom
|
pathfinding level 2, replace functions or mobs:boom
|
||||||
function.
|
function.
|
||||||
'mob_nospawn_range' Minimum range a mob can spawn near player (def: 12)
|
'mob_nospawn_range' Minimum range a mob can spawn near player (def: 12)
|
||||||
|
'mob_active_limit' Number of active mobs in game, 0 for unlimited
|
||||||
|
|
||||||
Players can override the spawn chance for each mob registered by adding a line
|
Players can override the spawn chance for each mob registered by adding a line
|
||||||
to their minetest.conf file with a new value, the lower the value the more each
|
to their minetest.conf file with a new value, the lower the value the more each
|
||||||
|
@ -23,6 +23,8 @@ Lucky Blocks: 9
|
|||||||
|
|
||||||
|
|
||||||
Changelog:
|
Changelog:
|
||||||
|
- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game
|
||||||
|
(default is 0 for unlimited)
|
||||||
- 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting
|
- 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting
|
||||||
- 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found, (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added
|
- 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found, (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added
|
||||||
- 1.49- Added mobs:force_capture(self, player) function, api functions now use metatables thanks to bell07
|
- 1.49- Added mobs:force_capture(self, player) function, api functions now use metatables thanks to bell07
|
||||||
|
@ -28,5 +28,8 @@ mob_chance_multiplier (Mob chance multiplier) float 1.0
|
|||||||
# When false Mob no longer drop items when killed
|
# When false Mob no longer drop items when killed
|
||||||
mobs_drop_items (Mob drops) bool true
|
mobs_drop_items (Mob drops) bool true
|
||||||
|
|
||||||
#....Sets minimum distance around player that mobs cannot spawn
|
# Sets minimum distance around player that mobs cannot spawn
|
||||||
mob_nospawn_range (Mob no-spawn range) float 12.0
|
mob_nospawn_range (Mob no-spawn range) float 12.0
|
||||||
|
|
||||||
|
# Sets maximum number of active mobs in game (0 for unlimited)
|
||||||
|
mob_active_limit (Mob Active Limit) float 0
|
||||||
|
Loading…
Reference in New Issue
Block a user