1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-05 10:17:46 +00:00

wip: encounter timeline use InstanceContentPtr instead of EncounterFightPtr

This commit is contained in:
Tahir 2024-05-10 15:48:42 +01:00
parent f96c633c6c
commit 576930dcfc
3 changed files with 55 additions and 55 deletions

View file

@ -31,13 +31,16 @@ namespace Sapphire::Entity
enum BNpcFlag enum BNpcFlag
{ {
None = 0, None = 0x00,
Immobile = 1, Immobile = 0x01,
TurningDisabled = 2, TurningDisabled = 0x02,
Invincible = 4, Invincible = 0x04,
InvincibleRefill = 8, InvincibleRefill = 0x08,
NoDeaggro = 16, NoDeaggro = 0x10,
Untargetable = 32, Untargetable = 0x20,
AutoAttackDisabled = 0x40,
Intermission = 0x77 // for transition phases to ensure boss only moves/acts when scripted
}; };
const std::array< uint32_t, 50 > BnpcBaseHp = const std::array< uint32_t, 50 > BnpcBaseHp =

View file

@ -8,9 +8,9 @@
namespace Sapphire namespace Sapphire
{ {
bool EncounterTimeline::ConditionHp::isConditionMet( EncounterFightPtr pFight, uint64_t time ) bool EncounterTimeline::ConditionHp::isConditionMet( InstanceContentPtr pInstance, uint64_t time )
{ {
auto pBNpc = pFight->getBNpc( layoutId ); auto pBNpc = pInstance->getActiveBNpcByLayoutId( layoutId );
if( !pBNpc ) if( !pBNpc )
return false; return false;
@ -29,10 +29,8 @@ namespace Sapphire
return false; return false;
}; };
bool EncounterTimeline::ConditionDirectorVar::isConditionMet( EncounterFightPtr pFight, uint64_t time ) bool EncounterTimeline::ConditionDirectorVar::isConditionMet( InstanceContentPtr pInstance, uint64_t time )
{ {
auto pInstance = pFight->getInstance();
// todo: use something other than InstanceContentPtr // todo: use something other than InstanceContentPtr
if( !pInstance ) if( !pInstance )
return false; return false;
@ -55,9 +53,9 @@ namespace Sapphire
return false; return false;
} }
bool EncounterTimeline::ConditionCombatState::isConditionMet( EncounterFightPtr pFight, uint64_t time) bool EncounterTimeline::ConditionCombatState::isConditionMet( InstanceContentPtr pInstance, uint64_t time)
{ {
auto pBattleNpc = pFight->getBNpc( this->layoutId ); auto pBattleNpc = pInstance->getActiveBNpcByLayoutId( this->layoutId );
switch( combatState ) switch( combatState )
{ {
@ -85,7 +83,7 @@ namespace Sapphire
return false; return false;
} }
void EncounterTimeline::Timepoint::update( EncounterFightPtr pFight, uint64_t time ) void EncounterTimeline::Timepoint::update( InstanceContentPtr pInstance, uint64_t time )
{ {
m_lastTick = time; m_lastTick = time;
switch( m_type ) switch( m_type )
@ -93,7 +91,7 @@ namespace Sapphire
case TimepointDataType::Idle: case TimepointDataType::Idle:
{ {
auto pIdleData = std::dynamic_pointer_cast< TimepointDataIdle, TimepointData >( getData() ); auto pIdleData = std::dynamic_pointer_cast< TimepointDataIdle, TimepointData >( getData() );
auto pBNpc = pFight->getBNpc( pIdleData->m_actorId ); auto pBNpc = pInstance->getActiveBNpcByLayoutId( pIdleData->m_layoutId );
if( pBNpc ) if( pBNpc )
{ {
@ -112,7 +110,7 @@ namespace Sapphire
case TimepointDataType::MoveTo: case TimepointDataType::MoveTo:
{ {
auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( getData() ); auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( getData() );
auto pBNpc = pFight->getBNpc( pMoveToData->m_actorId ); auto pBNpc = pInstance->getActiveBNpcByLayoutId( pMoveToData->m_layoutId );
if( pBNpc ) if( pBNpc )
{ {
@ -146,8 +144,6 @@ namespace Sapphire
case TimepointDataType::SetDirectorFlag: case TimepointDataType::SetDirectorFlag:
{ {
auto pDirectorData = std::dynamic_pointer_cast< TimepointDataDirector, TimepointData >( getData() ); auto pDirectorData = std::dynamic_pointer_cast< TimepointDataDirector, TimepointData >( getData() );
auto pInstance = pFight->getInstance();
// todo: this should never not be set? // todo: this should never not be set?
// todo: probably should use ContentDirector // todo: probably should use ContentDirector
if( pInstance ) if( pInstance )
@ -226,7 +222,7 @@ namespace Sapphire
callback( this, action ); callback( this, action );
} }
void EncounterTimeline::Timepoint::execute( EncounterFightPtr pFight, uint64_t time ) void EncounterTimeline::Timepoint::execute( InstanceContentPtr pInstance, uint64_t time )
{ {
switch( m_type ) switch( m_type )
{ {
@ -241,10 +237,10 @@ namespace Sapphire
} }
*/ */
void EncounterTimeline::Timepoint::execute( EncounterFightPtr pFight, uint64_t time ) void EncounterTimeline::Timepoint::execute( InstanceContentPtr pInstance, uint64_t time )
{ {
m_executeTime = time; m_executeTime = time;
update( pFight, time ); update( pInstance, time );
} }
// //
@ -336,6 +332,7 @@ namespace Sapphire
{ "castAction", TimepointDataType::CastAction }, { "castAction", TimepointDataType::CastAction },
{ "moveTo", TimepointDataType::MoveTo }, { "moveTo", TimepointDataType::MoveTo },
{ "logMessage", TimepointDataType::LogMessage }, { "logMessage", TimepointDataType::LogMessage },
{ "battleTalk", TimepointDataType::BattleTalk },
{ "setDirectorVar", TimepointDataType::SetDirectorVar }, { "setDirectorVar", TimepointDataType::SetDirectorVar },
{ "setDirectorSeq", TimepointDataType::SetDirectorSeq }, { "setDirectorSeq", TimepointDataType::SetDirectorSeq },
{ "setDirectorFlags", TimepointDataType::SetDirectorFlag }, { "setDirectorFlags", TimepointDataType::SetDirectorFlag },
@ -392,9 +389,8 @@ namespace Sapphire
auto z = posJ.at( "z" ).get< float >(); auto z = posJ.at( "z" ).get< float >();
auto rot = dataJ.at( "rot" ).get< float >(); auto rot = dataJ.at( "rot" ).get< float >();
auto pathReq = dataJ.at( "pathRequested" ).get< bool >() ? MoveType::WalkPath : MoveType::Teleport; auto pathReq = dataJ.at( "pathRequested" ).get< bool >() ? MoveType::WalkPath : MoveType::Teleport;
auto actorId = selfLayoutId;
m_pData = std::make_shared< TimepointDataMoveTo >( actorId, pathReq, x, y, z, rot ); m_pData = std::make_shared< TimepointDataMoveTo >( selfLayoutId, pathReq, x, y, z, rot );
} }
break; break;
default: default:
@ -504,7 +500,7 @@ namespace Sapphire
// make sure the actor we're referencing exists // make sure the actor we're referencing exists
if( auto actorIt = actorNameMap.find( actorRef ); actorIt != actorNameMap.end() ) if( auto actorIt = actorNameMap.find( actorRef ); actorIt != actorNameMap.end() )
{ {
auto phaseNameMap = actorNamePhaseMap[ actorRef ]; auto& phaseNameMap = actorNamePhaseMap[ actorRef ];
TimelineActor& actor = actorIt->second; TimelineActor& actor = actorIt->second;

View file

@ -60,6 +60,7 @@ namespace Sapphire
LogMessage, LogMessage,
BattleTalk, BattleTalk,
SetDirectorVar, SetDirectorVar,
SetDirectorVarLR,
SetDirectorSeq, SetDirectorSeq,
SetDirectorFlag, SetDirectorFlag,
AddStatusEffect, AddStatusEffect,
@ -122,7 +123,7 @@ namespace Sapphire
}; };
using TimepointCallbackFunc = std::function< void( EncounterFightPtr, uint64_t ) >; using TimepointCallbackFunc = std::function< void( InstanceContentPtr, uint64_t ) >;
// Timepoint Data Objects // Timepoint Data Objects
struct TimepointCallbackData : struct TimepointCallbackData :
public std::enable_shared_from_this< TimepointCallbackData > public std::enable_shared_from_this< TimepointCallbackData >
@ -145,12 +146,12 @@ namespace Sapphire
struct TimepointDataIdle : public TimepointData struct TimepointDataIdle : public TimepointData
{ {
uint32_t m_actorId; uint32_t m_layoutId;
uint64_t m_durationMs; uint64_t m_durationMs;
TimepointDataIdle( uint32_t actorId, uint64_t durationMs ) : TimepointDataIdle( uint32_t layoutId, uint64_t durationMs ) :
TimepointData( TimepointDataType::Idle ), TimepointData( TimepointDataType::Idle ),
m_actorId( actorId ), m_layoutId( layoutId ),
m_durationMs( durationMs ) m_durationMs( durationMs )
{ {
} }
@ -186,13 +187,13 @@ namespace Sapphire
struct TimepointDataAction : public TimepointData struct TimepointDataAction : public TimepointData
{ {
uint32_t m_actorId; uint32_t m_layoutId;
uint32_t m_actionId; uint32_t m_actionId;
TimepointCallbacks m_callbacks; TimepointCallbacks m_callbacks;
TimepointDataAction( uint32_t actorId, uint32_t actionId, TimepointCallbacks callbacks ) : TimepointDataAction( uint32_t layoutId, uint32_t actionId, TimepointCallbacks callbacks ) :
TimepointData( TimepointDataType::CastAction ), TimepointData( TimepointDataType::CastAction ),
m_actorId( actorId ), m_layoutId( layoutId ),
m_actionId( actionId ), m_actionId( actionId ),
m_callbacks( callbacks ) m_callbacks( callbacks )
{ {
@ -201,13 +202,13 @@ namespace Sapphire
struct TimepointDataMoveTo : public TimepointData struct TimepointDataMoveTo : public TimepointData
{ {
uint32_t m_actorId; uint32_t m_layoutId;
MoveType m_moveType; MoveType m_moveType;
float m_x, m_y, m_z, m_rot; float m_x, m_y, m_z, m_rot;
TimepointDataMoveTo( uint32_t actorId, MoveType moveType, float x, float y, float z, float rot ) : TimepointDataMoveTo( uint32_t layoutId, MoveType moveType, float x, float y, float z, float rot ) :
TimepointData( TimepointDataType::MoveTo ), TimepointData( TimepointDataType::MoveTo ),
m_actorId( actorId ), m_layoutId( layoutId ),
m_moveType( moveType ), m_moveType( moveType ),
m_x( x ), m_y( y ), m_z( z ), m_rot( rot ) m_x( x ), m_y( y ), m_z( z ), m_rot( rot )
{ {
@ -292,8 +293,8 @@ namespace Sapphire
void from_json( const nlohmann::json& json, const std::unordered_map< std::string, TimelineActor >& actors, uint32_t selfLayoutId ); void from_json( const nlohmann::json& json, const std::unordered_map< std::string, TimelineActor >& actors, uint32_t selfLayoutId );
// todo: separate execute/update into onStart and onTick? // todo: separate execute/update into onStart and onTick?
void update( EncounterFightPtr pFight, uint64_t time ); void update( InstanceContentPtr pInstance, uint64_t time );
void execute( EncounterFightPtr pFight, uint64_t time ); void execute( InstanceContentPtr pInstance, uint64_t time );
}; };
class Phase : class Phase :
@ -312,7 +313,7 @@ namespace Sapphire
std::queue< Timepoint > m_executed; std::queue< Timepoint > m_executed;
// todo: i wrote this very sleep deprived, ensure it is actually sane // todo: i wrote this very sleep deprived, ensure it is actually sane
void execute( EncounterFightPtr pFight, uint64_t time ) void execute( InstanceContentPtr pInstance, uint64_t time )
{ {
if( m_startTime == 0 ) if( m_startTime == 0 )
m_startTime = time; m_startTime = time;
@ -327,13 +328,13 @@ namespace Sapphire
auto& timepoint = m_timepoints[ i ]; auto& timepoint = m_timepoints[ i ];
if( timepoint.canExecute( timepointElapsed ) ) if( timepoint.canExecute( timepointElapsed ) )
{ {
timepoint.execute( pFight, time ); timepoint.execute( pInstance, time );
m_lastTimepointTime = time; m_lastTimepointTime = time;
m_executed.push( timepoint ); m_executed.push( timepoint );
} }
else if( !timepoint.finished( timepointElapsed ) ) else if( !timepoint.finished( timepointElapsed ) )
{ {
timepoint.update( pFight, time ); timepoint.update( pInstance, time );
} }
if( timepoint.finished( timepointElapsed ) ) if( timepoint.finished( timepointElapsed ) )
@ -377,15 +378,15 @@ namespace Sapphire
this->m_phase = phase; this->m_phase = phase;
} }
void execute( EncounterFightPtr pFight, uint64_t time ) void execute( InstanceContentPtr pInstance, uint64_t time )
{ {
m_startTime = time; m_startTime = time;
m_phase.execute( pFight, time ); m_phase.execute( pInstance, time );
}; };
void update( EncounterFightPtr pFight, uint64_t time ) void update( InstanceContentPtr pInstance, uint64_t time )
{ {
m_phase.execute( pFight, time ); m_phase.execute( pInstance, time );
} }
void reset() void reset()
@ -413,7 +414,7 @@ namespace Sapphire
return m_phase.completed() && m_loop && ( m_startTime + m_cooldown <= time ); return m_phase.completed() && m_loop && ( m_startTime + m_cooldown <= time );
} }
virtual bool isConditionMet( EncounterFightPtr pFight, uint64_t time ) virtual bool isConditionMet( InstanceContentPtr pInstance, uint64_t time )
{ {
return false; return false;
}; };
@ -431,7 +432,7 @@ namespace Sapphire
std::vector< PhaseConditionPtr > m_phaseConditions; std::vector< PhaseConditionPtr > m_phaseConditions;
std::queue< PhaseConditionPtr > m_phaseHistory; std::queue< PhaseConditionPtr > m_phaseHistory;
void update( EncounterFightPtr pFight, uint64_t time ) void update( InstanceContentPtr pInstance, uint64_t time )
{ {
// todo: handle auto attacks and make it so they dont fire during boss intermission phases // todo: handle auto attacks and make it so they dont fire during boss intermission phases
// todo: handle interrupts // todo: handle interrupts
@ -447,11 +448,11 @@ namespace Sapphire
} }
else if( pCondition->inProgress() ) else if( pCondition->inProgress() )
{ {
pCondition->update( pFight, time ); pCondition->update( pInstance, time );
} }
else if( pCondition->isConditionMet( pFight, time ) ) else if( pCondition->isConditionMet( pInstance, time ) )
{ {
pCondition->execute( pFight, time ); pCondition->execute( pInstance, time );
m_phaseHistory.push( pCondition ); m_phaseHistory.push( pCondition );
} }
} }
@ -467,10 +468,10 @@ namespace Sapphire
public: public:
TimelinePack() { } TimelinePack() { }
TimelinePack( TimelinePackType type ) : m_type( type ) {} TimelinePack( TimelinePackType type ) : m_type( type ) {}
void update( EncounterFightPtr pFight, uint64_t time ) void update( InstanceContentPtr pInstance, uint64_t time )
{ {
for( auto& actor : m_actors ) for( auto& actor : m_actors )
actor.update( pFight, time ); actor.update( pInstance, time );
} }
}; };
@ -493,7 +494,7 @@ namespace Sapphire
void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId, void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId,
const std::unordered_map< std::string, TimelineActor >& actors ); const std::unordered_map< std::string, TimelineActor >& actors );
bool isConditionMet( EncounterFightPtr pFight, uint64_t time ) override; bool isConditionMet( InstanceContentPtr pInstance, uint64_t time ) override;
}; };
class ConditionDirectorVar : PhaseCondition class ConditionDirectorVar : PhaseCondition
@ -511,7 +512,7 @@ namespace Sapphire
} param; } param;
void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId ); void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId );
bool isConditionMet( EncounterFightPtr pFight, uint64_t time ) override; bool isConditionMet( InstanceContentPtr pInstance, uint64_t time ) override;
}; };
class ConditionCombatState : PhaseCondition class ConditionCombatState : PhaseCondition
@ -521,7 +522,7 @@ namespace Sapphire
CombatStateType combatState; CombatStateType combatState;
void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId, const std::unordered_map< std::string, TimelineActor >& actors ); void from_json( nlohmann::json& json, Phase phase, ConditionId conditionId, const std::unordered_map< std::string, TimelineActor >& actors );
bool isConditionMet( EncounterFightPtr pFight, uint64_t time ) override; bool isConditionMet( InstanceContentPtr pInstance, uint64_t time ) override;
}; };
public: public: