From 94f07c2b3dbf86e6b81b6cf2e8554da1932ccc45 Mon Sep 17 00:00:00 2001 From: cora Date: Fri, 26 Aug 2022 04:03:20 +0200 Subject: [PATCH] Fix ender particle spam with particlespammers --- mods/ENTITIES/mobs_mc/enderman.lua | 54 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 1ff27934b4..5445d59c43 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -219,6 +219,7 @@ local select_enderman_animation = function(animation_type) end local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local spawners = {} mcl_mobs:register_mob("mobs_mc:enderman", { description = S("Enderman"), @@ -263,20 +264,42 @@ mcl_mobs:register_mob("mobs_mc:enderman", { do_custom = function(self, dtime) -- PARTICLE BEHAVIOUR HERE. local enderpos = self.object:get_pos() - local chanceOfParticle = math.random(0, 1) - if chanceOfParticle == 1 then - minetest.add_particle({ - pos = {x=enderpos.x+math.random(-1,1)*math.random()/2,y=enderpos.y+math.random(0,3),z=enderpos.z+math.random(-1,1)*math.random()/2}, - velocity = {x=math.random(-.25,.25), y=math.random(-.25,.25), z=math.random(-.25,.25)}, - acceleration = {x=math.random(-.5,.5), y=math.random(-.5,.5), z=math.random(-.5,.5)}, - expirationtime = math.random(), - size = math.random(), - collisiondetection = true, - vertical = false, - texture = "mcl_portals_particle"..math.random(1, 5)..".png", - }) + if self._particle_timer and self._particle_timer >= 1 then + for _,player in pairs(minetest.get_connected_players()) do + if not spawners[player] then spawners[player] = {} end + local dst = vector.distance(player:get_pos(),enderpos) + if dst < 128 and not spawners[player][self.object] then + self._particle_timer = 0 + spawners[player][self.object] = minetest.add_particlespawner({ + amount = 5, + minpos = vector.new(-0.6,0,-0.6), + maxpos = vector.new(0.6,3,0.6), + minvel = vector.new(-0.25,-0.25,-0.25), + maxvel = vector.new(0.25,0.25,0.25), + minacc = vector.new(-0.5,-0.5,-0.5), + maxacc = vector.new(0.5,0.5,0.5), + minexptime = 0.2, + maxexptime = 3, + minsize = 0.2, + maxsize = 1.2, + collisiondetection = true, + vertical = false, + time = 0, + texture = "mcl_portals_particle"..math.random(1, 5)..".png", + attached = self.object, + playername = player:get_player_name(), + }) + elseif dst > 128 and spawners[player][self.object] then + minetest.delete_particlespawner(spawners[player][self.object]) + spawners[player][self.object] = nil + end + end + elseif not self._particle_timer then + self._particle_timer = 0 end + self._particle_timer = self._particle_timer + dtime -- RAIN DAMAGE / EVASIVE WARP BEHAVIOUR HERE. + enderpos = self.object:get_pos() local dim = mcl_worlds.pos_to_dimension(enderpos) if dim == "overworld" then if mcl_weather.state == "rain" or mcl_weather.state == "lightning" then @@ -593,6 +616,13 @@ mcl_mobs:register_mob("mobs_mc:enderman", { attack_type = "dogfight", }) +minetest.register_on_leaveplayer(function(player) + for _,s in pairs(spawners[player]) do + minetest.delete_particlespawner(s) + end + spawners[player] = nil +end) + -- End spawn mcl_mobs:spawn_specific(