1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-06 02:37:47 +00:00

Merge branch '6.31_Hotfix_Windows' (from unofficial forks) into Sapphire6.31

You can login to current retail (6.31 Hotfix) but also requires some new
fanagling with oodle.
This commit is contained in:
Rey 2023-03-02 10:50:31 -06:00
commit 6ff45f7c5d
27 changed files with 5570 additions and 1920 deletions

View file

@ -15,6 +15,7 @@ add_custom_target( copy_runtime_files ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/web ${CMAKE_BINARY_DIR}/bin/web
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/sql_import.sh ${CMAKE_BINARY_DIR}/bin/sql_import.sh
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/bin/data/actions
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/deps/oo2net_9_win64.dll ${CMAKE_BINARY_DIR}/bin/oo2net_9_win64.dll
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/deps/ffxiv-actions/actions ${CMAKE_BINARY_DIR}/bin/data/actions )
######################################
@ -43,6 +44,7 @@ find_package( MySQL )
##############################
add_subdirectory( "deps/zlib" )
add_subdirectory( "deps/MySQL" )
add_subdirectory( "deps/Oodle" )
add_subdirectory( "deps/datReader" )
add_subdirectory( "deps/mysqlConnector" )
add_subdirectory( "deps/recastnavigation" )

9
deps/Oodle/CMakeLists.txt vendored Normal file
View file

@ -0,0 +1,9 @@
add_library(OodleNet STATIC IMPORTED GLOBAL)
set_target_properties(
OodleNet
PROPERTIES
IMPORTED_IMPLIB "${CMAKE_SOURCE_DIR}/deps/Oodle/oo2net_9_win64.lib"
IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/deps/Oodle/oo2net_9_win64.lib"
LINKER_LANGUAGE C
)

32
deps/Oodle/oodle2net.h vendored Normal file
View file

@ -0,0 +1,32 @@
#ifndef __OODLE2NET_H__
#define __OODLE2NET_H__
extern "C" intptr_t __stdcall OodleNetwork1_Shared_Size( int32_t htbits );
extern "C" intptr_t __stdcall OodleNetwork1UDP_State_Size();
extern "C" void __stdcall OodleNetwork1_Shared_SetWindow(
void* shared,
int32_t htbits,
const void* window,
int32_t windowSize
);
extern "C" void __stdcall OodleNetwork1UDP_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,
const void* enc,
intptr_t encSize,
void* dec,
intptr_t decSize
);
#endif

View file

@ -3,11 +3,8 @@
#include "Statement.h"
#include "PreparedStatement.h"
#include <mysql.h>
#include <stdexcept>
#ifdef _MSC_VER
// fixes compile error when compiling with vs2019
#include <stdexcept>
#endif
#include <vector>
Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase,

View file

@ -87,6 +87,9 @@ std::string PlayerMinimal::getInfoJson()
// DisplayName
c.push_back( getName() );
// Unknown
c.push_back( "36" );
// class levels
auto levelsArray = nlohmann::json();
for( int i = 0; i < Common::CLASSJOB_SLOTS; ++i )

View file

@ -20,7 +20,8 @@ target_link_libraries( common
PUBLIC
xivdat
mysqlConnector
mysql )
mysql
OodleNet )
if( UNIX )
target_link_libraries( common
PUBLIC
@ -32,6 +33,7 @@ target_include_directories( common
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/Oodle/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/asio/asio/include/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/spdlog/include/" )

View file

@ -22,20 +22,21 @@ namespace Sapphire::Common
const int32_t INVALID_GAME_OBJECT_ID = 0xE0000000;
const uint64_t INVALID_GAME_OBJECT_ID64 = 0xE0000000;
const uint16_t MAX_PLAYER_LEVEL = 80;
const uint8_t CURRENT_EXPANSION_ID = 3;
const uint16_t MAX_PLAYER_LEVEL = 90;
const uint8_t CURRENT_EXPANSION_ID = 4;
const uint8_t CLASSJOB_TOTAL = 38;
const uint8_t CLASSJOB_TOTAL = 40;
const uint8_t CLASSJOB_SLOTS = 30;
const uint8_t TOWN_COUNT = 6;
const uint8_t TOWN_COUNT = 7;
/*!
* @brief The maximum length (in ms) of a combo before it is canceled/voided.
*
* The client has a combo timer of about 12 seconds, with a 0.5 second grace on top for latency considerations.
* Changed to 15 seconds in Shadowbringers, then 30 seconds in Endwalker.
*/
const uint16_t MAX_COMBO_LENGTH = 12500;
const uint16_t MAX_COMBO_LENGTH = 30000;
struct FFXIVARR_POSITION3_U16
{

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -44,7 +44,7 @@ namespace Sapphire::Network::Packets
* +-------------------------------+---------------+-------+-------+
* | timestamp | size | cType | count |
* +---+---+-------+---------------+---------------+-------+-------+
* | ? |CMP| ? | ? |
* | ? |CMP| ? | oodleDcmpSize |
* +---+---+-------+---------------+
* (followed by /count/ FFXIVARR_PACKET_SEGMENTs)
*/
@ -62,9 +62,13 @@ namespace Sapphire::Network::Packets
/** The number of packet segments that follow. */
uint16_t count;
uint8_t unknown_20;
/** Indicates if the data segments of this packet are compressed. */
uint8_t isCompressed;
uint32_t unknown_24;
/** Indicates compression method of the data segments of this packet.
* 0: none, 1: Zlib, 2: Oodle
*/
uint8_t compressionType;
uint16_t unknown_22;
/** The size of the packet payload when decompressed, only used if compressionType = Oodle */
uint32_t oodleDecompressedSize;
};
inline std::ostream& operator<<( std::ostream& os, const FFXIVARR_PACKET_HEADER& hdr )

View file

@ -1,7 +1,9 @@
#include "CommonNetwork.h"
#include "GamePacketParser.h"
#include "Oodle.h"
#include <string.h> // memcpy
#include <Logging/Logger.h>
using namespace Sapphire;
using namespace Sapphire::Network::Packets;
@ -49,10 +51,51 @@ PacketParseResult Network::Packets::getPackets( const std::vector< uint8_t >& bu
std::vector< FFXIVARR_PACKET_RAW >& packets )
{
// sanity check: check there's enough bytes in the buffer
const auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER );
auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER );
if( buffer.size() - offset < bytesExpected )
return Incomplete;
std::vector< uint8_t > decompBuf;
// check compression, do decompress if Oodle/Zlib
if( packetHeader.compressionType == Oodle )
{
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 );
if( !oodleSuccess )
{
Logger::warn( "Oodle decompression failed." );
return Malformed;
}
bytesExpected = packetHeader.oodleDecompressedSize;
decompBuf.assign( buffer.begin(), buffer.begin() + sizeof( struct FFXIVARR_PACKET_HEADER ) );
decompBuf.insert( decompBuf.end(), outBuf.begin(), outBuf.end() );
}
else if( packetHeader.compressionType == Zlib )
{
// to do(?): Zlib decompression should go here,
// but I don't think the client ever sends Zlib packets? So it may not be needed
}
else if( packetHeader.compressionType == NoCompression )
decompBuf.assign( buffer.begin(), buffer.end() );
else
{
Logger::warn( "Unknown packet compression type: {}", packetHeader.compressionType );
return Malformed;
}
// Loop each message
uint32_t count = 0;
uint32_t bytesProcessed = 0;
@ -61,7 +104,7 @@ PacketParseResult Network::Packets::getPackets( const std::vector< uint8_t >& bu
FFXIVARR_PACKET_RAW rawPacket;
// Copy ipc packet message
const auto packetResult = getPacket( buffer, offset + bytesProcessed, rawPacket );
const auto packetResult = getPacket( decompBuf, offset + bytesProcessed, rawPacket );
if( packetResult != Success )
return packetResult;

View file

@ -18,6 +18,13 @@ namespace Sapphire::Network::Packets
Malformed
};
enum CompressionType
{
NoCompression,
Zlib,
Oodle,
};
/// Read packet header from buffer with given offset.
/// Buffer with given offset must be pointing to start of the new FFXIV packet.
PacketParseResult getHeader( const std::vector< uint8_t >& buffer, const uint32_t offset,

View file

@ -0,0 +1,27 @@
#include "Oodle.h"
using namespace Sapphire;
Network::Oodle::Oodle() :
m_htbits(19)
{
auto stateSize = OodleNetwork1UDP_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 );
oodleInit();
}
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 );
}
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 );
}

View file

@ -0,0 +1,28 @@
#ifndef _OODLE_H
#define _OODLE_H
#include <vector>
#include <oodle2net.h>
namespace Sapphire::Network
{
class Oodle
{
private:
std::vector< uint8_t > m_state;
std::vector< uint8_t > m_shared;
std::vector< uint8_t > m_window;
int m_htbits;
public:
Oodle();
virtual ~Oodle() = default;
void oodleInit();
bool oodleDecode( const std::vector< uint8_t > &enc, uint32_t encSize, std::vector< uint8_t > &dec, uint32_t decSize );
};
}
#endif // _OODLE_H

View file

@ -9,8 +9,8 @@ namespace Sapphire::Network::Packets
////////////////////////////////////////////////////////////////////////////////
/// Lobby Connection IPC Codes
/**
* Server IPC Lobby Type Codes.
*/
* Server IPC Lobby Type Codes.
*/
enum ServerLobbyIpcType : uint16_t
{
LobbyError = 0x0002,
@ -24,8 +24,8 @@ namespace Sapphire::Network::Packets
};
/**
* Client IPC Lobby Type Codes.
*/
* Client IPC Lobby Type Codes.
*/
enum ClientLobbyIpcType : uint16_t
{
ReqCharList = 0x0003,
@ -39,400 +39,415 @@ namespace Sapphire::Network::Packets
////////////////////////////////////////////////////////////////////////////////
/// Zone Connection IPC Codes
/**
* Server IPC Zone Type Codes.
*/
* Server IPC Zone Type Codes.
*/
enum ServerZoneIpcType : uint16_t
{
Ping = 0x02A8, // updated 5.58 hotfix
Init = 0x013C, // updated 5.58 hotfix
Ping = 0x020a, // updated 6.31h
Init = 0x032d, // updated 6.31h
ActorFreeSpawn = 0x00B5, // updated 5.58 hotfix
InitZone = 0x0320, // updated 5.58 hotfix
ActorFreeSpawn = 0x282, // updated 6.31h
EffectResult = 0x0387, // updated 5.58 hotfix
ActorControl = 0x00B0, // updated 5.58 hotfix
ActorControlSelf = 0x02B6, // updated 5.58 hotfix
ActorControlTarget = 0x03C5, // updated 5.58 hotfix
InitZone = 0x118, // updated 6.31h
PrepareZoning = 0x27c, // updated 6.31h
EffectResult = 0x214, // updated 6.31h
EffectResultBasic = 0x205, // updated 6.31h
ActorControl = 0x1a4, // updated 6.31h
ActorControlTarget = 0x7e, // updated 6.31h
ActorControlSelf = 0x203, // updated 6.31h
ActorCast = 0x185, // updated 6.31h
ActorSetPos = 0x99, // updated 6.31h
ActorMove = 0x155, // updated 6.31h
ActorGauge = 0x238, // updated 6.31h
/*!
* @brief Used when resting
*/
UpdateHpMpTp = 0x01A7, // updated 5.58 hotfix
UpdateHpMpTp = 0x119, // updated 6.31h
UpdateClassInfo = 0x2c5, // updated 6.31h
///////////////////////////////////////////////////
ChatBanned = 0xF06B,
Playtime = 0x0179, // updated 5.58 hotfix
Logout = 0x0214, // updated 5.58 hotfix
CFNotify = 0x0327, // updated 5.58 hotfix
Playtime = 0x26c, // updated 6.31h
Logout = 0x072, // updated 6.31h
CFNotify = 0x2a1, // updated 6.31h
CFMemberStatus = 0x0079,
CFDutyInfo = 0x03AA, // updated 5.58 hotfix
CFDutyInfo = 0x21a, // updated 6.31h
CFPlayerInNeed = 0xF07F,
CFPreferredRole = 0x024B, // updated 5.58 hotfix
CFCancel = 0x01AC, // updated 5.58 hotfix
CFPreferredRole = 0x26b, // updated 6.31h
CFCancel = 0x1e3, // updated 6.31h
SocialRequestError = 0xF0AD,
CFRegistered = 0x029F, // updated 5.58 hotfix
SocialRequestResponse = 0x0082, // updated 5.58 hotfix
SocialMessage = 0x03CB, // updated 5.58 hotfix
SocialMessage2 = 0x01D7, // updated 5.58 hotfix
CFRegistered = 0x029F, // updated 5.58h
SocialRequestResponse = 0x2c3, // updated 6.31h
SocialMessage = 0x03CB, // updated 5.58h
SocialMessage2 = 0x01D7, // updated 5.58h
CancelAllianceForming = 0xF0C6, // updated 4.2
LogMessage = 0x0118, // updated 5.58 hotfix
LogMessage = 0x1a7, // updated 6.31h
Chat = 0x00FE, // updated 5.58 hotfix
Chat = 0x00c5, // updated 6.31h
PartyChat = 0x0065,
WorldVisitList = 0xF0FE, // added 4.5
SocialList = 0x015F, // updated 5.58 hotfix
SocialList = 0x1f4, // updated 6.31h
ExamineSearchInfo = 0x0133, // updated 5.58 hotfix
UpdateSearchInfo = 0x03E5, // updated 5.58 hotfix
InitSearchInfo = 0x0321, // updated 5.58 hotfix
ExamineSearchComment = 0x03AD, // updated 5.58 hotfix
ExamineSearchInfo = 0x156, // updated 6.31h
UpdateSearchInfo = 0xc8, // updated 6.31h
InitSearchInfo = 0x00b7, // updated 6.31h
ExamineSearchComment = 0x102, // updated 6.31h
ServerNoticeShort = 0x0333, // updated 5.58 hotfix
ServerNotice = 0x0171, // updated 5.58 hotfix
SetOnlineStatus = 0x037B, // updated 5.58 hotfix
ServerNoticeShort = 0x0333, // updated 5.58h
ServerNotice = 0x03b0, // updated 6.31h
SystemLogMessage = 0x1a6, // updated 6.31h
SetOnlineStatus = 0x2b7, // updated 6.31h
CountdownInitiate = 0x0111, // updated 5.58 hotfix
CountdownCancel = 0x0231, // updated 5.58 hotfix
CountdownInitiate = 0x3e1, // updated 6.31h
CountdownCancel = 0x23a, // updated 6.31h
PlayerAddedToBlacklist = 0x024E, // updated 5.58 hotfix
PlayerRemovedFromBlacklist = 0x011D, // updated 5.58 hotfix
BlackList = 0x03C0, // updated 5.58 hotfix
PlayerAddedToBlacklist = 0x1cb, // updated 6.31h
PlayerRemovedFromBlacklist = 0x37c, // updated 6.31h
BlackList = 0x033d, // updated 6.31h
LinkshellList = 0x02E2, // updated 5.58 hotfix
LinkshellList = 0x3be, // updated 6.31h
CrossWorldLinkshellList = 0xb8, // updated 6.31h
FellowshipList = 0x2a3, // updated 6.31h
MailDeleteRequest = 0xF12B, // updated 5.0
MailDeleteRequest = 0x0117, // updated 6.31h
// 12D - 137 - constant gap between 4.5x -> 5.0
ReqMoogleMailList = 0xF138, // updated 5.0
ReqMoogleMailLetter = 0xF139, // updated 5.0
ReqMoogleMailList = 0xF138, // updated 5.0
ReqMoogleMailLetter = 0xF139, // updated 5.0
MailLetterNotification = 0x013A, // updated 5.0
MarketTaxRates = 0x01F8, // updated 5.35 hotfix
MarketTaxRates = 0x01F8, // updated 5.35h
MarketBoardSearchResult = 0x01F1, // updated 5.58 hotfix
MarketBoardItemListingCount = 0x0068, // updated 5.58 hotfix
MarketBoardItemListingHistory = 0x01BA, // updated 5.58 hotfix
MarketBoardItemListing = 0x0076, // updated 5.58 hotfix
MarketBoardSearchResult = 0x115, // updated 6.31h
MarketBoardItemListingCount = 0x31a, // updated 6.31h
MarketBoardItemListingHistory = 0x176, // updated 6.31h
MarketBoardItemListing = 0x1ed, // updated 6.31h
MarketBoardPurchase = 0x30b, // updated 6.31h
ItemMarketBoardInfo = 0x23f, // updated 6.31h
CharaFreeCompanyTag = 0x013B, // updated 4.5
FreeCompanyBoardMsg = 0x03DB, // updated 5.58 hotfix
FreeCompanyInfo = 0x01F7, // updated 5.58 hotfix
ExamineFreeCompanyInfo = 0x0324, // updated 5.58 hotfix
CharaFreeCompanyTag = 0x013B, // updated 4.5
FreeCompanyBoardMsg = 0x03DB, // updated 5.58h
FreeCompanyInfo = 0x29c, // updated 6.31h
FreeCompanyDialog = 0x285, // updated 6.31h
ExamineFreeCompanyInfo = 0x171, // updated 6.31h
FreeCompanyUpdateShortMessage = 0xF157, // added 5.0
StatusEffectList = 0x0074, // updated 5.58 hotfix
EurekaStatusEffectList = 0x0167, // updated 5.18
BossStatusEffectList = 0x0312, // added 5.1
Effect = 0x03CA, // updated 5.58 hotfix
AoeEffect8 = 0x03C4, // updated 5.58 hotfix
AoeEffect16 = 0x00FA, // updated 5.58 hotfix
AoeEffect24 = 0x0339, // updated 5.58 hotfix
AoeEffect32 = 0x023C, // updated 5.58 hotfix
PersistantEffect = 0x025D, // updated 5.58 hotfix
StatusEffectList = 0x305, // updated 6.31h
EurekaStatusEffectList = 0x3a6, // updated 6.31h
BossStatusEffectList = 0x1e4, // updated 6.31h
StatusEffectList2 = 0x197, // updated 6.31h
StatusEffectList3 = 0x2a7, // updated 6.31h
Effect = 0x100, // updated 6.31h
AoeEffect8 = 0x2b9, // updated 6.31h
AoeEffect16 = 0x390, // updated 6.31h
AoeEffect24 = 0x22a, // updated 6.31h
AoeEffect32 = 0x120, // updated 6.31h
PersistantEffect = 0x2a7, // updated 6.31h
GCAffiliation = 0x0094, // updated 5.58 hotfix
GCAffiliation = 0x184, // updated 6.31h
PlayerSpawn = 0x01D8, // updated 5.58 hotfix
NpcSpawn = 0x00D2, // updated 5.58 hotfix
NpcSpawn2 = 0x01CB, // ( Bigger statuseffectlist? ) updated 5.3
ActorMove = 0x00F8, // updated 5.58 hotfix
PlayerSpawn = 0xf9, // updated 6.31h
NpcSpawn = 0x3d5, // updated 6.31h
NpcSpawn2 = 0x3b6, // updated 6.31h
ActorSetPos = 0x0299, // updated 5.58 hotfix
ActorCast = 0x015D, // updated 5.58 hotfix
SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18
PartyList = 0x0349, // updated 5.58 hotfix
PartyMessage = 0x00A4, // updated 5.58 hotfix
HateRank = 0x0150, // updated 5.58 hotfix
HateList = 0x0243, // updated 5.58 hotfix
ObjectSpawn = 0x0125, // updated 5.58 hotfix
ObjectDespawn = 0x0148, // updated 5.58 hotfix
UpdateClassInfo = 0x0084, // updated 5.58 hotfix
PartyList = 0x24e, // updated 6.31h
PartyMessage = 0x297, // updated 6.31h
HateRank = 0x1dd, // updated 6.31h
HateList = 0x3a5, // updated 6.31h
ObjectSpawn = 0x277, // updated 6.31h
ObjectDespawn = 0x2de, // updated 6.31h
SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything
PlayerSetup = 0x01D5, // updated 5.58 hotfix
PlayerStats = 0x0295, // updated 5.58 hotfix
ActorOwner = 0x0260, // updated 5.58 hotfix
PlayerStateFlags = 0x03BF, // updated 5.58 hotfix
PlayerClassInfo = 0x0131, // updated 5.58 hotfix
CharaVisualEffect = 0x0292, // updated 5.58 hotfix
PlayerSetup = 0x287, // updated 6.31h
PlayerStats = 0x2b6, // updated 6.31h
ActorOwner = 0x287, // updated 6.31h
PlayerStateFlags = 0x395, // updated 6.31h
PlayerClassInfo = 0x17c, // updated 6.31h
PlayerUpdateLook = 0x1cc, // updated 6.31h
CharaVisualEffect = 0x355, // updated 6.31h
ModelEquip = 0x03A2, // updated 5.58 hotfix
Examine = 0x0365, // updated 5.58 hotfix
CharaNameReq = 0x01F0, // updated 5.58 hotfix
ModelEquip = 0xe1, // updated 6.31h
Examine = 0x246, // updated 6.31h
CharaNameReq = 0x1c4, // updated 6.31h
// nb: see #565 on github
UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0
RetainerSaleHistory = 0x03CE, // updated 5.58 hotfix
RetainerInformation = 0x022F, // updated 5.58 hotfix
RetainerSaleHistory = 0x1ae, // updated 6.31h
RetainerInformation = 0x139, // updated 6.31h
SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore
ItemInfo = 0x01CC, // updated 5.58 hotfix
ContainerInfo = 0x025C, // updated 5.58 hotfix
InventoryTransactionFinish = 0x0176, // updated 5.58 hotfix
InventoryTransaction = 0x027F, // updated 5.58 hotfix
CurrencyCrystalInfo = 0x0345, // updated 5.58 hotfix
ItemInfo = 0x1c2, // updated 6.31h
ContainerInfo = 0x93, // updated 6.31h
InventoryTransactionFinish = 0x290, // updated 6.31h
InventoryTransaction = 0x6e, // updated 6.31h
CurrencyCrystalInfo = 0x385, // updated 6.31h
InventoryActionAck = 0x03B8, // updated 5.58 hotfix
UpdateInventorySlot = 0x02F7, // updated 5.58 hotfix
InventoryActionAck = 0xd0, // updated 6.31h
UpdateInventorySlot = 0xc2, // updated 6.31h
HuntingLogEntry = 0x01D9, // updated 5.58 hotfix
HuntingLogEntry = 0xb0, // updated 6.31h
EventPlay = 0x016B, // updated 5.58 hotfix
EventPlay4 = 0x010A, // updated 5.58 hotfix
EventPlay8 = 0x0337, // updated 5.58 hotfix
EventPlay16 = 0x0269, // updated 5.58 hotfix
EventPlay32 = 0x023E, // updated 5.58 hotfix
EventPlay64 = 0x00DE, // updated 5.58 hotfix
EventPlay128 = 0x02D0, // updated 5.58 hotfix
EventPlay255 = 0x0362, // updated 5.58 hotfix
EventPlay = 0x3b8, // updated 6.31h
EventPlay4 = 0x1ec, // updated 6.31h
EventPlay8 = 0x333, // updated 6.31h
EventPlay16 = 0x3ae, // updated 6.31h
EventPlay32 = 0x160, // updated 6.31h
EventPlay64 = 0x2f2, // updated 6.31h
EventPlay128 = 0x8b, // updated 6.31h
EventPlay255 = 0x10b, // updated 6.31h
EventStart = 0x92, // updated 6.31h
EventFinish = 0x8c, // updated 6.31h
EventContinue = 0x00B6, // updated 5.58 hotfix
EventStart = 0x02DA, // updated 5.58 hotfix
EventFinish = 0x0235, // updated 5.58 hotfix
EventContinue = 0x200, // updated 6.31h
EventLinkshell = 0x1169,
QuestActiveList = 0x0097, // updated 5.58 hotfix
QuestUpdate = 0x01B2, // updated 5.58 hotfix
QuestCompleteList = 0x006D, // updated 5.58 hotfix
QuestActiveList = 0x82, // updated 6.31h
QuestUpdate = 0xa7, // updated 6.31h
QuestCompleteList = 0x227, // updated 6.31h
QuestFinish = 0x021B, // updated 5.58 hotfix
MSQTrackerComplete = 0x0348, // updated 5.58 hotfix
QuestFinish = 0x30a, // updated 6.31h
MSQTrackerComplete = 0xba, // updated 6.31h
MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474
QuestMessage = 0x0220, // updated 5.58 hotfix
QuestMessage = 0x0220, // updated 5.58h
QuestTracker = 0x00D8, // updated 5.58 hotfix
QuestTracker = 0x1c1, // updated 6.31h
Mount = 0x01E1, // updated 5.58 hotfix
Mount = 0x116, // updated 6.31h
DirectorVars = 0x0154, // updated 5.58 hotfix
SomeDirectorUnk1 = 0x0084, // updated 5.18
SomeDirectorUnk2 = 0xF0C1, // updated 5.18
SomeDirectorUnk4 = 0x03DD, // updated 5.58 hotfix
SomeDirectorUnk8 = 0x028A, // updated 5.18
DirectorVars = 0x105, // updated 6.31h
SomeDirectorUnk1 = 0x0084, // updated 5.18
SomeDirectorUnk2 = 0xF0C1, // updated 5.18
SomeDirectorUnk4 = 0x03DD, // updated 5.58h
SomeDirectorUnk8 = 0x028A, // updated 5.18
SomeDirectorUnk16 = 0x028C, // updated 5.18
DirectorPopUp = 0x03DF, // updated 5.58 hotfix
DirectorPopUp4 = 0x019B, // updated 5.58 hotfix
DirectorPopUp8 = 0x0271, // updated 5.58 hotfix
DirectorPopUp = 0x03DF, // updated 5.58h
DirectorPopUp4 = 0x019B, // updated 5.58h
DirectorPopUp8 = 0x0271, // updated 5.58h
CFAvailableContents = 0xF1FD, // updated 4.2
WeatherChange = 0x0323, // updated 5.58 hotfix
PlayerTitleList = 0x014E, // updated 5.58 hotfix
Discovery = 0x01C2, // updated 5.58 hotfix
WeatherChange = 0x148, // updated 6.31h
PlayerTitleList = 0x365, // updated 6.31h
Discovery = 0x14b, // updated 6.31h
EorzeaTimeOffset = 0x0070, // updated 5.58 hotfix
EorzeaTimeOffset = 0x3d2, // updated 6.31h
EquipDisplayFlags = 0x02C6, // updated 5.58 hotfix
EquipDisplayFlags = 0x35e, // updated 6.31h
MiniCactpotInit = 0x0286, // added 5.31
ShopMessage = 0x0287, // updated 5.58 hotfix
LootMessage = 0x0383, // updated 5.58 hotfix
ResultDialog = 0x0273, // updated 5.58 hotfix
DesynthResult = 0x0238, // updated 5.58 hotfix
ShopMessage = 0x0287, // updated 5.58h
LootMessage = 0x191, // updated 6.31h
ResultDialog = 0x394, // updated 6.31h
DesynthResult = 0x16a, // updated 6.31h
/// Housing //////////////////////////////////////
LandSetInitialize = 0x0159, // updated 5.58 hotfix
LandUpdate = 0x0228, // updated 5.58 hotfix
YardObjectSpawn = 0x023D, // updated 5.58 hotfix
HousingIndoorInitialize = 0x0210, // updated 5.58 hotfix
LandPriceUpdate = 0x0300, // updated 5.58 hotfix
LandInfoSign = 0x03E7, // updated 5.58 hotfix
LandRename = 0x01BF, // updated 5.58 hotfix
HousingEstateGreeting = 0x0126, // updated 5.58 hotfix
HousingUpdateLandFlagsSlot = 0x0157, // updated 5.58 hotfix
HousingLandFlags = 0x03B1, // updated 5.58 hotfix
HousingShowEstateGuestAccess = 0x00CC, // updated 5.58 hotfix
LandSetInitialize = 0x69, // updated 6.31h
LandUpdate = 0x32a, // updated 6.31h
YardObjectSpawn = 0x183, // updated 6.31h
HousingIndoorInitialize = 0x206, // updated 6.31h
LandPriceUpdate = 0x330, // updated 6.31h
LandInfoSign = 0x220, // updated 6.31h
LandRename = 0x304, // updated 6.31h
HousingEstateGreeting = 0x1b6, // updated 6.31h
HousingUpdateLandFlagsSlot = 0x2a2, // updated 6.31h
HousingLandFlags = 0x1a0, // updated 6.31h
HousingShowEstateGuestAccess = 0x369, // updated 6.31h
HousingObjectInitialize = 0x0112, // updated 5.58 hotfix
HousingInternalObjectSpawn = 0x02C8, // updated 5.58 hotfix
HousingObjectInitialize = 0x3a7, // updated 6.31h
HousingInternalObjectSpawn = 0x251, // updated 6.31h
HousingWardInfo = 0x012A, // updated 5.58 hotfix
HousingObjectMove = 0x0265, // updated 5.58 hotfix
HousingWardInfo = 0x2bb, // updated 6.31h
HousingObjectMove = 0xcb, // updated 6.31h
HousingObjectDye = 0x328, // updated 6.31h
SharedEstateSettingsResponse = 0x030E, // updated 5.58 hotfix
SharedEstateSettingsResponse = 0x3a1, // updated 6.31h
LandUpdateHouseName = 0x017C, // updated 5.58 hotfix
LandUpdateHouseName = 0x24d, // updated 6.31h
LandSetMap = 0x2ce, // updated 6.31h
LandSetMap = 0x02E5, // updated 5.58 hotfix
CeremonySetActorAppearance = 0x02ED, // updated 5.58 hotfix
CeremonySetActorAppearance = 0x2cb, // updated 6.31h
//////////////////////////////////////////////////
DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui
PerformNote = 0x0127, // updated 5.58 hotfix
PerformNote = 0x1e1, // updated 6.31h
PrepareZoning = 0x02AB, // updated 5.58 hotfix
ActorGauge = 0x01C1, // updated 5.58 hotfix
DutyGauge = 0x02E5, // updated 5.58 hotfix
DutyGauge = 0x02E5, // updated 5.58h
// daily quest info -> without them sent, login will take longer...
DailyQuests = 0x02D6, // updated 5.58 hotfix
DailyQuestRepeatFlags = 0x01AB, // updated 5.58 hotfix
DailyQuests = 0xd4, // updated 6.31h
DailyQuestRepeatFlags = 0x21c, // updated 6.31h
MapUpdate = 0x0394, // updated 5.58 hotfix
MapUpdate4 = 0x036F, // updated 5.58 hotfix
MapUpdate8 = 0x0311, // updated 5.58 hotfix
MapUpdate16 = 0x0108, // updated 5.58 hotfix
MapUpdate32 = 0x007A, // updated 5.58 hotfix
MapUpdate64 = 0x02A0, // updated 5.58 hotfix
MapUpdate128 = 0x0303, // updated 5.58 hotfix
MapUpdate = 0x31f, // updated 6.31h
MapUpdate4 = 0x2ff, // updated 6.31h
MapUpdate8 = 0xff, // updated 6.31h
MapUpdate16 = 0x1d0, // updated 6.31h
MapUpdate32 = 0x151, // updated 6.31h
MapUpdate64 = 0x392, // updated 6.31h
MapUpdate128 = 0x222, // updated 6.31h
/// Doman Mahjong //////////////////////////////////////
MahjongOpenGui = 0x02A4, // only available in mahjong instance
MahjongNextRound = 0x02BD, // initial hands(baipai), # of riichi(wat), winds, honba, score and stuff
MahjongPlayerAction = 0x02BE, // tsumo(as in drawing a tile) called chi/pon/kan/riichi
MahjongOpenGui = 0x02A4, // only available in mahjong instance
MahjongNextRound = 0x02BD, // initial hands(baipai), # of riichi(wat), winds, honba, score and stuff
MahjongPlayerAction = 0x02BE, // tsumo(as in drawing a tile) called chi/pon/kan/riichi
MahjongEndRoundTsumo = 0x02BF, // called tsumo
MahjongEndRoundRon = 0x2C0, // called ron or double ron (waiting for action must be flagged from discard packet to call)
MahjongTileDiscard = 0x02C1, // giri (discarding a tile.) chi(1)/pon(2)/kan(4)/ron(8) flags etc..
MahjongPlayersInfo = 0xF2C2, // actor id, name, rating and stuff..
MahjongEndRoundRon = 0x2C0, // called ron or double ron (waiting for action must be flagged from discard packet to call)
MahjongTileDiscard = 0x02C1, // giri (discarding a tile.) chi(1)/pon(2)/kan(4)/ron(8) flags etc..
MahjongPlayersInfo = 0xF2C2, // actor id, name, rating and stuff..
// 2C3 and 2C4 are currently unknown
MahjongEndRoundDraw = 0x02C5, // self explanatory
MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen.
MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen.
/// Airship & Submarine //////////////////////////////////////
AirshipExplorationResult = 0x0203, // updated 5.58 hotfix
AirshipStatus = 0x030C, // updated 5.58 hotfix
AirshipStatusList = 0x02FE, // updated 5.58 hotfix
AirshipTimers = 0x0166, // updated 5.58 hotfix
SubmarineExplorationResult = 0x00AA, // updated 5.58 hotfix
SubmarineProgressionStatus = 0x0357, // updated 5.58 hotfix
SubmarineStatusList = 0x01EF, // updated 5.58 hotfix
SubmarineTimers = 0x0247, // updated 5.58 hotfix
AirshipTimers = 0xda, // updated 6.31h
AirshipStatus = 0x2f1, // updated 6.31h
AirshipStatusList = 0x39d, // updated 6.31h
AirshipExplorationResult = 0x3c4, // updated 6.31h
SubmarineTimers = 0x263, // updated 6.31h
SubmarineProgressionStatus = 0x25a, // updated 6.31h
SubmarineStatusList = 0xac, // updated 6.31h
SubmarineExplorationResult = 0x194, // updated 6.31h
EnvironmentControl = 0xef, // updated 6.31h
IslandWorkshopSupplyDemand = 0x190, // updated 6.31h
};
/**
* Client IPC Zone Type Codes.
*/
* Client IPC Zone Type Codes.
*/
enum ClientZoneIpcType : uint16_t
{
PingHandler = 0x0288, // updated 5.58 hotfix
InitHandler = 0x02EB, // updated 5.58 hotfix
PingHandler = 0x0273, // updated 6.31h
InitHandler = 0x03a8, // updated 6.31h
FinishLoadingHandler = 0x013C, // updated 5.58 hotfix
FinishLoadingHandler = 0x032d, // updated 6.31h
CFCommenceHandler = 0x0381, // updated 5.58 hotfix
CFCommenceHandler = 0x0381, // updated 5.58h
CFCancelHandler = 0x02B2, // updated 5.58 hotfix
CFRegisterDuty = 0x01BD, // updated 5.58 hotfix
CFRegisterRoulette = 0x037A, // updated 5.58 hotfix
PlayTimeHandler = 0x02B7, // updated 5.58 hotfix
LogoutHandler = 0x00A0, // updated 5.58 hotfix
CancelLogout = 0x01AC, // updated 5.58 hotfix
CFDutyInfoHandler = 0xF078, // updated 4.2
CFCancelHandler = 0x02B2, // updated 5.58h
CFRegisterDuty = 0x01BD, // updated 5.58h
CFRegisterRoulette = 0x037A, // updated 5.58h
PlayTimeHandler = 0x02B7, // updated 5.58h
LogoutHandler = 0x0387, // updated 6.31h
CancelLogout = 0x01e3, // updated 6.31h
CFDutyInfoHandler = 0xF078, // updated 4.2
SocialReqSendHandler = 0x00D7, // updated 5.58 hotfix
SocialResponseHandler = 0x023B, // updated 5.58 hotfix
CreateCrossWorldLS = 0x035D, // updated 5.58 hotfix
SocialReqSendHandler = 0x00D7, // updated 5.58h
SocialResponseHandler = 0x023B, // updated 5.58h
CreateCrossWorldLS = 0x035D, // updated 5.58h
ChatHandler = 0x03B0, // updated 5.58 hotfix
ChatHandler = 0x00f1, // Updated 6.31h
PartyChatHandler = 0x0065,
PartySetLeaderHandler = 0x036C, // updated 5.58 hotfix
LeavePartyHandler = 0x019D, // updated 5.58 hotfix
KickPartyMemberHandler = 0x0262, // updated 5.58 hotfix
DisbandPartyHandler = 0x0276, // updated 5.58 hotfix
PartySetLeaderHandler = 0x036C, // updated 5.58h
LeavePartyHandler = 0x019D, // updated 5.58h
KickPartyMemberHandler = 0x0262, // updated 5.58h
DisbandPartyHandler = 0x0276, // updated 5.58h
SocialListHandler = 0x01CA, // updated 5.58 hotfix
SetSearchInfoHandler = 0x01D4, // updated 5.58 hotfix
ReqSearchInfoHandler = 0x014F, // updated 5.58 hotfix
SocialListHandler = 0x0200, // updated 6.31
SetSearchInfoHandler = 0x0368, // updated 6.31h
ReqSearchInfoHandler = 0x03b0, // updated 6.31h
ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0
ReqRemovePlayerFromBlacklist = 0x00B4, // updated 5.58 hotfix
BlackListHandler = 0x00F2, // updated 5.58 hotfix
PlayerSearchHandler = 0x037D, // updated 5.58 hotfix
ReqRemovePlayerFromBlacklist = 0x00B4, // updated 5.58h
BlackListHandler = 0x010c, // updated 6.31h
PlayerSearchHandler = 0x037D, // updated 5.58h
LinkshellListHandler = 0x03B6, // updated 5.58 hotfix
LinkshellListHandler = 0x03B6, // updated 5.58h
MarketBoardRequestItemListingInfo = 0x00F4, // updated 5.58 hotfix
MarketBoardRequestItemListings = 0x0122, // updated 5.58 hotfix
MarketBoardSearch = 0x0082, // updated 5.58 hotfix
MarketBoardRequestItemListingInfo = 0x00F4, // updated 5.58h
MarketBoardRequestItemListings = 0x0122, // updated 5.58h
MarketBoardSearch = 0x0082, // updated 5.58h
ReqExamineFcInfo = 0x037B, // updated 5.58 hotfix
ReqExamineFcInfo = 0x037B, // updated 5.58h
FcInfoReqHandler = 0x03D4, // updated 5.58 hotfix
FcInfoReqHandler = 0x9999, // unknown
FreeCompanyUpdateShortMessageHandler = 0x0123, // added 5.0
ReqMarketWishList = 0x00C3, // updated 5.58 hotfix
ReqMarketWishList = 0x00C3, // updated 5.58h
ReqJoinNoviceNetwork = 0x0129, // updated 4.2
ReqCountdownInitiate = 0x02EC, // updated 5.58 hotfix
ReqCountdownCancel = 0x0068, // updated 5.58 hotfix
ReqCountdownInitiate = 0x03e1, // updated 6.31h
ReqCountdownCancel = 0x023a, // updated 6.31h
ZoneLineHandler = 0x008D, // updated 5.58 hotfix
ClientTrigger = 0x03DB, // updated 5.58 hotfix
DiscoveryHandler = 0x038B, // updated 5.58 hotfix
ZoneLineHandler = 0x00ce, // updated 6.31h
ClientTrigger = 0x0244, // updated 6.31h
DiscoveryHandler = 0x038B, // updated 5.58h
PlaceFieldMarkerPreset = 0x026D, // updated 5.58 hotfix
PlaceFieldMarker = 0x0371, // updated 5.58 hotfix
SkillHandler = 0x02DC, // updated 5.58 hotfix
GMCommand1 = 0x0272, // updated 5.58 hotfix
GMCommand2 = 0x00E9, // updated 5.58 hotfix
AoESkillHandler = 0x0152, // updated 5.58 hotfix
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
AoESkillHandler = 0x0152, // updated 5.58h
UpdatePositionHandler = 0x01AF, // updated 5.58 hotfix
UpdatePositionHandler = 0x01f7, // updated 6.31h
InventoryModifyHandler = 0x029E, // updated 5.58 hotfix
InventoryModifyHandler = 0x01a2, // updated 6.31h
InventoryEquipRecommendedItems = 0x01C9, // updated 5.58 hotfix
InventoryEquipRecommendedItems = 0x01C9, // updated 5.58h
ReqPlaceHousingItem = 0x02D4, // updated 5.58 hotfix
BuildPresetHandler = 0x0223, // updated 5.58 hotfix
ReqPlaceHousingItem = 0x02D4, // updated 5.58h
BuildPresetHandler = 0x0223, // updated 5.58h
TalkEventHandler = 0x0387, // updated 5.58 hotfix
EmoteEventHandler = 0x00B0, // updated 5.58 hotfix
WithinRangeEventHandler = 0x02B6, // updated 5.58 hotfix
OutOfRangeEventHandler = 0x03C5, // updated 5.58 hotfix
EnterTeriEventHandler = 0x01A7, // updated 5.58 hotfix
ShopEventHandler = 0x0384, // updated 5.58 hotfix
ReturnEventHandler = 0x00FA, // updated 5.58 hotfix
TradeReturnEventHandler = 0x0339, // updated 5.58 hotfix
TradeReturnEventHandler2 = 0x023C, // updated 5.58 hotfix
EventYield2Handler = 0x021D, // updated 5.58 hotfix
EventYield16Handler = 0x0207, // updated 5.58 hotfix
TalkEventHandler = 0x0205, // updated 6.31h
EmoteEventHandler = 0x00B0, // updated 5.58h
WithinRangeEventHandler = 0x02B6, // updated 5.58h
OutOfRangeEventHandler = 0x00b4, // updated 6.31h
EnterTeriEventHandler = 0x014e, // updated 6.31h
ShopEventHandler = 0x0384, // updated 5.58h
ReturnEventHandler = 0x0119, // updated 6.31h
TradeReturnEventHandler = 0x0100, // updated 6.31h
TradeReturnEventHandler2 = 0x023C, // updated 5.58h
EventYield2Handler = 0x021D, // updated 5.58h
EventYield16Handler = 0x0207, // updated 5.58h
LinkshellEventHandler = 0x016B, // updated 4.5
LinkshellEventHandler1 = 0x016C, // updated 4.5
LinkshellEventHandler = 0x9999, // unknown
LinkshellEventHandler1 = 0x9999, // unknown
ReqEquipDisplayFlagsChange = 0x02A5, // updated 5.58 hotfix
ReqEquipDisplayFlagsChange = 0x03BC, // updated 6.30h
LandRenameHandler = 0x028E, // updated 5.58 hotfix
HousingUpdateHouseGreeting = 0x0343, // updated 5.58 hotfix
HousingUpdateObjectPosition = 0x012C, // updated 5.58 hotfix
HousingEditExterior = 0x027B, // updated 5.58 hotfix
HousingEditInterior = 0x02E3, // updated 5.58 hotfix
LandRenameHandler = 0x028E, // updated 5.58h
HousingUpdateHouseGreeting = 0x0343, // updated 5.58h
HousingUpdateObjectPosition = 0x9999, // unknown
HousingEditExterior = 0x027B, // updated 5.58h
HousingEditInterior = 0x02E3, // updated 5.58h
SetSharedEstateSettings = 0x00D2, // updated 5.58 hotfix
SetSharedEstateSettings = 0x00D2, // updated 5.58h
UpdatePositionInstance = 0x00F8, // updated 5.58 hotfix
UpdatePositionInstance = 0x03bd, // Updated 6.31h
PerformNoteHandler = 0x0243, // updated 5.58 hotfix
PerformNoteHandler = 0x0243, // updated 5.58h
WorldInteractionHandler = 0x0274, // updated 5.58 hotfix
Dive = 0x0320, // updated 5.58 hotfix
WorldInteractionHandler = 0x0274, // updated 5.58h
Dive = 0x018C, // updated 6.30h
};
////////////////////////////////////////////////////////////////////////////////
/// Chat Connection IPC Codes
/**
* Server IPC Chat Type Codes.
*/
* Server IPC Chat Type Codes.
*/
enum ServerChatIpcType : uint16_t
{
Tell = 0x0064, // updated for sb
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
TellErrNotFound = 0x0066,
@ -440,15 +455,14 @@ namespace Sapphire::Network::Packets
};
/**
* Client IPC Chat Type Codes.
*/
* Client IPC Chat Type Codes.
*/
enum ClientChatIpcType : uint16_t
{
TellReq = 0x0064,
PublicContentTellReq = 0x0326, // updated 5.35 hotfix, this is used when sending a /tell in PublicContent instances such as Eureka or Bozja
};
}
#endif /*_CORE_NETWORK_PACKETS_IPCS_H*/

View file

@ -90,11 +90,12 @@ struct FFXIVIpcCharList : FFXIVIpcBasePacket< LobbyCharList >
uint32_t padding2;
uint16_t serverId;
uint16_t serverId1;
uint8_t unknown[9];
uint8_t unknown1[16];
char nameChara[32];
char nameServer[32];
char nameServer1[32];
char charDetailJson[1051];
char charDetailJson[1024];
uint8_t unknown2[20];
} charaDetails[2];
};

View file

@ -456,23 +456,24 @@ namespace Sapphire::Network::Packets::Server
struct FFXIVIpcEffectResult : FFXIVIpcBasePacket< EffectResult >
{
uint32_t globalSequence;
uint32_t unknown1;
uint32_t actor_id;
uint32_t current_hp;
uint32_t max_hp;
uint16_t current_mp;
uint8_t unknown1;
uint8_t unknown2;
uint8_t classId;
uint8_t shieldPercentage;
uint8_t entryCount;
uint16_t unknown2;
uint16_t unknown3;
struct StatusEntry
{
uint8_t index; // which position do i display this
uint8_t unknown3;
uint8_t unknown4;
uint16_t id;
uint16_t param;
uint16_t unknown4; // Sort this out (old right half of power/param property)
uint16_t unknown5; // Sort this out (old right half of power/param property)
float duration;
uint32_t sourceActorId;
} statusEntries[4];
@ -572,7 +573,7 @@ namespace Sapphire::Network::Packets::Server
uint16_t padding_22[3];
uint8_t effects[8*8];
uint8_t effects[65];
uint16_t padding_6A[3];
@ -682,6 +683,8 @@ namespace Sapphire::Network::Packets::Server
uint16_t rotation;
uint16_t currentMount;
uint16_t activeMinion;
uint8_t u23;
uint8_t u24;
uint8_t spawnIndex;
uint8_t state;
uint8_t persistentEmote;
@ -700,7 +703,7 @@ namespace Sapphire::Network::Packets::Server
uint8_t mountColor;
uint8_t scale;
uint8_t elementData[6];
uint8_t unknown5_5[3];
uint8_t unknown5_5;
Common::StatusEffect effect[30];
Common::FFXIVARR_POSITION3 pos;
uint32_t models[10];
@ -756,6 +759,8 @@ namespace Sapphire::Network::Packets::Server
uint16_t rotation;
uint16_t currentMount;
uint16_t activeMinion;
uint8_t u23;
uint8_t u24;
uint8_t spawnIndex;
uint8_t state;
uint8_t persistantEmote;
@ -774,7 +779,7 @@ namespace Sapphire::Network::Packets::Server
uint8_t mountColor;
uint8_t scale;
uint8_t elemental[6];
uint8_t unknown5_5[3];
uint8_t unknown5_5;
Common::StatusEffect effect[30];
Common::FFXIVARR_POSITION3 pos;
uint32_t models[10];
@ -927,13 +932,13 @@ namespace Sapphire::Network::Packets::Server
//Current instance can be confirmed at any time using the /instance text command." ( 7B F8 69 )
uint8_t unknown5;
uint32_t unknown7;
uint32_t unknown8;
uint16_t festivalId;
uint16_t additionalFestivalId;
uint32_t unknown9;
uint32_t unknown10;
uint32_t festivalId;
uint32_t unknown12[3];
uint32_t additionalFestivalId;
uint32_t unknown11;
uint32_t unknown12[4];
uint32_t unknown13[3];
Common::FFXIVARR_POSITION3 pos;
uint32_t unknown14[3];
@ -950,171 +955,154 @@ namespace Sapphire::Network::Packets::Server
// plain C types for a bit until the packet is actually fixed.
// makes conversion between different editors easier.
uint64_t contentId;
unsigned int unknown8;
unsigned int unknownC;
unsigned int charId;
unsigned int restedExp;
unsigned int companionCurrentExp;
unsigned int unknown1C;
unsigned int fishCaught;
unsigned int useBaitCatalogId;
unsigned int unknown28;
unsigned short unknownPvp2C;
unsigned short unknown3;
unsigned int pvpFrontlineOverallCampaigns;
unsigned int unknownTimestamp34;
unsigned int unknownTimestamp38;
unsigned int unknown3C;
unsigned int unknown40;
unsigned int unknown44;
uint64_t crest;
uint32_t charId;
uint32_t restedExp;
uint32_t companionCurrentExp;
uint32_t unknown1C;
uint32_t fishCaught;
uint32_t useBaitCatalogId;
uint32_t unknown28;
uint16_t unknownPvp2C;
uint16_t unknown2E;
uint32_t pvpFrontlineOverallCampaigns;
uint32_t unknownTimestamp34;
uint32_t unknownTimestamp38;
uint32_t unknown3C;
uint32_t unknown40;
uint32_t unknown44;
float companionTimePassed;
unsigned int unknown4C;
unsigned short unknown50;
unsigned short unknownPvp52[4];
unsigned short playerCommendations;
unsigned short unknown5C;
unsigned short unknown5E;
unsigned short pvpFrontlineWeeklyCampaigns;
unsigned short enhancedAnimaGlassProgress;
unsigned short unknown64[4];
unsigned short pvpRivalWingsTotalMatches;
unsigned short pvpRivalWingsTotalVictories;
unsigned short pvpRivalWingsWeeklyMatches;
unsigned short pvpRivalWingsWeeklyVictories;
unsigned char maxLevel;
unsigned char expansion;
unsigned char unknown76;
unsigned char unknown77;
unsigned char very_unknown;
unsigned char race;
unsigned char tribe;
unsigned char gender;
unsigned char currentJob;
unsigned char currentClass;
unsigned char deity;
unsigned char namedayMonth;
unsigned char namedayDay;
unsigned char cityState;
unsigned char homepoint;
unsigned char unknown82;
unsigned char petHotBar;
unsigned char companionRank;
unsigned char companionStars;
unsigned char companionSp;
unsigned char companionUnk86;
unsigned char companionColor;
unsigned char companionFavoFeed;
unsigned char unknown89;
unsigned char unknown8A[4];
unsigned char hasRelicBook;
unsigned char relicBookId;
unsigned char unknown90[4];
unsigned char craftingMasterMask;
unsigned char unknown95[9];
unsigned char unknown9F[2];
unsigned char unknownA1[6];
unsigned int exp[Common::CLASSJOB_SLOTS];
unsigned int unknown108;
unsigned int pvpTotalExp;
unsigned int unknownPvp110;
unsigned int pvpExp;
unsigned int pvpFrontlineOverallRanks[3];
unsigned short levels[Common::CLASSJOB_SLOTS];
/*
unsigned short unknown15C[9];
unsigned short u1;
unsigned short u2;
unsigned short unknown112[23];
unsigned short fishingRecordsFish[26];
unsigned short beastExp[11];
unsigned short unknown1EA[5];
unsigned short pvpFrontlineWeeklyRanks[3];
unsigned short unknownMask1FA[4];
unsigned char companionName[21];
unsigned char companionDefRank;
unsigned char companionAttRank;
unsigned char companionHealRank;
unsigned char u19[8];
unsigned char mountGuideMask[22];
unsigned char u19_2;
*/
unsigned char unknown5_55a[178];
unsigned char companionName[21];
unsigned char companionDefRank;
unsigned char companionAttRank;
unsigned char companionHealRank;
unsigned char mountGuideMask[29];
//==
uint32_t unknown4C;
uint16_t unknown50;
uint16_t unknownPvp52[4];
uint16_t pvpSeriesExp;
uint16_t playerCommendations;
uint16_t unknown5C;
uint16_t unknown5E;
uint16_t pvpFrontlineWeeklyCampaigns;
uint16_t enhancedAnimaGlassProgress;
uint16_t unknown64[4];
uint16_t pvpRivalWingsTotalMatches;
uint16_t pvpRivalWingsTotalVictories;
uint16_t pvpRivalWingsWeeklyMatches;
uint16_t pvpRivalWingsWeeklyVictories;
uint8_t maxLevel;
uint8_t expansion;
uint8_t unknown76;
uint8_t unknown77;
uint8_t unknown78;
uint8_t race;
uint8_t tribe;
uint8_t gender;
uint8_t currentJob;
uint8_t currentClass;
uint8_t deity;
uint8_t namedayMonth;
uint8_t namedayDay;
uint8_t cityState;
uint8_t homepoint;
uint8_t unknown83;
uint8_t petHotBar;
uint8_t companionRank;
uint8_t companionStars;
uint8_t companionSp;
uint8_t companionUnk86;
uint8_t companionColor;
uint8_t companionFavFeed;
uint8_t favAetheryteCount;
uint8_t unknown8C[4];
uint8_t hasRelicBook;
uint8_t relicBookId;
uint8_t sightseeing21To80Unlock;
uint8_t sightseeingHeavenswardUnlock;
uint8_t unknown94[2];
uint8_t craftingMasterMask;
uint8_t unknown97[9];
uint8_t unknownA0[3];
uint8_t pvpSeriesLevel;
uint8_t pvpMalmstonesClaimed;
uint8_t lastSeasonMalmstonesEarned;
uint8_t lastSeasonMalmstonesClaimed;
uint8_t unknownA7[7];
uint32_t exp[30];
uint32_t pvpTotalExp;
uint32_t unknownPvp124;
uint32_t pvpExp;
uint32_t pvpFrontlineOverallRanks[3];
uint32_t unknown138;
uint16_t levels[30];
uint16_t unknown178[8];
uint16_t fishingRecordsFishId[33];
uint16_t fishingRecordsFishLength[33];
uint16_t beastExp[17];
uint16_t unknown21C[6];
uint16_t pvpFrontlineWeeklyRanks[3];
uint16_t unknownMask22C[8];
uint8_t companionName[21];
uint8_t companionDefRank;
uint8_t companionAttRank;
uint8_t companionHealRank;
uint8_t mountGuideMask[33];
uint8_t ornamentMask[4];
uint8_t unknown281[13];
char name[32];
unsigned char unknownOword[16];
unsigned char unknownOw;
unsigned char unlockBitmask[64];
unsigned char aetheryte[21];
unsigned char discovery[445];
unsigned char howto[34];
unsigned char minions[55];
unsigned char chocoboTaxiMask[10];
unsigned char watchedCutscenes[137];
unsigned char companionBardingMask[11];
unsigned char companionEquippedHead;
unsigned char companionEquippedBody;
unsigned char companionEquippedLegs;
/*
unsigned char unknown52A[4];
unsigned char unknownMask52E[11];
unsigned char fishingGuideMask[105];
unsigned char fishingSpotVisited[31];
unsigned char unknown59A[27];
unsigned char unknown5A9[7];
unsigned char beastRank[11];
unsigned char unknownPvp5AB[11];
unsigned char unknown5B9[5];
*/
unsigned char unknown5_45b[236];
//==
unsigned char pose;
/*
unsigned char unknown5B91;
unsigned char challengeLogComplete[9];
unsigned char weaponPose;
unsigned char unknownMask673[10];
unsigned char unknownMask5DD[28];
unsigned char relicCompletion[12];
unsigned char sightseeingMask[26];
unsigned char huntingMarkMask[55];
unsigned char tripleTriadCards[32];
unsigned char u12[11];
unsigned char u13;
unsigned char aetherCurrentMask[22];
unsigned char u10[3];
*/
unsigned char unknown5_55b[295];
//==
unsigned char orchestrionMask[40]; // this field may already be extended, if it is, the beginning bytes are at the end of unknown5_55b
unsigned char hallOfNoviceCompletion[3];
unsigned char animaCompletion[11];
unsigned char unknown5_55c[35];
unsigned char unlockedRaids[28];
unsigned char unlockedDungeons[18];
unsigned char unlockedGuildhests[10];
/*
at least 8 bytes at most 10 bytes in unlockedTrials not confirmed, adjust unlockedPvp so they share a total of 15 bytes and sync with clearedTrials/clearedPvp.
*/
unsigned char unlockedTrials[9];
unsigned char unlockedPvp[6];
//==
unsigned char clearedRaids[28];
unsigned char clearedDungeons[18];
unsigned char clearedGuildhests[10];
unsigned char clearedTrials[9];
unsigned char clearedPvp[6];
/*
unsigned short fishingRecordsFishWeight[26];
unsigned int exploratoryMissionNextTimestamp;
unsigned char pvpLevel;
*/
unsigned char unknown5_55d[9];
//==
uint8_t unknown293[16];
uint8_t unknown2A3;
uint8_t unlockBitmask[64];
uint8_t aetheryte[26];
uint8_t favoriteAetheryteIds[4];
uint8_t freeAetheryteId;
uint8_t discovery[472];
uint8_t howto[36];
uint8_t minions[60];
uint8_t chocoboTaxiMask[12];
uint8_t watchedCutscenes[152];
uint8_t companionBardingMask[12];
uint8_t companionEquippedHead;
uint8_t companionEquippedBody;
uint8_t companionEquippedLegs;
uint8_t unknown5D1[4];
uint8_t unknownMask5D5[11];
uint8_t fishingGuideMask[161];
uint8_t fishingSpotVisited[38];
uint8_t unknown694[34];
uint8_t unknown6B6[7];
uint8_t unknownPvp6BD[3];
uint8_t beastRank[17];
uint8_t unknownPvp6CE[12];
uint8_t pose[7];
uint8_t unknown6DF[3];
uint8_t challengeLogComplete[13];
uint8_t secretRecipeBookMask[10];
uint8_t unknownMask6F7[29];
uint8_t relicCompletion[12];
uint8_t sightseeingMask[37];
uint8_t huntingMarkMask[102];
uint8_t tripleTriadCards[45];
uint8_t unknown7D7[14];
uint8_t unknown7D8;
uint8_t unknown7E6[49];
uint8_t regionalFolkloreMask[6];
uint8_t orchestrionMask[75];
uint8_t hallOfNoviceCompletion[3];
uint8_t animaCompletion[11];
uint8_t unknown85E[16];
uint8_t unknown86E[4];
uint8_t unknown872[18];
uint8_t unknown880;
uint8_t unlockedRaids[28];
uint8_t unlockedDungeons[18];
uint8_t unlockedGuildhests[10];
uint8_t unlockedTrials[11];
uint8_t unlockedPvp[5];
uint8_t clearedRaids[28];
uint8_t clearedDungeons[18];
uint8_t clearedGuildhests[10];
uint8_t clearedTrials[11];
uint8_t clearedPvp[5];
uint8_t unknown948[4];
uint8_t unknown94C[2];
uint8_t unknown94E[2];
};
@ -1877,15 +1865,15 @@ namespace Sapphire::Network::Packets::Server
struct FFXIVIpcHousingLandFlags : FFXIVIpcBasePacket< HousingLandFlags >
{
Common::LandFlagSet freeCompanyHouse; // 00
uint64_t unkown1;
uint64_t unknown1;
Common::LandFlagSet privateHouse; // 24
uint64_t unkown2;
uint64_t unknown2;
Common::LandFlagSet apartment; // 48
uint64_t unkown3;
uint64_t unknown3;
Common::LandFlagSet sharedHouse[2]; //72
uint64_t unkown4;
Common::LandFlagSet unkownHouse;
uint64_t unkown5;
uint64_t unknown4;
Common::LandFlagSet unknownHouse;
uint64_t unknown5;
};
//Structs

View file

@ -452,8 +452,8 @@ void Lobby::GameConnection::generateEncryptionKey( uint32_t key, const std::stri
m_baseKey[ 2 ] = 0x34;
m_baseKey[ 3 ] = 0x12;
memcpy( m_baseKey + 0x04, &key, 4 );
m_baseKey[ 8 ] = 0x18;
m_baseKey[ 9 ] = 0x15;
m_baseKey[ 8 ] = 0xD4;
m_baseKey[ 9 ] = 0x17;
memcpy( ( char* ) m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() );
Common::Util::md5( m_baseKey, m_encKey, 0x2C );
}

View file

@ -118,7 +118,7 @@ int main( int argc, char** argv )
result += generateEnum( "ActionCategory", 0, "uint8_t" );
result += generateEnum( "BaseParam", 1, "uint8_t" );
result += generateEnum( "BeastReputationRank", 1, "uint8_t" );
result += generateEnum( "BeastTribe", 11, "uint8_t" );
result += generateEnum( "BeastTribe", 9, "uint8_t" );
result += generateEnum( "ClassJob", 0, "uint8_t" );
result += generateEnum( "ContentType", 0, "uint8_t" );
result += generateEnum( "EmoteCategory", 0, "uint8_t" );
@ -127,7 +127,7 @@ int main( int argc, char** argv )
result += generateEnum( "GuardianDeity", 0, "uint8_t" );
result += generateEnum( "ItemUICategory", 0, "uint8_t" );
result += generateEnum( "ItemSearchCategory", 0, "uint8_t" );
result += generateEnum( "OnlineStatus", 2, "uint8_t" );
result += generateEnum( "OnlineStatus", 3, "uint8_t" );
result += generateEnum( "Race", 1, "uint8_t" );
result += generateEnum( "Tribe", 0, "uint8_t" );
result += generateEnum( "Town", 0, "uint8_t" );

View file

@ -3,6 +3,7 @@
#include <stdint.h>
#include <vector>
#include <cstring>
struct PCB_HEADER
{

View file

@ -3,6 +3,7 @@
#include <stdint.h>
#include <vector>
#include <cstring>
struct PCB_HEADER
{

View file

@ -176,7 +176,7 @@ bool Sapphire::Entity::Player::isActingAsGm() const
{
auto status = getOnlineStatus();
return status == OnlineStatus::GameMaster || status == OnlineStatus::GameMaster1 ||
status == OnlineStatus::GameMaster2;
status == OnlineStatus::GameQA;
}
uint8_t Sapphire::Entity::Player::getMode() const

View file

@ -1097,21 +1097,21 @@ namespace Sapphire::Entity
uint16_t m_activeTitle;
uint8_t m_titleList[48];
uint8_t m_howTo[34];
uint8_t m_minions[55];
uint8_t m_howTo[35];
uint8_t m_minions[56];
uint8_t m_mountGuide[29];
uint8_t m_homePoint;
uint8_t m_startTown;
uint16_t m_townWarpFstFlags;
uint8_t m_questCompleteFlags[487];
uint8_t m_discovery[445];
uint8_t m_discovery[464];
uint32_t m_playTime;
uint16_t m_classArray[ Common::CLASSJOB_SLOTS ];
uint32_t m_expArray[ Common::CLASSJOB_SLOTS ];
uint8_t m_aetheryte[21];
uint8_t m_unlocks[64];
uint8_t m_orchestrion[40];
uint8_t m_orchestrion[64];
uint8_t m_openingSequence;

View file

@ -1070,8 +1070,8 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti
exp = questInfo->expFactor;
auto rewardItemCount = questInfo->itemReward0.size();
uint16_t optionalItemCount = static_cast< uint16_t >( questInfo->itemReward1.size() );
auto rewardItemCount = questInfo->itemReward.size();
uint16_t optionalItemCount = static_cast< uint16_t >( questInfo->optionalItemReward.size() );
uint32_t gilReward = questInfo->gilReward;
@ -1083,29 +1083,22 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti
{
for( uint32_t i = 0; i < rewardItemCount; i++ )
{
auto itemId = questInfo->itemReward0.at( i );
auto itemId = questInfo->itemReward.at( i );
if( itemId > 0 )
{
addItem( itemId, questInfo->itemCountReward0.at( i ), false, false, true, true );
addItem( itemId, questInfo->itemCountReward.at( i ), false, false, true, true );
}
}
}
auto isHq = false;
if( optionalChoice > 1000000 )
{
optionalChoice -= 1000000;
isHq = true;
}
if( optionalItemCount > 0 )
{
for( uint32_t i = 0; i < optionalItemCount; i++ )
{
auto itemId = questInfo->itemReward1.at( i );
auto itemId = questInfo->optionalItemReward.at( i );
if( itemId > 0 && itemId == optionalChoice )
{
addItem( itemId, questInfo->itemCountReward1.at( i ), isHq, false, true, true );
addItem( itemId, questInfo->optionalItemCountReward.at( i ), false, false, true, true );
break;
}
}

View file

@ -45,7 +45,7 @@ namespace Sapphire::Network::Packets::Server
//m_data.gcRank = GCRank::None;
m_data.homepoint = player.getHomepoint();
m_data.pose = player.getPose();
m_data.pose[0] = player.getPose();
memset( &m_data.name[ 0 ], 0, sizeof( m_data.name ) );
strcpy( &m_data.name[ 0 ], player.getName().c_str() );

View file

@ -62,6 +62,8 @@ bool Sapphire::HousingZone::init()
housingIndex = 2;
else if( m_territoryTypeId == 641 )
housingIndex = 3;
else if (m_territoryTypeId == 979 )
housingIndex = 4;
auto& exdData = Common::Service< Data::ExdDataGenerated >::ref();
auto info = exdData.get< Sapphire::Data::HousingLandSet >( housingIndex );