diff --git a/src/servers/sapphire_lobby/Forwards.h b/src/servers/sapphire_lobby/Forwards.h index 94cebd2c..d4b91cce 100644 --- a/src/servers/sapphire_lobby/Forwards.h +++ b/src/servers/sapphire_lobby/Forwards.h @@ -7,7 +7,10 @@ #define TYPE_FORWARD( x ) \ class x; \ typedef boost::shared_ptr< x > x ## Ptr; \ -typedef std::vector< x > x ## PtrList; +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 { diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index 8d9a52a3..6b3b6705 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -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( "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( "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 ) diff --git a/src/servers/sapphire_zone/Action/ActionCollision.cpp b/src/servers/sapphire_zone/Action/ActionCollision.cpp index 322e0da2..a66d234c 100644 --- a/src/servers/sapphire_zone/Action/ActionCollision.cpp +++ b/src/servers/sapphire_zone/Action/ActionCollision.cpp @@ -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 ) ) diff --git a/src/servers/sapphire_zone/Action/ActionCollision.h b/src/servers/sapphire_zone/Action/ActionCollision.h index ba2deb1e..0c0da597 100644 --- a/src/servers/sapphire_zone/Action/ActionCollision.h +++ b/src/servers/sapphire_zone/Action/ActionCollision.h @@ -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, diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index a87e9c9b..afc655ce 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -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 ); diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index d6dada1f..90e22d93 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -5,6 +5,7 @@ #include #include "Forwards.h" +#include "GameObject.h" #include #include #include @@ -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() {}; @@ -294,10 +254,6 @@ public: virtual void heal( uint32_t amount ); virtual bool checkAction(); virtual void update( int64_t currTime ) {}; - - PlayerPtr getAsPlayer(); - BattleNpcPtr getAsBattleNpc(); - EventNpcPtr getAsEventNpc(); Action::ActionPtr getCurrentAction() const; @@ -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; diff --git a/src/servers/sapphire_zone/Actor/BattleNpc.cpp b/src/servers/sapphire_zone/Actor/BattleNpc.cpp index 81732922..beb86fcc 100644 --- a/src/servers/sapphire_zone/Actor/BattleNpc.cpp +++ b/src/servers/sapphire_zone/Actor/BattleNpc.cpp @@ -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(); } diff --git a/src/servers/sapphire_zone/Actor/BattleNpc.h b/src/servers/sapphire_zone/Actor/BattleNpc.h index 6bc0b93e..b80e6340 100644 --- a/src/servers/sapphire_zone/Actor/BattleNpc.h +++ b/src/servers/sapphire_zone/Actor/BattleNpc.h @@ -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; diff --git a/src/servers/sapphire_zone/Actor/EventNpc.cpp b/src/servers/sapphire_zone/Actor/EventNpc.cpp index bb01d069..af3eb0a3 100644 --- a/src/servers/sapphire_zone/Actor/EventNpc.cpp +++ b/src/servers/sapphire_zone/Actor/EventNpc.cpp @@ -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 diff --git a/src/servers/sapphire_zone/Actor/EventNpc.h b/src/servers/sapphire_zone/Actor/EventNpc.h index fa994bbe..726eae94 100644 --- a/src/servers/sapphire_zone/Actor/EventNpc.h +++ b/src/servers/sapphire_zone/Actor/EventNpc.h @@ -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; diff --git a/src/servers/sapphire_zone/Actor/GameObject.cpp b/src/servers/sapphire_zone/Actor/GameObject.cpp index d3fda65e..16c042ab 100644 --- a/src/servers/sapphire_zone/Actor/GameObject.cpp +++ b/src/servers/sapphire_zone/Actor/GameObject.cpp @@ -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; -} \ No newline at end of file +} + +/*! \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() ); +} diff --git a/src/servers/sapphire_zone/Actor/GameObject.h b/src/servers/sapphire_zone/Actor/GameObject.h index 89cb020a..ecfdc8a5 100644 --- a/src/servers/sapphire_zone/Actor/GameObject.h +++ b/src/servers/sapphire_zone/Actor/GameObject.h @@ -10,69 +10,70 @@ #include 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 diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 058623f0..a1922dda 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -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(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; } diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 5f917994..712aa1c2 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -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 ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 2e08bdb4..7189b106 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -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 ); diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 22e13f54..737bf17d 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -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 ) diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 76de7471..1ce0dd17 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -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 ); diff --git a/src/servers/sapphire_zone/Event/Director.cpp b/src/servers/sapphire_zone/Event/Director.cpp index fb9444ac..a201a5ab 100644 --- a/src/servers/sapphire_zone/Event/Director.cpp +++ b/src/servers/sapphire_zone/Event/Director.cpp @@ -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 diff --git a/src/servers/sapphire_zone/Event/Director.h b/src/servers/sapphire_zone/Event/Director.h index 74a7a84f..f5840390 100644 --- a/src/servers/sapphire_zone/Event/Director.h +++ b/src/servers/sapphire_zone/Event/Director.h @@ -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 ); diff --git a/src/servers/sapphire_zone/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 936a458d..fa387adb 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -1,12 +1,17 @@ #ifndef _FORWARDS_H #define _FORWARDS_H +#include #include +#include #include #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 diff --git a/src/servers/sapphire_zone/Inventory/Inventory.cpp b/src/servers/sapphire_zone/Inventory/Inventory.cpp index 7ace94d7..0523eb23 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.cpp +++ b/src/servers/sapphire_zone/Inventory/Inventory.cpp @@ -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 ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index 7bbfa403..10e7520f 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -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: diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 7cd1de23..5a52c909 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -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, diff --git a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp index 1240bf8c..9d0021e8 100644 --- a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp @@ -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(); diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/UpdateHpMpTpPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/UpdateHpMpTpPacket.h index dc3d2096..e880a4da 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/UpdateHpMpTpPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/UpdateHpMpTpPacket.h @@ -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(); }; }; diff --git a/src/servers/sapphire_zone/Session.cpp b/src/servers/sapphire_zone/Session.cpp index 92d19d94..0d8096e0 100644 --- a/src/servers/sapphire_zone/Session.cpp +++ b/src/servers/sapphire_zone/Session.cpp @@ -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() ) ) { diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 7f5a5906..766f391a 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -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 ); } } diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.h b/src/servers/sapphire_zone/Zone/InstanceContent.h index ed0df739..72b7b958 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.h +++ b/src/servers/sapphire_zone/Zone/InstanceContent.h @@ -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 ); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 9c85b02f..203d72c9 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -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 ); } } diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 7e67c7ca..11a5f2ac 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -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 ) { } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 1310a5bc..68f11ee0 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -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 );