mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-16 13:31:29 +00:00
1020 lines
27 KiB
C++
1020 lines
27 KiB
C++
#ifndef LAURION_STRUCTS_H_
|
|
#define LAURION_STRUCTS_H_
|
|
|
|
namespace Laurion {
|
|
namespace structs {
|
|
// constants
|
|
static const uint32 MAX_PP_AA_ARRAY = 300;
|
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE;
|
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
|
static const uint32 MAX_PP_DISCIPLINES = 300;
|
|
static const uint32 MAX_PP_COMBAT_ABILITY_TIMERS = 25;
|
|
static const uint32 MAX_PP_UNKNOWN_ABILITIES = 25;
|
|
static const uint32 MAX_RECAST_TYPES = 25;
|
|
static const uint32 MAX_ITEM_RECAST_TYPES = 100;
|
|
static const uint32 BLOCKED_BUFF_COUNT = 40;
|
|
static const uint32 BUFF_COUNT = 62;
|
|
static const uint32 MAX_PP_LANGUAGE = 32;
|
|
#pragma pack(1)
|
|
|
|
struct LoginInfo_Struct {
|
|
/*000*/ char login_info[64];
|
|
/*064*/ uint8 unknown064[124];
|
|
/*188*/ uint8 zoning; // 01 if zoning, 00 if not
|
|
/*189*/ uint8 unknown189[275];
|
|
/*488*/
|
|
};
|
|
|
|
struct ClientZoneEntry_Struct {
|
|
/*00*/ uint32 unknown00; // ***Placeholder
|
|
/*04*/ char char_name[64]; // Player firstname [32]
|
|
/*68*/ uint32 unknown68;
|
|
/*72*/ uint32 unknown72;
|
|
/*76*/ uint32 unknown76;
|
|
/*80*/ uint32 unknown80;
|
|
/*84*/ uint32 unknown84;
|
|
/*88*/ uint32 unknown88;
|
|
/*92*/
|
|
};
|
|
|
|
struct Membership_Struct
|
|
{
|
|
/*000*/ uint8 membership; //0 not gold, 2 gold
|
|
/*001*/ uint32 races; // Seen ff ff 01 00
|
|
/*005*/ uint32 classes; // Seen ff ff 01 00
|
|
/*009*/ uint32 entrysize; // Seen 33
|
|
/*013*/ int32 entries[33]; // Most -1, 1, and 0 for Gold Status
|
|
/*145*/
|
|
};
|
|
|
|
struct Membership_Entry_Struct
|
|
{
|
|
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
|
|
/*004*/ uint32 bitwise_entry; // Seen 16 to 65536 - Skips 4096
|
|
/*008*/
|
|
};
|
|
|
|
struct Membership_Setting_Struct
|
|
{
|
|
/*000*/ int8 setting_index; // 0, 1, 2 or 3: f2p, silver, gold, platinum?
|
|
/*001*/ int32 setting_id; // 0 to 23 actually seen but the OP_Membership packet has up to 32
|
|
/*005*/ int32 setting_value;
|
|
/*009*/
|
|
};
|
|
|
|
struct Membership_Details_Struct
|
|
{
|
|
/*000*/ uint32 membership_setting_count; // Seen 96
|
|
/*004*/ Membership_Setting_Struct settings[96]; // 864 Bytes
|
|
/*364*/ uint32 race_entry_count; // Seen 17
|
|
/*368*/ Membership_Entry_Struct membership_races[17]; // 136 Bytes
|
|
/*3f0*/ uint32 class_entry_count; // Seen 15
|
|
/*3f4*/ Membership_Entry_Struct membership_classes[17]; // 136 Bytes
|
|
/*47c*/ uint32 exit_url_length; // Length of the exit_url string (0 for none)
|
|
/*480*/ //char exit_url[42]; // Upgrade to Silver or Gold Membership URL
|
|
};
|
|
|
|
struct MaxCharacters_Struct {
|
|
/*000*/ uint32 max_chars;
|
|
/*004*/ uint32 marketplace_chars;
|
|
/*008*/ int32 unknown008; //some of these probably deal with heroic characters or something
|
|
/*00c*/ int32 unknown00c;
|
|
/*010*/ int32 unknown010;
|
|
/*014*/ int32 unknown014;
|
|
/*018*/ int32 unknown018;
|
|
/*01c*/ int32 unknown01c;
|
|
/*020*/ int32 unknown020;
|
|
/*024*/ int32 unknown024;
|
|
/*028*/ int32 unknown028;
|
|
/*02c*/ int32 unknown02c;
|
|
/*030*/ int32 unknown030;
|
|
/*034*/ int32 unknown034;
|
|
/*038*/
|
|
};
|
|
|
|
struct ExpansionInfo_Struct {
|
|
/*000*/ char Unknown000[64];
|
|
/*064*/ uint32 Expansions;
|
|
};
|
|
|
|
/*
|
|
* Visible equiptment.
|
|
* Size: 20 Octets
|
|
*/
|
|
struct Texture_Struct
|
|
{
|
|
uint32 Material;
|
|
uint32 Unknown1;
|
|
uint32 EliteMaterial;
|
|
uint32 HeroForgeModel;
|
|
uint32 Material2; // Same as material?
|
|
};
|
|
|
|
/*
|
|
** Color_Struct
|
|
** Size: 4 bytes
|
|
** Used for convenience
|
|
** Merth: Gave struct a name so gcc 2.96 would compile
|
|
**
|
|
*/
|
|
struct Tint_Struct
|
|
{
|
|
union {
|
|
struct {
|
|
uint8 Blue;
|
|
uint8 Green;
|
|
uint8 Red;
|
|
uint8 UseTint; // if there's a tint this is FF
|
|
};
|
|
uint32 Color;
|
|
};
|
|
};
|
|
|
|
struct CharSelectEquip : Texture_Struct, Tint_Struct {};
|
|
|
|
struct CharacterSelectEntry_Struct
|
|
{
|
|
char Name[1];
|
|
uint32 Class;
|
|
uint32 Race;
|
|
uint8 Level;
|
|
uint32 ShroudClass;
|
|
uint32 ShroudRace;
|
|
uint16 Zone;
|
|
uint16 Instance;
|
|
uint8 Gender;
|
|
uint8 Face;
|
|
CharSelectEquip Equip[9];
|
|
uint8 Unknown1; //Seen 256
|
|
uint8 Unknown2; //Seen 0
|
|
uint32 DrakkinTattoo;
|
|
uint32 DrakkinDetails;
|
|
uint32 Deity;
|
|
uint32 PrimaryIDFile;
|
|
uint32 SecondaryIDFile;
|
|
uint8 HairColor;
|
|
uint8 BeardColor;
|
|
uint8 EyeColor1;
|
|
uint8 EyeColor2;
|
|
uint8 HairStyle;
|
|
uint8 Beard;
|
|
uint8 Enabled;
|
|
uint8 Tutorial;
|
|
uint32 DrakkinHeritage;
|
|
uint8 Unknown3;
|
|
uint8 GoHome;
|
|
uint32 LastLogin;
|
|
uint8 Unknown4; // Seen 0
|
|
uint8 Unknown5; // Seen 0
|
|
uint8 Unknown6; // Seen 0
|
|
uint8 Unknown7; // Seen 0
|
|
uint32 CharacterId; //A Guess, Character I made a little bit after has a number a few hundred after the first
|
|
uint32 Unknown8; // Seen 1
|
|
};
|
|
|
|
/*
|
|
** Character Selection Struct
|
|
**
|
|
*/
|
|
struct CharacterSelect_Struct
|
|
{
|
|
/*000*/ uint32 CharCount; //number of chars in this packet
|
|
};
|
|
|
|
enum LaurionAppearance : uint32
|
|
{
|
|
None,
|
|
WhoLevel,
|
|
MaxHealth,
|
|
Invisibility,
|
|
PVP,
|
|
Light,
|
|
Animation,
|
|
Sneak,
|
|
SpawnID,
|
|
Health,
|
|
Linkdead,
|
|
FlyMode,
|
|
GM,
|
|
Anonymous,
|
|
GuildID,
|
|
AFK,
|
|
Pet,
|
|
Summoned,
|
|
Unknown18,
|
|
Unknown19,
|
|
SetType,
|
|
NPCName,
|
|
CancelSneakHide,
|
|
AreaHealthRegen,
|
|
AreaManaRegen,
|
|
AreaEnduranceRegen,
|
|
FreezeBeneficialBuffs,
|
|
NPCTintIndex,
|
|
Unknown28,
|
|
Unknown29,
|
|
Unknown30,
|
|
ShowHelm,
|
|
DamageState,
|
|
Unknown33, //Some virtual function call; based on location might be EQPlayers (my guess personally) or FindBits
|
|
TextureType, //Texture ID
|
|
Unknown35,
|
|
Unknown36,
|
|
GuildShow,
|
|
OfflineMode,
|
|
Unknown39,
|
|
Unknown40,
|
|
Unknown41,
|
|
Unknown42,
|
|
Birthdate,
|
|
EncounterLock
|
|
};
|
|
|
|
struct SpawnAppearance_Struct
|
|
{
|
|
/*0000*/ uint32 spawn_id; // ID of the spawn
|
|
/*0004*/ uint32 type; // Values associated with the type
|
|
/*0008*/ uint64 parameter; // Type of data sent
|
|
/*0016*/ uint64 lock_id; //the only place client uses this as far as I can tell is when you send 0x2c as type in which case it sets LockID = this
|
|
/*0024*/
|
|
};
|
|
|
|
struct Spawn_Struct_Bitfields
|
|
{
|
|
union {
|
|
struct {
|
|
// byte 1
|
|
/*00*/ unsigned gender : 2; // Gender (0=male, 1=female, 2=monster)
|
|
/*02*/ unsigned ispet : 1; // Guessed based on observing live spawns
|
|
/*03*/ unsigned afk : 1; // 0=no, 1=afk
|
|
/*04*/ unsigned anon : 2; // 0=normal, 1=anon, 2=roleplay
|
|
/*06*/ unsigned gm : 1;
|
|
/*07*/ unsigned sneak : 1;
|
|
// byte 2
|
|
/*08*/ unsigned lfg : 1;
|
|
/*09*/ unsigned unk9 : 1;
|
|
/*10*/ unsigned invis : 12; // there are 3000 different (non-GM) invis levels
|
|
/*22*/ unsigned linkdead : 1; // 1 Toggles LD on or off after name. Correct for RoF2
|
|
/*23*/ unsigned showhelm : 1;
|
|
// byte 4
|
|
/*24*/ unsigned betabuffed : 1; // Prefixes name with !
|
|
/*25*/ unsigned trader : 1;
|
|
/*26*/ unsigned animationonpop : 1;
|
|
/*27*/ unsigned targetable : 1;
|
|
/*28*/ unsigned targetable_with_hotkey : 1;
|
|
/*29*/ unsigned showname : 1;
|
|
/*30*/ unsigned idleanimationsoff : 1; // what we called statue?
|
|
/*31*/ unsigned untargetable : 1; // bClickThrough
|
|
// byte 5
|
|
/*32*/ unsigned buyer : 1;
|
|
/*33*/ unsigned offline : 1;
|
|
/*34*/ unsigned interactiveobject : 1;
|
|
/*35*/ unsigned missile : 1;
|
|
/*36*/ unsigned title : 1;
|
|
/*37*/ unsigned suffix : 1;
|
|
/*38*/ unsigned unk38 : 1;
|
|
/*39*/ unsigned unk39 : 1;
|
|
};
|
|
uint8 raw[5];
|
|
};
|
|
};
|
|
|
|
struct Spawn_Struct_Position
|
|
{
|
|
union {
|
|
struct {
|
|
signed y : 19;
|
|
signed deltaX : 13;
|
|
|
|
unsigned heading : 12;
|
|
signed z : 19;
|
|
unsigned pad1 : 1;
|
|
|
|
unsigned pitch : 12;
|
|
signed animation : 10; //these might be swapped
|
|
signed deltaHeading : 10; //these might be swapped
|
|
|
|
signed deltaY : 13;
|
|
signed deltaZ : 13;
|
|
unsigned pad3 : 6;
|
|
|
|
signed x : 19;
|
|
unsigned pad4 : 13;
|
|
};
|
|
uint32_t raw[5];
|
|
};
|
|
};
|
|
|
|
struct Client_Position
|
|
{
|
|
/*00*/ float delta_x;
|
|
/*04*/ float x;
|
|
/*08*/ float z;
|
|
/*12*/ signed animation : 10;
|
|
unsigned pitch : 12;
|
|
signed padding1 : 10;
|
|
/*16*/ float delta_y;
|
|
/*20*/ float y;
|
|
/*24*/ signed delta_heading : 10;
|
|
signed heading : 12;
|
|
signed padding2 : 10;
|
|
/*28*/ float delta_z;
|
|
/*32*/
|
|
};
|
|
|
|
struct PlayerPositionUpdateServer_Struct
|
|
{
|
|
/*00*/ uint16 spawn_id;
|
|
/*02*/ uint16 vehicle_id;
|
|
/*04*/ Spawn_Struct_Position position;
|
|
/*24*/
|
|
};
|
|
|
|
struct PlayerPositionUpdateClient_Struct {
|
|
/*00*/ uint16 sequence;
|
|
/*02*/ uint16 spawn_id;
|
|
/*04*/ uint16 vehicle_id;
|
|
/*06*/ Client_Position position;
|
|
/*38*/
|
|
};
|
|
|
|
struct Door_Struct
|
|
{
|
|
/*000*/ char name[32];
|
|
/*032*/ float DefaultY;
|
|
/*036*/ float DefaultX;
|
|
/*040*/ float DefaultZ;
|
|
/*044*/ float DefaultHeading;
|
|
/*048*/ uint32 DefaultDoorAngle; //rof2's incline
|
|
/*052*/ float Y; //most (all I've seen?) doors match the defaults here
|
|
/*056*/ float X;
|
|
/*060*/ float Z;
|
|
/*064*/ float Heading;
|
|
/*068*/ float DoorAngle; //not sure if this is actually a float; it might be a uint32 like DefaultDoorAngle
|
|
/*072*/ uint32 ScaleFactor; //rof2's size
|
|
/*076*/ uint32 Unknown76; //client doesn't seem to read this
|
|
/*080*/ uint8 Id; //doorid
|
|
/*081*/ uint8 Type; //opentype
|
|
/*082*/ uint8 State; //state_at_spawn
|
|
/*083*/ uint8 DefaultState; //invert_state
|
|
/*084*/ int32 Param; //door_param
|
|
/*088*/ uint32 AdventureDoorId;
|
|
/*092*/ uint32 DynDoorID;
|
|
/*096*/ uint32 RealEstateDoorID;
|
|
/*100*/ uint8 bHasScript;
|
|
/*101*/ uint8 bUsable; //1 if clickable
|
|
/*102*/ uint8 bRemainOpen;
|
|
/*103*/ uint8 bVisible; //1 is visible
|
|
/*104*/ uint8 bHeadingChanged;
|
|
/*105*/ uint8 padding1[3];
|
|
/*108*/ float TopSpeed1;
|
|
/*112*/ float TopSpeed2;
|
|
/*116*/ uint8 bNeedsTimeStampSet;
|
|
/*117*/ uint8 padding2[3];
|
|
/*120*/ float unknownFloat1;
|
|
/*124*/ float unknownFloat2;
|
|
/*128*/ uint8 unknownByte1;
|
|
/*129*/ uint8 padding3[3];
|
|
/*132*/
|
|
};
|
|
|
|
struct ZonePoint_Entry {
|
|
/*00*/ uint32 iterator;
|
|
/*04*/ float y;
|
|
/*08*/ float x;
|
|
/*12*/ float z;
|
|
/*16*/ float heading;
|
|
/*20*/ uint16 zoneid;
|
|
/*22*/ uint16 zoneinstance;
|
|
/*24*/ uint32 unknown024;
|
|
/*28*/ uint32 unknown028;
|
|
/*32*/
|
|
};
|
|
|
|
struct ZonePoints {
|
|
/*00*/ uint32 count;
|
|
/*04*/ struct ZonePoint_Entry zpe[0]; // Always add one extra to the end after all zonepoints
|
|
};
|
|
|
|
struct EnterWorld_Struct {
|
|
/*000*/ char name[64];
|
|
/*064*/ int32 unknown1;
|
|
/*068*/ int32 unknown2; //laurion handles these differently so for now im just going to ignore them till i figure it out
|
|
};
|
|
|
|
struct ZoneChange_Struct {
|
|
/*000*/ char char_name[64]; // Character Name
|
|
/*064*/ uint16 zoneID;
|
|
/*066*/ uint16 instanceID;
|
|
/*068*/ uint32 Unknown068;
|
|
/*072*/ uint32 Unknown072;
|
|
/*076*/ float y;
|
|
/*080*/ float x;
|
|
/*084*/ float z;
|
|
/*088*/ uint32 zone_reason; //0x0A == death, I think
|
|
/*092*/ int32 success; // =0 client->server, =1 server->client, -X=specific error
|
|
/*096*/ uint32 Unknown096; // Not sure the extra 4 bytes goes here or earlier in the struct.
|
|
/*100*/
|
|
};
|
|
|
|
struct RequestClientZoneChange_Struct {
|
|
/*000*/ uint16 zone_id;
|
|
/*002*/ uint16 instance_id;
|
|
/*004*/ uint32 unknown004;
|
|
/*008*/ float y;
|
|
/*012*/ float x;
|
|
/*016*/ float z;
|
|
/*020*/ float heading;
|
|
/*024*/ uint32 type; //unknown... values
|
|
/*032*/ uint8 unknown032[144];
|
|
/*172*/ uint32 unknown172;
|
|
/*176*/
|
|
};
|
|
|
|
struct WearChange_Struct {
|
|
/*000*/ uint32 spawn_id;
|
|
/*004*/ uint32 wear_slot_id;
|
|
/*008*/ uint32 armor_id;
|
|
/*012*/ uint32 variation;
|
|
/*016*/ uint32 material;
|
|
/*020*/ uint32 new_armor_id;
|
|
/*024*/ uint32 new_armor_type;
|
|
/*028*/ uint32 color;
|
|
/*032*/
|
|
};
|
|
|
|
struct ExpUpdate_Struct
|
|
{
|
|
/*000*/ uint64 exp; //This is exp % / 1000 now; eg 69250 = 69.25%
|
|
/*008*/ uint64 unknown; //unclear, I didn't see the client actually read this value but i might have missed it
|
|
};
|
|
|
|
struct DeleteSpawn_Struct
|
|
{
|
|
/*00*/ uint32 spawn_id; // Spawn ID to delete
|
|
/*04*/ uint8 unknown04; // Seen 1
|
|
/*05*/
|
|
};
|
|
|
|
//OP_SetServerFilter
|
|
struct SetServerFilter_Struct {
|
|
uint32 filters[68];
|
|
};
|
|
|
|
// Was new to RoF2, doesn't look changed
|
|
// The padding is because these structs are padded to the default 4 bytes
|
|
struct InventorySlot_Struct
|
|
{
|
|
/*000*/ int16 Type;
|
|
/*002*/ int16 Padding1;
|
|
/*004*/ int16 Slot;
|
|
/*006*/ int16 SubIndex;
|
|
/*008*/ int16 AugIndex;
|
|
/*010*/ int16 Padding2;
|
|
/*012*/
|
|
};
|
|
|
|
// Was new for RoF2 - Used for Merchant_Purchase_Struct, doesn't look changed
|
|
// Can't sellfrom other than main inventory so Slot Type is not needed.
|
|
// The padding is because these structs are padded to the default 4 bytes
|
|
struct TypelessInventorySlot_Struct
|
|
{
|
|
/*000*/ int16 Slot;
|
|
/*002*/ int16 SubIndex;
|
|
/*004*/ int16 AugIndex;
|
|
/*006*/ int16 Padding;
|
|
/*008*/
|
|
};
|
|
|
|
struct Consider_Struct {
|
|
/*000*/ uint32 playerid; // PlayerID
|
|
/*004*/ uint32 targetid; // TargetID
|
|
/*008*/ uint32 faction; // Faction
|
|
/*012*/ uint32 level; // Level
|
|
/*016*/ uint32 report_mode; // 0 normally, 4 will do a more detailed report that only works if you have GM flag set
|
|
/*020*/ uint8 rare_creature; // Will do the rare creature string
|
|
/*021*/ uint8 loot_locked; // Will list the target as (loot locked)
|
|
/*022*/ uint8 unknown022; // Padding probably
|
|
/*023*/ uint8 unknown023; // Padding probably
|
|
/*024*/
|
|
};
|
|
|
|
struct ChangeSize_Struct
|
|
{
|
|
/*00*/ uint32 EntityID;
|
|
/*04*/ float Size;
|
|
/*08*/ uint32 Unknown08; // Observed 0
|
|
/*12*/ float Unknown12; // Observed 1.0f
|
|
/*16*/
|
|
};
|
|
|
|
struct SpawnHPUpdate_Struct
|
|
{
|
|
/*00*/ int16 spawn_id;
|
|
/*02*/ int64 cur_hp;
|
|
/*10*/ int64 max_hp;
|
|
/*18*/
|
|
};
|
|
|
|
struct ClickDoor_Struct {
|
|
/*00*/ uint16 player_id;
|
|
/*02*/ uint8 padding1[2];
|
|
/*04*/ int32 unknown1;
|
|
/*08*/ int32 unknown2;
|
|
/*12*/ uint8 doorid;
|
|
/*13*/ uint8 padding2[3];
|
|
};
|
|
|
|
/*
|
|
Flags for special:
|
|
WildRampage: 0x1
|
|
Rampage: 0x2
|
|
NoCastOnText: 0x4
|
|
DoubleBowShot: 0x8
|
|
UnknownSpellFlag: 0x10
|
|
Flurry: 0x20
|
|
Riposte: 0x40
|
|
Critical: 0x80
|
|
Lucky: 0x100
|
|
FinishingBlow: 0x200
|
|
CripplingBlow: 0x400
|
|
Assassinate: 0x800
|
|
DeadlyStrike: 0x1000
|
|
SlayUndead: 0x2000
|
|
Headshot: 0x4000
|
|
Strikethrough: 0x8000
|
|
LuckyRiposte: 0x10000
|
|
Twincast: 0x20000
|
|
Might be more flags beyond this but I'm not sure
|
|
*/
|
|
|
|
struct CombatDamage_Struct
|
|
{
|
|
/*000*/ uint16 target;
|
|
/*002*/ uint16 source;
|
|
/*004*/ uint32 unknown1; //not read by the client
|
|
/*008*/ int64 damage;
|
|
/*016*/ uint32 special; //flags; will document above
|
|
/*020*/ int32 spellid;
|
|
/*024*/ uint32 spell_level; //spell caster level (unconfirmed; it is used for the spell link)
|
|
/*028*/ float force; //I haven't actually been able to confirm these three yet
|
|
/*032*/ float hit_heading;
|
|
/*036*/ int32 hit_pitch;
|
|
/*040*/ uint8 type;
|
|
/*041*/ uint8 padding[3];
|
|
/*044*/ uint32 unknown2; //not read by the client
|
|
/*048*/
|
|
};
|
|
|
|
struct Animation_Struct {
|
|
/*00*/ uint16 spawnid;
|
|
/*02*/ uint8 action;
|
|
/*03*/ uint8 speed;
|
|
/*04*/
|
|
};
|
|
|
|
struct Death_Struct
|
|
{
|
|
/*000*/ uint32 spawn_id;
|
|
/*004*/ uint32 killer_id;
|
|
/*008*/ uint32 corpseid; //not read by client
|
|
/*012*/ uint32 unknown1; //not read by client
|
|
/*016*/ uint32 spell_id;
|
|
/*020*/ uint32 attack_skill;
|
|
/*024*/ uint64 damage;
|
|
/*032*/ uint32 unknown2; //not read by client
|
|
/*036*/ uint32 unknown3; //not read by client
|
|
/*040*/
|
|
};
|
|
|
|
struct DeleteItem_Struct
|
|
{
|
|
/*0000*/ InventorySlot_Struct from_slot;
|
|
/*0012*/ InventorySlot_Struct to_slot;
|
|
/*0024*/ uint32 number_in_stack;
|
|
/*0028*/
|
|
};
|
|
|
|
struct MoveItem_Struct
|
|
{
|
|
/*0000*/ InventorySlot_Struct from_slot;
|
|
/*0012*/ InventorySlot_Struct to_slot;
|
|
/*0024*/ uint32 number_in_stack;
|
|
/*0028*/
|
|
};
|
|
|
|
struct MerchantClickRequest_Struct
|
|
{
|
|
/*000*/ uint32 npc_id; // Merchant NPC's entity id
|
|
/*004*/
|
|
};
|
|
|
|
struct MerchantClickResponse_Struct
|
|
{
|
|
/*000*/ uint32 npc_id; // Merchant NPC's entity id
|
|
/*004*/ uint32 player_id;
|
|
/*008*/ float rate;
|
|
/*012*/ uint32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels
|
|
/*016*/ uint32 ldon_category; // ldon cat for ldon merchants
|
|
/*020*/ uint32 alt_currency1; //These two usually match but I imagine they could be different?
|
|
/*024*/ uint32 alt_currency2;
|
|
/*028*/ uint32 unknown028; // Observed 256
|
|
/*032*/
|
|
};
|
|
|
|
struct BeginCast_Struct
|
|
{
|
|
/*000*/ uint32 spell_id;
|
|
/*004*/ uint16 caster_id;
|
|
/*006*/ uint32 cast_time; // in miliseconds
|
|
/*010*/ uint32 unknown0a; // I think this is caster effective level but im not sure. live always sends 0
|
|
/*014*/ uint8 unknown0e; // 0 will short circuit the cast, seen 1 from live usually, maybe related to interrupts or particles or something
|
|
/*015*/
|
|
};
|
|
|
|
//I've observed 5 s16 that are all -1.
|
|
//Clicky items don't even trigger this as far as i can tell so not sure what this is for now.
|
|
//One of these could have changed to a s32 but im not sure.
|
|
struct CastSpellInventorySlot_Struct {
|
|
/*00*/ int16 type;
|
|
/*02*/ int16 slot;
|
|
/*04*/ int16 sub_index;
|
|
/*06*/ int16 aug_index;
|
|
/*08*/ int16 unknown1;
|
|
/*10*/
|
|
};
|
|
|
|
struct CastSpell_Struct
|
|
{
|
|
/*00*/ uint32 slot;
|
|
/*04*/ uint32 spell_id;
|
|
/*08*/ CastSpellInventorySlot_Struct inventory_slot;
|
|
/*18*/ uint32 target_id;
|
|
/*22*/ uint32 spell_crc;
|
|
/*26*/ float y_pos;
|
|
/*30*/ float x_pos;
|
|
/*34*/ float z_pos;
|
|
/*38*/ uint8 unknown; //not sure, might also be before y_pos; only ever seen zero for both but should be easy to figure out later
|
|
/*39*/
|
|
};
|
|
|
|
struct EQAffectSlot_Struct {
|
|
/*00*/ int32 slot;
|
|
/*04*/ int32 padding;
|
|
/*08*/ int64 value;
|
|
/*16*/
|
|
};
|
|
|
|
struct EQAffect_Struct
|
|
{
|
|
/*000*/ EQAffectSlot_Struct slots[6];
|
|
/*096*/ EqGuid caster_id;
|
|
/*104*/ uint32 flags;
|
|
/*108*/ uint32 spell_id;
|
|
/*112*/ uint32 duration;
|
|
/*116*/ uint32 initial_duration;
|
|
/*120*/ uint32 hit_count;
|
|
/*124*/ uint32 viral_timer;
|
|
/*128*/ float modifier;
|
|
/*132*/ float y;
|
|
/*136*/ float x;
|
|
/*140*/ float z;
|
|
/*144*/ uint8 level;
|
|
/*145*/ uint8 type;
|
|
/*146*/ uint8 charges; //no idea if these are right; eqlib doesn't seem to know either
|
|
/*147*/ uint8 activatable;
|
|
/*148*/ uint32 unknown1; //might be some timer, not sure though
|
|
/*152*/
|
|
};
|
|
|
|
struct EQAffectPacket_Struct {
|
|
/*000*/ uint32 entity_id;
|
|
/*004*/ int32 unknown004;
|
|
/*008*/ EQAffect_Struct affect;
|
|
/*160*/ uint32 slot_id;
|
|
/*164*/ uint32 buff_fade;
|
|
/*168*/
|
|
};
|
|
|
|
struct ManaChange_Struct
|
|
{
|
|
uint32 new_mana;
|
|
uint32 stamina;
|
|
uint32 spell_id;
|
|
uint32 keepcasting;
|
|
int32 slot;
|
|
};
|
|
|
|
//This is what we call OP_Action
|
|
//To the client though this is basically a missile hit though
|
|
//OP_Action is basically "instant missile hit" to the client
|
|
//@0x1401f0970 MissileHitInfo::Deserialize(CUnSerializeBuffer *buffer);
|
|
struct MissileHitInfo
|
|
{
|
|
uint16 target;
|
|
uint16 source;
|
|
uint32 spell_id;
|
|
//4 leaves a buff
|
|
uint32 effect_type;
|
|
uint32 effective_casting_level;
|
|
//Client does read this but only does something if it's negative
|
|
int64 unknown1;
|
|
//I don't see the client read this one outside basic serialization
|
|
int64 unknown2;
|
|
//I don't see the client read this one either but based on captures from live it seems to match spell damage
|
|
int64 damage;
|
|
float modifier;
|
|
float force;
|
|
float hit_heading;
|
|
float hit_pitch;
|
|
//same convention as damage
|
|
//231 for spell, otherwise it's skill in use
|
|
uint8 skill;
|
|
uint8 level; //the client doesn't actually deserialize anything past level
|
|
//live however has a lot more info here depending on packet type
|
|
};
|
|
|
|
struct MobHealth_Struct
|
|
{
|
|
/*01*/ int16 spawn_id;
|
|
/*00*/ uint32 hp;
|
|
};
|
|
|
|
struct GMTrainee_Struct
|
|
{
|
|
/*000*/ uint32 npcid;
|
|
/*004*/ uint32 playerid;
|
|
/*008*/ uint32 skills[PACKET_SKILL_ARRAY_SIZE];
|
|
/*408*/ uint8 unknown408[36];
|
|
/*444*/
|
|
};
|
|
|
|
struct GMTrainSkillConfirm_Struct {
|
|
/*000*/ uint32 SkillID;
|
|
/*004*/ uint32 Cost;
|
|
/*008*/ uint8 NewSkill; // Set to 1 for 'You have learned the basics' message.
|
|
/*009*/ char TrainerName[64];
|
|
/*073*/ uint8 Unknown073[3];
|
|
/*076*/
|
|
};
|
|
|
|
struct SkillUpdate_Struct {
|
|
/*00*/ uint32 skillId;
|
|
/*04*/ uint32 value;
|
|
/*08*/ uint8 active;
|
|
/*09*/ uint8 padding[3];
|
|
/*12*/
|
|
};
|
|
|
|
struct AA_Array
|
|
{
|
|
uint32 AA;
|
|
uint32 value;
|
|
uint32 charges; // expendable charges
|
|
bool bUnknown0x0c; // added test winter 2024; removed sometime in summer 2024
|
|
};
|
|
|
|
struct AATable_Struct {
|
|
/*00*/ uint32 aa_spent; // Total AAs Spent
|
|
/*04*/ uint32 aapoints_assigned[6]; // none, general, arch, class, special, focus, merc
|
|
/*24*/ AA_Array aa_list[MAX_PP_AA_ARRAY];
|
|
};
|
|
|
|
struct AltAdvStats_Struct {
|
|
/*000*/ uint32 experience;
|
|
/*004*/ uint32 unspent;
|
|
/*008*/ uint8 percentage;
|
|
/*009*/ uint8 unknown009[3];
|
|
};
|
|
|
|
struct BlockedBuffs_Struct
|
|
{
|
|
/*000*/ int32 SpellID[BLOCKED_BUFF_COUNT];
|
|
/*120*/ uint32 Count;
|
|
/*124*/ uint8 Pet;
|
|
/*125*/ uint8 Initialise;
|
|
/*126*/ uint16 Flags;
|
|
};
|
|
|
|
struct ZonePlayerToBind_Struct {
|
|
//Same structure as the binds in PlayerProfile_Struct
|
|
//Assembly calls the same function
|
|
/*000*/ uint16 bind_zone_id;
|
|
/*002*/ uint16 bind_instance_id;
|
|
/*004*/ float x;
|
|
/*008*/ float y;
|
|
/*012*/ float z;
|
|
/*016*/ float heading;
|
|
/*020*/ char zone_name[1]; // Or "Bind Location"
|
|
/*021*/ uint32 unknown1;
|
|
/*025*/ uint32 unknown2;
|
|
/*029*/ uint32 unknown3;
|
|
};
|
|
|
|
struct ArmorPropertyStruct
|
|
{
|
|
/*000*/ uint32 type;
|
|
/*004*/ uint32 variation;
|
|
/*008*/ uint32 material;
|
|
/*012*/ uint32 newArmorID;
|
|
/*016*/ uint32 newArmorType;
|
|
/*020*/
|
|
};
|
|
|
|
struct Illusion_Struct {
|
|
/*000*/ uint32 spawnid;
|
|
/*004*/ char charname[64];
|
|
/*068*/ uint16 race; //according to eqlib this is s32
|
|
/*070*/ char unknown006[2];
|
|
/*072*/ uint8 gender;
|
|
/*073*/ uint8 texture;
|
|
/*074*/ uint8 armorVariation;
|
|
/*075*/ uint8 armorMaterial;
|
|
/*076*/ uint8 helmtexture;
|
|
/*077*/ uint8 unknown077; //padding from this being a pack(4) struct actually
|
|
/*078*/ uint8 unknown078;
|
|
/*079*/ uint8 unknown079;
|
|
/*080*/ uint32 face;
|
|
/*084*/ uint8 hairstyle;
|
|
/*085*/ uint8 haircolor;
|
|
/*086*/ uint8 beard;
|
|
/*087*/ uint8 beardcolor;
|
|
/*088*/ float size;
|
|
/*092*/ uint32_t npc_tint;
|
|
/*096*/ bool keep_armor_properties;
|
|
/*097*/ uint8 unknown097[3]; //padding from this being a pack(4) struct actually
|
|
/*100*/ ArmorPropertyStruct armorProperties[9];
|
|
/*280*/ uint32_t armorTints[9];
|
|
/*316*/ int32 class_;
|
|
/*320*/ uint32 drakkin_heritage;
|
|
/*324*/ uint32 drakkin_tattoo;
|
|
/*328*/ uint32 drakkin_details;
|
|
/*332*/
|
|
};
|
|
|
|
struct moneyOnCorpseStruct {
|
|
/*000*/ uint8 type;
|
|
/*001*/ uint8 padding1[3];
|
|
/*004*/ uint32 flags;
|
|
/*008*/ uint32 platinum;
|
|
/*012*/ uint32 gold;
|
|
/*016*/ uint32 silver;
|
|
/*020*/ uint32 copper;
|
|
/*024*/
|
|
};
|
|
|
|
struct GroupGeneric_Struct {
|
|
/*0000*/ char name1[64];
|
|
/*0064*/ char name2[64];
|
|
/*0128*/ uint32 unknown0128;
|
|
/*0132*/ uint32 unknown0132;
|
|
/*0136*/ uint32 unknown0136;
|
|
/*0140*/ uint32 unknown0140;
|
|
/*0144*/ uint32 unknown0144;
|
|
/*0148*/ uint32 unknown0148;
|
|
/*0152*/ uint16 unknown0152;
|
|
/*0154*/
|
|
};
|
|
|
|
struct AugmentInfo_Struct
|
|
{
|
|
/*000*/ uint32 itemid; // id of the solvent needed
|
|
/*004*/ uint32 window; // window to display the information in
|
|
/*008*/ char augment_info[64]; // total packet length 80, all the rest were always 00
|
|
/*072*/ uint32 unknown072; // seen 0, 56
|
|
/*076*/ uint32 unknown076; // seen 8, 3, 11, always matches what client sends
|
|
/*080*/
|
|
};
|
|
|
|
//seems to be unchanged from rof2?
|
|
//it's the same size at least
|
|
struct AugmentItem_Struct {
|
|
/*00*/ uint32 dest_inst_id; // The unique serial number for the item instance that is being augmented
|
|
/*04*/ uint32 container_index; // Seen 0
|
|
/*08*/ InventorySlot_Struct container_slot; // Slot of the item being augmented
|
|
/*20*/ uint32 augment_index; // Seen 0
|
|
/*24*/ InventorySlot_Struct augment_slot; // Slot of the distiller to use (if one applies)
|
|
/*36*/ int32 augment_action; // Guessed - 0 = augment, 1 = remove with distiller, 3 = delete aug
|
|
/*36*/ //int32 augment_slot;
|
|
/*40*/
|
|
};
|
|
|
|
struct ApplyPoison_Struct
|
|
{
|
|
TypelessInventorySlot_Struct inventorySlot;
|
|
uint32 success;
|
|
};
|
|
|
|
/*
|
|
** Click Object Acknowledgement Struct
|
|
** Response to client clicking on a World Container (ie, forge)
|
|
** Seems to have not changed from RoF2
|
|
*/
|
|
struct ClickObjectAction_Struct {
|
|
/*00*/ //uint32 player_id; // Appears to have been removed
|
|
/*00*/ uint32 drop_id; // Appears to use the object_count field now
|
|
/*04*/ int32 unknown04; // Seen -1
|
|
/*08*/ int32 unknown08; // Seen -1
|
|
/*08*/ //uint32 open; // 1=opening, 0=closing - Removed?
|
|
/*12*/ uint32 type; // See object.h, "Object Types"
|
|
/*16*/ uint32 unknown16; //
|
|
/*20*/ uint32 icon; // Icon to display for tradeskill containers
|
|
/*24*/ uint32 unknown24; //
|
|
/*28*/ char object_name[64]; // Object name to display
|
|
/*92*/
|
|
};
|
|
|
|
//received and sent back as an ACK with different reply_code
|
|
struct RecipeAutoCombine_Struct {
|
|
/*00*/ uint32 object_type;
|
|
/*04*/ uint32 some_id;
|
|
/*08*/ InventorySlot_Struct container_slot; //echoed in reply - Was uint32 unknown1
|
|
/*20*/ InventorySlot_Struct unknown_slot; //echoed in reply
|
|
/*32*/ uint32 recipe_id;
|
|
/*36*/ uint32 reply_code;
|
|
/*40*/
|
|
};
|
|
|
|
/*
|
|
** New Combine Struct
|
|
** Client requesting to perform a tradeskill combine
|
|
** Size: 24 bytes
|
|
** Used In: OP_TradeSkillCombine
|
|
** Last Updated: 01-05-2013
|
|
*/
|
|
struct NewCombine_Struct
|
|
{
|
|
/*00*/ InventorySlot_Struct container_slot;
|
|
/*12*/ InventorySlot_Struct guildtribute_slot; // Slot type is 8? (MapGuildTribute = 8)
|
|
/*24*/
|
|
};
|
|
|
|
struct Disciplines_Struct {
|
|
uint32 values[MAX_PP_DISCIPLINES];
|
|
};
|
|
|
|
struct Merchant_Sell_Request_Struct {
|
|
/*000*/ uint32 npcid; // Merchant NPC's entity id
|
|
/*004*/ uint32 playerid; // Player's entity id
|
|
/*008*/ uint32 itemslot; // Merchant Slot / Item Instance ID
|
|
/*012*/ uint32 unknown12;
|
|
/*016*/ uint32 quantity; // Already sold
|
|
/*020*/
|
|
};
|
|
|
|
struct Merchant_Sell_Response_Struct {
|
|
/*000*/ uint32 npcid; // Merchant NPC's entity id
|
|
/*004*/ uint32 playerid; // Player's entity id
|
|
/*008*/ uint32 itemslot; // Merchant Slot / Item Instance ID
|
|
/*012*/ uint32 unknown12;
|
|
/*016*/ uint32 quantity; // Already sold
|
|
/*020*/ uint32 unknown20;
|
|
/*024*/ uint32 price;
|
|
/*028*/ uint32 unknown28; // Normally 0, but seen 84 c5 63 00 as well
|
|
/*032*/
|
|
};
|
|
|
|
struct Merchant_Purchase_Request_Struct {
|
|
/*000*/ uint32 npcid; // Merchant NPC's entity id
|
|
/*004*/ TypelessInventorySlot_Struct inventory_slot;
|
|
/*012*/ uint32 quantity;
|
|
/*016*/
|
|
};
|
|
|
|
struct Merchant_Purchase_Response_Struct {
|
|
/*000*/ uint32 npcid; // Merchant NPC's entity id
|
|
/*004*/ TypelessInventorySlot_Struct inventory_slot;
|
|
/*012*/ uint32 quantity;
|
|
/*016*/ uint32 price;
|
|
/*020*/ uint32 unknown020;
|
|
/*024*/
|
|
};
|
|
|
|
/*
|
|
** Cancel Trade struct
|
|
** Sent when a player cancels a trade
|
|
** Size: 8 bytes
|
|
** Used In: OP_CancelTrade
|
|
**
|
|
*/
|
|
struct CancelTrade_Struct {
|
|
/*00*/ uint32 fromid;
|
|
/*04*/ uint32 action;
|
|
/*08*/
|
|
};
|
|
|
|
struct Stun_Struct { // 8 bytes total
|
|
/*000*/ uint32 duration; // Duration of stun
|
|
/*004*/ uint8 unknown004; // seen 0
|
|
/*005*/ uint8 unknown005; // seen 163
|
|
/*006*/ uint8 unknown006; // seen 67
|
|
/*007*/ uint8 unknown007; // seen 0
|
|
/*008*/
|
|
};
|
|
#pragma pack()
|
|
|
|
}; //end namespace structs
|
|
}; //end namespace laurion
|
|
|
|
#endif /*LAURION_STRUCTS_H_*/
|