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
{
None = 0,
Immobile = 1,
TurningDisabled = 2,
Invincible = 4,
InvincibleRefill = 8,
NoDeaggro = 16,
Untargetable = 32,
None = 0x00,
Immobile = 0x01,
TurningDisabled = 0x02,
Invincible = 0x04,
InvincibleRefill = 0x08,
NoDeaggro = 0x10,
Untargetable = 0x20,
AutoAttackDisabled = 0x40,
Intermission = 0x77 // for transition phases to ensure boss only moves/acts when scripted
};
const std::array< uint32_t, 50 > BnpcBaseHp =

View file

@ -8,9 +8,9 @@
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 )
return false;
@ -29,10 +29,8 @@ namespace Sapphire
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
if( !pInstance )
return false;
@ -55,9 +53,9 @@ namespace Sapphire
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 )
{
@ -85,7 +83,7 @@ namespace Sapphire
return false;
}
void EncounterTimeline::Timepoint::update( EncounterFightPtr pFight, uint64_t time )
void EncounterTimeline::Timepoint::update( InstanceContentPtr pInstance, uint64_t time )
{
m_lastTick = time;
switch( m_type )
@ -93,7 +91,7 @@ namespace Sapphire
case TimepointDataType::Idle:
{
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 )
{
@ -112,7 +110,7 @@ namespace Sapphire
case TimepointDataType::MoveTo:
{
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 )
{
@ -146,8 +144,6 @@ namespace Sapphire
case TimepointDataType::SetDirectorFlag:
{
auto pDirectorData = std::dynamic_pointer_cast< TimepointDataDirector, TimepointData >( getData() );
auto pInstance = pFight->getInstance();
// todo: this should never not be set?
// todo: probably should use ContentDirector
if( pInstance )
@ -226,7 +222,7 @@ namespace Sapphire
callback( this, action );
}
void EncounterTimeline::Timepoint::execute( EncounterFightPtr pFight, uint64_t time )
void EncounterTimeline::Timepoint::execute( InstanceContentPtr pInstance, uint64_t time )
{
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;
update( pFight, time );
update( pInstance, time );
}
//
@ -336,6 +332,7 @@ namespace Sapphire
{ "castAction", TimepointDataType::CastAction },
{ "moveTo", TimepointDataType::MoveTo },
{ "logMessage", TimepointDataType::LogMessage },
{ "battleTalk", TimepointDataType::BattleTalk },
{ "setDirectorVar", TimepointDataType::SetDirectorVar },
{ "setDirectorSeq", TimepointDataType::SetDirectorSeq },
{ "setDirectorFlags", TimepointDataType::SetDirectorFlag },
@ -392,9 +389,8 @@ namespace Sapphire
auto z = posJ.at( "z" ).get< float >();
auto rot = dataJ.at( "rot" ).get< float >();
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;
default:
@ -504,7 +500,7 @@ namespace Sapphire
// make sure the actor we're referencing exists
if( auto actorIt = actorNameMap.find( actorRef ); actorIt != actorNameMap.end() )
{
auto phaseNameMap = actorNamePhaseMap[ actorRef ];
auto& phaseNameMap = actorNamePhaseMap[ actorRef ];
TimelineActor& actor = actorIt->second;

View file

@ -60,6 +60,7 @@ namespace Sapphire
LogMessage,
BattleTalk,
SetDirectorVar,
SetDirectorVarLR,
SetDirectorSeq,
SetDirectorFlag,
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
struct TimepointCallbackData :
public std::enable_shared_from_this< TimepointCallbackData >
@ -145,12 +146,12 @@ namespace Sapphire
struct TimepointDataIdle : public TimepointData
{
uint32_t m_actorId;
uint32_t m_layoutId;
uint64_t m_durationMs;
TimepointDataIdle( uint32_t actorId, uint64_t durationMs ) :
TimepointDataIdle( uint32_t layoutId, uint64_t durationMs ) :
TimepointData( TimepointDataType::Idle ),
m_actorId( actorId ),
m_layoutId( layoutId ),
m_durationMs( durationMs )
{
}
@ -186,13 +187,13 @@ namespace Sapphire
struct TimepointDataAction : public TimepointData
{
uint32_t m_actorId;
uint32_t m_layoutId;
uint32_t m_actionId;
TimepointCallbacks m_callbacks;
TimepointDataAction( uint32_t actorId, uint32_t actionId, TimepointCallbacks callbacks ) :
TimepointDataAction( uint32_t layoutId, uint32_t actionId, TimepointCallbacks callbacks ) :
TimepointData( TimepointDataType::CastAction ),
m_actorId( actorId ),
m_layoutId( layoutId ),
m_actionId( actionId ),
m_callbacks( callbacks )
{
@ -201,13 +202,13 @@ namespace Sapphire
struct TimepointDataMoveTo : public TimepointData
{
uint32_t m_actorId;
uint32_t m_layoutId;
MoveType m_moveType;
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 ),
m_actorId( actorId ),
m_layoutId( layoutId ),
m_moveType( moveType ),
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 );
// todo: separate execute/update into onStart and onTick?
void update( EncounterFightPtr pFight, uint64_t time );
void execute( EncounterFightPtr pFight, uint64_t time );
void update( InstanceContentPtr pInstance, uint64_t time );
void execute( InstanceContentPtr pInstance, uint64_t time );
};
class Phase :
@ -312,7 +313,7 @@ namespace Sapphire
std::queue< Timepoint > m_executed;
// 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 )
m_startTime = time;
@ -327,13 +328,13 @@ namespace Sapphire
auto& timepoint = m_timepoints[ i ];
if( timepoint.canExecute( timepointElapsed ) )
{
timepoint.execute( pFight, time );
timepoint.execute( pInstance, time );
m_lastTimepointTime = time;
m_executed.push( timepoint );
}
else if( !timepoint.finished( timepointElapsed ) )
{
timepoint.update( pFight, time );
timepoint.update( pInstance, time );
}
if( timepoint.finished( timepointElapsed ) )
@ -377,15 +378,15 @@ namespace Sapphire
this->m_phase = phase;
}
void execute( EncounterFightPtr pFight, uint64_t time )
void execute( InstanceContentPtr pInstance, uint64_t 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()
@ -413,7 +414,7 @@ namespace Sapphire
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;
};
@ -431,7 +432,7 @@ namespace Sapphire
std::vector< PhaseConditionPtr > m_phaseConditions;
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 interrupts
@ -447,11 +448,11 @@ namespace Sapphire
}
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 );
}
}
@ -467,10 +468,10 @@ namespace Sapphire
public:
TimelinePack() { }
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 )
actor.update( pFight, time );
actor.update( pInstance, time );
}
};
@ -493,7 +494,7 @@ namespace Sapphire
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;
};
class ConditionDirectorVar : PhaseCondition
@ -511,7 +512,7 @@ namespace Sapphire
} param;
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
@ -521,7 +522,7 @@ namespace Sapphire
CombatStateType combatState;
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: