mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-24 05:37:45 +00:00
Majorly refactored usage of shared_ptr also added GameObject into Actor inheritance chain
This commit is contained in:
parent
f2a407c5e4
commit
2000d5d2f8
31 changed files with 335 additions and 422 deletions
|
@ -7,6 +7,9 @@
|
|||
#define TYPE_FORWARD( x ) \
|
||||
class x; \
|
||||
typedef boost::shared_ptr< x > x ## Ptr; \
|
||||
template< typename...Args > \
|
||||
x ## Ptr make_ ## x( Args &&...args ) { \
|
||||
return boost::make_shared< x >( std::forward< Args >( args ) ... ); }\
|
||||
typedef std::vector< x > x ## PtrList;
|
||||
|
||||
namespace Core
|
||||
|
|
|
@ -42,7 +42,7 @@ Core::Network::GameConnection::~GameConnection()
|
|||
// overwrite the parents onConnect for our game socket needs
|
||||
void Core::Network::GameConnection::OnAccept( const std::string & host, uint16_t port )
|
||||
{
|
||||
GameConnectionPtr connection( new GameConnection( m_hive, m_pAcceptor ) );
|
||||
auto connection = make_GameConnection( m_hive, m_pAcceptor );
|
||||
m_pAcceptor->Accept( connection );
|
||||
|
||||
g_log.info( "Connect from " + m_socket.remote_endpoint().address().to_string() );
|
||||
|
@ -54,12 +54,12 @@ void Core::Network::GameConnection::OnDisconnect()
|
|||
g_log.debug( "DISCONNECT" );
|
||||
}
|
||||
|
||||
void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
||||
void Core::Network::GameConnection::OnRecv( std::vector< uint8_t >& buffer )
|
||||
{
|
||||
Packets::FFXIVARR_PACKET_HEADER packetHeader;
|
||||
const auto headerResult = Packets::getHeader(buffer, 0, packetHeader);
|
||||
const auto headerResult = Packets::getHeader( buffer, 0, packetHeader );
|
||||
|
||||
if (headerResult == Incomplete)
|
||||
if( headerResult == Incomplete )
|
||||
{
|
||||
g_log.info("Dropping connection due to incomplete packet header.");
|
||||
g_log.info("FIXME: Packet message bounary is not implemented.");
|
||||
|
@ -67,7 +67,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
|||
return;
|
||||
}
|
||||
|
||||
if (headerResult == Malformed)
|
||||
if( headerResult == Malformed )
|
||||
{
|
||||
g_log.info("Dropping connection due to malformed packet header.");
|
||||
Disconnect();
|
||||
|
@ -76,9 +76,10 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
|||
|
||||
// Dissect packet list
|
||||
std::vector< Packets::FFXIVARR_PACKET_RAW > packetList;
|
||||
const auto packetResult = Packets::getPackets(buffer, sizeof(struct FFXIVARR_PACKET_HEADER), packetHeader, packetList);
|
||||
const auto packetResult = Packets::getPackets( buffer, sizeof( struct FFXIVARR_PACKET_HEADER ),
|
||||
packetHeader, packetList );
|
||||
|
||||
if (packetResult == Incomplete)
|
||||
if( packetResult == Incomplete )
|
||||
{
|
||||
g_log.info("Dropping connection due to incomplete packets.");
|
||||
g_log.info("FIXME: Packet message bounary is not implemented.");
|
||||
|
@ -86,7 +87,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
|||
return;
|
||||
}
|
||||
|
||||
if (packetResult == Malformed)
|
||||
if( packetResult == Malformed )
|
||||
{
|
||||
g_log.info("Dropping connection due to malformed packets.");
|
||||
Disconnect();
|
||||
|
@ -94,7 +95,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
|||
}
|
||||
|
||||
// Handle it
|
||||
handlePackets(packetHeader, packetList);
|
||||
handlePackets( packetHeader, packetList );
|
||||
|
||||
}
|
||||
|
||||
|
@ -163,21 +164,21 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui
|
|||
memset( &details, 0, sizeof( FFXIVIpcCharList::CharaDetails ) );
|
||||
|
||||
auto& charEntry = charList[charIndex];
|
||||
details.uniqueId = get<1>( charEntry );
|
||||
details.contentId = get<2>( charEntry );
|
||||
details.uniqueId = get< 1 >( charEntry );
|
||||
details.contentId = get< 2 >( charEntry );
|
||||
details.serverId = g_serverLobby.getConfig()->getValue<uint16_t>( "Settings.Parameters.WorldID", 1 );
|
||||
details.index = charIndex;
|
||||
strcpy( details.charDetailJson, get<3>( charEntry ).c_str() );
|
||||
strcpy( details.nameChara, get<0>( charEntry ).c_str() );
|
||||
strcpy( details.charDetailJson, get< 3 >( charEntry ).c_str() );
|
||||
strcpy( details.nameChara, get< 0 >( charEntry ).c_str() );
|
||||
strcpy( details.nameServer, g_serverLobby.getConfig()->getValue< std::string >( "Settings.Parameters.WorldName", "Sapphire" ).c_str() );
|
||||
|
||||
charListPacket.data().charaDetails[j] = details;
|
||||
|
||||
g_log.debug( "[" + std::to_string( charIndex ) + "] " + std::to_string( details.index ) + " - "
|
||||
+ get<0>( charEntry ) + " - " +
|
||||
std::to_string( get<1>( charEntry ) ) + " - " +
|
||||
std::to_string( get<2>( charEntry ) ) + " - " +
|
||||
get<3>( charEntry ) );
|
||||
+ get< 0 >( charEntry ) + " - " +
|
||||
std::to_string( get< 1 >( charEntry ) ) + " - " +
|
||||
std::to_string( get< 2 >( charEntry ) ) + " - " +
|
||||
get< 3 >( charEntry ) );
|
||||
}
|
||||
charIndex++;
|
||||
}
|
||||
|
@ -215,12 +216,12 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin
|
|||
auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() );
|
||||
for( uint32_t i = 0; i < charList.size(); i++ )
|
||||
{
|
||||
uint64_t thisContentId = get<2>( charList[i] );
|
||||
uint64_t thisContentId = get< 2 >( charList[i] );
|
||||
|
||||
if( thisContentId == lookupId )
|
||||
{
|
||||
logInCharId = get<1>( charList[i] );
|
||||
logInCharName = get<0>( charList[i] );
|
||||
logInCharId = get< 1 >( charList[i] );
|
||||
logInCharName = get< 0 >( charList[i] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -250,13 +251,13 @@ bool Core::Network::GameConnection::sendServiceAccountList( FFXIVARR_PACKET_RAW&
|
|||
{
|
||||
LobbySessionPtr pSession = g_serverLobby.getSession( ( char* )&packet.data[0] + 0x20 );
|
||||
|
||||
if( g_serverLobby.getConfig()->getValue<bool>( "Settings.Parameters.AllowNoSessionConnect" ) && pSession == nullptr )
|
||||
if( g_serverLobby.getConfig()->getValue< bool >( "Settings.Parameters.AllowNoSessionConnect" ) && pSession == nullptr )
|
||||
{
|
||||
LobbySessionPtr session( new Core::LobbySession() );
|
||||
auto session = make_LobbySession();
|
||||
session->setAccountID( 0 );
|
||||
session->setSessionId( (uint8_t *)&packet.data[0] + 0x20 );
|
||||
pSession = session;
|
||||
g_log.Log( LoggingSeverity::info, "Allowed connection with no session: " + std::string( (char*)&packet.data[0] + 0x20 ) );
|
||||
g_log.Log( LoggingSeverity::info, "Allowed connection with no session: " + std::string( ( char* )&packet.data[0] + 0x20 ) );
|
||||
}
|
||||
|
||||
if( pSession != nullptr )
|
||||
|
|
|
@ -13,7 +13,7 @@ using namespace Core::Common;
|
|||
|
||||
// todo: add AoE actor limits (16, 32)
|
||||
|
||||
bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter )
|
||||
bool ActionCollision::isActorApplicable( Actor& actor, TargetFilter targetFilter )
|
||||
{
|
||||
bool actorApplicable = false;
|
||||
switch( targetFilter )
|
||||
|
@ -25,29 +25,29 @@ bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetF
|
|||
}
|
||||
case TargetFilter::Players:
|
||||
{
|
||||
actorApplicable = actorPtr->isPlayer();
|
||||
actorApplicable = actor.isPlayer();
|
||||
break;
|
||||
}
|
||||
case TargetFilter::Allies:
|
||||
{
|
||||
// todo: implement ally NPCs
|
||||
actorApplicable = !actorPtr->isBNpc();
|
||||
actorApplicable = !actor.isBattleNpc();
|
||||
break;
|
||||
}
|
||||
case TargetFilter::Party:
|
||||
{
|
||||
// todo: implement party
|
||||
actorApplicable = actorPtr->isPlayer();
|
||||
actorApplicable = actor.isPlayer();
|
||||
break;
|
||||
}
|
||||
case TargetFilter::Enemies:
|
||||
{
|
||||
actorApplicable = actorPtr->isBNpc();
|
||||
actorApplicable = actor.isBattleNpc();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ( actorApplicable && actorPtr->isAlive() );
|
||||
return ( actorApplicable && actor.isAlive() );
|
||||
}
|
||||
|
||||
std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXIVARR_POSITION3 aoePosition,
|
||||
|
@ -70,7 +70,7 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
|||
assert( pActor );
|
||||
|
||||
// Don't bother wasting on collision if actor doesn't apply for it
|
||||
if ( !isActorApplicable( pActor, targetFilter ) )
|
||||
if ( !isActorApplicable( *pActor, targetFilter ) )
|
||||
continue;
|
||||
|
||||
// Test our collision from actor with the area generated by the action from the AoE data
|
||||
|
@ -88,7 +88,7 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
|||
{
|
||||
assert( pActor );
|
||||
|
||||
if ( !isActorApplicable( pActor, targetFilter ) )
|
||||
if ( !isActorApplicable( *pActor, targetFilter ) )
|
||||
continue;
|
||||
|
||||
if ( radiusCollision( pActor->getPos(), aoePosition, actionInfo->effectRange ) )
|
||||
|
@ -102,7 +102,7 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
|||
{
|
||||
assert( pActor );
|
||||
|
||||
if ( !isActorApplicable( pActor, targetFilter ) )
|
||||
if ( !isActorApplicable( *pActor, targetFilter ) )
|
||||
continue;
|
||||
|
||||
if ( boxCollision( pActor->getPos(), aoePosition, actionInfo->xAxisModifier, actionInfo->effectRange ) )
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Entity {
|
|||
{
|
||||
public:
|
||||
|
||||
static bool isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter );
|
||||
static bool isActorApplicable( Actor& actor, TargetFilter targetFilter );
|
||||
static std::set< ActorPtr > getActorsHitFromAction( Common::FFXIVARR_POSITION3 aoePosition,
|
||||
std::set< ActorPtr > actorsInRange,
|
||||
boost::shared_ptr< Data::Action > actionInfo,
|
||||
|
|
|
@ -32,7 +32,8 @@ using namespace Core::Common;
|
|||
using namespace Core::Network::Packets;
|
||||
using namespace Core::Network::Packets::Server;
|
||||
|
||||
Core::Entity::Actor::Actor()
|
||||
Core::Entity::Actor::Actor( ObjKind type ) :
|
||||
GameObject( type )
|
||||
{
|
||||
// initialize the free slot queue
|
||||
for( uint8_t i = 0; i < MAX_STATUS_EFFECTS; i++ )
|
||||
|
@ -45,51 +46,22 @@ Core::Entity::Actor::~Actor()
|
|||
{
|
||||
}
|
||||
|
||||
/*! \return the id of the actor */
|
||||
uint32_t Core::Entity::Actor::getId() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
/*! \return the actors position object */
|
||||
Core::Common::FFXIVARR_POSITION3& Core::Entity::Actor::getPos()
|
||||
{
|
||||
return m_pos;
|
||||
}
|
||||
/*! \return the actors name */
|
||||
std::string Core::Entity::Actor::getName() const
|
||||
{
|
||||
return std::string( m_name );
|
||||
}
|
||||
|
||||
/*! \return true if the actor is of type player */
|
||||
bool Core::Entity::Actor::isPlayer() const
|
||||
{
|
||||
return m_objKind == ObjKind::Player;
|
||||
}
|
||||
|
||||
/*! \return true if the actor is of type mob */
|
||||
bool Core::Entity::Actor::isBNpc() const
|
||||
{
|
||||
return m_objKind == ObjKind::BattleNpc;
|
||||
}
|
||||
|
||||
/*! \return true if the actor is of type resident */
|
||||
bool Core::Entity::Actor::isEventNpc() const
|
||||
{
|
||||
return m_objKind == ObjKind::EventNpc;
|
||||
}
|
||||
|
||||
/*! \return list of actors currently in range */
|
||||
std::set< Core::Entity::ActorPtr > Core::Entity::Actor::getInRangeActors( bool includeSelf )
|
||||
{
|
||||
auto tempInRange = m_inRangeActors;
|
||||
auto tempInRange = m_inRangeActors;
|
||||
|
||||
if( includeSelf )
|
||||
tempInRange.insert( shared_from_this() );
|
||||
if( includeSelf )
|
||||
tempInRange.insert( getAsActor() );
|
||||
|
||||
return tempInRange;
|
||||
}
|
||||
return tempInRange;
|
||||
}
|
||||
|
||||
/*! \return current stance of the actors */
|
||||
Core::Entity::Actor::Stance Core::Entity::Actor::getStance() const
|
||||
|
@ -286,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( shared_from_this() );
|
||||
m_pCurrentZone->changeActorPosition( *this );
|
||||
}
|
||||
|
||||
void Core::Entity::Actor::setPosition( float x, float y, float z )
|
||||
|
@ -294,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( shared_from_this() );
|
||||
m_pCurrentZone->changeActorPosition( *this );
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -410,34 +382,10 @@ so players can have their own version and we can abolish the param.
|
|||
*/
|
||||
void Core::Entity::Actor::sendStatusUpdate( bool toSelf )
|
||||
{
|
||||
UpdateHpMpTpPacket updateHpPacket( shared_from_this() );
|
||||
UpdateHpMpTpPacket updateHpPacket( *this );
|
||||
sendToInRangeSet( updateHpPacket );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as PlayerPtr */
|
||||
Core::Entity::PlayerPtr Core::Entity::Actor::getAsPlayer()
|
||||
{
|
||||
if( !isPlayer() )
|
||||
return nullptr;
|
||||
return boost::dynamic_pointer_cast< Entity::Player, Entity::Actor >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as BattleNpcPtr */
|
||||
Core::Entity::BattleNpcPtr Core::Entity::Actor::getAsBattleNpc()
|
||||
{
|
||||
if( !isBNpc() )
|
||||
return nullptr;
|
||||
return boost::reinterpret_pointer_cast< Entity::BattleNpc, Entity::Actor >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as EventNpcPtr */
|
||||
Core::Entity::EventNpcPtr Core::Entity::Actor::getAsEventNpc()
|
||||
{
|
||||
if( !isEventNpc() )
|
||||
return nullptr;
|
||||
return boost::reinterpret_pointer_cast< Entity::EventNpc, Entity::Actor >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return ActionPtr of the currently registered action, or nullptr */
|
||||
Core::Action::ActionPtr Core::Entity::Actor::getCurrentAction() const
|
||||
{
|
||||
|
@ -557,29 +505,26 @@ but also to the global actor map
|
|||
|
||||
\param ActorPtr to remove
|
||||
*/
|
||||
void Core::Entity::Actor::removeInRangeActor( ActorPtr pActor )
|
||||
void Core::Entity::Actor::removeInRangeActor( Actor& pActor )
|
||||
{
|
||||
// if this is null, something went wrong
|
||||
assert( pActor );
|
||||
|
||||
// call virtual event
|
||||
onRemoveInRangeActor( pActor );
|
||||
|
||||
// remove actor from in range actor set
|
||||
m_inRangeActors.erase( pActor );
|
||||
m_inRangeActors.erase( pActor.getAsActor() );
|
||||
|
||||
// if actor is a player, despawn ourself for him
|
||||
// TODO: move to virtual onRemove?
|
||||
if( isPlayer() )
|
||||
pActor->despawn( shared_from_this() );
|
||||
pActor.despawn( getAsPlayer() );
|
||||
|
||||
if( pActor->isPlayer() )
|
||||
if( pActor.isPlayer() )
|
||||
{
|
||||
auto pPlayer = pActor->getAsPlayer();
|
||||
auto pPlayer = pActor.getAsPlayer();
|
||||
m_inRangePlayers.erase( pPlayer );
|
||||
}
|
||||
|
||||
m_inRangeActorMap.erase( pActor->getId() );
|
||||
m_inRangeActorMap.erase( pActor.getId() );
|
||||
}
|
||||
|
||||
/*! \return true if there is at least one actor in the in range set */
|
||||
|
@ -644,7 +589,7 @@ void Core::Entity::Actor::autoAttack( ActorPtr pTarget )
|
|||
|
||||
if( ( tick - m_lastAttack ) > 2500 )
|
||||
{
|
||||
pTarget->onActionHostile( shared_from_this() );
|
||||
pTarget->onActionHostile( *this );
|
||||
m_lastAttack = tick;
|
||||
srand( static_cast< uint32_t >( tick ) );
|
||||
|
||||
|
@ -681,12 +626,12 @@ ChaiScript Skill Handler.
|
|||
\param bool should be send to self?
|
||||
*/
|
||||
void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, uint64_t param1,
|
||||
uint64_t param2, Entity::Actor& pTarget )
|
||||
uint64_t param2, Entity::Actor& target )
|
||||
{
|
||||
|
||||
if( isPlayer() )
|
||||
{
|
||||
getAsPlayer()->sendDebug( std::to_string( pTarget.getId() ) );
|
||||
getAsPlayer()->sendDebug( std::to_string( target.getId() ) );
|
||||
getAsPlayer()->sendDebug( "Handle script skill type: " + std::to_string( type ) );
|
||||
}
|
||||
|
||||
|
@ -696,14 +641,14 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
|||
// Prepare packet. This is seemingly common for all packets in the action handler.
|
||||
|
||||
ZoneChannelPacket< FFXIVIpcEffect > effectPacket( getId() );
|
||||
effectPacket.data().targetId = pTarget.getId();
|
||||
effectPacket.data().targetId = target.getId();
|
||||
effectPacket.data().actionAnimationId = actionId;
|
||||
effectPacket.data().unknown_62 = 1; // Affects displaying action name next to number in floating text
|
||||
effectPacket.data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation
|
||||
effectPacket.data().actionTextId = actionId;
|
||||
effectPacket.data().numEffects = 1;
|
||||
effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRotation() );
|
||||
effectPacket.data().effectTarget = pTarget.getId();
|
||||
effectPacket.data().effectTarget = target.getId();
|
||||
|
||||
// Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step
|
||||
switch( type )
|
||||
|
@ -719,21 +664,21 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
|||
if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 )
|
||||
{
|
||||
// If action on this specific target is valid...
|
||||
if ( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Enemies ) )
|
||||
if ( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Enemies ) )
|
||||
break;
|
||||
|
||||
sendToInRangeSet( effectPacket, true );
|
||||
|
||||
if ( pTarget.isAlive() )
|
||||
pTarget.onActionHostile( shared_from_this() );
|
||||
if ( target.isAlive() )
|
||||
target.onActionHostile( *this );
|
||||
|
||||
pTarget.takeDamage( static_cast< uint32_t >( param1 ) );
|
||||
target.takeDamage( static_cast< uint32_t >( param1 ) );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( target.getPos(), getInRangeActors( true ),
|
||||
actionInfoPtr, TargetFilter::Enemies );
|
||||
|
||||
for( const auto& pHitActor : actorsCollided )
|
||||
|
@ -746,7 +691,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
|||
|
||||
|
||||
if( pHitActor->isAlive() )
|
||||
pHitActor->onActionHostile( shared_from_this() );
|
||||
pHitActor->onActionHostile( *this );
|
||||
|
||||
pHitActor->takeDamage( static_cast< uint32_t >( param1 ) );
|
||||
|
||||
|
@ -774,23 +719,23 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
|||
|
||||
if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 )
|
||||
{
|
||||
if( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Allies ) )
|
||||
if( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Allies ) )
|
||||
break;
|
||||
|
||||
sendToInRangeSet( effectPacket, true );
|
||||
pTarget.heal( calculatedHeal );
|
||||
target.heal( calculatedHeal );
|
||||
}
|
||||
else
|
||||
{
|
||||
// todo: get proper packets: the following was just kind of thrown together from what we know.
|
||||
// atm buggy (packets look "delayed" from client)
|
||||
|
||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( target.getPos(), getInRangeActors( true ),
|
||||
actionInfoPtr, TargetFilter::Allies );
|
||||
|
||||
for( auto pHitActor : actorsCollided )
|
||||
{
|
||||
effectPacket.data().targetId = pTarget.getId();
|
||||
effectPacket.data().targetId = target.getId();
|
||||
effectPacket.data().effectTarget = pHitActor->getId();
|
||||
|
||||
sendToInRangeSet( effectPacket, true );
|
||||
|
@ -844,22 +789,20 @@ void Core::Entity::Actor::addStatusEffect( StatusEffect::StatusEffectPtr pEffect
|
|||
}
|
||||
|
||||
/*! \param StatusEffectPtr to be applied to the actor */
|
||||
void Core::Entity::Actor::addStatusEffectById( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param )
|
||||
void Core::Entity::Actor::addStatusEffectById( uint32_t id, int32_t duration, Entity::Actor& source, uint16_t param )
|
||||
{
|
||||
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pSource.shared_from_this(),
|
||||
shared_from_this(), duration, 3000 ) );
|
||||
auto effect = StatusEffect::make_StatusEffect( id, source.getAsActor(), getAsActor(), duration, 3000 );
|
||||
effect->setParam( param );
|
||||
addStatusEffect( effect );
|
||||
}
|
||||
|
||||
/*! \param StatusEffectPtr to be applied to the actor */
|
||||
void Core::Entity::Actor::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param )
|
||||
void Core::Entity::Actor::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& source, uint16_t param )
|
||||
{
|
||||
if( hasStatusEffect( id ) )
|
||||
return;
|
||||
|
||||
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pSource.shared_from_this(),
|
||||
shared_from_this(), duration, 3000 ) );
|
||||
auto effect = StatusEffect::make_StatusEffect( id, source.getAsActor(), getAsActor(), duration, 3000 );
|
||||
effect->setParam( param );
|
||||
addStatusEffect( effect );
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <boost/enable_shared_from_this.hpp>
|
||||
|
||||
#include "Forwards.h"
|
||||
#include "GameObject.h"
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <queue>
|
||||
|
@ -17,28 +18,9 @@ namespace Entity {
|
|||
\brief Base class for all actors
|
||||
|
||||
*/
|
||||
class Actor : public boost::enable_shared_from_this< Actor >
|
||||
class Actor : public GameObject
|
||||
{
|
||||
public:
|
||||
enum ObjKind : uint8_t
|
||||
{
|
||||
None = 0x00,
|
||||
Player = 0x01,
|
||||
BattleNpc = 0x02,
|
||||
EventNpc = 0x03,
|
||||
Treasure = 0x04,
|
||||
Aetheryte = 0x05,
|
||||
GatheringPoint = 0x06,
|
||||
EventObj = 0x07,
|
||||
Mount = 0x08,
|
||||
Companion = 0x09,
|
||||
Retainer = 0x0A,
|
||||
Area = 0x0B,
|
||||
Housing = 0x0C,
|
||||
Cutscene = 0x0D,
|
||||
CardStand = 0x0E,
|
||||
};
|
||||
|
||||
enum Stance : uint8_t
|
||||
{
|
||||
Passive = 0,
|
||||
|
@ -113,21 +95,9 @@ public:
|
|||
} m_baseStats;
|
||||
|
||||
protected:
|
||||
// TODO: The position class should probably be abolished and
|
||||
// the FFXIV_POS struct used instead ( the functions in there
|
||||
// could be moved to a FFXIV_POS_Helper namespace and rotation to
|
||||
// its own member )
|
||||
/*! Position of the actor */
|
||||
Common::FFXIVARR_POSITION3 m_pos;
|
||||
float m_rot;
|
||||
/*! Name of the actor */
|
||||
char m_name[34];
|
||||
/*! Id of the zone the actor currently is in */
|
||||
uint32_t m_zoneId;
|
||||
/*! Id of the actor */
|
||||
uint32_t m_id;
|
||||
/*! Type of the actor */
|
||||
ObjKind m_objKind;
|
||||
/*! Ptr to the ZoneObj the actor belongs to */
|
||||
ZonePtr m_pCurrentZone;
|
||||
/*! Last tick time for the actor ( in ms ) */
|
||||
|
@ -170,14 +140,12 @@ protected:
|
|||
std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap;
|
||||
|
||||
public:
|
||||
Actor();
|
||||
Actor( ObjKind type );
|
||||
|
||||
virtual ~Actor();
|
||||
virtual ~Actor() override;
|
||||
|
||||
virtual void calculateStats() {};
|
||||
|
||||
uint32_t getId() const;
|
||||
|
||||
/// Status effect functions
|
||||
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
|
||||
void removeStatusEffect( uint8_t effectSlotId );
|
||||
|
@ -209,16 +177,8 @@ public:
|
|||
|
||||
float getRotation() const;
|
||||
|
||||
Common::FFXIVARR_POSITION3& getPos();
|
||||
|
||||
std::string getName() const;
|
||||
|
||||
bool isPlayer() const;
|
||||
|
||||
bool isBNpc() const;
|
||||
|
||||
bool isEventNpc() const;
|
||||
|
||||
std::set< ActorPtr > getInRangeActors( bool includeSelf = false );
|
||||
|
||||
bool face( const Common::FFXIVARR_POSITION3& p );
|
||||
|
@ -278,12 +238,12 @@ public:
|
|||
virtual void autoAttack( ActorPtr pTarget );
|
||||
|
||||
virtual void spawn( PlayerPtr pTarget ) {}
|
||||
virtual void despawn( ActorPtr pTarget ) {}
|
||||
virtual void despawn( PlayerPtr pTarget ) {}
|
||||
|
||||
virtual void onRemoveInRangeActor( ActorPtr pActor ) {}
|
||||
virtual void onRemoveInRangeActor( Actor& pActor ) {}
|
||||
virtual void onDeath() {};
|
||||
virtual void onDamageTaken( Actor& pSource ) {};
|
||||
virtual void onActionHostile( Core::Entity::ActorPtr pSource ) {};
|
||||
virtual void onActionHostile( Actor& source ) {};
|
||||
virtual void onActionFriendly( Actor& pSource ) {};
|
||||
virtual void onTick() {};
|
||||
|
||||
|
@ -295,10 +255,6 @@ public:
|
|||
virtual bool checkAction();
|
||||
virtual void update( int64_t currTime ) {};
|
||||
|
||||
PlayerPtr getAsPlayer();
|
||||
BattleNpcPtr getAsBattleNpc();
|
||||
EventNpcPtr getAsEventNpc();
|
||||
|
||||
Action::ActionPtr getCurrentAction() const;
|
||||
|
||||
void setCurrentAction( Action::ActionPtr pAction );
|
||||
|
@ -316,7 +272,7 @@ public:
|
|||
virtual void addInRangeActor( ActorPtr pActor );
|
||||
|
||||
// remove an actor from the in range set
|
||||
void removeInRangeActor( ActorPtr pActor );
|
||||
void removeInRangeActor( Actor& pActor );
|
||||
|
||||
// return true if there is at least one actor in the in range set
|
||||
bool hasInRangeActor() const;
|
||||
|
|
|
@ -25,10 +25,10 @@ extern Core::Data::ExdDataGenerated g_exdDataGen;
|
|||
|
||||
uint32_t Core::Entity::BattleNpc::m_nextID = 1149241694;
|
||||
|
||||
Core::Entity::BattleNpc::BattleNpc()
|
||||
Core::Entity::BattleNpc::BattleNpc() :
|
||||
Actor( ObjKind::BattleNpc )
|
||||
{
|
||||
m_id = 0;
|
||||
m_objKind = ObjKind::BattleNpc;
|
||||
m_status = ActorStatus::Idle;
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,8 @@ Core::Entity::BattleNpc::~BattleNpc()
|
|||
|
||||
Core::Entity::BattleNpc::BattleNpc( uint16_t modelId, uint16_t nameid, const Common::FFXIVARR_POSITION3& spawnPos,
|
||||
uint16_t bnpcBaseId, uint32_t type, uint8_t level, uint8_t behaviour,
|
||||
uint32_t mobType ) : Actor()
|
||||
uint32_t mobType ) :
|
||||
Actor( ObjKind::BattleNpc )
|
||||
{
|
||||
BattleNpc::m_nextID++;
|
||||
m_id = BattleNpc::m_nextID;
|
||||
|
@ -48,8 +49,6 @@ Core::Entity::BattleNpc::BattleNpc( uint16_t modelId, uint16_t nameid, const Com
|
|||
m_pos = spawnPos;
|
||||
m_posOrigin = spawnPos;
|
||||
|
||||
m_objKind = ObjKind::BattleNpc;
|
||||
|
||||
m_mode = MODE_IDLE;
|
||||
m_targetId = static_cast< uint64_t >( INVALID_GAME_OBJECT_ID );
|
||||
|
||||
|
@ -149,11 +148,8 @@ void Core::Entity::BattleNpc::spawn( PlayerPtr pTarget )
|
|||
}
|
||||
|
||||
// despawn
|
||||
void Core::Entity::BattleNpc::despawn( ActorPtr pTarget )
|
||||
void Core::Entity::BattleNpc::despawn( PlayerPtr pPlayer )
|
||||
{
|
||||
|
||||
auto pPlayer = pTarget->getAsPlayer();
|
||||
|
||||
pPlayer->freePlayerSpawnId( getId() );
|
||||
|
||||
ActorControlPacket143 controlPacket( m_id, DespawnZoneScreenMsg, 0x04, getId(), 0x01 );
|
||||
|
@ -181,11 +177,11 @@ uint8_t Core::Entity::BattleNpc::getbehavior() const
|
|||
return m_behavior;
|
||||
}
|
||||
|
||||
void Core::Entity::BattleNpc::hateListAdd( ActorPtr pActor, int32_t hateAmount )
|
||||
void Core::Entity::BattleNpc::hateListAdd( Actor& actor, int32_t hateAmount )
|
||||
{
|
||||
auto hateEntry = new HateListEntry();
|
||||
hateEntry->m_hateAmount = hateAmount;
|
||||
hateEntry->m_pActor = pActor;
|
||||
hateEntry->m_pActor = actor.getAsActor();
|
||||
|
||||
m_hateList.insert( hateEntry );
|
||||
}
|
||||
|
@ -278,32 +274,32 @@ bool Core::Entity::BattleNpc::moveTo( Common::FFXIVARR_POSITION3& pos )
|
|||
|
||||
}
|
||||
|
||||
void Core::Entity::BattleNpc::aggro( ActorPtr pActor )
|
||||
void Core::Entity::BattleNpc::aggro( Actor& actor )
|
||||
{
|
||||
|
||||
m_lastAttack = Util::getTimeMs();
|
||||
hateListUpdate( pActor, 1 );
|
||||
hateListUpdate( actor, 1 );
|
||||
|
||||
changeTarget( pActor->getId() );
|
||||
changeTarget( actor.getId() );
|
||||
setStance( Stance::Active );
|
||||
m_mode = MODE_COMBAT;
|
||||
|
||||
if( pActor->isPlayer() )
|
||||
if( actor.isPlayer() )
|
||||
{
|
||||
PlayerPtr tmpPlayer = pActor->getAsPlayer();
|
||||
PlayerPtr tmpPlayer = actor.getAsPlayer();
|
||||
tmpPlayer->queuePacket( ActorControlPacket142( getId(), 0, 1, 1 ) );
|
||||
tmpPlayer->onMobAggro( getAsBattleNpc() );
|
||||
}
|
||||
}
|
||||
|
||||
void Core::Entity::BattleNpc::deaggro( ActorPtr pActor )
|
||||
void Core::Entity::BattleNpc::deaggro( Actor& actor )
|
||||
{
|
||||
if( !hateListHasActor( pActor ) )
|
||||
hateListRemove( pActor );
|
||||
if( !hateListHasActor( actor ) )
|
||||
hateListRemove( actor );
|
||||
|
||||
if( pActor->isPlayer() )
|
||||
if( actor.isPlayer() )
|
||||
{
|
||||
PlayerPtr tmpPlayer = pActor->getAsPlayer();
|
||||
PlayerPtr tmpPlayer = actor.getAsPlayer();
|
||||
tmpPlayer->onMobDeaggro( getAsBattleNpc() );
|
||||
}
|
||||
}
|
||||
|
@ -314,7 +310,7 @@ void Core::Entity::BattleNpc::hateListClear()
|
|||
for( ; it != m_hateList.end(); ++it )
|
||||
{
|
||||
if( isInRangeSet( ( *it )->m_pActor ) )
|
||||
deaggro( ( *it )->m_pActor );
|
||||
deaggro( *( *it )->m_pActor );
|
||||
HateListEntry* tmpListEntry = ( *it );
|
||||
delete tmpListEntry;
|
||||
}
|
||||
|
@ -322,19 +318,19 @@ void Core::Entity::BattleNpc::hateListClear()
|
|||
}
|
||||
|
||||
|
||||
void Core::Entity::BattleNpc::hateListRemove( ActorPtr pActor )
|
||||
void Core::Entity::BattleNpc::hateListRemove( Actor& actor )
|
||||
{
|
||||
auto it = m_hateList.begin();
|
||||
for( ; it != m_hateList.end(); ++it )
|
||||
{
|
||||
if( ( *it )->m_pActor == pActor )
|
||||
if( ( *it )->m_pActor->getId() == actor.getId() )
|
||||
{
|
||||
HateListEntry* pEntry = *it;
|
||||
m_hateList.erase( it );
|
||||
delete pEntry;
|
||||
if( pActor->isPlayer() )
|
||||
if( actor.isPlayer() )
|
||||
{
|
||||
PlayerPtr tmpPlayer = pActor->getAsPlayer();
|
||||
PlayerPtr tmpPlayer = actor.getAsPlayer();
|
||||
tmpPlayer->onMobDeaggro( getAsBattleNpc() );
|
||||
}
|
||||
return;
|
||||
|
@ -342,12 +338,12 @@ void Core::Entity::BattleNpc::hateListRemove( ActorPtr pActor )
|
|||
}
|
||||
}
|
||||
|
||||
bool Core::Entity::BattleNpc::hateListHasActor( ActorPtr pActor )
|
||||
bool Core::Entity::BattleNpc::hateListHasActor( Actor& actor )
|
||||
{
|
||||
auto it = m_hateList.begin();
|
||||
for( ; it != m_hateList.end(); ++it )
|
||||
{
|
||||
if( ( *it )->m_pActor == pActor )
|
||||
if( ( *it )->m_pActor->getId() == actor.getId() )
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -363,13 +359,13 @@ uint32_t Core::Entity::BattleNpc::getNameId() const
|
|||
return m_nameId;
|
||||
}
|
||||
|
||||
void Core::Entity::BattleNpc::hateListUpdate( ActorPtr pActor, int32_t hateAmount )
|
||||
void Core::Entity::BattleNpc::hateListUpdate( Actor& actor, int32_t hateAmount )
|
||||
{
|
||||
|
||||
auto it = m_hateList.begin();
|
||||
for( ; it != m_hateList.end(); ++it )
|
||||
{
|
||||
if( ( *it )->m_pActor == pActor )
|
||||
if( ( *it )->m_pActor->getId() == actor.getId() )
|
||||
{
|
||||
( *it )->m_hateAmount += hateAmount;
|
||||
return;
|
||||
|
@ -378,7 +374,7 @@ void Core::Entity::BattleNpc::hateListUpdate( ActorPtr pActor, int32_t hateAmoun
|
|||
|
||||
auto hateEntry = new HateListEntry();
|
||||
hateEntry->m_hateAmount = hateAmount;
|
||||
hateEntry->m_pActor = pActor;
|
||||
hateEntry->m_pActor = actor.getAsActor();
|
||||
m_hateList.insert( hateEntry );
|
||||
}
|
||||
|
||||
|
@ -452,14 +448,14 @@ void Core::Entity::BattleNpc::onDeath()
|
|||
hateListClear();
|
||||
}
|
||||
|
||||
void Core::Entity::BattleNpc::onActionHostile( ActorPtr pSource )
|
||||
void Core::Entity::BattleNpc::onActionHostile( Actor& source )
|
||||
{
|
||||
|
||||
if( hateListGetHighest() == nullptr )
|
||||
aggro( pSource );
|
||||
aggro( source );
|
||||
|
||||
if( getClaimer() == nullptr )
|
||||
setOwner( pSource->getAsPlayer() );
|
||||
setOwner( source.getAsPlayer() );
|
||||
}
|
||||
|
||||
Core::Entity::ActorPtr Core::Entity::BattleNpc::getClaimer() const
|
||||
|
@ -526,7 +522,7 @@ void Core::Entity::BattleNpc::update( int64_t currTime )
|
|||
|
||||
if( pClosestActor != nullptr && !pClosestActor->isAlive() )
|
||||
{
|
||||
hateListRemove( pClosestActor );
|
||||
hateListRemove( *pClosestActor );
|
||||
pClosestActor = hateListGetHighest();
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ class BattleNpc : public Actor
|
|||
{
|
||||
public:
|
||||
BattleNpc();
|
||||
~BattleNpc();
|
||||
virtual ~BattleNpc() override;
|
||||
|
||||
BattleNpc( uint16_t modelId, uint16_t nameid, const Common::FFXIVARR_POSITION3& spawnPos, uint16_t bnpcBaseId = 0,
|
||||
uint32_t type = 2, uint8_t level = 0, uint8_t behaviour = 1, uint32_t mobType = 0 );
|
||||
|
@ -42,7 +42,7 @@ public:
|
|||
void spawn( PlayerPtr pTarget ) override;
|
||||
|
||||
// send despawn packets to pTarget
|
||||
void despawn( ActorPtr pTarget ) override;
|
||||
void despawn( PlayerPtr pTarget ) override;
|
||||
|
||||
uint8_t getLevel() const override;
|
||||
|
||||
|
@ -52,12 +52,12 @@ public:
|
|||
|
||||
uint8_t getbehavior() const;
|
||||
|
||||
void hateListAdd( ActorPtr pActor, int32_t hateAmount );
|
||||
void hateListAdd( Actor& actor, int32_t hateAmount );
|
||||
|
||||
void hateListUpdate( ActorPtr pActor, int32_t hateAmount );
|
||||
void hateListRemove( ActorPtr pActor );
|
||||
void hateListUpdate( Actor& actor, int32_t hateAmount );
|
||||
void hateListRemove( Actor& actor );
|
||||
|
||||
bool hateListHasActor( ActorPtr pActor );
|
||||
bool hateListHasActor( Actor& actor );
|
||||
|
||||
void resetPos();
|
||||
|
||||
|
@ -67,15 +67,15 @@ public:
|
|||
|
||||
ActorPtr hateListGetHighest();
|
||||
|
||||
void aggro( ActorPtr pActor );
|
||||
void aggro( Actor& actor );
|
||||
|
||||
void deaggro( ActorPtr pActor );
|
||||
void deaggro( Actor& actor );
|
||||
|
||||
void setOwner( PlayerPtr pPlayer );
|
||||
|
||||
void onDeath() override;
|
||||
|
||||
void onActionHostile( ActorPtr pSource ) override;
|
||||
void onActionHostile( Actor& source ) override;
|
||||
|
||||
ActorPtr getClaimer() const;
|
||||
|
||||
|
|
|
@ -23,10 +23,10 @@ extern Core::Logger g_log;
|
|||
|
||||
uint32_t Core::Entity::EventNpc::m_nextID = 1249241694;
|
||||
|
||||
Core::Entity::EventNpc::EventNpc()
|
||||
Core::Entity::EventNpc::EventNpc() :
|
||||
Actor( ObjKind::EventNpc )
|
||||
{
|
||||
m_id = 0;
|
||||
m_objKind = ObjKind::EventNpc;
|
||||
m_status = ActorStatus::Idle;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,8 @@ Core::Entity::EventNpc::~EventNpc()
|
|||
|
||||
}
|
||||
|
||||
Core::Entity::EventNpc::EventNpc( uint32_t enpcId, const Common::FFXIVARR_POSITION3& spawnPos, float rotation ) : Actor()
|
||||
Core::Entity::EventNpc::EventNpc( uint32_t enpcId, const Common::FFXIVARR_POSITION3& spawnPos, float rotation ) :
|
||||
Actor( ObjKind::EventNpc )
|
||||
{
|
||||
EventNpc::m_nextID++;
|
||||
m_id = EventNpc::m_nextID;
|
||||
|
@ -43,8 +44,6 @@ Core::Entity::EventNpc::EventNpc( uint32_t enpcId, const Common::FFXIVARR_POSITI
|
|||
m_pos = spawnPos;
|
||||
m_posOrigin = spawnPos;
|
||||
|
||||
m_objKind = ObjKind::EventNpc;
|
||||
|
||||
m_targetId = static_cast< uint64_t >( INVALID_GAME_OBJECT_ID );
|
||||
|
||||
m_maxHp = 150;
|
||||
|
@ -68,7 +67,8 @@ Core::Entity::EventNpc::EventNpc( uint32_t enpcId, const Common::FFXIVARR_POSITI
|
|||
}
|
||||
|
||||
// spawn this player for pTarget
|
||||
// TODO: Retail additionally sends Look+Models for EventNpcs even though it is not needed, add when the new exd reader is implemented(also counts for BNPCs)
|
||||
/*! TODO: Retail additionally sends Look+Models for EventNpcs even though it is not needed,
|
||||
add when the new exd reader is implemented(also counts for BNPCs) */
|
||||
void Core::Entity::EventNpc::spawn( PlayerPtr pTarget )
|
||||
{
|
||||
ZoneChannelPacket< FFXIVIpcNpcSpawn > spawnPacket( getId(), pTarget->getId() );
|
||||
|
@ -94,16 +94,12 @@ void Core::Entity::EventNpc::spawn( PlayerPtr pTarget )
|
|||
}
|
||||
|
||||
// despawn
|
||||
void Core::Entity::EventNpc::despawn( ActorPtr pTarget )
|
||||
void Core::Entity::EventNpc::despawn( PlayerPtr pTarget )
|
||||
{
|
||||
|
||||
auto pPlayer = pTarget->getAsPlayer();
|
||||
|
||||
pPlayer->freePlayerSpawnId( getId() );
|
||||
pTarget->freePlayerSpawnId( getId() );
|
||||
|
||||
ActorControlPacket143 controlPacket( m_id, DespawnZoneScreenMsg, 0x04, getId(), 0x01 );
|
||||
pPlayer->queuePacket( controlPacket );
|
||||
|
||||
pTarget->queuePacket( controlPacket );
|
||||
}
|
||||
|
||||
uint8_t Core::Entity::EventNpc::getLevel() const
|
||||
|
|
|
@ -11,7 +11,7 @@ class EventNpc : public Actor
|
|||
{
|
||||
public:
|
||||
EventNpc();
|
||||
~EventNpc();
|
||||
virtual ~EventNpc() override;
|
||||
|
||||
EventNpc( uint32_t enpcId, const Common::FFXIVARR_POSITION3& spawnPos, float rotation );
|
||||
|
||||
|
@ -19,7 +19,7 @@ public:
|
|||
void spawn( PlayerPtr pTarget ) override;
|
||||
|
||||
// send despawn packets to pTarget
|
||||
void despawn( ActorPtr pTarget ) override;
|
||||
void despawn( PlayerPtr pTarget ) override;
|
||||
|
||||
uint8_t getLevel() const override;
|
||||
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
#include "GameObject.h"
|
||||
|
||||
#include "Player.h"
|
||||
#include "Actor.h"
|
||||
#include "BattleNpc.h"
|
||||
#include "EventNpc.h"
|
||||
|
||||
Core::Entity::GameObject::GameObject( ObjKind type ) :
|
||||
m_objKind( type )
|
||||
{
|
||||
|
@ -48,12 +53,42 @@ bool Core::Entity::GameObject::isPlayer() const
|
|||
return m_objKind == ObjKind::Player;
|
||||
}
|
||||
|
||||
bool Core::Entity::GameObject::isBNpc() const
|
||||
bool Core::Entity::GameObject::isBattleNpc() const
|
||||
{
|
||||
return m_objKind == ObjKind::BattleNpc;
|
||||
}
|
||||
|
||||
bool Core::Entity::GameObject::isENpc() const
|
||||
bool Core::Entity::GameObject::isEventNpc() const
|
||||
{
|
||||
return m_objKind == ObjKind::EventNpc;
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as ActorPtr */
|
||||
Core::Entity::ActorPtr Core::Entity::GameObject::getAsActor()
|
||||
{
|
||||
return boost::dynamic_pointer_cast< Entity::Actor, Entity::GameObject >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as PlayerPtr */
|
||||
Core::Entity::PlayerPtr Core::Entity::GameObject::getAsPlayer()
|
||||
{
|
||||
if( !isPlayer() )
|
||||
return nullptr;
|
||||
return boost::dynamic_pointer_cast< Entity::Player, Entity::GameObject >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as BattleNpcPtr */
|
||||
Core::Entity::BattleNpcPtr Core::Entity::GameObject::getAsBattleNpc()
|
||||
{
|
||||
if( !isBattleNpc() )
|
||||
return nullptr;
|
||||
return boost::dynamic_pointer_cast< Entity::BattleNpc, Entity::GameObject >( shared_from_this() );
|
||||
}
|
||||
|
||||
/*! \return pointer to this instance as EventNpcPtr */
|
||||
Core::Entity::EventNpcPtr Core::Entity::GameObject::getAsEventNpc()
|
||||
{
|
||||
if( !isEventNpc() )
|
||||
return nullptr;
|
||||
return boost::dynamic_pointer_cast< Entity::EventNpc, Entity::GameObject >( shared_from_this() );
|
||||
}
|
||||
|
|
|
@ -10,69 +10,70 @@
|
|||
#include <queue>
|
||||
|
||||
namespace Core {
|
||||
namespace Entity {
|
||||
namespace Entity {
|
||||
|
||||
/*!
|
||||
\class GameObject
|
||||
\brief Base class for all actor/objects
|
||||
|
||||
*/
|
||||
class GameObject : public boost::enable_shared_from_this< GameObject >
|
||||
class GameObject : public boost::enable_shared_from_this< GameObject >
|
||||
{
|
||||
public:
|
||||
enum ObjKind : uint8_t
|
||||
{
|
||||
public:
|
||||
enum ObjKind : uint8_t
|
||||
{
|
||||
None = 0x00,
|
||||
Player = 0x01,
|
||||
BattleNpc = 0x02,
|
||||
EventNpc = 0x03,
|
||||
Treasure = 0x04,
|
||||
Aetheryte = 0x05,
|
||||
GatheringPoint = 0x06,
|
||||
EventObj = 0x07,
|
||||
Mount = 0x08,
|
||||
Companion = 0x09,
|
||||
Retainer = 0x0A,
|
||||
Area = 0x0B,
|
||||
Housing = 0x0C,
|
||||
Cutscene = 0x0D,
|
||||
CardStand = 0x0E,
|
||||
};
|
||||
|
||||
protected:
|
||||
/*! Position of the object */
|
||||
Common::FFXIVARR_POSITION3 m_pos;
|
||||
/*! Rotation of the object */
|
||||
float m_rot;
|
||||
/*! Id of the actor */
|
||||
uint32_t m_id;
|
||||
/*! Type of the actor */
|
||||
ObjKind m_objKind;
|
||||
|
||||
public:
|
||||
explicit GameObject( ObjKind type );
|
||||
//virtual ~GameObject() {};
|
||||
|
||||
uint32_t getId() const;
|
||||
|
||||
ObjKind getObjKind() const;
|
||||
|
||||
Common::FFXIVARR_POSITION3& getPos();
|
||||
void setPos( const Common::FFXIVARR_POSITION3& pos );
|
||||
void setPos( float x, float y, float z );
|
||||
|
||||
float getRot() const;
|
||||
void setRot( float rot );
|
||||
|
||||
bool isPlayer() const;
|
||||
bool isBNpc() const;
|
||||
bool isENpc() const;
|
||||
|
||||
PlayerPtr getAsPlayer();
|
||||
BattleNpcPtr getAsBNpc();
|
||||
EventNpcPtr getAsENpc();
|
||||
None = 0x00,
|
||||
Player = 0x01,
|
||||
BattleNpc = 0x02,
|
||||
EventNpc = 0x03,
|
||||
Treasure = 0x04,
|
||||
Aetheryte = 0x05,
|
||||
GatheringPoint = 0x06,
|
||||
EventObj = 0x07,
|
||||
Mount = 0x08,
|
||||
Companion = 0x09,
|
||||
Retainer = 0x0A,
|
||||
Area = 0x0B,
|
||||
Housing = 0x0C,
|
||||
Cutscene = 0x0D,
|
||||
CardStand = 0x0E,
|
||||
};
|
||||
|
||||
}
|
||||
protected:
|
||||
/*! Position of the object */
|
||||
Common::FFXIVARR_POSITION3 m_pos;
|
||||
/*! Rotation of the object */
|
||||
float m_rot;
|
||||
/*! Id of the actor */
|
||||
uint32_t m_id;
|
||||
/*! Type of the actor */
|
||||
ObjKind m_objKind;
|
||||
|
||||
public:
|
||||
explicit GameObject( ObjKind type );
|
||||
virtual ~GameObject() {};
|
||||
|
||||
uint32_t getId() const;
|
||||
|
||||
ObjKind getObjKind() const;
|
||||
|
||||
Common::FFXIVARR_POSITION3& getPos();
|
||||
void setPos( const Common::FFXIVARR_POSITION3& pos );
|
||||
void setPos( float x, float y, float z );
|
||||
|
||||
float getRot() const;
|
||||
void setRot( float rot );
|
||||
|
||||
bool isPlayer() const;
|
||||
bool isBattleNpc() const;
|
||||
bool isEventNpc() const;
|
||||
|
||||
ActorPtr getAsActor();
|
||||
PlayerPtr getAsPlayer();
|
||||
BattleNpcPtr getAsBattleNpc();
|
||||
EventNpcPtr getAsEventNpc();
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -53,7 +53,7 @@ using namespace Core::Network::Packets::Server;
|
|||
|
||||
// player constructor
|
||||
Core::Entity::Player::Player() :
|
||||
Actor(),
|
||||
Actor( ObjKind::Player ),
|
||||
m_lastWrite( 0 ),
|
||||
m_lastPing( 0 ),
|
||||
m_bIsLogin( false ),
|
||||
|
@ -74,7 +74,6 @@ Core::Entity::Player::Player() :
|
|||
m_directorInitialized( false )
|
||||
{
|
||||
m_id = 0;
|
||||
m_objKind = ObjKind::Player;
|
||||
m_currentStance = Stance::Passive;
|
||||
m_onlineStatus = 0;
|
||||
m_queuedZoneing = nullptr;
|
||||
|
@ -660,29 +659,7 @@ void Core::Entity::Player::unlock()
|
|||
|
||||
void Core::Entity::Player::sendStatusUpdate( bool toSelf )
|
||||
{
|
||||
// CGamePacket* pPE = new CGamePacket(0x140, 0x0128, getId(), getId());
|
||||
|
||||
//pPE->setInt8At(0x20, static_cast<uint8_t>(getClass()));
|
||||
|
||||
// pPE->setInt8At(0x21, getLevel());
|
||||
// pPE->setInt8At(0x22, getLevel());
|
||||
|
||||
// // current exp
|
||||
// pPE->setInt32At(0x28, getExp());
|
||||
|
||||
// // rested exp
|
||||
// //pPE->setInt32At(0x2C, m_hp);
|
||||
|
||||
// pPE->setInt32At(0x24, m_hp);
|
||||
// pPE->setInt32At(0x28, getMaxHp());
|
||||
// pPE->setInt16At(0x2C, m_mp);
|
||||
// pPE->setInt16At(0x2E, getMaxMp());
|
||||
// pPE->setInt16At(0x30, m_tp);
|
||||
|
||||
// sendToInRangeSet(pPE, toSelf);
|
||||
|
||||
sendToInRangeSet( UpdateHpMpTpPacket( shared_from_this() ), true );
|
||||
|
||||
sendToInRangeSet( UpdateHpMpTpPacket( *this ), true );
|
||||
}
|
||||
|
||||
uint8_t Core::Entity::Player::getLevel() const
|
||||
|
@ -834,9 +811,9 @@ void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget )
|
|||
}
|
||||
|
||||
// despawn
|
||||
void Core::Entity::Player::despawn( Entity::ActorPtr pTarget )
|
||||
void Core::Entity::Player::despawn( Entity::PlayerPtr pTarget )
|
||||
{
|
||||
auto pPlayer = pTarget->getAsPlayer();
|
||||
auto pPlayer = pTarget;
|
||||
|
||||
pPlayer->freePlayerSpawnId( getId() );
|
||||
|
||||
|
@ -1444,7 +1421,7 @@ void Core::Entity::Player::autoAttack( ActorPtr pTarget )
|
|||
auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0,
|
||||
Inventory::EquipSlot::MainHand );
|
||||
|
||||
pTarget->onActionHostile( shared_from_this() );
|
||||
pTarget->onActionHostile( *this );
|
||||
//uint64_t tick = Util::getTimeMs();
|
||||
//srand(static_cast< uint32_t >(tick));
|
||||
|
||||
|
@ -1634,7 +1611,7 @@ void Player::sendZonePackets()
|
|||
if( getLastPing() == 0 )
|
||||
sendQuestInfo();
|
||||
|
||||
getCurrentZone()->onEnterTerritory( getAsPlayer() );
|
||||
getCurrentZone()->onEnterTerritory( *this );
|
||||
|
||||
m_bMarkedForZoning = false;
|
||||
}
|
||||
|
|
|
@ -421,7 +421,7 @@ public:
|
|||
/*! send spawn packets to pTarget */
|
||||
void spawn( PlayerPtr pTarget ) override;
|
||||
/*! send despawn packets to pTarget */
|
||||
void despawn( ActorPtr pTarget ) override;
|
||||
void despawn( PlayerPtr pTarget ) override;
|
||||
|
||||
// Player State Handling
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -80,7 +80,7 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId,
|
|||
uint32_t eventParam2 )
|
||||
{
|
||||
|
||||
Event::EventHandlerPtr newEvent( new Event::EventHandler( this, actorId, eventId, eventType, eventParam2 ) );
|
||||
auto newEvent = Event::make_EventHandler( this, actorId, eventId, eventType, eventParam2 );
|
||||
|
||||
addEvent( newEvent );
|
||||
|
||||
|
@ -227,8 +227,8 @@ void Core::Entity::Player::eventActionStart( uint32_t eventId,
|
|||
ActionCallback interruptCallback,
|
||||
uint64_t additional )
|
||||
{
|
||||
Action::ActionPtr pEventAction( new Action::EventAction( shared_from_this(), eventId, action,
|
||||
finishCallback, interruptCallback, additional ) );
|
||||
auto pEventAction = Action::make_EventAction( getAsActor(), eventId, action,
|
||||
finishCallback, interruptCallback, additional );
|
||||
|
||||
setCurrentAction( pEventAction );
|
||||
auto pEvent = getEvent( eventId );
|
||||
|
@ -257,8 +257,8 @@ void Core::Entity::Player::eventItemActionStart( uint32_t eventId,
|
|||
ActionCallback interruptCallback,
|
||||
uint64_t additional )
|
||||
{
|
||||
Action::ActionPtr pEventItemAction( new Action::EventItemAction( shared_from_this(), eventId, action,
|
||||
finishCallback, interruptCallback, additional ) );
|
||||
Action::ActionPtr pEventItemAction = Action::make_EventItemAction( getAsActor(), eventId, action,
|
||||
finishCallback, interruptCallback, additional );
|
||||
|
||||
setCurrentAction( pEventItemAction );
|
||||
|
||||
|
|
|
@ -202,11 +202,10 @@ bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession )
|
|||
m_modelSubWeapon = 0;
|
||||
m_lastTickTime = 0;
|
||||
|
||||
auto pPlayer = getAsPlayer();
|
||||
// TODO: remove Inventory and actually inline it in Player class
|
||||
m_pInventory = InventoryPtr( new Inventory( pPlayer.get() ) );
|
||||
m_pInventory = make_Inventory( this );
|
||||
|
||||
pPlayer->calculateStats();
|
||||
calculateStats();
|
||||
|
||||
// first login, run the script event
|
||||
if( m_bNewGame )
|
||||
|
|
|
@ -345,7 +345,7 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost:
|
|||
|
||||
sscanf( params.c_str(), "%d %d %hu", &id, &duration, ¶m );
|
||||
|
||||
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, player.getAsPlayer(), player.getAsPlayer(), duration, 3000 ) );
|
||||
auto effect = StatusEffect::make_StatusEffect( id, player.getAsPlayer(), player.getAsPlayer(), duration, 3000 );
|
||||
effect->setParam( param );
|
||||
|
||||
player.addStatusEffect( effect );
|
||||
|
@ -364,7 +364,7 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost:
|
|||
|
||||
sscanf( params.c_str(), "%d %d", &model, &name );
|
||||
|
||||
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( model, name, player.getPos() ) );
|
||||
auto pBNpc = Entity::make_BattleNpc( model, name, player.getPos() );
|
||||
|
||||
auto pZone = player.getCurrentZone();
|
||||
pBNpc->setCurrentZone( pZone );
|
||||
|
@ -376,7 +376,7 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost:
|
|||
// temporary research packet
|
||||
int32_t opcode;
|
||||
sscanf( params.c_str(), "%x", &opcode );
|
||||
Network::Packets::GamePacketPtr pPe( new Network::Packets::GamePacket( opcode, 0x30, player.getId(), player.getId() ) );
|
||||
auto pPe = Network::Packets::make_GamePacket( opcode, 0x30, player.getId(), player.getId() );
|
||||
player.queuePacket( pPe );
|
||||
}
|
||||
else if( subCommand == "eventnpc-self" )
|
||||
|
@ -400,7 +400,7 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost:
|
|||
|
||||
sscanf( params.c_str(), "%d", &id );
|
||||
|
||||
Entity::EventNpcPtr pENpc( new Entity::EventNpc( id, player.getPos(), player.getRotation() ) );
|
||||
auto pENpc = Entity::make_EventNpc( id, player.getPos(), player.getRotation() );
|
||||
|
||||
auto pZone = player.getCurrentZone();
|
||||
pENpc->setCurrentZone( pZone );
|
||||
|
|
|
@ -39,24 +39,24 @@ uint8_t Core::Event::Director::getSequence() const
|
|||
return m_sequence;
|
||||
}
|
||||
|
||||
void Core::Event::Director::sendDirectorClear( Core::Entity::PlayerPtr pPlayer ) const
|
||||
void Core::Event::Director::sendDirectorClear( Core::Entity::Player& player ) const
|
||||
{
|
||||
pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorClear, m_directorId ) );
|
||||
player.queuePacket( ActorControlPacket143( player.getId(), DirectorClear, m_directorId ) );
|
||||
}
|
||||
|
||||
void Core::Event::Director::sendDirectorVars( Core::Entity::PlayerPtr pPlayer ) const
|
||||
void Core::Event::Director::sendDirectorVars( Core::Entity::Player& player ) const
|
||||
{
|
||||
ZoneChannelPacket< FFXIVIpcDirectorVars > varPacket( pPlayer->getId() );
|
||||
ZoneChannelPacket< FFXIVIpcDirectorVars > varPacket( player.getId() );
|
||||
varPacket.data().m_directorId = getDirectorId();
|
||||
varPacket.data().m_sequence = getSequence();
|
||||
varPacket.data().m_branch = 0;
|
||||
memcpy( varPacket.data().m_unionData, m_unionData.arrData, sizeof( varPacket.data().m_unionData ) );
|
||||
pPlayer->queuePacket( varPacket );
|
||||
player.queuePacket( varPacket );
|
||||
}
|
||||
|
||||
void Core::Event::Director::sendDirectorInit( Core::Entity::PlayerPtr pPlayer ) const
|
||||
void Core::Event::Director::sendDirectorInit( Core::Entity::Player& player ) const
|
||||
{
|
||||
pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), DirectorInit, m_directorId, m_contentId ) );
|
||||
player.queuePacket( ActorControlPacket143( player.getId(), DirectorInit, m_directorId, m_contentId ) );
|
||||
}
|
||||
|
||||
Core::Event::Director::DirectorType Core::Event::Director::getType() const
|
||||
|
|
|
@ -38,9 +38,9 @@ public:
|
|||
uint8_t getSequence() const;
|
||||
uint8_t getBranch() const;
|
||||
|
||||
void sendDirectorInit( Entity::PlayerPtr pPlayer ) const;
|
||||
void sendDirectorClear( Entity::PlayerPtr pPlayer ) const;
|
||||
void sendDirectorVars( Entity::PlayerPtr pPlayer ) const;
|
||||
void sendDirectorInit( Entity::Player& player ) const;
|
||||
void sendDirectorClear( Entity::Player& player ) const;
|
||||
void sendDirectorVars( Entity::Player& player ) const;
|
||||
|
||||
void setDirectorUI8AL( uint8_t value );
|
||||
void setDirectorUI8AH( uint8_t value );
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
#ifndef _FORWARDS_H
|
||||
#define _FORWARDS_H
|
||||
|
||||
#include <utility>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <vector>
|
||||
|
||||
#define TYPE_FORWARD( x ) \
|
||||
class x; \
|
||||
typedef boost::shared_ptr< x > x ## Ptr; \
|
||||
template< typename...Args > \
|
||||
x ## Ptr make_ ## x( Args &&...args ) { \
|
||||
return boost::make_shared< x >( std::forward< Args >( args ) ... ); }\
|
||||
typedef std::vector< x > x ## PtrList;
|
||||
|
||||
namespace Core
|
||||
|
@ -29,6 +34,7 @@ namespace Core
|
|||
|
||||
namespace Entity
|
||||
{
|
||||
TYPE_FORWARD( GameObject );
|
||||
TYPE_FORWARD( Actor );
|
||||
TYPE_FORWARD( Player );
|
||||
TYPE_FORWARD( BattleNpc );
|
||||
|
@ -50,6 +56,7 @@ namespace Core
|
|||
TYPE_FORWARD( ActionCast );
|
||||
TYPE_FORWARD( ActionMount );
|
||||
TYPE_FORWARD( EventAction );
|
||||
TYPE_FORWARD( EventItemAction );
|
||||
}
|
||||
|
||||
namespace Network
|
||||
|
|
|
@ -36,7 +36,7 @@ Core::Inventory::Inventory( Core::Entity::Player* pOwner )
|
|||
// shortcut for setting up inventory
|
||||
// TODO: use a loop to set theese up?
|
||||
auto setupContainer = []( InventoryMap& map, InventoryType type )
|
||||
{ map[type] = ItemContainerPtr( new ItemContainer( type ) ); };
|
||||
{ map[type] = make_ItemContainer( type ); };
|
||||
|
||||
// main bags
|
||||
setupContainer( m_inventoryMap, Bag0 );
|
||||
|
|
|
@ -219,7 +219,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
|||
|
||||
if( !insufficientGil )
|
||||
{
|
||||
Action::ActionTeleportPtr pActionTeleport( new Action::ActionTeleport( player.getAsPlayer(), param11, cost ) );
|
||||
auto pActionTeleport = Action::make_ActionTeleport( player.getAsPlayer(), param11, cost );
|
||||
player.setCurrentAction( pActionTeleport );
|
||||
}
|
||||
}
|
||||
|
@ -231,7 +231,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
|||
}
|
||||
case 0x321: // Director init finish
|
||||
{
|
||||
player.getCurrentZone()->onInitDirector( player.getAsPlayer() );
|
||||
player.getCurrentZone()->onInitDirector( player );
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -404,7 +404,7 @@ void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPa
|
|||
void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePacket& inPacket,
|
||||
Entity::Player& player )
|
||||
{
|
||||
player.getCurrentZone()->onFinishLoading( player.getAsPlayer() );
|
||||
player.getCurrentZone()->onFinishLoading( player );
|
||||
|
||||
// player is done zoning
|
||||
player.setLoadingComplete( true );
|
||||
|
@ -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.getAsPlayer() );
|
||||
player.getCurrentZone()->changeActorPosition( player );
|
||||
}
|
||||
|
||||
void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket,
|
||||
|
|
|
@ -87,7 +87,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
|||
}
|
||||
else
|
||||
{
|
||||
Action::ActionCastPtr pActionCast( new Action::ActionCast( player.getAsPlayer(), targetActor, action ) );
|
||||
auto pActionCast = Action::make_ActionCast( player.getAsPlayer(), targetActor, action );
|
||||
player.setCurrentAction( pActionCast );
|
||||
player.sendDebug( "setCurrentAction()" );
|
||||
player.getCurrentAction()->onStart();
|
||||
|
@ -118,7 +118,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
|||
|
||||
player.sendDebug( "Request mount " + std::to_string( action ) );
|
||||
|
||||
Action::ActionMountPtr pActionMount( new Action::ActionMount( player.getAsPlayer(), action ) );
|
||||
auto pActionMount = Action::make_ActionMount( player.getAsPlayer(), action );
|
||||
player.setCurrentAction( pActionMount );
|
||||
player.sendDebug( "setCurrentAction()" );
|
||||
player.getCurrentAction()->onStart();
|
||||
|
|
|
@ -17,18 +17,18 @@ class UpdateHpMpTpPacket :
|
|||
public ZoneChannelPacket< FFXIVIpcUpdateHpMpTp >
|
||||
{
|
||||
public:
|
||||
UpdateHpMpTpPacket( Entity::ActorPtr pActor ) :
|
||||
ZoneChannelPacket< FFXIVIpcUpdateHpMpTp >( pActor->getId(), pActor->getId() )
|
||||
UpdateHpMpTpPacket( Entity::Actor& actor ) :
|
||||
ZoneChannelPacket< FFXIVIpcUpdateHpMpTp >( actor.getId(), actor.getId() )
|
||||
{
|
||||
initialize( pActor );
|
||||
initialize( actor );
|
||||
};
|
||||
|
||||
private:
|
||||
void initialize( Entity::ActorPtr pActor )
|
||||
void initialize( Entity::Actor& actor )
|
||||
{
|
||||
m_data.hp = pActor->getHp();
|
||||
m_data.mp = pActor->getMp();
|
||||
m_data.tp = pActor->getTp();
|
||||
m_data.hp = actor.getHp();
|
||||
m_data.mp = actor.getMp();
|
||||
m_data.tp = actor.getTp();
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ Core::Network::GameConnectionPtr Core::Session::getChatConnection() const
|
|||
bool Core::Session::loadPlayer()
|
||||
{
|
||||
|
||||
m_pPlayer = Entity::PlayerPtr( new Entity::Player() );
|
||||
m_pPlayer = Entity::make_Player();
|
||||
|
||||
if( !m_pPlayer->load( m_sessionId, shared_from_this() ) )
|
||||
{
|
||||
|
|
|
@ -51,32 +51,32 @@ Core::Data::ExdDataGenerated::InstanceContentPtr Core::InstanceContent::getInsta
|
|||
return m_instanceContentInfo;
|
||||
}
|
||||
|
||||
void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer )
|
||||
void Core::InstanceContent::onEnterTerritory( Entity::Player& player )
|
||||
{
|
||||
g_log.debug( "InstanceContent::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|"
|
||||
+ std::to_string( getInstanceContentId() ) +
|
||||
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
||||
+ ", Entity#" + std::to_string( player.getId() ) );
|
||||
|
||||
// mark player as "bound by duty"
|
||||
pPlayer->setStateFlag( PlayerStateFlag::BoundByDuty );
|
||||
player.setStateFlag( PlayerStateFlag::BoundByDuty );
|
||||
|
||||
// if the instance was not started yet, director init is sent on enter event.
|
||||
// else it will be sent on finish loading.
|
||||
if( m_state == Created )
|
||||
sendDirectorInit( pPlayer );
|
||||
sendDirectorInit( player );
|
||||
|
||||
}
|
||||
|
||||
void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer )
|
||||
void Core::InstanceContent::onLeaveTerritory( Entity::Player& player )
|
||||
{
|
||||
g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|"
|
||||
+ std::to_string( getInstanceContentId() ) +
|
||||
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
||||
sendDirectorClear( pPlayer );
|
||||
+ ", Entity#" + std::to_string( player.getId() ) );
|
||||
sendDirectorClear( player );
|
||||
|
||||
pPlayer->setDirectorInitialized( false );
|
||||
player.setDirectorInitialized( false );
|
||||
// remove "bound by duty" state
|
||||
pPlayer->unsetStateFlag( PlayerStateFlag::BoundByDuty );
|
||||
player.unsetStateFlag( PlayerStateFlag::BoundByDuty );
|
||||
}
|
||||
|
||||
void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||
|
@ -126,16 +126,16 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
|||
g_scriptMgr.onInstanceUpdate( *this, currTime );
|
||||
}
|
||||
|
||||
void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer )
|
||||
void Core::InstanceContent::onFinishLoading( Entity::Player& player )
|
||||
{
|
||||
if( m_state != Created )
|
||||
sendDirectorInit( pPlayer );
|
||||
sendDirectorInit( player );
|
||||
}
|
||||
|
||||
void Core::InstanceContent::onInitDirector( Entity::PlayerPtr pPlayer )
|
||||
void Core::InstanceContent::onInitDirector( Entity::Player& player )
|
||||
{
|
||||
sendDirectorVars( pPlayer );
|
||||
pPlayer->setDirectorInitialized( true );
|
||||
sendDirectorVars( player );
|
||||
player.setDirectorInitialized( true );
|
||||
}
|
||||
|
||||
void Core::InstanceContent::setVar( uint8_t index, uint8_t value )
|
||||
|
@ -210,7 +210,7 @@ void Core::InstanceContent::setVar( uint8_t index, uint8_t value )
|
|||
|
||||
for( const auto &playerIt : m_playerMap )
|
||||
{
|
||||
sendDirectorVars( playerIt.second );
|
||||
sendDirectorVars( *playerIt.second );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,10 +28,10 @@ public:
|
|||
uint32_t instanceContentId );
|
||||
virtual ~InstanceContent();
|
||||
|
||||
void onEnterTerritory( Entity::PlayerPtr pPlayer ) override;
|
||||
void onLeaveTerritory( Entity::PlayerPtr pPlayer ) override;
|
||||
void onFinishLoading( Entity::PlayerPtr pPlayer ) override;
|
||||
void onInitDirector( Entity::PlayerPtr pPlayer ) override;
|
||||
void onEnterTerritory( Entity::Player& player ) override;
|
||||
void onLeaveTerritory( Entity::Player& player ) override;
|
||||
void onFinishLoading( Entity::Player& player ) override;
|
||||
void onInitDirector( Entity::Player& player ) override;
|
||||
void onUpdate( uint32_t currTime ) override;
|
||||
|
||||
void setVar( uint8_t index, uint8_t value );
|
||||
|
|
|
@ -119,7 +119,7 @@ bool Core::TerritoryMgr::createDefaultTerritories()
|
|||
"\t" + pPlaceName->name +
|
||||
"\t" + ( isPrivateTerritory( territoryId ) ? "PRIVATE" : "PUBLIC" ) );
|
||||
|
||||
ZonePtr pZone( new Zone( territoryId, guid, territoryInfo->name, pPlaceName->name ) );
|
||||
auto pZone = make_Zone( territoryId, guid, territoryInfo->name, pPlaceName->name );
|
||||
pZone->init();
|
||||
|
||||
InstanceIdToZonePtrMap instanceMap;
|
||||
|
@ -149,7 +149,7 @@ Core::ZonePtr Core::TerritoryMgr::createTerritoryInstance( uint32_t territoryTyp
|
|||
|
||||
g_log.debug( "Starting instance for territory: " + std::to_string( territoryTypeId ) + " (" + pPlaceName->name + ")" );
|
||||
|
||||
ZonePtr pZone = ZonePtr( new Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name ) );
|
||||
auto pZone = make_Zone( territoryTypeId, getNextInstanceId(), pTeri->name, pPlaceName->name );
|
||||
pZone->init();
|
||||
|
||||
m_territoryInstanceMap[pZone->getTerritoryId()][pZone->getGuId()] = pZone;
|
||||
|
@ -175,8 +175,8 @@ Core::ZonePtr Core::TerritoryMgr::createInstanceContent( uint32_t instanceConten
|
|||
g_log.debug( "Starting instance for InstanceContent id: " + std::to_string( instanceContentId ) +
|
||||
" (" + pInstanceContent->name + ")" );
|
||||
|
||||
ZonePtr pZone = ZonePtr( new InstanceContent( pInstanceContent, getNextInstanceId(), pTeri->name,
|
||||
pInstanceContent->name, instanceContentId ) );
|
||||
auto pZone = make_InstanceContent( pInstanceContent, getNextInstanceId(),
|
||||
pTeri->name, pInstanceContent->name, instanceContentId );
|
||||
pZone->init();
|
||||
|
||||
m_instanceContentToInstanceMap[instanceContentId][pZone->getGuId()] = pZone;
|
||||
|
@ -233,7 +233,7 @@ void Core::TerritoryMgr::loadTerritoryPositionMap()
|
|||
float posO = pQR->getFloat( 6 );
|
||||
uint32_t radius = pQR->getUInt( 7 );
|
||||
|
||||
m_territoryPositionMap[id] = ZonePositionPtr( new ZonePosition( id, targetZoneId, pos, radius, posO ) );
|
||||
m_territoryPositionMap[id] = make_ZonePosition( id, targetZoneId, pos, radius, posO );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -199,8 +199,7 @@ void Zone::loadCellCache()
|
|||
uint32_t type = pQR->getUInt( 18 );
|
||||
|
||||
Common::FFXIVARR_POSITION3 pos{ posX, posY, posZ };
|
||||
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( modelId, nameId, pos,
|
||||
sizeId, type, level, behaviour, mobType ) );
|
||||
auto pBNpc = Entity::make_BattleNpc( modelId, nameId, pos, sizeId, type, level, behaviour, mobType );
|
||||
pBNpc->setRotation( static_cast< float >( rotation ) );
|
||||
cache.push_back( pBNpc );
|
||||
}
|
||||
|
@ -306,7 +305,7 @@ void Zone::pushActor( Entity::ActorPtr pActor )
|
|||
m_playerMap[pPlayer->getId()] = pPlayer;
|
||||
updateCellActivity( cx, cy, 2 );
|
||||
}
|
||||
else if( pActor->isBNpc() )
|
||||
else if( pActor->isBattleNpc() )
|
||||
{
|
||||
|
||||
Entity::BattleNpcPtr pBNpc = pActor->getAsBattleNpc();
|
||||
|
@ -346,10 +345,10 @@ void Zone::removeActor( Entity::ActorPtr pActor )
|
|||
}
|
||||
m_playerMap.erase( pActor->getId() );
|
||||
|
||||
onLeaveTerritory( pActor->getAsPlayer() );
|
||||
onLeaveTerritory( *pActor->getAsPlayer() );
|
||||
|
||||
}
|
||||
else if( pActor->isBNpc() )
|
||||
else if( pActor->isBattleNpc() )
|
||||
m_BattleNpcMap.erase( pActor->getId() );
|
||||
|
||||
// remove from lists of other actors
|
||||
|
@ -361,7 +360,7 @@ void Zone::removeActor( Entity::ActorPtr pActor )
|
|||
{
|
||||
pCurAct = *iter;
|
||||
auto iter2 = iter++;
|
||||
pCurAct->removeInRangeActor( pActor );
|
||||
pCurAct->removeInRangeActor( *pActor );
|
||||
}
|
||||
}
|
||||
pActor->clearInRangeSet();
|
||||
|
@ -620,18 +619,18 @@ void Zone::updateCellActivity( uint32_t x, uint32_t y, int32_t radius )
|
|||
}
|
||||
}
|
||||
|
||||
void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
||||
void Zone::changeActorPosition( Entity::Actor& actor )
|
||||
{
|
||||
|
||||
if( pActor->getCurrentZone() != shared_from_this() )
|
||||
if( actor.getCurrentZone() != shared_from_this() )
|
||||
return;
|
||||
|
||||
if( pActor->hasInRangeActor() )
|
||||
if( actor.hasInRangeActor() )
|
||||
{
|
||||
Entity::ActorPtr pCurAct;
|
||||
|
||||
float fRange = 70.0f;
|
||||
for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end();)
|
||||
for( auto iter = actor.m_inRangeActors.begin(); iter != actor.m_inRangeActors.end();)
|
||||
{
|
||||
pCurAct = *iter;
|
||||
auto iter2 = iter++;
|
||||
|
@ -639,18 +638,18 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
|||
float distance = Math::Util::distance( pCurAct->getPos().x,
|
||||
pCurAct->getPos().y,
|
||||
pCurAct->getPos().z,
|
||||
pActor->getPos().x,
|
||||
pActor->getPos().y,
|
||||
pActor->getPos().z );
|
||||
actor.getPos().x,
|
||||
actor.getPos().y,
|
||||
actor.getPos().z );
|
||||
|
||||
if( fRange > 0.0f && distance > fRange )
|
||||
{
|
||||
pCurAct->removeInRangeActor( pActor );
|
||||
pCurAct->removeInRangeActor( actor );
|
||||
|
||||
if( pActor->getCurrentZone() != shared_from_this() )
|
||||
if( actor.getCurrentZone() != shared_from_this() )
|
||||
return;
|
||||
|
||||
pActor->removeInRangeActor( *iter2 );
|
||||
actor.removeInRangeActor( **iter2 );
|
||||
|
||||
// @TODO FIXME!
|
||||
// this break is more or less a hack, iteration will break otherwise after removing
|
||||
|
@ -659,8 +658,8 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t cellX = getPosX( pActor->getPos().x );
|
||||
uint32_t cellY = getPosY( pActor->getPos().z );
|
||||
uint32_t cellX = getPosX( actor.getPos().x );
|
||||
uint32_t cellY = getPosY( actor.getPos().z );
|
||||
|
||||
if( cellX >= _sizeX || cellY >= _sizeY )
|
||||
{
|
||||
|
@ -668,7 +667,7 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
|||
}
|
||||
|
||||
Cell* pCell = getCell( cellX, cellY );
|
||||
Cell* pOldCell = pActor->m_pCell;
|
||||
Cell* pOldCell = actor.m_pCell;
|
||||
if( !pCell )
|
||||
{
|
||||
pCell = create( cellX, cellY );
|
||||
|
@ -680,15 +679,15 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
|||
{
|
||||
|
||||
if( pOldCell )
|
||||
pOldCell->removeActor( pActor );
|
||||
pOldCell->removeActor( actor.getAsActor() );
|
||||
|
||||
pCell->addActor( pActor );
|
||||
pActor->m_pCell = pCell;
|
||||
pCell->addActor( actor.getAsActor() );
|
||||
actor.m_pCell = pCell;
|
||||
|
||||
// if player we need to update cell activity
|
||||
// radius = 2 is used in order to update both
|
||||
// old and new cells
|
||||
if( pActor->isPlayer() )
|
||||
if( actor.isPlayer() )
|
||||
{
|
||||
updateCellActivity( cellX, cellY, 2 );
|
||||
if( pOldCell != nullptr )
|
||||
|
@ -714,7 +713,7 @@ void Zone::changeActorPosition( Entity::ActorPtr pActor )
|
|||
{
|
||||
pCell = getCell( posX, posY );
|
||||
if( pCell )
|
||||
updateInRangeSet( pActor, pCell );
|
||||
updateInRangeSet( actor.getAsActor(), pCell );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -785,7 +784,7 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell )
|
|||
}
|
||||
|
||||
}
|
||||
else if( ( pActor->isBNpc() || pActor->isEventNpc() ) && pCurAct->isPlayer() && pActor->isAlive() )
|
||||
else if( ( pActor->isBattleNpc() || pActor->isEventNpc() ) && pCurAct->isPlayer() && pActor->isAlive() )
|
||||
{
|
||||
auto pPlayer = pCurAct->getAsPlayer();
|
||||
if( pPlayer->isLoadingComplete() )
|
||||
|
@ -804,16 +803,16 @@ void Zone::updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell )
|
|||
}
|
||||
}
|
||||
|
||||
void Zone::onEnterTerritory( Entity::PlayerPtr pPlayer )
|
||||
void Zone::onEnterTerritory( Entity::Player& player )
|
||||
{
|
||||
g_log.debug( "Zone::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) +
|
||||
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
||||
+ ", Entity#" + std::to_string( player.getId() ) );
|
||||
}
|
||||
|
||||
void Zone::onLeaveTerritory( Entity::PlayerPtr pPlayer )
|
||||
void Zone::onLeaveTerritory( Entity::Player& player )
|
||||
{
|
||||
g_log.debug( "Zone::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|" + std::to_string( getTerritoryId() ) +
|
||||
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
||||
+ ", Entity#" + std::to_string( player.getId() ) );
|
||||
}
|
||||
|
||||
void Zone::onUpdate( uint32_t currTime )
|
||||
|
@ -821,12 +820,12 @@ void Zone::onUpdate( uint32_t currTime )
|
|||
|
||||
}
|
||||
|
||||
void Zone::onFinishLoading( Entity::PlayerPtr pPlayer )
|
||||
void Zone::onFinishLoading( Entity::Player& player )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Zone::onInitDirector( Entity::PlayerPtr pPlayer )
|
||||
void Zone::onInitDirector( Entity::Player& player )
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -74,10 +74,10 @@ public:
|
|||
|
||||
virtual void loadCellCache();
|
||||
virtual uint32_t getTerritoryId() const;
|
||||
virtual void onEnterTerritory( Entity::PlayerPtr pPlayer );
|
||||
virtual void onFinishLoading( Entity::PlayerPtr pPlayer );
|
||||
virtual void onInitDirector( Entity::PlayerPtr pPlayer );
|
||||
virtual void onLeaveTerritory( Entity::PlayerPtr pPlayer );
|
||||
virtual void onEnterTerritory( Entity::Player& player );
|
||||
virtual void onFinishLoading( Entity::Player& player );
|
||||
virtual void onInitDirector( Entity::Player& player );
|
||||
virtual void onLeaveTerritory( Entity::Player& player );
|
||||
virtual void onUpdate( uint32_t currTime );
|
||||
|
||||
uint8_t getNextWeather();
|
||||
|
@ -86,7 +86,7 @@ public:
|
|||
|
||||
void removeActor( Entity::ActorPtr pActor );
|
||||
|
||||
void changeActorPosition( Entity::ActorPtr pActor );
|
||||
void changeActorPosition( Entity::Actor& pActor );
|
||||
|
||||
bool isCellActive( uint32_t x, uint32_t y );
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue