aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api
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
parenta4c5f10ecf4fd49cfbf73580b00c0b4f12ee40cf (diff)
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')
-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);
}