// getpos(self) // returns: {x=num, y=num, z=num} int ObjectRef::l_getpos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; v3f pos = co->getBasePosition() / BS; lua_newtable(L); lua_pushnumber(L, pos.X); lua_setfield(L, -2, "x"); lua_pushnumber(L, pos.Y); lua_setfield(L, -2, "y"); lua_pushnumber(L, pos.Z); lua_setfield(L, -2, "z"); return 1; }
// to_file(filename) int LuaAreaStore::l_to_file(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; const char *filename = luaL_checkstring(L, 2); CHECK_SECURE_PATH_OPTIONAL(L, filename); std::ostringstream os(std::ios_base::binary); ast->serialize(os); lua_pushboolean(L, fs::safeWriteToFile(filename, os.str())); return 1; }
// hud_set_hotbar_itemcount(self, hotbar_itemcount) int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); if (player == NULL) return 0; s32 hotbar_itemcount = lua_tonumber(L, 2); if (!getServer(L)->hudSetHotbarItemcount(player, hotbar_itemcount)) return 0; lua_pushboolean(L, true); return 1; }
// set_breath(self, breath) int ObjectRef::l_set_breath(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); PlayerSAO* co = getplayersao(ref); if (co == NULL) return 0; u16 breath = luaL_checknumber(L, 2); // Do it co->setBreath(breath); // If the object is a player sent the breath to client if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) getServer(L)->SendPlayerBreath(((PlayerSAO*)co)->getPeerID()); return 0; }
// set_name(self, name) int LuaItemStack::l_set_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; bool status = true; item.name = luaL_checkstring(L, 2); if (item.name == "" || item.empty()) { item.clear(); status = false; } lua_pushboolean(L, status); return 1; }
// get_nametag_attributes(self) int ObjectRef::l_get_nametag_attributes(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); PlayerSAO *playersao = getplayersao(ref); if (playersao == NULL) return 0; video::SColor color = playersao->getNametagColor(); lua_newtable(L); push_ARGB8(L, color); lua_setfield(L, -2, "color"); return 1; }
// to_table(self) -> {[key1]=value1,...} int LuaSettings::l_to_table(lua_State* L) { NO_MAP_LOCK_REQUIRED; LuaSettings* o = checkobject(L, 1); std::vector<std::string> keys = o->m_settings->getNames(); lua_newtable(L); for (unsigned int i=0; i < keys.size(); i++) { lua_pushstring(L, o->m_settings->get(keys[i]).c_str()); lua_setfield(L, -2, keys[i].c_str()); } return 1; }
// hud_add(self, form) int ObjectRef::l_hud_add(lua_State *L) { ObjectRef *ref = checkobject(L, 1); Player *player = getplayer(ref); if (player == NULL) return 0; HudElement *elem = new HudElement; elem->type = (HudElementType)getenumfield(L, 2, "hud_elem_type", es_HudElementType, HUD_ELEM_TEXT); lua_getfield(L, 2, "position"); elem->pos = lua_istable(L, -1) ? read_v2f(L, -1) : v2f(); lua_pop(L, 1); lua_getfield(L, 2, "scale"); elem->scale = lua_istable(L, -1) ? read_v2f(L, -1) : v2f(); lua_pop(L, 1); elem->name = getstringfield_default(L, 2, "name", ""); elem->text = getstringfield_default(L, 2, "text", ""); elem->number = getintfield_default(L, 2, "number", 0); elem->item = getintfield_default(L, 2, "item", 0); elem->dir = getintfield_default(L, 2, "dir", 0); lua_getfield(L, 2, "alignment"); elem->align = lua_istable(L, -1) ? read_v2f(L, -1) : v2f(); lua_pop(L, 1); lua_getfield(L, 2, "offset"); elem->offset = lua_istable(L, -1) ? read_v2f(L, -1) : v2f(); lua_pop(L, 1); lua_getfield(L, 2, "world_pos"); elem->world_pos = lua_istable(L, -1) ? read_v3f(L, -1) : v3f(); lua_pop(L, 1); u32 id = getServer(L)->hudAdd(player, elem); if (id == (u32)-1) { delete elem; return 0; } lua_pushnumber(L, id); return 1; }
// set_cache_params(params) int LuaAreaStore::l_set_cache_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; luaL_checktype(L, 2, LUA_TTABLE); bool enabled = getboolfield_default(L, 2, "enabled", true); u8 block_radius = getintfield_default(L, 2, "block_radius", 64); size_t limit = getintfield_default(L, 2, "block_radius", 1000); ast->setCacheParams(enabled, block_radius, limit); return 0; }
// set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) int ObjectRef::l_set_clouds(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); if (!player) return 0; if (!lua_istable(L, 2)) return 0; CloudParams cloud_params = player->getCloudParams(); cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density); lua_getfield(L, 2, "color"); if (!lua_isnil(L, -1)) read_color(L, -1, &cloud_params.color_bright); lua_pop(L, 1); lua_getfield(L, 2, "ambient"); if (!lua_isnil(L, -1)) read_color(L, -1, &cloud_params.color_ambient); lua_pop(L, 1); cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height ); cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness); lua_getfield(L, 2, "speed"); if (lua_istable(L, -1)) { v2f new_speed; new_speed.X = getfloatfield_default(L, -1, "x", 0); new_speed.Y = getfloatfield_default(L, -1, "y", 0); cloud_params.speed = new_speed; } lua_pop(L, 1); if (!getServer(L)->setClouds(player, cloud_params.density, cloud_params.color_bright, cloud_params.color_ambient, cloud_params.height, cloud_params.thickness, cloud_params.speed)) return 0; player->setCloudParams(cloud_params); lua_pushboolean(L, true); return 1; }
// hud_get(self, id) int ObjectRef::l_hud_get(lua_State *L) { ObjectRef *ref = checkobject(L, 1); Player *player = getplayer(ref); if (player == NULL) return 0; u32 id = lua_tonumber(L, -1); if (id >= player->hud.size()) return 0; HudElement *e = player->hud[id]; if (!e) return 0; lua_newtable(L); lua_pushstring(L, es_HudElementType[(u8)e->type].str); lua_setfield(L, -2, "type"); push_v2f(L, e->pos); lua_setfield(L, -2, "position"); lua_pushstring(L, e->name.c_str()); lua_setfield(L, -2, "name"); push_v2f(L, e->scale); lua_setfield(L, -2, "scale"); lua_pushstring(L, e->text.c_str()); lua_setfield(L, -2, "text"); lua_pushnumber(L, e->number); lua_setfield(L, -2, "number"); lua_pushnumber(L, e->item); lua_setfield(L, -2, "item"); lua_pushnumber(L, e->dir); lua_setfield(L, -2, "dir"); push_v3f(L, e->world_pos); lua_setfield(L, -2, "world_pos"); return 1; }
// set_attribute(self, attribute, value) int ObjectRef::l_set_attribute(lua_State *L) { ObjectRef *ref = checkobject(L, 1); PlayerSAO* co = getplayersao(ref); if (co == NULL) { return 0; } std::string attr = luaL_checkstring(L, 2); if (lua_isnil(L, 3)) { co->removeExtendedAttribute(attr); } else { std::string value = luaL_checkstring(L, 3); co->setExtendedAttribute(attr, value); } return 1; }
// get_string(self, name) int MetaDataRef::l_get_string(lua_State *L) { MAP_LOCK_REQUIRED; MetaDataRef *ref = checkobject(L, 1); std::string name = luaL_checkstring(L, 2); Metadata *meta = ref->getmeta(false); if (meta == NULL) { lua_pushlstring(L, "", 0); return 1; } const std::string &str = meta->getString(name); lua_pushlstring(L, str.c_str(), str.size()); return 1; }
// to_table(self) int MetaDataRef::l_to_table(lua_State *L) { MAP_LOCK_REQUIRED; MetaDataRef *ref = checkobject(L, 1); Metadata *meta = ref->getmeta(true); if (meta == NULL) { lua_pushnil(L); return 1; } lua_newtable(L); ref->handleToTable(L, meta); return 1; }
// hud_remove(self, id) int ObjectRef::l_hud_remove(lua_State *L) { ObjectRef *ref = checkobject(L, 1); Player *player = getplayer(ref); if (player == NULL) return 0; u32 id = -1; if (!lua_isnil(L, 2)) id = lua_tonumber(L, 2); if (!getServer(L)->hudRemove(player, id)) return 0; lua_pushboolean(L, true); return 1; }
// remove_item(self, listname, itemstack or itemstring or table or nil) -> itemstack // Returns the items that were actually removed int InvRef::l_remove_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ ItemStack removed = list->removeItem(item); if(!removed.empty()) reportInventoryChange(L, ref); LuaItemStack::create(L, removed); } else { LuaItemStack::create(L, ItemStack()); } return 1; }
// get_float(self, name) int MetaDataRef::l_get_float(lua_State *L) { MAP_LOCK_REQUIRED; MetaDataRef *ref = checkobject(L, 1); std::string name = luaL_checkstring(L, 2); Metadata *meta = ref->getmeta(false); if (meta == NULL) { lua_pushnumber(L, 0); return 1; } const std::string &str = meta->getString(name); lua_pushnumber(L, stof(str)); return 1; }
// add_item(self, listname, itemstack or itemstring or table or nil) -> itemstack // Returns the leftover stack int InvRef::l_add_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); ItemStack item = read_item(L, 3, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list){ ItemStack leftover = list->addItem(item); if(leftover.count != item.count) reportInventoryChange(L, ref); LuaItemStack::create(L, leftover); } else { LuaItemStack::create(L, item); } return 1; }
// set_stack(self, listname, i, stack) -> true/false int InvRef::l_set_stack(lua_State *L) { NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); int i = luaL_checknumber(L, 3) - 1; ItemStack newitem = read_item(L, 4, getServer(L)->idef()); InventoryList *list = getlist(L, ref, listname); if(list != NULL && i >= 0 && i < (int) list->getSize()){ list->changeItem(i, newitem); reportInventoryChange(L, ref); lua_pushboolean(L, true); } else { lua_pushboolean(L, false); } return 1; }
// set_string(self, name, var) int NodeMetaRef::l_set_string(lua_State *L) { MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); std::string name = luaL_checkstring(L, 2); size_t len = 0; const char *s = lua_tolstring(L, 3, &len); std::string str(s, len); NodeMetadata *meta = getmeta(ref, !str.empty()); if(meta == NULL || str == meta->getString(name)) return 0; meta->setString(name, str); reportMetadataChange(ref); return 0; }
// get_definition(self) -> table // Returns the item definition table from minetest.registered_items, // or a fallback one (name="unknown") int LuaItemStack::l_get_definition(lua_State *L) { LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; // Get minetest.registered_items[name] lua_getglobal(L, "minetest"); lua_getfield(L, -1, "registered_items"); luaL_checktype(L, -1, LUA_TTABLE); lua_getfield(L, -1, item.name.c_str()); if(lua_isnil(L, -1)) { lua_pop(L, 1); lua_getfield(L, -1, "unknown"); } return 1; }
// get_hp(self) // returns: number of hitpoints (2 * number of hearts) // 0 if not applicable to this type of object int ObjectRef::l_get_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) { // Default hp is 1 lua_pushnumber(L, 1); return 1; } int hp = co->getHP(); /*infostream<<"ObjectRef::l_get_hp(): id="<<co->getId() <<" hp="<<hp<<std::endl;*/ // Return lua_pushnumber(L, hp); return 1; }
int LuaRaycast::l_next(lua_State *L) { MAP_LOCK_REQUIRED; ScriptApiItem *script = getScriptApi<ScriptApiItem>(L); GET_ENV_PTR; LuaRaycast *o = checkobject(L, 1); PointedThing pointed; env->continueRaycast(&o->state, &pointed); if (pointed.type == POINTEDTHING_NOTHING) lua_pushnil(L); else script->pushPointedThing(pointed); return 1; }
// set_float(self, name, var) int MetaDataRef::l_set_float(lua_State *L) { MAP_LOCK_REQUIRED; MetaDataRef *ref = checkobject(L, 1); std::string name = luaL_checkstring(L, 2); float a = readParam<float>(L, 3); std::string str = ftos(a); Metadata *meta = ref->getmeta(true); if (meta == NULL || str == meta->getString(name)) return 0; meta->setString(name, str); ref->reportMetadataChange(); return 0; }
int LuaVoxelManip::l_get_data(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; int volume = vm->m_area.getVolume(); lua_newtable(L); for (int i = 0; i != volume; i++) { lua_Integer cid = vm->m_data[i].getContent(); lua_pushinteger(L, cid); lua_rawseti(L, -2, i + 1); } return 1; }
// set_list(self, listname, list) int InvRef::l_set_list(lua_State *L) { NO_MAP_LOCK_REQUIRED; InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); Inventory *inv = getinv(L, ref); if(inv == NULL){ return 0; } InventoryList *list = inv->getList(listname); if(list) read_inventory_list(L, 3, inv, listname, getServer(L), list->getSize()); else read_inventory_list(L, 3, inv, listname, getServer(L)); reportInventoryChange(L, ref); return 0; }
// remove(self) int ObjectRef::l_remove(lua_State *L) { GET_ENV_PTR; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; co->clearChildAttachments(); co->clearParentAttachment(); verbosestream << "ObjectRef::l_remove(): id=" << co->getId() << std::endl; co->m_pending_removal = true; return 0; }
// set_animation_frame_speed(self, frame_speed) int ObjectRef::l_set_animation_frame_speed(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; // Do it if (!lua_isnil(L, 2)) { float frame_speed = lua_tonumber(L, 2); co->setAnimationSpeed(frame_speed); lua_pushboolean(L, true); } else { lua_pushboolean(L, false); } return 1; }
// set_hp(self, hp) // hp = number of hitpoints (2 * number of hearts) // returns: nil int ObjectRef::l_set_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); luaL_checknumber(L, 2); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; int hp = lua_tonumber(L, 2); /*infostream<<"ObjectRef::l_set_hp(): id="<<co->getId() <<" hp="<<hp<<std::endl;*/ // Do it co->setHP(hp); if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co); // Return return 0; }
int LuaVoxelManip::l_read_from_map(lua_State *L) { MAP_LOCK_REQUIRED; LuaVoxelManip *o = checkobject(L, 1); MMVManip *vm = o->vm; v3s16 bp1 = getNodeBlockPos(check_v3s16(L, 2)); v3s16 bp2 = getNodeBlockPos(check_v3s16(L, 3)); sortBoxVerticies(bp1, bp2); vm->initialEmerge(bp1, bp2); push_v3s16(L, vm->m_area.MinEdge); push_v3s16(L, vm->m_area.MaxEdge); return 2; }