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

add timers and enrage mechanic;

This commit is contained in:
Alice Ogeda 2023-03-08 14:36:53 -03:00 committed by Tahir
parent 77089d4083
commit c1589c1f20
2 changed files with 67 additions and 27 deletions

View file

@ -18,6 +18,7 @@ namespace Sapphire
bool m_bShouldFinish{ false }; bool m_bShouldFinish{ false };
StateStackPtr m_stateStack; StateStackPtr m_stateStack;
std::shared_ptr< EncounterFight > m_pEncounter; std::shared_ptr< EncounterFight > m_pEncounter;
uint64_t m_startTime{ 0 };
public: public:
EncounterState( std::shared_ptr< EncounterFight > pEncounter ) : EncounterState( std::shared_ptr< EncounterFight > pEncounter ) :
@ -29,7 +30,7 @@ namespace Sapphire
bool shouldFinish() { return m_bShouldFinish; }; bool shouldFinish() { return m_bShouldFinish; };
virtual void init() = 0; virtual void init() = 0;
virtual void update( double deltaTime ) = 0; virtual void update( uint64_t deltaTime ) = 0;
virtual void finish() = 0; virtual void finish() = 0;
}; };
@ -53,7 +54,7 @@ namespace Sapphire
virtual void init() = 0; virtual void init() = 0;
virtual void start() = 0; virtual void start() = 0;
virtual void update( double deltaTime ) = 0; virtual void update( uint64_t deltaTime ) = 0;
virtual void reset() = 0; virtual void reset() = 0;
virtual void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) = 0; virtual void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) = 0;
@ -64,6 +65,7 @@ namespace Sapphire
virtual EncounterFightStatus getEncounterFightStatus() const = 0; virtual EncounterFightStatus getEncounterFightStatus() const = 0;
protected: protected:
uint64_t m_startTime{ 0 };
EncounterState::StateStackPtr m_stateStack; EncounterState::StateStackPtr m_stateStack;
std::set< Entity::PlayerPtr > m_playerList; std::set< Entity::PlayerPtr > m_playerList;
std::unordered_map< uint32_t, Entity::BNpcPtr > m_bnpcs; std::unordered_map< uint32_t, Entity::BNpcPtr > m_bnpcs;

View file

@ -8,28 +8,6 @@ namespace Sapphire
static constexpr int IFRIT = 4126276; static constexpr int IFRIT = 4126276;
static constexpr int HELLFIRE = 0; 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 class IfritStateTwo : public EncounterState
{ {
@ -43,17 +21,73 @@ namespace Sapphire
Logger::info( "ifrit FAN CLUB GEOcities <blink>EUNUCH ONLY</blink>" ); 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 ); auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT );
pIfrit->setRot( pIfrit->getRot() - .2f );
pIfrit->sendPositionUpdate();
if( timeElapsedMs > 5000 )
{
m_bShouldFinish = true;
}
} }
void finish() override 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 class IfritEncounterFight : public EncounterFight
{ {
public: public:
@ -65,6 +99,7 @@ namespace Sapphire
void init() override void init() override
{ {
m_status = EncounterFightStatus::IDLE; m_status = EncounterFightStatus::IDLE;
m_startTime = 0;
m_stateStack = std::make_shared< EncounterState::StateStack >(); m_stateStack = std::make_shared< EncounterState::StateStack >();
@ -93,7 +128,7 @@ namespace Sapphire
m_status = EncounterFightStatus::ACTIVE; m_status = EncounterFightStatus::ACTIVE;
} }
void update( double deltaTime ) override void update( uint64_t deltaTime ) override
{ {
// todo: better way to start fights here.. // todo: better way to start fights here..
@ -101,6 +136,7 @@ namespace Sapphire
if( ifrit; ifrit->hateListGetHighestValue() != 0 && m_status == EncounterFightStatus::IDLE ) if( ifrit; ifrit->hateListGetHighestValue() != 0 && m_status == EncounterFightStatus::IDLE )
{ {
m_startTime = deltaTime;
start(); start();
} }
@ -108,7 +144,7 @@ namespace Sapphire
{ {
m_status = EncounterFightStatus::FAIL; m_status = EncounterFightStatus::FAIL;
} }
if( m_stateStack; !m_stateStack->empty() ) if( m_stateStack; !m_stateStack->empty() )
{ {
if( m_stateStack->top()->shouldFinish() ) if( m_stateStack->top()->shouldFinish() )
@ -150,6 +186,8 @@ namespace Sapphire
auto bnpc = m_bnpcs.find( layoutId ); auto bnpc = m_bnpcs.find( layoutId );
if( bnpc != std::end( m_bnpcs ) ) if( bnpc != std::end( m_bnpcs ) )
return bnpc->second; return bnpc->second;
return nullptr;
} }
void removeBNpc( uint32_t layoutId ) override void removeBNpc( uint32_t layoutId ) override