From d18ee7871e3a4c2e45fdc883ef91d6a9085c2d02 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Tue, 7 Mar 2023 11:24:47 -0300 Subject: [PATCH 01/10] ugly prototype of arenascript; --- src/scripts/CMakeLists.txt | 2 +- src/scripts/arena/IfritNormal.cpp | 71 ++++++++++++++++++++++++++++ src/world/Script/NativeScriptApi.cpp | 22 +++++++++ src/world/Script/NativeScriptApi.h | 44 ++++++++++++++++- src/world/Script/ScriptLoader.cpp | 2 +- src/world/Script/ScriptMgr.cpp | 11 +++++ 6 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 src/scripts/arena/IfritNormal.cpp diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 31cc1334..cea505bd 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -46,7 +46,7 @@ foreach(_scriptDir ${children}) MODULE ${SCRIPT_BUILD_FILES} "${SCRIPT_INCLUDE_FILES}" - "${_scriptDir}/ScriptLoader.cpp" ) + "${_scriptDir}/ScriptLoader.cpp" "arena/IfritNormal.cpp") target_link_libraries( "script_${_name}" world ) diff --git a/src/scripts/arena/IfritNormal.cpp b/src/scripts/arena/IfritNormal.cpp new file mode 100644 index 00000000..261fcfb4 --- /dev/null +++ b/src/scripts/arena/IfritNormal.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include + +using namespace Sapphire; + +class IfritNormal : public Sapphire::ScriptAPI::InstanceArenaScript +{ +public: + IfritNormal() : Sapphire::ScriptAPI::InstanceArenaScript( 20001 ) + { } + + void onInit( InstanceContent& instance ) override + { + auto boss = instance.createBNpcFromLayoutId( 4126276, 13884, Common::BNpcType::Enemy ); + boss->setFlag( Entity::NoDeaggro ); + + //instance.sendForward(); + } + + void onUpdate( InstanceContent& instance, uint64_t tickCount ) override + { + auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); + + if( boss; boss->hateListGetHighestValue() != 0 ) + { + if( instance.getDirectorVar( 0 ) == 0 ) + onBattleStart( instance ); + + boss->setRot( boss->getRot() + 0.5f ); + boss->setPos( boss->getPos() ); + + boss->sendPositionUpdate(); + + playerMgr().sendDebug( *boss->hateListGetHighest()->getAsPlayer(), std::to_string( boss->getRot() ) ); + + if( boss->getRot() >= 4.f && instance.getDirectorVar( 0 ) == 1 ) + { + instance.setDirectorVar( 0, 0 ); + boss->hateListGetHighest()->die(); + boss->hateListClear(); + onReset( instance ); + + } + + } + } + + void onReset( InstanceContent& instance ) override + { + auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); + instance.removeActor( boss ); + + onInit( instance ); + } + + void onBattleStart( InstanceContent& instance ) override + { + auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); + + instance.setDirectorVar( 0, 1 ); + + auto pPlayer = boss->hateListGetHighest()->getAsPlayer(); + + instance.sendEventLogMessage( *pPlayer, instance, 4847, { 0, 0 } ); + instance.sendEventLogMessage( *pPlayer, instance, 170, { 0, boss->getId() } ); + } +}; + +EXPOSE_SCRIPT( IfritNormal ); \ No newline at end of file diff --git a/src/world/Script/NativeScriptApi.cpp b/src/world/Script/NativeScriptApi.cpp index 87997387..2d68c7ac 100644 --- a/src/world/Script/NativeScriptApi.cpp +++ b/src/world/Script/NativeScriptApi.cpp @@ -291,5 +291,27 @@ namespace Sapphire::ScriptAPI { } + /////////////////////////////////////////////////////////////////// + + InstanceArenaScript::InstanceArenaScript( uint32_t instanceContentId ) : ScriptObject( uint32_t{ 0x8003 } << 16 | instanceContentId, typeid( InstanceArenaScript ).hash_code() ) + { + } + + void InstanceArenaScript::onInit( InstanceContent& instance ) + { + } + + void InstanceArenaScript::onUpdate( InstanceContent& instance, uint64_t tickCount ) + { + } + + void InstanceArenaScript::onReset( InstanceContent& instance ) + { + } + + void InstanceArenaScript::onBattleStart( InstanceContent& instance ) + { + } + } diff --git a/src/world/Script/NativeScriptApi.h b/src/world/Script/NativeScriptApi.h index 531a9b40..d28739f3 100644 --- a/src/world/Script/NativeScriptApi.h +++ b/src/world/Script/NativeScriptApi.h @@ -375,7 +375,7 @@ namespace Sapphire::ScriptAPI }; /*! - * @brief The base class for any scripts that implement behaviour related to instance content zones + * @brief The base class for any scripts that implement behaviour related to quest battles */ class QuestBattleScript : public ScriptObject { @@ -406,6 +406,48 @@ namespace Sapphire::ScriptAPI } }; + /*! + * @brief The base class for any scripts that implement behaviour related to a generic arena + */ + class ArenaScript : public ScriptObject + { + public: + explicit ArenaScript( uint32_t battleId ); + + virtual void onInit( Sapphire::Territory& instance ); + + virtual void onUpdate( Sapphire::Territory& instance, uint64_t tickCount ); + + virtual void onReset( Sapphire::Territory& instance ); + + World::Manager::PlayerMgr& playerMgr() + { + return Common::Service< World::Manager::PlayerMgr >::ref(); + } + }; + + /*! + * @brief The base class for any scripts that implement behaviour related to an instance arena + */ + class InstanceArenaScript : public ScriptObject + { + public: + explicit InstanceArenaScript( uint32_t instanceContentId ); + + virtual void onInit( Sapphire::InstanceContent& instance ); + + virtual void onUpdate( Sapphire::InstanceContent& instance, uint64_t tickCount ); + + virtual void onReset( Sapphire::InstanceContent& instance ); + + virtual void onBattleStart( Sapphire::InstanceContent& instance ); + + World::Manager::PlayerMgr& playerMgr() + { + return Common::Service< World::Manager::PlayerMgr >::ref(); + } + }; + } #endif diff --git a/src/world/Script/ScriptLoader.cpp b/src/world/Script/ScriptLoader.cpp index 164520f3..be462921 100644 --- a/src/world/Script/ScriptLoader.cpp +++ b/src/world/Script/ScriptLoader.cpp @@ -241,7 +241,7 @@ Sapphire::ScriptAPI::ScriptObject** Sapphire::Scripting::ScriptLoader::getScript } else { - Logger::warn( "did not find a win32initLinkshell export on a windows script target - the server will likely crash!" ); + Logger::warn( "did not find a win32initWarp export on a windows script target - the server will likely crash!" ); } #else auto func = reinterpret_cast< getScripts >( dlsym( handle, "getScripts" ) ); diff --git a/src/world/Script/ScriptMgr.cpp b/src/world/Script/ScriptMgr.cpp index d56a0626..d7ed6952 100644 --- a/src/world/Script/ScriptMgr.cpp +++ b/src/world/Script/ScriptMgr.cpp @@ -683,10 +683,17 @@ bool Sapphire::Scripting::ScriptMgr::onZoneInit( const Territory& zone ) bool Sapphire::Scripting::ScriptMgr::onInstanceInit( InstanceContent& instance ) { + auto instId = instance.getDirectorId(); auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::InstanceContentScript >( instance.getDirectorId() ); + if( script ) { script->onInit( instance ); + + auto arenaScript = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::InstanceArenaScript >( instance.getDirectorId() ); + if( arenaScript ) + arenaScript->onInit( instance ); + return true; } @@ -700,6 +707,10 @@ bool Sapphire::Scripting::ScriptMgr::onInstanceUpdate( InstanceContent& instance if( script ) { script->onUpdate( instance, tickCount ); + + auto arenaScript = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::InstanceArenaScript >( instance.getDirectorId() ); + if( arenaScript ) + arenaScript->onUpdate( instance, tickCount ); return true; } From 03d46ff2b8e3be1119e829c8456499f0059ac2fe Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 11:59:21 -0300 Subject: [PATCH 02/10] remove scripts for battle; --- src/scripts/CMakeLists.txt | 2 +- src/scripts/arena/IfritNormal.cpp | 71 ---------------------------- src/world/CMakeLists.txt | 10 ++-- src/world/ForwardsZone.h | 1 + src/world/Script/NativeScriptApi.cpp | 23 --------- src/world/Script/NativeScriptApi.h | 43 ----------------- src/world/Script/ScriptMgr.cpp | 7 --- 7 files changed, 8 insertions(+), 149 deletions(-) delete mode 100644 src/scripts/arena/IfritNormal.cpp diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index cea505bd..adc06e5b 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -46,7 +46,7 @@ foreach(_scriptDir ${children}) MODULE ${SCRIPT_BUILD_FILES} "${SCRIPT_INCLUDE_FILES}" - "${_scriptDir}/ScriptLoader.cpp" "arena/IfritNormal.cpp") + "${_scriptDir}/ScriptLoader.cpp" ) target_link_libraries( "script_${_name}" world ) diff --git a/src/scripts/arena/IfritNormal.cpp b/src/scripts/arena/IfritNormal.cpp deleted file mode 100644 index 261fcfb4..00000000 --- a/src/scripts/arena/IfritNormal.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include -#include -#include - -using namespace Sapphire; - -class IfritNormal : public Sapphire::ScriptAPI::InstanceArenaScript -{ -public: - IfritNormal() : Sapphire::ScriptAPI::InstanceArenaScript( 20001 ) - { } - - void onInit( InstanceContent& instance ) override - { - auto boss = instance.createBNpcFromLayoutId( 4126276, 13884, Common::BNpcType::Enemy ); - boss->setFlag( Entity::NoDeaggro ); - - //instance.sendForward(); - } - - void onUpdate( InstanceContent& instance, uint64_t tickCount ) override - { - auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); - - if( boss; boss->hateListGetHighestValue() != 0 ) - { - if( instance.getDirectorVar( 0 ) == 0 ) - onBattleStart( instance ); - - boss->setRot( boss->getRot() + 0.5f ); - boss->setPos( boss->getPos() ); - - boss->sendPositionUpdate(); - - playerMgr().sendDebug( *boss->hateListGetHighest()->getAsPlayer(), std::to_string( boss->getRot() ) ); - - if( boss->getRot() >= 4.f && instance.getDirectorVar( 0 ) == 1 ) - { - instance.setDirectorVar( 0, 0 ); - boss->hateListGetHighest()->die(); - boss->hateListClear(); - onReset( instance ); - - } - - } - } - - void onReset( InstanceContent& instance ) override - { - auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); - instance.removeActor( boss ); - - onInit( instance ); - } - - void onBattleStart( InstanceContent& instance ) override - { - auto boss = instance.getActiveBNpcByLayoutId( 4126276 ); - - instance.setDirectorVar( 0, 1 ); - - auto pPlayer = boss->hateListGetHighest()->getAsPlayer(); - - instance.sendEventLogMessage( *pPlayer, instance, 4847, { 0, 0 } ); - instance.sendEventLogMessage( *pPlayer, instance, 170, { 0, boss->getId() } ); - } -}; - -EXPOSE_SCRIPT( IfritNormal ); \ No newline at end of file diff --git a/src/world/CMakeLists.txt b/src/world/CMakeLists.txt index 632151e2..76deabf9 100644 --- a/src/world/CMakeLists.txt +++ b/src/world/CMakeLists.txt @@ -9,24 +9,26 @@ file( GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Action/*.cpp ContentFinder/*.cpp DebugCommand/*.cpp + Encounter/*.cpp + Encounter/InstanceContent/*.cpp Event/*.cpp FreeCompany/*.cpp Inventory/*.cpp Linkshell/*.cpp Manager/*.cpp Math/*.cpp + Navi/*.cpp Network/*.cpp Network/Util/*.cpp Network/Handlers/*.cpp Network/PacketWrappers/*.cpp + Quest/*.cpp Script/*.cpp StatusEffect/*.cpp + Task/*.cpp Territory/*.cpp Territory/Housing/*.cpp - Util/*.cpp - Navi/*.cpp - Task/*.cpp - Quest/*.cpp ) + Util/*.cpp ) add_executable( world ${SERVER_SOURCE_FILES} ) diff --git a/src/world/ForwardsZone.h b/src/world/ForwardsZone.h index adedecbe..ce8a4d2e 100644 --- a/src/world/ForwardsZone.h +++ b/src/world/ForwardsZone.h @@ -29,6 +29,7 @@ TYPE_FORWARD( ItemContainer ); TYPE_FORWARD( Land ); TYPE_FORWARD( Linkshell ); TYPE_FORWARD( FreeCompany ); +TYPE_FORWARD( EncounterFight ); namespace World { diff --git a/src/world/Script/NativeScriptApi.cpp b/src/world/Script/NativeScriptApi.cpp index 2d68c7ac..01587b8d 100644 --- a/src/world/Script/NativeScriptApi.cpp +++ b/src/world/Script/NativeScriptApi.cpp @@ -290,28 +290,5 @@ namespace Sapphire::ScriptAPI uint16_t param1, uint16_t param2 ) { } - - /////////////////////////////////////////////////////////////////// - - InstanceArenaScript::InstanceArenaScript( uint32_t instanceContentId ) : ScriptObject( uint32_t{ 0x8003 } << 16 | instanceContentId, typeid( InstanceArenaScript ).hash_code() ) - { - } - - void InstanceArenaScript::onInit( InstanceContent& instance ) - { - } - - void InstanceArenaScript::onUpdate( InstanceContent& instance, uint64_t tickCount ) - { - } - - void InstanceArenaScript::onReset( InstanceContent& instance ) - { - } - - void InstanceArenaScript::onBattleStart( InstanceContent& instance ) - { - } - } diff --git a/src/world/Script/NativeScriptApi.h b/src/world/Script/NativeScriptApi.h index d28739f3..f43e4e4f 100644 --- a/src/world/Script/NativeScriptApi.h +++ b/src/world/Script/NativeScriptApi.h @@ -405,49 +405,6 @@ namespace Sapphire::ScriptAPI return Common::Service< World::Manager::PlayerMgr >::ref(); } }; - - /*! - * @brief The base class for any scripts that implement behaviour related to a generic arena - */ - class ArenaScript : public ScriptObject - { - public: - explicit ArenaScript( uint32_t battleId ); - - virtual void onInit( Sapphire::Territory& instance ); - - virtual void onUpdate( Sapphire::Territory& instance, uint64_t tickCount ); - - virtual void onReset( Sapphire::Territory& instance ); - - World::Manager::PlayerMgr& playerMgr() - { - return Common::Service< World::Manager::PlayerMgr >::ref(); - } - }; - - /*! - * @brief The base class for any scripts that implement behaviour related to an instance arena - */ - class InstanceArenaScript : public ScriptObject - { - public: - explicit InstanceArenaScript( uint32_t instanceContentId ); - - virtual void onInit( Sapphire::InstanceContent& instance ); - - virtual void onUpdate( Sapphire::InstanceContent& instance, uint64_t tickCount ); - - virtual void onReset( Sapphire::InstanceContent& instance ); - - virtual void onBattleStart( Sapphire::InstanceContent& instance ); - - World::Manager::PlayerMgr& playerMgr() - { - return Common::Service< World::Manager::PlayerMgr >::ref(); - } - }; - } #endif diff --git a/src/world/Script/ScriptMgr.cpp b/src/world/Script/ScriptMgr.cpp index d7ed6952..c000d028 100644 --- a/src/world/Script/ScriptMgr.cpp +++ b/src/world/Script/ScriptMgr.cpp @@ -690,10 +690,6 @@ bool Sapphire::Scripting::ScriptMgr::onInstanceInit( InstanceContent& instance ) { script->onInit( instance ); - auto arenaScript = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::InstanceArenaScript >( instance.getDirectorId() ); - if( arenaScript ) - arenaScript->onInit( instance ); - return true; } @@ -708,9 +704,6 @@ bool Sapphire::Scripting::ScriptMgr::onInstanceUpdate( InstanceContent& instance { script->onUpdate( instance, tickCount ); - auto arenaScript = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::InstanceArenaScript >( instance.getDirectorId() ); - if( arenaScript ) - arenaScript->onUpdate( instance, tickCount ); return true; } From a92bd336e7d71cf862019070125f7256c1e65b6e Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 11:59:45 -0300 Subject: [PATCH 03/10] add EncounterFight, EncounterState; add example ifritnormal; --- src/world/Encounter/EncounterFight.h | 72 ++++++++++ .../Encounter/InstanceContent/IfritNormal.cpp | 131 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 src/world/Encounter/EncounterFight.h create mode 100644 src/world/Encounter/InstanceContent/IfritNormal.cpp diff --git a/src/world/Encounter/EncounterFight.h b/src/world/Encounter/EncounterFight.h new file mode 100644 index 00000000..95ee8815 --- /dev/null +++ b/src/world/Encounter/EncounterFight.h @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include + +namespace Sapphire +{ + class EncounterState + { + public: + using EncounterStatePtr = std::shared_ptr< EncounterState >; + using StateStack = std::stack< EncounterStatePtr >; + using StateStackPtr = std::shared_ptr< StateStack >; + + protected: + bool m_bShouldFinish{ false }; + StateStackPtr m_stateStack; + std::shared_ptr< EncounterFight > m_pEncounter; + + public: + EncounterState( std::shared_ptr< EncounterFight > pEncounter ) : + m_pEncounter( pEncounter ) + { + }; + + virtual ~EncounterState() = default; + bool shouldFinish() { return m_bShouldFinish; }; + + virtual void init() = 0; + virtual void update( double deltaTime ) = 0; + + virtual void finish() = 0; + }; + + enum class EncounterFightStatus + { + IDLE, + ACTIVE, + FAIL, + SUCCESS + }; + + class EncounterFight : public std::enable_shared_from_this< EncounterFight > + { + public: + EncounterFight( InstanceContentPtr pInstance ) : + m_pInstance( pInstance ) + { + }; + virtual ~EncounterFight() = default; + + virtual void init() = 0; + virtual void start() = 0; + virtual void update( double deltaTime ) = 0; + virtual void reset() = 0; + + virtual void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) = 0; + virtual void addBNpc( Entity::BNpcPtr pBNpc ) = 0; + virtual Entity::BNpcPtr getBNpc( uint32_t layoutId ) = 0; + + virtual EncounterFightStatus getEncounterFightStatus() const = 0; + + protected: + EncounterState::StateStackPtr m_stateStack; + std::set< Entity::PlayerPtr > m_playerList; + std::unordered_map< uint32_t, Entity::BNpcPtr > m_bnpcs; + InstanceContentPtr m_pInstance; + EncounterFightStatus m_status; + }; +} \ No newline at end of file diff --git a/src/world/Encounter/InstanceContent/IfritNormal.cpp b/src/world/Encounter/InstanceContent/IfritNormal.cpp new file mode 100644 index 00000000..8dd165dd --- /dev/null +++ b/src/world/Encounter/InstanceContent/IfritNormal.cpp @@ -0,0 +1,131 @@ +#include + +namespace Sapphire +{ + class IfritNormalData + { + public: + 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 EUNUCH ONLY" ); + } + + void update( double deltaTime ) override + { + auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT ); + } + + void finish() override + { + + } + }; + + class IfritStateTwo : public EncounterState + { + public: + IfritStateTwo( EncounterFightPtr pEncounter ) : EncounterState( pEncounter ) + { + } + + void init() override + { + Logger::info( "ifrit FAN CLUB GEOcities EUNUCH ONLY" ); + } + + void update( double deltaTime ) override + { + auto pIfrit = m_pEncounter->getBNpc( IfritNormalData::IFRIT ); + } + + void finish() override + { + } + }; + + + class IfritEncounterFight : public EncounterFight + { + public: + IfritEncounterFight( InstanceContentPtr pInstance ) : EncounterFight( pInstance ) + { + + }; + + void init() override + { + m_stateStack = std::make_shared< EncounterState::StateStack >(); + + // todo: i don't like this + auto boss = m_pInstance->createBNpcFromLayoutId( IfritNormalData::IFRIT, 13884, Common::BNpcType::Enemy ); + addBNpc( boss ); + + //instance.sendForward(); + /* + auto ifritStateTwo = std::make_shared< IfritStateTwo >( m_stateStack ); + m_stateStack->push( ifritStateTwo );*/ + } + + void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) override + { + m_stateStack->push( pState ); + if( initState ) + pState->init(); + } + + void start() override + { + auto ifritInitState = std::make_shared< IfritStateOne >( shared_from_this() ); + addState( ifritInitState ); + } + + void update( double deltaTime ) override + { + if( m_stateStack; !m_stateStack->empty() ) + { + if( m_stateStack->top()->shouldFinish() ) + { + m_stateStack->top()->finish(); + m_stateStack->pop(); + } + + m_stateStack->top()->update( deltaTime ); + } + } + + void reset() override + { + auto boss = m_pInstance->getActiveBNpcByLayoutId( IfritNormalData::IFRIT ); + m_pInstance->removeActor( boss ); + + init(); + } + + EncounterFightStatus getEncounterFightStatus() const override + { + return m_status; + } + + void addBNpc( Entity::BNpcPtr pBNpc ) override + { + m_bnpcs[ pBNpc->getLayoutId() ] = pBNpc; + } + + Entity::BNpcPtr getBNpc( uint32_t layoutId ) override + { + auto bnpc = m_bnpcs.find( layoutId ); + if( bnpc != std::end( m_bnpcs ) ) + return bnpc->second; + } + }; +} From 5217a474a5ae88453b98016713d9b29655692922 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 12:07:08 -0300 Subject: [PATCH 04/10] encounter status control; --- src/world/Encounter/EncounterFight.h | 2 +- src/world/Encounter/InstanceContent/IfritNormal.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/world/Encounter/EncounterFight.h b/src/world/Encounter/EncounterFight.h index 95ee8815..5e54b112 100644 --- a/src/world/Encounter/EncounterFight.h +++ b/src/world/Encounter/EncounterFight.h @@ -67,6 +67,6 @@ namespace Sapphire std::set< Entity::PlayerPtr > m_playerList; std::unordered_map< uint32_t, Entity::BNpcPtr > m_bnpcs; InstanceContentPtr m_pInstance; - EncounterFightStatus m_status; + EncounterFightStatus m_status{ EncounterFightStatus::IDLE }; }; } \ No newline at end of file diff --git a/src/world/Encounter/InstanceContent/IfritNormal.cpp b/src/world/Encounter/InstanceContent/IfritNormal.cpp index 8dd165dd..5fdae5dc 100644 --- a/src/world/Encounter/InstanceContent/IfritNormal.cpp +++ b/src/world/Encounter/InstanceContent/IfritNormal.cpp @@ -64,6 +64,8 @@ namespace Sapphire void init() override { + m_status = EncounterFightStatus::IDLE; + m_stateStack = std::make_shared< EncounterState::StateStack >(); // todo: i don't like this @@ -87,6 +89,8 @@ namespace Sapphire { auto ifritInitState = std::make_shared< IfritStateOne >( shared_from_this() ); addState( ifritInitState ); + + m_status = EncounterFightStatus::ACTIVE; } void update( double deltaTime ) override From e3a140da407a2806467b832e098f33f5ef73125b Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 14:15:13 -0300 Subject: [PATCH 05/10] add encounter to instancecontent; basic status handling; --- src/world/Encounter/EncounterFight.h | 1 + .../{IfritNormal.cpp => IfritNormal.h} | 27 +++++++++++++++++- src/world/Territory/InstanceContent.cpp | 28 ++++++++++++++++--- src/world/Territory/InstanceContent.h | 3 ++ 4 files changed, 54 insertions(+), 5 deletions(-) rename src/world/Encounter/InstanceContent/{IfritNormal.cpp => IfritNormal.h} (82%) diff --git a/src/world/Encounter/EncounterFight.h b/src/world/Encounter/EncounterFight.h index 5e54b112..d50bfe18 100644 --- a/src/world/Encounter/EncounterFight.h +++ b/src/world/Encounter/EncounterFight.h @@ -58,6 +58,7 @@ namespace Sapphire virtual void addState( EncounterState::EncounterStatePtr pState, bool initState = true ) = 0; virtual void addBNpc( Entity::BNpcPtr pBNpc ) = 0; + virtual void removeBNpc( uint32_t layoutId ) = 0; virtual Entity::BNpcPtr getBNpc( uint32_t layoutId ) = 0; virtual EncounterFightStatus getEncounterFightStatus() const = 0; diff --git a/src/world/Encounter/InstanceContent/IfritNormal.cpp b/src/world/Encounter/InstanceContent/IfritNormal.h similarity index 82% rename from src/world/Encounter/InstanceContent/IfritNormal.cpp rename to src/world/Encounter/InstanceContent/IfritNormal.h index 5fdae5dc..a4e12428 100644 --- a/src/world/Encounter/InstanceContent/IfritNormal.cpp +++ b/src/world/Encounter/InstanceContent/IfritNormal.h @@ -95,6 +95,20 @@ namespace Sapphire void update( double deltaTime ) override { + // todo: better way to start fights here.. + + auto ifrit = getBNpc( IfritNormalData::IFRIT ); + + if( ifrit; ifrit->hateListGetHighestValue() != 0 && m_status == EncounterFightStatus::IDLE ) + { + start(); + } + + if( m_status == EncounterFightStatus::ACTIVE && ifrit && !ifrit->hateListGetHighest()->isAlive() ) + { + m_status = EncounterFightStatus::FAIL; + } + if( m_stateStack; !m_stateStack->empty() ) { if( m_stateStack->top()->shouldFinish() ) @@ -110,7 +124,13 @@ namespace Sapphire void reset() override { auto boss = m_pInstance->getActiveBNpcByLayoutId( IfritNormalData::IFRIT ); - m_pInstance->removeActor( boss ); + if( boss ) + { + removeBNpc( IfritNormalData::IFRIT ); + m_pInstance->removeActor( boss ); + + } + init(); } @@ -131,5 +151,10 @@ namespace Sapphire if( bnpc != std::end( m_bnpcs ) ) return bnpc->second; } + + void removeBNpc( uint32_t layoutId ) override + { + m_bnpcs.erase( layoutId ); + } }; } diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index d5b1b6dc..f4ba3371 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -28,6 +28,8 @@ #include "InstanceContent.h" #include "InstanceObjectCache.h" +#include + using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -67,6 +69,11 @@ bool Sapphire::InstanceContent::init() auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); scriptMgr.onInstanceInit( *this ); + // todo: every fight is now ifrit + m_pEncounter = std::make_shared< IfritEncounterFight >( std::dynamic_pointer_cast< InstanceContent, Territory >( shared_from_this() ) ); + + m_pEncounter->init(); + return true; } @@ -137,10 +144,10 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) if( it == m_playerMap.end() ) return; - auto player = it->second; - if( !player->isLoadingComplete() || - !player->isDirectorInitialized() || - player->hasCondition( PlayerCondition::WatchingCutscene ) ) + auto pPlayer = it->second; + if( !pPlayer->isLoadingComplete() || + !pPlayer->isDirectorInitialized() || + pPlayer->hasCondition( PlayerCondition::WatchingCutscene ) ) return; } @@ -158,12 +165,20 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) if( m_pEntranceEObj ) m_pEntranceEObj->setPermissionInvisibility( 1 ); m_state = DutyInProgress; + + // todo: also yucky, should be init + m_pEncounter->reset(); break; } case DutyReset: + { + // todo: revive players if trial/enclosed raid arena, add reset timer + m_instanceCommenceTime = 0; + m_state = Created; break; + } case DutyInProgress: { @@ -178,6 +193,9 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) m_instanceTerminate = true; updateBNpcs( tickCount ); + + if( m_pEncounter->getEncounterFightStatus() == EncounterFightStatus::FAIL ) + m_state = DutyReset; break; } @@ -215,6 +233,8 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); scriptMgr.onInstanceUpdate( *this, tickCount ); + m_pEncounter->update( tickCount ); + m_lastUpdate = tickCount; } diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index 214bd5da..622a95d7 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -5,6 +5,7 @@ #include "Event/Director.h" #include "Forwards.h" #include +#include namespace Sapphire { @@ -214,6 +215,8 @@ namespace Sapphire // the players which are bound to the instance, regardless of inside or offline std::set< uint32_t > m_boundPlayerIds; + + EncounterFightPtr m_pEncounter; }; } From f80f210ad7775b880f763c50c3d23112e0770883 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 14:36:53 -0300 Subject: [PATCH 06/10] add timers and enrage mechanic; --- src/world/Encounter/EncounterFight.h | 6 +- .../Encounter/InstanceContent/IfritNormal.h | 88 +++++++++++++------ 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/src/world/Encounter/EncounterFight.h b/src/world/Encounter/EncounterFight.h index d50bfe18..d8bd421c 100644 --- a/src/world/Encounter/EncounterFight.h +++ b/src/world/Encounter/EncounterFight.h @@ -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; diff --git a/src/world/Encounter/InstanceContent/IfritNormal.h b/src/world/Encounter/InstanceContent/IfritNormal.h index a4e12428..9db4adfd 100644 --- a/src/world/Encounter/InstanceContent/IfritNormal.h +++ b/src/world/Encounter/InstanceContent/IfritNormal.h @@ -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 EUNUCH ONLY" ); - } - - 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 EUNUCH ONLY" ); } - 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 EUNUCH ONLY" ); + } + + 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 From 692c557f6dd28c6d6d4c40e0aab349461b3992aa Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 16:27:13 -0300 Subject: [PATCH 07/10] more work on duty resets; --- src/world/Territory/InstanceContent.cpp | 100 +++++++++++++++++------- src/world/Territory/InstanceContent.h | 5 ++ 2 files changed, 77 insertions(+), 28 deletions(-) diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index f4ba3371..0c4727af 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -56,6 +56,7 @@ Sapphire::InstanceContent::InstanceContent( std::shared_ptr< Excel::ExcelStruct< m_currentBgm( pInstanceConfiguration->data().Music ), m_instanceExpireTime( Util::getTimeSeconds() + 300 ), m_instanceTerminateTime( 0 ), + m_instanceResetTime( 0 ), m_instanceTerminate( false ) { @@ -166,8 +167,6 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) m_pEntranceEObj->setPermissionInvisibility( 1 ); m_state = DutyInProgress; - // todo: also yucky, should be init - m_pEncounter->reset(); break; } @@ -175,8 +174,37 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) case DutyReset: { // todo: revive players if trial/enclosed raid arena, add reset timer - m_instanceCommenceTime = 0; - m_state = Created; + if( m_instanceResetTime == 0 ) + { + //sendDutyReset(); + m_instanceResetTime = tickCount + 3000; + m_pEncounter->reset(); + for( const auto& playerIt : m_playerMap ) + { + movePlayerToEntrance( *playerIt.second ); + } + if( m_pEntranceEObj ) + m_pEntranceEObj->setPermissionInvisibility( 0 ); + return; + } + else if( tickCount < m_instanceResetTime ) + return; + + auto& server = Common::Service< World::WorldServer >::ref(); + for( const auto& playerIt : m_playerMap ) + { + auto player = playerIt.second; + auto zoneInPacket = makeActorControlSelf( player->getId(), Appear, 0x3, 0, 0, 0 ); + auto setStatusPacket = makeActorControl( player->getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); + + server.queueForPlayer( player->getCharacterId(), zoneInPacket ); + server.queueForPlayers( player->getInRangePlayerIds( true ), setStatusPacket ); + } + + m_pEntranceEObj->setPermissionInvisibility( 1 ); + sendForward(); + + m_state = DutyInProgress; break; } @@ -441,6 +469,17 @@ void Sapphire::InstanceContent::sendForward() } } +void Sapphire::InstanceContent::sendDutyReset() +{ + auto& server = Common::Service< World::WorldServer >::ref(); + for( const auto& playerIt : m_playerMap ) + { + auto player = playerIt.second; + server.queueForPlayer( player->getCharacterId(), makeActorControlSelf( player->getId(), DirectorUpdate, getDirectorId(), + DirectorEventId::LoadingScreen, 3000 ) ); + } +} + void Sapphire::InstanceContent::sendVoteState() { auto& server = Common::Service< World::WorldServer >::ref(); @@ -474,6 +513,34 @@ Sapphire::InstanceContent::InstanceContentState Sapphire::InstanceContent::getSt return m_state; } +void Sapphire::InstanceContent::movePlayerToEntrance( Sapphire::Entity::Player& player ) +{ + auto& exdData = Common::Service< Data::ExdData >::ref(); + auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref(); + auto contentInfo = exdData.getRow< Excel::InstanceContent >( m_instanceContentId ); + + auto rect = instanceObjectCache.getEventRange( contentInfo->data().EntranceRect ); + + if( m_pEntranceEObj != nullptr ) + { + if( rect ) + player.setRot( Util::eulerToDirection( { rect->header.transform.rotation.x, rect->header.transform.rotation.y, rect->header.transform.rotation.z } ) ); + else + player.setRot( PI ); + player.setPos( m_pEntranceEObj->getPos() ); + } + else if( rect ) + { + player.setRot( Util::eulerToDirection( { rect->header.transform.rotation.x, rect->header.transform.rotation.y, rect->header.transform.rotation.z } ) ); + player.setPos( { rect->header.transform.translation.x, rect->header.transform.translation.y, rect->header.transform.translation.z } ); + } + else + { + player.setRot( PI ); + player.setPos( { 0.f, 0.f, 0.f } ); + } +} + void Sapphire::InstanceContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& player ) { // remove any players from the instance who aren't bound on zone in @@ -483,30 +550,7 @@ void Sapphire::InstanceContent::onBeforePlayerZoneIn( Sapphire::Entity::Player& // if a player has already spawned once inside this instance, don't move them if they happen to zone in again if( !hasPlayerPreviouslySpawned( player ) ) { - auto& exdData = Common::Service< Data::ExdData >::ref(); - auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref(); - auto contentInfo = exdData.getRow< Excel::InstanceContent >( m_instanceContentId ); - - auto rect = instanceObjectCache.getEventRange( contentInfo->data().EntranceRect ); - - if( m_pEntranceEObj != nullptr ) - { - if( rect ) - player.setRot( Util::eulerToDirection( { rect->header.transform.rotation.x, rect->header.transform.rotation.y, rect->header.transform.rotation.z } ) ); - else - player.setRot( PI ); - player.setPos( m_pEntranceEObj->getPos() ); - } - else if( rect ) - { - player.setRot( Util::eulerToDirection( { rect->header.transform.rotation.x, rect->header.transform.rotation.y, rect->header.transform.rotation.z } ) ); - player.setPos( { rect->header.transform.translation.x, rect->header.transform.translation.y, rect->header.transform.translation.z } ); - } - else - { - player.setRot( PI ); - player.setPos( { 0.f, 0.f, 0.f } ); - } + movePlayerToEntrance( player ); } player.resetObjSpawnIndex(); diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index 622a95d7..f3735e15 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -122,6 +122,8 @@ namespace Sapphire void sendDutyCommence(); + void sendDutyReset(); + void sendForward(); void sendDutyFailed( bool force ); @@ -192,6 +194,8 @@ namespace Sapphire bool isTerminationReady() const; size_t getInstancePlayerCount() const; + + void movePlayerToEntrance( Entity::Player& player ); private: std::shared_ptr< Excel::ExcelStruct< Excel::InstanceContent > > m_instanceConfiguration; std::shared_ptr< Excel::ExcelStruct< Excel::ContentFinderCondition > > m_contentFinderCondition; @@ -203,6 +207,7 @@ namespace Sapphire uint32_t m_instanceExpireTime; uint64_t m_instanceTerminateTime; uint64_t m_instanceCommenceTime; + uint64_t m_instanceResetTime; bool m_voteState; bool m_instanceTerminate; From d6216331371cb5f4db5c5599745d7500a330e6de Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 16:36:13 -0300 Subject: [PATCH 08/10] more duty reset work, respawn players on duty reset; --- src/world/Territory/InstanceContent.cpp | 37 +++++++++++++++++-------- src/world/Territory/InstanceContent.h | 1 + 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 0c4727af..6d636714 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -57,6 +57,7 @@ Sapphire::InstanceContent::InstanceContent( std::shared_ptr< Excel::ExcelStruct< m_instanceExpireTime( Util::getTimeSeconds() + 300 ), m_instanceTerminateTime( 0 ), m_instanceResetTime( 0 ), + m_instanceResetFinishTime( 0 ), m_instanceTerminate( false ) { @@ -178,29 +179,41 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) { //sendDutyReset(); m_instanceResetTime = tickCount + 3000; + + return; + } + + if( m_instanceResetFinishTime == 0 ) + { + m_instanceResetFinishTime = tickCount + 3000; m_pEncounter->reset(); + + auto& server = Common::Service< World::WorldServer >::ref(); for( const auto& playerIt : m_playerMap ) { - movePlayerToEntrance( *playerIt.second ); + auto pPlayer = playerIt.second; + + pPlayer->resetHp(); + pPlayer->resetMp(); + pPlayer->setStatus( Common::ActorStatus::Idle ); + + movePlayerToEntrance( *pPlayer ); + auto zoneInPacket = makeActorControlSelf( pPlayer->getId(), Appear, 0x3, 0, 0, 0 ); + auto setStatusPacket = makeActorControl( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); + + server.queueForPlayer( pPlayer->getCharacterId(), zoneInPacket ); + server.queueForPlayers( pPlayer->getInRangePlayerIds( true ), setStatusPacket ); } + if( m_pEntranceEObj ) m_pEntranceEObj->setPermissionInvisibility( 0 ); + return; } else if( tickCount < m_instanceResetTime ) return; - auto& server = Common::Service< World::WorldServer >::ref(); - for( const auto& playerIt : m_playerMap ) - { - auto player = playerIt.second; - auto zoneInPacket = makeActorControlSelf( player->getId(), Appear, 0x3, 0, 0, 0 ); - auto setStatusPacket = makeActorControl( player->getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); - - server.queueForPlayer( player->getCharacterId(), zoneInPacket ); - server.queueForPlayers( player->getInRangePlayerIds( true ), setStatusPacket ); - } - + m_pEntranceEObj->setPermissionInvisibility( 1 ); sendForward(); diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index f3735e15..c502f0f6 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -208,6 +208,7 @@ namespace Sapphire uint64_t m_instanceTerminateTime; uint64_t m_instanceCommenceTime; uint64_t m_instanceResetTime; + uint64_t m_instanceResetFinishTime; bool m_voteState; bool m_instanceTerminate; From 9d5fc7930a0c7165da676eabdc07d69c3a5473dd Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 16:37:13 -0300 Subject: [PATCH 09/10] fix typos; --- src/world/Territory/InstanceContent.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 6d636714..ae5f4097 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -182,6 +182,8 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) return; } + else if( tickCount < m_instanceResetTime ) + return; if( m_instanceResetFinishTime == 0 ) { @@ -210,7 +212,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) return; } - else if( tickCount < m_instanceResetTime ) + else if( tickCount < m_instanceResetFinishTime ) return; From 3f2cb2f7e9a6d72470153b1e0d9a52e2ec37461b Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 8 Mar 2023 17:18:13 -0300 Subject: [PATCH 10/10] more instancecontent work; --- src/world/Encounter/InstanceContent/IfritNormal.h | 6 +++--- src/world/Network/PacketWrappers/MoveActorPacket.h | 3 +-- src/world/Territory/InstanceContent.cpp | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/world/Encounter/InstanceContent/IfritNormal.h b/src/world/Encounter/InstanceContent/IfritNormal.h index 9db4adfd..8b2760be 100644 --- a/src/world/Encounter/InstanceContent/IfritNormal.h +++ b/src/world/Encounter/InstanceContent/IfritNormal.h @@ -18,7 +18,7 @@ namespace Sapphire void init() override { - Logger::info( "ifrit FAN CLUB GEOcities EUNUCH ONLY" ); + Logger::info( "stage 2 init" ); } void update( uint64_t deltaTime ) override @@ -55,7 +55,7 @@ namespace Sapphire void init() override { - Logger::info( "ifrit FAN CLUB GEOcities EUNUCH ONLY" ); + Logger::info( "stage 1 init" ); } void update( uint64_t deltaTime ) override @@ -76,7 +76,7 @@ namespace Sapphire m_pEncounter->addState( ifritTwoState ); } - if( timeElapsedMs > 10000 ) + if( timeElapsedMs > 12000 ) { pIfrit->hateListGetHighest()->die(); } diff --git a/src/world/Network/PacketWrappers/MoveActorPacket.h b/src/world/Network/PacketWrappers/MoveActorPacket.h index d11f8e9e..fd65249d 100644 --- a/src/world/Network/PacketWrappers/MoveActorPacket.h +++ b/src/world/Network/PacketWrappers/MoveActorPacket.h @@ -10,8 +10,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server { /** - * @brief The Client UI Initialization packet. This must be sent to the client - * once upon connection to configure the UI. + * @brief The MoveActor packet for updating an actor's position. */ class MoveActorPacket : public ZoneChannelPacket< FFXIVIpcActorMove > { diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index ae5f4097..fee9886a 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -177,7 +177,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) // todo: revive players if trial/enclosed raid arena, add reset timer if( m_instanceResetTime == 0 ) { - //sendDutyReset(); + sendDutyReset(); m_instanceResetTime = tickCount + 3000; return; @@ -187,7 +187,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) if( m_instanceResetFinishTime == 0 ) { - m_instanceResetFinishTime = tickCount + 3000; + m_instanceResetFinishTime = tickCount + 5000; m_pEncounter->reset(); auto& server = Common::Service< World::WorldServer >::ref(); @@ -202,6 +202,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) movePlayerToEntrance( *pPlayer ); auto zoneInPacket = makeActorControlSelf( pPlayer->getId(), Appear, 0x3, 0, 0, 0 ); auto setStatusPacket = makeActorControl( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); + server.queueForPlayer( pPlayer->getCharacterId(), zoneInPacket ); server.queueForPlayers( pPlayer->getInRangePlayerIds( true ), setStatusPacket );