diff --git a/Engine/source/T3D/aiPlayer.cpp b/Engine/source/T3D/aiPlayer.cpp index 8992c2c55..8b35e478e 100644 --- a/Engine/source/T3D/aiPlayer.cpp +++ b/Engine/source/T3D/aiPlayer.cpp @@ -563,6 +563,21 @@ bool AIPlayer::getAIMove(Move *movePtr) } } + Pose desiredPose = mPose; + + if ( mSwimming ) + desiredPose = SwimPose; + else if ( mAiPose == 1 && canCrouch() ) + desiredPose = CrouchPose; + else if ( mAiPose == 2 && canProne() ) + desiredPose = PronePose; + else if ( mAiPose == 3 && canSprint() ) + desiredPose = SprintPose; + else if ( canStand() ) + desiredPose = StandPose; + + setPose( desiredPose ); + // Replicate the trigger state into the move so that // triggers can be controlled from scripts. for( U32 i = 0; i < MaxTriggerKeys; i++ ) @@ -591,6 +606,16 @@ bool AIPlayer::getAIMove(Move *movePtr) return true; } +void AIPlayer::setAiPose( S32 pose ) +{ + mAiPose = pose; +} + +S32 AIPlayer::getAiPose() +{ + return mAiPose; +} + /** * Utility function to throw callbacks. Callbacks always occure * on the datablock class. @@ -1348,3 +1373,18 @@ DefineEngineMethod( AIPlayer, clearMoveTriggers, void, ( ),, { object->clearMoveTriggers(); } + +DefineEngineMethod( AIPlayer, setAiPose, void, ( S32 pose ),, + "@brief Sets the AiPose for an AI object.\n" + "@param pose StandPose=0, CrouchPose=1, PronePose=2, SprintPose=3.\n" + "Uses the new AiPose variable from shapebase (as defined in its PlayerData datablock).\n") +{ + object->setAiPose(pose); +} + +DefineEngineMethod( AIPlayer, getAiPose, S32, (),, + "@brief Get the object's current AiPose.\n" + "@return StandPose=0, CrouchPose=1, PronePose=2, SprintPose=3.\n") +{ + return object->getAiPose(); +} diff --git a/Engine/source/T3D/aiPlayer.h b/Engine/source/T3D/aiPlayer.h index d693314eb..f072d2423 100644 --- a/Engine/source/T3D/aiPlayer.h +++ b/Engine/source/T3D/aiPlayer.h @@ -179,7 +179,9 @@ public: void setMoveDestination( const Point3F &location, bool slowdown ); Point3F getMoveDestination() const { return mMoveDestination; } void stopMove(); - + void setAiPose( S32 pose ); + S32 getAiPose(); + // Trigger sets/gets void setMoveTrigger( U32 slot, const bool isSet = true ); bool getMoveTrigger( U32 slot ) const; diff --git a/Engine/source/T3D/player.cpp b/Engine/source/T3D/player.cpp index 6e33284a6..d05609523 100644 --- a/Engine/source/T3D/player.cpp +++ b/Engine/source/T3D/player.cpp @@ -3173,18 +3173,21 @@ void Player::updateMove(const Move* move) // Update the PlayerPose Pose desiredPose = mPose; - if ( mSwimming ) - desiredPose = SwimPose; - else if ( runSurface && move->trigger[sCrouchTrigger] && canCrouch() ) - desiredPose = CrouchPose; - else if ( runSurface && move->trigger[sProneTrigger] && canProne() ) - desiredPose = PronePose; - else if ( move->trigger[sSprintTrigger] && canSprint() ) - desiredPose = SprintPose; - else if ( canStand() ) - desiredPose = StandPose; + if ( !mIsAiControlled ) + { + if ( mSwimming ) + desiredPose = SwimPose; + else if ( runSurface && move->trigger[sCrouchTrigger] && canCrouch() ) + desiredPose = CrouchPose; + else if ( runSurface && move->trigger[sProneTrigger] && canProne() ) + desiredPose = PronePose; + else if ( move->trigger[sSprintTrigger] && canSprint() ) + desiredPose = SprintPose; + else if ( canStand() ) + desiredPose = StandPose; - setPose( desiredPose ); + setPose( desiredPose ); + } } @@ -6186,6 +6189,10 @@ U32 Player::packUpdate(NetConnection *con, U32 mask, BitStream *stream) { stream->writeFlag(mFalling); + stream->writeFlag(mSwimming); + stream->writeFlag(mJetting); + stream->writeInt(mPose, NumPoseBits); + stream->writeInt(mState,NumStateBits); if (stream->writeFlag(mState == RecoverState)) stream->writeInt(mRecoverTicks,PlayerData::RecoverDelayBits); @@ -6282,7 +6289,11 @@ void Player::unpackUpdate(NetConnection *con, BitStream *stream) if (stream->readFlag()) { mPredictionCount = sMaxPredictionTicks; mFalling = stream->readFlag(); - + + mSwimming = stream->readFlag(); + mJetting = stream->readFlag(); + mPose = (Pose)(stream->readInt(NumPoseBits)); + ActionState actionState = (ActionState)stream->readInt(NumStateBits); if (stream->readFlag()) { mRecoverTicks = stream->readInt(PlayerData::RecoverDelayBits); diff --git a/Engine/source/T3D/shapeBase.cpp b/Engine/source/T3D/shapeBase.cpp index 55b258a72..52ea070e3 100644 --- a/Engine/source/T3D/shapeBase.cpp +++ b/Engine/source/T3D/shapeBase.cpp @@ -879,6 +879,7 @@ IMPLEMENT_CALLBACK( ShapeBase, validateCameraFov, F32, (F32 fov), (fov), ShapeBase::ShapeBase() : mDataBlock( NULL ), mIsAiControlled( false ), + mAiPose( 0 ), mControllingObject( NULL ), mMoveMotion( false ), mShapeBaseMount( NULL ), diff --git a/Engine/source/T3D/shapeBase.h b/Engine/source/T3D/shapeBase.h index fcada642b..5a7ff5eb1 100644 --- a/Engine/source/T3D/shapeBase.h +++ b/Engine/source/T3D/shapeBase.h @@ -874,6 +874,7 @@ protected: /// @name Physical Properties /// @{ + S32 mAiPose; ///< Current pose. F32 mEnergy; ///< Current enery level. F32 mRechargeRate; ///< Energy recharge rate (in units/tick).