// get_biome_id(biomename) // returns the biome id used in biomemap int ModApiMapgen::l_get_biome_id(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char *biome_str = lua_tostring(L, 1); if (!biome_str) return 0; BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr; if (!bmgr) return 0; Biome *biome = (Biome *)bmgr->getByName(biome_str); if (!biome || biome->index == OBJDEF_INVALID_INDEX) return 0; lua_pushinteger(L, biome->index); return 1; }
int ModApiMapgen::l_get_mapgen_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; log_deprecated(L, "get_mapgen_params is deprecated; " "use get_mapgen_setting instead"); std::string value; MapSettingsManager *settingsmgr = getServer(L)->getEmergeManager()->map_settings_mgr; lua_newtable(L); settingsmgr->getMapSetting("mg_name", &value); lua_pushstring(L, value.c_str()); lua_setfield(L, -2, "mgname"); settingsmgr->getMapSetting("seed", &value); std::istringstream ss(value); u64 seed; ss >> seed; lua_pushinteger(L, seed); lua_setfield(L, -2, "seed"); settingsmgr->getMapSetting("water_level", &value); lua_pushinteger(L, stoi(value, -32768, 32767)); lua_setfield(L, -2, "water_level"); settingsmgr->getMapSetting("chunksize", &value); lua_pushinteger(L, stoi(value, -32768, 32767)); lua_setfield(L, -2, "chunksize"); settingsmgr->getMapSetting("mg_flags", &value); lua_pushstring(L, value.c_str()); lua_setfield(L, -2, "flags"); return 1; }
// get_modnames() // the returned list is sorted alphabetically for you int ModApiServer::l_get_modnames(lua_State *L) { NO_MAP_LOCK_REQUIRED; // Get a list of mods std::vector<std::string> modlist; getServer(L)->getModNames(modlist); // Take unsorted items from mods_unsorted and sort them into // mods_sorted; not great performance but the number of mods on a // server will likely be small. std::sort(modlist.begin(), modlist.end()); // Package them up for Lua lua_createtable(L, modlist.size(), 0); std::vector<std::string>::iterator iter = modlist.begin(); for (u16 i = 0; iter != modlist.end(); ++iter) { lua_pushstring(L, iter->c_str()); lua_rawseti(L, -2, ++i); } return 1; }
void Save::odczytajopcje() { QMPset = new QSettings( QMPConf, QSettings::IniFormat ); useProxy = QMPset->value( "QMPInternet/useProxy", false ).toBool(); if ( useProxy ) useProxy = getServer( QMPset->value( "QMPInternet/proxy" ).toString(), proxyAddr, proxyPort ); fisW = QMPset->value( "CDAudio/fisW" ).toInt(); fisH = QMPset->value( "CDAudio/fisH" ).toInt(); fs.ui.canCloseTB->setChecked( QMPset->value( "CDAudio/canCloseTB", false ).toBool() ); curF = QMPset->value( "CDAudio/curF" ).toString(); savsek = QMPset->value( "CDAudio/seek" ).toInt(); Enabled = QMPset->value( "CDAudio/Enabled", true ).toBool(); speed = QMPset->value( "CDAudio/speed", 1 ).toInt(); clrB = QMPset->value( "CDAudio/clrB", true ).toBool(); currCD = QMPset->value( "CDAudio/currCD" ).toString(); if ( currCD.isEmpty() ) loadFirst = true; useDefaultCacheDir = QMPset->value( "CDAudio/useDefaultCacheDir", true ).toBool(); useCDDB = QMPset->value( "CDAudio/useCDDB", true ).toBool(); useUserDatabase = QMPset->value( "CDAudio/useUserDatabase", false ).toBool(); useFDB = QMPset->value( "CDAudio/useFDB", true ).toBool(); useCddbp = QMPset->value( "CDAudio/useCddbp", false).toBool(); userDatabaseServer = QMPset->value( "CDAudio/userDatabaseServer" ).toString(); readCDTXT = QMPset->value( "CDAudio/readCDTXT", true ).toBool(); if ( !useUserDatabase && !useFDB ) useFDB = true; delete QMPset; }
// get_player_ip() int ModApiServer::l_get_player_ip(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char * name = luaL_checkstring(L, 1); RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name); if(player == NULL) { lua_pushnil(L); // no such player return 1; } try { Address addr = getServer(L)->getPeerAddress(player->getPeerId()); std::string ip_str = addr.serializeString(); lua_pushstring(L, ip_str.c_str()); return 1; } catch (const con::PeerNotFoundException &) { dstream << FUNCTION_NAME << ": peer was not found" << std::endl; lua_pushnil(L); // error return 1; } }
// rollback_get_node_actions(pos, range, seconds, limit) -> {{actor, pos, time, oldnode, newnode}, ...} int ModApiRollback::l_rollback_get_node_actions(lua_State *L) { v3s16 pos = read_v3s16(L, 1); int range = luaL_checknumber(L, 2); time_t seconds = (time_t) luaL_checknumber(L, 3); int limit = luaL_checknumber(L, 4); Server *server = getServer(L); IRollbackManager *rollback = server->getRollbackManager(); if (rollback == NULL) { return 0; } std::list<RollbackAction> actions = rollback->getNodeActors(pos, range, seconds, limit); std::list<RollbackAction>::iterator iter = actions.begin(); lua_createtable(L, actions.size(), 0); for (unsigned int i = 1; iter != actions.end(); ++iter, ++i) { lua_createtable(L, 0, 5); // Make a table with enough space pre-allocated lua_pushstring(L, iter->actor.c_str()); lua_setfield(L, -2, "actor"); push_v3s16(L, iter->p); lua_setfield(L, -2, "pos"); lua_pushnumber(L, iter->unix_time); lua_setfield(L, -2, "time"); push_RollbackNode(L, iter->n_old); lua_setfield(L, -2, "oldnode"); push_RollbackNode(L, iter->n_new); lua_setfield(L, -2, "newnode"); lua_rawseti(L, -2, i); // Add action table to main table } return 1; }
// register_schematic({schematic}, replacements={}) int ModApiMapgen::l_register_schematic(lua_State *L) { SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr; StringMap replace_names; if (lua_istable(L, 2)) read_schematic_replacements(L, 2, &replace_names); Schematic *schem = load_schematic(L, 1, schemmgr->getNodeDef(), &replace_names); if (!schem) return 0; ObjDefHandle handle = schemmgr->add(schem); if (handle == OBJDEF_INVALID_HANDLE) { delete schem; return 0; } lua_pushinteger(L, handle); return 1; }
// set_mapgen_setting_noiseparams(name, noiseparams, set_default) // set mapgen config values for noise parameters int ModApiMapgen::l_set_mapgen_setting_noiseparams(lua_State *L) { NO_MAP_LOCK_REQUIRED; MapSettingsManager *settingsmgr = getServer(L)->getEmergeManager()->map_settings_mgr; const char *name = luaL_checkstring(L, 1); NoiseParams np; if (read_noiseparams(L, 2, &np)) return 0; bool override_meta = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false; if (!settingsmgr->setMapSettingNoiseParams(name, &np, override_meta)) { errorstream << "set_mapgen_setting_noiseparams: cannot set '" << name << "' after initialization" << std::endl; } return 0; }
BSONObj ChangeLogType::toBSON() const { BSONObjBuilder builder; if (_changeId) builder.append(changeId.name(), getChangeId()); if (_server) builder.append(server.name(), getServer()); if (_shard) builder.append(shard.name(), getShard()); if (_clientAddr) builder.append(clientAddr.name(), getClientAddr()); if (_time) builder.append(time.name(), getTime()); if (_what) builder.append(what.name(), getWhat()); if (_ns) builder.append(ns.name(), getNS()); if (_details) builder.append(details.name(), getDetails()); return builder.obj(); }
// place_schematic(p, schematic, rotation, replacement) int ModApiMapgen::l_place_schematic(lua_State *L) { MAP_LOCK_REQUIRED; Map *map = &(getEnv(L)->getMap()); SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr; //// Read position v3s16 p = check_v3s16(L, 1); //// Read rotation int rot = ROTATE_0; const char *enumstr = lua_tostring(L, 3); if (enumstr) string_to_enum(es_Rotation, rot, std::string(enumstr)); //// Read force placement bool force_placement = true; if (lua_isboolean(L, 5)) force_placement = lua_toboolean(L, 5); //// Read node replacements StringMap replace_names; if (lua_istable(L, 4)) read_schematic_replacements(L, 4, &replace_names); //// Read schematic Schematic *schem = get_or_load_schematic(L, 2, schemmgr, &replace_names); if (!schem) { errorstream << "place_schematic: failed to get schematic" << std::endl; return 0; } schem->placeOnMap(map, p, 0, (Rotation)rot, force_placement); lua_pushboolean(L, true); return 1; }
void ScriptApiNode::node_on_receive_fields(v3s16 p, const std::string &formname, const std::map<std::string, std::string> &fields, ServerActiveObject *sender) { SCRIPTAPI_PRECHECKHEADER INodeDefManager *ndef = getServer()->ndef(); // If node doesn't exist, we don't know what callback to call MapNode node = getEnv()->getMap().getNodeNoEx(p); if(node.getContent() == CONTENT_IGNORE) return; // Push callback function on stack if(!getItemCallback(ndef->get(node).name.c_str(), "on_receive_fields")) return; // Call function // param 1 push_v3s16(L, p); // param 2 lua_pushstring(L, formname.c_str()); // param 3 lua_newtable(L); for(std::map<std::string, std::string>::const_iterator i = fields.begin(); i != fields.end(); i++){ const std::string &name = i->first; const std::string &value = i->second; lua_pushstring(L, name.c_str()); lua_pushlstring(L, value.c_str(), value.size()); lua_settable(L, -3); } // param 4 objectrefGetOrCreate(sender); if(lua_pcall(L, 4, 0, 0)) scriptError("error: %s", lua_tostring(L, -1)); }
// set_sky(self, bgcolor, type, list, clouds = true) int ObjectRef::l_set_sky(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); if (player == NULL) return 0; video::SColor bgcolor(255,255,255,255); read_color(L, 2, &bgcolor); std::string type = luaL_checkstring(L, 3); std::vector<std::string> params; if (lua_istable(L, 4)) { lua_pushnil(L); while (lua_next(L, 4) != 0) { // key at index -2 and value at index -1 if (lua_isstring(L, -1)) params.emplace_back(readParam<std::string>(L, -1)); else params.emplace_back(""); // removes value, keeps key for next iteration lua_pop(L, 1); } } if (type == "skybox" && params.size() != 6) throw LuaError("skybox expects 6 textures"); bool clouds = true; if (lua_isboolean(L, 5)) clouds = readParam<bool>(L, 5); getServer(L)->setSky(player, bgcolor, type, params, clouds); lua_pushboolean(L, true); return 1; }
// set_mapgen_params(params) // set mapgen parameters int ModApiMapgen::l_set_mapgen_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; log_deprecated(L, "set_mapgen_params is deprecated; " "use set_mapgen_setting instead"); if (!lua_istable(L, 1)) return 0; MapSettingsManager *settingsmgr = getServer(L)->getEmergeManager()->map_settings_mgr; lua_getfield(L, 1, "mgname"); if (lua_isstring(L, -1)) settingsmgr->setMapSetting("mg_name", lua_tostring(L, -1), true); lua_getfield(L, 1, "seed"); if (lua_isnumber(L, -1)) settingsmgr->setMapSetting("seed", lua_tostring(L, -1), true); lua_getfield(L, 1, "water_level"); if (lua_isnumber(L, -1)) settingsmgr->setMapSetting("water_level", lua_tostring(L, -1), true); lua_getfield(L, 1, "chunksize"); if (lua_isnumber(L, -1)) settingsmgr->setMapSetting("chunksize", lua_tostring(L, -1), true); warn_if_field_exists(L, 1, "flagmask", "Deprecated: flags field now includes unset flags."); lua_getfield(L, 1, "flags"); if (lua_isstring(L, -1)) settingsmgr->setMapSetting("mg_flags", lua_tostring(L, -1), true); return 0; }
// set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed) int ObjectRef::l_set_local_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); Player *player = getplayer(ref); if (player == NULL) return 0; // Do it v2s32 frames[4]; for (int i=0;i<4;i++) { if (!lua_isnil(L, 2+1)) frames[i] = read_v2s32(L, 2+i); } float frame_speed = 30; if (!lua_isnil(L, 6)) frame_speed = lua_tonumber(L, 6); if (!getServer(L)->setLocalPlayerAnimations(player, frames, frame_speed)) return 0; lua_pushboolean(L, true); return 0; }
bool ScriptApiItem::item_OnUse(ItemStack &item, ServerActiveObject *user, const PointedThing &pointed) { SCRIPTAPI_PRECHECKHEADER lua_pushcfunction(L, script_error_handler); int errorhandler = lua_gettop(L); // Push callback function on stack if(!getItemCallback(item.name.c_str(), "on_use")) return false; // Call function LuaItemStack::create(L, item); objectrefGetOrCreate(user); pushPointedThing(pointed); if(lua_pcall(L, 3, 1, errorhandler)) scriptError(); if(!lua_isnil(L, -1)) item = read_item(L,-1, getServer()); lua_pop(L, 2); // Pop item and error handler return true; }
void Client::parseSetInfo() { qDebug() << "SetInfo received!"; if (this->status_!=ST_ADMIN) { qDebug() << "cmd not allowed"; this->disconnectFromHost(); return; } if (buf_.size()< CMD1_SETINFO_SIZE) // TODO: remove magic number return; // not all data avaliable qint16 clientId=getClientId(buf_); QString caption=getClientCaption(buf_); getServer()->setClientCaption(clientId,caption); buf_ = buf_.right(buf_.size() - CMD1_SETINFO_SIZE); if (buf_.size() > 0) onDataReceived(); // If something in buffer - parse again }
bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node, ServerActiveObject *digger) { 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_dig")) return false; // Call function push_v3s16(L, p); pushnode(L, node, ndef); objectrefGetOrCreate(digger); if(lua_pcall(L, 3, 0, errorhandler)) scriptError(); lua_pop(L, 1); // Pop error handler return true; }
// kick_player(name, [reason]) -> success int ModApiServer::l_kick_player(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char *name = luaL_checkstring(L, 1); std::string message; if (lua_isstring(L, 2)) { message = std::string("Kicked: ") + lua_tostring(L, 2); } else { message = "Kicked."; } Player *player = getEnv(L)->getPlayer(name); if (player == NULL) { lua_pushboolean(L, false); // No such player return 1; } getServer(L)->DenyAccess_Legacy(player->peer_id, utf8_to_wide(message)); lua_pushboolean(L, true); return 1; }
// kick_player(name, [reason]) -> success int ModApiServer::l_kick_player(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char *name = luaL_checkstring(L, 1); std::string message; if (lua_isstring(L, 2)) { message = std::string("Kicked: ") + lua_tostring(L, 2); } else { message = "Kicked."; } RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name); if (player == NULL) { lua_pushboolean(L, false); // No such player return 1; } getServer(L)->DenyAccess(player->peer_id, message); lua_pushboolean(L, true); return 1; }
// set_gen_notify(flags, {deco_id_table}) int ModApiMapgen::l_set_gen_notify(lua_State *L) { NO_MAP_LOCK_REQUIRED; u32 flags = 0, flagmask = 0; EmergeManager *emerge = getServer(L)->getEmergeManager(); if (read_flags(L, 1, flagdesc_gennotify, &flags, &flagmask)) { emerge->gen_notify_on &= ~flagmask; emerge->gen_notify_on |= flags; } if (lua_istable(L, 2)) { lua_pushnil(L); while (lua_next(L, 2)) { if (lua_isnumber(L, -1)) emerge->gen_notify_on_deco_ids.insert((u32)lua_tonumber(L, -1)); lua_pop(L, 1); } } return 0; }
// get_modnames() // the returned list is sorted alphabetically for you int ModApiServer::l_get_modnames(lua_State *L) { NO_MAP_LOCK_REQUIRED; // Get a list of mods std::list<std::string> mods_unsorted, mods_sorted; getServer(L)->getModNames(mods_unsorted); // Take unsorted items from mods_unsorted and sort them into // mods_sorted; not great performance but the number of mods on a // server will likely be small. for(std::list<std::string>::iterator i = mods_unsorted.begin(); i != mods_unsorted.end(); ++i) { bool added = false; for(std::list<std::string>::iterator x = mods_sorted.begin(); x != mods_sorted.end(); ++x) { // I doubt anybody using Minetest will be using // anything not ASCII based :) if(i->compare(*x) <= 0) { mods_sorted.insert(x, *i); added = true; break; } } if(!added) mods_sorted.push_back(*i); } // Package them up for Lua lua_createtable(L, mods_sorted.size(), 0); std::list<std::string>::iterator iter = mods_sorted.begin(); for (u16 i = 0; iter != mods_sorted.end(); iter++) { lua_pushstring(L, iter->c_str()); lua_rawseti(L, -2, ++i); } return 1; }
// find_node_near(pos, radius, nodenames) -> pos or nil // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" int ModApiEnvMod::l_find_node_near(lua_State *L) { GET_ENV_PTR; INodeDefManager *ndef = getServer(L)->ndef(); v3s16 pos = read_v3s16(L, 1); int radius = luaL_checkinteger(L, 2); std::set<content_t> filter; if(lua_istable(L, 3)){ int table = 3; lua_pushnil(L); while(lua_next(L, table) != 0){ // key at index -2 and value at index -1 luaL_checktype(L, -1, LUA_TSTRING); ndef->getIds(lua_tostring(L, -1), filter); // removes value, keeps key for next iteration lua_pop(L, 1); } } else if(lua_isstring(L, 3)){ ndef->getIds(lua_tostring(L, 3), filter); } for(int d=1; d<=radius; d++){ std::list<v3s16> list; getFacePositions(list, d); for(std::list<v3s16>::iterator i = list.begin(); i != list.end(); ++i){ v3s16 p = pos + (*i); content_t c = env->getMap().getNodeNoEx(p).getContent(); if(filter.count(c) != 0){ push_v3s16(L, p); return 1; } } } return 0; }
// Return number of accepted items to be moved int ScriptApiNodemeta::nodemeta_inventory_AllowMove(v3s16 p, const std::string &from_list, int from_index, const std::string &to_list, int to_index, int count, ServerActiveObject *player) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); INodeDefManager *ndef = getServer()->ndef(); // If node doesn't exist, we don't know what callback to call MapNode node = getEnv()->getMap().getNodeNoEx(p); if (node.getContent() == CONTENT_IGNORE) return 0; // Push callback function on stack std::string nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_move", &p)) return count; // function(pos, from_list, from_index, to_list, to_index, count, player) push_v3s16(L, p); // pos lua_pushstring(L, from_list.c_str()); // from_list lua_pushinteger(L, from_index + 1); // from_index lua_pushstring(L, to_list.c_str()); // to_list lua_pushinteger(L, to_index + 1); // to_index lua_pushinteger(L, count); // count objectrefGetOrCreate(L, player); // player PCALL_RES(lua_pcall(L, 7, 1, error_handler)); if (!lua_isnumber(L, -1)) throw LuaError("allow_metadata_inventory_move should" " return a number, guilty node: " + nodename); int num = luaL_checkinteger(L, -1); lua_pop(L, 2); // Pop integer and error handler return num; }
// set_sky(self, bgcolor, type, list) int ObjectRef::l_set_sky(lua_State *L) { ObjectRef *ref = checkobject(L, 1); Player *player = getplayer(ref); if (player == NULL) return 0; video::SColor bgcolor(255,255,255,255); if (!lua_isnil(L, 2)) bgcolor = readARGB8(L, 2); std::string type = luaL_checkstring(L, 3); std::vector<std::string> params; if (lua_istable(L, 4)) { 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)) params.push_back(lua_tostring(L, -1)); else params.push_back(""); // removes value, keeps key for next iteration lua_pop(L, 1); } } if (type == "skybox" && params.size() != 6) throw LuaError("skybox expects 6 textures"); if (!getServer(L)->setSky(player, bgcolor, type, params)) return 0; lua_pushboolean(L, true); return 1; }
// set_lists(self, lists) int InvRef::l_set_lists(lua_State *L) { NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); Inventory *inv = getinv(L, ref); if (!inv) { return 0; } // Make a temporary inventory in case reading fails Inventory *tempInv(inv); tempInv->clear(); Server *server = getServer(L); lua_pushnil(L); while (lua_next(L, 2)) { const char *listname = lua_tostring(L, -2); read_inventory_list(L, -1, tempInv, listname, server); lua_pop(L, 1); } inv = tempInv; return 0; }
// find_nodes_in_area(minp, maxp, nodenames) -> list of positions // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" int ModApiEnvMod::l_find_nodes_in_area(lua_State *L) { GET_ENV_PTR; INodeDefManager *ndef = getServer(L)->ndef(); v3s16 minp = read_v3s16(L, 1); v3s16 maxp = read_v3s16(L, 2); std::set<content_t> filter; if(lua_istable(L, 3)){ int table = 3; lua_pushnil(L); while(lua_next(L, table) != 0){ // key at index -2 and value at index -1 luaL_checktype(L, -1, LUA_TSTRING); ndef->getIds(lua_tostring(L, -1), filter); // removes value, keeps key for next iteration lua_pop(L, 1); } } else if(lua_isstring(L, 3)){ ndef->getIds(lua_tostring(L, 3), filter); } lua_newtable(L); u64 i = 0; for(s16 x = minp.X; x <= maxp.X; x++) for(s16 y = minp.Y; y <= maxp.Y; y++) for(s16 z = minp.Z; z <= maxp.Z; z++) { v3s16 p(x, y, z); content_t c = env->getMap().getNodeNoEx(p).getContent(); if(filter.count(c) != 0) { push_v3s16(L, p); lua_rawseti(L, -2, ++i); } } return 1; }
// Return number of accepted items to be put int ScriptApiNodemeta::nodemeta_inventory_AllowPut(v3s16 p, const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player) { SCRIPTAPI_PRECHECKHEADER lua_pushcfunction(L, script_error_handler); int errorhandler = lua_gettop(L); INodeDefManager *ndef = getServer()->ndef(); // If node doesn't exist, we don't know what callback to call MapNode node = getEnv()->getMap().getNodeNoEx(p); if(node.getContent() == CONTENT_IGNORE) return 0; // Push callback function on stack if(!getItemCallback(ndef->get(node).name.c_str(), "allow_metadata_inventory_put")) return stack.count; // Call function(pos, listname, index, stack, player) push_v3s16(L, p); // pos lua_pushstring(L, listname.c_str()); // listname lua_pushinteger(L, index + 1); // index LuaItemStack::create(L, stack); // stack objectrefGetOrCreate(player); // player if(lua_pcall(L, 5, 1, errorhandler)) scriptError(); lua_remove(L, errorhandler); // Remove error handler if(!lua_isnumber(L, -1)) throw LuaError(L, "allow_metadata_inventory_put should return a number"); int num = luaL_checkinteger(L, -1); lua_pop(L, 1); // Pop integer return num; }
void ScriptApiNode::node_on_receive_fields(v3s16 p, const std::string &formname, const StringMap &fields, ServerActiveObject *sender) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); INodeDefManager *ndef = getServer()->ndef(); // If node doesn't exist, we don't know what callback to call MapNode node = getEnv()->getMap().getNodeNoEx(p); if (node.getContent() == CONTENT_IGNORE) return; // Push callback function on stack if (!getItemCallback(ndef->get(node).name.c_str(), "on_receive_fields")) return; // Call function push_v3s16(L, p); // pos lua_pushstring(L, formname.c_str()); // formname lua_newtable(L); // fields StringMap::const_iterator it; for (it = fields.begin(); it != fields.end(); it++) { const std::string &name = it->first; const std::string &value = it->second; lua_pushstring(L, name.c_str()); lua_pushlstring(L, value.c_str(), value.size()); lua_settable(L, -3); } objectrefGetOrCreate(L, sender); // player PCALL_RES(lua_pcall(L, 4, 0, error_handler)); lua_pop(L, 1); // Pop error handler }
// get_player_ip() int ModApiBasic::l_get_player_ip(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char * name = luaL_checkstring(L, 1); Player *player = getEnv(L)->getPlayer(name); if(player == NULL) { lua_pushnil(L); // no such player return 1; } try { Address addr = getServer(L)->getPeerAddress(getEnv(L)->getPlayer(name)->peer_id); std::string ip_str = addr.serializeString(); lua_pushstring(L, ip_str.c_str()); return 1; } catch(con::PeerNotFoundException) // unlikely { dstream << __FUNCTION_NAME << ": peer was not found" << std::endl; lua_pushnil(L); // error return 1; } }
// set_mapgen_params(params) // set mapgen parameters int ModApiMapgen::l_set_mapgen_params(lua_State *L) { if (!lua_istable(L, 1)) return 0; MapgenParams *params = &getServer(L)->getEmergeManager()->params; u32 flags = 0, flagmask = 0; lua_getfield(L, 1, "mgname"); if (lua_isstring(L, -1)) { params->mg_name = lua_tostring(L, -1); delete params->sparams; params->sparams = NULL; } lua_getfield(L, 1, "seed"); if (lua_isnumber(L, -1)) params->seed = lua_tointeger(L, -1); lua_getfield(L, 1, "water_level"); if (lua_isnumber(L, -1)) params->water_level = lua_tointeger(L, -1); warn_if_field_exists(L, 1, "flagmask", "Deprecated: flags field now includes unset flags."); lua_getfield(L, 1, "flagmask"); if (lua_isstring(L, -1)) params->flags &= ~readFlagString(lua_tostring(L, -1), flagdesc_mapgen, NULL); if (getflagsfield(L, 1, "flags", flagdesc_mapgen, &flags, &flagmask)) { params->flags &= ~flagmask; params->flags |= flags; } return 0; }