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:
parent
f96c633c6c
commit
576930dcfc
3 changed files with 55 additions and 55 deletions
|
@ -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 =
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue