From 5ee6cf6c9b3b9da36830c8a58f105d289dfbe54c Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 23 Apr 2021 19:49:35 -0400 Subject: [PATCH] Implement mob despawner/mob limiter --- mods/ENTITIES/mcl_mobs/api/api.lua | 14 +++--------- .../mcl_mobs/api/mob_functions/ai.lua | 13 +++++++++++ .../api/mob_functions/environment.lua | 20 +++++++++++++++++ .../mcl_mobs/api/mob_functions/set_up.lua | 22 +++++++------------ mods/ENTITIES/mcl_mobs/api/spawning.lua | 2 +- 5 files changed, 45 insertions(+), 26 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 852bfd8af..235453918 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -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, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 66b24fcaa..529506064 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -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 diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index f81cba6fc..fe77305b0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -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 \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua index 1fee55217..5f55d344a 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -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 diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index f885d55c7..39736e9d0 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -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