mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Scripting: Allow multiple global step callbacks and improve documentation
This commit is contained in:
parent
7b802c547d
commit
f8c9b70379
@ -72,13 +72,47 @@ function dump(o, dumped)
|
||||
end
|
||||
end
|
||||
|
||||
-- Global functions:
|
||||
-- minetest.register_entity(name, prototype_table)
|
||||
-- minetest.register_globalstep(func)
|
||||
--
|
||||
-- Global objects:
|
||||
-- minetest.env - environment reference
|
||||
--
|
||||
-- Global tables:
|
||||
-- minetest.registered_entities
|
||||
-- ^ List of registered entity prototypes, indexed by name
|
||||
-- minetest.object_refs
|
||||
-- ^ List of object references, indexed by active object id
|
||||
-- minetest.luaentities
|
||||
-- ^ List of lua entities, indexed by active object id
|
||||
--
|
||||
-- EnvRef methods:
|
||||
-- - add_node(pos, content); pos={x=num, y=num, z=num}
|
||||
--
|
||||
-- ObjectRef methods:
|
||||
-- - remove(): remove object (after returning from Lua)
|
||||
-- - getpos(): returns {x=num, y=num, z=num}
|
||||
-- - setpos(pos); pos={x=num, y=num, z=num}
|
||||
-- - moveto(pos, continuous=false): interpolated move
|
||||
-- - add_to_inventory(itemstring): add an item to object inventory
|
||||
--
|
||||
-- Registered entities:
|
||||
-- - Functions receive a "luaentity" as self:
|
||||
-- - It has the member .object, which is an ObjectRef pointing to the object
|
||||
-- - The original prototype stuff is visible directly via a metatable
|
||||
--
|
||||
|
||||
print("omg lol")
|
||||
print("minetest dump: "..dump(minetest))
|
||||
|
||||
-- Global environment step function
|
||||
function on_step(dtime)
|
||||
-- print("on_step")
|
||||
end
|
||||
|
||||
minetest.register_globalstep(on_step)
|
||||
|
||||
local TNT = {
|
||||
-- Maybe handle gravity and collision this way? dunno
|
||||
physical = true,
|
||||
@ -112,6 +146,15 @@ function TNT:on_rightclick(clicker)
|
||||
pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
|
||||
self.object:moveto(pos, false)
|
||||
end
|
||||
|
||||
print("TNT dump: "..dump(TNT))
|
||||
|
||||
print("Registering TNT");
|
||||
minetest.register_entity("TNT", TNT)
|
||||
|
||||
print("minetest.registered_entities:")
|
||||
dump2(minetest.registered_entities)
|
||||
|
||||
--[[
|
||||
function TNT:on_rightclick(clicker)
|
||||
print("TNT:on_rightclick()")
|
||||
@ -125,15 +168,6 @@ function TNT:on_rightclick(clicker)
|
||||
end
|
||||
--]]
|
||||
|
||||
print("TNT dump: "..dump(TNT))
|
||||
|
||||
print("Registering TNT");
|
||||
minetest.register_entity("TNT", TNT)
|
||||
|
||||
--print("minetest.registered_entities: "..dump(minetest.registered_entities))
|
||||
print("minetest.registered_entities:")
|
||||
dump2(minetest.registered_entities)
|
||||
|
||||
--[=[
|
||||
|
||||
register_block(0, {
|
||||
|
@ -170,8 +170,35 @@ static int l_register_entity(lua_State *L)
|
||||
return 0; /* number of results */
|
||||
}
|
||||
|
||||
// Register a global step function
|
||||
// register_globalstep(function)
|
||||
static int l_register_globalstep(lua_State *L)
|
||||
{
|
||||
luaL_checktype(L, 1, LUA_TFUNCTION);
|
||||
infostream<<"register_globalstep"<<std::endl;
|
||||
|
||||
lua_getglobal(L, "table");
|
||||
lua_getfield(L, -1, "insert");
|
||||
int table_insert = lua_gettop(L);
|
||||
// Get minetest.registered_globalsteps
|
||||
lua_getglobal(L, "minetest");
|
||||
lua_getfield(L, -1, "registered_globalsteps");
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
int registered_globalsteps = lua_gettop(L);
|
||||
// table.insert(registered_globalsteps, func)
|
||||
lua_pushvalue(L, table_insert);
|
||||
lua_pushvalue(L, registered_globalsteps);
|
||||
lua_pushvalue(L, 1); // push function from argument 1
|
||||
// Call insert
|
||||
if(lua_pcall(L, 2, 0, 0))
|
||||
script_error(L, "error: %s\n", lua_tostring(L, -1));
|
||||
|
||||
return 0; /* number of results */
|
||||
}
|
||||
|
||||
static const struct luaL_Reg minetest_f [] = {
|
||||
{"register_entity", l_register_entity},
|
||||
{"register_globalstep", l_register_globalstep},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
@ -566,6 +593,9 @@ void scriptapi_export(lua_State *L, Server *server)
|
||||
lua_newtable(L);
|
||||
lua_setfield(L, -2, "registered_entities");
|
||||
|
||||
lua_newtable(L);
|
||||
lua_setfield(L, -2, "registered_globalsteps");
|
||||
|
||||
lua_newtable(L);
|
||||
lua_setfield(L, -2, "object_refs");
|
||||
|
||||
@ -684,12 +714,22 @@ void scriptapi_environment_step(lua_State *L, float dtime)
|
||||
//infostream<<"scriptapi_luaentity_step: id="<<id<<std::endl;
|
||||
StackUnroller stack_unroller(L);
|
||||
|
||||
lua_getglobal(L, "on_step");
|
||||
if(lua_type(L, -1) != LUA_TFUNCTION)
|
||||
return; // If no on_step function exist, do nothing
|
||||
lua_pushnumber(L, dtime);
|
||||
if(lua_pcall(L, 1, 0, 0))
|
||||
script_error(L, "error: %s\n", lua_tostring(L, -1));
|
||||
// Get minetest.registered_globalsteps
|
||||
lua_getglobal(L, "minetest");
|
||||
lua_getfield(L, -1, "registered_globalsteps");
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
int table = lua_gettop(L);
|
||||
// Foreach
|
||||
lua_pushnil(L);
|
||||
while(lua_next(L, table) != 0){
|
||||
// key at index -2 and value at index -1
|
||||
luaL_checktype(L, -1, LUA_TFUNCTION);
|
||||
// Call function
|
||||
lua_pushnumber(L, dtime);
|
||||
if(lua_pcall(L, 1, 0, 0))
|
||||
script_error(L, "error: %s\n", lua_tostring(L, -1));
|
||||
// value removed, keep key for next iteration
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user