2024-01-03 13:34:38 +00:00
# include "PropertyBehavior.h"
# include "Amf3.h"
# include "BehaviorStates.h"
# include "ControlBehaviorMsgs.h"
PropertyBehavior : : PropertyBehavior ( ) {
m_LastEditedState = BehaviorState : : HOME_STATE ;
}
template < >
void PropertyBehavior : : HandleMsg ( AddStripMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( AddActionMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( RearrangeStripMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( UpdateActionMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( UpdateStripUiMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( RemoveStripMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( RemoveActionsMessage & msg ) {
m_States [ msg . GetActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( SplitStripMessage & msg ) {
m_States [ msg . GetSourceActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_States [ msg . GetDestinationActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetDestinationActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( MigrateActionsMessage & msg ) {
m_States [ msg . GetSourceActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_States [ msg . GetDestinationActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetDestinationActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( MergeStripsMessage & msg ) {
m_States [ msg . GetSourceActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_States [ msg . GetDestinationActionContext ( ) . GetStateId ( ) ] . HandleMsg ( msg ) ;
m_LastEditedState = msg . GetDestinationActionContext ( ) . GetStateId ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( RenameMessage & msg ) {
m_Name = msg . GetName ( ) ;
} ;
template < >
void PropertyBehavior : : HandleMsg ( AddMessage & msg ) {
// TODO Parse the corresponding behavior xml file.
m_BehaviorId = msg . GetBehaviorId ( ) ;
isLoot = m_BehaviorId ! = 7965 ;
} ;
void PropertyBehavior : : SendBehaviorListToClient ( AMFArrayValue & args ) const {
args . Insert ( " id " , std : : to_string ( m_BehaviorId ) ) ;
args . Insert ( " name " , m_Name ) ;
args . Insert ( " isLocked " , isLocked ) ;
args . Insert ( " isLoot " , isLoot ) ;
}
void PropertyBehavior : : VerifyLastEditedState ( ) {
if ( ! m_States [ m_LastEditedState ] . IsEmpty ( ) ) return ;
for ( const auto & [ stateId , state ] : m_States ) {
if ( state . IsEmpty ( ) ) continue ;
2024-03-08 21:44:02 +00:00
Log : : Debug ( " Updating last edited state to {:d} because {:d} is empty. " , GeneralUtils : : ToUnderlying ( stateId ) , GeneralUtils : : ToUnderlying ( m_LastEditedState ) ) ;
2024-01-03 13:34:38 +00:00
m_LastEditedState = stateId ;
return ;
}
2024-03-08 21:44:02 +00:00
Log : : Debug ( " No states found, sending default state " ) ;
2024-01-03 13:34:38 +00:00
m_LastEditedState = BehaviorState : : HOME_STATE ;
}
void PropertyBehavior : : SendBehaviorBlocksToClient ( AMFArrayValue & args ) const {
2024-02-18 06:38:26 +00:00
auto * const stateArray = args . InsertArray ( " states " ) ;
2024-01-03 13:34:38 +00:00
2024-02-18 06:38:26 +00:00
for ( const auto & [ stateId , state ] : m_States ) {
2024-01-03 13:34:38 +00:00
if ( state . IsEmpty ( ) ) continue ;
2024-03-08 21:44:02 +00:00
Log : : Debug ( " Serializing state {:d} " , GeneralUtils : : ToUnderlying ( stateId ) ) ;
2024-02-18 06:38:26 +00:00
auto * const stateArgs = stateArray - > PushArray ( ) ;
2024-01-03 13:34:38 +00:00
stateArgs - > Insert ( " id " , static_cast < double > ( stateId ) ) ;
state . SendBehaviorBlocksToClient ( * stateArgs ) ;
}
2024-02-18 06:38:26 +00:00
auto * const executionState = args . InsertArray ( " executionState " ) ;
2024-01-03 13:34:38 +00:00
executionState - > Insert ( " stateID " , static_cast < double > ( m_LastEditedState ) ) ;
executionState - > InsertArray ( " strips " ) ;
// TODO Serialize the execution state of the behavior
}