diff --git a/src/servers/sapphire_zone/Zone/Cell.cpp b/src/servers/sapphire_zone/Zone/Cell.cpp index 6259da07..899fdc4c 100644 --- a/src/servers/sapphire_zone/Zone/Cell.cpp +++ b/src/servers/sapphire_zone/Zone/Cell.cpp @@ -3,6 +3,10 @@ #include "Actor/Chara.h" #include "Forwards.h" #include "Zone.h" +#include + +#include "Framework.h" +extern Core::Framework g_fw; // TODO: the entire zone / areahandling is a bit outdated ( in parts i used this for the 1.0 iteration ) // likely this could be greatly improved or redone @@ -32,6 +36,8 @@ void Core::Cell::init( uint32_t x, uint32_t y, ZonePtr pZone ) void Core::Cell::addActor( Entity::ActorPtr pAct ) { + auto pLog = g_fw.get< Core::Logger >(); + pLog->debug( "Adding actor to cell in " + this->m_pZone->getName() ); if( pAct->isPlayer() ) ++m_playerCount; @@ -40,6 +46,8 @@ void Core::Cell::addActor( Entity::ActorPtr pAct ) void Core::Cell::removeActor( Entity::ActorPtr pAct ) { + auto pLog = g_fw.get< Core::Logger >(); + pLog->debug( "Removing actor from cell in " + this->m_pZone->getName() ); if( pAct->isPlayer() ) --m_playerCount; diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 84d5d99a..500f2d93 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -314,6 +314,7 @@ Core::TerritoryMgr::InstanceIdList Core::TerritoryMgr::getInstanceContentIdList( bool Core::TerritoryMgr::movePlayer( uint32_t territoryId, Core::Entity::PlayerPtr pPlayer ) { auto pZone = getZoneByTerriId( territoryId ); + assert( pZone ); return movePlayer( pZone, pPlayer ); } @@ -333,8 +334,8 @@ bool Core::TerritoryMgr::movePlayer( ZonePtr pZone, Core::Entity::PlayerPtr pPla // mark character as zoning in progress pPlayer->setLoadingComplete( false ); - if( pPlayer->getLastPing() != 0 ) - pPlayer->getCurrentZone()->removeActor( pPlayer ); + //if( pPlayer->getLastPing() != 0 ) + // pPlayer->getCurrentZone()->removeActor( pPlayer ); pPlayer->setCurrentZone( pZone ); pZone->pushActor( pPlayer ); diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index ad76612c..ba5d5869 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -225,15 +225,14 @@ void Core::Zone::pushActor( Entity::ActorPtr pActor ) void Core::Zone::removeActor( Entity::ActorPtr pActor ) { + float mx = pActor->getPos().x; + float my = pActor->getPos().z; + uint32_t cx = getPosX( mx ); + uint32_t cy = getPosY( my ); - /* TODO: have to wait and see if removal of this actually breaks anything - this however is potentially removing a player from a zone he does not belong to */ - //auto pCell = pActor->getCellPtr(); - //if( pCell ) - //{ - // pCell->removeActor( pActor ); - // pCell = nullptr; - //} + Cell* pCell = getCellPtr(cx, cy); + if( pCell && pCell->hasActor( pActor ) ) + pCell->removeActor( pActor ); if( pActor->isPlayer() ) { @@ -418,8 +417,7 @@ void Core::Zone::updateSessions( bool changedWeather ) // this session is not linked to this area anymore, remove it from zone session list if( ( !pPlayer->getCurrentZone() ) || ( pPlayer->getCurrentZone() != shared_from_this() ) ) { - if( pPlayer->getCellPtr() ) - removeActor( pSession->getPlayer() ); + removeActor( pSession->getPlayer() ); it = m_sessionSet.erase(it ); continue; @@ -543,7 +541,7 @@ void Core::Zone::updateActorPosition( Entity::Actor &actor ) if( pOldCell ) { auto pLog = g_fw.get< Logger >(); - pLog->debug( std::string( __FUNCTION__ ) + "removeActor" ); + pLog->debug( std::string( __FUNCTION__ ) + " -> removeActor() ...moving cell..." ); pOldCell->removeActor( actor.shared_from_this() ); }