// get_attach(self) int ObjectRef::l_get_attach(lua_State *L) { GET_ENV_PTR; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; // Do it int parent_id = 0; std::string bone; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); co->getAttachment(&parent_id, &bone, &position, &rotation); if (!parent_id) return 0; ServerActiveObject *parent = env->getActiveObject(parent_id); getScriptApiBase(L)->objectrefGetOrCreate(L, parent); lua_pushlstring(L, bone.c_str(), bone.size()); push_v3f(L, position); push_v3f(L, rotation); return 4; }
// set_detach(self) int ObjectRef::l_set_detach(lua_State *L) { GET_ENV_PTR; ObjectRef *ref = checkobject(L, 1); ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; int parent_id = 0; std::string bone = ""; v3f position; v3f rotation; co->getAttachment(&parent_id, &bone, &position, &rotation); ServerActiveObject *parent = NULL; if (parent_id) { parent = env->getActiveObject(parent_id); co->setAttachment(0, "", position, rotation); } else { co->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); } // Do it if (parent != NULL) parent->removeAttachmentChild(co->getId()); return 0; }
LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env) { if (!sao->isAttached()) return nullptr; int id; std::string bone; v3f dummy; sao->getAttachment(&id, &bone, &dummy, &dummy); ServerActiveObject *ao = env->getActiveObject(id); while (id && ao) { ao->getAttachment(&id, &bone, &dummy, &dummy); if (id) ao = env->getActiveObject(id); } return dynamic_cast<LuaEntitySAO *>(ao); }
// set_attach(self, parent, bone, position, rotation) int ObjectRef::l_set_attach(lua_State *L) { GET_ENV_PTR; ObjectRef *ref = checkobject(L, 1); ObjectRef *parent_ref = checkobject(L, 2); ServerActiveObject *co = getobject(ref); ServerActiveObject *parent = getobject(parent_ref); if (co == NULL) return 0; if (parent == NULL) return 0; // Do it int parent_id = 0; std::string bone = ""; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); co->getAttachment(&parent_id, &bone, &position, &rotation); if (parent_id) { ServerActiveObject *old_parent = env->getActiveObject(parent_id); if (old_parent) old_parent->removeAttachmentChild(co->getId()); } bone = ""; if (!lua_isnil(L, 3)) bone = lua_tostring(L, 3); position = v3f(0, 0, 0); if (!lua_isnil(L, 4)) position = read_v3f(L, 4); rotation = v3f(0, 0, 0); if (!lua_isnil(L, 5)) rotation = read_v3f(L, 5); co->setAttachment(parent->getId(), bone, position, rotation); parent->addAttachmentChild(co->getId()); return 0; }