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:
commit
6ff45f7c5d
27 changed files with 5570 additions and 1920 deletions
|
@ -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
9
deps/Oodle/CMakeLists.txt
vendored
Normal 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
32
deps/Oodle/oodle2net.h
vendored
Normal 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
|
5
deps/mysqlConnector/Connection.cpp
vendored
5
deps/mysqlConnector/Connection.cpp
vendored
|
@ -3,11 +3,8 @@
|
||||||
#include "Statement.h"
|
#include "Statement.h"
|
||||||
#include "PreparedStatement.h"
|
#include "PreparedStatement.h"
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
// fixes compile error when compiling with vs2019
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#endif
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase,
|
Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase,
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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/" )
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
@ -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 )
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
27
src/common/Network/Oodle.cpp
Normal file
27
src/common/Network/Oodle.cpp
Normal 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 );
|
||||||
|
}
|
28
src/common/Network/Oodle.h
Normal file
28
src/common/Network/Oodle.h
Normal 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
|
|
@ -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*/
|
||||||
|
|
|
@ -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];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" );
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
struct PCB_HEADER
|
struct PCB_HEADER
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
struct PCB_HEADER
|
struct PCB_HEADER
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Add table
Reference in a new issue