mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-03 01:07:47 +00:00
add timers and enrage mechanic;
This commit is contained in:
parent
77089d4083
commit
c1589c1f20
2 changed files with 67 additions and 27 deletions
|
@ -18,6 +18,7 @@ namespace Sapphire
|
|||
bool m_bShouldFinish{ false };
|
||||
StateStackPtr m_stateStack;
|
||||
std::shared_ptr< EncounterFight > m_pEncounter;
|
||||
uint64_t m_startTime{ 0 };
|
||||
|
||||
public:
|
||||
EncounterState( std::shared_ptr< EncounterFight > pEncounter ) :
|
||||
|
@ -29,7 +30,7 @@ namespace Sapphire
|
|||
bool shouldFinish() { return m_bShouldFinish; };
|
||||
|
||||
virtual void init() = 0;
|
||||
virtual void update( double deltaTime ) = 0;
|
||||
virtual void update( uint64_t deltaTime ) = 0;
|
||||
|
||||
virtual void finish() = 0;
|
||||
};
|
||||
|
@ -53,7 +54,7 @@ namespace Sapphire
|
|||
|
||||
virtual void init() = 0;
|
||||
virtual void start() = 0;
|
||||
virtual void update( double deltaTime ) = 0;
|
||||
virtual void update( uint64_t deltaTime ) = 0;
|
||||
virtual void reset() = 0;
|
||||
|
||||
virtual void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) = 0;
|
||||
|
@ -64,6 +65,7 @@ namespace Sapphire
|
|||
virtual EncounterFightStatus getEncounterFightStatus() const = 0;
|
||||
|
||||
protected:
|
||||
uint64_t m_startTime{ 0 };
|
||||
EncounterState::StateStackPtr m_stateStack;
|
||||
std::set< Entity::PlayerPtr > m_playerList;
|
||||
std::unordered_map< uint32_t, Entity::BNpcPtr > m_bnpcs;
|
||||
|
|
|
@ -8,28 +8,6 @@ namespace Sapphire
|
|||
static constexpr int IFRIT = 4126276;
|
||||
static constexpr int HELLFIRE = 0;
|
||||
};
|
||||
class IfritStateOne : public EncounterState
|
||||
{
|
||||
public:
|
||||
IfritStateOne( EncounterFightPtr pEncounter ) : EncounterState( pEncounter )
|
||||
{
|
||||
}
|
||||
|
||||
void init() override
|
||||
{
|
||||
Logger::info( "ifrit FAN CLUB GEOcities <blink>EUNUCH ONLY</blink>" );
|
||||
}
|
||||
|
||||
void update( double deltaTime ) override
|
||||
{
|
||||
auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT );
|
||||
}
|
||||
|
||||
void finish() override
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
class IfritStateTwo : public EncounterState
|
||||
{
|
||||
|
@ -43,17 +21,73 @@ namespace Sapphire
|
|||
Logger::info( "ifrit FAN CLUB GEOcities <blink>EUNUCH ONLY</blink>" );
|
||||
}
|
||||
|
||||
void update( double deltaTime ) override
|
||||
void update( uint64_t deltaTime ) override
|
||||
{
|
||||
if( m_startTime == 0 )
|
||||
m_startTime = deltaTime;
|
||||
|
||||
auto timeElapsedMs = deltaTime - m_startTime;
|
||||
|
||||
auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT );
|
||||
|
||||
pIfrit->setRot( pIfrit->getRot() - .2f );
|
||||
pIfrit->sendPositionUpdate();
|
||||
|
||||
if( timeElapsedMs > 5000 )
|
||||
{
|
||||
m_bShouldFinish = true;
|
||||
}
|
||||
}
|
||||
|
||||
void finish() override
|
||||
{
|
||||
Logger::info( "stage 2 done, going back to stage 1" );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class IfritStateOne : public EncounterState
|
||||
{
|
||||
public:
|
||||
IfritStateOne( EncounterFightPtr pEncounter ) : EncounterState( pEncounter )
|
||||
{
|
||||
}
|
||||
|
||||
void init() override
|
||||
{
|
||||
Logger::info( "ifrit FAN CLUB GEOcities <blink>EUNUCH ONLY</blink>" );
|
||||
}
|
||||
|
||||
void update( uint64_t deltaTime ) override
|
||||
{
|
||||
if( m_startTime == 0 )
|
||||
m_startTime = deltaTime;
|
||||
|
||||
auto timeElapsedMs = deltaTime - m_startTime;
|
||||
|
||||
auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT );
|
||||
|
||||
pIfrit->setRot( pIfrit->getRot() + .2f );
|
||||
pIfrit->sendPositionUpdate();
|
||||
|
||||
if( timeElapsedMs > 5000 )
|
||||
{
|
||||
auto ifritTwoState = std::make_shared< IfritStateTwo >( m_pEncounter );
|
||||
m_pEncounter->addState( ifritTwoState );
|
||||
}
|
||||
|
||||
if( timeElapsedMs > 10000 )
|
||||
{
|
||||
pIfrit->hateListGetHighest()->die();
|
||||
}
|
||||
}
|
||||
|
||||
void finish() override
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
class IfritEncounterFight : public EncounterFight
|
||||
{
|
||||
public:
|
||||
|
@ -65,6 +99,7 @@ namespace Sapphire
|
|||
void init() override
|
||||
{
|
||||
m_status = EncounterFightStatus::IDLE;
|
||||
m_startTime = 0;
|
||||
|
||||
m_stateStack = std::make_shared< EncounterState::StateStack >();
|
||||
|
||||
|
@ -93,7 +128,7 @@ namespace Sapphire
|
|||
m_status = EncounterFightStatus::ACTIVE;
|
||||
}
|
||||
|
||||
void update( double deltaTime ) override
|
||||
void update( uint64_t deltaTime ) override
|
||||
{
|
||||
// todo: better way to start fights here..
|
||||
|
||||
|
@ -101,6 +136,7 @@ namespace Sapphire
|
|||
|
||||
if( ifrit; ifrit->hateListGetHighestValue() != 0 && m_status == EncounterFightStatus::IDLE )
|
||||
{
|
||||
m_startTime = deltaTime;
|
||||
start();
|
||||
}
|
||||
|
||||
|
@ -108,7 +144,7 @@ namespace Sapphire
|
|||
{
|
||||
m_status = EncounterFightStatus::FAIL;
|
||||
}
|
||||
|
||||
|
||||
if( m_stateStack; !m_stateStack->empty() )
|
||||
{
|
||||
if( m_stateStack->top()->shouldFinish() )
|
||||
|
@ -150,6 +186,8 @@ namespace Sapphire
|
|||
auto bnpc = m_bnpcs.find( layoutId );
|
||||
if( bnpc != std::end( m_bnpcs ) )
|
||||
return bnpc->second;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void removeBNpc( uint32_t layoutId ) override
|
||||
|
|
Loading…
Add table
Reference in a new issue