mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 06:47:45 +00:00
In range containers no longer declared publicly
This commit is contained in:
parent
f0a649b53f
commit
cee84cd9ff
7 changed files with 81 additions and 80 deletions
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 ) )
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue