Animation switchover to swimming when avatar goes under water.

master
ZiRee 2011-04-25 07:27:58 +02:00
parent 86e5e7ab91
commit 03b24043f7
3 changed files with 49 additions and 1 deletions

View File

@ -55,6 +55,7 @@ AOEngine::AOEngine() :
mDefaultSet(0),
mEnabled(FALSE),
mInMouselook(FALSE),
mUnderWater(FALSE),
mImportSet(0),
mImportCategory(LLUUID::null),
mAOFolder(LLUUID::null),
@ -133,6 +134,37 @@ BOOL AOEngine::foreignAnimations()
return FALSE;
}
LLUUID AOEngine::mapSwimming(LLUUID motion)
{
S32 stateNum;
llwarns << __LINE__ << llendl;
if(motion==ANIM_AGENT_HOVER)
stateNum=AOSet::Floating;
else if(motion==ANIM_AGENT_FLY)
stateNum=AOSet::SwimmingForward;
else if(motion==ANIM_AGENT_HOVER_UP)
stateNum=AOSet::SwimmingUp;
else if(motion==ANIM_AGENT_HOVER_DOWN)
stateNum=AOSet::SwimmingDown;
else
return LLUUID::null;
llwarns << __LINE__ << " " << stateNum << llendl;
AOSet::AOState* state=mCurrentSet->getState(stateNum);
llwarns << __LINE__ << " " << state->mName << llendl;
return mCurrentSet->getAnimationForState(state);
}
void AOEngine::checkBelowWater(BOOL yes)
{
if(mUnderWater==yes)
return;
gAgent.sendAnimationRequest(override(mLastOverriddenMotion,FALSE),ANIM_REQUEST_STOP);
mUnderWater=yes;
gAgent.sendAnimationRequest(override(mLastOverriddenMotion,TRUE),ANIM_REQUEST_START);
}
void AOEngine::enable(BOOL yes)
{
lldebugs << "using " << mLastMotion << " enable " << yes << llendl;
@ -297,7 +329,13 @@ const LLUUID AOEngine::override(const LLUUID pMotion,BOOL start)
if(motion!=ANIM_AGENT_TYPE)
mCurrentSet->setMotion(motion);
animation=mCurrentSet->getAnimationForState(state);
mUnderWater=gAgentAvatarp->mBelowWater;
if(mUnderWater)
animation=mapSwimming(motion);
if(animation.isNull())
animation=mCurrentSet->getAnimationForState(state);
state->mCurrentAnimationID=animation;
lldebugs << "overriding " << gAnimLibrary.animStateToString(motion)
<< " with " << animation

View File

@ -111,6 +111,7 @@ class AOEngine
BOOL 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 yes);
BOOL importNotecard(const LLInventoryItem* item);
void processImport();
@ -156,6 +157,7 @@ class AOEngine
void stopAllSitVariants();
BOOL foreignAnimations();
LLUUID mapSwimming(LLUUID motion);
void updateSortOrder(AOSet::AOState* state);
void saveSet(const AOSet* set);
@ -175,9 +177,12 @@ class AOEngine
BOOL mEnabled;
BOOL mInMouselook;
BOOL mUnderWater;
LLUUID mAOFolder;
LLUUID mLastMotion;
LLUUID mLastOverriddenMotion;
std::vector<AOSet*> mSets;
AOSet* mCurrentSet;
AOSet* mDefaultSet;

View File

@ -3296,7 +3296,12 @@ void LLVOAvatar::idleUpdateBelowWater()
F32 water_height;
water_height = getRegion()->getWaterHeight();
BOOL wasBelowWater = mBelowWater; // ## Zi: Animation Overrider
mBelowWater = avatar_height < water_height;
// ## Zi: Animation Overrider
if (wasBelowWater != mBelowWater)
AOEngine::instance().checkBelowWater(mBelowWater);
// ## Zi: Animation Overrider
}
void LLVOAvatar::slamPosition()