diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index afc655ce..0e9e9feb 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -258,7 +258,7 @@ Sets the actors position and notifies the zone to propagate the change void Core::Entity::Actor::setPosition( const Common::FFXIVARR_POSITION3& pos ) { m_pos = pos; - m_pCurrentZone->changeActorPosition( *this ); + m_pCurrentZone->updateActorPosition(*this); } void Core::Entity::Actor::setPosition( float x, float y, float z ) @@ -266,7 +266,7 @@ void Core::Entity::Actor::setPosition( float x, float y, float z ) m_pos.x = x; m_pos.y = y; m_pos.z = z; - m_pCurrentZone->changeActorPosition( *this ); + m_pCurrentZone->updateActorPosition(*this); } /*! @@ -505,26 +505,25 @@ but also to the global actor map \param ActorPtr to remove */ -void Core::Entity::Actor::removeInRangeActor( Actor& pActor ) +void Core::Entity::Actor::removeInRangeActor( Actor& actor ) { // call virtual event - onRemoveInRangeActor( pActor ); + onRemoveInRangeActor( actor ); // remove actor from in range actor set - m_inRangeActors.erase( pActor.getAsActor() ); + m_inRangeActors.erase( actor.getAsActor() ); // if actor is a player, despawn ourself for him // TODO: move to virtual onRemove? if( isPlayer() ) - pActor.despawn( getAsPlayer() ); + actor.despawn( getAsPlayer() ); - if( pActor.isPlayer() ) + if( actor.isPlayer() ) { - auto pPlayer = pActor.getAsPlayer(); - m_inRangePlayers.erase( pPlayer ); + m_inRangePlayers.erase( actor.getAsPlayer() ); } - m_inRangeActorMap.erase( pActor.getId() ); + m_inRangeActorMap.erase( actor.getId() ); } /*! \return true if there is at least one actor in the in range set */ @@ -533,6 +532,52 @@ bool Core::Entity::Actor::hasInRangeActor() const return ( m_inRangeActors.size() > 0 ); } +void Core::Entity::Actor::removeFromInRange() +{ + if( !hasInRangeActor() ) + return; + + Entity::ActorPtr pCurAct; + + for( auto& pCurAct : m_inRangeActors ) + { + pCurAct->removeInRangeActor( *this ); + } + +} + +void Core::Entity::Actor::checkInRangeActors() +{ + if( hasInRangeActor() ) + { + Entity::ActorPtr pCurAct; + + float fRange = 70.0f; + for( auto iter = m_inRangeActors.begin(); iter != m_inRangeActors.end();) + { + pCurAct = *iter; + auto iter2 = iter++; + + float distance = Math::Util::distance( pCurAct->getPos().x, pCurAct->getPos().y, pCurAct->getPos().z, + getPos().x, getPos().y, getPos().z ); + + if( fRange > 0.0f && distance > fRange ) + { + pCurAct->removeInRangeActor( *this ); + + if( getCurrentZone() != pCurAct->getCurrentZone() ) + return; + + removeInRangeActor( **iter2 ); + + // @TODO FIXME! + // this break is more or less a hack, iteration will break otherwise after removing + break; + } + } + } +} + /*! Clear the whole in range set, this does no cleanup */ void Core::Entity::Actor::clearInRangeSet() { diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index 90e22d93..8c4df9a8 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -139,6 +139,10 @@ protected: std::vector< std::pair< uint8_t, uint32_t> > m_statusEffectList; std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap; + std::set< ActorPtr > m_inRangeActors; + std::set< PlayerPtr > m_inRangePlayers; + std::map< uint32_t, ActorPtr > m_inRangeActorMap; + public: Actor( ObjKind type ); @@ -277,6 +281,10 @@ public: // return true if there is at least one actor in the in range set bool hasInRangeActor() const; + void checkInRangeActors(); + + void removeFromInRange(); + // clear the whole in range set, this does no cleanup virtual void clearInRangeSet(); @@ -290,12 +298,6 @@ public: // set the current cell void setCell( Cell* pCell ); - - // TODO: Why did i even declare them publicly here?! - std::set< ActorPtr > m_inRangeActors; - std::set< PlayerPtr > m_inRangePlayers; - std::map< uint32_t, ActorPtr > m_inRangeActorMap; - Core::Cell* m_pCell; }; diff --git a/src/servers/sapphire_zone/Actor/InstanceObject.cpp b/src/servers/sapphire_zone/Actor/InstanceObject.cpp index cf6ae9ad..a926d27c 100644 --- a/src/servers/sapphire_zone/Actor/InstanceObject.cpp +++ b/src/servers/sapphire_zone/Actor/InstanceObject.cpp @@ -1,28 +1,28 @@ #include "InstanceObject.h" #include "Zone/InstanceContent.h" -Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId ) : +Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t mapLinkId ) : Core::Entity::GameObject( ObjKind::EventObj ), - m_hierachyId( hierachyId ), + m_mapLinkId( mapLinkId ), m_state( 0 ) { m_id = objectId; } -Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ) - : InstanceObject( objectId, hierachyId ) +Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t mapLinkId, Common::FFXIVARR_POSITION3 pos ) + : InstanceObject( objectId, mapLinkId ) { } uint32_t Core::Entity::InstanceObject::getHierachyId() const { - return m_hierachyId; + return m_mapLinkId; } void Core::Entity::InstanceObject::setHierachyId( uint32_t hierachyId ) { - m_hierachyId = hierachyId; + m_mapLinkId = hierachyId; } uint8_t Core::Entity::InstanceObject::getState() const diff --git a/src/servers/sapphire_zone/Actor/InstanceObject.h b/src/servers/sapphire_zone/Actor/InstanceObject.h index 03ed1f47..6bd61e0f 100644 --- a/src/servers/sapphire_zone/Actor/InstanceObject.h +++ b/src/servers/sapphire_zone/Actor/InstanceObject.h @@ -10,8 +10,8 @@ namespace Entity class InstanceObject : public GameObject { public: - InstanceObject( uint32_t objectId, uint32_t hierachyId ); - InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ); + InstanceObject( uint32_t objectId, uint32_t mapLinkId ); + InstanceObject( uint32_t objectId, uint32_t mapLinkId, Common::FFXIVARR_POSITION3 pos ); uint32_t getHierachyId() const; void setHierachyId( uint32_t hierachyId ); @@ -23,7 +23,7 @@ namespace Entity void setParentInstance( InstanceContentPtr instance ); protected: - uint32_t m_hierachyId; + uint32_t m_mapLinkId; uint8_t m_state; InstanceContentPtr m_parentInstance; }; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 5a52c909..8e5d27d5 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -421,7 +421,7 @@ void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePac player.spawn( player.getAsPlayer() ); // notify the zone of a change in position to force an "inRangeActor" update - player.getCurrentZone()->changeActorPosition( player ); + player.getCurrentZone()->updateActorPosition(player); } void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket, diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 7e60d488..18fe57fb 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -352,17 +352,7 @@ void Zone::removeActor( Entity::ActorPtr pActor ) m_BattleNpcMap.erase( pActor->getId() ); // remove from lists of other actors - if( pActor->hasInRangeActor() ) - { - Entity::ActorPtr pCurAct; - - for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end(); ) - { - pCurAct = *iter; - auto iter2 = iter++; - pCurAct->removeInRangeActor( *pActor ); - } - } + pActor->removeFromInRange(); pActor->clearInRangeSet(); } @@ -619,52 +609,19 @@ void Zone::updateCellActivity( uint32_t x, uint32_t y, int32_t radius ) } } -void Zone::changeActorPosition( Entity::Actor& actor ) +void Zone::updateActorPosition( Entity::Actor &actor ) { if( actor.getCurrentZone() != shared_from_this() ) return; - if( actor.hasInRangeActor() ) - { - Entity::ActorPtr pCurAct; - - float fRange = 70.0f; - for( auto iter = actor.m_inRangeActors.begin(); iter != actor.m_inRangeActors.end();) - { - pCurAct = *iter; - auto iter2 = iter++; - - float distance = Math::Util::distance( pCurAct->getPos().x, - pCurAct->getPos().y, - pCurAct->getPos().z, - actor.getPos().x, - actor.getPos().y, - actor.getPos().z ); - - if( fRange > 0.0f && distance > fRange ) - { - pCurAct->removeInRangeActor( actor ); - - if( actor.getCurrentZone() != shared_from_this() ) - return; - - actor.removeInRangeActor( **iter2 ); - - // @TODO FIXME! - // this break is more or less a hack, iteration will break otherwise after removing - break; - } - } - } + actor.checkInRangeActors(); uint32_t cellX = getPosX( actor.getPos().x ); uint32_t cellY = getPosY( actor.getPos().z ); if( cellX >= _sizeX || cellY >= _sizeY ) - { return; - } Cell* pCell = getCell( cellX, cellY ); Cell* pOldCell = actor.m_pCell; @@ -742,12 +699,8 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ) if( !pCurAct ) continue; - float distance = Math::Util::distance( pCurAct->getPos().x, - pCurAct->getPos().y, - pCurAct->getPos().z, - pActor->getPos().x, - pActor->getPos().y, - pActor->getPos().z ); + float distance = Math::Util::distance( pCurAct->getPos().x, pCurAct->getPos().y, pCurAct->getPos().z, + pActor->getPos().x, pActor->getPos().y, pActor->getPos().z ); // Add if we are not ourself and range == 0 or distance is withing range. if( pCurAct != pActor && ( fRange == 0.0f || distance <= fRange ) ) diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index a898a802..dedf6e3a 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -36,6 +36,7 @@ protected: std::unordered_map< int32_t, Entity::PlayerPtr > m_playerMap; std::unordered_map< int32_t, Entity::BattleNpcPtr > m_BattleNpcMap; std::unordered_map< int32_t, Entity::EventNpcPtr > m_EventNpcMap; + std::unordered_map< int32_t, Entity::InstanceObjectPtr > m_instanceObjects; std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap; @@ -53,7 +54,7 @@ protected: std::map< uint8_t, int32_t> m_weatherRateMap; - std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects; + public: Zone(); @@ -89,7 +90,7 @@ public: void removeActor( Entity::ActorPtr pActor ); - void changeActorPosition( Entity::Actor& pActor ); + void updateActorPosition( Entity::Actor &pActor ); bool isCellActive( uint32_t x, uint32_t y );