Reset cycle timer of AO if manually switching pose + more refactoring

meow-7.2.2
Ansariel 2026-01-23 21:15:57 +01:00
parent 8a52c735da
commit 87c11699b8
6 changed files with 269 additions and 290 deletions

View File

@ -35,7 +35,6 @@
#include "llnotificationsutil.h"
#include "llspinctrl.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "utilitybar.h"
FloaterAO::FloaterAO(const LLSD& key)
@ -51,10 +50,6 @@ FloaterAO::FloaterAO(const LLSD& key)
mEventTimer.stop();
}
FloaterAO::~FloaterAO()
{
}
void FloaterAO::reloading(bool reload)
{
if (reload)
@ -283,9 +278,7 @@ bool FloaterAO::postBuild()
mPreviousButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickPrevious, this));
mNextButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickNext, this));
// <AS:Chanayane> Double click on animation in AO
mAnimationList->setDoubleClickCallback(boost::bind(&FloaterAO::onDoubleClick, this));
// </AS:Chanayane>
updateSmart();
@ -777,15 +770,14 @@ void FloaterAO::onChangeCycleTime()
void FloaterAO::onClickPrevious()
{
AOEngine::instance().cycle(AOEngine::CyclePrevious);
AOEngine::instance().cycle(AOEngine::CyclePrevious, true);
}
void FloaterAO::onClickNext()
{
AOEngine::instance().cycle(AOEngine::CycleNext);
AOEngine::instance().cycle(AOEngine::CycleNext, true);
}
// <AS:Chanayane> Double click on animation in AO
void FloaterAO::onDoubleClick()
{
LLScrollListItem* item = mAnimationList->getFirstSelected();
@ -817,7 +809,6 @@ void FloaterAO::onDoubleClick()
AOEngine::instance().playAnimation(*animUUID);
}
// </AS:Chanayane>
void FloaterAO::onClickMore()
{
@ -872,7 +863,6 @@ void FloaterAO::onAnimationChanged(const LLUUID& animation)
if (mCurrentBoldItem)
{
// <AS:Chanayane> Safer casts
if (LLScrollListCell* icon_cell = mCurrentBoldItem->getColumn(0))
{
if (LLScrollListIcon* icon = dynamic_cast<LLScrollListIcon*>(icon_cell))
@ -888,7 +878,6 @@ void FloaterAO::onAnimationChanged(const LLUUID& animation)
text->setFontStyle(LLFontGL::NORMAL);
}
}
// </AS:Chanayane>
mCurrentBoldItem = nullptr;
}
@ -898,23 +887,17 @@ void FloaterAO::onAnimationChanged(const LLUUID& animation)
return;
}
// <AS:Chanayane> Fix potential nullptr
if (!mAnimationList)
{
LL_WARNS("AO") << "Animation list control is null." << LL_ENDL;
return;
}
// </AS:Chanayane>
// <AS:Chanayane> Safer casts
// why do we have no LLScrollListCtrl::getItemByUserdata() ? -Zi
for (LLScrollListItem* item : mAnimationList->getAllData())
{
LLUUID* id = static_cast<LLUUID*>(item->getUserdata());
// <AS:Chanayane> compares the LLUUID values instead of pointer values
//if (id == &animation)
if (id && *id == animation)
// </AS:Chanayane>
{
mCurrentBoldItem = item;
@ -937,7 +920,6 @@ void FloaterAO::onAnimationChanged(const LLUUID& animation)
return;
}
}
// </AS:Chanayane>
}
// virtual

View File

@ -48,12 +48,12 @@ class FloaterAO
private:
FloaterAO(const LLSD& key);
~FloaterAO();
~FloaterAO() = default;
public:
/*virtual*/ bool postBuild();
virtual void onOpen(const LLSD& key);
virtual void onClose(bool app_quitting);
bool postBuild() override;
void onOpen(const LLSD& key) override;
void onClose(bool app_quitting) override;
void updateList();
void updateScrollListData();
void updateSetParameters();
@ -90,10 +90,7 @@ class FloaterAO
void onClickMore();
void onClickLess();
// <AS:Chanayane> Double click on animation in AO
void onDoubleClick();
// </AS:Chanayane>
void onAnimationChanged(const LLUUID& animation);
@ -108,7 +105,7 @@ class FloaterAO
bool newSetCallback(const LLSD& notification, const LLSD& response);
bool removeSetCallback(const LLSD& notification, const LLSD& response);
virtual bool tick();
bool tick() override;
std::vector<AOSet*> mSetList;
AOSet* mSelectedSet;

View File

@ -151,7 +151,7 @@ void AOEngine::onPauseAO()
}
}
void AOEngine::clear(bool from_timer)
void AOEngine::clear(bool fromTimer)
{
std::move(mSets.begin(), mSets.end(), std::back_inserter(mOldSets));
mSets.clear();
@ -160,7 +160,7 @@ void AOEngine::clear(bool from_timer)
//<ND/> FIRE-3801; We cannot delete any AOSet object if we're called from a timer tick. AOSet is derived from LLEventTimer and destruction will
// fail in ~LLInstanceTracker when a destructor runs during iteration.
if (!from_timer)
if (!fromTimer)
{
std::for_each(mOldSets.begin(), mOldSets.end(), DeletePointer());
mOldSets.clear();
@ -222,7 +222,7 @@ void AOEngine::setLastOverriddenMotion(const LLUUID& motion)
}
}
bool AOEngine::foreignAnimations()
bool AOEngine::foreignAnimations() const
{
// checking foreign animations only makes sense when smart sit is enabled
if (!mCurrentSet->getSmart())
@ -520,7 +520,7 @@ void AOEngine::setStateCycleTimer(const AOSet::AOState* state)
}
}
const LLUUID AOEngine::override(const LLUUID& motion, bool start)
LLUUID AOEngine::override(const LLUUID& motion, bool start)
{
LL_DEBUGS("AOEngine") << "override(" << gAnimLibrary.animationName(motion) << "," << start << ")" << LL_ENDL;
@ -861,7 +861,7 @@ void AOEngine::cycleTimeout(const AOSet* set)
cycle(CycleAny);
}
void AOEngine::cycle(eCycleMode cycleMode)
void AOEngine::cycle(eCycleMode cycleMode, bool resetTimer)
{
if (!mEnabled)
{
@ -980,9 +980,13 @@ void AOEngine::cycle(eCycleMode cycleMode)
gAgent.sendAnimationRequest(oldAnimation, ANIM_REQUEST_STOP);
gAgentAvatarp->LLCharacter::stopMotion(oldAnimation);
}
if (resetTimer)
{
mCurrentSet->resetTimer();
}
}
// <AS:Chanayane> Double click on animation in AO
void AOEngine::playAnimation(const LLUUID& animation)
{
if (!mEnabled)
@ -1098,6 +1102,8 @@ void AOEngine::playAnimation(const LLUUID& animation)
gAgent.sendAnimationRequest(oldAnimation, ANIM_REQUEST_STOP);
gAgentAvatarp->LLCharacter::stopMotion(oldAnimation);
}
mCurrentSet->resetTimer();
}
const AOSet* AOEngine::getCurrentSet() const
@ -1108,7 +1114,6 @@ const AOSet::AOState* AOEngine::getCurrentState() const
{
return mCurrentSet->getStateByRemapID(mLastMotion);
}
// </AS:Chanayane>
void AOEngine::updateSortOrder(AOSet::AOState* state)
{
@ -1746,7 +1751,7 @@ void AOEngine::update()
}
}
void AOEngine::reload(bool aFromTimer)
void AOEngine::reload(bool fromTimer)
{
bool wasEnabled = mEnabled;
@ -1760,7 +1765,7 @@ void AOEngine::reload(bool aFromTimer)
gAgent.stopCurrentAnimations();
mLastOverriddenMotion = ANIM_AGENT_STAND;
clear(aFromTimer);
clear(fromTimer);
mAOFolder.setNull();
mTimerCollection.enableInventoryTimer(true);
tick();
@ -1771,7 +1776,7 @@ void AOEngine::reload(bool aFromTimer)
}
}
AOSet* AOEngine::getSetByName(const std::string& name) const
AOSet* AOEngine::getSetByName(std::string_view name) const
{
for (auto set : mSets)
{
@ -1819,7 +1824,7 @@ void AOEngine::selectSet(AOSet* set)
}
}
AOSet* AOEngine::selectSetByName(const std::string& name)
AOSet* AOEngine::selectSetByName(std::string_view name)
{
if (AOSet* set = getSetByName(name))
{
@ -1880,9 +1885,9 @@ void AOEngine::saveSet(const AOSet* set)
mUpdatedSignal();
}
bool AOEngine::renameSet(AOSet* set, const std::string& name)
bool AOEngine::renameSet(AOSet* set, std::string_view name)
{
if (name.empty() || name.find(":") != std::string::npos)
if (name.empty() || name.find(":") != std::string_view::npos)
{
return false;
}

View File

@ -32,202 +32,191 @@
#include "llextendedstatus.h"
#include "llsingleton.h"
#include "llviewerinventory.h"
#include <boost/signals2.hpp>
class AOTimerCollection
: public LLEventTimer
class AOTimerCollection : public LLEventTimer
{
public:
AOTimerCollection();
~AOTimerCollection() = default;
public:
AOTimerCollection();
~AOTimerCollection() = default;
virtual bool tick();
bool tick() override;
void enableInventoryTimer(bool enable);
void enableSettingsTimer(bool enable);
void enableReloadTimer(bool enable);
void enableImportTimer(bool enable);
void enableInventoryTimer(bool enable);
void enableSettingsTimer(bool enable);
void enableReloadTimer(bool enable);
void enableImportTimer(bool enable);
protected:
void updateTimers();
protected:
void updateTimers();
bool mInventoryTimer;
bool mSettingsTimer;
bool mReloadTimer;
bool mImportTimer;
bool mInventoryTimer;
bool mSettingsTimer;
bool mReloadTimer;
bool mImportTimer;
};
// ----------------------------------------------------
class AOSitCancelTimer
: public LLEventTimer
class AOSitCancelTimer : public LLEventTimer
{
public:
AOSitCancelTimer();
~AOSitCancelTimer() = default;
public:
AOSitCancelTimer();
~AOSitCancelTimer() = default;
void oneShot();
void stop();
void oneShot();
void stop();
virtual bool tick();
bool tick() override;
protected:
S32 mTickCount;
protected:
S32 mTickCount;
};
// ----------------------------------------------------
class AOState;
class LLInventoryItem;
class LLVFS;
class AOEngine
: public LLSingleton<AOEngine>
class AOEngine : public LLSingleton<AOEngine>
{
LLSINGLETON(AOEngine);
~AOEngine();
public:
enum eCycleMode
{
CycleAny,
CycleNext,
CyclePrevious
};
public:
enum eCycleMode
{
CycleAny,
CycleNext,
CyclePrevious
};
void enable(bool enable);
void enableStands(bool enable_stands);
const LLUUID override(const LLUUID& motion, bool start);
void tick();
void update();
void reload(bool);
void reloadStateAnimations(AOSet* set, AOSet::AOState* state);
void clear(bool from_timer);
void enable(bool enable);
void enableStands(bool enable_stands);
LLUUID override(const LLUUID& motion, bool start);
void tick();
void update();
void reload(bool fromTimer);
void reloadStateAnimations(AOSet* set, AOSet::AOState* state);
void clear(bool fromTimer);
const LLUUID& getAOFolder() const;
const LLUUID& getAOFolder() const;
void addSet(const std::string& name, inventory_func_type callback, bool reload = true);
bool removeSet(AOSet* set);
void addSet(const std::string& name, inventory_func_type callback, bool reload = true);
bool removeSet(AOSet* set);
void addAnimation(const AOSet* set, AOSet::AOState* state, const LLInventoryItem* item, bool reload = true);
bool removeAnimation(const AOSet* set, AOSet::AOState* state, S32 index);
void checkSitCancel();
void checkBelowWater(bool check_underwater);
void addAnimation(const AOSet* set, AOSet::AOState* state, const LLInventoryItem* item, bool reload = true);
bool removeAnimation(const AOSet* set, AOSet::AOState* state, S32 index);
void checkSitCancel();
void checkBelowWater(bool check_underwater);
bool importNotecard(const LLInventoryItem* item);
void processImport(bool from_timer);
bool importNotecard(const LLInventoryItem* item);
void processImport(bool from_timer);
bool swapWithPrevious(AOSet::AOState* state, S32 index);
bool swapWithNext(AOSet::AOState* state, S32 index);
bool swapWithPrevious(AOSet::AOState* state, S32 index);
bool swapWithNext(AOSet::AOState* state, S32 index);
void cycleTimeout(const AOSet* set);
void cycle(eCycleMode cycleMode);
void cycleTimeout(const AOSet* set);
void cycle(eCycleMode cycleMode, bool resetTimer = false);
// <AS:Chanayane> Double click on animation in AO
void playAnimation(const LLUUID& animation);
const AOSet* getCurrentSet() const;
const AOSet::AOState* getCurrentState() const;
// </AS:Chanayane>
void playAnimation(const LLUUID& animation);
const AOSet* getCurrentSet() const;
const AOSet::AOState* getCurrentState() const;
void inMouselook(bool mouselook);
void selectSet(AOSet* set);
AOSet* selectSetByName(const std::string& name);
AOSet* getSetByName(const std::string& name) const;
void inMouselook(bool mouselook);
void selectSet(AOSet* set);
AOSet* selectSetByName(std::string_view name);
AOSet* getSetByName(std::string_view name) const;
// callback from LLAppViewer
static void onLoginComplete();
// callback from LLAppViewer
static void onLoginComplete();
const std::vector<AOSet*> getSetList() const;
const std::string getCurrentSetName() const;
const AOSet* getDefaultSet() const;
bool renameSet(AOSet* set, const std::string& name);
const std::vector<AOSet*> getSetList() const;
const std::string getCurrentSetName() const;
const AOSet* getDefaultSet() const;
bool renameSet(AOSet* set, std::string_view name);
void setDefaultSet(AOSet* set);
void setOverrideSits(AOSet* set, bool override_sit);
void setSmart(AOSet* set, bool smart);
void setDisableMouselookStands(AOSet* set, bool disabled);
void setCycle(AOSet::AOState* set, bool cycle);
void setRandomize(AOSet::AOState* state, bool randomize);
void setCycleTime(AOSet::AOState* state, F32 time);
void setDefaultSet(AOSet* set);
void setOverrideSits(AOSet* set, bool override_sit);
void setSmart(AOSet* set, bool smart);
void setDisableMouselookStands(AOSet* set, bool disabled);
void setCycle(AOSet::AOState* set, bool cycle);
void setRandomize(AOSet::AOState* state, bool randomize);
void setCycleTime(AOSet::AOState* state, F32 time);
void saveSettings();
void saveSettings();
typedef boost::signals2::signal<void ()> updated_signal_t;
boost::signals2::connection setReloadCallback(const updated_signal_t::slot_type& cb)
{
return mUpdatedSignal.connect(cb);
};
typedef boost::signals2::signal<void()> updated_signal_t;
boost::signals2::connection setReloadCallback(const updated_signal_t::slot_type& cb)
{
return mUpdatedSignal.connect(cb);
};
typedef boost::signals2::signal<void (const LLUUID&)> animation_changed_signal_t;
boost::signals2::connection setAnimationChangedCallback(const animation_changed_signal_t::slot_type& cb)
{
return mAnimationChangedSignal.connect(cb);
};
typedef boost::signals2::signal<void(const LLUUID&)> animation_changed_signal_t;
boost::signals2::connection setAnimationChangedCallback(const animation_changed_signal_t::slot_type& cb)
{
return mAnimationChangedSignal.connect(cb);
};
protected:
void init();
protected:
void init();
void setLastMotion(const LLUUID& motion);
void setLastOverriddenMotion(const LLUUID& motion);
void setStateCycleTimer(const AOSet::AOState* state);
void setLastMotion(const LLUUID& motion);
void setLastOverriddenMotion(const LLUUID& motion);
void setStateCycleTimer(const AOSet::AOState* state);
void stopAllStandVariants();
void stopAllSitVariants();
void stopAllStandVariants();
void stopAllSitVariants();
bool foreignAnimations();
AOSet::AOState* mapSwimming(const LLUUID& motion) const;
AOSet::AOState* getStateForMotion(const LLUUID& motion) const;
bool foreignAnimations() const;
AOSet::AOState* mapSwimming(const LLUUID& motion) const;
AOSet::AOState* getStateForMotion(const LLUUID& motion) const;
void updateSortOrder(AOSet::AOState* state);
void saveSet(const AOSet* set);
void saveState(const AOSet::AOState* state);
void updateSortOrder(AOSet::AOState* state);
void saveSet(const AOSet* set);
void saveState(const AOSet::AOState* state);
bool createAnimationLink(AOSet::AOState* state, const LLInventoryItem* item);
bool findForeignItems(const LLUUID& uuid) const;
void purgeFolder(const LLUUID& uuid) const;
bool createAnimationLink(AOSet::AOState* state, const LLInventoryItem* item);
bool findForeignItems(const LLUUID& uuid) const;
void purgeFolder(const LLUUID& uuid) const;
void onRegionChange();
void onRegionChange();
void onToggleAOControl();
void onToggleAOStandsControl();
void onPauseAO();
void onToggleAOControl();
void onToggleAOStandsControl();
void onPauseAO();
static void onNotecardLoadComplete(const LLUUID& assetUUID, LLAssetType::EType type,
void* userdata, S32 status, LLExtStat extStatus);
void parseNotecard(const char* buffer);
static void onNotecardLoadComplete(const LLUUID& assetUUID, LLAssetType::EType type, void* userdata, S32 status, LLExtStat extStatus);
void parseNotecard(const char* buffer);
void updatePersistedStateAnimations();
void updatePersistedStateAnimations();
updated_signal_t mUpdatedSignal;
animation_changed_signal_t mAnimationChangedSignal;
updated_signal_t mUpdatedSignal;
animation_changed_signal_t mAnimationChangedSignal;
AOTimerCollection mTimerCollection;
AOSitCancelTimer mSitCancelTimer;
AOTimerCollection mTimerCollection;
AOSitCancelTimer mSitCancelTimer;
bool mEnabled;
bool mEnabledStands;
bool mInMouselook;
bool mUnderWater;
bool mEnabled;
bool mEnabledStands;
bool mInMouselook;
bool mUnderWater;
LLUUID mAOFolder;
LLUUID mLastMotion;
LLUUID mLastOverriddenMotion;
LLUUID mTransitionId;
LLUUID mAOFolder;
LLUUID mLastMotion;
LLUUID mLastOverriddenMotion;
LLUUID mTransitionId;
// this motion will be ignored once in the overrider when stopping, fixes a case
// where the AO doesn't correctly start up on login or when getting enabled manually
LLUUID mIgnoreMotionStopOnce;
// this motion will be ignored once in the overrider when stopping, fixes a case
// where the AO doesn't correctly start up on login or when getting enabled manually
LLUUID mIgnoreMotionStopOnce;
std::vector<AOSet*> mSets;
std::vector<AOSet*> mOldSets;
AOSet* mCurrentSet;
AOSet* mDefaultSet;
std::vector<AOSet*> mSets;
std::vector<AOSet*> mOldSets;
AOSet* mCurrentSet;
AOSet* mDefaultSet;
AOSet* mImportSet;
std::vector<AOSet*> mOldImportSets;
S32 mImportRetryCount;
AOSet* mImportSet;
std::vector<AOSet*> mOldImportSets;
S32 mImportRetryCount;
boost::signals2::connection mRegionChangeConnection;
boost::signals2::connection mRegionChangeConnection;
};
#endif // AOENGINE_H

View File

@ -29,7 +29,7 @@
#include "llanimationstates.h"
#include "llinventorymodel.h"
AOSet::AOSet(const LLUUID inventoryID)
AOSet::AOSet(const LLUUID& inventoryID)
: LLEventTimer(10000.0f),
mInventoryID(inventoryID),
mName("** New AO Set **"),
@ -232,6 +232,12 @@ void AOSet::stopTimer()
mEventTimer.stop();
}
void AOSet::resetTimer()
{
LL_DEBUGS("AOEngine") << "Resetting timer for " << getName() << "." << LL_ENDL;
mEventTimer.reset();
}
bool AOSet::tick()
{
AOEngine::instance().cycleTimeout(this);
@ -253,7 +259,7 @@ const std::string& AOSet::getName() const
return mName;
}
void AOSet::setName(const std::string& name)
void AOSet::setName(std::string_view name)
{
mName = name;
}

View File

@ -29,117 +29,117 @@
class LLInventoryItem;
class AOSet
: public LLEventTimer
class AOSet : public LLEventTimer
{
public:
AOSet(const LLUUID inventoryID);
~AOSet();
public:
AOSet(const LLUUID& inventoryID);
~AOSet();
// keep number and order in sync with list of names in the constructor
enum
{
Start = 0, // convenience, so we don't have to know the name of the first state
Standing = 0,
Walking,
Running,
Sitting,
SittingOnGround,
Crouching,
CrouchWalking,
Landing,
SoftLanding,
StandingUp,
Falling,
FlyingDown,
FlyingUp,
Flying,
FlyingSlow,
Hovering,
Jumping,
PreJumping,
TurningRight,
TurningLeft,
Typing,
Floating,
SwimmingForward,
SwimmingUp,
SwimmingDown,
AOSTATES_MAX
};
struct AOAnimation
{
std::string mName;
LLUUID mAssetUUID;
LLUUID mInventoryUUID;
LLUUID mOriginalUUID;
S32 mSortOrder;
};
struct AOState
{
std::string mName;
std::vector<std::string> mAlternateNames;
std::vector<const LLInventoryItem*> mAddQueue;
LLUUID mRemapID;
bool mCycle;
bool mRandom;
F32 mCycleTime;
std::vector<AOAnimation> mAnimations;
U32 mCurrentAnimation;
LLUUID mCurrentAnimationID;
LLUUID mInventoryUUID;
bool mDirty;
};
const LLUUID& getInventoryUUID() const;
void setInventoryUUID(const LLUUID& inventoryID);
const std::string& getName() const;
void setName(const std::string& name);
bool getSitOverride() const;
void setSitOverride(bool override_sit);
bool getSmart() const;
void setSmart(bool smart);
bool getMouselookStandDisable() const;
void setMouselookStandDisable(bool disable);
bool getComplete() const;
void setComplete(bool complete);
const LLUUID& getMotion() const;
void setMotion(const LLUUID& motion);
bool getDirty() const;
void setDirty(bool dirty);
AOState* getState(S32 eName);
AOState* getStateByName(const std::string& name);
AOState* getStateByRemapID(const LLUUID& id);
const LLUUID& getAnimationForState(AOState* state) const;
void startTimer(F32 timeout);
void stopTimer();
bool tick() override;
std::vector<std::string> mStateNames;
protected:
LLUUID mInventoryID;
// keep number and order in sync with list of names in the constructor
enum
{
Start = 0, // convenience, so we don't have to know the name of the first state
Standing = 0,
Walking,
Running,
Sitting,
SittingOnGround,
Crouching,
CrouchWalking,
Landing,
SoftLanding,
StandingUp,
Falling,
FlyingDown,
FlyingUp,
Flying,
FlyingSlow,
Hovering,
Jumping,
PreJumping,
TurningRight,
TurningLeft,
Typing,
Floating,
SwimmingForward,
SwimmingUp,
SwimmingDown,
AOSTATES_MAX
};
struct AOAnimation
{
std::string mName;
bool mSitOverride;
bool mSmart;
bool mMouselookStandDisable;
bool mComplete;
LLUUID mCurrentMotion;
bool mDirty;
LLUUID mAssetUUID;
LLUUID mInventoryUUID;
LLUUID mOriginalUUID;
S32 mSortOrder;
};
AOState mStates[AOSTATES_MAX];
struct AOState
{
std::string mName;
std::vector<std::string> mAlternateNames;
std::vector<const LLInventoryItem*> mAddQueue;
LLUUID mRemapID;
bool mCycle;
bool mRandom;
F32 mCycleTime;
std::vector<AOAnimation> mAnimations;
U32 mCurrentAnimation;
LLUUID mCurrentAnimationID;
LLUUID mInventoryUUID;
bool mDirty;
};
const LLUUID& getInventoryUUID() const;
void setInventoryUUID(const LLUUID& inventoryID);
const std::string& getName() const;
void setName(std::string_view name);
bool getSitOverride() const;
void setSitOverride(bool override_sit);
bool getSmart() const;
void setSmart(bool smart);
bool getMouselookStandDisable() const;
void setMouselookStandDisable(bool disable);
bool getComplete() const;
void setComplete(bool complete);
const LLUUID& getMotion() const;
void setMotion(const LLUUID& motion);
bool getDirty() const;
void setDirty(bool dirty);
AOState* getState(S32 eName);
AOState* getStateByName(const std::string& name);
AOState* getStateByRemapID(const LLUUID& id);
const LLUUID& getAnimationForState(AOState* state) const;
void startTimer(F32 timeout);
void stopTimer();
void resetTimer();
bool tick() override;
std::vector<std::string> mStateNames;
protected:
LLUUID mInventoryID;
std::string mName;
bool mSitOverride;
bool mSmart;
bool mMouselookStandDisable;
bool mComplete;
LLUUID mCurrentMotion;
bool mDirty;
AOState mStates[AOSTATES_MAX];
};
#endif // AOSET_H