summaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_particles.cpp
diff options
context:
space:
mode:
authorkhonkhortisan <khonkhortisan@gmail.com>2013-04-22 11:35:10 -0700
committerShadowNinja <shadowninja@minetest.net>2014-01-13 17:34:56 -0500
commit2b1eff772524fca8249fd64028e5cbfeabc127a0 (patch)
treef7d1a231de13db304a2ea1fb945e41b08b38f0f1 /src/script/lua_api/l_particles.cpp
parenta4c5f10ecf4fd49cfbf73580b00c0b4f12ee40cf (diff)
downloadminetest-2b1eff772524fca8249fd64028e5cbfeabc127a0.tar.gz
minetest-2b1eff772524fca8249fd64028e5cbfeabc127a0.tar.bz2
minetest-2b1eff772524fca8249fd64028e5cbfeabc127a0.zip
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
Diffstat (limited to 'src/script/lua_api/l_particles.cpp')
-rw-r--r--src/script/lua_api/l_particles.cpp193
1 files changed, 148 insertions, 45 deletions
diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp
index 6b009149e..088eba06e 100644
--- a/src/script/lua_api/l_particles.cpp
+++ b/src/script/lua_api/l_particles.cpp
@@ -22,93 +22,196 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common/c_converter.h"
#include "server.h"
-// add_particle(pos, velocity, acceleration, expirationtime,
-// size, collisiondetection, texture, player)
+// add_particle({pos=, velocity=, acceleration=, expirationtime=,
+// size=, collisiondetection=, vertical=, texture=, player=})
// pos/velocity/acceleration = {x=num, y=num, z=num}
// expirationtime = num (seconds)
// size = num
+// collisiondetection = bool
+// vertical = bool
// texture = e.g."default_wood.png"
int ModApiParticles::l_add_particle(lua_State *L)
{
// Get parameters
- v3f pos = check_v3f(L, 1);
- v3f vel = check_v3f(L, 2);
- v3f acc = check_v3f(L, 3);
- float expirationtime = luaL_checknumber(L, 4);
- float size = luaL_checknumber(L, 5);
- bool collisiondetection = lua_toboolean(L, 6);
- std::string texture = luaL_checkstring(L, 7);
+ v3f pos, vel, acc;
+ pos= vel= acc= v3f(0, 0, 0);
+ float expirationtime, size;
+ expirationtime= size= 1;
+ bool collisiondetection, vertical;
+ collisiondetection= vertical= false;
+ 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);
- getServer(L)->spawnParticle(playername,
- pos, vel, acc, expirationtime,
- size, collisiondetection, texture);
+ pos = check_v3f(L, 1);
+ vel = check_v3f(L, 2);
+ acc = check_v3f(L, 3);
+ 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 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);
+ }
}
- else // spawn for all players
+ if (strcmp(playername, "")==0) // spawn for all players
{
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;
}
-// add_particlespawner(amount, time,
-// minpos, maxpos,
-// minvel, maxvel,
-// minacc, maxacc,
-// minexptime, maxexptime,
-// minsize, maxsize,
-// collisiondetection,
-// texture,
-// player)
+// add_particlespawner({amount=, time=,
+// minpos=, maxpos=,
+// minvel=, maxvel=,
+// minacc=, maxacc=,
+// minexptime=, maxexptime=,
+// minsize=, maxsize=,
+// collisiondetection=,
+// vertical=,
+// texture=,
+// player=})
// minpos/maxpos/minvel/maxvel/minacc/maxacc = {x=num, y=num, z=num}
// minexptime/maxexptime = num (seconds)
// minsize/maxsize = num
// collisiondetection = bool
+// vertical = bool
// texture = e.g."default_wood.png"
int ModApiParticles::l_add_particlespawner(lua_State *L)
{
// Get parameters
- u16 amount = luaL_checknumber(L, 1);
- float time = luaL_checknumber(L, 2);
- v3f minpos = check_v3f(L, 3);
- v3f maxpos = check_v3f(L, 4);
- v3f minvel = check_v3f(L, 5);
- v3f maxvel = check_v3f(L, 6);
- v3f minacc = check_v3f(L, 7);
- v3f maxacc = check_v3f(L, 8);
- float minexptime = luaL_checknumber(L, 9);
- 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);
+ u16 amount = 1;
+ v3f minpos, maxpos, minvel, maxvel, minacc, maxacc;
+ minpos= maxpos= minvel= maxvel= minacc= maxacc= v3f(0, 0, 0);
+ float time, minexptime, maxexptime, minsize, maxsize;
+ time= minexptime= maxexptime= minsize= maxsize= 1;
+ bool collisiondetection, vertical;
+ collisiondetection= vertical= false;
+ std::string texture = "";
+ const char *playername = "";
- if (lua_gettop(L) == 15) // only spawn for a single player
+ if (lua_gettop(L) > 1) //deprecated
{
- const char *playername = luaL_checkstring(L, 15);
- u32 id = getServer(L)->addParticleSpawner(playername,
- amount, time,
+ amount = luaL_checknumber(L, 1);
+ time = luaL_checknumber(L, 2);
+ minpos = check_v3f(L, 3);
+ maxpos = check_v3f(L, 4);
+ minvel = check_v3f(L, 5);
+ maxvel = check_v3f(L, 6);
+ minacc = check_v3f(L, 7);
+ maxacc = check_v3f(L, 8);
+ minexptime = luaL_checknumber(L, 9);
+ maxexptime = luaL_checknumber(L, 10);
+ 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 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,
minpos, maxpos,
minvel, maxvel,
minacc, maxacc,
minexptime, maxexptime,
minsize, maxsize,
collisiondetection,
+ vertical,
texture);
lua_pushnumber(L, id);
}
- else // spawn for all players
+ else
{
- u32 id = getServer(L)->addParticleSpawnerAll( amount, time,
+ u32 id = getServer(L)->addParticleSpawner(playername,
+ amount, time,
minpos, maxpos,
minvel, maxvel,
minacc, maxacc,
minexptime, maxexptime,
minsize, maxsize,
collisiondetection,
+ vertical,
texture);
lua_pushnumber(L, id);
}