From d4fe294f51617059f0fd07aea949d7c7b23b0c6c Mon Sep 17 00:00:00 2001 From: amibu Date: Thu, 5 Oct 2017 20:24:58 +0200 Subject: [PATCH 1/4] Add main handling for chara gear param state; --- sql/charadetail.sql | 1 + sql/update.sql | 4 +++- src/servers/Server_Common/Common.h | 2 +- .../Server_Common/Network/PacketDef/Ipcs.h | 4 ++++ .../Network/PacketDef/Zone/ServerZoneDef.h | 8 ++++++++ src/servers/Server_Zone/Actor/Player.cpp | 19 +++++++++++++++++++ src/servers/Server_Zone/Actor/Player.h | 6 ++++++ src/servers/Server_Zone/Actor/PlayerSql.cpp | 5 ++++- .../Server_Zone/Network/GameConnection.cpp | 3 ++- .../Server_Zone/Network/GameConnection.h | 4 ++-- .../Network/Handlers/PacketHandlers.cpp | 6 +++++- 11 files changed, 55 insertions(+), 7 deletions(-) diff --git a/sql/charadetail.sql b/sql/charadetail.sql index 05ed0de0..bdc00782 100644 --- a/sql/charadetail.sql +++ b/sql/charadetail.sql @@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS `charadetail` ( `StepIndex` int(5) DEFAULT NULL, `ChocoboTaxiStandFlags` binary(8) DEFAULT NULL, `GMRank` int(3) DEFAULT '0', + `CharaGearParamState` int(3) DEFAULT '0', `unlocks` binary(64) DEFAULT NULL, `CharacterId` int(20) NOT NULL DEFAULT '0', `IS_DELETE` int(3) DEFAULT '0', diff --git a/sql/update.sql b/sql/update.sql index 03b7679d..2111c70b 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -22,4 +22,6 @@ -- -- ALTER TABLE `charadetail` CHANGE `OpeningSequence` `OpeningSequence` INT(3) NULL DEFAULT '0'; -- ------------------------------------------- --- update.sql Before Merge into Other SQL's 30/08/2017 \ No newline at end of file +-- update.sql Before Merge into Other SQL's 30/08/2017 + +ALTER TABLE `charadetail` ADD `CharaGearParamState` int(3) DEFAULT '0' AFTER `GMRank`; \ No newline at end of file diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index dc4c5fff..f435f768 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -946,7 +946,7 @@ namespace Core { SetMaxGearSets = 0x230, - ToggleDisplayHeadAndWeapon = 0x260, + SetCharaGearParamUI = 0x260, GearSetEquipMsg = 0x321 }; diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index b4ade11c..1c186ff3 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -118,6 +118,8 @@ namespace Packets { EorzeaTimeOffset = 0x01B4, + CharaGearParams = 0x01C0, + CFAvailableContents = 0x01CF, PrepareZoning = 0x0239, // updated for sb @@ -185,6 +187,8 @@ namespace Packets { LinkshellEventHandler = 0x013B, LinkshellEventHandler1 = 0x013C, + + ReqCharaGearParamChange = 0x0143, }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index a9c5905f..dca98e03 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1286,6 +1286,14 @@ struct FFXIVIpcEorzeaTimeOffset : FFXIVIpcBasePacket uint64_t timestamp; }; +/** +* Structural representation of the packet sent by the server +* to set the gear show/hide status of a character +*/ +struct FFXIVIpcCharaGearParams : FFXIVIpcBasePacket +{ + uint8_t bitmask; +}; } /* Server */ diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index cd4b0c68..b422060d 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -388,6 +388,11 @@ void Core::Entity::Player::setZone( uint32_t zoneId ) sendInventory(); + if( isLogin() ) + { + queuePacket(ActorControlPacket143( getId(), SetCharaGearParamUI, m_charaGearParamState, 1 ) ); + } + // set flags, will be reset automatically by zoning ( only on client side though ) pPlayer->setStateFlag( PlayerStateFlag::BetweenAreas ); pPlayer->setStateFlag( PlayerStateFlag::BetweenAreas1 ); @@ -1421,6 +1426,20 @@ void Core::Entity::Player::setTitle( uint16_t titleId ) sendToInRangeSet( ActorControlPacket142( getId(), SetTitle, titleId ), true ); } +void Core::Entity::Player::setCharaGearParamState( uint8_t state ) +{ + m_charaGearParamState = state; + GamePacketNew< FFXIVIpcCharaGearParams, ServerZoneIpcType > paramPacket( getId() ); + paramPacket.data().bitmask = m_charaGearParamState; + sendToInRangeSet( paramPacket, true ); + setSyncFlag( PlayerSyncFlags::Status ); +} + +uint8_t Core::Entity::Player::getCharaGearParamState() const +{ + return m_charaGearParamState; +} + void Core::Entity::Player::autoAttack( ActorPtr pTarget ) { diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index f64c1d75..420f9a59 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -330,6 +330,10 @@ public: void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadoutTime = 0, uint16_t animation = 0 ); /*! change player's title */ void setTitle( uint16_t titleId ); + /*! change gear param state */ + void setCharaGearParamState( uint8_t state ); + /*! get gear param state and send update to inRangeSet */ + uint8_t getCharaGearParamState() const; void calculateStats() override; void sendStats(); @@ -602,6 +606,8 @@ private: uint8_t m_gmRank; uint16_t zoneId; + uint8_t m_charaGearParamState; + bool m_bInCombat; bool m_bLoadingComplete; bool m_bAutoattack; diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index 7d5db611..dbf5fee0 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -81,7 +81,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) "cd.GrandCompanyRank, " "cd.CFPenaltyUntil, " "cd.OpeningSequence, " - "cd.GMRank " + "cd.GMRank, " + "cd.CharaGearParamState " "FROM charabase AS c " " INNER JOIN charadetail AS cd " " ON c.CharacterId = cd.CharacterId " @@ -173,6 +174,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_openingSequence = field[36].get< uint32_t >(); m_gmRank = field[37].get< uint8_t >(); + m_charaGearParamState = field[38].get< uint8_t >(); m_pCell = nullptr; @@ -350,6 +352,7 @@ void Core::Entity::Player::createUpdateSql() charaBaseSet.insert( " ModelEquip = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_modelEquip ), 40 ) ) + "')" ); charaDetailSet.insert( " Class = " + std::to_string( static_cast< uint32_t >( getClass() ) ) ); charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) ); + charaDetailSet.insert( " CharaGearParamState = " + std::to_string( static_cast< uint8_t >( getCharaGearParamState() ) ) ); } if( m_updateFlags & PlayerSyncFlags::OpeningSeq ) diff --git a/src/servers/Server_Zone/Network/GameConnection.cpp b/src/servers/Server_Zone/Network/GameConnection.cpp index 0563b007..503b75dc 100644 --- a/src/servers/Server_Zone/Network/GameConnection.cpp +++ b/src/servers/Server_Zone/Network/GameConnection.cpp @@ -93,8 +93,9 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::CFRegisterRoulette, "CFRegisterRoulette", &GameConnection::cfRegisterRoulette ); setZoneHandler( ClientZoneIpcType::CFCommenceHandler, "CFDutyAccepted", &GameConnection::cfDutyAccepted); + setZoneHandler( ClientZoneIpcType::ReqCharaGearParamChange, "ReqCharaGearParamChange",&GameConnection::reqCharaGearParamHandler); - setChatHandler( ClientChatIpcType::TellReq, "TellReq", &GameConnection::tellHandler); + setChatHandler( ClientChatIpcType::TellReq, "TellReq", &GameConnection::tellHandler); } diff --git a/src/servers/Server_Zone/Network/GameConnection.h b/src/servers/Server_Zone/Network/GameConnection.h index d9156583..a1091b5f 100644 --- a/src/servers/Server_Zone/Network/GameConnection.h +++ b/src/servers/Server_Zone/Network/GameConnection.h @@ -116,10 +116,10 @@ public: DECLARE_HANDLER( gm1Handler ); DECLARE_HANDLER( gm2Handler ); + DECLARE_HANDLER( reqCharaGearParamHandler ); + DECLARE_HANDLER( tellHandler ); - - }; diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index 8a438e39..52851d94 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -285,7 +285,11 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa } - +void Core::Network::GameConnection::reqCharaGearParamHandler( const Packets::GamePacket& inPacket, + Entity::PlayerPtr pPlayer ) +{ + pPlayer->setCharaGearParamState( inPacket.getValAt< uint8_t >( 0x20 ) ); +} void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer ) From 6a3d5a151006a83532439a3344d5cb088e704c6f Mon Sep 17 00:00:00 2001 From: amibu Date: Thu, 5 Oct 2017 20:40:52 +0200 Subject: [PATCH 2/4] Enum in Common --- src/servers/Server_Common/Common.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index f435f768..41b70dc1 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -1056,6 +1056,15 @@ namespace Core { Unused100 }; + enum CharaGearParamValues : uint8_t + { + HideNothing = 0x0, + HideHead = 0x1, + HideWeapon = 0x2, + + Visor = 0x40, + }; + struct ServerEntry { uint32_t serverId; From a2522873d52aa50994b3e40480e5622011d47367 Mon Sep 17 00:00:00 2001 From: amibu Date: Fri, 6 Oct 2017 00:13:29 +0200 Subject: [PATCH 3/4] Redoing everything --- sql/charadetail.sql | 2 +- sql/update.sql | 2 +- src/servers/Server_Common/Common.h | 2 +- .../Server_Common/Network/PacketDef/Ipcs.h | 2 +- src/servers/Server_Zone/Actor/Actor.h | 10 ++++++++++ src/servers/Server_Zone/Actor/Player.cpp | 12 ++++++------ src/servers/Server_Zone/Actor/Player.h | 6 +++--- src/servers/Server_Zone/Actor/PlayerSql.cpp | 8 ++++---- .../DebugCommand/DebugCommandHandler.cpp | 8 +++++++- .../Server_Zone/Network/GameConnection.cpp | 12 ++++++++---- .../Server_Zone/Network/GameConnection.h | 2 +- .../Network/Handlers/PacketHandlers.cpp | 4 ++-- .../Network/PacketWrappers/PlayerSpawnPacket.h | 17 ++++++++++++++++- src/servers/Server_Zone/Session.cpp | 3 +++ 14 files changed, 64 insertions(+), 26 deletions(-) diff --git a/sql/charadetail.sql b/sql/charadetail.sql index bdc00782..2a47302c 100644 --- a/sql/charadetail.sql +++ b/sql/charadetail.sql @@ -70,7 +70,7 @@ CREATE TABLE IF NOT EXISTS `charadetail` ( `StepIndex` int(5) DEFAULT NULL, `ChocoboTaxiStandFlags` binary(8) DEFAULT NULL, `GMRank` int(3) DEFAULT '0', - `CharaGearParamState` int(3) DEFAULT '0', + `EquipDisplayFlags` int(3) DEFAULT '0', `unlocks` binary(64) DEFAULT NULL, `CharacterId` int(20) NOT NULL DEFAULT '0', `IS_DELETE` int(3) DEFAULT '0', diff --git a/sql/update.sql b/sql/update.sql index 2111c70b..c0f2ed69 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -24,4 +24,4 @@ -- ------------------------------------------- -- update.sql Before Merge into Other SQL's 30/08/2017 -ALTER TABLE `charadetail` ADD `CharaGearParamState` int(3) DEFAULT '0' AFTER `GMRank`; \ No newline at end of file +ALTER TABLE `charadetail` ADD `EquipDisplayFlags` int(3) DEFAULT '0' AFTER `GMRank`; \ No newline at end of file diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index 41b70dc1..12b97937 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -1056,7 +1056,7 @@ namespace Core { Unused100 }; - enum CharaGearParamValues : uint8_t + enum EquipDisplayFlags : uint8_t { HideNothing = 0x0, HideHead = 0x1, diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index 1c186ff3..fd5fdbd1 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -188,7 +188,7 @@ namespace Packets { LinkshellEventHandler = 0x013B, LinkshellEventHandler1 = 0x013C, - ReqCharaGearParamChange = 0x0143, + ReqEquipDisplayFlagsChange = 0x0143, }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/servers/Server_Zone/Actor/Actor.h b/src/servers/Server_Zone/Actor/Actor.h index 215ec666..5a784f28 100644 --- a/src/servers/Server_Zone/Actor/Actor.h +++ b/src/servers/Server_Zone/Actor/Actor.h @@ -43,6 +43,16 @@ public: Active = 1, }; + enum DisplayFlags : uint16_t + { + ActiveStance = 0x001, + Invisible = 0x020, + HideHead = 0x040, + HideWeapon = 0x080, + Faded = 0x100, + Visor = 0x800, + }; + enum struct ActorStatus : uint8_t { Idle = 0x01, diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index b422060d..2aa7e12e 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -390,7 +390,7 @@ void Core::Entity::Player::setZone( uint32_t zoneId ) if( isLogin() ) { - queuePacket(ActorControlPacket143( getId(), SetCharaGearParamUI, m_charaGearParamState, 1 ) ); + queuePacket(ActorControlPacket143( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) ); } // set flags, will be reset automatically by zoning ( only on client side though ) @@ -1426,18 +1426,18 @@ void Core::Entity::Player::setTitle( uint16_t titleId ) sendToInRangeSet( ActorControlPacket142( getId(), SetTitle, titleId ), true ); } -void Core::Entity::Player::setCharaGearParamState( uint8_t state ) +void Core::Entity::Player::setEquipDisplayFlags( uint8_t state ) { - m_charaGearParamState = state; + m_equipDisplayFlags = state; GamePacketNew< FFXIVIpcCharaGearParams, ServerZoneIpcType > paramPacket( getId() ); - paramPacket.data().bitmask = m_charaGearParamState; + paramPacket.data().bitmask = m_equipDisplayFlags; sendToInRangeSet( paramPacket, true ); setSyncFlag( PlayerSyncFlags::Status ); } -uint8_t Core::Entity::Player::getCharaGearParamState() const +uint8_t Core::Entity::Player::getEquipDisplayFlags() const { - return m_charaGearParamState; + return m_equipDisplayFlags; } void Core::Entity::Player::autoAttack( ActorPtr pTarget ) diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index 420f9a59..3f0a3451 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -331,9 +331,9 @@ public: /*! change player's title */ void setTitle( uint16_t titleId ); /*! change gear param state */ - void setCharaGearParamState( uint8_t state ); + void setEquipDisplayFlags( uint8_t state ); /*! get gear param state and send update to inRangeSet */ - uint8_t getCharaGearParamState() const; + uint8_t getEquipDisplayFlags() const; void calculateStats() override; void sendStats(); @@ -606,7 +606,7 @@ private: uint8_t m_gmRank; uint16_t zoneId; - uint8_t m_charaGearParamState; + uint8_t m_equipDisplayFlags; bool m_bInCombat; bool m_bLoadingComplete; diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index dbf5fee0..b99e9db2 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -82,7 +82,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) "cd.CFPenaltyUntil, " "cd.OpeningSequence, " "cd.GMRank, " - "cd.CharaGearParamState " + "cd.EquipDisplayFlags " "FROM charabase AS c " " INNER JOIN charadetail AS cd " " ON c.CharacterId = cd.CharacterId " @@ -90,7 +90,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) if( !pQR ) { - g_log.error( "Player id " + char_id_str + " does not exist!" ); + g_log.error( "[SQL] Failed loading Player ID " + char_id_str ); return false; } @@ -174,7 +174,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_openingSequence = field[36].get< uint32_t >(); m_gmRank = field[37].get< uint8_t >(); - m_charaGearParamState = field[38].get< uint8_t >(); + m_equipDisplayFlags = field[38].get< uint8_t >(); m_pCell = nullptr; @@ -352,7 +352,7 @@ void Core::Entity::Player::createUpdateSql() charaBaseSet.insert( " ModelEquip = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_modelEquip ), 40 ) ) + "')" ); charaDetailSet.insert( " Class = " + std::to_string( static_cast< uint32_t >( getClass() ) ) ); charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) ); - charaDetailSet.insert( " CharaGearParamState = " + std::to_string( static_cast< uint8_t >( getCharaGearParamState() ) ) ); + charaDetailSet.insert( " EquipDisplayFlags = " + std::to_string( static_cast< uint8_t >( getEquipDisplayFlags() ) ) ); } if( m_updateFlags & PlayerSyncFlags::OpeningSeq ) diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp index acfbad2c..ca594515 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -375,7 +375,13 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye } else { - pPlayer->sendUrgent( subCommand + " is not a valid ADD command." ); + int32_t opcode; + sscanf(params.c_str(), "%x", &opcode); + + Network::Packets::GamePacketNew paramPacket(pPlayer->getId()); + paramPacket.data().bitmask = opcode; + pPlayer->sendToInRangeSet(paramPacket, true); + pPlayer->sendUrgent( subCommand + " is not a valid ADD command." + std::to_string(opcode) ); } diff --git a/src/servers/Server_Zone/Network/GameConnection.cpp b/src/servers/Server_Zone/Network/GameConnection.cpp index 503b75dc..b46612a9 100644 --- a/src/servers/Server_Zone/Network/GameConnection.cpp +++ b/src/servers/Server_Zone/Network/GameConnection.cpp @@ -93,7 +93,7 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive, setZoneHandler( ClientZoneIpcType::CFRegisterRoulette, "CFRegisterRoulette", &GameConnection::cfRegisterRoulette ); setZoneHandler( ClientZoneIpcType::CFCommenceHandler, "CFDutyAccepted", &GameConnection::cfDutyAccepted); - setZoneHandler( ClientZoneIpcType::ReqCharaGearParamChange, "ReqCharaGearParamChange",&GameConnection::reqCharaGearParamHandler); + setZoneHandler( ClientZoneIpcType::ReqEquipDisplayFlagsChange, "ReqEquipDisplayFlagsChange",&GameConnection::reqEquipDisplayFlagsHandler); setChatHandler( ClientChatIpcType::TellReq, "TellReq", &GameConnection::tellHandler); @@ -117,7 +117,7 @@ void Core::Network::GameConnection::OnAccept( const std::string & host, uint16_t void Core::Network::GameConnection::OnDisconnect() { - g_log.debug( "DISCONNECT" ); + g_log.debug( "GameConnection DISCONNECT" ); m_pSession = nullptr; } @@ -168,7 +168,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer ) void Core::Network::GameConnection::OnError( const boost::system::error_code & error ) { - g_log.debug( "ERROR" ); + g_log.debug( "GameConnection ERROR: " + error.message() ); } void Core::Network::GameConnection::queueInPacket( Core::Network::Packets::GamePacketPtr inPacket ) @@ -381,7 +381,11 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: { g_log.info( "[" + std::string( id ) + "] Session not registered, creating" ); // return; - g_serverZone.createSession( playerId ); + if( !g_serverZone.createSession( playerId ) ) + { + Disconnect(); + return; + } session = g_serverZone.getSession( playerId ); } diff --git a/src/servers/Server_Zone/Network/GameConnection.h b/src/servers/Server_Zone/Network/GameConnection.h index a1091b5f..d89ae491 100644 --- a/src/servers/Server_Zone/Network/GameConnection.h +++ b/src/servers/Server_Zone/Network/GameConnection.h @@ -116,7 +116,7 @@ public: DECLARE_HANDLER( gm1Handler ); DECLARE_HANDLER( gm2Handler ); - DECLARE_HANDLER( reqCharaGearParamHandler ); + DECLARE_HANDLER( reqEquipDisplayFlagsHandler ); DECLARE_HANDLER( tellHandler ); diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index 52851d94..fc8add9f 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -285,10 +285,10 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa } -void Core::Network::GameConnection::reqCharaGearParamHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::reqEquipDisplayFlagsHandler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer ) { - pPlayer->setCharaGearParamState( inPacket.getValAt< uint8_t >( 0x20 ) ); + pPlayer->setEquipDisplayFlags( inPacket.getValAt< uint8_t >( 0x20 ) ); } void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& inPacket, diff --git a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h index c4be1206..00540d78 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -85,7 +85,22 @@ namespace Server { if( pPlayer->getZoningType() != Common::ZoneingType::None ) { - m_data.displayFlags |= 0x20; + m_data.displayFlags |= Entity::Actor::DisplayFlags::Invisible; + } + + if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideHead ) + { + m_data.displayFlags |= Entity::Actor::DisplayFlags::HideHead; + } + + if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideWeapon ) + { + m_data.displayFlags |= Entity::Actor::DisplayFlags::HideWeapon; + } + + if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::Visor ) + { + m_data.displayFlags |= Entity::Actor::DisplayFlags::Visor; } m_data.targetId = pPlayer->getTargetId(); diff --git a/src/servers/Server_Zone/Session.cpp b/src/servers/Server_Zone/Session.cpp index 5754e2eb..a5dbb463 100644 --- a/src/servers/Server_Zone/Session.cpp +++ b/src/servers/Server_Zone/Session.cpp @@ -61,6 +61,9 @@ void Core::Session::close() if( m_pZoneConnection ) m_pZoneConnection->Disconnect(); + if( m_pChatConnection ) + m_pChatConnection->Disconnect(); + // remove the session from the player if( m_pPlayer ) // reset the zone, so the zone handler knows to remove the actor From 3a6906cbc2a169de193a442d88040dd82b36d585 Mon Sep 17 00:00:00 2001 From: amibu Date: Fri, 6 Oct 2017 00:22:08 +0200 Subject: [PATCH 4/4] Stuff I forgot --- src/servers/Server_Common/Network/PacketDef/Ipcs.h | 2 +- .../Server_Common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- src/servers/Server_Zone/Actor/Player.cpp | 2 +- src/servers/Server_Zone/Actor/PlayerSql.cpp | 2 +- .../Server_Zone/DebugCommand/DebugCommandHandler.cpp | 8 +------- 5 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index fd5fdbd1..3ee418d8 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -118,7 +118,7 @@ namespace Packets { EorzeaTimeOffset = 0x01B4, - CharaGearParams = 0x01C0, + EquipDisplayFlags = 0x01C0, CFAvailableContents = 0x01CF, diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index dca98e03..9726addf 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1290,7 +1290,7 @@ struct FFXIVIpcEorzeaTimeOffset : FFXIVIpcBasePacket * Structural representation of the packet sent by the server * to set the gear show/hide status of a character */ -struct FFXIVIpcCharaGearParams : FFXIVIpcBasePacket +struct FFXIVIpcEquipDisplayFlags : FFXIVIpcBasePacket { uint8_t bitmask; }; diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index 2aa7e12e..e407b214 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1429,7 +1429,7 @@ void Core::Entity::Player::setTitle( uint16_t titleId ) void Core::Entity::Player::setEquipDisplayFlags( uint8_t state ) { m_equipDisplayFlags = state; - GamePacketNew< FFXIVIpcCharaGearParams, ServerZoneIpcType > paramPacket( getId() ); + GamePacketNew< FFXIVIpcEquipDisplayFlags, ServerZoneIpcType > paramPacket( getId() ); paramPacket.data().bitmask = m_equipDisplayFlags; sendToInRangeSet( paramPacket, true ); setSyncFlag( PlayerSyncFlags::Status ); diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index b99e9db2..d8cf4194 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -90,7 +90,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) if( !pQR ) { - g_log.error( "[SQL] Failed loading Player ID " + char_id_str ); + g_log.error( "[DB] Failed loading Player ID " + char_id_str ); return false; } diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp index ca594515..acfbad2c 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -375,13 +375,7 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye } else { - int32_t opcode; - sscanf(params.c_str(), "%x", &opcode); - - Network::Packets::GamePacketNew paramPacket(pPlayer->getId()); - paramPacket.data().bitmask = opcode; - pPlayer->sendToInRangeSet(paramPacket, true); - pPlayer->sendUrgent( subCommand + " is not a valid ADD command." + std::to_string(opcode) ); + pPlayer->sendUrgent( subCommand + " is not a valid ADD command." ); }