From 08b7e63e3e13e252f0c992c6c4cd0310f3953f5f Mon Sep 17 00:00:00 2001 From: XeAri Date: Tue, 20 Nov 2018 16:08:29 +0100 Subject: [PATCH 01/20] Fixed housing preset handler --- src/servers/sapphire_zone/Network/GameConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index 5d412727..b4cc9b90 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -83,7 +83,7 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::InventoryModifyHandler, "InventoryModifyHandler", &GameConnection::inventoryModifyHandler ); - setZoneHandler( ClientZoneIpcType::BuildPresetHandler, "BuildPresetHandler", &GameConnection::eventHandlerTalk ); + setZoneHandler( ClientZoneIpcType::BuildPresetHandler, "BuildPresetHandler", &GameConnection:buildPresetHandler ); setZoneHandler( ClientZoneIpcType::LandRenameHandler, "LandRenameHandler", &GameConnection::landRenameHandler ); setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); From e44c729177cd6f99171e551020ab238467c632c6 Mon Sep 17 00:00:00 2001 From: XeAri Date: Tue, 20 Nov 2018 16:09:03 +0100 Subject: [PATCH 02/20] Update GameConnection.cpp --- src/servers/sapphire_zone/Network/GameConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index b4cc9b90..b84013b0 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -83,7 +83,7 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::InventoryModifyHandler, "InventoryModifyHandler", &GameConnection::inventoryModifyHandler ); - setZoneHandler( ClientZoneIpcType::BuildPresetHandler, "BuildPresetHandler", &GameConnection:buildPresetHandler ); + setZoneHandler( ClientZoneIpcType::BuildPresetHandler, "BuildPresetHandler", &GameConnection::buildPresetHandler ); setZoneHandler( ClientZoneIpcType::LandRenameHandler, "LandRenameHandler", &GameConnection::landRenameHandler ); setZoneHandler( ClientZoneIpcType::TalkEventHandler, "EventHandlerTalk", &GameConnection::eventHandlerTalk ); setZoneHandler( ClientZoneIpcType::EmoteEventHandler, "EventHandlerEmote", &GameConnection::eventHandlerEmote ); From 035edebfb4be58fd04b08a43391b9be81e306caa Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 20 Nov 2018 17:15:23 +0100 Subject: [PATCH 03/20] Typo fix --- src/tools/exd_common_gen/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/exd_common_gen/main.cpp b/src/tools/exd_common_gen/main.cpp index 4780a3a4..aa2ba071 100644 --- a/src/tools/exd_common_gen/main.cpp +++ b/src/tools/exd_common_gen/main.cpp @@ -127,7 +127,7 @@ int main() result += generateEnum( "Tribe", 0, "uint8_t" ); result += generateEnum( "Town", 0, "uint8_t" ); result += generateEnum( "Weather", 1, "uint8_t" ); - result += generateEnum( "HosuingAppeal", 0, "uint8_t" ); + result += generateEnum( "HousingAppeal", 0, "uint8_t" ); result += "}\n"; result += "}\n#endif\n"; g_log.info( result ); From b723e092f9f12c7145a8eaf30342e4e823e0cf11 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 20 Nov 2018 21:21:22 +0100 Subject: [PATCH 04/20] Added checks to relinquishing land --- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index 4fcf33cf..a07406c9 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -184,6 +184,25 @@ bool Core::HousingMgr::relinquishLand( Entity::Player& player, uint8_t plot ) auto pLand = pHousing->getLand( plot ); auto plotMaxPrice = pLand->getCurrentPrice(); + auto landOwnerId = pLand->getPlayerOwner(); + + // can't relinquish when you are not the owner + // TODO: actually use permissions here for FC houses + if( landOwnerId != player.getId() ) + { + auto msgPkt = makeActorControl143( player.getId(), ActorControl::LogMsg, 3304, 0 ); + player.queuePacket( msgPkt ); + return false; + } + + // unable to relinquish if there is a house built + // TODO: additionally check for yard items + if( pLand->getHouse() ) + { + auto msgPkt = makeActorControl143( player.getId(), ActorControl::LogMsg, 3315, 0 ); + player.queuePacket( msgPkt ); + return false; + } pLand->setCurrentPrice( pLand->getMaxPrice() ); pLand->setPlayerOwner( 0 ); From 54f393654277486f83fb7e74209c7db26189dbf1 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 20 Nov 2018 21:32:13 +0100 Subject: [PATCH 05/20] ServerZone -> ServerMgr --- src/servers/sapphire_zone/Actor/Actor.cpp | 4 +- src/servers/sapphire_zone/Actor/BNpc.cpp | 2 +- src/servers/sapphire_zone/Actor/Chara.cpp | 2 +- src/servers/sapphire_zone/Actor/Npc.cpp | 2 +- src/servers/sapphire_zone/Actor/Player.cpp | 8 ++-- .../sapphire_zone/Actor/PlayerEvent.cpp | 2 +- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 2 +- .../DebugCommand/DebugCommandHandler.cpp | 12 +++--- .../sapphire_zone/Network/GameConnection.cpp | 4 +- .../Network/Handlers/ClientTriggerHandler.cpp | 4 +- .../Network/Handlers/GMCommandHandlers.cpp | 4 +- .../Network/Handlers/InventoryHandler.cpp | 2 +- .../Network/Handlers/PacketHandlers.cpp | 8 ++-- .../sapphire_zone/Script/ScriptLoader.cpp | 2 +- .../sapphire_zone/Script/ScriptMgr.cpp | 4 +- .../{ServerZone.cpp => ServerMgr.cpp} | 40 +++++++++---------- .../{ServerZone.h => ServerMgr.h} | 6 +-- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 7 ++-- src/servers/sapphire_zone/Zone/Zone.cpp | 8 ++-- src/servers/sapphire_zone/mainGameServer.cpp | 8 ++-- 20 files changed, 65 insertions(+), 66 deletions(-) rename src/servers/sapphire_zone/{ServerZone.cpp => ServerMgr.cpp} (90%) rename src/servers/sapphire_zone/{ServerZone.h => ServerMgr.h} (94%) diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index 5cac36f5..fdb174b7 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -18,7 +18,7 @@ #include "Player.h" #include "BNpc.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Zone/TerritoryMgr.h" @@ -301,7 +301,7 @@ Send a packet to all players in range, potentially to self if set and is player */ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::FFXIVPacketBasePtr pPacket, bool bToSelf ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); if( bToSelf && isPlayer() ) { auto pPlayer = getAsPlayer(); diff --git a/src/servers/sapphire_zone/Actor/BNpc.cpp b/src/servers/sapphire_zone/Actor/BNpc.cpp index c3218505..baad273a 100644 --- a/src/servers/sapphire_zone/Actor/BNpc.cpp +++ b/src/servers/sapphire_zone/Actor/BNpc.cpp @@ -20,7 +20,7 @@ #include "StatusEffect/StatusEffect.h" #include "Action/ActionCollision.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Math/CalcBattle.h" #include "Chara.h" diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 5b90a3cd..302a590f 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -20,7 +20,7 @@ #include "StatusEffect/StatusEffect.h" #include "Action/ActionCollision.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Math/CalcBattle.h" #include "Chara.h" diff --git a/src/servers/sapphire_zone/Actor/Npc.cpp b/src/servers/sapphire_zone/Actor/Npc.cpp index b3a475f4..ef4cf4e6 100644 --- a/src/servers/sapphire_zone/Actor/Npc.cpp +++ b/src/servers/sapphire_zone/Actor/Npc.cpp @@ -20,7 +20,7 @@ #include "StatusEffect/StatusEffect.h" #include "Action/ActionCollision.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Math/CalcBattle.h" #include "Chara.h" diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index fe59ab76..7aba3e56 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -40,7 +40,7 @@ #include "Math/CalcStats.h" #include "Math/CalcBattle.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" extern Core::Framework g_fw; @@ -108,7 +108,7 @@ Core::Entity::Player::~Player() void Core::Entity::Player::injectPacket( const std::string& path ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto session = pServerZone->getSession( getId() ); if( session ) session->getZoneConnection()->injectPacket( path, *this ); @@ -1191,7 +1191,7 @@ const uint8_t* Core::Entity::Player::getGcRankArray() const void Core::Entity::Player::queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto pSession = pServerZone->getSession( m_id ); if( !pSession ) @@ -1206,7 +1206,7 @@ void Core::Entity::Player::queuePacket( Network::Packets::FFXIVPacketBasePtr pPa void Core::Entity::Player::queueChatPacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto pSession = pServerZone->getSession( m_id ); if( !pSession ) diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 13daf07c..2a3631e5 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -16,7 +16,7 @@ #include "Action/EventItemAction.h" #include "Zone/Zone.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" extern Core::Framework g_fw; diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 1ca935f7..03eb605a 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -18,7 +18,7 @@ #include "Inventory/ItemContainer.h" #include "Inventory/ItemUtil.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" extern Core::Framework g_fw; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 9328e074..f1962bf4 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -32,7 +32,7 @@ #include "Zone/TerritoryMgr.h" #include "Event/EventDefs.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Framework.h" @@ -422,7 +422,7 @@ void Core::DebugCommandHandler::add( char* data, Entity::Player& player, std::sh } else if( subCommand == "bnpc" ) { - auto serverZone = g_fw.get< ServerZone >(); + auto serverZone = g_fw.get< ServerMgr >(); auto bNpcTemplate = serverZone->getBNpcTemplate( params ); @@ -557,7 +557,7 @@ void Core::DebugCommandHandler::get( char* data, Entity::Player& player, std::sh void Core::DebugCommandHandler::injectPacket( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto pSession = pServerZone->getSession( player.getId() ); if( pSession ) pSession->getZoneConnection()->injectPacket( data + 7, player ); @@ -566,7 +566,7 @@ Core::DebugCommandHandler::injectPacket( char* data, Entity::Player& player, std void Core::DebugCommandHandler::injectChatPacket( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto pSession = pServerZone->getSession( player.getId() ); if( pSession ) pSession->getChatConnection()->injectPacket( data + 8, player ); @@ -575,7 +575,7 @@ void Core::DebugCommandHandler::injectChatPacket( char* data, Entity::Player& pl void Core::DebugCommandHandler::replay( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { auto pLog = g_fw.get< Logger >(); - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); std::string subCommand; std::string params = ""; @@ -673,7 +673,7 @@ void Core::DebugCommandHandler::nudge( char* data, Entity::Player& player, std:: void Core::DebugCommandHandler::serverInfo( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); player.sendDebug( "SapphireZone " + Version::VERSION + "\nRev: " + Version::GIT_HASH ); player.sendDebug( "Compiled: " __DATE__ " " __TIME__ ); player.sendDebug( "Sessions: " + std::to_string( pServerZone->getSessionCount() ) ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index b84013b0..a358bc93 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -15,7 +15,7 @@ #include "DebugCommand/DebugCommandHandler.h" #include "GameConnection.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Session.h" #include "Framework.h" #include "Forwards.h" @@ -385,7 +385,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: const std::vector< Core::Network::Packets::FFXIVARR_PACKET_RAW >& packetData ) { auto pLog = g_fw.get< Logger >(); - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); // if a session is set, update the last time it recieved a game packet if( m_pSession ) m_pSession->updateLastDataTime(); diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index d58057cf..137e8424 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -33,7 +33,7 @@ #include "Session.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Forwards.h" #include "Framework.h" #include @@ -49,7 +49,7 @@ void examineHandler( Core::Entity::Player& player, uint32_t targetId ) { using namespace Core; - auto pSession = g_fw.get< Core::ServerZone >()->getSession( targetId ); + auto pSession = g_fw.get< Core::ServerMgr >()->getSession( targetId ); if( pSession ) { auto pTarget = pSession->getPlayer(); diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index c2870905..54507a44 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -29,7 +29,7 @@ #include "Network/PacketWrappers/EventFinishPacket.h" #include "Network/PacketWrappers/PlayerStateFlagsPacket.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" extern Core::Framework g_fw; @@ -551,7 +551,7 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R return; auto pLog = g_fw.get< Logger >(); - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); const auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand2 >( inPacket ); diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 08790fd2..d518432b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -15,7 +15,7 @@ #include "Actor/Player.h" #include "Session.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index e8427db8..c7604ba8 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -41,7 +41,7 @@ #include "Action/ActionTeleport.h" #include "Session.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Forwards.h" #include "Framework.h" @@ -111,7 +111,7 @@ void Core::Network::GameConnection::reqExamineSearchCommentHandler( const Core:: { auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x10 ] ); - auto pSession = g_fw.get< Core::ServerZone >()->getSession( targetId ); + auto pSession = g_fw.get< Core::ServerMgr >()->getSession( targetId ); g_fw.get< Core::Logger >()->debug( std::to_string( targetId ) ); @@ -138,7 +138,7 @@ void Core::Network::GameConnection::reqExamineFcInfo( const Core::Network::Packe { auto targetId = *reinterpret_cast< const uint32_t* >( &inPacket.data[ 0x18 ] ); - auto pSession = g_fw.get< Core::ServerZone >()->getSession( targetId ); + auto pSession = g_fw.get< Core::ServerMgr >()->getSession( targetId ); g_fw.get< Core::Logger >()->debug( std::to_string( targetId ) ); @@ -598,7 +598,7 @@ void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::F { const auto packet = ZoneChannelPacket< Client::FFXIVIpcTellHandler >( inPacket ); - auto pZoneServer = g_fw.get< ServerZone >(); + auto pZoneServer = g_fw.get< ServerMgr >(); auto pSession = pZoneServer->getSession( packet.data().targetPCName ); diff --git a/src/servers/sapphire_zone/Script/ScriptLoader.cpp b/src/servers/sapphire_zone/Script/ScriptLoader.cpp index 657ffff9..ec0f7966 100644 --- a/src/servers/sapphire_zone/Script/ScriptLoader.cpp +++ b/src/servers/sapphire_zone/Script/ScriptLoader.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "ServerZone.h" +#include "ServerMgr.h" #include diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index 38d6bc90..b0af2c18 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -7,7 +7,7 @@ #include "Zone/Zone.h" #include "Zone/InstanceContent.h" #include "Actor/Player.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Event/EventHandler.h" #include "Event/EventHelper.h" @@ -18,7 +18,7 @@ #include "Script/ScriptMgr.h" #include "NativeScriptMgr.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" // enable the ambiguity fix for every platform to avoid #define nonsense diff --git a/src/servers/sapphire_zone/ServerZone.cpp b/src/servers/sapphire_zone/ServerMgr.cpp similarity index 90% rename from src/servers/sapphire_zone/ServerZone.cpp rename to src/servers/sapphire_zone/ServerMgr.cpp index 0844538e..9e6232bc 100644 --- a/src/servers/sapphire_zone/ServerZone.cpp +++ b/src/servers/sapphire_zone/ServerMgr.cpp @@ -5,7 +5,7 @@ #include #include "Network/GameConnection.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "Framework.h" #include @@ -28,7 +28,7 @@ extern Core::Framework g_fw; -Core::ServerZone::ServerZone( const std::string& configName ) : +Core::ServerMgr::ServerMgr( const std::string& configName ) : m_configName( configName ), m_bRunning( true ), m_lastDBPingTime( 0 ), @@ -36,16 +36,16 @@ Core::ServerZone::ServerZone( const std::string& configName ) : { } -Core::ServerZone::~ServerZone() +Core::ServerMgr::~ServerMgr() { } -size_t Core::ServerZone::getSessionCount() const +size_t Core::ServerMgr::getSessionCount() const { return m_sessionMapById.size(); } -bool Core::ServerZone::loadSettings( int32_t argc, char* argv[] ) +bool Core::ServerMgr::loadSettings( int32_t argc, char* argv[] ) { auto pLog = g_fw.get< Core::Logger >(); auto pConfig = g_fw.get< Core::ConfigMgr >(); @@ -143,7 +143,7 @@ bool Core::ServerZone::loadSettings( int32_t argc, char* argv[] ) return true; } -void Core::ServerZone::run( int32_t argc, char* argv[] ) +void Core::ServerMgr::run( int32_t argc, char* argv[] ) { auto pLog = g_fw.get< Core::Logger >(); auto pScript = g_fw.get< Scripting::ScriptMgr >(); @@ -189,17 +189,17 @@ void Core::ServerZone::run( int32_t argc, char* argv[] ) } -uint16_t Core::ServerZone::getWorldId() const +uint16_t Core::ServerMgr::getWorldId() const { return m_worldId; } -void Core::ServerZone::setWorldId( uint16_t worldId ) +void Core::ServerMgr::setWorldId( uint16_t worldId ) { m_worldId = worldId; } -void Core::ServerZone::printBanner() const +void Core::ServerMgr::printBanner() const { auto pLog = g_fw.get< Core::Logger >(); @@ -211,7 +211,7 @@ void Core::ServerZone::printBanner() const pLog->info( "===========================================================" ); } -void Core::ServerZone::mainLoop() +void Core::ServerMgr::mainLoop() { auto pLog = g_fw.get< Logger >(); auto pTeriMgr = g_fw.get< TerritoryMgr >(); @@ -292,7 +292,7 @@ void Core::ServerZone::mainLoop() } } -bool Core::ServerZone::createSession( uint32_t sessionId ) +bool Core::ServerMgr::createSession( uint32_t sessionId ) { auto pLog = g_fw.get< Core::Logger >(); @@ -325,12 +325,12 @@ bool Core::ServerZone::createSession( uint32_t sessionId ) } -void Core::ServerZone::removeSession( uint32_t sessionId ) +void Core::ServerMgr::removeSession( uint32_t sessionId ) { m_sessionMapById.erase( sessionId ); } -Core::SessionPtr Core::ServerZone::getSession( uint32_t id ) +Core::SessionPtr Core::ServerMgr::getSession( uint32_t id ) { //std::lock_guard lock( m_sessionMutex ); @@ -342,7 +342,7 @@ Core::SessionPtr Core::ServerZone::getSession( uint32_t id ) return nullptr; } -Core::SessionPtr Core::ServerZone::getSession( const std::string& playerName ) +Core::SessionPtr Core::ServerMgr::getSession( const std::string& playerName ) { //std::lock_guard lock( m_sessionMutex ); @@ -354,18 +354,18 @@ Core::SessionPtr Core::ServerZone::getSession( const std::string& playerName ) return nullptr; } -void Core::ServerZone::removeSession( const std::string& playerName ) +void Core::ServerMgr::removeSession( const std::string& playerName ) { m_sessionMapByName.erase( playerName ); } -bool Core::ServerZone::isRunning() const +bool Core::ServerMgr::isRunning() const { return m_bRunning; } -std::string Core::ServerZone::getPlayerNameFromDb( uint32_t playerId ) +std::string Core::ServerMgr::getPlayerNameFromDb( uint32_t playerId ) { auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); auto res = pDb->query( "SELECT name FROM charainfo WHERE characterid = " + std::to_string( playerId ) ); @@ -376,7 +376,7 @@ std::string Core::ServerZone::getPlayerNameFromDb( uint32_t playerId ) return res->getString( 1 ); } -void Core::ServerZone::loadBNpcTemplates() +void Core::ServerMgr::loadBNpcTemplates() { auto pDb = g_fw.get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); auto pTeriMgr = g_fw.get< TerritoryMgr >(); @@ -419,7 +419,7 @@ void Core::ServerZone::loadBNpcTemplates() } -Core::Entity::BNpcTemplatePtr Core::ServerZone::getBNpcTemplate( const std::string& key ) +Core::Entity::BNpcTemplatePtr Core::ServerMgr::getBNpcTemplate( const std::string& key ) { auto it = m_bNpcTemplateMap.find( key ); @@ -429,7 +429,7 @@ Core::Entity::BNpcTemplatePtr Core::ServerZone::getBNpcTemplate( const std::stri return it->second; } -Core::Entity::BNpcTemplatePtr Core::ServerZone::getBNpcTemplate( uint32_t id ) +Core::Entity::BNpcTemplatePtr Core::ServerMgr::getBNpcTemplate( uint32_t id ) { for( auto entry : m_bNpcTemplateMap ) { diff --git a/src/servers/sapphire_zone/ServerZone.h b/src/servers/sapphire_zone/ServerMgr.h similarity index 94% rename from src/servers/sapphire_zone/ServerZone.h rename to src/servers/sapphire_zone/ServerMgr.h index 52101668..13fbac75 100644 --- a/src/servers/sapphire_zone/ServerZone.h +++ b/src/servers/sapphire_zone/ServerMgr.h @@ -10,12 +10,12 @@ namespace Core { -class ServerZone +class ServerMgr { public: - ServerZone( const std::string& configName ); + ServerMgr( const std::string& configName ); - ~ServerZone(); + ~ServerMgr(); void run( int32_t argc, char* argv[] ); diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index a07406c9..e882eca1 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -18,7 +18,7 @@ #include "HousingMgr.h" #include "Land.h" #include "Framework.h" -#include "ServerZone.h" +#include "ServerMgr.h" using namespace Core::Common; using namespace Core::Network; @@ -43,7 +43,6 @@ bool Core::HousingMgr::init() return true; } - uint32_t Core::HousingMgr::toLandSetId( uint16_t territoryTypeId, uint8_t wardId ) const { return ( static_cast< uint32_t >( territoryTypeId ) << 16 ) | wardId; @@ -89,7 +88,7 @@ void Core::HousingMgr::sendLandSignOwned( Entity::Player& player, uint8_t wardId auto landInfoSignPacket = makeZonePacket< Server::FFXIVIpcLandInfoSign >( player.getId() ); uint32_t playerId = land->getPlayerOwner(); - std::string playerName = g_fw.get< Core::ServerZone >()->getPlayerNameFromDb( playerId ); + std::string playerName = g_fw.get< Core::ServerMgr >()->getPlayerNameFromDb( playerId ); //memcpy( &landInfoSignPacket->data().estateGreeting, "Hello World", 11 ); //memcpy( &landInfoSignPacket->data().estateName, land->getLandName().c_str(), land->getLandName().size() ); landInfoSignPacket->data().houseSize = land->getSize(); @@ -256,7 +255,7 @@ void Core::HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, entry.infoFlags = Common::WardEstateFlags::IsEstateOwned; auto owner = land->getPlayerOwner(); - std::string playerName = g_fw.get< Core::ServerZone >()->getPlayerNameFromDb( owner ); + std::string playerName = g_fw.get< Core::ServerMgr >()->getPlayerNameFromDb( owner ); memcpy( &entry.estateOwnerName, playerName.c_str(), playerName.size() ); break; diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 66e23cda..bf615b31 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -31,7 +31,7 @@ #include "Session.h" #include "ForwardsZone.h" -#include "ServerZone.h" +#include "ServerMgr.h" #include "CellHandler.h" #include "Zone.h" #include "TerritoryMgr.h" @@ -222,7 +222,7 @@ void Core::Zone::pushActor( Entity::ActorPtr pActor ) { auto pPlayer = pActor->getAsPlayer(); - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); auto pSession = pServerZone->getSession( pPlayer->getId() ); if( pSession ) m_sessionSet.insert( pSession ); @@ -284,7 +284,7 @@ void Core::Zone::queuePacketForRange( Entity::Player& sourcePlayer, uint32_t ran if( pTeriMgr->isPrivateTerritory( getTerritoryTypeId() ) ) return; - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); for( auto entry : m_playerMap ) { auto player = entry.second; @@ -314,7 +314,7 @@ void Core::Zone::queuePacketForZone( Entity::Player& sourcePlayer, if( pTeriMgr->isPrivateTerritory( getTerritoryTypeId() ) ) return; - auto pServerZone = g_fw.get< ServerZone >(); + auto pServerZone = g_fw.get< ServerMgr >(); for( auto entry : m_playerMap ) { auto player = entry.second; diff --git a/src/servers/sapphire_zone/mainGameServer.cpp b/src/servers/sapphire_zone/mainGameServer.cpp index a878b8b4..465822e2 100644 --- a/src/servers/sapphire_zone/mainGameServer.cpp +++ b/src/servers/sapphire_zone/mainGameServer.cpp @@ -1,6 +1,6 @@ #include -#include "ServerZone.h" +#include "ServerMgr.h" #include #include #include @@ -20,7 +20,7 @@ using namespace Core; bool setupFramework() { - auto pServer = std::make_shared< ServerZone >( "config.ini" ); + auto pServer = std::make_shared< ServerMgr >( "config.ini" ); auto pLogger = std::make_shared< Logger >(); auto pExdData = std::make_shared< Data::ExdDataGenerated >(); auto pScript = std::make_shared< Scripting::ScriptMgr >(); @@ -34,7 +34,7 @@ bool setupFramework() pLogger->setLogPath( "log/SapphireZone" ); pLogger->init(); - g_fw.set< ServerZone >( pServer ); + g_fw.set< ServerMgr >( pServer ); g_fw.set< Logger >( pLogger ); g_fw.set< Data::ExdDataGenerated >( pExdData ); g_fw.set< Scripting::ScriptMgr >( pScript ); @@ -54,6 +54,6 @@ int main( int32_t argc, char* argv[] ) if( !setupFramework() ) return 0; // too fucking bad... - g_fw.get< ServerZone >()->run( argc, argv ); + g_fw.get< ServerMgr >()->run( argc, argv ); return 0; } From b6590fbe1426b4d4fd874396a9251780c6445c0c Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 20 Nov 2018 23:24:37 +0100 Subject: [PATCH 06/20] Brief event cleanup --- .../sapphire_zone/Actor/PlayerEvent.cpp | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 2a3631e5..9d33124c 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -158,23 +158,18 @@ void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t eventId, uint32_t flags ) { - if( flags & 0x02 ) - setStateFlag( PlayerStateFlag::WatchingCutscene ); - + auto pEvent = getEvent( eventId ); - if( !pEvent && getEventCount() ) - { - // We're trying to play a nested event, need to start it first. - //eventStart( getId(), eventId, Event::EventHandler::Nest, 0, 0 ); - //pEvent = getEvent( eventId ); - } - else if( !pEvent ) + if( !pEvent ) { auto pLog = g_fw.get< Logger >(); pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); return nullptr; } + if( flags & 0x02 ) + setStateFlag( PlayerStateFlag::WatchingCutscene ); + return pEvent; } @@ -266,21 +261,6 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) if( callback ) callback( *this, pEvent->getActorId() ); - auto events = eventList(); - - /*for( auto it : events ) - { - - if( it.second->hasPlayedScene() == false ) - { - // TODO: not happy with this, this is also prone to break wit more than one remaining event in there - queuePacket( std::make_shared< EventFinishPacket >( getId(), it.second->getId(), - it.second->getEventType(), - it.second->getEventParam() ) ); - removeEvent( it.second->getId() ); - } - }*/ - break; } default: From bafb3c1f0df466c5792f11c42187411684ec47ee Mon Sep 17 00:00:00 2001 From: Mordred <30826167+SapphireMordred@users.noreply.github.com> Date: Wed, 21 Nov 2018 09:09:27 +0100 Subject: [PATCH 07/20] Found a typo in opcodes --- src/common/Network/PacketDef/Ipcs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 37f7e9d9..829658ba 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -94,7 +94,7 @@ namespace Core::Network::Packets MailDeleteRequest = 0x0118, // updated 4.4 ReqMoogleMailList = 0x0119, // updated 4.4 - ReqMoogleMailLetter = 0x01A, // updated 4.4 + ReqMoogleMailLetter = 0x011A, // updated 4.4 MailLetterNotification = 0x011B, // updated 4.4 ExamineFreeCompanyInfo = 0x013A, // updated 4.1 From e4d38347d879523d314c4a46826d612db10aeef2 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 21 Nov 2018 10:27:52 +1100 Subject: [PATCH 08/20] HousingAethernet event type --- src/servers/sapphire_zone/Event/EventHandler.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index 7b880279..c9008964 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -69,6 +69,7 @@ namespace Core::Event Story = 0x001A, SpecialShop = 0x001B, BahamutGuide = 0x001C, + HousingAethernet = 0x001E, FcTalk = 0x001F, ICDirector = 0x8003, }; From fe2c757faa6cb337794f9348760530e011a602bf Mon Sep 17 00:00:00 2001 From: NotAdam Date: Wed, 21 Nov 2018 17:17:47 +1100 Subject: [PATCH 09/20] HousingAethernet script --- .../common/{ => aethernet}/Aetheryte.cpp | 0 .../common/aethernet/HousingAethernet.cpp | 42 +++++++++++++++++++ 2 files changed, 42 insertions(+) rename src/servers/Scripts/common/{ => aethernet}/Aetheryte.cpp (100%) create mode 100644 src/servers/Scripts/common/aethernet/HousingAethernet.cpp diff --git a/src/servers/Scripts/common/Aetheryte.cpp b/src/servers/Scripts/common/aethernet/Aetheryte.cpp similarity index 100% rename from src/servers/Scripts/common/Aetheryte.cpp rename to src/servers/Scripts/common/aethernet/Aetheryte.cpp diff --git a/src/servers/Scripts/common/aethernet/HousingAethernet.cpp b/src/servers/Scripts/common/aethernet/HousingAethernet.cpp new file mode 100644 index 00000000..e6854980 --- /dev/null +++ b/src/servers/Scripts/common/aethernet/HousingAethernet.cpp @@ -0,0 +1,42 @@ +#include +#include + +#include +#include +#include + +using namespace Core; + +class HousingAethernet : + public Sapphire::ScriptAPI::EventScript +{ +public: + HousingAethernet() : + Sapphire::ScriptAPI::EventScript( 0x001E0000 ) + { + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, [this, eventId]( Entity::Player& player, const Event::SceneResult& result ) + { + auto pExdData = getFramework()->get< Core::Data::ExdDataGenerated >(); + if( !pExdData ) + return; + + auto housingAethernetIds = pExdData->getHousingAethernetIdList(); + auto terrritoryTypeId = player.getCurrentZone()->getTerritoryTypeId(); + + // param2 is the index starting from 0 inside housingaethernet.exd, but the ID column starts at 0x001E0000........ wtf + auto pHousingAethernet = pExdData->get< Core::Data::HousingAethernet >( getId() + result.param2 ); + if( !pHousingAethernet ) + return; + + // check we're teleporting to the same territorytype + if( player.getCurrentZone()->getTerritoryTypeId() != pHousingAethernet->territoryType ) + return; + + player.sendDebug( "got level entry: " + std::to_string( pHousingAethernet->level ) ); + } ); + } +}; \ No newline at end of file From eb4daa7ce33ab2b76da2002882e7526c608c8f2c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 22 Nov 2018 01:17:19 +1100 Subject: [PATCH 10/20] Move warping to land points to a generic handler --- src/servers/Scripts/common/WarpTaxi.cpp | 32 +-------- src/servers/sapphire_zone/CMakeLists.txt | 1 + .../sapphire_zone/Manager/PlayerMgr.cpp | 66 +++++++++++++++++++ src/servers/sapphire_zone/Manager/PlayerMgr.h | 10 +++ src/servers/sapphire_zone/mainGameServer.cpp | 3 + 5 files changed, 83 insertions(+), 29 deletions(-) create mode 100644 src/servers/sapphire_zone/Manager/PlayerMgr.cpp create mode 100644 src/servers/sapphire_zone/Manager/PlayerMgr.h diff --git a/src/servers/Scripts/common/WarpTaxi.cpp b/src/servers/Scripts/common/WarpTaxi.cpp index 7c259be6..69194be2 100644 --- a/src/servers/Scripts/common/WarpTaxi.cpp +++ b/src/servers/Scripts/common/WarpTaxi.cpp @@ -2,10 +2,8 @@ #include #include -#include -#include -#include #include +#include using namespace Core; @@ -29,37 +27,13 @@ public: player.eventFinish( 1310721, 0 ); player.eventFinish( getId(), 1 ); - // todo: this is shit, move to housingmgr? handle moving players in and out of it there? auto exdData = getFramework()->get< Core::Data::ExdDataGenerated >(); - auto warp = exdData->get< Core::Data::Warp >( getId() ); if( !warp ) return; - auto level = exdData->get< Core::Data::Level >( warp->level ); - if( !level ) - { - - // fetch from cache - auto teriMgr = getFramework()->get< Core::TerritoryMgr >(); - - auto pos = teriMgr->getTerritoryPosition( warp->level ); - if( !pos ) - return; - - // lookup instance - auto housingMgr = getFramework()->get< Core::HousingMgr >(); - auto landSetId = housingMgr->toLandSetId( 341, result.param3 ); - auto hZone = housingMgr->getHousingZoneByLandSetId( landSetId ); - - if( !hZone ) - return; - - player.setPos( pos->getTargetPosition() ); - player.setRot( pos->getTargetRotation() ); - player.setInstance( hZone ); - - } + auto playerMgr = getFramework()->get< Sapphire::World::Manager::PlayerMgr >(); + playerMgr->movePlayerToLandDestination( player, warp->level, result.param3 ); } else { diff --git a/src/servers/sapphire_zone/CMakeLists.txt b/src/servers/sapphire_zone/CMakeLists.txt index d0f36a8f..c22229c8 100644 --- a/src/servers/sapphire_zone/CMakeLists.txt +++ b/src/servers/sapphire_zone/CMakeLists.txt @@ -12,6 +12,7 @@ file(GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Event/*.c* Inventory/*.c* Linkshell/*.c* + Manager/*.c* Math/*.c* Network/*.c* Network/Handlers/*.c* diff --git a/src/servers/sapphire_zone/Manager/PlayerMgr.cpp b/src/servers/sapphire_zone/Manager/PlayerMgr.cpp new file mode 100644 index 00000000..e124a477 --- /dev/null +++ b/src/servers/sapphire_zone/Manager/PlayerMgr.cpp @@ -0,0 +1,66 @@ +#include "PlayerMgr.h" + +#include +#include + +#include +#include + +#include + +#include + +extern Core::Framework g_fw; + +void Sapphire::World::Manager::PlayerMgr::movePlayerToLandDestination( Core::Entity::Player& player, uint32_t landId, uint16_t param ) +{ + // check if we have one in the db first + auto terriMgr = g_fw.get< Core::TerritoryMgr >(); + if( !terriMgr ) + return; + + Core::ZonePtr destinationZone; + + auto terriPos = terriMgr->getTerritoryPosition( landId ); + if( terriPos ) + { + // check if its a housing zone, zoning is different here + if( terriMgr->isHousingTerritory( terriPos->getTargetZoneId() ) && param != 0 ) + { + auto housingMgr = g_fw.get< Core::HousingMgr >(); + auto landSetId = housingMgr->toLandSetId( terriPos->getTargetZoneId(), param ); + + auto housingZone = housingMgr->getHousingZoneByLandSetId( landSetId ); + + if( !housingZone ) + return; + + destinationZone = housingZone; + } + else if( terriMgr->isInstanceContentTerritory( terriPos->getTargetZoneId() ) ) + { + // todo: instance dungeon handling + // will need to use setInstance so old pos gets set + return; + } + else + { + // normal zones + destinationZone = terriMgr->getZoneByTerritoryTypeId( terriPos->getTargetZoneId() ); + } + } + else + { + // todo: lookup land.exd and see if it's in there if its not in our db + return; + } + + if( !destinationZone ) + return; + + player.setPos( terriPos->getTargetPosition() ); + player.setRot( terriPos->getTargetRotation() ); + + if( terriMgr->movePlayer( destinationZone, player.getAsPlayer() ) ) + player.sendZonePackets(); +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/Manager/PlayerMgr.h b/src/servers/sapphire_zone/Manager/PlayerMgr.h new file mode 100644 index 00000000..f25ba192 --- /dev/null +++ b/src/servers/sapphire_zone/Manager/PlayerMgr.h @@ -0,0 +1,10 @@ +#include "ForwardsZone.h" + +namespace Sapphire::World::Manager +{ + class PlayerMgr + { + public: + void movePlayerToLandDestination( Core::Entity::Player& player, uint32_t landId, uint16_t param = 0 ); + }; +} \ No newline at end of file diff --git a/src/servers/sapphire_zone/mainGameServer.cpp b/src/servers/sapphire_zone/mainGameServer.cpp index 465822e2..489857b0 100644 --- a/src/servers/sapphire_zone/mainGameServer.cpp +++ b/src/servers/sapphire_zone/mainGameServer.cpp @@ -11,6 +11,7 @@ #include "Zone/TerritoryMgr.h" #include "Zone/HousingMgr.h" #include "DebugCommand/DebugCommandHandler.h" +#include "Manager/PlayerMgr.h" #include @@ -30,6 +31,7 @@ bool setupFramework() auto pTeriMgr = std::make_shared< TerritoryMgr >(); auto pDebugCom = std::make_shared< DebugCommandHandler >(); auto pConfig = std::make_shared< ConfigMgr >(); + auto pPlayerMgr = std::make_shared< Sapphire::World::Manager::PlayerMgr >(); pLogger->setLogPath( "log/SapphireZone" ); pLogger->init(); @@ -44,6 +46,7 @@ bool setupFramework() g_fw.set< TerritoryMgr >( pTeriMgr ); g_fw.set< DebugCommandHandler >( pDebugCom ); g_fw.set< ConfigMgr >( pConfig ); + g_fw.set< Sapphire::World::Manager::PlayerMgr >( pPlayerMgr ); // actuall catch errors here... return true; From 7f5ea70523631336e83b46dbe7786d21262328b6 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 22 Nov 2018 01:19:18 +1100 Subject: [PATCH 11/20] add ul'dah -> goblet warptaxi zoneposition --- sql/zonepositions.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/zonepositions.sql b/sql/zonepositions.sql index 7fd2f54f..9d842235 100644 --- a/sql/zonepositions.sql +++ b/sql/zonepositions.sql @@ -218,7 +218,8 @@ INSERT INTO `zonepositions` (`id`, `target_zone_id`, `pos_x`, `pos_y`, `pos_z`, (1359650, 153, -226.643, 21.23, 351.76, -0.74, 2), (3965709, 147, 22.9166, 48.309, -26.801, -2.406, 2), (3965584, 146, -320.39, 8.262, 406.08, -1.455, 2), - (5668783, 144, -0.3458, 1.0425, -5.786, 0.0603, 2); + (5668783, 144, -0.3458, 1.0425, -5.786, 0.0603, 2), + (4656744, 341, 29.4298, -11.0766, -211.529, -0.5092, 2); /*!40000 ALTER TABLE `zonepositions` ENABLE KEYS */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; From 381d8ae940ab4f623bd544d38b479061d826d262 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 22 Nov 2018 00:04:26 +0100 Subject: [PATCH 12/20] Prelim housing eventhandler --- src/common/Network/PacketDef/Ipcs.h | 6 +++-- .../Network/PacketDef/Zone/ClientZoneDef.h | 7 +++++ .../sapphire_zone/Actor/PlayerEvent.cpp | 2 +- .../sapphire_zone/Network/GameConnection.cpp | 4 +++ .../sapphire_zone/Network/GameConnection.h | 2 ++ .../Network/Handlers/EventHandlers.cpp | 27 +++++++++++++++++++ 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 829658ba..28fe961e 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -291,11 +291,13 @@ namespace Core::Network::Packets OutOfRangeEventHandler = 0x014E, // updated 4.4 EnterTeriEventHandler = 0x014F, // updated 4.4 + ShopEventHandler = 0x0151, // updated 4.4 + ReturnEventHandler = 0x0154, // updated 4.4 TradeReturnEventHandler = 0x0155, // updated 4.4 - LinkshellEventHandler = 0x0150, // updated 4.1 ?? - LinkshellEventHandler1 = 0x0151, // updated 4.1 ?? + LinkshellEventHandler = 0x1150, // updated 4.1 ?? + LinkshellEventHandler1 = 0x1151, // updated 4.1 ?? LandRenameHandler = 0x0171, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 7dae9236..88e6134e 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -163,6 +163,13 @@ struct FFXIVIpcChatHandler : /* 001A */ char message[1012]; }; +struct FFXIVIpcShopEventHandler : + FFXIVIpcBasePacket< ShopEventHandler > +{ + /* 0000 */ uint32_t eventId; + /* 0004 */ uint32_t param; +}; + struct FFXIVIpcLinkshellEventHandler : FFXIVIpcBasePacket< LinkshellEventHandler > { diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 9d33124c..80d8210d 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -158,7 +158,7 @@ void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t eventId, uint32_t flags ) { - + auto pEvent = getEvent( eventId ); if( !pEvent ) { diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index a358bc93..cb960315 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -98,8 +98,12 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::TradeReturnEventHandler, "EventHandlerReturn", &GameConnection::eventHandlerReturn ); + setZoneHandler( ClientZoneIpcType::ShopEventHandler, "ShopEventHandler", + &GameConnection::eventHandlerShop ); + setZoneHandler( ClientZoneIpcType::LinkshellEventHandler, "LinkshellEventHandler", &GameConnection::eventHandlerLinkshell ); + setZoneHandler( ClientZoneIpcType::LinkshellEventHandler1, "LinkshellEventHandler1", &GameConnection::eventHandlerLinkshell ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.h b/src/servers/sapphire_zone/Network/GameConnection.h index 8ba31549..529bba6b 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.h +++ b/src/servers/sapphire_zone/Network/GameConnection.h @@ -139,6 +139,8 @@ namespace Core::Network DECLARE_HANDLER( eventHandlerReturn ); + DECLARE_HANDLER( eventHandlerShop ); + DECLARE_HANDLER( eventHandlerLinkshell ); DECLARE_HANDLER( logoutHandler ); diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 1fd26f15..985d8ea1 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -251,4 +252,30 @@ void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::FFXIVA } +void Core::Network::GameConnection::eventHandlerShop( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) +{ + const auto packet = ZoneChannelPacket< Client::FFXIVIpcShopEventHandler >( inPacket ); + + auto pLog = g_fw.get< Logger >(); + auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + + const auto eventId = packet.data().eventId; + + auto eventType = static_cast< uint16_t >( eventId >> 16 ); + + std::string eventName = "onShop"; + std::string objName = Event::getEventName( eventId ); + + player.sendDebug( "EventId: " + + std::to_string( eventId ) + + " (0x" + Util::intToHexString( static_cast< uint64_t >( eventId & 0xFFFFFFF ), 8 ) + ")" ); + + + player.sendDebug( "Calling: " + objName + "." + eventName ); + player.eventStart( 0, eventId, Event::EventHandler::UI, 0, 0 ); +} + + From 8f16c32a4b5094986c7a8e087aed41f284e4dd6c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 22 Nov 2018 12:27:35 +1100 Subject: [PATCH 13/20] Fix stupid mistake stopping ward 1 from working when zoning --- src/servers/sapphire_zone/Manager/PlayerMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Manager/PlayerMgr.cpp b/src/servers/sapphire_zone/Manager/PlayerMgr.cpp index e124a477..95ae01a3 100644 --- a/src/servers/sapphire_zone/Manager/PlayerMgr.cpp +++ b/src/servers/sapphire_zone/Manager/PlayerMgr.cpp @@ -25,7 +25,7 @@ void Sapphire::World::Manager::PlayerMgr::movePlayerToLandDestination( Core::Ent if( terriPos ) { // check if its a housing zone, zoning is different here - if( terriMgr->isHousingTerritory( terriPos->getTargetZoneId() ) && param != 0 ) + if( terriMgr->isHousingTerritory( terriPos->getTargetZoneId() ) ) { auto housingMgr = g_fw.get< Core::HousingMgr >(); auto landSetId = housingMgr->toLandSetId( terriPos->getTargetZoneId(), param ); From 33101fe341c0326c74392d4f874514d11df1830f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 22 Nov 2018 13:12:21 +1100 Subject: [PATCH 14/20] change script selection behaviour so a specific script will be chosen before a generic one --- src/servers/sapphire_zone/Script/ScriptMgr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index b0af2c18..67d7fe40 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -168,7 +168,7 @@ void Core::Scripting::ScriptMgr::onPlayerFirstEnterWorld( Entity::Player& player bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId ) { - auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId & 0xFFFF0000 ); + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId ); if( script ) { script->onTalk( eventId, player, actorId ); @@ -176,7 +176,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI } else { - auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId ); + auto script = m_nativeScriptMgr->getScript< Sapphire::ScriptAPI::EventScript >( eventId & 0xFFFF0000 ); if( !script ) return false; @@ -184,7 +184,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI return true; } - return true; + return false; } bool Core::Scripting::ScriptMgr::onEnterTerritory( Entity::Player& player, uint32_t eventId, From f1bd557b701b969a4ccd0074280b0b1bfeb3490b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Thu, 22 Nov 2018 15:34:17 +1100 Subject: [PATCH 15/20] FFXIVIpcHousingEstateGreeting added --- src/common/Network/CommonActorControl.h | 2 +- src/common/Network/PacketDef/Ipcs.h | 2 ++ src/common/Network/PacketDef/Zone/ServerZoneDef.h | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index e4d6158b..e028e136 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -295,7 +295,7 @@ enum ActorControlType : uint16_t RequestWardLandInfo = 0x453, RequestLandRelinquish = 0x454, RequestEstateRename = 0x45A, - RequestEstateGreeting = 0x45C, + RequestEstateGreeting = 0x45C, // sends FFXIVIpcHousingEstateGreeting in return RequestHousingItemUI = 0x463, RequestSharedEstateSettings = 0x46F, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 28fe961e..a7c3533f 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -191,6 +191,8 @@ namespace Core::Network::Packets LandInfoSign = 0x0225, // updated 4.4 LandRename = 0x0226, // updated 4.4 + HousingEstateGreeting = 0x0227, // updated 4.4 + LandPermissionSlot = 0x0228, // updated 4.4 LandPermission = 0x0229, // updated 4.4 diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 4423d29b..22c07e60 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1738,6 +1738,15 @@ struct FFXIVIpcHousingWardInfo : FFXIVIpcBasePacket< HousingWardInfo > } houseInfoEntry[60]; }; +struct FFXIVIpcHousingEstateGreeting : FFXIVIpcBasePacket< HousingEstateGreeting > +{ + uint8_t plotId; + uint8_t pad[3]; // unsure + uint16_t territoryTypeId; + uint16_t unk; + char message[200]; +}; + /** * Structural representation of the packet sent by the server * to show the current shared estate settings From 9e22af7b482fb3c0dc5d9c77fbce7967e514bb29 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 22 Nov 2018 23:59:42 +0100 Subject: [PATCH 16/20] Minor changes --- .../sapphire_zone/Event/EventHelper.cpp | Bin 2765 -> 3067 bytes .../sapphire_zone/Network/GameConnection.h | 3 +-- .../Network/Handlers/EventHandlers.cpp | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/servers/sapphire_zone/Event/EventHelper.cpp b/src/servers/sapphire_zone/Event/EventHelper.cpp index 8243599c034b73f4f4ef7feb023633da55cc198d..11b17e0810bf73ed62fc3def6b4e91c8b22e0c66 100644 GIT binary patch literal 3067 zcmb_e&2HN`5Zl5K zpC>|#=O{538sjaOH#$j&{AI>#!NId!EO4pvv%x&5k3T&}sb654VcuvFGESYT+v#?2 zr7@QPHERM+`3{O#;r{5{I z2W2AlgZonr$Qe#z*z0yKyBz>gY6Y1S0uIgG1B!hNtV|egO9Z3d9!(4e@!(;Fczlr| zMOWyf5ga@;`MDWNc_!6Tl1nY&O9{~rv_E2vZbt1UcOc&vy^gdic+I+{+-}XgsdzcKkbk1y zj!@4rztGsoSr}_OWsg!P{VVLRp3%$f8cxsd=QSp6!eSk{t3=?96+yr6ok^muOh3VW zGJcZe7-^L^l8=mRbTVVP}|s~|Mk1wTajmt+Aqn_E!06ow(K*&1Vi${-XX!5v;T`@6%tB I>5D@_uAXUbh)NUP*YmZ4$ zs95m;VYWO8NT?fjROJEK@&H{{-Eb%VsS#dSll$}KoZ~sG9!*`i?s%3PbqRj7Li>H{ z)$OIxMQs|L*IzKlofj`?p;5c~@w}(4z9Sx6C$3L|x~=`!FukrDcMu}`j07HDp#d?B zwZQC?0S$KX_EvAuL9~Wno zw)m|z5&tad{F`(S=qJ)#ynO(m27g*qQmmjC{N_qzn4+E{;S;KH{?0KDbL~r6A%_b+}dNp zY{;DmS0aPh#aB6VaU{RywaOj-va-s*RCNBMqF?!!AwEj7j6??ND>Lwo@yw8KC{GrW zagpc%TCwb;h;gb!Y<0|iM{9zcM$U=)+@=}t;Y90__?Y4mzz}*#4sCQ5;)Eo$mg9<@ z)Y5poOL}JHvQ*chGBufs2G{5S@jqxiy*N8+YZ( eventId >> 16 ); - std::string eventName = "onShop"; + std::string eventName = "onOpen"; std::string objName = Event::getEventName( eventId ); player.sendDebug( "EventId: " + std::to_string( eventId ) + " (0x" + Util::intToHexString( static_cast< uint64_t >( eventId & 0xFFFFFFF ), 8 ) + ")" ); - player.sendDebug( "Calling: " + objName + "." + eventName ); - player.eventStart( 0, eventId, Event::EventHandler::UI, 0, 0 ); + player.eventStart( 0, eventId, Event::EventHandler::UI, 0, packet.data().param ); } From 59e7dd39dc673470b9d79cf5d63772fb4d76cd9c Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 23 Nov 2018 16:48:32 +1100 Subject: [PATCH 17/20] Store instance guid in db when zoning into an instance --- src/servers/sapphire_zone/Zone/TerritoryMgr.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp index 2cbd4789..d8cb748e 100644 --- a/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp +++ b/src/servers/sapphire_zone/Zone/TerritoryMgr.cpp @@ -410,14 +410,18 @@ bool Core::TerritoryMgr::movePlayer( ZonePtr pZone, Core::Entity::PlayerPtr pPla if( isHousingTerritory( pZone->getTerritoryTypeId() ) ) { auto pHousing = std::dynamic_pointer_cast< HousingZone >( pZone ); - if( pHousing ) + if( pHousing ) pPlayer->setTerritoryId( pHousing->getLandSetId() ); - } + } + else if( isInstanceContentTerritory( pZone->getTerritoryTypeId() ) ) + { + pPlayer->setTerritoryId( pZone->getGuId() ); + } else { pPlayer->setTerritoryId( 0 ); } - + // mark character as zoning in progress pPlayer->setLoadingComplete( false ); From 8360c74acdf3ae94290b110f0dfc95db050004d0 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 23 Nov 2018 16:51:07 +1100 Subject: [PATCH 18/20] somehow eventhelper.cpp got really fucked up --- .../sapphire_zone/Event/EventHelper.cpp | Bin 3067 -> 2957 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/servers/sapphire_zone/Event/EventHelper.cpp b/src/servers/sapphire_zone/Event/EventHelper.cpp index 11b17e0810bf73ed62fc3def6b4e91c8b22e0c66..37f7bcfec5f592362e8b20b06ea061d1b9bf7b50 100644 GIT binary patch delta 856 zcmZXSO>fgc5QY`!dm{A$C@C%KVgfh?l14?MBq%B>{X8Hd0vtf9OtNX*I(D$vq$sU8 zapVx@$}a&4^}-EQu1H+@0X-rv%*J+_iiT4NhgT|V zj^5>c+u36~+wFc806f>Qc9=zJx2HFGQ0LD?x+_|hiYpu{8lDst7+^WGgfAl3B7pBA zH)a4BbNhy9b~MK2P>nY|&I*(r;Bn+mf&v*%DQnqL$e7XA*yUFqcg3dFwpjs>qcf?x z{8y`h9~2EgD~m)wQSyHGA%V*HFq#Qrdi2rkB&_MV!tOS7b8k$%PJlnrQh?fy-JV2! zi={%;uh>>@0%iBOMNR|Ea$Lou)HEK%)06FA;t;m~h&S+RB9B{%Sr%X%E<9SddY_99 z?VU?katFSPPl>UM?}_JFNZ!P!$yNNA)bMLkyLgr%FC}OOxr59z-RV_EH3QsCJy;0J zhVB?&ho134fmtn^{QCLZumkS{iT9TQg4O$T5TX*R5E1xvF_5pX0J%-IQODnwOcE4s#Sgs}j&mLslhZ?S_-PSh)~J%wi1z zs(Ht%A_p@_L7^zMq_ikcLCG<-BqOz`vLsc>ns>4un-szrKQeh5#G8 zAebdQS&Q8W$ckat0Fo{28gRp*M&~8wrdq>-1Q-Rt@a7FqEGj?*Hxq}8ILt+$;4TNs z!u%D@Aq_OvkX3SWKZgV`qCqiK3yR5g9A*e-z2a~O#x^h4 Date: Fri, 23 Nov 2018 17:37:46 +1100 Subject: [PATCH 19/20] Remove old tables from update.sql --- sql/update.sql | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sql/update.sql b/sql/update.sql index ce4c3fd9..21bc893c 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -19,12 +19,6 @@ MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURR ALTER TABLE charainfosearch MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; -ALTER TABLE charaitemcrystal -MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; - -ALTER TABLE charaitemcurrency -MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; - ALTER TABLE charaitemgearset MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; From 320422cb6d6dc2537cb33724bfc748ccbc9872bd Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 23 Nov 2018 17:45:37 +1100 Subject: [PATCH 20/20] correctly check state when sending ward info --- src/servers/sapphire_zone/Zone/HousingMgr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/servers/sapphire_zone/Zone/HousingMgr.cpp b/src/servers/sapphire_zone/Zone/HousingMgr.cpp index e882eca1..c9d50ca0 100644 --- a/src/servers/sapphire_zone/Zone/HousingMgr.cpp +++ b/src/servers/sapphire_zone/Zone/HousingMgr.cpp @@ -240,8 +240,13 @@ void Core::HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, auto& entry = wardInfoPacket->data().houseInfoEntry[ i ]; + // retail always sends the house price in this packet, even after the house has been sold + // so I guess we do the same entry.housePrice = land->getCurrentPrice(); + if( land->getState() == Common::HouseState::forSale ) + continue; + switch( land->getLandType() ) { case LandType::FreeCompany: