From 979059401673b0b83ce6b83a641b89fe4d1352ea Mon Sep 17 00:00:00 2001 From: goaaats Date: Thu, 8 Feb 2018 15:05:29 +0100 Subject: [PATCH] Implement correct handling for private areas --- src/servers/sapphire_zone/Actor/Actor.cpp | 5 +++++ src/servers/sapphire_zone/Actor/Player.cpp | 3 +++ .../sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h | 2 -- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 3 ++- src/servers/sapphire_zone/Zone/Zone.cpp | 4 ++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 657f7947..227657cf 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -22,9 +22,11 @@ #include "Math/CalcBattle.h" #include "Actor.h" #include "Player.h" +#include "Zone/TerritoryMgr.h" extern Core::ServerZone g_serverZone; extern Core::Data::ExdDataGenerated g_exdDataGen; +extern Core::TerritoryMgr g_territoryMgr; using namespace Core::Common; using namespace Core::Network::Packets; @@ -510,6 +512,9 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPac pSession->getZoneConnection()->queueOutPacket( pPacket ); } + if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) ) + return; + if( m_inRangePlayers.empty() ) return; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 058623f0..ca71b217 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -825,6 +825,9 @@ void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value ) // spawn this player for pTarget void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget ) { + if( g_territoryMgr.isPrivateTerritory( getCurrentZone()->getTerritoryId() ) && pTarget->getId() != getId() ) + return; + g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " + getName() + " for " + pTarget->getName() ); diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 61ad14fd..9c367aa9 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -32,8 +32,6 @@ namespace Server { void initialize( Entity::Player& player, Entity::Player& target ) { // todo: figure out unkown offsets - // TODO: temporary gm rank - //m_data.gmRank = 0xff; m_data.classJob = static_cast< uint8_t >( player.getClass() ); //m_data.status = static_cast< uint8_t >( pPlayer->getStatus() ); diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 5c27c224..9c85b02f 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -116,7 +116,8 @@ bool Core::TerritoryMgr::createDefaultTerritories() "\t" + std::to_string( guid ) + "\t" + std::to_string( territoryInfo->territoryIntendedUse ) + "\t" + territoryInfo->name + - "\t" + pPlaceName->name ); + "\t" + pPlaceName->name + + "\t" + ( isPrivateTerritory( territoryId ) ? "PRIVATE" : "PUBLIC" ) ); ZonePtr pZone( new Zone( territoryId, guid, territoryInfo->name, pPlaceName->name ) ); pZone->init(); diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index bb79c84c..45868d8e 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -35,6 +35,7 @@ extern Core::Logger g_log; extern Core::ServerZone g_serverZone; extern Core::Data::ExdDataGenerated g_exdDataGen; extern Core::Scripting::ScriptManager g_scriptMgr; +extern Core::TerritoryMgr g_territoryMgr; namespace Core { @@ -369,6 +370,9 @@ void Zone::removeActor( Entity::ActorPtr pActor ) void Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ) { + if( g_territoryMgr.isPrivateTerritory( getTerritoryId() ) ) + return; + for( auto it = m_playerMap.begin(); it != m_playerMap.end(); ++it ) { float distance = Math::Util::distance( sourcePlayer.getPos().x,