summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMnikolenko Productengine <mnikolenko@productengine.com>2024-08-30 12:18:20 +0300
committerMnikolenko Productengine <mnikolenko@productengine.com>2024-08-30 12:18:20 +0300
commit6e47dc1af90c242c792c90e93d013355c9a43b97 (patch)
tree406c8d49cbb6e759c8eb4dad7b3f4263f8acbddf
parent11e6c77129ae27756df627ccc1ea0ffa279976e6 (diff)
Add Lua api to start/stop playing animation
-rw-r--r--indra/newview/llagentlistener.cpp66
-rw-r--r--indra/newview/llagentlistener.h4
-rw-r--r--indra/newview/scripts/lua/require/LLAgent.lua14
3 files changed, 84 insertions, 0 deletions
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 80460666a5..95b7ebd5db 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -34,12 +34,14 @@
#include "llagentcamera.h"
#include "llvoavatar.h"
#include "llcommandhandler.h"
+#include "llinventorymodel.h"
#include "llslurl.h"
#include "llurldispatcher.h"
#include "llviewernetwork.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
+#include "llvoavatarself.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
#include "lltoolgrab.h"
@@ -157,6 +159,19 @@ LLAgentListener::LLAgentListener(LLAgent &agent)
add("removeCameraParams",
"Reset Follow camera params",
&LLAgentListener::removeFollowCamParams);
+
+ add("playAnimation",
+ "Play [\"item_id\"] animation locally (by default) or [\"inworld\"] (when set to true)",
+ &LLAgentListener::playAnimation,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
+ add("stopAnimation",
+ "Stop playing [\"item_id\"] animation",
+ &LLAgentListener::stopAnimation,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
+ add("getAnimationInfo",
+ "Return information about [\"item_id\"] animation",
+ &LLAgentListener::getAnimationInfo,
+ llsd::map("item_id", LLSD(), "reply", LLSD()));
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
@@ -591,3 +606,54 @@ void LLAgentListener::removeFollowCamParams(LLSD const & event) const
{
LLFollowCamMgr::getInstance()->removeFollowCamParams(gAgentID);
}
+
+void LLAgentListener::playAnimation(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID());
+ if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION))
+ {
+ return response.error(stringize("Item ", std::quoted(event_data["item_id"].asString()), " was not found"));
+ }
+ LLUUID assset_id = item->getAssetUUID();
+ if(event_data["inworld"].asBoolean())
+ {
+ gAgent.sendAnimationRequest(assset_id, ANIM_REQUEST_START);
+ }
+ else
+ {
+ gAgentAvatarp->startMotion(assset_id);
+ }
+}
+
+void LLAgentListener::stopAnimation(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID());
+ if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION))
+ {
+ return response.error(stringize("Item ", std::quoted(event_data["item_id"].asString()), " was not found"));
+ }
+ LLUUID assset_id = item->getAssetUUID();
+ gAgentAvatarp->stopMotion(assset_id);
+ gAgent.sendAnimationRequest(assset_id, ANIM_REQUEST_STOP);
+}
+
+void LLAgentListener::getAnimationInfo(LLSD const &event_data)
+{
+ Response response(LLSD(), event_data);
+ LLUUID item_id(event_data["item_id"].asUUID());
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION))
+ {
+ return response.error(stringize("Item ", std::quoted(item_id.asString()), " was not found"));
+ }
+ // if motion exists, will return existing one
+ LLMotion* motion = gAgentAvatarp->createMotion(item->getAssetUUID());
+ response["anim_info"].insert(item_id.asString(),
+ llsd::map("duration", motion->getDuration(),
+ "is_loop", motion->getLoop(),
+ "num_joints", motion->getNumJointMotions(),
+ "asset_id", item->getAssetUUID(),
+ "priority", motion->getPriority()));
+}
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 2a24de3f52..cf914a17d0 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -60,6 +60,10 @@ private:
void setFollowCamParams(LLSD const & event_data) const;
void setFollowCamActive(LLSD const & event_data) const;
void removeFollowCamParams(LLSD const & event_data) const;
+
+ void playAnimation(LLSD const &event_data);
+ void stopAnimation(LLSD const &event_data);
+ void getAnimationInfo(LLSD const &event_data);
LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
diff --git a/indra/newview/scripts/lua/require/LLAgent.lua b/indra/newview/scripts/lua/require/LLAgent.lua
index 5ee092f2f6..56907f53cd 100644
--- a/indra/newview/scripts/lua/require/LLAgent.lua
+++ b/indra/newview/scripts/lua/require/LLAgent.lua
@@ -53,4 +53,18 @@ function LLAgent.removeCamParams()
leap.send('LLAgent', {op = 'removeCameraParams'})
end
+function LLAgent.playAnimation(...)
+ local args = mapargs('item_id,inworld', ...)
+ args.op = 'playAnimation'
+ return leap.request('LLAgent', args)
+end
+
+function LLAgent.stopAnimation(item_id)
+ return leap.request('LLAgent', {op = 'stopAnimation', item_id=item_id})
+end
+
+function LLAgent.getAnimationInfo(item_id)
+ return leap.request('LLAgent', {op = 'getAnimationInfo', item_id=item_id}).anim_info
+end
+
return LLAgent