forked from Mineclonia/Mineclonia
weather, rain: replace add_particle by spawner
This commit is contained in:
parent
3a78211be4
commit
a78fe52970
|
@ -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,
|
||||
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 = mcl_weather.rain.get_texture(),
|
||||
texture = texture,
|
||||
playername = player:get_player_name()
|
||||
})
|
||||
end
|
||||
end
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue