mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Scripting: Allow multiple global step callbacks and improve documentation
This commit is contained in:
		@@ -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
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user