diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 3431a499..8ede4128 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -1091,4 +1091,14 @@ const Common::FFXIVARR_POSITION3& BNpc::getRoamTargetPos() const const Common::FFXIVARR_POSITION3& BNpc::getSpawnPos() const { return m_spawnPos; -} \ No newline at end of file +} + +void BNpc::setPos( float x, float y, float z, bool broadcastUpdate ) +{ + Chara::setPos( x, y, z, broadcastUpdate ); +} + +void BNpc::setPos( const FFXIVARR_POSITION3& pos, bool broadcastUpdate ) +{ + setPos( pos.x, pos.y, pos.z, broadcastUpdate ); +} diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index b76d26e5..7e79adb1 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -134,6 +134,9 @@ namespace Sapphire::Entity uint32_t getTimeOfDeath() const; void setTimeOfDeath( uint32_t timeOfDeath ); + void setPos( const Common::FFXIVARR_POSITION3& pos, bool broadcastUpdate = true ) override; + void setPos( float x, float y, float z, bool broadcastUpdate = true ) override; + void restHp(); void checkAggro(); diff --git a/src/world/Encounter/InstanceContent/IfritNormal.h b/src/world/Encounter/InstanceContent/IfritNormal.h index 5021a960..2a7f7e12 100644 --- a/src/world/Encounter/InstanceContent/IfritNormal.h +++ b/src/world/Encounter/InstanceContent/IfritNormal.h @@ -19,11 +19,8 @@ namespace Sapphire void init() override { - m_status = EncounterFightStatus::IDLE; m_startTime = 0; - m_stateStack = std::make_shared< EncounterState::StateStack >(); - // todo: i don't like this auto boss = m_pInstance->createBNpcFromLayoutId( NPC_IFRIT, VAL_IFRIT_HP, Common::BNpcType::Enemy ); boss->init(); @@ -33,7 +30,6 @@ namespace Sapphire void start() override { - m_status = EncounterFightStatus::ACTIVE; } void reset() override @@ -51,24 +47,7 @@ namespace Sapphire void update( uint64_t deltaTime ) override { - // todo: better way to start fights here.. - // this probably doesn't need to be overriden either - - auto ifrit = getBNpc( NPC_IFRIT ); - - if( ifrit; ifrit->hateListGetHighestValue() != 0 && m_status == EncounterFightStatus::IDLE ) - { - m_startTime = deltaTime; - start(); - } - - if( m_status == EncounterFightStatus::ACTIVE && ifrit && ( !ifrit->hateListGetHighest() || !ifrit->hateListGetHighest()->isAlive() ) ) - { - m_status = EncounterFightStatus::FAIL; - } - m_pInstance->getEncounterTimeline().update( getInstance(), deltaTime ); - } }; }// namespace Sapphire \ No newline at end of file diff --git a/src/world/Encounter/Timepoint.cpp b/src/world/Encounter/Timepoint.cpp index 705debe4..08016fec 100644 --- a/src/world/Encounter/Timepoint.cpp +++ b/src/world/Encounter/Timepoint.cpp @@ -11,10 +11,13 @@ #include +#include #include #include #include + +#include #include #include #include @@ -22,6 +25,8 @@ #include #include +#include + namespace Sapphire::Encounter { const TimepointDataPtr Timepoint::getData() const @@ -58,7 +63,7 @@ namespace Sapphire::Encounter { "idle", TimepointDataType::Idle }, { "castAction", TimepointDataType::CastAction }, { "setPos", TimepointDataType::SetPos }, - { "playActionTimeLine", TimepointDataType::ActionTimeLine }, + { "actionTimeline", TimepointDataType::ActionTimeLine }, { "logMessage", TimepointDataType::LogMessage }, { "battleTalk", TimepointDataType::BattleTalk }, @@ -156,7 +161,7 @@ namespace Sapphire::Encounter case TimepointDataType::ActionTimeLine: { auto& dataJ = json.at( "data" ); - auto action = dataJ.at( "action" ).get< uint32_t >(); + auto action = dataJ.at( "actionTimelineId" ).get< uint32_t >(); auto actorRef = dataJ.at( "actorName" ).get< std::string >(); m_pData = std::make_shared< TimepointDataActionTimeLine >( actorRef, action ); @@ -179,10 +184,11 @@ namespace Sapphire::Encounter auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params ); pBattleTalkData->m_battleTalkId = dataJ.at( "battleTalkId" ).get< uint32_t >(); - pBattleTalkData->m_handlerRef = dataJ.at( "handlerActorName" ).get< std::string >(); + pBattleTalkData->m_kind = dataJ.at( "kind" ).get< uint32_t >(); pBattleTalkData->m_nameId = dataJ.at( "nameId" ).get< uint32_t >(); pBattleTalkData->m_talkerRef = dataJ.at( "talkerActorName" ).get< std::string >(); + pBattleTalkData->m_handlerRef = pBattleTalkData->m_talkerRef; m_pData = pBattleTalkData; } @@ -456,6 +462,16 @@ namespace Sapphire::Encounter { pBNpc->setRot( pSetPosData->m_rot ); pBNpc->setPos( pSetPosData->m_x, pSetPosData->m_y, pSetPosData->m_z, true ); + auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + auto pZone = teriMgr.getTerritoryByGuId( pBNpc->getTerritoryId() ); + + auto pNaviProvider = pZone->getNaviProvider(); + + if( pNaviProvider ) + { + pNaviProvider->updateAgentPosition( *pBNpc ); + } + pBNpc->sendPositionUpdate(); } } break;