1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-06 10:47:45 +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_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 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 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 ) 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/zlib" )
add_subdirectory( "deps/MySQL" ) add_subdirectory( "deps/MySQL" )
add_subdirectory( "deps/Oodle" )
add_subdirectory( "deps/datReader" ) add_subdirectory( "deps/datReader" )
add_subdirectory( "deps/mysqlConnector" ) add_subdirectory( "deps/mysqlConnector" )
add_subdirectory( "deps/recastnavigation" ) 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 "Statement.h"
#include "PreparedStatement.h" #include "PreparedStatement.h"
#include <mysql.h> #include <mysql.h>
#include <stdexcept>
#ifdef _MSC_VER
// fixes compile error when compiling with vs2019
#include <stdexcept>
#endif
#include <vector> #include <vector>
Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase, Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase,

View file

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

View file

@ -20,7 +20,8 @@ target_link_libraries( common
PUBLIC PUBLIC
xivdat xivdat
mysqlConnector mysqlConnector
mysql ) mysql
OodleNet )
if( UNIX ) if( UNIX )
target_link_libraries( common target_link_libraries( common
PUBLIC PUBLIC
@ -32,6 +33,7 @@ target_include_directories( common
PUBLIC PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/" "${CMAKE_CURRENT_SOURCE_DIR}/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/" "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/Oodle/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/asio/asio/include/" "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/asio/asio/include/"
"${CMAKE_CURRENT_SOURCE_DIR}/../../deps/spdlog/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 int32_t INVALID_GAME_OBJECT_ID = 0xE0000000;
const uint64_t INVALID_GAME_OBJECT_ID64 = 0xE0000000; const uint64_t INVALID_GAME_OBJECT_ID64 = 0xE0000000;
const uint16_t MAX_PLAYER_LEVEL = 80; const uint16_t MAX_PLAYER_LEVEL = 90;
const uint8_t CURRENT_EXPANSION_ID = 3; 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 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. * @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. * 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 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 | * | timestamp | size | cType | count |
* +---+---+-------+---------------+---------------+-------+-------+ * +---+---+-------+---------------+---------------+-------+-------+
* | ? |CMP| ? | ? | * | ? |CMP| ? | oodleDcmpSize |
* +---+---+-------+---------------+ * +---+---+-------+---------------+
* (followed by /count/ FFXIVARR_PACKET_SEGMENTs) * (followed by /count/ FFXIVARR_PACKET_SEGMENTs)
*/ */
@ -62,9 +62,13 @@ namespace Sapphire::Network::Packets
/** The number of packet segments that follow. */ /** The number of packet segments that follow. */
uint16_t count; uint16_t count;
uint8_t unknown_20; uint8_t unknown_20;
/** Indicates if the data segments of this packet are compressed. */ /** Indicates compression method of the data segments of this packet.
uint8_t isCompressed; * 0: none, 1: Zlib, 2: Oodle
uint32_t unknown_24; */
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 ) inline std::ostream& operator<<( std::ostream& os, const FFXIVARR_PACKET_HEADER& hdr )

View file

@ -1,7 +1,9 @@
#include "CommonNetwork.h" #include "CommonNetwork.h"
#include "GamePacketParser.h" #include "GamePacketParser.h"
#include "Oodle.h"
#include <string.h> // memcpy #include <string.h> // memcpy
#include <Logging/Logger.h>
using namespace Sapphire; using namespace Sapphire;
using namespace Sapphire::Network::Packets; 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 ) std::vector< FFXIVARR_PACKET_RAW >& packets )
{ {
// sanity check: check there's enough bytes in the buffer // 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 ) if( buffer.size() - offset < bytesExpected )
return Incomplete; 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 // Loop each message
uint32_t count = 0; uint32_t count = 0;
uint32_t bytesProcessed = 0; uint32_t bytesProcessed = 0;
@ -61,7 +104,7 @@ PacketParseResult Network::Packets::getPackets( const std::vector< uint8_t >& bu
FFXIVARR_PACKET_RAW rawPacket; FFXIVARR_PACKET_RAW rawPacket;
// Copy ipc packet message // Copy ipc packet message
const auto packetResult = getPacket( buffer, offset + bytesProcessed, rawPacket ); const auto packetResult = getPacket( decompBuf, offset + bytesProcessed, rawPacket );
if( packetResult != Success ) if( packetResult != Success )
return packetResult; return packetResult;

View file

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

View file

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

View file

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

View file

@ -452,8 +452,8 @@ void Lobby::GameConnection::generateEncryptionKey( uint32_t key, const std::stri
m_baseKey[ 2 ] = 0x34; m_baseKey[ 2 ] = 0x34;
m_baseKey[ 3 ] = 0x12; m_baseKey[ 3 ] = 0x12;
memcpy( m_baseKey + 0x04, &key, 4 ); memcpy( m_baseKey + 0x04, &key, 4 );
m_baseKey[ 8 ] = 0x18; m_baseKey[ 8 ] = 0xD4;
m_baseKey[ 9 ] = 0x15; m_baseKey[ 9 ] = 0x17;
memcpy( ( char* ) m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() ); memcpy( ( char* ) m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() );
Common::Util::md5( m_baseKey, m_encKey, 0x2C ); 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( "ActionCategory", 0, "uint8_t" );
result += generateEnum( "BaseParam", 1, "uint8_t" ); result += generateEnum( "BaseParam", 1, "uint8_t" );
result += generateEnum( "BeastReputationRank", 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( "ClassJob", 0, "uint8_t" );
result += generateEnum( "ContentType", 0, "uint8_t" ); result += generateEnum( "ContentType", 0, "uint8_t" );
result += generateEnum( "EmoteCategory", 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( "GuardianDeity", 0, "uint8_t" );
result += generateEnum( "ItemUICategory", 0, "uint8_t" ); result += generateEnum( "ItemUICategory", 0, "uint8_t" );
result += generateEnum( "ItemSearchCategory", 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( "Race", 1, "uint8_t" );
result += generateEnum( "Tribe", 0, "uint8_t" ); result += generateEnum( "Tribe", 0, "uint8_t" );
result += generateEnum( "Town", 0, "uint8_t" ); result += generateEnum( "Town", 0, "uint8_t" );

View file

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

View file

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

View file

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

View file

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

View file

@ -1070,8 +1070,8 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti
exp = questInfo->expFactor; exp = questInfo->expFactor;
auto rewardItemCount = questInfo->itemReward0.size(); auto rewardItemCount = questInfo->itemReward.size();
uint16_t optionalItemCount = static_cast< uint16_t >( questInfo->itemReward1.size() ); uint16_t optionalItemCount = static_cast< uint16_t >( questInfo->optionalItemReward.size() );
uint32_t gilReward = questInfo->gilReward; 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++ ) for( uint32_t i = 0; i < rewardItemCount; i++ )
{ {
auto itemId = questInfo->itemReward0.at( i ); auto itemId = questInfo->itemReward.at( i );
if( itemId > 0 ) 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 ) if( optionalItemCount > 0 )
{ {
for( uint32_t i = 0; i < optionalItemCount; i++ ) 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 ) 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; break;
} }
} }

View file

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

View file

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