1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00

Merge pull request #934 from lmcintyre/Sapphire_Retail

Update for 6.38
This commit is contained in:
Mordred 2023-05-11 16:43:21 +02:00 committed by GitHub
commit cac8e72f33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 126 additions and 51 deletions

View file

@ -4,6 +4,7 @@
extern "C" intptr_t __stdcall OodleNetwork1_Shared_Size( int32_t htbits );
extern "C" intptr_t __stdcall OodleNetwork1UDP_State_Size();
extern "C" intptr_t __stdcall OodleNetwork1TCP_State_Size();
extern "C" void __stdcall OodleNetwork1_Shared_SetWindow(
void* shared,
@ -20,6 +21,14 @@ extern "C" void __stdcall OodleNetwork1UDP_Train(
int32_t numTrainingPackets
);
extern "C" void __stdcall OodleNetwork1TCP_Train(
void* state,
const void* shared,
const void** trainingPacketPointers,
const int32_t* trainingPacketSizes,
int32_t numTrainingPackets
);
extern "C" bool __stdcall OodleNetwork1UDP_Decode(
void* state,
const void* shared,
@ -29,4 +38,29 @@ extern "C" bool __stdcall OodleNetwork1UDP_Decode(
intptr_t decSize
);
extern "C" bool __stdcall OodleNetwork1TCP_Decode(
void* state,
const void* shared,
const void* enc,
intptr_t encSize,
void* dec,
intptr_t decSize
);
extern "C" intptr_t __stdcall OodleNetwork1UDP_Encode(
void* state,
const void* shared,
const void* dec,
intptr_t decSize,
void* enc
);
extern "C" intptr_t __stdcall OodleNetwork1TCP_Encode(
void* state,
const void* shared,
const void* dec,
intptr_t decSize,
void* enc
);
#endif

View file

@ -783,9 +783,9 @@ namespace Sapphire::Common {
Polarization3 = 154,
Polarization4 = 155,
Projection = 156,
Pandæmonium = 157,
Pandæmonium1 = 158,
Pandæmonium2 = 159,
Pandaemonium = 157,
Pandaemonium1 = 158,
Pandaemonium2 = 159,
Ultimatum = 160,
Inevitability = 161,
Transcendence = 162,
@ -817,7 +817,7 @@ namespace Sapphire::Common {
Tavern = 5,
Eatery = 6,
ImmersiveExperience = 7,
Café = 8,
Cafe = 8,
Aquarium = 9,
Sanctum = 10,
Venue = 11,

View file

@ -2,6 +2,7 @@
#define COMMON_FORWARDS_H
#include <memory>
#include "Network/Oodle.h"
namespace Sapphire
{
@ -23,6 +24,7 @@ namespace Sapphire::Network
using HivePtr = std::shared_ptr< Hive >;
using AcceptorPtr = std::shared_ptr< Acceptor >;
using ConnectionPtr = std::shared_ptr< Connection >;
using OodlePtr = std::unique_ptr< Network::Oodle >;
}
namespace Sapphire::Network::Packets

View file

@ -48,7 +48,8 @@ PacketParseResult Network::Packets::getSegmentHeader( const std::vector< uint8_t
PacketParseResult Network::Packets::getPackets( const std::vector< uint8_t >& buffer,
const uint32_t offset,
const FFXIVARR_PACKET_HEADER& packetHeader,
std::vector< FFXIVARR_PACKET_RAW >& packets )
std::vector< FFXIVARR_PACKET_RAW >& packets,
Network::Oodle* oodle)
{
// sanity check: check there's enough bytes in the buffer
auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER );
@ -60,14 +61,19 @@ PacketParseResult Network::Packets::getPackets( const std::vector< uint8_t >& bu
// check compression, do decompress if Oodle/Zlib
if( packetHeader.compressionType == Oodle )
{
if( oodle == nullptr )
{
Logger::warn( "Oodle compression type was specified, but no Oodle decompressor was supplied for this connection." );
return Malformed;
}
std::vector< uint8_t > inBuf;
inBuf.assign( buffer.begin() + sizeof( struct FFXIVARR_PACKET_HEADER ), buffer.end() );
std::vector< uint8_t > outBuf;
outBuf.resize( packetHeader.oodleDecompressedSize );
auto _oodle = Network::Oodle();
bool oodleSuccess = _oodle.oodleDecode( inBuf, bytesExpected, outBuf, packetHeader.oodleDecompressedSize );
bool oodleSuccess = oodle->oodleDecode( inBuf, bytesExpected, outBuf, packetHeader.oodleDecompressedSize );
if( !oodleSuccess )
{

View file

@ -2,6 +2,7 @@
#define _GAMEPACKETPARSER_H
#include "CommonNetwork.h"
#include "Oodle.h"
namespace Sapphire::Network::Packets
{
@ -40,7 +41,8 @@ namespace Sapphire::Network::Packets
/// Buffer with given offset must be pointing to end of FFXIVARR_PACKET_HEADER data.
PacketParseResult getPackets( const std::vector< uint8_t >& buffer, const uint32_t offset,
const FFXIVARR_PACKET_HEADER& header,
std::vector< Packets::FFXIVARR_PACKET_RAW >& packets );
std::vector< Packets::FFXIVARR_PACKET_RAW >& packets,
Network::Oodle* oodle);
/// Read single packet from the buffer with given offset.
/// Buffer with an offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data.

View file

@ -3,14 +3,14 @@
using namespace Sapphire;
Network::Oodle::Oodle() :
m_htbits(19)
m_htbits(17)
{
auto stateSize = OodleNetwork1UDP_State_Size();
auto stateSize = OodleNetwork1TCP_State_Size();
auto sharedSize = OodleNetwork1_Shared_Size( m_htbits );
m_state = std::vector< uint8_t >( stateSize, 0 );
m_shared = std::vector< uint8_t >( sharedSize, 0 );
m_window = std::vector< uint8_t >( 0x8000, 0 );
m_window = std::vector< uint8_t >( 0x100000, 0 );
oodleInit();
}
@ -18,10 +18,15 @@ Network::Oodle::Oodle() :
void Network::Oodle::oodleInit()
{
OodleNetwork1_Shared_SetWindow( &m_shared[0], m_htbits, &m_window[0], (int) m_window.size() );
OodleNetwork1UDP_Train( &m_state[0], &m_shared[0], nullptr, nullptr, 0 );
OodleNetwork1TCP_Train( &m_state[0], &m_shared[0], nullptr, nullptr, 0 );
}
bool Network::Oodle::oodleDecode( const std::vector< uint8_t > &enc, uint32_t encSize, std::vector< uint8_t > &dec, uint32_t decSize )
{
return OodleNetwork1UDP_Decode( &m_state[0], &m_shared[0], &enc[0], encSize, &dec[0], decSize );
return OodleNetwork1TCP_Decode( &m_state[0], &m_shared[0], &enc[0], encSize, &dec[0], decSize );
}
intptr_t Network::Oodle::oodleEncode( const std::vector< uint8_t > &dec, uint32_t decSize, std::vector< uint8_t > &enc )
{
return OodleNetwork1TCP_Encode( &m_state[0], &m_shared[0], &dec[0], decSize, &enc[0] );
}

View file

@ -22,6 +22,7 @@ namespace Sapphire::Network
void oodleInit();
bool oodleDecode( const std::vector< uint8_t > &enc, uint32_t encSize, std::vector< uint8_t > &dec, uint32_t decSize );
intptr_t oodleEncode( const std::vector< uint8_t > &raw, uint32_t rawSize, std::vector< uint8_t > &enc );
};
}

View file

@ -2,6 +2,7 @@
#include "Util/Util.h"
#include "Common.h"
#include "Forwards.h"
#include "GamePacketParser.h"
#include <chrono>
#include <string.h>
@ -30,21 +31,11 @@ void Network::Packets::PacketContainer::addPacket( Network::Packets::FFXIVPacket
m_ipcHdr.count++;
}
void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer )
void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer, Network::Oodle* oodle )
{
std::vector< uint8_t > tempBuffer( m_ipcHdr.size );
memset( &tempBuffer[ 0 ], 0, m_ipcHdr.size );
using namespace std::chrono;
auto ms = duration_cast< milliseconds >( system_clock::now().time_since_epoch() );
uint64_t tick = ms.count();
m_ipcHdr.unknown_0 = 0xE2465DFF41a05252;
m_ipcHdr.unknown_8 = 0x75C4997B4D642A7F;
m_ipcHdr.timestamp = tick;
m_ipcHdr.unknown_20 = 1;
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
auto it = m_entryList.begin();
std::size_t offset = 0;
@ -65,15 +56,45 @@ void Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >&
offset += pPacket->getSize();
}
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
// oodle is always nullptr, but i guess this is here if we ever want to encode like retail
if ( oodle != nullptr )
{
std::vector< uint8_t > inBuf;
inBuf.assign( tempBuffer.begin() + sizeof( struct FFXIVARR_PACKET_HEADER ), tempBuffer.end() );
std::vector< uint8_t > outBuf;
outBuf.resize( m_ipcHdr.size );
auto compLen = oodle->oodleEncode(inBuf, inBuf.size(), outBuf);
// Check if we compressed at all
if (compLen != m_ipcHdr.size) {
tempBuffer.resize(compLen);
memcpy(&inBuf[0], &outBuf[0], compLen);
m_ipcHdr.oodleDecompressedSize = m_ipcHdr.size;
m_ipcHdr.size = compLen;
m_ipcHdr.compressionType = static_cast< uint8_t >(Packets::CompressionType::Oodle);
}
}
using namespace std::chrono;
auto ms = duration_cast< milliseconds >( system_clock::now().time_since_epoch() );
uint64_t tick = ms.count();
m_ipcHdr.unknown_0 = 0xE2465DFF41a05252;
m_ipcHdr.unknown_8 = 0x75C4997B4D642A7F;
m_ipcHdr.timestamp = tick;
m_ipcHdr.unknown_20 = 1;
memcpy( &tempBuffer[ 0 ], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) );
sendBuffer.assign( &tempBuffer[ 0 ], &tempBuffer[ 0 ] + m_ipcHdr.size );
}
std::string Network::Packets::PacketContainer::toString()
{
std::vector< uint8_t > tmpBuffer;
fillSendBuffer( tmpBuffer );
fillSendBuffer( tmpBuffer, nullptr );
std::string str = "\n";
for( uint32_t i = 0; i < m_ipcHdr.size; i++ )

View file

@ -7,6 +7,7 @@
#include "CommonNetwork.h"
#include "GamePacket.h"
#include "Forwards.h"
#include "Oodle.h"
namespace Sapphire::Network::Packets
{
@ -27,7 +28,7 @@ namespace Sapphire::Network::Packets
std::string toString();
void fillSendBuffer( std::vector< uint8_t >& sendBuffer );
void fillSendBuffer( std::vector< uint8_t >& sendBuffer, Network::Oodle* oodle );
private:
uint32_t m_segmentTargetOverride;

View file

@ -337,10 +337,10 @@ namespace Sapphire::Network::Packets
*/
enum ClientZoneIpcType : uint16_t
{
PingHandler = 0x0273, // updated 6.31h
InitHandler = 0x03a8, // updated 6.31h
PingHandler = 0x032A, // updated 6.38
InitHandler = 0x0090, // updated 6.38
FinishLoadingHandler = 0x032d, // updated 6.31h
FinishLoadingHandler = 0x037B, // updated 6.38
CFCommenceHandler = 0x0381, // updated 5.58h
@ -348,7 +348,7 @@ namespace Sapphire::Network::Packets
CFRegisterDuty = 0x01BD, // updated 5.58h
CFRegisterRoulette = 0x037A, // updated 5.58h
PlayTimeHandler = 0x02B7, // updated 5.58h
LogoutHandler = 0x0387, // updated 6.31h
LogoutHandler = 0x02E5, // updated 6.38
CancelLogout = 0x01e3, // updated 6.31h
CFDutyInfoHandler = 0xF078, // updated 4.2
@ -356,7 +356,7 @@ namespace Sapphire::Network::Packets
SocialResponseHandler = 0x023B, // updated 5.58h
CreateCrossWorldLS = 0x035D, // updated 5.58h
ChatHandler = 0x00f1, // Updated 6.31h
ChatHandler = 0x01F2, // Updated 6.38
PartyChatHandler = 0x0065,
PartySetLeaderHandler = 0x036C, // updated 5.58h
LeavePartyHandler = 0x019D, // updated 5.58h
@ -364,7 +364,7 @@ namespace Sapphire::Network::Packets
DisbandPartyHandler = 0x0276, // updated 5.58h
SocialListHandler = 0x0200, // updated 6.31
SetSearchInfoHandler = 0x0368, // updated 6.31h
SetSearchInfoHandler = 0x0165, // updated 6.38
ReqSearchInfoHandler = 0x03b0, // updated 6.31h
ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0
@ -377,8 +377,9 @@ namespace Sapphire::Network::Packets
MarketBoardRequestItemListingInfo = 0x00F4, // updated 5.58h
MarketBoardRequestItemListings = 0x0122, // updated 5.58h
MarketBoardSearch = 0x0082, // updated 5.58h
MarketBoardPurchaseHandler = 0x0397, // updated 6.38
ReqExamineFcInfo = 0x037B, // updated 5.58h
ReqExamineFcInfo = 0xF37B, // updated 5.58h (prepended F. Conflicts with FinishLoadingHandler 6.38)
FcInfoReqHandler = 0x9999, // unknown
@ -392,33 +393,31 @@ namespace Sapphire::Network::Packets
ReqCountdownCancel = 0x023a, // updated 6.31h
ZoneLineHandler = 0x00ce, // updated 6.31h
ClientTrigger = 0x0244, // updated 6.31h
ClientTrigger = 0x01BE, // updated 6.38
DiscoveryHandler = 0x038B, // updated 5.58h
PlaceFieldMarkerPreset = 0x204, // updated 6.30h
PlaceFieldMarker = 0x38e, // updated 6.30h
SkillHandler = 0x0133, // updated 6.31h
GMCommand1 = 0x0278, // updated 6.31h
GMCommand2 = 0x03d8, // updated 6.31h
GMCommand1 = 0x0273, // updated 6.38
GMCommand2 = 0x0328, // updated 6.38
AoESkillHandler = 0x0152, // updated 5.58h
UpdatePositionHandler = 0x01f7, // updated 6.31h
UpdatePositionHandler = 0x025F, // updated 6.38
InventoryModifyHandler = 0x01a2, // updated 6.31h
InventoryModifyHandler = 0x024D, // updated 6.38
InventoryEquipRecommendedItems = 0x01C9, // updated 5.58h
ReqPlaceHousingItem = 0x02D4, // updated 5.58h
BuildPresetHandler = 0x0223, // updated 5.58h
TalkEventHandler = 0x0205, // updated 6.31h
TalkEventHandler = 0x02C4, // updated 6.38
EmoteEventHandler = 0x00B0, // updated 5.58h
WithinRangeEventHandler = 0x02B6, // updated 5.58h
OutOfRangeEventHandler = 0x00b4, // updated 6.31h
EnterTeriEventHandler = 0x014e, // updated 6.31h
EnterTeriEventHandler = 0x018F, // updated 6.38
ShopEventHandler = 0x0384, // updated 5.58h
ReturnEventHandler = 0x0119, // updated 6.31h
TradeReturnEventHandler = 0x0100, // updated 6.31h
ReturnEventHandler = 0x0268, // updated 6.38
TradeReturnEventHandler = 0x00FB, // updated 6.38
TradeReturnEventHandler2 = 0x023C, // updated 5.58h
EventYield2Handler = 0x021D, // updated 5.58h
EventYield16Handler = 0x0207, // updated 5.58h
@ -436,7 +435,7 @@ namespace Sapphire::Network::Packets
SetSharedEstateSettings = 0x00D2, // updated 5.58h
UpdatePositionInstance = 0x03bd, // Updated 6.31h
UpdatePositionInstance = 0x01A0, // Updated 6.38
PerformNoteHandler = 0x0243, // updated 5.58h
@ -452,7 +451,7 @@ namespace Sapphire::Network::Packets
enum ServerChatIpcType : uint16_t
{
Tell = 0x0064, // updated for sb
PublicContentTell = 0x00FB, // added 4.5, this is used when receiving a /tell in PublicContent instances such as Eureka or Bozja
PublicContentTell = 0xF0FB, // added 4.5, this is used when receiving a /tell in PublicContent instances such as Eureka or Bozja (prepended F conflicts with TradeReturnEventHandler 6.38)
TellErrNotFound = 0x0066,
FreeCompanyEvent = 0x012C, // added 5.0

View file

@ -73,7 +73,7 @@ void Lobby::GameConnection::onRecv( std::vector< uint8_t >& buffer )
// Dissect packet list
std::vector< FFXIVARR_PACKET_RAW > packetList;
const auto packetResult = getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ),
packetHeader, packetList );
packetHeader, packetList, nullptr );
if( packetResult == Incomplete )
return;
@ -433,7 +433,7 @@ void Lobby::GameConnection::sendPackets( Network::Packets::PacketContainer* pPac
{
std::vector< uint8_t > sendBuffer;
pPacket->fillSendBuffer( sendBuffer );
pPacket->fillSendBuffer( sendBuffer, nullptr );
send( sendBuffer );
}

View file

@ -42,6 +42,8 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH
m_chatHandlerStrMap[ opcode ] = handlerName;
};
m_pOodle = std::make_unique<Oodle>();
setZoneHandler( ClientZoneIpcType::PingHandler, "PingHandler", &GameConnection::pingHandler );
setZoneHandler( ClientZoneIpcType::InitHandler, "InitHandler", &GameConnection::initHandler );
setZoneHandler( ClientZoneIpcType::ChatHandler, "ChatHandler", &GameConnection::chatHandler );
@ -182,7 +184,7 @@ void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer )
// Dissect packet list
std::vector< Packets::FFXIVARR_PACKET_RAW > packetList;
const auto packetResult = Packets::getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ),
packetHeader, packetList );
packetHeader, packetList, m_pOodle.get());
if( packetResult == Incomplete )
return;
@ -284,7 +286,7 @@ void Sapphire::Network::GameConnection::sendPackets( Packets::PacketContainer* p
{
std::vector< uint8_t > sendBuffer;
pPacket->fillSendBuffer( sendBuffer );
pPacket->fillSendBuffer( sendBuffer, nullptr);
send( sendBuffer );
}

View file

@ -8,6 +8,7 @@
#include <map>
#include "ForwardsZone.h"
#include "Network/Oodle.h"
#define DECLARE_HANDLER( x ) void x( const Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
@ -53,6 +54,7 @@ namespace Sapphire::Network
Common::Util::LockedQueue< Network::Packets::FFXIVARR_PACKET_RAW > m_inQueue;
Common::Util::LockedQueue< Packets::FFXIVPacketBasePtr > m_outQueue;
std::vector< uint8_t > m_packets;
OodlePtr m_pOodle;
public:
ConnectionType m_conType;