forked from Mirrorlandia_minetest/mod-sneeker
Implement method to despawn sneekers that aren't near any players
This commit is contained in:
parent
d741261156
commit
cc73168dd4
1
TODO.txt
1
TODO.txt
@ -1,3 +1,2 @@
|
||||
|
||||
TODO:
|
||||
- add option to remove mobs that aren't near any players
|
||||
|
30
init.lua
30
init.lua
@ -114,8 +114,11 @@ def.on_activate = function(self, staticdata)
|
||||
self.knockback = false
|
||||
self.state = math.random(1, 2)
|
||||
self.old_y = self.object:get_pos().y
|
||||
|
||||
-- despawning
|
||||
self.lifetime = sneeker.lifetime
|
||||
self.lifetimer = 0
|
||||
self.check_despawn_player_distance = true
|
||||
|
||||
local data = core.deserialize(staticdata)
|
||||
if data and type(data) == "table" then
|
||||
@ -154,6 +157,33 @@ def.on_step = function(self, dtime)
|
||||
local ANIM_WALK = 2
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
|
||||
if sneeker.despawn_player_far then
|
||||
-- run check about once per 60 seconds
|
||||
local interval_reached = math.floor(self.lifetimer % 60) == 0
|
||||
if not interval_reached and not self.check_despawn_player_distance then
|
||||
self.check_despawn_player_distance = true
|
||||
end
|
||||
|
||||
if interval_reached and self.check_despawn_player_distance then
|
||||
local player_nearby = false
|
||||
for _, entity in ipairs(core.get_objects_inside_radius(pos, sneeker.despawn_player_radius)) do
|
||||
if entity:is_player() then
|
||||
player_nearby = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not player_nearby then
|
||||
self.object:remove()
|
||||
return true
|
||||
end
|
||||
|
||||
-- set flag to not check again until next interval
|
||||
self.check_despawn_player_distance = false
|
||||
end
|
||||
end
|
||||
|
||||
local yaw = self.object:get_yaw()
|
||||
local inside = core.get_objects_inside_radius(pos, 10)
|
||||
local walk_speed = self.walk_speed
|
||||
|
12
settings.lua
12
settings.lua
@ -27,6 +27,18 @@ sneeker.spawn_require_player_nearby = core.settings:get_bool("sneeker.spawn_requ
|
||||
-- @setting sneeker.spawn_player_radius
|
||||
sneeker.spawn_player_radius = tonumber(core.settings:get("sneeker.spawn_player_radius") or 100)
|
||||
|
||||
--- If enabled, mobs not near any players will despawn.
|
||||
--
|
||||
-- @setting sneeker.despawn_player_far
|
||||
sneeker.despawn_player_far = core.settings:get_bool("sneeker.despawn_player_far", true)
|
||||
|
||||
--- Distance determining if a player is near enough to prevent despawn.
|
||||
--
|
||||
-- Only used if `sneeker.despawn_player_far` enabled.
|
||||
--
|
||||
-- @setting sneeker.despawn_player_radius
|
||||
sneeker.despawn_player_radius = tonumber(core.settings:get("sneeker.despawn_player_radius") or 500)
|
||||
|
||||
--- Sets possibility for spawn.
|
||||
--
|
||||
-- Inverted value (e.g. 10000 = 1/10000).
|
||||
|
@ -13,12 +13,20 @@ sneeker.lifetime (Sneeker lifetime) int 900
|
||||
sneeker.boom_gain (Boom volume) float 1.5
|
||||
|
||||
# Determines whether or not a player must be close for spawn to occur.
|
||||
sneeker.spawn_require_player_nearby (Require player nearby) bool true
|
||||
sneeker.spawn_require_player_nearby (Require player nearby for spawn) bool true
|
||||
|
||||
# Distance in nodes a player must be for spawn to occur.
|
||||
#
|
||||
# Only used if `sneeker.spawn_require_player_nearby` enabled.
|
||||
sneeker.spawn_player_radius (Player detect radius) int 100
|
||||
sneeker.spawn_player_radius (Player spawn detect radius) int 100
|
||||
|
||||
# If enabled, mobs not near any players will despawn.
|
||||
sneeker.despawn_player_far (Despawn sneekers not near players) bool true
|
||||
|
||||
# Distance determining if a player is near enough to prevent despawn.
|
||||
#
|
||||
# Only used if `sneeker.despawn_player_far` enabled.
|
||||
sneeker.despawn_player_radius (Player despawn detect radius) int 500
|
||||
|
||||
# Sets possibility for spawn.
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user