Browse Source

Added scriptable move triggers for AIPlayers. Fixes an issue where AIPlayers were setting move trigger states from invalid memory. Enables the use of player poses and actions.

GuyAllard 10 years ago
parent
commit
bc230be8a2
2 changed files with 99 additions and 3 deletions
  1. 92 3
      Engine/source/T3D/aiPlayer.cpp
  2. 7 0
      Engine/source/T3D/aiPlayer.h

+ 92 - 3
Engine/source/T3D/aiPlayer.cpp

@@ -101,6 +101,9 @@ AIPlayer::AIPlayer()
    mAimOffset = Point3F(0.0f, 0.0f, 0.0f);
    mAimOffset = Point3F(0.0f, 0.0f, 0.0f);
 
 
    mIsAiControlled = true;
    mIsAiControlled = true;
+
+   for( S32 i = 0; i < MaxTriggerKeys; i ++ )
+      mMoveTriggers[ i ] = false;
 }
 }
 
 
 /**
 /**
@@ -438,8 +441,8 @@ bool AIPlayer::getAIMove(Move *movePtr)
 
 
    // Replicate the trigger state into the move so that
    // Replicate the trigger state into the move so that
    // triggers can be controlled from scripts.
    // triggers can be controlled from scripts.
-   for( S32 i = 0; i < MaxTriggerKeys; i++ )
-      movePtr->trigger[i] = getImageTriggerState(i);
+   for( U32 i = 0; i < MaxTriggerKeys; i++ )
+      movePtr->trigger[ i ] = mMoveTriggers[ i ];
 
 
    mLastLocation = location;
    mLastLocation = location;
 
 
@@ -457,6 +460,52 @@ void AIPlayer::throwCallback( const char *name )
    Con::executef(getDataBlock(), name, getIdString());
    Con::executef(getDataBlock(), name, getIdString());
 }
 }
 
 
+/**
+* Set the state of a movement trigger.
+*
+* @param slot The trigger slot to set
+* @param isSet set/unset the trigger
+*/
+void AIPlayer::setMoveTrigger( U32 slot, const bool isSet )
+{
+   if(slot >= MaxTriggerKeys)
+   {
+      Con::errorf("Attempting to set an invalid trigger slot (%i)", slot);
+   }
+   else
+   {
+      mMoveTriggers[ slot ] = isSet;   // set the trigger
+      setMaskBits(NoWarpMask);         // force the client to updateMove
+   }
+}
+
+/**
+* Get the state of a movement trigger.
+*
+* @param slot The trigger slot to query
+* @return True if the trigger is set, false if it is not set
+*/
+bool AIPlayer::getMoveTrigger( U32 slot ) const
+{
+   if(slot >= MaxTriggerKeys)
+   {
+      Con::errorf("Attempting to get an invalid trigger slot (%i)", slot);
+      return false;
+   }
+   else
+   {
+      return mMoveTriggers[ slot ];
+   }
+}
+
+/**
+* Clear the trigger state for all movement triggers.
+*/
+void AIPlayer::clearMoveTriggers()
+{
+   for( U32 i = 0; i < MaxTriggerKeys; i ++ )
+      setMoveTrigger( i, false );
+}
 
 
 // --------------------------------------------------------------------------------------------
 // --------------------------------------------------------------------------------------------
 // Console Functions
 // Console Functions
@@ -713,4 +762,44 @@ DefineEngineMethod(AIPlayer, checkInFoV, bool, (ShapeBase* obj, F32 fov, bool ch
    "@checkEnabled check whether the object can take damage and if so is still alive.(Defaults to false)\n")
    "@checkEnabled check whether the object can take damage and if so is still alive.(Defaults to false)\n")
 {
 {
    return object->checkInFoV(obj, fov, checkEnabled);
    return object->checkInFoV(obj, fov, checkEnabled);
-}
+}
+
+DefineEngineMethod( AIPlayer, setMoveTrigger, void, ( U32 slot ),,
+   "@brief Sets a movement trigger on an AI object.\n\n"
+   "@param slot The trigger slot to set.\n"
+   "@see getMoveTrigger()\n"
+   "@see clearMoveTrigger()\n"
+   "@see clearMoveTriggers()\n")
+{
+   object->setMoveTrigger( slot, true );
+}
+
+DefineEngineMethod( AIPlayer, clearMoveTrigger, void, ( U32 slot ),,
+   "@brief Clears a movement trigger on an AI object.\n\n"
+   "@param slot The trigger slot to set.\n"
+   "@see setMoveTrigger()\n"
+   "@see getMoveTrigger()\n"
+   "@see clearMoveTriggers()\n")
+{
+   object->setMoveTrigger( slot, false );
+}
+
+DefineEngineMethod( AIPlayer, getMoveTrigger, bool, ( U32 slot ),,
+   "@brief Tests if a movement trigger on an AI object is set.\n\n"
+   "@param slot The trigger slot to check.\n"
+   "@return a boolean indicating if the trigger is set/unset.\n"
+   "@see setMoveTrigger()\n"
+   "@see clearMoveTrigger()\n"
+   "@see clearMoveTriggers()\n")
+{
+   return object->getMoveTrigger( slot );
+}
+
+DefineEngineMethod( AIPlayer, clearMoveTriggers, void, ( ),,
+   "@brief Clear ALL movement triggers on an AI object.\n"
+   "@see setMoveTrigger()\n"
+   "@see getMoveTrigger()\n"
+   "@see clearMoveTrigger()\n")
+{
+   object->clearMoveTriggers();
+}

+ 7 - 0
Engine/source/T3D/aiPlayer.h

@@ -58,6 +58,9 @@ private:
 
 
    Point3F mAimOffset;
    Point3F mAimOffset;
 
 
+   // move triggers
+   bool mMoveTriggers[MaxTriggerKeys];
+
    // Utility Methods
    // Utility Methods
    void throwCallback( const char *name );
    void throwCallback( const char *name );
 
 
@@ -91,6 +94,10 @@ public:
    void setMoveDestination( const Point3F &location, bool slowdown );
    void setMoveDestination( const Point3F &location, bool slowdown );
    Point3F getMoveDestination() const { return mMoveDestination; }
    Point3F getMoveDestination() const { return mMoveDestination; }
    void stopMove();
    void stopMove();
+
+   void setMoveTrigger( U32 slot, const bool isSet = true );
+   bool getMoveTrigger( U32 slot ) const;
+   void clearMoveTriggers();
 };
 };
 
 
 #endif
 #endif