// get_node_or_nil(pos) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_or_nil(lua_State *L) { GET_ENV_PTR; // pos v3s16 pos = read_v3s16(L, 1); // Do it bool pos_ok; MapNode n = env->getMap().getNodeNoEx(pos, &pos_ok); if (pos_ok) { // Return node pushnode(L, n, env->getGameDef()->ndef()); } else { lua_pushnil(L); } return 1; }
// get_node_or_nil(pos) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_get_node_or_nil(lua_State *L) { GET_ENV_PTR; // pos v3s16 pos = read_v3s16(L, 1); // Do it try{ MapNode n = env->getMap().getNode(pos); // Return node pushnode(L, n, env->getGameDef()->ndef()); return 1; } catch(InvalidPositionException &e) { lua_pushnil(L); return 1; } }
void ScriptApiNode::node_after_destruct(v3s16 p, MapNode node) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); INodeDefManager *ndef = getServer()->ndef(); // Push callback function on stack if (!getItemCallback(ndef->get(node).name.c_str(), "after_destruct")) return; // Call function push_v3s16(L, p); pushnode(L, node, ndef); PCALL_RES(lua_pcall(L, 2, 0, error_handler)); lua_pop(L, 1); // Pop error handler }
void scriptapi_node_after_destruct(lua_State *L, v3s16 p, MapNode node) { realitycheck(L); assert(lua_checkstack(L, 20)); StackUnroller stack_unroller(L); INodeDefManager *ndef = get_server(L)->ndef(); // Push callback function on stack if(!get_item_callback(L, ndef->get(node).name.c_str(), "after_destruct")) return; // Call function push_v3s16(L, p); pushnode(L, node, ndef); if(lua_pcall(L, 2, 0, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); }
void acceptandinfernexthistory(void) { int t0; char *s; done = 1; for (t0 = histline - 2;; t0--) { if (!(s = qgetevent(t0))) return; if (!metadiffer(s, (char *) line, ll)) break; } if (!(s = qgetevent(t0 + 1))) return; pushnode(bufstack, ztrdup(s)); stackhist = t0 + 1; }
bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) { SCRIPTAPI_PRECHECKHEADER INodeDefManager *ndef = getClient()->ndef(); // Get core.registered_on_dignode lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_on_dignode"); // Push data push_v3s16(L, p); pushnode(L, node, ndef); // Call functions runCallbacks(2, RUN_CALLBACKS_MODE_OR); return lua_toboolean(L, -1); }
void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider) { GameScripting *scriptIface = env->getScriptIface(); scriptIface->realityCheck(); lua_State *L = scriptIface->getStack(); sanity_check(lua_checkstack(L, 20)); StackUnroller stack_unroller(L); lua_pushcfunction(L, script_error_handler); int errorhandler = lua_gettop(L); // Get registered_abms lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_abms"); luaL_checktype(L, -1, LUA_TTABLE); lua_remove(L, -2); // Remove core // Get registered_abms[m_id] lua_pushnumber(L, m_id); lua_gettable(L, -2); if(lua_isnil(L, -1)) FATAL_ERROR(""); lua_remove(L, -2); // Remove registered_abms scriptIface->setOriginFromTable(-1); // Call action luaL_checktype(L, -1, LUA_TTABLE); lua_getfield(L, -1, "action"); luaL_checktype(L, -1, LUA_TFUNCTION); lua_remove(L, -2); // Remove registered_abms[m_id] push_v3s16(L, p); pushnode(L, n, env->getGameDef()->ndef()); lua_pushnumber(L, active_object_count); lua_pushnumber(L, active_object_count_wider); int result = lua_pcall(L, 4, 0, errorhandler); if (result) scriptIface->scriptError(result, "LuaABM::trigger"); lua_pop(L, 1); // Pop error handler }
bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node, ServerActiveObject *puncher) { SCRIPTAPI_PRECHECKHEADER INodeDefManager *ndef = getServer()->ndef(); // Push callback function on stack if(!getItemCallback(ndef->get(node).name.c_str(), "on_punch")) return false; // Call function push_v3s16(L, p); pushnode(L, node, ndef); objectrefGetOrCreate(puncher); if(lua_pcall(L, 3, 0, 0)) scriptError("error: %s", lua_tostring(L, -1)); return true; }
bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node, ServerActiveObject *digger) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); INodeDefManager *ndef = getServer()->ndef(); // Push callback function on stack if (!getItemCallback(ndef->get(node).name.c_str(), "on_dig")) return false; // Call function push_v3s16(L, p); pushnode(L, node, ndef); objectrefGetOrCreate(L, digger); PCALL_RES(lua_pcall(L, 3, 0, error_handler)); lua_pop(L, 1); // Pop error handler return true; }
bool scriptapi_node_on_punch(lua_State *L, v3s16 p, MapNode node, ServerActiveObject *puncher) { realitycheck(L); assert(lua_checkstack(L, 20)); StackUnroller stack_unroller(L); INodeDefManager *ndef = get_server(L)->ndef(); // Push callback function on stack if(!get_item_callback(L, ndef->get(node).name.c_str(), "on_punch")) return false; // Call function push_v3s16(L, p); pushnode(L, node, ndef); objectref_get_or_create(L, puncher); if(lua_pcall(L, 3, 0, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); return true; }
void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider) { GameScripting *scriptIface = env->getScriptIface(); scriptIface->realityCheck(); lua_State *L = scriptIface->getStack(); assert(lua_checkstack(L, 20)); StackUnroller stack_unroller(L); lua_pushcfunction(L, script_error_handler); int errorhandler = lua_gettop(L); // Get minetest.registered_abms lua_getglobal(L, "minetest"); lua_getfield(L, -1, "registered_abms"); luaL_checktype(L, -1, LUA_TTABLE); lua_remove(L, -2); // Remove "minetest" // Get minetest.registered_abms[m_id] lua_pushnumber(L, m_id); lua_gettable(L, -2); if(lua_isnil(L, -1)) assert(0); lua_remove(L, -2); // Remove "registered_abms" // Call action luaL_checktype(L, -1, LUA_TTABLE); lua_getfield(L, -1, "action"); luaL_checktype(L, -1, LUA_TFUNCTION); lua_remove(L, -2); // Remove "registered_abms[m_id]" push_v3s16(L, p); pushnode(L, n, env->getGameDef()->ndef()); lua_pushnumber(L, active_object_count); lua_pushnumber(L, active_object_count_wider); if(lua_pcall(L, 4, 0, errorhandler)) script_error(L); lua_pop(L, 1); // Pop error handler }
void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n) { ServerScripting *scriptIface = env->getScriptIface(); scriptIface->realityCheck(); lua_State *L = scriptIface->getStack(); sanity_check(lua_checkstack(L, 20)); StackUnroller stack_unroller(L); int error_handler = PUSH_ERROR_HANDLER(L); // Get registered_lbms lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_lbms"); luaL_checktype(L, -1, LUA_TTABLE); lua_remove(L, -2); // Remove core // Get registered_lbms[m_id] lua_pushnumber(L, m_id); lua_gettable(L, -2); FATAL_ERROR_IF(lua_isnil(L, -1), "Entry with given id not found in registered_lbms table"); lua_remove(L, -2); // Remove registered_lbms scriptIface->setOriginFromTable(-1); // Call action luaL_checktype(L, -1, LUA_TTABLE); lua_getfield(L, -1, "action"); luaL_checktype(L, -1, LUA_TFUNCTION); lua_remove(L, -2); // Remove registered_lbms[m_id] push_v3s16(L, p); pushnode(L, n, env->getGameDef()->ndef()); int result = lua_pcall(L, 2, 0, error_handler); if (result) scriptIface->scriptError(result, "LuaLBM::trigger"); lua_pop(L, 1); // Pop error handler }
bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node, ServerActiveObject *puncher, PointedThing pointed) { SCRIPTAPI_PRECHECKHEADER lua_pushcfunction(L, script_error_handler); int errorhandler = lua_gettop(L); INodeDefManager *ndef = getServer()->ndef(); // Push callback function on stack if(!getItemCallback(ndef->get(node).name.c_str(), "on_punch")) return false; // Call function push_v3s16(L, p); pushnode(L, node, ndef); objectrefGetOrCreate(puncher); pushPointedThing(pointed); if(lua_pcall(L, 4, 0, errorhandler)) scriptError(); lua_pop(L, 1); // Pop error handler return true; }
void acceptandhold() /**/ { pushnode(bufstack,ztrdup((char *) line)); stackcs = cs; done = 1; }
/* Graph reduction function. Destructively modifies the graph passed in. */ enum graphReductionResult reduce_graph(struct node *root) { enum graphReductionResult r = UNKNOWN; struct spine_stack *stack = NULL; unsigned long reduction_counter = 0; int max_redex_count = 0; /* Used to decide what to do next: * at an application (interior node of graph) * you can take the left branch into subtree, * take the right branch, or pop the node and * go "up" the tree. */ enum Direction { DIR_LEFT, DIR_RIGHT, DIR_UP }; enum Direction dir = DIR_LEFT; stack = new_spine_stack(64); /* root constitutes the "dummy" root node */ root->updateable = root->left_addr; pushnode(stack, root, 1); D print_graph(root, 0, TOPNODE(stack)->sn); while (STACK_NOT_EMPTY(stack)) { int pop_stack_cnt = 1; int performed_reduction = 0; struct node *topnode = TOPNODE(stack); const char *atom_name = NULL; switch (topnode->typ) { case APPLICATION: switch (dir) { case DIR_LEFT: topnode->updateable = topnode->left_addr; pushnode(stack, topnode->left, 0); D printf("push left branch on stack, depth now %d\n", DEPTH(stack)); pop_stack_cnt = 0; break; case DIR_RIGHT: topnode->updateable = topnode->right_addr; pushnode(stack, topnode->right, 2); D printf("push right branch on stack, depth now %d\n", DEPTH(stack)); pop_stack_cnt = 0; break; case DIR_UP: break; } break; case ATOM: /* node->typ indicates a combinator, which can comprise a built-in, * or it can comprise a mere variable. Let node->rule decide. */ if (topnode->rule && DEPTH(stack) >= (topnode->rule->required_depth + 2)) { D { atom_name = topnode->name; printf("%s reduction (sn %d), stack depth %d, before: ", topnode->name, topnode->sn, DEPTH(stack) ); print_graph(root->left, topnode->sn, topnode->sn); } pop_stack_cnt = topnode->rule->required_depth + 1; perform_reduction(stack); performed_reduction = 1; } else D { printf("%s atom, stack depth %d, required depth %d.\n", topnode->name, DEPTH(stack), topnode->rule? topnode->rule->required_depth + 2: -1 ); } if (performed_reduction) SS; break; }