Allow vertical axis particle rotation constraint

Use tables for adding particles, deprecate former way.

separate particles(pawner) definition, add default values, work with no
arguments
This commit is contained in:
khonkhortisan 2013-04-22 11:35:10 -07:00 committed by ShadowNinja
parent a4c5f10ecf
commit 2b1eff7725
10 changed files with 266 additions and 93 deletions

@ -1462,30 +1462,20 @@ minetest.ban_player(name) -> ban a player
minetest.unban_player_or_ip(name) -> unban player or IP address minetest.unban_player_or_ip(name) -> unban player or IP address
Particles: Particles:
minetest.add_particle(pos, velocity, acceleration, expirationtime, minetest.add_particle(particle definition)
^ Deprecated: minetest.add_particle(pos, velocity, acceleration, expirationtime,
size, collisiondetection, texture, playername) size, collisiondetection, texture, playername)
^ Spawn particle at pos with velocity and acceleration
^ Disappears after expirationtime seconds
^ collisiondetection: if true collides with physical objects
^ Uses texture (string)
^ Playername is optional, if specified spawns particle only on the player's client
minetest.add_particlespawner(amount, time, minetest.add_particlespawner(particlespawner definition)
^ Add a particlespawner, an object that spawns an amount of particles over time seconds
^ Returns an id
^ Deprecated: minetest.add_particlespawner(amount, time,
minpos, maxpos, minpos, maxpos,
minvel, maxvel, minvel, maxvel,
minacc, maxacc, minacc, maxacc,
minexptime, maxexptime, minexptime, maxexptime,
minsize, maxsize, minsize, maxsize,
collisiondetection, texture, playername) collisiondetection, texture, playername)
^ Add a particlespawner, an object that spawns an amount of particles over time seconds
^ The particle's properties are random values in between the boundings:
^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
^ minsize/maxsize, minexptime/maxexptime (expirationtime)
^ collisiondetection: if true uses collisiondetection
^ Uses texture (string)
^ Playername is optional, if specified spawns particle only on the player's client
^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
^ Returns and id
minetest.delete_particlespawner(id, player) minetest.delete_particlespawner(id, player)
^ Delete ParticleSpawner with id (return value from add_particlespawner) ^ Delete ParticleSpawner with id (return value from add_particlespawner)
@ -2443,3 +2433,50 @@ HUD Definition (hud_add, hud_get)
offset = {x=0, y=0}, offset = {x=0, y=0},
^ See "HUD Element Types" ^ See "HUD Element Types"
} }
Particle definition (add_particle)
{
pos = {x=0, y=0, z=0},
velocity = {x=0, y=0, z=0},
acceleration = {x=0, y=0, z=0},
^ Spawn particle at pos with velocity and acceleration
expirationtime = 1,
^ Disappears after expirationtime seconds
size = 1,
collisiondetection = false,
^ collisiondetection: if true collides with physical objects
vertical = false,
^ vertical: if true faces player using y axis only
texture = "image.png",
^ Uses texture (string)
playername = "singleplayer"
^ Playername is optional, if specified spawns particle only on the player's client
}
Particlespawner definition (add_particlespawner)
{
amount = 1,
time = 1,
^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
minpos = {x=0, y=0, z=0},
maxpos = {x=0, y=0, z=0},
minvel = {x=0, y=0, z=0},
maxvel = {x=0, y=0, z=0},
minacc = {x=0, y=0, z=0},
maxacc = {x=0, y=0, z=0},
minexptime = 1,
maxexptime = 1,
minsize = 1,
maxsize = 1,
^ The particle's properties are random values in between the boundings:
^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
^ minsize/maxsize, minexptime/maxexptime (expirationtime)
collisiondetection = false,
^ collisiondetection: if true uses collisiondetection
vertical = false,
^ vertical: if true faces player using y axis only
texture = "image.png",
^ Uses texture (string)
playername = "singleplayer"
^ Playername is optional, if specified spawns particle only on the player's client
}

@ -1844,6 +1844,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
float size = readF1000(is); float size = readF1000(is);
bool collisiondetection = readU8(is); bool collisiondetection = readU8(is);
std::string texture = deSerializeLongString(is); std::string texture = deSerializeLongString(is);
bool vertical = false;
try {
vertical = readU8(is);
} catch (...) {}
ClientEvent event; ClientEvent event;
event.type = CE_SPAWN_PARTICLE; event.type = CE_SPAWN_PARTICLE;
@ -1855,6 +1859,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
event.spawn_particle.size = size; event.spawn_particle.size = size;
event.spawn_particle.collisiondetection = event.spawn_particle.collisiondetection =
collisiondetection; collisiondetection;
event.spawn_particle.vertical = vertical;
event.spawn_particle.texture = new std::string(texture); event.spawn_particle.texture = new std::string(texture);
m_client_event_queue.push_back(event); m_client_event_queue.push_back(event);
@ -1879,6 +1884,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
bool collisiondetection = readU8(is); bool collisiondetection = readU8(is);
std::string texture = deSerializeLongString(is); std::string texture = deSerializeLongString(is);
u32 id = readU32(is); u32 id = readU32(is);
bool vertical = false;
try {
vertical = readU8(is);
} catch (...) {}
ClientEvent event; ClientEvent event;
event.type = CE_ADD_PARTICLESPAWNER; event.type = CE_ADD_PARTICLESPAWNER;
@ -1897,6 +1906,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
event.add_particlespawner.minsize = minsize; event.add_particlespawner.minsize = minsize;
event.add_particlespawner.maxsize = maxsize; event.add_particlespawner.maxsize = maxsize;
event.add_particlespawner.collisiondetection = collisiondetection; event.add_particlespawner.collisiondetection = collisiondetection;
event.add_particlespawner.vertical = vertical;
event.add_particlespawner.texture = new std::string(texture); event.add_particlespawner.texture = new std::string(texture);
event.add_particlespawner.id = id; event.add_particlespawner.id = id;

@ -168,6 +168,7 @@ struct ClientEvent
f32 expirationtime; f32 expirationtime;
f32 size; f32 size;
bool collisiondetection; bool collisiondetection;
bool vertical;
std::string *texture; std::string *texture;
} spawn_particle; } spawn_particle;
struct{ struct{
@ -184,6 +185,7 @@ struct ClientEvent
f32 minsize; f32 minsize;
f32 maxsize; f32 maxsize;
bool collisiondetection; bool collisiondetection;
bool vertical;
std::string *texture; std::string *texture;
u32 id; u32 id;
} add_particlespawner; } add_particlespawner;

@ -419,6 +419,7 @@ enum ToClientCommand
f1000 expirationtime f1000 expirationtime
f1000 size f1000 size
u8 bool collisiondetection u8 bool collisiondetection
u8 bool vertical
u32 len u32 len
u8[len] texture u8[len] texture
*/ */
@ -439,6 +440,7 @@ enum ToClientCommand
f1000 minsize f1000 minsize
f1000 maxsize f1000 maxsize
u8 bool collisiondetection u8 bool collisiondetection
u8 bool vertical
u32 len u32 len
u8[len] texture u8[len] texture
u32 id u32 id

@ -2321,6 +2321,7 @@ void the_game(
event.spawn_particle.expirationtime, event.spawn_particle.expirationtime,
event.spawn_particle.size, event.spawn_particle.size,
event.spawn_particle.collisiondetection, event.spawn_particle.collisiondetection,
event.spawn_particle.vertical,
texture, texture,
v2f(0.0, 0.0), v2f(0.0, 0.0),
v2f(1.0, 1.0)); v2f(1.0, 1.0));
@ -2345,6 +2346,7 @@ void the_game(
event.add_particlespawner.minsize, event.add_particlespawner.minsize,
event.add_particlespawner.maxsize, event.add_particlespawner.maxsize,
event.add_particlespawner.collisiondetection, event.add_particlespawner.collisiondetection,
event.add_particlespawner.vertical,
texture, texture,
event.add_particlespawner.id); event.add_particlespawner.id);
} }

@ -57,6 +57,7 @@ Particle::Particle(
float expirationtime, float expirationtime,
float size, float size,
bool collisiondetection, bool collisiondetection,
bool vertical,
video::ITexture *texture, video::ITexture *texture,
v2f texpos, v2f texpos,
v2f texsize v2f texsize
@ -86,6 +87,7 @@ Particle::Particle(
m_player = player; m_player = player;
m_size = size; m_size = size;
m_collisiondetection = collisiondetection; m_collisiondetection = collisiondetection;
m_vertical = vertical;
// Irrlicht stuff // Irrlicht stuff
m_collisionbox = core::aabbox3d<f32> m_collisionbox = core::aabbox3d<f32>
@ -199,8 +201,13 @@ void Particle::updateVertices()
for(u16 i=0; i<4; i++) for(u16 i=0; i<4; i++)
{ {
m_vertices[i].Pos.rotateYZBy(m_player->getPitch()); if (m_vertical) {
m_vertices[i].Pos.rotateXZBy(m_player->getYaw()); v3f ppos = m_player->getPosition()/BS;
m_vertices[i].Pos.rotateXZBy(atan2(ppos.Z-m_pos.Z, ppos.X-m_pos.X)/core::DEGTORAD+90);
} else {
m_vertices[i].Pos.rotateYZBy(m_player->getPitch());
m_vertices[i].Pos.rotateXZBy(m_player->getYaw());
}
m_box.addInternalPoint(m_vertices[i].Pos); m_box.addInternalPoint(m_vertices[i].Pos);
m_vertices[i].Pos += m_pos*BS; m_vertices[i].Pos += m_pos*BS;
} }
@ -293,6 +300,7 @@ void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr,
rand()%100/100., // expiration time rand()%100/100., // expiration time
visual_size, visual_size,
true, true,
false,
texture, texture,
texpos, texpos,
texsize); texsize);
@ -306,7 +314,7 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
u16 amount, float time, u16 amount, float time,
v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minsize, float maxsize, float minexptime, float maxexptime, float minsize, float maxsize,
bool collisiondetection, video::ITexture *texture, u32 id) bool collisiondetection, bool vertical, video::ITexture *texture, u32 id)
{ {
m_gamedef = gamedef; m_gamedef = gamedef;
m_smgr = smgr; m_smgr = smgr;
@ -324,6 +332,7 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
m_minsize = minsize; m_minsize = minsize;
m_maxsize = maxsize; m_maxsize = maxsize;
m_collisiondetection = collisiondetection; m_collisiondetection = collisiondetection;
m_vertical = vertical;
m_texture = texture; m_texture = texture;
m_time = 0; m_time = 0;
@ -372,6 +381,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment &env)
exptime, exptime,
size, size,
m_collisiondetection, m_collisiondetection,
m_vertical,
m_texture, m_texture,
v2f(0.0, 0.0), v2f(0.0, 0.0),
v2f(1.0, 1.0)); v2f(1.0, 1.0));
@ -410,6 +420,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment &env)
exptime, exptime,
size, size,
m_collisiondetection, m_collisiondetection,
m_vertical,
m_texture, m_texture,
v2f(0.0, 0.0), v2f(0.0, 0.0),
v2f(1.0, 1.0)); v2f(1.0, 1.0));

@ -42,6 +42,7 @@ class Particle : public scene::ISceneNode
float expirationtime, float expirationtime,
float size, float size,
bool collisiondetection, bool collisiondetection,
bool vertical,
video::ITexture *texture, video::ITexture *texture,
v2f texpos, v2f texpos,
v2f texsize v2f texsize
@ -92,6 +93,7 @@ private:
float m_size; float m_size;
u8 m_light; u8 m_light;
bool m_collisiondetection; bool m_collisiondetection;
bool m_vertical;
}; };
class ParticleSpawner class ParticleSpawner
@ -108,6 +110,7 @@ class ParticleSpawner
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, bool collisiondetection,
bool vertical,
video::ITexture *texture, video::ITexture *texture,
u32 id); u32 id);
@ -138,6 +141,7 @@ class ParticleSpawner
video::ITexture *m_texture; video::ITexture *m_texture;
std::vector<float> m_spawntimes; std::vector<float> m_spawntimes;
bool m_collisiondetection; bool m_collisiondetection;
bool m_vertical;
}; };
void allparticles_step (float dtime, ClientEnvironment &env); void allparticles_step (float dtime, ClientEnvironment &env);

@ -22,85 +22,173 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common/c_converter.h" #include "common/c_converter.h"
#include "server.h" #include "server.h"
// add_particle(pos, velocity, acceleration, expirationtime, // add_particle({pos=, velocity=, acceleration=, expirationtime=,
// size, collisiondetection, texture, player) // size=, collisiondetection=, vertical=, texture=, player=})
// pos/velocity/acceleration = {x=num, y=num, z=num} // pos/velocity/acceleration = {x=num, y=num, z=num}
// expirationtime = num (seconds) // expirationtime = num (seconds)
// size = num // size = num
// collisiondetection = bool
// vertical = bool
// texture = e.g."default_wood.png" // texture = e.g."default_wood.png"
int ModApiParticles::l_add_particle(lua_State *L) int ModApiParticles::l_add_particle(lua_State *L)
{ {
// Get parameters // Get parameters
v3f pos = check_v3f(L, 1); v3f pos, vel, acc;
v3f vel = check_v3f(L, 2); pos= vel= acc= v3f(0, 0, 0);
v3f acc = check_v3f(L, 3); float expirationtime, size;
float expirationtime = luaL_checknumber(L, 4); expirationtime= size= 1;
float size = luaL_checknumber(L, 5); bool collisiondetection, vertical;
bool collisiondetection = lua_toboolean(L, 6); collisiondetection= vertical= false;
std::string texture = luaL_checkstring(L, 7); std::string texture = "";
const char *playername = "";
if (lua_gettop(L) == 8) // only spawn for a single player if (lua_gettop(L) > 1) // deprecated
{ {
const char *playername = luaL_checkstring(L, 8); pos = check_v3f(L, 1);
getServer(L)->spawnParticle(playername, vel = check_v3f(L, 2);
pos, vel, acc, expirationtime, acc = check_v3f(L, 3);
size, collisiondetection, texture); expirationtime = luaL_checknumber(L, 4);
size = luaL_checknumber(L, 5);
collisiondetection = lua_toboolean(L, 6);
texture = luaL_checkstring(L, 7);
if (lua_gettop(L) == 8) // only spawn for a single player
playername = luaL_checkstring(L, 8);
} }
else // spawn for all players else if (lua_istable(L, 1))
{
int table = lua_gettop(L);
lua_pushnil(L);
while (lua_next(L, table) != 0)
{
const char *key = lua_tostring(L, -2);
if(strcmp(key,"pos")==0){
pos=check_v3f(L, -1);
}else if(strcmp(key,"vel")==0){
vel=check_v3f(L, -1);
}else if(strcmp(key,"acc")==0){
acc=check_v3f(L, -1);
}else if(strcmp(key,"expirationtime")==0){
expirationtime=luaL_checknumber(L, -1);
}else if(strcmp(key,"size")==0){
size=luaL_checknumber(L, -1);
}else if(strcmp(key,"collisiondetection")==0){
collisiondetection=lua_toboolean(L, -1);
}else if(strcmp(key,"vertical")==0){
vertical=lua_toboolean(L, -1);
}else if(strcmp(key,"texture")==0){
texture=luaL_checkstring(L, -1);
}else if(strcmp(key,"playername")==0){
playername=luaL_checkstring(L, -1);
}
lua_pop(L, 1);
}
}
if (strcmp(playername, "")==0) // spawn for all players
{ {
getServer(L)->spawnParticleAll(pos, vel, acc, getServer(L)->spawnParticleAll(pos, vel, acc,
expirationtime, size, collisiondetection, texture); expirationtime, size, collisiondetection, vertical, texture);
}
else
{
getServer(L)->spawnParticle(playername,
pos, vel, acc, expirationtime,
size, collisiondetection, vertical, texture);
} }
return 1; return 1;
} }
// add_particlespawner(amount, time, // add_particlespawner({amount=, time=,
// minpos, maxpos, // minpos=, maxpos=,
// minvel, maxvel, // minvel=, maxvel=,
// minacc, maxacc, // minacc=, maxacc=,
// minexptime, maxexptime, // minexptime=, maxexptime=,
// minsize, maxsize, // minsize=, maxsize=,
// collisiondetection, // collisiondetection=,
// texture, // vertical=,
// player) // texture=,
// player=})
// minpos/maxpos/minvel/maxvel/minacc/maxacc = {x=num, y=num, z=num} // minpos/maxpos/minvel/maxvel/minacc/maxacc = {x=num, y=num, z=num}
// minexptime/maxexptime = num (seconds) // minexptime/maxexptime = num (seconds)
// minsize/maxsize = num // minsize/maxsize = num
// collisiondetection = bool // collisiondetection = bool
// vertical = bool
// texture = e.g."default_wood.png" // texture = e.g."default_wood.png"
int ModApiParticles::l_add_particlespawner(lua_State *L) int ModApiParticles::l_add_particlespawner(lua_State *L)
{ {
// Get parameters // Get parameters
u16 amount = luaL_checknumber(L, 1); u16 amount = 1;
float time = luaL_checknumber(L, 2); v3f minpos, maxpos, minvel, maxvel, minacc, maxacc;
v3f minpos = check_v3f(L, 3); minpos= maxpos= minvel= maxvel= minacc= maxacc= v3f(0, 0, 0);
v3f maxpos = check_v3f(L, 4); float time, minexptime, maxexptime, minsize, maxsize;
v3f minvel = check_v3f(L, 5); time= minexptime= maxexptime= minsize= maxsize= 1;
v3f maxvel = check_v3f(L, 6); bool collisiondetection, vertical;
v3f minacc = check_v3f(L, 7); collisiondetection= vertical= false;
v3f maxacc = check_v3f(L, 8); std::string texture = "";
float minexptime = luaL_checknumber(L, 9); const char *playername = "";
float maxexptime = luaL_checknumber(L, 10);
float minsize = luaL_checknumber(L, 11);
float maxsize = luaL_checknumber(L, 12);
bool collisiondetection = lua_toboolean(L, 13);
std::string texture = luaL_checkstring(L, 14);
if (lua_gettop(L) == 15) // only spawn for a single player if (lua_gettop(L) > 1) //deprecated
{ {
const char *playername = luaL_checkstring(L, 15); amount = luaL_checknumber(L, 1);
u32 id = getServer(L)->addParticleSpawner(playername, time = luaL_checknumber(L, 2);
amount, time, minpos = check_v3f(L, 3);
minpos, maxpos, maxpos = check_v3f(L, 4);
minvel, maxvel, minvel = check_v3f(L, 5);
minacc, maxacc, maxvel = check_v3f(L, 6);
minexptime, maxexptime, minacc = check_v3f(L, 7);
minsize, maxsize, maxacc = check_v3f(L, 8);
collisiondetection, minexptime = luaL_checknumber(L, 9);
texture); maxexptime = luaL_checknumber(L, 10);
lua_pushnumber(L, id); minsize = luaL_checknumber(L, 11);
maxsize = luaL_checknumber(L, 12);
collisiondetection = lua_toboolean(L, 13);
texture = luaL_checkstring(L, 14);
if (lua_gettop(L) == 15) // only spawn for a single player
playername = luaL_checkstring(L, 15);
} }
else // spawn for all players else if (lua_istable(L, 1))
{
int table = lua_gettop(L);
lua_pushnil(L);
while (lua_next(L, table) != 0)
{
const char *key = lua_tostring(L, -2);
if(strcmp(key,"amount")==0){
amount=luaL_checknumber(L, -1);
}else if(strcmp(key,"time")==0){
time=luaL_checknumber(L, -1);
}else if(strcmp(key,"minpos")==0){
minpos=check_v3f(L, -1);
}else if(strcmp(key,"maxpos")==0){
maxpos=check_v3f(L, -1);
}else if(strcmp(key,"minvel")==0){
minvel=check_v3f(L, -1);
}else if(strcmp(key,"maxvel")==0){
maxvel=check_v3f(L, -1);
}else if(strcmp(key,"minacc")==0){
minacc=check_v3f(L, -1);
}else if(strcmp(key,"maxacc")==0){
maxacc=check_v3f(L, -1);
}else if(strcmp(key,"minexptime")==0){
minexptime=luaL_checknumber(L, -1);
}else if(strcmp(key,"maxexptime")==0){
maxexptime=luaL_checknumber(L, -1);
}else if(strcmp(key,"minsize")==0){
minsize=luaL_checknumber(L, -1);
}else if(strcmp(key,"maxsize")==0){
maxsize=luaL_checknumber(L, -1);
}else if(strcmp(key,"collisiondetection")==0){
collisiondetection=lua_toboolean(L, -1);
}else if(strcmp(key,"vertical")==0){
vertical=lua_toboolean(L, -1);
}else if(strcmp(key,"texture")==0){
texture=luaL_checkstring(L, -1);
}else if(strcmp(key,"playername")==0){
playername=luaL_checkstring(L, -1);
}
lua_pop(L, 1);
}
}
if (strcmp(playername, "")==0) //spawn for all players
{ {
u32 id = getServer(L)->addParticleSpawnerAll( amount, time, u32 id = getServer(L)->addParticleSpawnerAll( amount, time,
minpos, maxpos, minpos, maxpos,
@ -109,6 +197,21 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
minexptime, maxexptime, minexptime, maxexptime,
minsize, maxsize, minsize, maxsize,
collisiondetection, collisiondetection,
vertical,
texture);
lua_pushnumber(L, id);
}
else
{
u32 id = getServer(L)->addParticleSpawner(playername,
amount, time,
minpos, maxpos,
minvel, maxvel,
minacc, maxacc,
minexptime, maxexptime,
minsize, maxsize,
collisiondetection,
vertical,
texture); texture);
lua_pushnumber(L, id); lua_pushnumber(L, id);
} }

@ -3573,7 +3573,7 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec,
// Spawns a particle on peer with peer_id // Spawns a particle on peer with peer_id
void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration, void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, bool collisiondetection, float expirationtime, float size, bool collisiondetection,
std::string texture) bool vertical, std::string texture)
{ {
DSTACK(__FUNCTION_NAME); DSTACK(__FUNCTION_NAME);
@ -3586,6 +3586,7 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
writeF1000(os, size); writeF1000(os, size);
writeU8(os, collisiondetection); writeU8(os, collisiondetection);
os<<serializeLongString(texture); os<<serializeLongString(texture);
writeU8(os, vertical);
// Make data buffer // Make data buffer
std::string s = os.str(); std::string s = os.str();
@ -3597,7 +3598,7 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
// Spawns a particle on all peers // Spawns a particle on all peers
void Server::SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration, void Server::SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, bool collisiondetection, float expirationtime, float size, bool collisiondetection,
std::string texture) bool vertical, std::string texture)
{ {
for(std::map<u16, RemoteClient*>::iterator for(std::map<u16, RemoteClient*>::iterator
i = m_clients.begin(); i = m_clients.begin();
@ -3610,14 +3611,14 @@ void Server::SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
continue; continue;
SendSpawnParticle(client->peer_id, pos, velocity, acceleration, SendSpawnParticle(client->peer_id, pos, velocity, acceleration,
expirationtime, size, collisiondetection, texture); expirationtime, size, collisiondetection, vertical, texture);
} }
} }
// Adds a ParticleSpawner on peer with peer_id // Adds a ParticleSpawner on peer with peer_id
void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos, void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos,
v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime,
float minsize, float maxsize, bool collisiondetection, std::string texture, u32 id) float minsize, float maxsize, bool collisiondetection, bool vertical, std::string texture, u32 id)
{ {
DSTACK(__FUNCTION_NAME); DSTACK(__FUNCTION_NAME);
@ -3639,6 +3640,7 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3
writeU8(os, collisiondetection); writeU8(os, collisiondetection);
os<<serializeLongString(texture); os<<serializeLongString(texture);
writeU32(os, id); writeU32(os, id);
writeU8(os, vertical);
// Make data buffer // Make data buffer
std::string s = os.str(); std::string s = os.str();
@ -3650,7 +3652,7 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3
// Adds a ParticleSpawner on all peers // Adds a ParticleSpawner on all peers
void Server::SendAddParticleSpawnerAll(u16 amount, float spawntime, v3f minpos, v3f maxpos, void Server::SendAddParticleSpawnerAll(u16 amount, float spawntime, v3f minpos, v3f maxpos,
v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime,
float minsize, float maxsize, bool collisiondetection, std::string texture, u32 id) float minsize, float maxsize, bool collisiondetection, bool vertical, std::string texture, u32 id)
{ {
for(std::map<u16, RemoteClient*>::iterator for(std::map<u16, RemoteClient*>::iterator
i = m_clients.begin(); i = m_clients.begin();
@ -3664,7 +3666,7 @@ void Server::SendAddParticleSpawnerAll(u16 amount, float spawntime, v3f minpos,
SendAddParticleSpawner(client->peer_id, amount, spawntime, SendAddParticleSpawner(client->peer_id, amount, spawntime,
minpos, maxpos, minvel, maxvel, minacc, maxacc, minpos, maxpos, minvel, maxvel, minacc, maxacc,
minexptime, maxexptime, minsize, maxsize, collisiondetection, texture, id); minexptime, maxexptime, minsize, maxsize, collisiondetection, vertical, texture, id);
} }
} }
@ -5051,21 +5053,21 @@ void Server::notifyPlayers(const std::wstring msg)
void Server::spawnParticle(const char *playername, v3f pos, void Server::spawnParticle(const char *playername, v3f pos,
v3f velocity, v3f acceleration, v3f velocity, v3f acceleration,
float expirationtime, float size, bool float expirationtime, float size, bool
collisiondetection, std::string texture) collisiondetection, bool vertical, std::string texture)
{ {
Player *player = m_env->getPlayer(playername); Player *player = m_env->getPlayer(playername);
if(!player) if(!player)
return; return;
SendSpawnParticle(player->peer_id, pos, velocity, acceleration, SendSpawnParticle(player->peer_id, pos, velocity, acceleration,
expirationtime, size, collisiondetection, texture); expirationtime, size, collisiondetection, vertical, texture);
} }
void Server::spawnParticleAll(v3f pos, v3f velocity, v3f acceleration, void Server::spawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, float expirationtime, float size,
bool collisiondetection, std::string texture) bool collisiondetection, bool vertical, std::string texture)
{ {
SendSpawnParticleAll(pos, velocity, acceleration, SendSpawnParticleAll(pos, velocity, acceleration,
expirationtime, size, collisiondetection, texture); expirationtime, size, collisiondetection, vertical, texture);
} }
u32 Server::addParticleSpawner(const char *playername, u32 Server::addParticleSpawner(const char *playername,
@ -5075,7 +5077,7 @@ u32 Server::addParticleSpawner(const char *playername,
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture) bool collisiondetection, bool vertical, std::string texture)
{ {
Player *player = m_env->getPlayer(playername); Player *player = m_env->getPlayer(playername);
if(!player) if(!player)
@ -5097,7 +5099,7 @@ u32 Server::addParticleSpawner(const char *playername,
SendAddParticleSpawner(player->peer_id, amount, spawntime, SendAddParticleSpawner(player->peer_id, amount, spawntime,
minpos, maxpos, minvel, maxvel, minacc, maxacc, minpos, maxpos, minvel, maxvel, minacc, maxacc,
minexptime, maxexptime, minsize, maxsize, minexptime, maxexptime, minsize, maxsize,
collisiondetection, texture, id); collisiondetection, vertical, texture, id);
return id; return id;
} }
@ -5108,7 +5110,7 @@ u32 Server::addParticleSpawnerAll(u16 amount, float spawntime,
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture) bool collisiondetection, bool vertical, std::string texture)
{ {
u32 id = 0; u32 id = 0;
for(;;) // look for unused particlespawner id for(;;) // look for unused particlespawner id
@ -5126,7 +5128,7 @@ u32 Server::addParticleSpawnerAll(u16 amount, float spawntime,
SendAddParticleSpawnerAll(amount, spawntime, SendAddParticleSpawnerAll(amount, spawntime,
minpos, maxpos, minvel, maxvel, minacc, maxacc, minpos, maxpos, minvel, maxvel, minacc, maxacc,
minexptime, maxexptime, minsize, maxsize, minexptime, maxexptime, minsize, maxsize,
collisiondetection, texture, id); collisiondetection, vertical, texture, id);
return id; return id;
} }

@ -389,11 +389,11 @@ public:
void spawnParticle(const char *playername, void spawnParticle(const char *playername,
v3f pos, v3f velocity, v3f acceleration, v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, float expirationtime, float size,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration, void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, float expirationtime, float size,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
u32 addParticleSpawner(const char *playername, u32 addParticleSpawner(const char *playername,
u16 amount, float spawntime, u16 amount, float spawntime,
@ -402,7 +402,7 @@ public:
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
u32 addParticleSpawnerAll(u16 amount, float spawntime, u32 addParticleSpawnerAll(u16 amount, float spawntime,
v3f minpos, v3f maxpos, v3f minpos, v3f maxpos,
@ -410,7 +410,7 @@ public:
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
void deleteParticleSpawner(const char *playername, u32 id); void deleteParticleSpawner(const char *playername, u32 id);
void deleteParticleSpawnerAll(u32 id); void deleteParticleSpawnerAll(u32 id);
@ -556,7 +556,7 @@ private:
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture, u32 id); bool collisiondetection, bool vertical, std::string texture, u32 id);
// Adds a ParticleSpawner on all peers // Adds a ParticleSpawner on all peers
void SendAddParticleSpawnerAll(u16 amount, float spawntime, void SendAddParticleSpawnerAll(u16 amount, float spawntime,
@ -565,7 +565,7 @@ private:
v3f minacc, v3f maxacc, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minexptime, float maxexptime,
float minsize, float maxsize, float minsize, float maxsize,
bool collisiondetection, std::string texture, u32 id); bool collisiondetection, bool vertical, std::string texture, u32 id);
// Deletes ParticleSpawner on a single client // Deletes ParticleSpawner on a single client
void SendDeleteParticleSpawner(u16 peer_id, u32 id); void SendDeleteParticleSpawner(u16 peer_id, u32 id);
@ -577,12 +577,12 @@ private:
void SendSpawnParticle(u16 peer_id, void SendSpawnParticle(u16 peer_id,
v3f pos, v3f velocity, v3f acceleration, v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, float expirationtime, float size,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
// Spawns particle on all clients // Spawns particle on all clients
void SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration, void SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, float expirationtime, float size,
bool collisiondetection, std::string texture); bool collisiondetection, bool vertical, std::string texture);
/* /*
Something random Something random