weather, rain: replace add_particle by spawner

This commit is contained in:
cora 2021-09-23 21:38:13 +02:00
parent 3a78211be4
commit a78fe52970
1 changed files with 52 additions and 18 deletions

View File

@ -42,29 +42,62 @@ mcl_weather.rain.set_sky_box = function()
end
end
-- creating manually parctiles instead of particles spawner because of easier to control
-- spawn position.
mcl_weather.rain.add_rain_particles = function(player)
-- ~~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 player = minetest.get_player_by_name(name)
if not player then return end
if mcl_weather.rain.raining then
minetest.after(1,mcl_weather.rain.add_rain_particlespawner,name)
else
return
end
local wind=vector.new(math.random(0,3),0,math.random(0,3))
local falling_speed = math.random(10,15)
local amount = math.random(200,400)
local size = math.random(2,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 wind_pos = vector.multiply(wind, -1)
local minpos = {x = -15, y = 10, z = -15}
local maxpos = {x = 15, y = 10, z = 15}
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 = - falling_speed, z = wind.z}
local acc = {x = 0, y = 0, 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)
if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1
minetest.add_particle({
pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z},
velocity = {x=0, y=-10, z=0},
acceleration = {x=0, y=-30, z=0},
expirationtime = 1.0,
size = math.random(0.5, 3),
collisiondetection = true,
collision_removal = true,
vertical = true,
texture = mcl_weather.rain.get_texture(),
playername = player:get_player_name()
})
end
end
minetest.add_particlespawner({
amount = mcl_weather.rain.particles_count,
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()
})
mcl_weather.rain.init_done = true
end
-- Simple random texture getter
@ -88,6 +121,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())
end
end
@ -173,16 +207,16 @@ mcl_weather.rain.make_weather = function()
mcl_weather.rain.raining = true
mcl_weather.rain.set_sky_box()
mcl_weather.rain.set_particles_mode(mcl_weather.mode)
mcl_weather.rain.init_done = true
end
for _, player in ipairs(minetest.get_connected_players()) do
if mcl_weather.players[player:get_player_name()] == nil then
mcl_weather.rain.add_player(player)
end
if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then
mcl_weather.rain.remove_sound(player)
return false
end
mcl_weather.rain.add_player(player)
mcl_weather.rain.add_rain_particles(player)
mcl_weather.rain.update_sound(player)
end
end