physical = true,
weight = 5,
boundingbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
- visual = "box",
+ visual = "cube",
textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
-- Initial value for our timer
timer = 0,
state_variables = {"timer"},
}
--- Called after object is created
-function TNT:on_create()
- print("TNT:on_create()")
-end
-
-- Called periodically
function TNT:on_step(dtime)
--print("TNT:on_step()")
ServerActiveObject(env, pos),
m_init_name(name),
m_init_state(state),
- m_registered(false)
+ m_registered(false),
+ m_prop(new LuaEntityProperties)
{
+ // Only register type if no environment supplied
if(env == NULL){
ServerActiveObject::registerType(getType(), create);
return;
lua_State *L = m_env->getLua();
scriptapi_luaentity_rm(L, m_id);
}
+ delete m_prop;
}
void LuaEntitySAO::addedToEnvironment(u16 id)
m_registered = true;
lua_State *L = m_env->getLua();
scriptapi_luaentity_add(L, id, m_init_name.c_str(), m_init_state.c_str());
+
+ // Get properties
+ *m_prop = scriptapi_luaentity_get_properties(L, m_id);
+ infostream<<"m_prop->visual="<<m_prop->visual<<std::endl;
}
ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,
Settings *m_properties;
};
-struct LuaState;
+struct LuaEntityProperties;
class LuaEntitySAO : public ServerActiveObject
{
std::string m_init_name;
std::string m_init_state;
bool m_registered;
+ struct LuaEntityProperties *m_prop;
};
#endif
exit(EXIT_FAILURE);
}
-void script_call_va(lua_State *L, const char *func, const char *sig, ...)
-{
- va_list vl;
- int narg, nres; /* number of arguments and results */
-
- va_start(vl, sig);
- lua_getglobal(L, func); /* push function */
-
- for (narg = 0; *sig; narg++) {
- /* repeat for each argument */
- /* check stack space */
- luaL_checkstack(L, 1, "too many arguments");
- switch (*sig++) {
- case 'd': /* double argument */
- lua_pushnumber(L, va_arg(vl, double));
- break;
- case 'i': /* int argument */
- lua_pushinteger(L, va_arg(vl, int));
- break;
- case 's': /* string argument */
- lua_pushstring(L, va_arg(vl, char *));
- break;
- case '>': /* end of arguments */
- goto endargs;
- default:
- script_error(L, "invalid option (%c)", *(sig - 1));
- }
- }
-endargs:
-
- nres = strlen(sig); /* number of expected results */
-
- if (lua_pcall(L, narg, nres, 0) != 0) /* do the call */
- script_error(L, "error calling '%s': %s", func, lua_tostring(L, -1));
-
- nres = -nres; /* stack index of first result */
- while (*sig) { /* repeat for each result */
- switch (*sig++) {
- case 'd': /* double result */
- if (!lua_isnumber(L, nres))
- script_error(L, "wrong result type");
- *va_arg(vl, double *) = lua_tonumber(L, nres);
- break;
- case 'i': /* int result */
- if (!lua_isnumber(L, nres))
- script_error(L, "wrong result type");
- *va_arg(vl, int *) = lua_tointeger(L, nres);
- break;
- case 's': /* string result */
- if (!lua_isstring(L, nres))
- script_error(L, "wrong result type");
- *va_arg(vl, const char **) = lua_tostring(L, nres);
- break;
- default:
- script_error(L, "invalid option (%c)", *(sig - 1));
- }
- nres++;
- }
-
- va_end(vl);
-}
-
bool script_load(lua_State *L, const char *path)
{
infostream<<"Loading and running script from "<<path<<std::endl;
lua_State* script_init();
lua_State* script_deinit(lua_State *L);
void script_error(lua_State *L, const char *fmt, ...);
-void script_call_va(lua_State *L, const char *func, const char *sig, ...);
bool script_load(lua_State *L, const char *path);
#endif
luaL_typerror(L, -1, "ObjectRef");
lua_setfield(L, -2, "object");
- // Get minetest.luaentities table
+ // minetest.luaentities[id] = object
lua_getglobal(L, "minetest");
lua_getfield(L, -1, "luaentities");
luaL_checktype(L, -1, LUA_TTABLE);
- int luaentities = lua_gettop(L);
-
- // luaentities[id] = object
lua_pushnumber(L, id); // Push id
lua_pushvalue(L, object); // Copy object to top of stack
- lua_settable(L, luaentities);
+ lua_settable(L, -3);
+
+ // This callback doesn't really make sense
+ /*// Get on_activate function
+ lua_pushvalue(L, object);
+ lua_getfield(L, -1, "on_activate");
+ luaL_checktype(L, -1, LUA_TFUNCTION);
+ lua_pushvalue(L, object); // self
+ // Call with 1 arguments, 0 results
+ if(lua_pcall(L, 1, 0, 0))
+ script_error(L, "error running function %s:on_activate: %s\n",
+ name, lua_tostring(L, -1));*/
}
void scriptapi_luaentity_rm(lua_State *L, u16 id)
return "";
}
+LuaEntityProperties scriptapi_luaentity_get_properties(lua_State *L, u16 id)
+{
+ realitycheck(L);
+ assert(lua_checkstack(L, 20));
+ infostream<<"scriptapi_luaentity_get_properties: id="<<id<<std::endl;
+ StackUnroller stack_unroller(L);
+
+ LuaEntityProperties prop;
+
+ // Get minetest.luaentities[id]
+ luaentity_get(L, id);
+ //int object = lua_gettop(L);
+
+ lua_getfield(L, -1, "physical");
+ if(lua_isboolean(L, -1))
+ prop.physical = lua_toboolean(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "weight");
+ prop.weight = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "boundingbox");
+ if(lua_istable(L, -1)){
+ lua_rawgeti(L, -1, 1);
+ prop.boundingbox.MinEdge.X = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 2);
+ prop.boundingbox.MinEdge.Y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 3);
+ prop.boundingbox.MinEdge.Z = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 4);
+ prop.boundingbox.MaxEdge.X = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 5);
+ prop.boundingbox.MaxEdge.Y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 6);
+ prop.boundingbox.MaxEdge.Z = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ }
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "visual");
+ if(lua_isstring(L, -1))
+ prop.visual = lua_tostring(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "textures");
+ if(lua_istable(L, -1)){
+ prop.textures.clear();
+ int table = lua_gettop(L);
+ lua_pushnil(L);
+ while(lua_next(L, table) != 0){
+ // key at index -2 and value at index -1
+ if(lua_isstring(L, -1))
+ prop.textures.push_back(lua_tostring(L, -1));
+ else
+ prop.textures.push_back("");
+ // removes value, keeps key for next iteration
+ lua_pop(L, 1);
+ }
+ }
+ lua_pop(L, 1);
+
+ return prop;
+}
+
void scriptapi_luaentity_step(lua_State *L, u16 id, float dtime)
{
realitycheck(L);
void scriptapi_add_object_reference(lua_State *L, ServerActiveObject *cobj);
void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj);
+struct LuaEntityProperties
+{
+ bool physical;
+ float weight;
+ core::aabbox3d<f32> boundingbox;
+ std::string visual;
+ core::list<std::string> textures;
+
+ LuaEntityProperties():
+ physical(true),
+ weight(5),
+ boundingbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
+ visual("cube")
+ {
+ textures.push_back("unknown_block.png");
+ textures.push_back("unknown_block.png");
+ textures.push_back("unknown_block.png");
+ textures.push_back("unknown_block.png");
+ textures.push_back("unknown_block.png");
+ textures.push_back("unknown_block.png");
+ }
+};
+
void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
const char *init_state);
void scriptapi_luaentity_rm(lua_State *L, u16 id);
std::string scriptapi_luaentity_get_state(lua_State *L, u16 id);
+LuaEntityProperties scriptapi_luaentity_get_properties(lua_State *L, u16 id);
void scriptapi_luaentity_step(lua_State *L, u16 id, float dtime);
void scriptapi_luaentity_rightclick_player(lua_State *L, u16 id,
const char *playername);