forked from Mirrorlandia_minetest/minetest
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
|
||||||
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("omg lol")
|
||||||
print("minetest dump: "..dump(minetest))
|
print("minetest dump: "..dump(minetest))
|
||||||
|
|
||||||
-- Global environment step function
|
-- Global environment step function
|
||||||
function on_step(dtime)
|
function on_step(dtime)
|
||||||
|
-- print("on_step")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.register_globalstep(on_step)
|
||||||
|
|
||||||
local TNT = {
|
local TNT = {
|
||||||
-- Maybe handle gravity and collision this way? dunno
|
-- Maybe handle gravity and collision this way? dunno
|
||||||
physical = true,
|
physical = true,
|
||||||
@ -112,6 +146,15 @@ function TNT:on_rightclick(clicker)
|
|||||||
pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
|
pos = {x=pos.x, y=pos.y+0.1, z=pos.z}
|
||||||
self.object:moveto(pos, false)
|
self.object:moveto(pos, false)
|
||||||
end
|
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)
|
function TNT:on_rightclick(clicker)
|
||||||
print("TNT:on_rightclick()")
|
print("TNT:on_rightclick()")
|
||||||
@ -125,15 +168,6 @@ function TNT:on_rightclick(clicker)
|
|||||||
end
|
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, {
|
register_block(0, {
|
||||||
|
@ -170,8 +170,35 @@ static int l_register_entity(lua_State *L)
|
|||||||
return 0; /* number of results */
|
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 [] = {
|
static const struct luaL_Reg minetest_f [] = {
|
||||||
{"register_entity", l_register_entity},
|
{"register_entity", l_register_entity},
|
||||||
|
{"register_globalstep", l_register_globalstep},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -566,6 +593,9 @@ void scriptapi_export(lua_State *L, Server *server)
|
|||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
lua_setfield(L, -2, "registered_entities");
|
lua_setfield(L, -2, "registered_entities");
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_setfield(L, -2, "registered_globalsteps");
|
||||||
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
lua_setfield(L, -2, "object_refs");
|
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;
|
//infostream<<"scriptapi_luaentity_step: id="<<id<<std::endl;
|
||||||
StackUnroller stack_unroller(L);
|
StackUnroller stack_unroller(L);
|
||||||
|
|
||||||
lua_getglobal(L, "on_step");
|
// Get minetest.registered_globalsteps
|
||||||
if(lua_type(L, -1) != LUA_TFUNCTION)
|
lua_getglobal(L, "minetest");
|
||||||
return; // If no on_step function exist, do nothing
|
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);
|
lua_pushnumber(L, dtime);
|
||||||
if(lua_pcall(L, 1, 0, 0))
|
if(lua_pcall(L, 1, 0, 0))
|
||||||
script_error(L, "error: %s\n", lua_tostring(L, -1));
|
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