1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-20 11:47:47 +00:00
sapphire/src/common/Network/PacketDef/Zone/ServerZoneDef.h

1903 lines
42 KiB
C
Raw Normal View History

2017-08-08 13:53:47 +02:00
/**
* IPC Packet Definitions (Server IPC Packets)
* Structural definitions for the various server IPC packet types.
* IMPORTANT NOTE: Do not use these for parsing IPC packets sent by the
* client. See the Client namespace for those types!
*/
#ifndef _CORE_NETWORK_PACKETS_ZONE_SERVER_IPC_H
#define _CORE_NETWORK_PACKETS_ZONE_SERVER_IPC_H
2017-08-08 13:53:47 +02:00
2018-03-06 22:22:19 +01:00
#include <Common.h>
#include <Network/CommonNetwork.h>
2017-08-08 13:53:47 +02:00
namespace Sapphire {
2017-08-08 13:53:47 +02:00
namespace Network {
namespace Packets {
namespace Server {
/**
* Structural representation of the packet sent by the server as response
* to a ping packet
*/
struct FFXIVIpcPing :
FFXIVIpcBasePacket< Ping >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint64_t timeInMilliseconds;
/* 0008 */ uint8_t unknown_8[0x38];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server as response
* to a ping packet
*/
struct FFXIVIpcInit :
FFXIVIpcBasePacket< Init >
2017-08-08 13:53:47 +02:00
{
uint64_t unknown;
uint32_t charId;
uint32_t unknown1;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* carrying chat messages
*/
struct FFXIVIpcChat :
FFXIVIpcBasePacket< Chat >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint8_t padding[14]; //Maybe this is SubCode, or some kind of talker ID...
Common::ChatType chatType;
char name[32];
char msg[1012];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcChatBanned :
FFXIVIpcBasePacket< ChatBanned >
2017-09-10 14:02:16 +09:00
{
uint8_t padding[4]; // I was not sure reinterpreting ZST is valid behavior in C++.
// client doesn't care about the data (zero sized) for this opcode anyway.
2017-09-10 14:02:16 +09:00
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* carrying chat messages
*/
struct FFXIVIpcLogout :
FFXIVIpcBasePacket< Logout >
2017-08-08 13:53:47 +02:00
{
uint32_t flags1;
uint32_t flags2;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* sent to show the play time
*/
struct FFXIVIpcPlayTime :
FFXIVIpcBasePacket< Playtime >
2017-08-08 13:53:47 +02:00
{
uint32_t playTimeInMinutes;
uint32_t padding;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* with a list of players ( party list | friend list | search results )
*/
struct PlayerEntry
{
uint64_t contentId;
uint8_t bytes[12];
uint16_t zoneId;
uint16_t zoneId1;
char bytes1[8];
uint64_t onlineStatusMask;
uint8_t classJob;
uint8_t padding;
uint8_t level;
uint8_t padding1;
uint16_t padding2;
uint8_t one;
char name[0x20];
char fcTag[9];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcSocialList :
FFXIVIpcBasePacket< SocialList >
2017-08-08 13:53:47 +02:00
{
uint32_t padding;
uint32_t padding1;
uint32_t padding2;
uint8_t type;
uint8_t sequence;
uint16_t padding3;
2017-08-08 13:53:47 +02:00
PlayerEntry entries[10];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcSetSearchInfo :
FFXIVIpcBasePacket< UpdateSearchInfo >
2017-08-08 13:53:47 +02:00
{
uint64_t onlineStatusFlags;
uint64_t unknown;
uint32_t unknown1;
uint8_t padding;
uint8_t selectRegion;
char searchMessage[193];
uint8_t padding2;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcInitSearchInfo :
FFXIVIpcBasePacket< InitSearchInfo >
2017-08-08 13:53:47 +02:00
{
uint64_t onlineStatusFlags;
uint64_t unknown;
uint8_t unknown1;
uint8_t selectRegion;
char searchMessage[193];
char padding[5];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcExamineSearchComment :
FFXIVIpcBasePacket< ExamineSearchComment >
{
uint32_t charId;
// packet only has 196 bytes after the charid
// likely utf8
char searchComment[195];
char padding;
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to display a server notice message
*/
struct FFXIVIpcServerNotice :
FFXIVIpcBasePacket< ServerNotice >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint8_t padding;
char message[775];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcSetOnlineStatus :
FFXIVIpcBasePacket< SetOnlineStatus >
2017-08-08 13:53:47 +02:00
{
uint64_t onlineStatusFlags;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcBlackList :
FFXIVIpcBasePacket< BlackList >
2017-08-08 13:53:47 +02:00
{
struct BlEntry
{
uint64_t contentId;
char name[32];
} entry[20];
uint8_t padding;
uint8_t padding1;
uint16_t sequence;
uint32_t padding2;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcLogMessage :
FFXIVIpcBasePacket< LogMessage >
{
uint32_t field_0;
uint32_t field_4;
uint32_t field_8;
uint32_t field_12;
uint32_t category;
uint32_t logMessage;
uint8_t field_24;
uint8_t field_25;
uint8_t field_26[32];
uint32_t field_58;
};
struct FFXIVIpcLinkshellList :
FFXIVIpcBasePacket< LinkshellList >
2017-08-08 13:53:47 +02:00
{
struct LsEntry
{
uint64_t lsId;
uint64_t unknownId;
uint8_t unknown;
uint8_t rank;
uint16_t padding;
uint8_t lsName[20];
} entry[8];
2017-08-08 13:53:47 +02:00
};
2018-10-03 01:22:43 +10:00
/**
* Structural representation of the packet sent by the server
* to send a list of mail the player has
*/
struct FFXIVIpcReqMoogleMailList :
FFXIVIpcBasePacket< ReqMoogleMailList >
{
2018-10-05 19:22:12 +10:00
struct letterEntry
{
2018-10-03 01:22:43 +10:00
char unk[0x8];
uint32_t timeStamp; // The time the mail was sent (this also seems to be used as a Id)
char unk1[0x30]; // This should be items, gil, etc for the letter
uint8_t read; // 0 = false | 1 = true
uint8_t type; // 0 = Friends | 1 = Rewards | 2 = GM
uint8_t unk2;
char senderName[0x20]; // The name of the sender
char summary[0x3C]; // The start of the full letter text
char padding2[0x5];
} letter[5];
char unk3[0x08];
};
/**
* Structural representation of the packet sent by the server
* to show the mail delivery notification
*/
struct FFXIVIpcMailLetterNotificationt :
FFXIVIpcBasePacket< MailLetterNotification >
{
uint32_t sendbackCount; // The amount of letters sent back since you ran out of room (moogle dialog changes based on this)
uint16_t friendLetters; // The amount of letters in the friends section of the letterbox
uint16_t unreadCount; // The amount of unreads in the letterbox (this is the number that shows up)
uint16_t rewardLetters; // The amount of letters in the rewards section of the letterbox
uint8_t isGmLetter; // Makes the letter notification flash red
uint8_t isSupportDesk; // After setting this to 1 we can no longer update mail notifications (more research needed on the support desk)
char unk2[0x4]; // This has probs something to do with the support desk (inquiry id?)
};
struct FFXIVIpcExamineFreeCompanyInfo :
FFXIVIpcBasePacket< ExamineFreeCompanyInfo >
{
char unknown[0x20]; // likely fc allegiance/icon/housing info etc
uint32_t charId;
uint32_t fcTimeCreated;
char unknown2[0x10];
uint16_t unknown3;
char fcName[0x14]; // 20 char limit
uint16_t padding;
char fcTag[0x05]; // 5 char tag limit
uint16_t padding2; // null terminator?
char fcLeader[0x20]; // leader name (32 bytes)
char fcSlogan[192]; // source: https://ffxiv.gamerescape.com/wiki/Free_Company (packet cap confirms this size also)
char padding3; // null terminator?
char fcEstateProfile[20]; // todo: size needs confirmation
uint32_t padding4;
};
struct FFXIVIpcStatusEffectList :
FFXIVIpcBasePacket< StatusEffectList >
2017-08-08 13:53:47 +02:00
{
uint8_t classId;
uint8_t level1;
uint16_t level;
uint32_t current_hp;
uint32_t max_hp;
uint16_t current_mp;
uint16_t max_mp;
uint16_t currentTp;
uint16_t unknown1;
Common::StatusEffect effect[30];
uint32_t padding;
2017-08-08 13:53:47 +02:00
};
struct FFXIVGCAffiliation :
FFXIVIpcBasePacket< GCAffiliation >
2017-08-08 13:53:47 +02:00
{
uint8_t gcId;
uint8_t gcRank[3];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* add a status effect
*/
struct FFXIVIpcAddStatusEffect :
FFXIVIpcBasePacket< AddStatusEffect >
{
uint32_t unknown;
uint32_t actor_id;
uint8_t unknown1;
uint8_t unknown2;
uint16_t padding1;
uint32_t current_hp;
uint16_t current_mp;
uint16_t current_tp;
uint32_t max_hp;
uint16_t max_mp;
uint16_t max_something;
uint8_t effect_index; // which position do i display this
uint8_t unknown3;
uint16_t effect_id;
uint16_t param;
uint16_t unknown5; // Sort this out (old right half of power/param property)
float duration;
uint32_t actor_id1;
uint8_t unknown4[52];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update certain player details / status
*/
struct FFXIVIpcActorControl142 :
FFXIVIpcBasePacket< ActorControl142 >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint16_t category;
/* 0002 */ uint16_t padding;
/* 0004 */ uint32_t param1;
/* 0008 */ uint32_t param2;
/* 000C */ uint32_t param3;
/* 0010 */ uint32_t param4;
/* 0014 */ uint32_t padding1;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update certain player details / status
*/
struct FFXIVIpcActorControl143 :
FFXIVIpcBasePacket< ActorControl143 >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint16_t category;
/* 0002 */ uint16_t padding;
/* 0004 */ uint32_t param1;
/* 0008 */ uint32_t param2;
/* 000C */ uint32_t param3;
/* 0010 */ uint32_t param4;
/* 0014 */ uint32_t param5;
/* 0018 */ uint32_t param6;
/* 0018 */ uint32_t padding1;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update certain player details / status
*/
struct FFXIVIpcActorControl144 :
FFXIVIpcBasePacket< ActorControl144 >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint16_t category;
/* 0002 */ uint16_t padding;
/* 0004 */ uint32_t param1;
/* 0008 */ uint32_t param2;
/* 000C */ uint32_t param3;
/* 0010 */ uint32_t param4;
/* 0014 */ uint32_t padding1;
/* 0018 */ uint64_t targetId;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update HP / MP / TP
*/
struct FFXIVIpcUpdateHpMpTp :
FFXIVIpcBasePacket< UpdateHpMpTp >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint32_t hp;
/* 0004 */ uint16_t mp;
/* 0006 */ uint16_t tp;
/* 0008 */ uint32_t unknown_8;
/* 000C */ uint32_t unknown_12;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
2017-08-14 17:10:19 +02:00
* for battle actions
2017-08-08 13:53:47 +02:00
*/
struct EffectEntry
2017-08-08 13:53:47 +02:00
{
Common::ActionEffectType effectType;
Common::ActionHitSeverityType hitSeverity;
uint8_t param;
int8_t bonusPercent; // shows an additional percentage in the battle log, will not change the damage number sent & shown
uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers
uint8_t flags;
int16_t value;
2017-08-08 13:53:47 +02:00
};
struct EffectHeader
2017-08-08 13:53:47 +02:00
{
uint64_t animationTargetId; // who the animation targets
uint32_t actionId; // what the casting player casts, shown in battle log/ui
uint32_t globalEffectCounter; // seems to only increment on retail?
float animationLockTime; // maybe? doesn't seem to do anything
uint32_t someTargetId; // always 00 00 00 E0, 0x0E000000 is the internal def for INVALID TARGET ID
uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster
uint16_t rotation;
uint16_t actionAnimationId; // the animation that is played by the casting character
uint8_t unknown1E; // can be 0,1,2 - maybe other values? - doesn't do anything?
Common::ActionEffectDisplayType effectDisplayType;
uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?)
uint8_t effectCount; // ignores effects if 0, otherwise parses all of them
uint32_t padding_22[2];
};
struct FFXIVIpcEffect :
FFXIVIpcBasePacket< Effect >
{
EffectHeader header;
EffectEntry effects[8];
uint16_t padding_6A[3];
uint32_t effectTargetId; // who the effect targets
uint32_t effectFlags; // nonzero = effects do nothing, no battle log, no ui text - only shows animations
uint32_t padding_78;
2017-08-08 13:53:47 +02:00
};
template< int size >
struct FFXIVIpcAoeEffect
{
EffectHeader header;
EffectEntry effects[size];
uint16_t padding_6A[3];
uint32_t effectTargetId[size];
Common::FFXIVARR_POSITION3 position;
uint32_t effectFlags;
uint32_t padding_78;
};
struct FFXIVIpcAoeEffect8 :
FFXIVIpcBasePacket< AoeEffect8 >, FFXIVIpcAoeEffect< 8 >
{
};
struct FFXIVIpcAoeEffect16 :
FFXIVIpcBasePacket< AoeEffect16 >, FFXIVIpcAoeEffect< 16 >
{
};
struct FFXIVIpcAoeEffect24 :
FFXIVIpcBasePacket< AoeEffect24 >, FFXIVIpcAoeEffect< 24 >
{
};
struct FFXIVIpcAoeEffect32 :
FFXIVIpcBasePacket< AoeEffect32 >, FFXIVIpcAoeEffect< 32 >
{
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to spawn an actor
*/
struct FFXIVIpcPlayerSpawn :
FFXIVIpcBasePacket< PlayerSpawn >
{
uint16_t title;
uint16_t u1b;
uint16_t currentWorldId;
uint16_t homeWorldId;
2018-09-19 22:25:14 +10:00
uint8_t gmRank;
uint8_t u3c;
uint8_t u4;
uint8_t onlineStatus;
uint8_t pose;
uint8_t u5a;
uint8_t u5b;
uint8_t u5c;
uint64_t targetId;
uint32_t u6;
uint32_t u7;
uint64_t mainWeaponModel;
uint64_t secWeaponModel;
uint64_t craftToolModel;
uint32_t u14;
uint32_t u15;
uint32_t bNPCBase;
uint32_t bNPCName;
uint32_t u18;
uint32_t u19;
uint32_t directorId;
uint32_t ownerId;
uint32_t u22;
uint32_t hPMax;
uint32_t hPCurr;
uint32_t displayFlags;
uint16_t fateID;
uint16_t mPCurr;
uint16_t tPCurr;
uint16_t mPMax;
uint16_t tPMax;
uint16_t modelChara;
uint16_t rotation;
uint16_t activeMinion;
uint8_t spawnIndex;
uint8_t state;
uint8_t persistentEmote;
uint8_t modelType;
uint8_t subtype;
uint8_t voice;
uint16_t u25c;
uint8_t enemyType;
uint8_t level;
uint8_t classJob;
uint8_t u26d;
uint16_t u27a;
uint8_t currentMount;
uint8_t mountHead;
uint8_t mountBody;
uint8_t mountFeet;
uint8_t mountColor;
uint8_t scale;
uint32_t u29b;
uint32_t u30b;
Common::StatusEffect effect[30];
Common::FFXIVARR_POSITION3 pos;
uint32_t models[10];
char name[32];
uint8_t look[26];
char fcTag[6];
uint32_t unk30;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to spawn an actor
*/
struct FFXIVIpcNpcSpawn :
FFXIVIpcBasePacket< NpcSpawn >
{
uint32_t gimmickId; // needs to be existing in the map, mob will snap to it
uint8_t u2b;
uint8_t u2ab;
uint8_t gmRank;
uint8_t u3b;
uint8_t aggressionMode; // 1 passive, 2 aggressive
uint8_t onlineStatus;
uint8_t u3c;
uint8_t pose;
uint32_t u4;
uint64_t targetId;
uint32_t u6;
uint32_t u7;
uint64_t mainWeaponModel;
uint64_t secWeaponModel;
uint64_t craftToolModel;
uint32_t u14;
uint32_t u15;
uint32_t bNPCBase;
uint32_t bNPCName;
uint32_t u18;
uint32_t u19;
uint32_t directorId;
uint32_t spawnerId;
uint32_t parentActorId;
uint32_t hPMax;
uint32_t hPCurr;
uint32_t displayFlags;
uint16_t fateID;
uint16_t mPCurr;
uint16_t tPCurr;
uint16_t mPMax;
uint16_t tPMax;
uint16_t modelChara;
uint16_t rotation;
uint16_t activeMinion;
uint8_t spawnIndex;
uint8_t state;
uint8_t persistantEmote;
uint8_t modelType;
uint8_t subtype;
uint8_t voice;
uint16_t u25c;
uint8_t enemyType;
uint8_t level;
uint8_t classJob;
uint8_t u26d;
uint16_t u27a;
uint8_t currentMount;
uint8_t mountHead;
uint8_t mountBody;
uint8_t mountFeet;
uint8_t mountColor;
uint8_t scale;
uint32_t u29b;
uint32_t u30b;
Common::StatusEffect effect[30];
Common::FFXIVARR_POSITION3 pos;
uint32_t models[10];
char name[32];
uint8_t look[26];
char fcTag[6];
uint32_t unk30;
uint32_t unk31;
uint8_t bNPCPartSlot;
uint8_t unk32;
uint16_t unk33;
uint32_t unk34;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to show player movement
*/
struct FFXIVIpcActorFreeSpawn :
FFXIVIpcBasePacket< ActorFreeSpawn >
2017-08-08 13:53:47 +02:00
{
uint32_t spawnId;
uint32_t actorId;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to show player movement
*/
struct FFXIVIpcActorMove :
FFXIVIpcBasePacket< ActorMove >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint8_t rotation;
/* 0001 */ uint8_t unknown_1;
/* 0002 */ uint8_t unknown_2;
/* 0003 */ uint8_t unknown_3;
/* 0004 */ uint16_t unknown_4;
/* 0006 */ uint16_t posX;
/* 0008 */ uint16_t posY;
/* 000a */ uint16_t posZ;
/* 000C */ uint32_t unknown_12;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to set an actors position
*/
struct FFXIVIpcActorSetPos :
FFXIVIpcBasePacket< ActorSetPos >
2017-08-08 13:53:47 +02:00
{
uint16_t r16;
uint8_t waitForLoad;
uint8_t unknown1;
uint32_t unknown2;
float x;
float y;
float z;
uint32_t unknown3;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to start an actors casting
*/
struct FFXIVIpcActorCast :
FFXIVIpcBasePacket< ActorCast >
{
uint16_t action_id;
Common::SkillType skillType;
uint8_t unknown;
uint32_t unknown_1; // Also action id
float cast_time;
uint32_t target_id;
float rotation; // In radians
uint32_t unknown_2;
uint16_t posX;
uint16_t posY;
uint16_t posZ;
uint16_t unknown_3;
};
struct FFXIVIpcHateList :
FFXIVIpcBasePacket< HateList >
{
uint32_t numEntries;
struct LsEntry
{
uint32_t actorId;
uint8_t hatePercent;
uint8_t unknown;
uint16_t padding;
} entry[32];
uint32_t padding;
};
struct FFXIVIpcUpdateClassInfo :
FFXIVIpcBasePacket< UpdateClassInfo >
{
uint8_t classId;
uint8_t level1;
uint16_t level;
uint32_t nextLevelIndex;
uint32_t currentExp;
uint32_t restedExp;
2017-08-08 13:53:47 +02:00
};
2017-10-08 15:53:00 -03:00
2017-10-06 20:40:27 -03:00
/**
* Structural representation of the packet sent by the server
* to send the titles available to the player
*/
2018-09-18 23:23:18 +02:00
struct FFXIVIpcPlayerTitleList : FFXIVIpcBasePacket< PlayerTitleList >
2017-10-06 20:40:27 -03:00
{
uint8_t titleList[48];
2017-10-06 20:40:27 -03:00
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to initialize a zone for the player
*/
2018-09-18 23:23:18 +02:00
struct FFXIVIpcInitZone : FFXIVIpcBasePacket< InitZone >
2017-08-08 13:53:47 +02:00
{
uint16_t serverId;
uint16_t zoneId;
uint16_t unknown1;
uint16_t unknown2;
uint32_t unknown3;
uint32_t unknown4;
uint8_t weatherId;
uint8_t bitmask;
uint8_t bitmask1;
uint8_t unknown5;
uint16_t festivalId;
uint16_t additionalFestivalId;
uint32_t unknown8;
2018-09-18 22:45:48 +02:00
uint32_t unknown9;
uint32_t unknown10;
uint32_t unknown11;
2019-01-08 21:49:31 +11:00
uint32_t unknown12[4];
Common::FFXIVARR_POSITION3 pos;
2019-01-08 21:49:31 +11:00
uint32_t unknown13;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server to initialize
* the client UI upon initial connection.
*/
2018-09-18 23:23:18 +02:00
struct FFXIVIpcInitUI : FFXIVIpcBasePacket< InitUI >
{
// plain C types for a bit until the packet is actually fixed.
// makes conversion between different editors easier.
uint64_t contentId;
unsigned int unknown8;
unsigned int unknownC;
unsigned int charId;
unsigned int restedExp;
unsigned int companionCurrentExp;
unsigned int unknown1C;
unsigned int fishCaught;
unsigned int useBaitCatalogId;
unsigned int unknown28;
2019-01-12 10:47:45 +01:00
unsigned short unknownPvp2C;
unsigned short unknown3;
unsigned int pvpFrontlineOverallCampaigns;
unsigned int unknownTimestamp34;
unsigned int unknownTimestamp38;
unsigned int unknown3C;
unsigned int unknown40;
unsigned int unknown44;
float companionTimePassed;
unsigned int unknown4C;
2019-01-12 10:47:45 +01:00
unsigned short unknown50;
unsigned short unknownPvp52[4];
unsigned short playerCommendations;
unsigned short unknown5C;
unsigned short unknown5E;
unsigned short pvpFrontlineWeeklyCampaigns;
unsigned short enhancedAnimaGlassProgress;
unsigned short unknown64[4];
unsigned short pvpRivalWingsTotalMatches;
unsigned short pvpRivalWingsTotalVictories;
unsigned short pvpRivalWingsWeeklyMatches;
unsigned short pvpRivalWingsWeeklyVictories;
unsigned char maxLevel;
unsigned char expansion;
unsigned char unknown76;
unsigned char race;
unsigned char tribe;
unsigned char gender;
unsigned char currentJob;
unsigned char currentClass;
unsigned char deity;
unsigned char namedayMonth;
unsigned char namedayDay;
unsigned char cityState;
unsigned char homepoint;
unsigned char unknown81;
unsigned char petHotBar;
unsigned char companionRank;
unsigned char companionStars;
unsigned char companionSp;
unsigned char companionUnk86;
unsigned char companionColor;
unsigned char companionFavoFeed;
unsigned char unknown89;
unsigned char unknown8A[4];
unsigned char hasRelicBook;
unsigned char relicBookId;
unsigned char unknown90[4];
unsigned char craftingMasterMask;
unsigned char unknown95[10];
unsigned char unknown9F[2];
unsigned char unknownA1[3];
2019-01-08 23:58:14 +01:00
unsigned int exp[26];
unsigned int unknown108;
unsigned int pvpTotalExp;
unsigned int unknownPvp110;
unsigned int pvpExp;
unsigned int pvpFrontlineOverallRanks[3];
2019-01-12 10:47:45 +01:00
unsigned short levels[26];
unsigned short unknown15C[9];
unsigned short u1;
unsigned short u2;
unsigned short unknown112[23];
unsigned short fishingRecordsFish[26];
unsigned short beastExp[11];
unsigned short unknown1EA[5];
unsigned short pvpFrontlineWeeklyRanks[3];
unsigned short unknownMask1FA[4];
unsigned char companionName[21];
unsigned char companionDefRank;
unsigned char companionAttRank;
unsigned char companionHealRank;
unsigned char u19[2];
unsigned char mountGuideMask[17];
char name[32];
2019-01-12 10:47:45 +01:00
unsigned char unknownOword[16];
unsigned char unknownOw;
unsigned char unlockBitmask[64];
unsigned char aetheryte[17];
unsigned char discovery[421];
unsigned char howto[34];
unsigned char minions[42];
unsigned char chocoboTaxiMask[8];
unsigned char watchedCutscenes[118];
unsigned char companionBardingMask[9];
unsigned char companionEquippedHead;
unsigned char companionEquippedBody;
unsigned char companionEquippedLegs;
unsigned char unknown52A[4];
unsigned char unknownMask52E[11];
unsigned char fishingGuideMask[89];
unsigned char fishingSpotVisited[25];
unsigned char unknown59A[15];
unsigned char unknown5A9[5];
unsigned char beastRank[11];
unsigned char unknownPvp5AB[11];
unsigned char unknown5B9[5];
unsigned char unknown5B91;
unsigned char pose;
unsigned char challengeLogComplete[9];
unsigned char weaponPose;
unsigned char unknownMask673[10];
unsigned char unknownMask5DD[28];
unsigned char relicCompletion[12];
2019-01-12 11:22:30 +01:00
unsigned char sightseeingMask[26];
2019-01-12 10:47:45 +01:00
unsigned char huntingMarkMask[55];
unsigned char tripleTriadCards[32];
2019-01-12 11:22:30 +01:00
unsigned char u12[11];
2019-01-12 10:47:45 +01:00
unsigned char u13;
unsigned char aetherCurrentMask[22];
unsigned char u10[3];
unsigned char orchestrionMask[40];
2019-01-12 11:22:30 +01:00
unsigned char hallOfNoviceCompletion[3];
unsigned char animaCompletion[11];
2019-01-12 10:47:45 +01:00
unsigned char u14[16];
unsigned char u15[13];
unsigned char unlockedRaids[28];
unsigned char unlockedDungeons[18];
unsigned char unlockedGuildhests[10];
unsigned char unlockedTrials[8];
unsigned char unlockedPvp[5];
unsigned char clearedRaids[28];
unsigned char clearedDungeons[18];
unsigned char clearedGuildhests[10];
unsigned char clearedTrials[8];
unsigned char clearedPvp[5];
unsigned short fishingRecordsFishWeight[26];
2019-01-12 00:19:23 +01:00
unsigned int exploratoryMissionNextTimestamp;
2019-01-12 10:47:45 +01:00
unsigned char pvpLevel;
2017-08-08 13:53:47 +02:00
};
2019-01-12 00:19:23 +01:00
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to set a players stats
*/
struct FFXIVIpcPlayerStats : FFXIVIpcBasePacket< PlayerStats >
{
uint32_t strength;
uint32_t dexterity;
uint32_t vitality;
uint32_t intelligence;
uint32_t mind;
uint32_t piety;
uint32_t hp;
uint32_t mp;
uint32_t tp;
uint32_t unknown;
uint32_t unknown_1;
uint32_t unknown_2;
uint32_t tenacity;
uint32_t attack;
uint32_t defense;
uint32_t accuracy;
uint32_t spellSpeed;
uint32_t magicDefense;
uint32_t criticalHitRate;
uint32_t resistanceSlashing;
uint32_t resistancePiercing;
uint32_t resistanceBlunt;
uint32_t attackMagicPotency;
uint32_t healingMagicPotency;
uint32_t fire;
uint32_t ice;
uint32_t wind;
uint32_t earth;
uint32_t lightning;
uint32_t water;
uint32_t determination;
uint32_t skillSpeed;
uint32_t spellSpeed1;
uint32_t spellSpeedMod;
uint32_t unknown_6;
uint32_t craftsmanship;
uint32_t control;
uint32_t gathering;
uint32_t perception;
uint32_t resistanceSlow;
uint32_t resistanceSilence;
uint32_t resistanceBlind;
uint32_t resistancePoison;
uint32_t resistanceStun;
uint32_t resistanceSleep;
uint32_t resistanceBind;
uint32_t resistanceHeavy;
uint32_t unknown_7[9]; // possibly level sync stats.
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to set an actors current owner
*/
struct FFXIVIpcActorOwner :
FFXIVIpcBasePacket< ActorOwner >
2017-08-08 13:53:47 +02:00
{
uint8_t type;
uint8_t padding[7];
uint32_t actorId;
uint32_t actorId2;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to set a players state
*/
struct FFXIVIpcPlayerStateFlags :
FFXIVIpcBasePacket< PlayerStateFlags >
2017-08-08 13:53:47 +02:00
{
uint8_t flags[12];
uint32_t padding;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* containing current class information
*/
struct FFXIVIpcPlayerClassInfo :
FFXIVIpcBasePacket< PlayerClassInfo >
2017-08-08 13:53:47 +02:00
{
uint16_t classId;
uint8_t unknown;
uint8_t isSpecialist;
2018-10-20 15:39:20 +03:00
uint16_t syncedLevel; // Locks actions, equipment, prob more. Player's current level (synced).
uint16_t classLevel; // Locks roles, prob more. Player's actual unsynced level.
uint32_t roleActions[10];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update a players appearance
*/
struct FFXIVIpcModelEquip :
FFXIVIpcBasePacket< ModelEquip >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint64_t mainWeapon;
/* 0008 */ uint64_t offWeapon;
/* 0010 */ uint8_t unk1;
/* 0011 */ uint8_t classJobId;
/* 0012 */ uint8_t level;
/* 0013 */ uint8_t unk2;
/* 0014 */ uint32_t models[10];
/* 003C */ uint32_t padding2;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcExamine :
FFXIVIpcBasePacket< Examine >
{
uint8_t unkFlag1;
uint8_t unkFlag2;
char classJob;
char level;
uint16_t padding;
uint16_t titleId;
2018-09-12 17:58:19 +10:00
char grandCompany;
char grandCompanyRank;
2018-09-12 17:58:19 +10:00
char unknown[6];
uint32_t u6_fromPSpawn;
uint32_t u7_fromPSpawn;
char padding1[8];
uint64_t mainWeaponModel;
uint64_t secWeaponModel;
char unknown2[16];
struct ItemData
{
uint32_t catalogId;
uint32_t appearanceCatalogId;
uint64_t crafterId;
uint8_t quality;
uint8_t unknown[3];
struct Materia
{
uint16_t materiaId;
uint16_t tier;
} materia[5];
} entries[14];
char name[32];
char padding2;
char unk3[16];
char look[26];
char padding3[5];
uint32_t models[10];
char unknown4[200];
};
struct FFXIVIpcCharaNameReq :
FFXIVIpcBasePacket< CharaNameReq >
{
uint64_t contentId;
char name[32];
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to update a players appearance
*/
struct FFXIVIpcItemInfo :
FFXIVIpcBasePacket< ItemInfo >
{
uint32_t containerSequence;
uint32_t unknown;
uint16_t containerId;
uint16_t slot;
uint32_t quantity;
uint32_t catalogId;
uint32_t reservedFlag;
uint64_t signatureId;
uint8_t hqFlag;
uint8_t unknown2;
uint16_t condition;
uint16_t spiritBond;
2018-09-01 00:00:19 +10:00
uint16_t stain;
uint32_t glamourCatalogId;
uint16_t materia1;
uint16_t materia2;
uint16_t materia3;
uint16_t materia4;
uint16_t materia5;
uint8_t buffer1;
uint8_t buffer2;
uint8_t buffer3;
uint8_t buffer4;
uint8_t buffer5;
uint8_t padding;
uint32_t unknown10;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update a players appearance
*/
struct FFXIVIpcContainerInfo :
FFXIVIpcBasePacket< ContainerInfo >
2017-08-08 13:53:47 +02:00
{
uint32_t containerSequence;
uint32_t numItems;
uint32_t containerId;
uint32_t unknown;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update a players appearance
*/
struct FFXIVIpcCurrencyCrystalInfo :
FFXIVIpcBasePacket< CurrencyCrystalInfo >
2017-08-08 13:53:47 +02:00
{
uint32_t containerSequence;
uint16_t containerId;
uint16_t slot;
uint32_t quantity;
uint32_t unknown;
uint32_t catalogId;
uint32_t unknown1;
uint32_t unknown2;
uint32_t unknown3;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcInventoryTransactionFinish :
FFXIVIpcBasePacket< InventoryTransactionFinish >
2017-08-08 13:53:47 +02:00
{
uint32_t transactionId;
uint32_t transactionId1;
uint64_t padding;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcInventoryTransaction :
FFXIVIpcBasePacket< InventoryTransaction >
2017-08-08 13:53:47 +02:00
{
uint32_t transactionId;
uint8_t type;
uint8_t padding;
uint16_t padding1;
uint32_t ownerId;
uint32_t storageId;
uint16_t slotId;
uint16_t padding2;
uint32_t stackSize;
uint32_t catalogId;
uint32_t someActorId;
int32_t targetStorageId;
uint32_t padding3[3];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcInventoryActionAck :
FFXIVIpcBasePacket< InventoryActionAck >
2017-08-08 13:53:47 +02:00
{
uint32_t sequence;
uint16_t type;
uint16_t padding;
uint32_t padding1;
uint32_t padding2;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update a slot in the inventory
*/
struct FFXIVIpcUpdateInventorySlot :
FFXIVIpcBasePacket< UpdateInventorySlot >
{
uint32_t sequence;
uint32_t unknown;
uint16_t containerId;
uint16_t slot;
uint32_t quantity;
uint32_t catalogId;
uint32_t reservedFlag;
uint64_t signatureId;
uint16_t hqFlag;
uint16_t condition;
uint16_t spiritBond;
uint16_t color;
uint32_t glamourCatalogId;
uint16_t materia1;
uint16_t materia2;
uint16_t materia3;
uint16_t materia4;
uint16_t materia5;
uint8_t buffer1;
uint8_t buffer2;
uint8_t buffer3;
uint8_t buffer4;
uint8_t buffer5;
uint8_t padding;
uint32_t unknown10;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to start an event, not actually playing it, but registering
*/
struct FFXIVIpcEventStart :
FFXIVIpcBasePacket< EventStart >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint64_t actorId;
/* 0008 */ uint32_t eventId;
/* 000C */ uint8_t param1;
/* 000D */ uint8_t param2;
/* 000E */ uint16_t padding;
/* 0010 */ uint32_t param3;
/* 0014 */ uint32_t padding1;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to play an event
*/
struct FFXIVIpcEventPlay :
FFXIVIpcBasePacket< EventPlay >
2017-08-08 13:53:47 +02:00
{
uint64_t actorId;
uint32_t eventId;
uint16_t scene;
uint16_t padding;
uint32_t flags;
uint32_t param3;
uint8_t param4;
uint8_t padding1[3];
uint32_t param5;
uint8_t unknown[8];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to play an event
*/
struct FFXIVIpcDirectorPlayScene :
FFXIVIpcBasePacket< DirectorPlayScene >
{
uint64_t actorId;
uint32_t eventId;
uint16_t scene;
uint16_t padding;
uint32_t flags;
uint32_t param3;
uint8_t param4;
uint8_t padding1[3];
uint32_t param5;
uint8_t unknown8[0x08];
uint8_t unknown[0x38];
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to finish an event
*/
struct FFXIVIpcEventFinish :
FFXIVIpcBasePacket< EventFinish >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint32_t eventId;
/* 0004 */ uint8_t param1;
/* 0005 */ uint8_t param2;
/* 0006 */ uint16_t padding;
/* 0008 */ uint32_t param3;
/* 000C */ uint32_t padding1;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcEventOpenGilShop :
FFXIVIpcBasePacket< EventOpenGilShop >
{
uint64_t actorId;
uint32_t eventId;
uint16_t scene;
uint16_t padding;
uint32_t sceneFlags;
uint32_t unknown_wtf[0x101];
};
2017-08-27 02:03:27 +02:00
/**
* Structural representation of the packet sent by the server
* to respond to a linkshell creation event
*/
struct FFXIVIpcEventLinkshell :
FFXIVIpcBasePacket< EventLinkshell >
2017-08-27 02:03:27 +02:00
{
uint32_t eventId;
uint8_t scene;
uint8_t param1;
uint8_t param2;
uint8_t param3;
uint32_t unknown1;
uint32_t unknown2;
uint32_t unknown3;
uint32_t unknown4;
2017-08-27 02:03:27 +02:00
};
2017-08-08 13:53:47 +02:00
/**
* Structural representation of the packet sent by the server
* to send the active quests
*/
struct FFXIVIpcQuestActiveList :
FFXIVIpcBasePacket< QuestActiveList >
2017-08-08 13:53:47 +02:00
{
Common::QuestActive activeQuests[30];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to send update a quest slot
*/
struct FFXIVIpcQuestUpdate :
FFXIVIpcBasePacket< QuestUpdate >
2017-08-08 13:53:47 +02:00
{
uint16_t slot;
uint16_t padding;
Common::QuestActive questInfo;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to send the completed quests mask
*/
struct FFXIVIpcQuestCompleteList :
FFXIVIpcBasePacket< QuestCompleteList >
2017-08-08 13:53:47 +02:00
{
uint8_t questCompleteMask[480];
uint8_t unknownCompleteMask[32];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to finish a quest
*/
struct FFXIVIpcQuestFinish :
FFXIVIpcBasePacket< QuestFinish >
2017-08-08 13:53:47 +02:00
{
uint16_t questId;
uint8_t flag1;
uint8_t flag2;
uint32_t padding;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to send a quest message
* type 0 default
* type 1 icon
* type 5 status
*/
struct FFXIVIpcQuestMessage :
FFXIVIpcBasePacket< QuestMessage >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint32_t questId;
/* 0000 */ uint8_t msgId;
/* 0000 */ uint8_t type;
/* 0000 */ uint16_t padding1;
/* 0000 */ uint32_t var1;
/* 0000 */ uint32_t var2;
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcQuestTracker :
FFXIVIpcBasePacket< QuestTracker >
2017-08-08 13:53:47 +02:00
{
struct TrackerEntry
{
uint8_t active;
uint8_t questIndex;
} entry[5];
uint16_t padding[3];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcWeatherChange :
FFXIVIpcBasePacket< WeatherChange >
2017-08-08 13:53:47 +02:00
{
uint32_t weatherId;
float delay;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to send a unviel a map
*/
struct FFXIVIpcDiscovery :
FFXIVIpcBasePacket< Discovery >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint32_t map_part_id;
/* 0004 */ uint32_t map_id;
2017-08-08 13:53:47 +02:00
};
/**
* UNKOWN TYPE
*/
struct FFXIVARR_IPC_UNK322 :
FFXIVIpcBasePacket< IPCTYPE_UNK_322 >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint8_t unk[8];
2017-08-08 13:53:47 +02:00
};
/**
* UNKOWN TYPE
*/
struct FFXIVARR_IPC_UNK320 :
FFXIVIpcBasePacket< IPCTYPE_UNK_320 >
2017-08-08 13:53:47 +02:00
{
/* 0000 */ uint8_t unk[0x38];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* prepare zoning, showing screenmessage
*/
struct FFXIVIpcPrepareZoning :
FFXIVIpcBasePacket< PrepareZoning >
2017-08-08 13:53:47 +02:00
{
uint32_t logMessage;
uint16_t targetZone;
uint16_t animation;
uint8_t param4;
uint8_t hideChar;
uint8_t fadeOut;
uint8_t param7;
uint8_t fadeOutTime;
uint8_t unknown; // this changes whether or not the destination zone's name displays during the loading screen. Seems to always be 9 (=hidden) when going to an instance and certain zones, 0 otherwise.
uint16_t padding;
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to trigger content finder events
*
* See https://gist.github.com/Minoost/c35843c4c8a7a931f31fdaac9bce64c2
*/
struct FFXIVIpcCFNotify :
FFXIVIpcBasePacket< CFNotify >
2017-08-08 13:53:47 +02:00
{
uint32_t state1; // 3 = cancelled, 4 = duty ready
uint32_t state2; // if state1 == 3, state2 is cancelled reason
2017-08-08 13:53:47 +02:00
uint32_t param1; // usually classJobId
uint32_t param2; // usually flag
uint32_t param3; // usually languages, sometimes join in progress timestamp
2017-09-10 14:02:16 +09:00
uint16_t param4; // usually roulette id
uint16_t contents[5];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update contents available in duty finder or raid finder
*
* Do note that this packet has to come early in login phase (around initui packet)
* or it won't be applied until you reconnect
*/
struct FFXIVIpcCFAvailableContents :
FFXIVIpcBasePacket< CFAvailableContents >
2017-08-08 13:53:47 +02:00
{
uint8_t contents[0x48];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update adventure in needs in duty roulette
*/
struct FFXIVIpcCFPlayerInNeed :
FFXIVIpcBasePacket< CFPlayerInNeed >
2017-08-08 13:53:47 +02:00
{
// Ordered by roulette id
uint8_t inNeeds[0x10];
2017-08-08 13:53:47 +02:00
};
/**
* Structural representation of the packet sent by the server
* to update duty info in general
*/
struct FFXIVIpcCFDutyInfo :
FFXIVIpcBasePacket< CFDutyInfo >
2017-08-08 13:53:47 +02:00
{
uint8_t penaltyTime;
uint8_t unknown[7];
2017-08-08 13:53:47 +02:00
};
struct FFXIVIpcCFRegisterDuty :
FFXIVIpcBasePacket< CFRegisterDuty >
{
uint32_t unknown0; // 0x301
uint8_t rouletteId; // if it's a daily roulette
uint8_t unknown1; // 0xDB
uint16_t contentId;
};
2017-08-08 13:53:47 +02:00
struct FFXIVIpcCFMemberStatus :
FFXIVIpcBasePacket< CFMemberStatus >
2017-08-10 11:35:05 +09:00
{
uint16_t contentId;
uint16_t unknown1;
uint8_t status;
uint8_t currentTank;
uint8_t currentDps;
uint8_t currentHealer;
uint8_t estimatedTime;
uint8_t unknown2[3];
uint32_t unknown3;
2017-08-10 11:35:05 +09:00
};
struct FFXIVIpcEorzeaTimeOffset :
FFXIVIpcBasePacket< EorzeaTimeOffset >
{
uint64_t timestamp;
};
/**
* Structural representation of the packet sent by the server
* to set the gear show/hide status of a character
*/
struct FFXIVIpcEquipDisplayFlags :
FFXIVIpcBasePacket< EquipDisplayFlags >
{
uint8_t bitmask;
};
2017-08-10 11:35:05 +09:00
/**
* Structural representation of the packet sent by the server
* to mount a player
*/
2018-11-01 23:56:43 +01:00
struct FFXIVIpcMount : FFXIVIpcBasePacket< Mount >
{
uint32_t id;
};
/**
* Structural representation of the packet sent by the server
* to mount a player
*/
2018-11-01 23:56:43 +01:00
struct FFXIVIpcDirectorVars : FFXIVIpcBasePacket< DirectorVars >
{
/*! DirectorType | ContentId */
uint32_t m_directorId;
/*! currect sequence */
uint8_t m_sequence;
/*! current branch */
uint8_t m_branch;
/*! raw storage for flags/vars */
uint8_t m_unionData[10];
/*! unknown */
uint16_t u20;
uint16_t u22;
uint16_t u24;
uint16_t u28;
};
2018-11-01 23:56:43 +01:00
struct FFXIVIpcActorGauge : FFXIVIpcBasePacket< ActorGauge >
{
uint8_t classJobId;
uint8_t data[15]; // depends on classJobId
};
2018-11-01 23:56:43 +01:00
struct FFXIVIpcPerformNote : FFXIVIpcBasePacket< PerformNote >
{
uint8_t data[32];
};
struct FFXIVIpcHousingUpdateLandFlagsSlot : FFXIVIpcBasePacket< HousingUpdateLandFlagsSlot >
{
uint32_t type;
uint32_t unknown;
Common::LandFlagSet flagSet;
};
struct FFXIVIpcHousingLandFlags : FFXIVIpcBasePacket< HousingLandFlags >
2018-11-01 00:18:19 +01:00
{
2018-11-27 23:12:26 +11:00
Common::LandFlagSet freeCompanyHouse; // 00
2018-11-01 00:18:19 +01:00
uint64_t unkown1;
2018-11-27 23:12:26 +11:00
Common::LandFlagSet privateHouse; // 24
2018-11-01 00:18:19 +01:00
uint64_t unkown2;
2018-11-27 23:12:26 +11:00
Common::LandFlagSet apartment; // 48
2018-11-01 00:18:19 +01:00
uint64_t unkown3;
2018-11-27 23:12:26 +11:00
Common::LandFlagSet sharedHouse[2]; //72
2018-11-01 00:18:19 +01:00
uint64_t unkown4;
2018-11-27 23:12:26 +11:00
Common::LandFlagSet unkownHouse;
2018-11-01 00:18:19 +01:00
uint64_t unkown5;
};
2018-11-14 10:00:16 +01:00
//Structs
struct LandStruct
{
uint8_t plotSize; //0
uint8_t houseState; // 2
2018-11-30 00:11:18 +01:00
uint8_t flags; // bit1 -> hasPublicAccess; bit2 -> isPersonalHouse
2018-11-14 10:00:16 +01:00
uint8_t iconAddIcon; // 6
uint32_t fcId; //8
uint32_t fcIcon;// 12
uint32_t fcIconColor; // 16
uint16_t housePart[ 8 ]; // 34
uint8_t houseColour[ 8 ]; // 36
2018-11-14 10:00:16 +01:00
};
2018-11-01 23:56:43 +01:00
struct FFXIVIpcLandUpdate : FFXIVIpcBasePacket< LandUpdate >
2018-11-01 00:18:19 +01:00
{
2018-11-26 23:15:42 +01:00
Common::LandIdent landIdent;
2018-11-14 10:00:16 +01:00
LandStruct land;
2018-11-01 00:18:19 +01:00
};
2018-11-01 23:56:43 +01:00
struct FFXIVIpcLandPriceUpdate : FFXIVIpcBasePacket< LandPriceUpdate >
2018-11-01 00:18:19 +01:00
{
uint32_t price;
uint32_t timeLeft;
};
2018-11-11 14:27:39 +01:00
struct FFXIVIpcLandInfoSign : FFXIVIpcBasePacket< LandInfoSign >
{
2018-11-26 23:15:42 +01:00
Common::LandIdent landIdent;
uint64_t ownerId; // ither contentId or fcId
uint32_t unknow1;
2018-11-11 14:27:39 +01:00
uint8_t houseIconAdd;
uint8_t houseSize;
uint8_t houseType;
char estateName[23];
char estateGreeting[193];
2018-11-11 14:27:39 +01:00
char ownerName[31];
char fcTag[7];
uint8_t tag[3];
};
2018-11-12 09:32:20 +01:00
struct FFXIVIpcLandRename : FFXIVIpcBasePacket< LandRename >
2018-11-11 14:27:39 +01:00
{
2018-11-26 23:15:42 +01:00
Common::LandIdent landIdent;
2018-11-28 00:05:57 +11:00
char houseName[20];
2018-11-11 14:27:39 +01:00
uint32_t padding;
};
2018-11-28 00:05:57 +11:00
struct FFXIVIpcLandUpdateHouseName : FFXIVIpcBasePacket< LandUpdateHouseName >
{
uint32_t unknown[3];
char houseName[20];
uint32_t unknown2[2];
};
struct FFXIVIpcLandSetMap : FFXIVIpcBasePacket< LandSetMap >
2018-11-01 00:18:19 +01:00
{
uint8_t u1;
uint8_t subdivision;
uint8_t u3;
2018-11-01 00:18:19 +01:00
struct
{
uint8_t status;
uint8_t size;
uint8_t isPrivate;
} landInfo[ 30 ];
uint8_t padding[ 3 ];
2018-11-01 00:18:19 +01:00
};
2018-11-01 23:56:43 +01:00
struct FFXIVIpcLandSetInitialize : FFXIVIpcBasePacket< LandSetInitialize >
{
2018-11-26 23:15:42 +01:00
Common::LandIdent landIdent;
uint8_t unknown1;
uint8_t subInstance; // (default : 1/2)
uint8_t unknown3;
uint8_t unknown4;
uint8_t unknown5;
uint8_t unknown6;
uint8_t unknown7;
uint8_t unknown8;
2018-11-14 10:00:16 +01:00
LandStruct land[ 30 ];
2018-11-01 00:18:19 +01:00
};
struct FFXIVIpcYardObjectSpawn : FFXIVIpcBasePacket< YardObjectSpawn >
2018-11-01 00:18:19 +01:00
{
2018-12-26 22:39:00 +11:00
uint8_t landId;
2018-11-01 00:18:19 +01:00
uint8_t objectArray;
uint16_t unknown1;
Common::HousingObject object;
2018-11-01 00:18:19 +01:00
};
struct FFXIVIpcHousingObjectMove : FFXIVIpcBasePacket< HousingObjectMove >
2018-11-01 00:18:19 +01:00
{
uint16_t itemRotation;
uint8_t objectArray;
uint8_t landId;
2019-01-10 15:03:25 +11:00
Common::FFXIVARR_POSITION3 pos;
2018-11-01 00:18:19 +01:00
uint16_t unknown1;
uint16_t unknown2;
uint16_t unknown3;
};
2018-12-01 21:40:30 +01:00
struct FFXIVIpcHousingObjectInitialize : FFXIVIpcBasePacket< HousingObjectInitialize >
2018-11-01 00:18:19 +01:00
{
2018-12-01 21:40:30 +01:00
Common::LandIdent landIdent;
/*!
* when this is 2, actrl 0x400 will hide the additional quarters door
* if it's any other value, it will stay there regardless
*/
2018-12-01 21:40:30 +01:00
int8_t u1; //Outdoor -1 / Indoor 0 - probably indicator
uint8_t packetNum;
2018-12-01 21:40:30 +01:00
uint8_t packetTotal;
uint8_t u2; //Outdoor 0 / Indoor 100(?)
Common::HousingObject object[100];
2018-11-01 00:18:19 +01:00
uint32_t unknown4; //unused
};
2018-12-27 00:36:47 +11:00
struct FFXIVIpcHousingInternalObjectSpawn : FFXIVIpcBasePacket< HousingInternalObjectSpawn >
{
uint16_t containerId;
uint8_t containerOffset;
uint8_t pad1;
2019-01-14 20:05:27 +11:00
Common::HousingObject object;
2018-12-27 00:36:47 +11:00
};
2018-12-01 21:40:30 +01:00
struct FFXIVIpcHousingIndoorInitialize : FFXIVIpcBasePacket< HousingIndoorInitialize >
{
uint16_t u1;
uint16_t u2;
uint16_t u3;
uint16_t u4;
uint32_t indoorItems[10];
};
struct FFXIVIpcHousingWardInfo : FFXIVIpcBasePacket< HousingWardInfo >
{
2018-11-26 23:15:42 +01:00
Common::LandIdent landIdent;
struct HouseInfoEntry
{
uint32_t housePrice;
uint8_t infoFlags;
Common::HousingAppeal houseAppeal[3];
char estateOwnerName[30];
} houseInfoEntry[60];
};
2018-11-22 15:34:17 +11:00
struct FFXIVIpcHousingEstateGreeting : FFXIVIpcBasePacket< HousingEstateGreeting >
{
Common::LandIdent landIdent;
2018-11-22 15:34:17 +11:00
char message[200];
};
2018-11-29 00:19:37 +11:00
struct FFXIVIpcHousingShowEstateGuestAccess :
FFXIVIpcBasePacket< HousingShowEstateGuestAccess >
{
uint32_t unknown[2];
Common::LandIdent ident;
};
/**
* Structural representation of the packet sent by the server
2018-09-26 03:23:31 +10:00
* to show the current shared estate settings
*/
2018-10-11 16:09:53 +11:00
struct FFXIVIpcSharedEstateSettingsResponse :
FFXIVIpcBasePacket< SharedEstateSettingsResponse >
{
2018-10-11 17:15:52 +11:00
struct playerEntry
{
uint64_t contentId;
uint8_t permissions;
char name[0x20];
char padding[0x7];
} entry[3];
};
struct FFXIVIpcMSQTrackerProgress :
FFXIVIpcBasePacket< MSQTrackerProgress >
{
uint32_t id;
uint32_t padding;
};
struct FFXIVIpcMSQTrackerComplete :
FFXIVIpcBasePacket< MSQTrackerComplete >
{
uint32_t id;
uint32_t padding1;
uint64_t padding2;
uint64_t padding3;
uint64_t padding4; // last 4 bytes is uint32_t but who cares
};
struct FFXIVIpcObjectSpawn :
FFXIVIpcBasePacket< ObjectSpawn >
{
uint8_t spawnIndex;
uint8_t objKind;
uint8_t state;
uint8_t unknown3;
uint32_t objId;
uint32_t actorId;
uint32_t levelId;
uint32_t unknown10;
uint32_t someActorId14;
uint32_t gimmickId;
float scale;
int16_t unknown20a;
uint16_t rotation;
int16_t unknown24a;
int16_t unknown24b;
uint16_t unknown28a;
int16_t unknown28c;
uint32_t housingLink;
Common::FFXIVARR_POSITION3 position;
int16_t unknown3C;
int16_t unknown3E;
};
struct FFXIVIpcObjectDespawn :
FFXIVIpcBasePacket< ObjectDespawn >
{
uint8_t spawnIndex;
uint8_t padding[7];
};
struct FFXIVIpcDuelChallenge :
FFXIVIpcBasePacket< DuelChallenge >
{
uint8_t otherClassJobId;
uint8_t otherLevel; // class job level
uint8_t challengeByYou; // 0 if the other challenges you, 1 if you challenges the other.
uint8_t otherItemLevel;
uint32_t otherActorId;
char otherName[32];
2018-03-18 17:40:00 +09:00
};
2018-12-03 00:11:26 +11:00
struct FFXIVIpcMarketBoardSearchResult :
FFXIVIpcBasePacket< MarketBoardSearchResult >
2018-12-02 23:26:21 +11:00
{
2018-12-02 23:40:18 +11:00
struct MarketBoardItem
2018-12-02 23:26:21 +11:00
{
2018-12-02 23:40:18 +11:00
uint32_t itemCatalogId;
2019-01-01 11:51:48 +11:00
uint16_t quantity;
uint16_t demand;
2018-12-02 23:26:21 +11:00
} items[20];
uint32_t itemIndexEnd;
uint32_t padding1;
uint32_t itemIndexStart;
2019-01-01 11:51:48 +11:00
uint32_t requestId;
2018-12-02 23:26:21 +11:00
};
2018-12-03 00:11:26 +11:00
struct FFFXIVIpcMarketBoardItemListingCount :
FFXIVIpcBasePacket< MarketBoardItemListingCount >
2018-12-02 23:40:18 +11:00
{
uint32_t itemCatalogId;
uint32_t unknown1; // does some shit if nonzero
uint16_t requestId;
uint16_t quantity; // high/low u8s read separately?
uint32_t unknown3;
2018-12-02 23:40:18 +11:00
};
2018-12-03 00:11:26 +11:00
struct FFXIVIpcMarketBoardItemListingHistory :
FFXIVIpcBasePacket< MarketBoardItemListingHistory >
{
uint32_t itemCatalogId;
uint32_t itemCatalogId2;
struct MarketListing
{
uint32_t salePrice;
2019-01-01 23:37:32 +11:00
uint32_t purchaseTime;
2018-12-03 00:11:26 +11:00
uint32_t quantity;
2019-01-01 23:37:32 +11:00
uint8_t isHq;
uint8_t padding;
uint8_t onMannequin;
2018-12-03 00:11:26 +11:00
2019-01-01 23:37:32 +11:00
char buyerName[33];
2018-12-03 00:11:26 +11:00
uint32_t itemCatalogId;
} listing[20];
};
2017-11-22 00:29:42 +09:00
2017-08-08 13:53:47 +02:00
} /* Server */
} /* Packets */
} /* Network */
} /* Sapphire */
2017-08-08 13:53:47 +02:00
#endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/