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
{ {

View file

@ -4,8 +4,8 @@
#include <stdint.h> #include <stdint.h>
/* This file has been automatically generated. /* This file has been automatically generated.
Changes will be lost upon regeneration. Changes will be lost upon regeneration.
To change the content edit tools/exd_common_gen */ To change the content edit tools/exd_common_gen */
namespace Sapphire::Common { namespace Sapphire::Common {
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -23,12 +23,14 @@ namespace Sapphire::Common {
Event = 8, Event = 8,
LimitBreak = 9, LimitBreak = 9,
System = 10, System = 10,
Artillery = 11, System1 = 11,
Mount = 12, Mount = 12,
Special = 13, Special = 13,
ItemManipulation = 14, ItemManipulation = 14,
AdrenalineRush = 15, LimitBreak1 = 15,
//1 = 16, //1 = 16,
Artillery = 17,
//2 = 18,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -130,21 +132,24 @@ namespace Sapphire::Common {
//BeastTribe.exd //BeastTribe.exd
enum class BeastTribe : uint8_t enum class BeastTribe : uint8_t
{ {
/* = 0, None = 0,
1 = 1, Amaljaa = 1,
2 = 2, Sylphs = 2,
3 = 3, Kobolds = 3,
4 = 4, Sahagin = 4,
5 = 5, Ixal = 5,
6 = 6, VanuVanu = 6,
7 = 7, Vath = 7,
8 = 8, Moogles = 8,
9 = 9, Kojin = 9,
10 = 10, Ananta = 10,
11 = 11, Namazu = 11,
12 = 12, Pixies = 12,
13 = 13, Qitari = 13,
14 = 14,*/ Dwarves = 14,
Arkasodara = 15,
Omicrons = 16,
Loporrits = 17,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -190,8 +195,8 @@ namespace Sapphire::Common {
Bluemage = 36, Bluemage = 36,
Gunbreaker = 37, Gunbreaker = 37,
Dancer = 38, Dancer = 38,
// = 39, Reaper = 39,
//1 = 40, Sage = 40,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -211,7 +216,7 @@ namespace Sapphire::Common {
Levequests = 10, Levequests = 10,
GrandCompany = 11, GrandCompany = 11,
Companions = 12, Companions = 12,
BeastTribeQuests = 13, TribalQuests = 13,
OverallCompletion = 14, OverallCompletion = 14,
PlayerCommendation = 15, PlayerCommendation = 15,
DisciplesoftheLand = 16, DisciplesoftheLand = 16,
@ -228,6 +233,7 @@ namespace Sapphire::Common {
//4 = 27, //4 = 27,
UltimateRaids = 28, UltimateRaids = 28,
//5 = 29, //5 = 29,
VCDungeonFinder = 30,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -249,6 +255,7 @@ namespace Sapphire::Common {
Heavensward = 1, Heavensward = 1,
Stormblood = 2, Stormblood = 2,
Shadowbringers = 3, Shadowbringers = 3,
Endwalker = 4,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -323,7 +330,7 @@ namespace Sapphire::Common {
Legs = 36, Legs = 36,
Hands = 37, Hands = 37,
Feet = 38, Feet = 38,
Waist = 39, Unobtainable = 39,
Necklace = 40, Necklace = 40,
Earrings = 41, Earrings = 41,
Bracelets = 42, Bracelets = 42,
@ -392,6 +399,8 @@ namespace Sapphire::Common {
BlueMagesArm = 105, BlueMagesArm = 105,
GunbreakersArm = 106, GunbreakersArm = 106,
DancersArm = 107, DancersArm = 107,
ReapersArm = 108,
SagesArm = 109,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -486,36 +495,37 @@ namespace Sapphire::Common {
ScholarsArms = 85, ScholarsArms = 85,
GunbreakersArms = 86, GunbreakersArms = 86,
DancersArms1 = 87, DancersArms1 = 87,
/*1 = 88, ReapersArms = 88,
2 = 89, SagesArms = 89,
3 = 90, RegistrableMiscellany = 90,
4 = 91, /*1 = 91,
5 = 92, 2 = 92,
6 = 93, 3 = 93,
7 = 94, 4 = 94,
8 = 95, 5 = 95,
9 = 96, 6 = 96,
10 = 97, 7 = 97,
11 = 98, 8 = 98,
12 = 99, 9 = 99,
13 = 100,*/ 10 = 100,*/
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
//OnlineStatus.exd //OnlineStatus.exd
enum class OnlineStatus : uint8_t enum class OnlineStatus : uint8_t
{ {
Producer = 1, None = 0,
GameQA = 1,
GameMaster = 2, GameMaster = 2,
GameMaster1 = 3, GameMaster1 = 3,
GameMaster2 = 4, EventParticipant = 4,
Disconnected = 5, Disconnected = 5,
WaitingforFriendListApproval = 6, WaitingforFriendListApproval = 6,
WaitingforLinkshellApproval = 7, WaitingforLinkshellApproval = 7,
WaitingforFreeCompanyApproval = 8, WaitingforFreeCompanyApproval = 8,
NotFound = 9, NotFound = 9,
Offline = 10, Offline = 10,
Mentor = 11, BattleMentor = 11,
Busy = 12, Busy = 12,
PvP = 13, PvP = 13,
PlayingTripleTriad = 14, PlayingTripleTriad = 14,
@ -531,7 +541,7 @@ namespace Sapphire::Common {
SwordforHire = 24, SwordforHire = 24,
WaitingforDutyFinder = 25, WaitingforDutyFinder = 25,
RecruitingPartyMembers = 26, RecruitingPartyMembers = 26,
Mentor1 = 27, Mentor = 27,
PvEMentor = 28, PvEMentor = 28,
TradeMentor = 29, TradeMentor = 29,
PvPMentor = 30, PvPMentor = 30,
@ -608,6 +618,8 @@ namespace Sapphire::Common {
//3 = 9, //3 = 9,
Crystarium = 10, Crystarium = 10,
//4 = 11, //4 = 11,
OldSharlayan = 12,
//5 = 13,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -762,12 +774,35 @@ namespace Sapphire::Common {
SpectralCurrent = 145, SpectralCurrent = 145,
//1 = 146, //1 = 146,
Climactic = 147, Climactic = 147,
//2 = 148, MoonDust = 148,
//3 = 149, AstromagneticStorm = 149,
//4 = 150, Apocalypse = 150,
//5 = 151, Polarization = 151,
//6 = 152, Polarization1 = 152,
//7 = 153, Polarization2 = 153,
Polarization3 = 154,
Polarization4 = 155,
Projection = 156,
Pandæmonium = 157,
Pandæmonium1 = 158,
Pandæmonium2 = 159,
Ultimatum = 160,
Inevitability = 161,
Transcendence = 162,
Transcendence1 = 163,
Transcendence2 = 164,
Transcendence3 = 165,
Transcendence4 = 166,
Transcendence5 = 167,
Transcendence6 = 168,
Transcendence7 = 169,
Dragonstorms2 = 170,
Vacuity = 171,
Vacuity1 = 172,
Vacuity2 = 173,
DimensionalDisruption4 = 174,
DimensionalDisruption5 = 175,
DimensionalDisruption6 = 176,
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -782,7 +817,7 @@ namespace Sapphire::Common {
Tavern = 5, Tavern = 5,
Eatery = 6, Eatery = 6,
ImmersiveExperience = 7, ImmersiveExperience = 7,
Cafe = 8, Café = 8,
Aquarium = 9, Aquarium = 9,
Sanctum = 10, Sanctum = 10,
Venue = 11, Venue = 11,

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

@ -43,252 +43,262 @@ namespace Sapphire::Network::Packets
*/ */
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
@ -303,14 +313,19 @@ namespace Sapphire::Network::Packets
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
}; };
/** /**
@ -318,111 +333,111 @@ namespace Sapphire::Network::Packets
*/ */
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
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -448,7 +463,6 @@ namespace Sapphire::Network::Packets
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 );