switch to infinitely lived particle spawners

infinitely lived particle spawners (time=0) can be used coord safely if
only send to a particular player. this saves on even more packets.
This commit is contained in:
cora 2021-09-25 00:10:50 +02:00
parent a35c5b66cb
commit 98eb0a1860
1 changed files with 48 additions and 44 deletions

View File

@ -21,6 +21,8 @@ mcl_weather.rain = {
sky_last_update = -1,
init_done = false,
ps = {}
}
mcl_weather.rain.sound_handler = function(player)
@ -50,35 +52,37 @@ end
-- ~~creating manually parctiles instead of particles spawner because of easier to control spawn position~~.
-- why, mcl2, WHY???
-- use particle spawner to not send .. you know hundreds of packets per second for each f*ing rain particle
mcl_weather.rain.add_rain_particlespawner = function(name)
local function get_spawnerdef(dtype)
local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"}
local rt = {
amount = 800,
time = 0,
minpos = vector.new(-15,5,-15),
maxpos = vector.new(15,10,15),
minvel = vector.new(0, 5,0),
maxvel = vector.new(0,-15,0),
minacc = vector.new(0,-10,0),
maxacc = vector.new(0,-30,0),
minexptime = 1,
maxexptime = 1,
minsize = 0.5,
maxsize = 5,
collisiondetection = true,
collision_removal = true,
object_collision = true,
vertical = true,
texture = mcl_weather.rain.get_texture(),
-- animation = {Tile Animation definition},
glow = 0
-- node = {name = "ignore", param2 = 0},
--node_tile = 0,
}
return rt
end
mcl_weather.rain.add_rain_particlespawner = function(name,def)
local player = minetest.get_player_by_name(name)
if not player then return end
if mcl_weather.rain.raining then
minetest.after(0.8,mcl_weather.rain.add_rain_particlespawner,name)
else
return
end
local wind=vector.new(0,0,0)
local size = math.random(0.5, 5)
local texture = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"}
local player_pos = player:get_pos()
local minpos = {x = -25, y = 5, z = -25}
local maxpos = {x = 25, y = 15, z = 25}
local wind_pos=vector.new(0,0,0)
local minp = vector.add(vector.add(player_pos, minpos), wind_pos)
local maxp = vector.add(vector.add(player_pos, maxpos), wind_pos)
local vel = {x = wind.x, y = - mcl_weather.rain.falling_speed, z = wind.z}
local acc = {x = 0, y = -30, z = 0}
local exp = 1
if type(texture) == "table" then
texture=texture[math.random(1,#texture)]
end
mcl_weather.rain.last_rp_count = 0
for i=mcl_weather.rain.particles_count, 1,-1 do
local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player)
@ -86,21 +90,11 @@ mcl_weather.rain.add_rain_particlespawner = function(name)
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1
end
end
local name=player:get_player_name()
if mcl_weather.is_outdoor(player:get_pos()) then
minetest.add_particlespawner({
amount = math.random(mcl_weather.rain.particles_count-100,mcl_weather.rain.particles_count+100),
time=1,
minpos = minp, maxpos = maxp,
minvel = vel, maxvel = vel,
minacc = acc, maxacc = acc,
minexptime = exp, maxexptime = exp,
minsize = size, maxsize= size,
collisiondetection = true, collision_removal = true,
vertical = true,
texture = texture,
playername = player:get_player_name()
})
def.player = name
def.attached = player
mcl_weather.rain.ps[name] = minetest.add_particlespawner(def)
end
mcl_weather.rain.init_done = true
end
@ -126,7 +120,7 @@ mcl_weather.rain.add_player = function(player)
local player_meta = {}
player_meta.origin_sky = {player:get_sky()}
mcl_weather.players[player:get_player_name()] = player_meta
mcl_weather.rain.add_rain_particlespawner(player:get_player_name())
mcl_weather.rain.add_rain_particlespawner(player:get_player_name(),get_spawnerdef("rain"))
end
end
@ -135,13 +129,24 @@ minetest.register_on_joinplayer(function(player)
mcl_weather.rain.add_player(player)
end
end)
minetest.register_on_leaveplayer(function(player)
if mcl_weather.rain.raining then
mcl_weather.rain.remove_player(player)
end
end)
-- remove player from player list effected by rain.
-- be sure to remove sound before removing player otherwise soundhandler reference will be lost.
mcl_weather.rain.remove_player = function(player)
local player_meta = mcl_weather.players[player:get_player_name()]
local name = player:get_player_name()
local player_meta = mcl_weather.players[name]
local ps = mcl_weather.rain.ps[name]
if ps then
minetest.delete_particlespawner(ps,name)
end
mcl_weather.rain.ps[name]=nil
if player_meta ~= nil and player_meta.origin_sky ~= nil then
player:set_clouds({color="#FFF0F0E5"})
mcl_weather.rain.remove_sound(player)
mcl_weather.players[player:get_player_name()] = nil
end
end
@ -200,7 +205,6 @@ mcl_weather.rain.clear = function()
mcl_weather.rain.set_particles_mode("rain")
mcl_weather.skycolor.remove_layer("weather-pack-rain-sky")
for _, player in ipairs(minetest.get_connected_players()) do
mcl_weather.rain.remove_sound(player)
mcl_weather.rain.remove_player(player)
end
end