1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

In range containers no longer declared publicly

This commit is contained in:
Mordred 2018-02-11 22:57:00 +01:00
parent f0a649b53f
commit cee84cd9ff
7 changed files with 81 additions and 80 deletions

View file

@ -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 ) void Core::Entity::Actor::setPosition( const Common::FFXIVARR_POSITION3& pos )
{ {
m_pos = pos; m_pos = pos;
m_pCurrentZone->changeActorPosition( *this ); m_pCurrentZone->updateActorPosition(*this);
} }
void Core::Entity::Actor::setPosition( float x, float y, float z ) 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.x = x;
m_pos.y = y; m_pos.y = y;
m_pos.z = z; 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 \param ActorPtr to remove
*/ */
void Core::Entity::Actor::removeInRangeActor( Actor& pActor ) void Core::Entity::Actor::removeInRangeActor( Actor& actor )
{ {
// call virtual event // call virtual event
onRemoveInRangeActor( pActor ); onRemoveInRangeActor( actor );
// remove actor from in range actor set // 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 // if actor is a player, despawn ourself for him
// TODO: move to virtual onRemove? // TODO: move to virtual onRemove?
if( isPlayer() ) if( isPlayer() )
pActor.despawn( getAsPlayer() ); actor.despawn( getAsPlayer() );
if( pActor.isPlayer() ) if( actor.isPlayer() )
{ {
auto pPlayer = pActor.getAsPlayer(); m_inRangePlayers.erase( actor.getAsPlayer() );
m_inRangePlayers.erase( pPlayer );
} }
m_inRangeActorMap.erase( pActor.getId() ); m_inRangeActorMap.erase( actor.getId() );
} }
/*! \return true if there is at least one actor in the in range set */ /*! \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 ); 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 */ /*! Clear the whole in range set, this does no cleanup */
void Core::Entity::Actor::clearInRangeSet() void Core::Entity::Actor::clearInRangeSet()
{ {

View file

@ -139,6 +139,10 @@ protected:
std::vector< std::pair< uint8_t, uint32_t> > m_statusEffectList; std::vector< std::pair< uint8_t, uint32_t> > m_statusEffectList;
std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap; 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: public:
Actor( ObjKind type ); Actor( ObjKind type );
@ -277,6 +281,10 @@ public:
// return true if there is at least one actor in the in range set // return true if there is at least one actor in the in range set
bool hasInRangeActor() const; bool hasInRangeActor() const;
void checkInRangeActors();
void removeFromInRange();
// clear the whole in range set, this does no cleanup // clear the whole in range set, this does no cleanup
virtual void clearInRangeSet(); virtual void clearInRangeSet();
@ -290,12 +298,6 @@ public:
// set the current cell // set the current cell
void setCell( Cell* pCell ); 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; Core::Cell* m_pCell;
}; };

View file

@ -1,28 +1,28 @@
#include "InstanceObject.h" #include "InstanceObject.h"
#include "Zone/InstanceContent.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 ), Core::Entity::GameObject( ObjKind::EventObj ),
m_hierachyId( hierachyId ), m_mapLinkId( mapLinkId ),
m_state( 0 ) m_state( 0 )
{ {
m_id = objectId; m_id = objectId;
} }
Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ) Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t mapLinkId, Common::FFXIVARR_POSITION3 pos )
: InstanceObject( objectId, hierachyId ) : InstanceObject( objectId, mapLinkId )
{ {
} }
uint32_t Core::Entity::InstanceObject::getHierachyId() const uint32_t Core::Entity::InstanceObject::getHierachyId() const
{ {
return m_hierachyId; return m_mapLinkId;
} }
void Core::Entity::InstanceObject::setHierachyId( uint32_t hierachyId ) void Core::Entity::InstanceObject::setHierachyId( uint32_t hierachyId )
{ {
m_hierachyId = hierachyId; m_mapLinkId = hierachyId;
} }
uint8_t Core::Entity::InstanceObject::getState() const uint8_t Core::Entity::InstanceObject::getState() const

View file

@ -10,8 +10,8 @@ namespace Entity
class InstanceObject : public GameObject class InstanceObject : public GameObject
{ {
public: public:
InstanceObject( uint32_t objectId, uint32_t hierachyId ); InstanceObject( uint32_t objectId, uint32_t mapLinkId );
InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos ); InstanceObject( uint32_t objectId, uint32_t mapLinkId, Common::FFXIVARR_POSITION3 pos );
uint32_t getHierachyId() const; uint32_t getHierachyId() const;
void setHierachyId( uint32_t hierachyId ); void setHierachyId( uint32_t hierachyId );
@ -23,7 +23,7 @@ namespace Entity
void setParentInstance( InstanceContentPtr instance ); void setParentInstance( InstanceContentPtr instance );
protected: protected:
uint32_t m_hierachyId; uint32_t m_mapLinkId;
uint8_t m_state; uint8_t m_state;
InstanceContentPtr m_parentInstance; InstanceContentPtr m_parentInstance;
}; };

View file

@ -421,7 +421,7 @@ void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePac
player.spawn( player.getAsPlayer() ); player.spawn( player.getAsPlayer() );
// notify the zone of a change in position to force an "inRangeActor" update // 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, void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket,

View file

@ -352,17 +352,7 @@ void Zone::removeActor( Entity::ActorPtr pActor )
m_BattleNpcMap.erase( pActor->getId() ); m_BattleNpcMap.erase( pActor->getId() );
// remove from lists of other actors // remove from lists of other actors
if( pActor->hasInRangeActor() ) pActor->removeFromInRange();
{
Entity::ActorPtr pCurAct;
for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end(); )
{
pCurAct = *iter;
auto iter2 = iter++;
pCurAct->removeInRangeActor( *pActor );
}
}
pActor->clearInRangeSet(); 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() ) if( actor.getCurrentZone() != shared_from_this() )
return; return;
if( actor.hasInRangeActor() ) actor.checkInRangeActors();
{
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;
}
}
}
uint32_t cellX = getPosX( actor.getPos().x ); uint32_t cellX = getPosX( actor.getPos().x );
uint32_t cellY = getPosY( actor.getPos().z ); uint32_t cellY = getPosY( actor.getPos().z );
if( cellX >= _sizeX || cellY >= _sizeY ) if( cellX >= _sizeX || cellY >= _sizeY )
{
return; return;
}
Cell* pCell = getCell( cellX, cellY ); Cell* pCell = getCell( cellX, cellY );
Cell* pOldCell = actor.m_pCell; Cell* pOldCell = actor.m_pCell;
@ -742,12 +699,8 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell )
if( !pCurAct ) if( !pCurAct )
continue; continue;
float distance = Math::Util::distance( pCurAct->getPos().x, float distance = Math::Util::distance( pCurAct->getPos().x, pCurAct->getPos().y, pCurAct->getPos().z,
pCurAct->getPos().y, pActor->getPos().x, pActor->getPos().y, pActor->getPos().z );
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. // Add if we are not ourself and range == 0 or distance is withing range.
if( pCurAct != pActor && ( fRange == 0.0f || distance <= fRange ) ) if( pCurAct != pActor && ( fRange == 0.0f || distance <= fRange ) )

View file

@ -36,6 +36,7 @@ protected:
std::unordered_map< int32_t, Entity::PlayerPtr > m_playerMap; std::unordered_map< int32_t, Entity::PlayerPtr > m_playerMap;
std::unordered_map< int32_t, Entity::BattleNpcPtr > m_BattleNpcMap; std::unordered_map< int32_t, Entity::BattleNpcPtr > m_BattleNpcMap;
std::unordered_map< int32_t, Entity::EventNpcPtr > m_EventNpcMap; std::unordered_map< int32_t, Entity::EventNpcPtr > m_EventNpcMap;
std::unordered_map< int32_t, Entity::InstanceObjectPtr > m_instanceObjects;
std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap; std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap;
@ -53,7 +54,7 @@ protected:
std::map< uint8_t, int32_t> m_weatherRateMap; std::map< uint8_t, int32_t> m_weatherRateMap;
std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects;
public: public:
Zone(); Zone();
@ -89,7 +90,7 @@ public:
void removeActor( Entity::ActorPtr pActor ); void removeActor( Entity::ActorPtr pActor );
void changeActorPosition( Entity::Actor& pActor ); void updateActorPosition( Entity::Actor &pActor );
bool isCellActive( uint32_t x, uint32_t y ); bool isCellActive( uint32_t x, uint32_t y );