mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 18:13:46 +01:00
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:
parent
a4c5f10ecf
commit
2b1eff7725
@ -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;
|
||||||
}
|
}
|
||||||
|
16
src/server.h
16
src/server.h
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user