mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 10:31:06 +01:00
Implement mob despawner/mob limiter
This commit is contained in:
parent
19c8dd1dd4
commit
5ee6cf6c9b
5 changed files with 45 additions and 26 deletions
|
@ -186,15 +186,6 @@ function mobs:register_mob(name, def)
|
|||
|
||||
mobs.spawning_mobs[name] = true
|
||||
|
||||
local can_despawn
|
||||
if def.can_despawn ~= nil then
|
||||
can_despawn = def.can_despawn
|
||||
elseif def.spawn_class == "passive" then
|
||||
can_despawn = false
|
||||
else
|
||||
can_despawn = true
|
||||
end
|
||||
|
||||
local function scale_difficulty(value, default, min, special)
|
||||
if (not value) or (value == default) or (value == special) then
|
||||
return default
|
||||
|
@ -219,7 +210,6 @@ function mobs:register_mob(name, def)
|
|||
do_custom = def.do_custom,
|
||||
jump_height = def.jump_height or 4, -- was 6
|
||||
rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2
|
||||
lifetimer = def.lifetimer or 57.73,
|
||||
hp_min = scale_difficulty(def.hp_min, 5, 1),
|
||||
hp_max = scale_difficulty(def.hp_max, 10, 1),
|
||||
xp_min = def.xp_min or 0,
|
||||
|
@ -338,6 +328,8 @@ function mobs:register_mob(name, def)
|
|||
projectile_cooldown_min = def.projectile_cooldown_min or 2,
|
||||
projectile_cooldown_max = def.projectile_cooldown_max or 6,
|
||||
skittish = def.skittish,
|
||||
lifetimer_reset = 30, --30 seconds
|
||||
lifetimer = 30, --30 seconds
|
||||
--end j4i stuff
|
||||
|
||||
-- MCL2 extensions
|
||||
|
@ -347,7 +339,7 @@ function mobs:register_mob(name, def)
|
|||
ignores_nametag = def.ignores_nametag or false,
|
||||
rain_damage = def.rain_damage or 0,
|
||||
glow = def.glow,
|
||||
can_despawn = can_despawn,
|
||||
--can_despawn = can_despawn,
|
||||
child = def.child or false,
|
||||
texture_mods = {},
|
||||
shoot_arrow = def.shoot_arrow,
|
||||
|
|
|
@ -696,6 +696,19 @@ mobs.mob_step = function(self, dtime)
|
|||
return false
|
||||
end
|
||||
|
||||
--despawn mechanism
|
||||
--don't despawned tamed mobs
|
||||
if not self.tamed then
|
||||
self.lifetimer = self.lifetimer - dtime
|
||||
if self.lifetimer <= 0 then
|
||||
self.lifetimer = self.lifetimer_reset
|
||||
if not mobs.check_for_player_within_area(self, 64) then
|
||||
--print("removing in MAIN LOGIC!")
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--color modifier which coincides with the pause_timer
|
||||
if self.old_health and self.health < self.old_health then
|
||||
|
|
|
@ -6,9 +6,11 @@ local minetest_get_item_group = minetest.get_item_group
|
|||
local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local minetest_get_node_or_nil = minetest.get_node_or_nil
|
||||
local minetest_registered_nodes = minetest.registered_nodes
|
||||
local minetest_get_connected_players = minetest.get_connected_players
|
||||
|
||||
local vector_new = vector.new
|
||||
local vector_multiply = vector.multiply
|
||||
local vector_distance = vector.distance
|
||||
|
||||
local table_copy = table.copy
|
||||
|
||||
|
@ -214,4 +216,22 @@ mobs.teleport = function(self, target)
|
|||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--a function used for despawning mobs
|
||||
mobs.check_for_player_within_area = function(self, radius)
|
||||
local pos1 = self.object:get_pos()
|
||||
--get players in radius
|
||||
for _,player in pairs(minetest_get_connected_players()) do
|
||||
if player and player:get_hp() > 0 then
|
||||
local pos2 = player:get_pos()
|
||||
local distance = vector_distance(pos1,pos2)
|
||||
if distance < radius then
|
||||
--found a player
|
||||
return(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
--did not find a player
|
||||
return(false)
|
||||
end
|
|
@ -5,21 +5,15 @@ local minetest_settings = minetest.settings
|
|||
-- get entity staticdata
|
||||
mobs.mob_staticdata = function(self)
|
||||
|
||||
--[[
|
||||
-- remove mob when out of range unless tamed
|
||||
if remove_far
|
||||
and self.can_despawn
|
||||
and self.remove_ok
|
||||
and ((not self.nametag) or (self.nametag == ""))
|
||||
and self.lifetimer <= 20 then
|
||||
|
||||
minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1))
|
||||
mcl_burning.extinguish(self.object)
|
||||
self.object:remove()
|
||||
|
||||
return ""-- nil
|
||||
--despawn mechanism
|
||||
--don't despawned tamed mobs
|
||||
if not self.tamed then
|
||||
if not mobs.check_for_player_within_area(self, 64) then
|
||||
--print("removing SERIALIZED!")
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
end
|
||||
--]]
|
||||
|
||||
self.remove_ok = true
|
||||
self.attack = nil
|
||||
|
|
|
@ -20,7 +20,7 @@ local table_remove = table.remove
|
|||
|
||||
|
||||
-- range for mob count
|
||||
local aoc_range = 32
|
||||
local aoc_range = 48
|
||||
--[[
|
||||
|
||||
THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
|
||||
|
|
Loading…
Reference in a new issue