1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-26 22:37:45 +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 )
{
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()
{

View file

@ -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;
};

View file

@ -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

View file

@ -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;
};

View file

@ -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,

View file

@ -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 ) )

View file

@ -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 );