forked from Mineclonia/Mineclonia
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:
parent
a35c5b66cb
commit
98eb0a1860
|
@ -21,6 +21,8 @@ mcl_weather.rain = {
|
||||||
sky_last_update = -1,
|
sky_last_update = -1,
|
||||||
|
|
||||||
init_done = false,
|
init_done = false,
|
||||||
|
|
||||||
|
ps = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
mcl_weather.rain.sound_handler = function(player)
|
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~~.
|
-- ~~creating manually parctiles instead of particles spawner because of easier to control spawn position~~.
|
||||||
-- why, mcl2, WHY???
|
-- why, mcl2, WHY???
|
||||||
-- use particle spawner to not send .. you know hundreds of packets per second for each f*ing rain particle
|
-- 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)
|
local player = minetest.get_player_by_name(name)
|
||||||
if not player then return end
|
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
|
mcl_weather.rain.last_rp_count = 0
|
||||||
for i=mcl_weather.rain.particles_count, 1,-1 do
|
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)
|
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
|
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
local name=player:get_player_name()
|
||||||
if mcl_weather.is_outdoor(player:get_pos()) then
|
if mcl_weather.is_outdoor(player:get_pos()) then
|
||||||
minetest.add_particlespawner({
|
def.player = name
|
||||||
amount = math.random(mcl_weather.rain.particles_count-100,mcl_weather.rain.particles_count+100),
|
def.attached = player
|
||||||
time=1,
|
mcl_weather.rain.ps[name] = minetest.add_particlespawner(def)
|
||||||
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()
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
mcl_weather.rain.init_done = true
|
mcl_weather.rain.init_done = true
|
||||||
end
|
end
|
||||||
|
@ -126,7 +120,7 @@ mcl_weather.rain.add_player = function(player)
|
||||||
local player_meta = {}
|
local player_meta = {}
|
||||||
player_meta.origin_sky = {player:get_sky()}
|
player_meta.origin_sky = {player:get_sky()}
|
||||||
mcl_weather.players[player:get_player_name()] = player_meta
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -135,13 +129,24 @@ minetest.register_on_joinplayer(function(player)
|
||||||
mcl_weather.rain.add_player(player)
|
mcl_weather.rain.add_player(player)
|
||||||
end
|
end
|
||||||
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.
|
-- remove player from player list effected by rain.
|
||||||
-- be sure to remove sound before removing player otherwise soundhandler reference will be lost.
|
-- be sure to remove sound before removing player otherwise soundhandler reference will be lost.
|
||||||
mcl_weather.rain.remove_player = function(player)
|
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
|
if player_meta ~= nil and player_meta.origin_sky ~= nil then
|
||||||
player:set_clouds({color="#FFF0F0E5"})
|
player:set_clouds({color="#FFF0F0E5"})
|
||||||
|
mcl_weather.rain.remove_sound(player)
|
||||||
mcl_weather.players[player:get_player_name()] = nil
|
mcl_weather.players[player:get_player_name()] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -200,7 +205,6 @@ mcl_weather.rain.clear = function()
|
||||||
mcl_weather.rain.set_particles_mode("rain")
|
mcl_weather.rain.set_particles_mode("rain")
|
||||||
mcl_weather.skycolor.remove_layer("weather-pack-rain-sky")
|
mcl_weather.skycolor.remove_layer("weather-pack-rain-sky")
|
||||||
for _, player in ipairs(minetest.get_connected_players()) do
|
for _, player in ipairs(minetest.get_connected_players()) do
|
||||||
mcl_weather.rain.remove_sound(player)
|
|
||||||
mcl_weather.rain.remove_player(player)
|
mcl_weather.rain.remove_player(player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue