Implemented EQEmu::TextureProfile

This commit is contained in:
Uleat 2016-06-01 08:54:26 -04:00
parent ae3c98c692
commit cd8cd90a38
29 changed files with 467 additions and 462 deletions

View File

@ -2,6 +2,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50)
------------------------------------------------------- -------------------------------------------------------
== 06/01/2016 == == 06/01/2016 ==
Uleat: Implemented EQEmu::TintProfile Uleat: Implemented EQEmu::TintProfile
Uleat: Implemented EQEmu::TextureProfile
== 05/31/2016 == == 05/31/2016 ==
Uleat: Converted enumeration MaterialSlots to EQEmu::textures::TextureSlot Uleat: Converted enumeration MaterialSlots to EQEmu::textures::TextureSlot

View File

@ -126,22 +126,9 @@ struct LDoNTrapTemplate
// All clients translate the character select information to some degree // All clients translate the character select information to some degree
struct EquipStruct
{
uint32 Material;
uint32 Unknown1;
uint32 EliteMaterial;
uint32 HeroForgeModel;
uint32 Material2; // Same as material?
};
struct CharSelectEquip struct CharSelectEquip
{ {
uint32 Material; EQEmu::Texture_Struct Textures;
uint32 Unknown1;
uint32 EliteMaterial;
uint32 HeroForgeModel;
uint32 Material2;
EQEmu::Tint_Struct Color; EQEmu::Tint_Struct Color;
}; };
@ -158,7 +145,7 @@ struct CharacterSelectEntry_Struct
uint16 Instance; uint16 Instance;
uint8 Gender; uint8 Gender;
uint8 Face; uint8 Face;
CharSelectEquip Equip[9]; CharSelectEquip Equip[EQEmu::textures::TextureCount];
uint8 Unknown15; // Seen FF uint8 Unknown15; // Seen FF
uint8 Unknown19; // Seen FF uint8 Unknown19; // Seen FF
uint32 DrakkinTattoo; uint32 DrakkinTattoo;
@ -267,22 +254,7 @@ struct Spawn_Struct {
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner /*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader /*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
/*0194*/ uint8 unknown0194[3]; /*0194*/ uint8 unknown0194[3];
/*0197*/ union /*0197*/ EQEmu::TextureProfile equipment;
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equipment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equipment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equipment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equipment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equipment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equipment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equipment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equipment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equipment: Off visual
} equip;
/*0000*/ EquipStruct equipment[EQEmu::textures::TextureCount];
};
/*0233*/ float runspeed; // Speed when running /*0233*/ float runspeed; // Speed when running
/*0036*/ uint8 afk; // 0=no, 1=afk /*0036*/ uint8 afk; // 0=no, 1=afk
/*0238*/ uint32 guildID; // Current guild /*0238*/ uint32 guildID; // Current guild
@ -854,7 +826,7 @@ struct SuspendedMinion_Struct
/*002*/ uint32 HP; /*002*/ uint32 HP;
/*006*/ uint32 Mana; /*006*/ uint32 Mana;
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT]; /*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
/*510*/ uint32 Items[EQEmu::textures::TextureCount]; /*510*/ EQEmu::TextureShortProfile Items;
/*546*/ char Name[64]; /*546*/ char Name[64];
/*610*/ /*610*/
}; };
@ -962,7 +934,7 @@ struct PlayerProfile_Struct
/*0304*/ uint8 ability_time_minutes; /*0304*/ uint8 ability_time_minutes;
/*0305*/ uint8 ability_time_hours; //place holder /*0305*/ uint8 ability_time_hours; //place holder
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag? /*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
/*0312*/ uint32 item_material[EQEmu::textures::TextureCount]; // Item texture/material of worn/held items /*0312*/ EQEmu::TextureShortProfile item_material; // Item texture/material of worn/held items
/*0348*/ uint8 unknown0348[44]; /*0348*/ uint8 unknown0348[44];
/*0392*/ EQEmu::TintProfile item_tint; /*0392*/ EQEmu::TintProfile item_tint;
/*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; /*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY];
@ -2118,7 +2090,7 @@ struct Illusion_Struct { //size: 256 - SoF
/*092*/ uint32 drakkin_heritage; // /*092*/ uint32 drakkin_heritage; //
/*096*/ uint32 drakkin_tattoo; // /*096*/ uint32 drakkin_tattoo; //
/*100*/ uint32 drakkin_details; // /*100*/ uint32 drakkin_details; //
/*104*/ uint32 armor_tint[EQEmu::textures::TextureCount]; // /*104*/ EQEmu::TintProfile armor_tint; //
/*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct /*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct
/*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct /*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct
/*142*/ uint8 unknown138[114]; // /*142*/ uint8 unknown138[114]; //

View File

@ -40,7 +40,7 @@ struct ExtendedProfile_Struct {
uint16 old_pet_hp; /* Not Used */ uint16 old_pet_hp; /* Not Used */
uint16 old_pet_mana; /* Not Used */ uint16 old_pet_mana; /* Not Used */
SpellBuff_Struct pet_buffs[BUFF_COUNT]; /* Not Used */ SpellBuff_Struct pet_buffs[BUFF_COUNT]; /* Not Used */
uint32 pet_items[EQEmu::textures::TextureCount]; /* Not Used */ EQEmu::TextureShortProfile pet_items; /* Not Used */
char merc_name[64]; /* Used */ char merc_name[64]; /* Used */
uint32 aa_effects; /* Used */ uint32 aa_effects; /* Used */

View File

@ -2070,7 +2070,7 @@ namespace RoF
for (int r = 0; r < 9; r++) for (int r = 0; r < 9; r++)
{ {
outapp->WriteUInt32(emu->item_material[r]); outapp->WriteUInt32(emu->item_material.Slot[r].Material);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
@ -3047,11 +3047,11 @@ namespace RoF
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) { for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Textures.Material = emu_cse->Equip[equip_index].Textures.Material;
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Textures.Unknown1 = emu_cse->Equip[equip_index].Textures.Unknown1;
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial; eq_cse->Equip[equip_index].Textures.EliteMaterial = emu_cse->Equip[equip_index].Textures.EliteMaterial;
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel; eq_cse->Equip[equip_index].Textures.HeroForgeModel = emu_cse->Equip[equip_index].Textures.HeroForgeModel;
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2; eq_cse->Equip[equip_index].Textures.Material2 = emu_cse->Equip[equip_index].Textures.Material2;
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color; eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
} }
@ -4090,17 +4090,17 @@ namespace RoF
} }
} }
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
Equipment[k].Material = emu->equipment[k].Material; Equipment[k].Material = emu->equipment.Slot[k].Material;
Equipment[k].Unknown1 = emu->equipment[k].Unknown1; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
Equipment[k].HeroForgeModel = emu->equipment[k].HeroForgeModel; Equipment[k].HeroForgeModel = emu->equipment.Slot[k].HeroForgeModel;
Equipment[k].Material2 = emu->equipment[k].Material2; Equipment[k].Material2 = emu->equipment.Slot[k].Material2;
} }
Buffer += (sizeof(structs::EquipStruct) * 9); Buffer += (sizeof(structs::Texture_Struct) * 9);
} }
else else
{ {
@ -4110,13 +4110,13 @@ namespace RoF
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TexturePrimary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TextureSecondary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);

View File

@ -2154,7 +2154,7 @@ namespace RoF2
for (int r = 0; r < 9; r++) for (int r = 0; r < 9; r++)
{ {
outapp->WriteUInt32(emu->item_material[r]); outapp->WriteUInt32(emu->item_material.Slot[r].Material);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
outapp->WriteUInt32(0); outapp->WriteUInt32(0);
@ -3140,11 +3140,11 @@ namespace RoF2
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) { for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Textures.Material = emu_cse->Equip[equip_index].Textures.Material;
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Textures.Unknown1 = emu_cse->Equip[equip_index].Textures.Unknown1;
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial; eq_cse->Equip[equip_index].Textures.EliteMaterial = emu_cse->Equip[equip_index].Textures.EliteMaterial;
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HeroForgeModel; eq_cse->Equip[equip_index].Textures.HeroForgeModel = emu_cse->Equip[equip_index].Textures.HeroForgeModel;
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Material2; eq_cse->Equip[equip_index].Textures.Material2 = emu_cse->Equip[equip_index].Textures.Material2;
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color; eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
} }
@ -4313,17 +4313,17 @@ namespace RoF2
} }
} }
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
Equipment[k].Material = emu->equipment[k].Material; Equipment[k].Material = emu->equipment.Slot[k].Material;
Equipment[k].Unknown1 = emu->equipment[k].Unknown1; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
Equipment[k].HeroForgeModel = emu->equipment[k].HeroForgeModel; Equipment[k].HeroForgeModel = emu->equipment.Slot[k].HeroForgeModel;
Equipment[k].Material2 = emu->equipment[k].Material2; Equipment[k].Material2 = emu->equipment.Slot[k].Material2;
} }
Buffer += (sizeof(structs::EquipStruct) * 9); Buffer += (sizeof(structs::Texture_Struct) * 9);
} }
else else
{ {
@ -4333,13 +4333,13 @@ namespace RoF2
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TexturePrimary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TextureSecondary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);

View File

@ -176,7 +176,8 @@ struct Tint_Struct
}; };
}; };
struct TintProfile { struct TintProfile
{
union { union {
struct { struct {
Tint_Struct Head; Tint_Struct Head;
@ -193,13 +194,43 @@ struct TintProfile {
}; };
}; };
struct CharSelectEquip /*
* Visible equiptment.
* Size: 20 Octets
*/
struct Texture_Struct
{ {
uint32 Material; uint32 Material;
uint32 Unknown1; uint32 Unknown1;
uint32 EliteMaterial; uint32 EliteMaterial;
uint32 HeroForgeModel; uint32 HeroForgeModel;
uint32 Material2; uint32 Material2; // Same as material?
};
// Needs more research regarding new slots
//struct TextureProfile
//{
// union {
// struct {
// Texture_Struct Head;
// Texture_Struct Chest;
// Texture_Struct Arms;
// Texture_Struct Wrist;
// Texture_Struct Hands;
// Texture_Struct Legs;
// Texture_Struct Feet;
// Texture_Struct Primary;
// Texture_Struct Secondary;
// };
// Texture_Struct Slot[EQEmu::textures::TextureCount];
// };
//
// TextureProfile();
//};
struct CharSelectEquip
{
Texture_Struct Textures;
Tint_Struct Color; Tint_Struct Color;
}; };
@ -248,21 +279,6 @@ struct CharacterSelect_Struct
/*004*/ CharacterSelectEntry_Struct Entries[0]; /*004*/ CharacterSelectEntry_Struct Entries[0];
}; };
/*
* Visible equiptment.
* Size: 20 Octets
*/
struct EquipStruct
{
/*00*/ uint32 Material;
/*04*/ uint32 Unknown1;
/*08*/ uint32 EliteMaterial;
/*12*/ uint32 HeroForgeModel;
/*16*/ uint32 Material2; // Same as material?
/*20*/
};
struct Membership_Entry_Struct struct Membership_Entry_Struct
{ {
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300 /*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
@ -471,17 +487,17 @@ struct Spawn_Struct
{ {
struct struct
{ {
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual /*0000*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual /*0000*/ Texture_Struct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual /*0000*/ Texture_Struct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual /*0000*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual /*0000*/ Texture_Struct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual /*0000*/ Texture_Struct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual /*0000*/ Texture_Struct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual /*0000*/ Texture_Struct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual /*0000*/ Texture_Struct equip_secondary; // Equiptment: Off visual
} equip; } equip;
/*0000*/ EquipStruct equipment[9]; /*0000*/ Texture_Struct equipment[9];
}; };
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4) /*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
@ -1080,34 +1096,34 @@ union
{ {
struct struct
{ {
/*00184*/ EquipStruct equip_helmet; // Equipment: Helmet visual /*00184*/ Texture_Struct equip_helmet; // Equipment: Helmet visual
/*00204*/ EquipStruct equip_chest; // Equipment: Chest visual /*00204*/ Texture_Struct equip_chest; // Equipment: Chest visual
/*00224*/ EquipStruct equip_arms; // Equipment: Arms visual /*00224*/ Texture_Struct equip_arms; // Equipment: Arms visual
/*00244*/ EquipStruct equip_bracers; // Equipment: Wrist visual /*00244*/ Texture_Struct equip_bracers; // Equipment: Wrist visual
/*00264*/ EquipStruct equip_hands; // Equipment: Hands visual /*00264*/ Texture_Struct equip_hands; // Equipment: Hands visual
/*00284*/ EquipStruct equip_legs; // Equipment: Legs visual /*00284*/ Texture_Struct equip_legs; // Equipment: Legs visual
/*00304*/ EquipStruct equip_feet; // Equipment: Boots visual /*00304*/ Texture_Struct equip_feet; // Equipment: Boots visual
/*00324*/ EquipStruct equip_primary; // Equipment: Main visual /*00324*/ Texture_Struct equip_primary; // Equipment: Main visual
/*00344*/ EquipStruct equip_secondary; // Equipment: Off visual /*00344*/ Texture_Struct equip_secondary; // Equipment: Off visual
// Below slots are just guesses, but all 0s anyway... // Below slots are just guesses, but all 0s anyway...
/*00364*/ EquipStruct equip_charm; // Equipment: Non-visual /*00364*/ Texture_Struct equip_charm; // Equipment: Non-visual
/*00384*/ EquipStruct equip_ear1; // Equipment: Non-visual /*00384*/ Texture_Struct equip_ear1; // Equipment: Non-visual
/*00404*/ EquipStruct equip_ear2; // Equipment: Non-visual /*00404*/ Texture_Struct equip_ear2; // Equipment: Non-visual
/*00424*/ EquipStruct equip_face; // Equipment: Non-visual /*00424*/ Texture_Struct equip_face; // Equipment: Non-visual
/*00444*/ EquipStruct equip_neck; // Equipment: Non-visual /*00444*/ Texture_Struct equip_neck; // Equipment: Non-visual
/*00464*/ EquipStruct equip_shoulder; // Equipment: Non-visual /*00464*/ Texture_Struct equip_shoulder; // Equipment: Non-visual
/*00484*/ EquipStruct equip_bracer2; // Equipment: Non-visual /*00484*/ Texture_Struct equip_bracer2; // Equipment: Non-visual
/*00504*/ EquipStruct equip_range; // Equipment: Non-visual /*00504*/ Texture_Struct equip_range; // Equipment: Non-visual
/*00524*/ EquipStruct equip_ring1; // Equipment: Non-visual /*00524*/ Texture_Struct equip_ring1; // Equipment: Non-visual
/*00544*/ EquipStruct equip_ring2; // Equipment: Non-visual /*00544*/ Texture_Struct equip_ring2; // Equipment: Non-visual
/*00564*/ EquipStruct equip_waist; // Equipment: Non-visual /*00564*/ Texture_Struct equip_waist; // Equipment: Non-visual
/*00584*/ EquipStruct equip_powersource;// Equipment: Non-visual /*00584*/ Texture_Struct equip_powersource;// Equipment: Non-visual
/*00604*/ EquipStruct equip_ammo; // Equipment: Non-visual /*00604*/ Texture_Struct equip_ammo; // Equipment: Non-visual
} equip; } equip;
/*00184*/ EquipStruct equipment[22]; // Total Slots /*00184*/ Texture_Struct equipment[22]; // Total Slots
}; };
/*00624*/ uint32 equip2_count; // Seen 9 /*00624*/ uint32 equip2_count; // Seen 9
/*00628*/ EquipStruct equipment2[EQEmu::textures::TextureCount]; // Appears to be Visible slots, but all 0s /*00628*/ Texture_Struct equipment2[EQEmu::textures::TextureCount]; // Appears to be Visible slots, but all 0s
/*00808*/ uint32 tint_count; // Seen 9 /*00808*/ uint32 tint_count; // Seen 9
/*00812*/ TintProfile item_tint; // RR GG BB 00 /*00812*/ TintProfile item_tint; // RR GG BB 00
/*00848*/ uint32 tint_count2; // Seen 9 /*00848*/ uint32 tint_count2; // Seen 9

View File

@ -176,7 +176,8 @@ struct Tint_Struct
}; };
}; };
struct TintProfile { struct TintProfile
{
union { union {
struct { struct {
Tint_Struct Head; Tint_Struct Head;
@ -193,13 +194,43 @@ struct TintProfile {
}; };
}; };
struct CharSelectEquip /*
* Visible equiptment.
* Size: 20 Octets
*/
struct Texture_Struct
{ {
uint32 Material; uint32 Material;
uint32 Unknown1; uint32 Unknown1;
uint32 EliteMaterial; uint32 EliteMaterial;
uint32 HeroForgeModel; uint32 HeroForgeModel;
uint32 Material2; uint32 Material2; // Same as material?
};
// Needs more research regarding new slots
//struct TextureProfile
//{
// union {
// struct {
// Texture_Struct Head;
// Texture_Struct Chest;
// Texture_Struct Arms;
// Texture_Struct Wrist;
// Texture_Struct Hands;
// Texture_Struct Legs;
// Texture_Struct Feet;
// Texture_Struct Primary;
// Texture_Struct Secondary;
// };
// Texture_Struct Slot[EQEmu::textures::TextureCount];
// };
//
// TextureProfile();
//};
struct CharSelectEquip
{
Texture_Struct Textures;
Tint_Struct Color; Tint_Struct Color;
}; };
@ -248,21 +279,6 @@ struct CharacterSelect_Struct
/*004*/ CharacterSelectEntry_Struct Entries[0]; /*004*/ CharacterSelectEntry_Struct Entries[0];
}; };
/*
* Visible equiptment.
* Size: 20 Octets
*/
struct EquipStruct
{
/*00*/ uint32 Material;
/*04*/ uint32 Unknown1;
/*08*/ uint32 EliteMaterial;
/*12*/ uint32 HeroForgeModel;
/*16*/ uint32 Material2; // Same as material?
/*20*/
};
struct Membership_Entry_Struct struct Membership_Entry_Struct
{ {
/*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300 /*000*/ uint32 purchase_id; // Seen 1, then increments 90287 to 90300
@ -465,17 +481,17 @@ struct Spawn_Struct
{ {
struct struct
{ {
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual /*0000*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual /*0000*/ Texture_Struct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual /*0000*/ Texture_Struct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual /*0000*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual /*0000*/ Texture_Struct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual /*0000*/ Texture_Struct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual /*0000*/ Texture_Struct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual /*0000*/ Texture_Struct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual /*0000*/ Texture_Struct equip_secondary; // Equiptment: Off visual
} equip; } equip;
/*0000*/ EquipStruct equipment[9]; /*0000*/ Texture_Struct equipment[9];
}; };
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4) /*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
@ -1063,34 +1079,34 @@ union
{ {
struct struct
{ {
/*00184*/ EquipStruct equip_helmet; // Equiptment: Helmet visual /*00184*/ Texture_Struct equip_helmet; // Equiptment: Helmet visual
/*00204*/ EquipStruct equip_chest; // Equiptment: Chest visual /*00204*/ Texture_Struct equip_chest; // Equiptment: Chest visual
/*00224*/ EquipStruct equip_arms; // Equiptment: Arms visual /*00224*/ Texture_Struct equip_arms; // Equiptment: Arms visual
/*00244*/ EquipStruct equip_bracers; // Equiptment: Wrist visual /*00244*/ Texture_Struct equip_bracers; // Equiptment: Wrist visual
/*00264*/ EquipStruct equip_hands; // Equiptment: Hands visual /*00264*/ Texture_Struct equip_hands; // Equiptment: Hands visual
/*00284*/ EquipStruct equip_legs; // Equiptment: Legs visual /*00284*/ Texture_Struct equip_legs; // Equiptment: Legs visual
/*00304*/ EquipStruct equip_feet; // Equiptment: Boots visual /*00304*/ Texture_Struct equip_feet; // Equiptment: Boots visual
/*00324*/ EquipStruct equip_primary; // Equiptment: Main visual /*00324*/ Texture_Struct equip_primary; // Equiptment: Main visual
/*00344*/ EquipStruct equip_secondary; // Equiptment: Off visual /*00344*/ Texture_Struct equip_secondary; // Equiptment: Off visual
// Below slots are just guesses, but all 0s anyway... // Below slots are just guesses, but all 0s anyway...
/*00364*/ EquipStruct equip_charm; // Equiptment: Non-visual /*00364*/ Texture_Struct equip_charm; // Equiptment: Non-visual
/*00384*/ EquipStruct equip_ear1; // Equiptment: Non-visual /*00384*/ Texture_Struct equip_ear1; // Equiptment: Non-visual
/*00404*/ EquipStruct equip_ear2; // Equiptment: Non-visual /*00404*/ Texture_Struct equip_ear2; // Equiptment: Non-visual
/*00424*/ EquipStruct equip_face; // Equiptment: Non-visual /*00424*/ Texture_Struct equip_face; // Equiptment: Non-visual
/*00444*/ EquipStruct equip_neck; // Equiptment: Non-visual /*00444*/ Texture_Struct equip_neck; // Equiptment: Non-visual
/*00464*/ EquipStruct equip_shoulder; // Equiptment: Non-visual /*00464*/ Texture_Struct equip_shoulder; // Equiptment: Non-visual
/*00484*/ EquipStruct equip_bracer2; // Equiptment: Non-visual /*00484*/ Texture_Struct equip_bracer2; // Equiptment: Non-visual
/*00504*/ EquipStruct equip_range; // Equiptment: Non-visual /*00504*/ Texture_Struct equip_range; // Equiptment: Non-visual
/*00524*/ EquipStruct equip_ring1; // Equiptment: Non-visual /*00524*/ Texture_Struct equip_ring1; // Equiptment: Non-visual
/*00544*/ EquipStruct equip_ring2; // Equiptment: Non-visual /*00544*/ Texture_Struct equip_ring2; // Equiptment: Non-visual
/*00564*/ EquipStruct equip_waist; // Equiptment: Non-visual /*00564*/ Texture_Struct equip_waist; // Equiptment: Non-visual
/*00584*/ EquipStruct equip_powersource; // Equiptment: Non-visual /*00584*/ Texture_Struct equip_powersource; // Equiptment: Non-visual
/*00604*/ EquipStruct equip_ammo; // Equiptment: Non-visual /*00604*/ Texture_Struct equip_ammo; // Equiptment: Non-visual
} equip; } equip;
/*00184*/ EquipStruct equipment[22]; /*00184*/ Texture_Struct equipment[22];
}; };
/*00624*/ uint32 equip2_count; // Seen 9 /*00624*/ uint32 equip2_count; // Seen 9
/*00628*/ EquipStruct equipment2[9]; // Appears to be Visible slots, but all 0s /*00628*/ Texture_Struct equipment2[9]; // Appears to be Visible slots, but all 0s
/*00808*/ uint32 tint_count; // Seen 9 /*00808*/ uint32 tint_count; // Seen 9
/*00812*/ TintProfile item_tint; // RR GG BB 00 /*00812*/ TintProfile item_tint; // RR GG BB 00
/*00848*/ uint32 tint_count2; // Seen 9 /*00848*/ uint32 tint_count2; // Seen 9

View File

@ -1554,9 +1554,9 @@ namespace SoD
OUT(beard); OUT(beard);
// OUT(unknown00178[10]); // OUT(unknown00178[10]);
for (r = 0; r < 9; r++) { for (r = 0; r < 9; r++) {
eq->equipment[r].Material = emu->item_material[r]; eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
eq->equipment[r].Unknown1 = 0; eq->equipment.Slot[r].Unknown1 = 0;
eq->equipment[r].EliteMaterial = 0; eq->equipment.Slot[r].EliteMaterial = 0;
//eq->colors[r].color = emu->colors[r].color; //eq->colors[r].color = emu->colors[r].color;
} }
for (r = 0; r < 7; r++) { for (r = 0; r < 7; r++) {
@ -1994,9 +1994,9 @@ namespace SoD
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) { for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Textures.Material = emu_cse->Equip[equip_index].Textures.Material;
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Textures.Unknown1 = emu_cse->Equip[equip_index].Textures.Unknown1;
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial; eq_cse->Equip[equip_index].Textures.EliteMaterial = emu_cse->Equip[equip_index].Textures.EliteMaterial;
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color; eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
} }
@ -2563,7 +2563,7 @@ namespace SoD
float SpawnSize = emu->size; float SpawnSize = emu->size;
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))) if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
{ {
PacketSize -= (sizeof(structs::EquipStruct) * 9); PacketSize -= (sizeof(structs::Texture_Struct) * 9);
if (emu->size == 0) if (emu->size == 0)
{ {
@ -2773,11 +2773,11 @@ namespace SoD
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TexturePrimary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TextureSecondary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
} }
@ -2785,15 +2785,15 @@ namespace SoD
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
{ {
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
Equipment[k].Material = emu->equipment[k].Material; Equipment[k].Material = emu->equipment.Slot[k].Material;
Equipment[k].Unknown1 = emu->equipment[k].Unknown1; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
} }
Buffer += (sizeof(structs::EquipStruct) * 9); Buffer += (sizeof(structs::Texture_Struct) * 9);
} }
if (strlen(emu->title)) if (strlen(emu->title))
{ {

View File

@ -135,7 +135,8 @@ struct Tint_Struct
}; };
}; };
struct TintProfile { struct TintProfile
{
union { union {
struct { struct {
Tint_Struct Head; Tint_Struct Head;
@ -152,11 +153,40 @@ struct TintProfile {
}; };
}; };
struct CharSelectEquip /*
* Visible equiptment.
* Size: 12 Octets
*/
struct Texture_Struct
{ {
uint32 Material; uint32 Material;
uint32 Unknown1; uint32 Unknown1;
uint32 EliteMaterial; uint32 EliteMaterial;
};
struct TextureProfile
{
union {
struct {
Texture_Struct Head;
Texture_Struct Chest;
Texture_Struct Arms;
Texture_Struct Wrist;
Texture_Struct Hands;
Texture_Struct Legs;
Texture_Struct Feet;
Texture_Struct Primary;
Texture_Struct Secondary;
};
Texture_Struct Slot[EQEmu::textures::TextureCount];
};
TextureProfile();
};
struct CharSelectEquip
{
Texture_Struct Textures;
Tint_Struct Color; Tint_Struct Color;
}; };
@ -169,7 +199,7 @@ struct CharacterSelectEntry_Struct
/*0000*/ uint8 Beard; // /*0000*/ uint8 Beard; //
/*0001*/ uint8 HairColor; // /*0001*/ uint8 HairColor; //
/*0000*/ uint8 Face; // /*0000*/ uint8 Face; //
/*0000*/ CharSelectEquip Equip[9]; /*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
/*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 PrimaryIDFile; //
/*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint32 SecondaryIDFile; //
/*0000*/ uint8 Unknown15; // 0xff /*0000*/ uint8 Unknown15; // 0xff
@ -202,19 +232,6 @@ struct CharacterSelect_Struct
/*0008*/ CharacterSelectEntry_Struct Entries[0]; /*0008*/ CharacterSelectEntry_Struct Entries[0];
}; };
/*
* Visible equiptment.
* Size: 12 Octets
*/
struct EquipStruct
{
/*00*/ uint32 Material;
/*04*/ uint32 Unknown1;
/*08*/ uint32 EliteMaterial;
/*12*/
};
/* /*
** Generic Spawn Struct ** Generic Spawn Struct
** Length: 897 Octets ** Length: 897 Octets
@ -334,22 +351,7 @@ struct Spawn_Struct
/*0000*/ TintProfile equipment_tint; /*0000*/ TintProfile equipment_tint;
// skip these bytes if not a valid player race // skip these bytes if not a valid player race
/*0000*/ union /*0000*/ TextureProfile equipment;
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0000*/ EquipStruct equipment[9];
};
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4) /*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8) /*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
@ -905,22 +907,7 @@ struct PlayerProfile_Struct
/*00216*/ uint8 hairstyle; // Player hair style /*00216*/ uint8 hairstyle; // Player hair style
/*00217*/ uint8 beard; // Player beard type /*00217*/ uint8 beard; // Player beard type
/*00218*/ uint8 unknown00178[14]; //[10]14 on Live? was 10 /*00218*/ uint8 unknown00178[14]; //[10]14 on Live? was 10
/*00232*/ union /*00232*/ TextureProfile equipment;
{
struct
{
/*00228*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*00240*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*00252*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*00264*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*00276*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*00288*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*00300*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*00312*/ EquipStruct equip_primary; // Equiptment: Main visual
/*00324*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*00228*/ EquipStruct equipment[9]; //Live Shows [108] for this part
};
/*00340*/ uint8 unknown00224[156]; // Live Shows [160] /*00340*/ uint8 unknown00224[156]; // Live Shows [160]
/*00496*/ TintProfile item_tint; // RR GG BB 00 /*00496*/ TintProfile item_tint; // RR GG BB 00
/*00532*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each /*00532*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each

View File

@ -1210,9 +1210,9 @@ namespace SoF
OUT(beard); OUT(beard);
// OUT(unknown00178[10]); // OUT(unknown00178[10]);
for (r = 0; r < 9; r++) { for (r = 0; r < 9; r++) {
eq->equipment[r].Material = emu->item_material[r]; eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
eq->equipment[r].Unknown1 = 0; eq->equipment.Slot[r].Unknown1 = 0;
eq->equipment[r].EliteMaterial = 0; eq->equipment.Slot[r].EliteMaterial = 0;
//eq->colors[r].color = emu->colors[r].color; //eq->colors[r].color = emu->colors[r].color;
} }
for (r = 0; r < 7; r++) { for (r = 0; r < 7; r++) {
@ -1650,9 +1650,9 @@ namespace SoF
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) { for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Textures.Material = emu_cse->Equip[equip_index].Textures.Material;
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Textures.Unknown1 = emu_cse->Equip[equip_index].Textures.Unknown1;
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial; eq_cse->Equip[equip_index].Textures.EliteMaterial = emu_cse->Equip[equip_index].Textures.EliteMaterial;
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color; eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
} }
@ -2081,9 +2081,9 @@ namespace SoF
eq->drakkin_heritage = emu->drakkin_heritage; eq->drakkin_heritage = emu->drakkin_heritage;
eq->gender = emu->gender; eq->gender = emu->gender;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
eq->equipment[k].Material = emu->equipment[k].Material; eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
eq->equipment[k].Unknown1 = emu->equipment[k].Unknown1; eq->equipment.Slot[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
eq->equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; eq->equipment.Slot[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color; eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color;
} }
eq->StandState = emu->StandState; eq->StandState = emu->StandState;

View File

@ -135,7 +135,8 @@ struct Tint_Struct
}; };
}; };
struct TintProfile { struct TintProfile
{
union { union {
struct { struct {
Tint_Struct Head; Tint_Struct Head;
@ -152,11 +153,40 @@ struct TintProfile {
}; };
}; };
struct CharSelectEquip /*
* Visible equiptment.
* Size: 12 Octets
*/
struct Texture_Struct
{ {
uint32 Material; uint32 Material;
uint32 Unknown1; uint32 Unknown1;
uint32 EliteMaterial; uint32 EliteMaterial;
};
struct TextureProfile
{
union {
struct {
Texture_Struct Head;
Texture_Struct Chest;
Texture_Struct Arms;
Texture_Struct Wrist;
Texture_Struct Hands;
Texture_Struct Legs;
Texture_Struct Feet;
Texture_Struct Primary;
Texture_Struct Secondary;
};
Texture_Struct Slot[EQEmu::textures::TextureCount];
};
TextureProfile();
};
struct CharSelectEquip
{
Texture_Struct Textures;
Tint_Struct Color; Tint_Struct Color;
}; };
@ -169,7 +199,7 @@ struct CharacterSelectEntry_Struct
/*0000*/ uint8 Beard; // /*0000*/ uint8 Beard; //
/*0001*/ uint8 HairColor; // /*0001*/ uint8 HairColor; //
/*0000*/ uint8 Face; // /*0000*/ uint8 Face; //
/*0000*/ CharSelectEquip Equip[9]; /*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
/*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 PrimaryIDFile; //
/*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint32 SecondaryIDFile; //
/*0000*/ uint8 Unknown15; // 0xff /*0000*/ uint8 Unknown15; // 0xff
@ -200,19 +230,6 @@ struct CharacterSelect_Struct
/*0008*/ CharacterSelectEntry_Struct Entries[0]; /*0008*/ CharacterSelectEntry_Struct Entries[0];
}; };
/*
* Visible equiptment.
* Size: 12 Octets
*/
struct EquipStruct
{
/*00*/ uint32 Material;
/*04*/ uint32 Unknown1;
/*08*/ uint32 EliteMaterial;
/*12*/
};
/* /*
** Generic Spawn Struct ** Generic Spawn Struct
** Length: 897 Octets ** Length: 897 Octets
@ -239,22 +256,7 @@ struct Spawn_Struct {
/*0018*/ uint8 unknown0018[4]; // /*0018*/ uint8 unknown0018[4]; //
/*0022*/ uint8 gender; // Gender (0=male, 1=female, 2=monster) /*0022*/ uint8 gender; // Gender (0=male, 1=female, 2=monster)
/*0023*/ uint8 unknown0023[4]; // /*0023*/ uint8 unknown0023[4]; //
/*0027*/ union /*0027*/ TextureProfile equipment;
{
struct
{
/*0027*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0039*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0051*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0063*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0075*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0087*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0099*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0111*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0123*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0027*/ EquipStruct equipment[9];
};
/*0135*/ uint8 StandState; // Seems to be required to be set to 0x64 for normal animation. /*0135*/ uint8 StandState; // Seems to be required to be set to 0x64 for normal animation.
/*0136*/ uint8 unknown0136; /*0136*/ uint8 unknown0136;
@ -884,22 +886,7 @@ struct PlayerProfile_Struct //23576 Octets
/*00216*/ uint8 hairstyle; // Player hair style /*00216*/ uint8 hairstyle; // Player hair style
/*00217*/ uint8 beard; // Player beard type /*00217*/ uint8 beard; // Player beard type
/*00218*/ uint8 unknown00178[10]; //[10]14 on Live? /*00218*/ uint8 unknown00178[10]; //[10]14 on Live?
/*00228*/ union /*00228*/ TextureProfile equipment;
{
struct
{
/*00228*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*00240*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*00252*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*00264*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*00276*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*00288*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*00300*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*00312*/ EquipStruct equip_primary; // Equiptment: Main visual
/*00324*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*00228*/ EquipStruct equipment[9]; //Live Shows [108] for this part
};
/*00336*/ uint8 unknown00224[156]; // Live Shows [160] /*00336*/ uint8 unknown00224[156]; // Live Shows [160]
/*00496*/ TintProfile item_tint; // RR GG BB 00 /*00496*/ TintProfile item_tint; // RR GG BB 00
/*00544*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each /*00544*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each

View File

@ -904,7 +904,7 @@ namespace Titanium
OUT(beard); OUT(beard);
// OUT(unknown00178[10]); // OUT(unknown00178[10]);
for (r = 0; r < 9; r++) { for (r = 0; r < 9; r++) {
OUT(item_material[r]); OUT(item_material.Slot[r].Material);
OUT(item_tint.Slot[r].Color); OUT(item_tint.Slot[r].Color);
} }
// OUT(unknown00224[48]); // OUT(unknown00224[48]);
@ -1231,7 +1231,7 @@ namespace Titanium
eq->HairStyle[char_index] = emu_cse->HairStyle; eq->HairStyle[char_index] = emu_cse->HairStyle;
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) { for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
eq->Equip[char_index][index] = emu_cse->Equip[index].Material; eq->Equip[char_index].Slot[index].Material = emu_cse->Equip[index].Textures.Material;
} }
eq->SecondaryIDFile[char_index] = emu_cse->SecondaryIDFile; eq->SecondaryIDFile[char_index] = emu_cse->SecondaryIDFile;
@ -1268,7 +1268,7 @@ namespace Titanium
eq->HairStyle[char_index] = 0; eq->HairStyle[char_index] = 0;
for (int index = 0; index < EQEmu::textures::TextureCount; ++index) { for (int index = 0; index < EQEmu::textures::TextureCount; ++index) {
eq->Equip[char_index][index] = 0; eq->Equip[char_index].Slot[index].Material = 0;
} }
eq->SecondaryIDFile[char_index] = 0; eq->SecondaryIDFile[char_index] = 0;
@ -1600,7 +1600,7 @@ namespace Titanium
eq->guildrank = emu->guildrank; eq->guildrank = emu->guildrank;
// eq->unknown0194[3] = emu->unknown0194[3]; // eq->unknown0194[3] = emu->unknown0194[3];
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
eq->equipment[k] = emu->equipment[k].Material; eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color; eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color;
} }
for (k = 0; k < 8; k++) { for (k = 0; k < 8; k++) {

View File

@ -148,6 +148,31 @@ struct TintProfile {
}; };
}; };
struct Texture_Struct
{
uint32 Material;
};
struct TextureProfile
{
union {
struct {
Texture_Struct Head;
Texture_Struct Chest;
Texture_Struct Arms;
Texture_Struct Wrist;
Texture_Struct Hands;
Texture_Struct Legs;
Texture_Struct Feet;
Texture_Struct Primary;
Texture_Struct Secondary;
};
Texture_Struct Slot[EQEmu::textures::TextureCount];
};
TextureProfile();
};
/* /*
** Character Selection Struct ** Character Selection Struct
** Length: 1704 Bytes ** Length: 1704 Bytes
@ -159,7 +184,7 @@ struct CharacterSelect_Struct
/*0040*/ TintProfile CS_Colors[10]; // Characters Equipment Colors - packet requires length for 10 characters..but, client is limited to 8 /*0040*/ TintProfile CS_Colors[10]; // Characters Equipment Colors - packet requires length for 10 characters..but, client is limited to 8
/*0400*/ uint8 BeardColor[10]; // Characters beard Color /*0400*/ uint8 BeardColor[10]; // Characters beard Color
/*0410*/ uint8 HairStyle[10]; // Characters hair style /*0410*/ uint8 HairStyle[10]; // Characters hair style
/*0420*/ uint32 Equip[10][9]; // 0=helm, 1=chest, 2=arm, 3=bracer, 4=hand, 5=leg, 6=boot, 7=melee1, 8=melee2 (Might not be) /*0420*/ TextureProfile Equip[10]; // Characters texture array
/*0780*/ uint32 SecondaryIDFile[10]; // Characters secondary IDFile number /*0780*/ uint32 SecondaryIDFile[10]; // Characters secondary IDFile number
/*0820*/ uint8 Unknown820[10]; // 10x ff /*0820*/ uint8 Unknown820[10]; // 10x ff
/*0830*/ uint8 Unknown830[2]; // 2x 00 /*0830*/ uint8 Unknown830[2]; // 2x 00
@ -256,22 +281,7 @@ struct Spawn_Struct {
/*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner /*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner
/*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader /*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader
/*0194*/ uint8 unknown0194[3]; /*0194*/ uint8 unknown0194[3];
/*0197*/ union /*0197*/ TextureProfile equipment;
{
struct
{
/*0197*/ uint32 equip_helmet; // Equipment: Helmet Visual
/*0201*/ uint32 equip_chest; // Equipment: Chest Visual
/*0205*/ uint32 equip_arms; // Equipment: Arms Visual
/*0209*/ uint32 equip_bracers; // Equipment: Bracers Visual
/*0213*/ uint32 equip_hands; // Equipment: Hands Visual
/*0217*/ uint32 equip_legs; // Equipment: Legs Visual
/*0221*/ uint32 equip_feet; // Equipment: Feet Visual
/*0225*/ uint32 equip_primary; // Equipment: Primary Visual
/*0229*/ uint32 equip_secondary; // Equipment: Secondary Visual
} equip;
/*0197*/ uint32 equipment[9]; // Array elements correspond to struct equipment above
};
/*0233*/ float runspeed; // Speed when running /*0233*/ float runspeed; // Speed when running
/*0036*/ uint8 afk; // 0=no, 1=afk /*0036*/ uint8 afk; // 0=no, 1=afk
/*0238*/ uint32 guildID; // Current guild /*0238*/ uint32 guildID; // Current guild
@ -812,7 +822,7 @@ struct PlayerProfile_Struct
/*00176*/ uint8 hairstyle; // Player hair style /*00176*/ uint8 hairstyle; // Player hair style
/*00177*/ uint8 beard; // Player beard type /*00177*/ uint8 beard; // Player beard type
/*00178*/ uint8 unknown00178[10]; /*00178*/ uint8 unknown00178[10];
/*00188*/ uint32 item_material[9]; // Item texture/material of worn items /*00188*/ TextureProfile item_material; // Item texture/material of worn items
/*00224*/ uint8 unknown00224[44]; /*00224*/ uint8 unknown00224[44];
/*00268*/ TintProfile item_tint; // RR GG BB 00 /*00268*/ TintProfile item_tint; // RR GG BB 00
/*00304*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // AAs /*00304*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // AAs

View File

@ -1807,9 +1807,9 @@ namespace UF
OUT(beard); OUT(beard);
// OUT(unknown00178[10]); // OUT(unknown00178[10]);
for (r = 0; r < 9; r++) { for (r = 0; r < 9; r++) {
eq->equipment[r].Material = emu->item_material[r]; eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material;
eq->equipment[r].Unknown1 = 0; eq->equipment.Slot[r].Unknown1 = 0;
eq->equipment[r].EliteMaterial = 0; eq->equipment.Slot[r].EliteMaterial = 0;
//eq->colors[r].color = emu->colors[r].color; //eq->colors[r].color = emu->colors[r].color;
} }
for (r = 0; r < 7; r++) { for (r = 0; r < 7; r++) {
@ -2291,9 +2291,9 @@ namespace UF
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) { for (int equip_index = 0; equip_index < EQEmu::textures::TextureCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Textures.Material = emu_cse->Equip[equip_index].Textures.Material;
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Textures.Unknown1 = emu_cse->Equip[equip_index].Textures.Unknown1;
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteMaterial; eq_cse->Equip[equip_index].Textures.EliteMaterial = emu_cse->Equip[equip_index].Textures.EliteMaterial;
eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color; eq_cse->Equip[equip_index].Color.Color = emu_cse->Equip[equip_index].Color.Color;
} }
@ -2858,7 +2858,7 @@ namespace UF
float SpawnSize = emu->size; float SpawnSize = emu->size;
if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))) if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)))
{ {
PacketSize -= (sizeof(structs::EquipStruct) * 9); PacketSize -= (sizeof(structs::Texture_Struct) * 9);
if (emu->size == 0) if (emu->size == 0)
{ {
@ -3070,19 +3070,19 @@ namespace UF
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
if (emu->equipment[EQEmu::textures::TexturePrimary].Material > 99999) { if (emu->equipment.Primary.Material > 99999) {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
} else { } else {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TexturePrimary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Primary.Material);
} }
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
if (emu->equipment[EQEmu::textures::TextureSecondary].Material > 99999) { if (emu->equipment.Secondary.Material > 99999) {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 63);
} else { } else {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[EQEmu::textures::TextureSecondary].Material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment.Secondary.Material);
} }
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
@ -3091,19 +3091,19 @@ namespace UF
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
{ {
structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
for (k = 0; k < 9; k++) { for (k = 0; k < 9; k++) {
if (emu->equipment[k].Material > 99999) { if (emu->equipment.Slot[k].Material > 99999) {
Equipment[k].Material = 63; Equipment[k].Material = 63;
} else { } else {
Equipment[k].Material = emu->equipment[k].Material; Equipment[k].Material = emu->equipment.Slot[k].Material;
} }
Equipment[k].Unknown1 = emu->equipment[k].Unknown1; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1;
Equipment[k].EliteMaterial = emu->equipment[k].EliteMaterial; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteMaterial;
} }
Buffer += (sizeof(structs::EquipStruct) * 9); Buffer += (sizeof(structs::Texture_Struct) * 9);
} }
if (strlen(emu->title)) if (strlen(emu->title))
{ {

View File

@ -135,7 +135,8 @@ struct Tint_Struct
}; };
}; };
struct TintProfile { struct TintProfile
{
union { union {
struct { struct {
Tint_Struct Head; Tint_Struct Head;
@ -152,11 +153,40 @@ struct TintProfile {
}; };
}; };
struct CharSelectEquip /*
* Visible equiptment.
* Size: 12 Octets
*/
struct Texture_Struct
{ {
uint32 Material; uint32 Material;
uint32 Unknown1; uint32 Unknown1;
uint32 EliteMaterial; uint32 EliteMaterial;
};
struct TextureProfile
{
union {
struct {
Texture_Struct Head;
Texture_Struct Chest;
Texture_Struct Arms;
Texture_Struct Wrist;
Texture_Struct Hands;
Texture_Struct Legs;
Texture_Struct Feet;
Texture_Struct Primary;
Texture_Struct Secondary;
};
Texture_Struct Slot[EQEmu::textures::TextureCount];
};
TextureProfile();
};
struct CharSelectEquip
{
Texture_Struct Textures;
Tint_Struct Color; Tint_Struct Color;
}; };
@ -169,7 +199,7 @@ struct CharacterSelectEntry_Struct
/*0000*/ uint8 Beard; // /*0000*/ uint8 Beard; //
/*0001*/ uint8 HairColor; // /*0001*/ uint8 HairColor; //
/*0000*/ uint8 Face; // /*0000*/ uint8 Face; //
/*0000*/ CharSelectEquip Equip[9]; /*0000*/ CharSelectEquip Equip[EQEmu::textures::TextureCount];
/*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 PrimaryIDFile; //
/*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint32 SecondaryIDFile; //
/*0000*/ uint8 Unknown15; // 0xff /*0000*/ uint8 Unknown15; // 0xff
@ -202,19 +232,6 @@ struct CharacterSelect_Struct
/*0008*/ CharacterSelectEntry_Struct Entries[0]; /*0008*/ CharacterSelectEntry_Struct Entries[0];
}; };
/*
* Visible equiptment.
* Size: 12 Octets
*/
struct EquipStruct
{
/*00*/ uint32 Material;
/*04*/ uint32 Unknown1;
/*08*/ uint32 EliteMaterial;
/*12*/
};
/* /*
** Generic Spawn Struct ** Generic Spawn Struct
** Length: 897 Octets ** Length: 897 Octets
@ -334,22 +351,7 @@ struct Spawn_Struct
/*0000*/ TintProfile equipment_tint; /*0000*/ TintProfile equipment_tint;
// skip these bytes if not a valid player race // skip these bytes if not a valid player race
/*0000*/ union /*0000*/ TextureProfile equipment;
{
struct
{
/*0000*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*0000*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*0000*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*0000*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*0000*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*0000*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*0000*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*0000*/ EquipStruct equip_primary; // Equiptment: Main visual
/*0000*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*0000*/ EquipStruct equipment[9];
};
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4) /*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8) /*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
@ -954,22 +956,7 @@ struct PlayerProfile_Struct
/*00230*/ uint8 hairstyle; // Player hair style /*00230*/ uint8 hairstyle; // Player hair style
/*00231*/ uint8 beard; // Player beard type /*00231*/ uint8 beard; // Player beard type
/*00232*/ uint8 unknown00232[4]; // was 14 /*00232*/ uint8 unknown00232[4]; // was 14
/*00236*/ union /*00236*/ TextureProfile equipment;
{
struct
{
/*00236*/ EquipStruct equip_helmet; // Equiptment: Helmet visual
/*00248*/ EquipStruct equip_chest; // Equiptment: Chest visual
/*00260*/ EquipStruct equip_arms; // Equiptment: Arms visual
/*00272*/ EquipStruct equip_bracers; // Equiptment: Wrist visual
/*00284*/ EquipStruct equip_hands; // Equiptment: Hands visual
/*00296*/ EquipStruct equip_legs; // Equiptment: Legs visual
/*00308*/ EquipStruct equip_feet; // Equiptment: Boots visual
/*00320*/ EquipStruct equip_primary; // Equiptment: Main visual
/*00332*/ EquipStruct equip_secondary; // Equiptment: Off visual
} equip;
/*00236*/ EquipStruct equipment[9]; //Underfoot Shows [108] for this part
};
/*00344*/ uint8 unknown00344[168]; // Underfoot Shows [160] /*00344*/ uint8 unknown00344[168]; // Underfoot Shows [160]
/*00512*/ TintProfile item_tint; // RR GG BB 00 /*00512*/ TintProfile item_tint; // RR GG BB 00
/*00548*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each /*00548*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [3600] AAs 12 bytes each

View File

@ -85,7 +85,12 @@
EQEmu::TextureProfile::TextureProfile() EQEmu::TextureProfile::TextureProfile()
{ {
memset(&Texture, 0, (sizeof(uint32) * textures::TextureCount)); memset(&Slot, 0, (sizeof(Texture_Struct) * textures::TextureCount));
}
EQEmu::TextureShortProfile::TextureShortProfile()
{
memset(&Slot, 0, (sizeof(uint32) * textures::TextureCount));
} }
EQEmu::TintProfile::TintProfile() EQEmu::TintProfile::TintProfile()

View File

@ -54,25 +54,56 @@ namespace EQEmu
} /*textures*/ } /*textures*/
struct Texture_Struct {
uint32 Material;
uint32 Unknown1;
uint32 EliteMaterial;
uint32 HeroForgeModel;
uint32 Material2; // Same as material?
};
struct TextureProfile { struct TextureProfile {
union { union {
struct { struct {
uint32 Head; Texture_Struct Head;
uint32 Chest; Texture_Struct Chest;
uint32 Arms; Texture_Struct Arms;
uint32 Wrist; Texture_Struct Wrist;
uint32 Hands; Texture_Struct Hands;
uint32 Legs; Texture_Struct Legs;
uint32 Feet; Texture_Struct Feet;
uint32 Primary; Texture_Struct Primary;
uint32 Secondary; Texture_Struct Secondary;
}; };
uint32 Texture[textures::TextureCount]; Texture_Struct Slot[textures::TextureCount];
}; };
TextureProfile(); TextureProfile();
}; };
struct TextureShort_Struct {
uint32 Material;
};
struct TextureShortProfile {
union {
struct {
TextureShort_Struct Head;
TextureShort_Struct Chest;
TextureShort_Struct Arms;
TextureShort_Struct Wrist;
TextureShort_Struct Hands;
TextureShort_Struct Legs;
TextureShort_Struct Feet;
TextureShort_Struct Primary;
TextureShort_Struct Secondary;
};
TextureShort_Struct Slot[textures::TextureCount];
};
TextureShortProfile();
};
struct Tint_Struct { struct Tint_Struct {
union { union {
struct { struct {

View File

@ -118,11 +118,11 @@ void WorldDatabase::GetCharSelectInfo(uint32 accountID, EQApplicationPacket **ou
cse->Face = (uint8)atoi(row[15]); cse->Face = (uint8)atoi(row[15]);
for (uint32 matslot = 0; matslot < EQEmu::textures::TextureCount; matslot++) { // Processed below for (uint32 matslot = 0; matslot < EQEmu::textures::TextureCount; matslot++) { // Processed below
cse->Equip[matslot].Material = 0; cse->Equip[matslot].Textures.Material = 0;
cse->Equip[matslot].Unknown1 = 0; cse->Equip[matslot].Textures.Unknown1 = 0;
cse->Equip[matslot].EliteMaterial = 0; cse->Equip[matslot].Textures.EliteMaterial = 0;
cse->Equip[matslot].HeroForgeModel = 0; cse->Equip[matslot].Textures.HeroForgeModel = 0;
cse->Equip[matslot].Material2 = 0; cse->Equip[matslot].Textures.Material2 = 0;
cse->Equip[matslot].Color.Color = 0; cse->Equip[matslot].Color.Color = 0;
} }
@ -262,12 +262,12 @@ void WorldDatabase::GetCharSelectInfo(uint32 accountID, EQApplicationPacket **ou
// Weapon Models // Weapon Models
if (inst->GetOrnamentationIDFile() != 0) { if (inst->GetOrnamentationIDFile() != 0) {
idfile = inst->GetOrnamentationIDFile(); idfile = inst->GetOrnamentationIDFile();
cse->Equip[matslot].Material = idfile; cse->Equip[matslot].Textures.Material = idfile;
} }
else { else {
if (strlen(item->IDFile) > 2) { if (strlen(item->IDFile) > 2) {
idfile = atoi(&item->IDFile[2]); idfile = atoi(&item->IDFile[2]);
cse->Equip[matslot].Material = idfile; cse->Equip[matslot].Textures.Material = idfile;
} }
} }
if (matslot == EQEmu::textures::TexturePrimary) { if (matslot == EQEmu::textures::TexturePrimary) {
@ -287,9 +287,9 @@ void WorldDatabase::GetCharSelectInfo(uint32 accountID, EQApplicationPacket **ou
} }
// Armor Materials/Models // Armor Materials/Models
cse->Equip[matslot].Material = item->Material; cse->Equip[matslot].Textures.Material = item->Material;
cse->Equip[matslot].EliteMaterial = item->EliteMaterial; cse->Equip[matslot].Textures.EliteMaterial = item->EliteMaterial;
cse->Equip[matslot].HeroForgeModel = inst->GetOrnamentHeroModel(matslot); cse->Equip[matslot].Textures.HeroForgeModel = inst->GetOrnamentHeroModel(matslot);
cse->Equip[matslot].Color.Color = color; cse->Equip[matslot].Color.Color = color;
} }
} }

View File

@ -56,7 +56,7 @@ Beacon::Beacon(Mob *at_mob, int lifetime)
:Mob :Mob
( (
nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, at_mob->GetPosition(), 0, 0, 0, nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, at_mob->GetPosition(), 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQEmu::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
), ),
remove_timer(lifetime), remove_timer(lifetime),
spell_timer(0) spell_timer(0)

View File

@ -2961,16 +2961,16 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
if (inst) { if (inst) {
item = inst->GetItem(); item = inst->GetItem();
if (item != 0) { if (item != 0) {
ns->spawn.equipment[i].Material = item->Material; ns->spawn.equipment.Slot[i].Material = item->Material;
ns->spawn.equipment[i].EliteMaterial = item->EliteMaterial; ns->spawn.equipment.Slot[i].EliteMaterial = item->EliteMaterial;
ns->spawn.equipment[i].HeroForgeModel = item->HerosForgeModel; ns->spawn.equipment.Slot[i].HeroForgeModel = item->HerosForgeModel;
if (armor_tint[i]) if (armor_tint.Slot[i].Color)
ns->spawn.equipment_tint.Slot[i].Color = armor_tint[i]; ns->spawn.equipment_tint.Slot[i].Color = armor_tint.Slot[i].Color;
else else
ns->spawn.equipment_tint.Slot[i].Color = item->Color; ns->spawn.equipment_tint.Slot[i].Color = item->Color;
} else { } else {
if (armor_tint[i]) if (armor_tint.Slot[i].Color)
ns->spawn.equipment_tint.Slot[i].Color = armor_tint[i]; ns->spawn.equipment_tint.Slot[i].Color = armor_tint.Slot[i].Color;
} }
} }
} }
@ -2980,7 +2980,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
item = inst->GetItem(); item = inst->GetItem();
if(item) { if(item) {
if(strlen(item->IDFile) > 2) if(strlen(item->IDFile) > 2)
ns->spawn.equipment[EQEmu::textures::TexturePrimary].Material = atoi(&item->IDFile[2]); ns->spawn.equipment.Primary.Material = atoi(&item->IDFile[2]);
ns->spawn.equipment_tint.Primary.Color = GetEquipmentColor(EQEmu::textures::TexturePrimary); ns->spawn.equipment_tint.Primary.Color = GetEquipmentColor(EQEmu::textures::TexturePrimary);
} }
@ -2991,7 +2991,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) {
item = inst->GetItem(); item = inst->GetItem();
if(item) { if(item) {
if(strlen(item->IDFile) > 2) if(strlen(item->IDFile) > 2)
ns->spawn.equipment[EQEmu::textures::TextureSecondary].Material = atoi(&item->IDFile[2]); ns->spawn.equipment.Secondary.Material = atoi(&item->IDFile[2]);
ns->spawn.equipment_tint.Secondary.Color = GetEquipmentColor(EQEmu::textures::TextureSecondary); ns->spawn.equipment_tint.Secondary.Color = GetEquipmentColor(EQEmu::textures::TextureSecondary);
} }

View File

@ -100,7 +100,7 @@ Client::Client(EQStreamInterface* ieqs)
0, // Drakkin Heritage 0, // Drakkin Heritage
0, // Drakkin Tattoo 0, // Drakkin Tattoo
0, // Drakkin Details 0, // Drakkin Details
0, // Armor Tint EQEmu::TintProfile(), // Armor Tint
0xff, // AA Title 0xff, // AA Title
0, // see_invis 0, // see_invis
0, // see_invis_undead 0, // see_invis_undead
@ -2732,7 +2732,7 @@ void Client::SetMaterial(int16 in_slot, uint32 item_id) {
uint8 matslot = Inventory::CalcMaterialFromSlot(in_slot); uint8 matslot = Inventory::CalcMaterialFromSlot(in_slot);
if (matslot != EQEmu::textures::TextureInvalid) if (matslot != EQEmu::textures::TextureInvalid)
{ {
m_pp.item_material[matslot] = GetEquipmentMaterial(matslot); m_pp.item_material.Slot[matslot].Material = GetEquipmentMaterial(matslot);
} }
} }
} }
@ -6286,7 +6286,7 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid
made_npc->d_melee_texture1 = GetEquipmentMaterial(EQEmu::textures::TexturePrimary); made_npc->d_melee_texture1 = GetEquipmentMaterial(EQEmu::textures::TexturePrimary);
made_npc->d_melee_texture2 = GetEquipmentMaterial(EQEmu::textures::TextureSecondary); made_npc->d_melee_texture2 = GetEquipmentMaterial(EQEmu::textures::TextureSecondary);
for (int i = EQEmu::textures::TextureBegin; i <= EQEmu::textures::LastTexture; i++) { for (int i = EQEmu::textures::TextureBegin; i <= EQEmu::textures::LastTexture; i++) {
made_npc->armor_tint[i] = GetEquipmentColor(i); made_npc->armor_tint.Slot[i].Color = GetEquipmentColor(i);
} }
made_npc->loottable_id = 0; made_npc->loottable_id = 0;

View File

@ -153,7 +153,7 @@ Corpse::Corpse(NPC* in_npc, ItemList* in_itemlist, uint32 in_npctypeid, const NP
in_npc->GetDeity(),in_npc->GetLevel(),in_npc->GetNPCTypeID(),in_npc->GetSize(),0, in_npc->GetDeity(),in_npc->GetLevel(),in_npc->GetNPCTypeID(),in_npc->GetSize(),0,
in_npc->GetPosition(), in_npc->GetInnateLightType(), in_npc->GetTexture(),in_npc->GetHelmTexture(), in_npc->GetPosition(), in_npc->GetInnateLightType(), in_npc->GetTexture(),in_npc->GetHelmTexture(),
0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0), 0,0,0,0,0,0,0,0,0,0,EQEmu::TintProfile(),0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
corpse_decay_timer(in_decaytime), corpse_decay_timer(in_decaytime),
corpse_rez_timer(0), corpse_rez_timer(0),
corpse_delay_timer(RuleI(NPC, CorpseUnlockTimer)), corpse_delay_timer(RuleI(NPC, CorpseUnlockTimer)),
@ -244,7 +244,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob (
client->GetPP().drakkin_heritage, // uint32 in_drakkin_heritage, client->GetPP().drakkin_heritage, // uint32 in_drakkin_heritage,
client->GetPP().drakkin_tattoo, // uint32 in_drakkin_tattoo, client->GetPP().drakkin_tattoo, // uint32 in_drakkin_tattoo,
client->GetPP().drakkin_details, // uint32 in_drakkin_details, client->GetPP().drakkin_details, // uint32 in_drakkin_details,
0, // uint32 in_armor_tint[_MaterialCount], EQEmu::TintProfile(), // uint32 in_armor_tint[_MaterialCount],
0xff, // uint8 in_aa_title, 0xff, // uint8 in_aa_title,
0, // uint8 in_see_invis, // see through invis 0, // uint8 in_see_invis, // see through invis
0, // uint8 in_see_invis_undead, // see through invis vs. undead 0, // uint8 in_see_invis_undead, // see through invis vs. undead
@ -474,7 +474,7 @@ in_helmtexture,
0, 0,
0, 0,
0, 0,
0, EQEmu::TintProfile(),
0xff, 0xff,
0, 0,
0, 0,

View File

@ -36,7 +36,7 @@ Encounter::Encounter(const char* enc_name)
:Mob :Mob
( (
nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, glm::vec4(0,0,0,0), 0, 0, 0, nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, glm::vec4(0,0,0,0), 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQEmu::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
) )
{ {
encounter_name[0] = 0; encounter_name[0] = 0;

View File

@ -1400,15 +1400,15 @@ void lua_create_npc(luabind::adl::object table, float x, float y, float z, float
LuaCreateNPCParse(drakkin_heritage, uint32, 0); LuaCreateNPCParse(drakkin_heritage, uint32, 0);
LuaCreateNPCParse(drakkin_tattoo, uint32, 0); LuaCreateNPCParse(drakkin_tattoo, uint32, 0);
LuaCreateNPCParse(drakkin_details, uint32, 0); LuaCreateNPCParse(drakkin_details, uint32, 0);
LuaCreateNPCParse(armor_tint[0], uint32, 0); LuaCreateNPCParse(armor_tint.Head.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[1], uint32, 0); LuaCreateNPCParse(armor_tint.Chest.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[2], uint32, 0); LuaCreateNPCParse(armor_tint.Arms.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[3], uint32, 0); LuaCreateNPCParse(armor_tint.Wrist.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[4], uint32, 0); LuaCreateNPCParse(armor_tint.Hands.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[5], uint32, 0); LuaCreateNPCParse(armor_tint.Legs.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[6], uint32, 0); LuaCreateNPCParse(armor_tint.Feet.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[7], uint32, 0); LuaCreateNPCParse(armor_tint.Primary.Color, uint32, 0);
LuaCreateNPCParse(armor_tint[8], uint32, 0); LuaCreateNPCParse(armor_tint.Secondary.Color, uint32, 0);
LuaCreateNPCParse(min_dmg, uint32, 2); LuaCreateNPCParse(min_dmg, uint32, 2);
LuaCreateNPCParse(max_dmg, uint32, 4); LuaCreateNPCParse(max_dmg, uint32, 4);
LuaCreateNPCParse(attack_count, int16, 0); LuaCreateNPCParse(attack_count, int16, 0);

View File

@ -73,7 +73,7 @@ Mob::Mob(const char* in_name,
uint32 in_drakkin_heritage, uint32 in_drakkin_heritage,
uint32 in_drakkin_tattoo, uint32 in_drakkin_tattoo,
uint32 in_drakkin_details, uint32 in_drakkin_details,
uint32 in_armor_tint[EQEmu::textures::TextureCount], EQEmu::TintProfile in_armor_tint,
uint8 in_aa_title, uint8 in_aa_title,
uint8 in_see_invis, // see through invis/ivu uint8 in_see_invis, // see through invis/ivu
@ -280,14 +280,7 @@ Mob::Mob(const char* in_name,
for (i = 0; i < EQEmu::textures::TextureCount; i++) for (i = 0; i < EQEmu::textures::TextureCount; i++)
{ {
if (in_armor_tint) armor_tint.Slot[i].Color = in_armor_tint.Slot[i].Color;
{
armor_tint[i] = in_armor_tint[i];
}
else
{
armor_tint[i] = 0;
}
} }
m_Delta = glm::vec4(); m_Delta = glm::vec4();
@ -1159,9 +1152,9 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
// Only Player Races Wear Armor // Only Player Races Wear Armor
if (Mob::IsPlayerRace(race) || i > 6) if (Mob::IsPlayerRace(race) || i > 6)
{ {
ns->spawn.equipment[i].Material = GetEquipmentMaterial(i); ns->spawn.equipment.Slot[i].Material = GetEquipmentMaterial(i);
ns->spawn.equipment[i].EliteMaterial = IsEliteMaterialItem(i); ns->spawn.equipment.Slot[i].EliteMaterial = IsEliteMaterialItem(i);
ns->spawn.equipment[i].HeroForgeModel = GetHerosForgeModel(i); ns->spawn.equipment.Slot[i].HeroForgeModel = GetHerosForgeModel(i);
ns->spawn.equipment_tint.Slot[i].Color = GetEquipmentColor(i); ns->spawn.equipment_tint.Slot[i].Color = GetEquipmentColor(i);
} }
} }
@ -2821,7 +2814,7 @@ void Mob::SetSlotTint(uint8 material_slot, uint8 red_tint, uint8 green_tint, uin
color |= (green_tint & 0xFF) << 8; color |= (green_tint & 0xFF) << 8;
color |= (blue_tint & 0xFF); color |= (blue_tint & 0xFF);
color |= (color) ? (0xFF << 24) : 0; color |= (color) ? (0xFF << 24) : 0;
armor_tint[material_slot] = color; armor_tint.Slot[material_slot].Color = color;
auto outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct)); auto outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct));
WearChange_Struct* wc = (WearChange_Struct*)outapp->pBuffer; WearChange_Struct* wc = (WearChange_Struct*)outapp->pBuffer;
@ -2838,7 +2831,7 @@ void Mob::SetSlotTint(uint8 material_slot, uint8 red_tint, uint8 green_tint, uin
void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 hero_forge_model) void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 hero_forge_model)
{ {
armor_tint[material_slot] = color; armor_tint.Slot[material_slot].Color = color;
auto outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct)); auto outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct));
WearChange_Struct* wc = (WearChange_Struct*)outapp->pBuffer; WearChange_Struct* wc = (WearChange_Struct*)outapp->pBuffer;
@ -2966,9 +2959,9 @@ uint32 Mob::GetEquipmentColor(uint8 material_slot) const
{ {
const EQEmu::ItemBase *item; const EQEmu::ItemBase *item;
if (armor_tint[material_slot]) if (armor_tint.Slot[material_slot].Color)
{ {
return armor_tint[material_slot]; return armor_tint.Slot[material_slot].Color;
} }
item = database.GetItem(GetEquipment(material_slot)); item = database.GetItem(GetEquipment(material_slot));

View File

@ -113,7 +113,7 @@ public:
uint32 in_drakkin_heritage, uint32 in_drakkin_heritage,
uint32 in_drakkin_tattoo, uint32 in_drakkin_tattoo,
uint32 in_drakkin_details, uint32 in_drakkin_details,
uint32 in_armor_tint[EQEmu::textures::TextureCount], EQEmu::TintProfile in_armor_tint,
uint8 in_aa_title, uint8 in_aa_title,
uint8 in_see_invis, // see through invis uint8 in_see_invis, // see through invis
uint8 in_see_invis_undead, // see through invis vs. undead uint8 in_see_invis_undead, // see through invis vs. undead
@ -384,7 +384,7 @@ public:
inline uint8 GetDrakkinHeritage() const { return drakkin_heritage; } inline uint8 GetDrakkinHeritage() const { return drakkin_heritage; }
inline uint8 GetDrakkinTattoo() const { return drakkin_tattoo; } inline uint8 GetDrakkinTattoo() const { return drakkin_tattoo; }
inline uint8 GetDrakkinDetails() const { return drakkin_details; } inline uint8 GetDrakkinDetails() const { return drakkin_details; }
inline uint32 GetArmorTint(uint8 i) const { return armor_tint[(i < EQEmu::textures::TextureCount) ? i : 0]; } inline uint32 GetArmorTint(uint8 i) const { return armor_tint.Slot[(i < EQEmu::textures::TextureCount) ? i : 0].Color; }
inline uint8 GetClass() const { return class_; } inline uint8 GetClass() const { return class_; }
inline uint8 GetLevel() const { return level; } inline uint8 GetLevel() const { return level; }
inline uint8 GetOrigLevel() const { return orig_level; } inline uint8 GetOrigLevel() const { return orig_level; }
@ -1248,7 +1248,7 @@ protected:
uint32 drakkin_heritage; uint32 drakkin_heritage;
uint32 drakkin_tattoo; uint32 drakkin_tattoo;
uint32 drakkin_details; uint32 drakkin_details;
uint32 armor_tint[EQEmu::textures::TextureCount]; EQEmu::TintProfile armor_tint;
uint8 aa_title; uint8 aa_title;

View File

@ -94,7 +94,7 @@ NPC::NPC(const NPCType* d, Spawn2* in_respawn, const glm::vec4& position, int if
d->drakkin_heritage, d->drakkin_heritage,
d->drakkin_tattoo, d->drakkin_tattoo,
d->drakkin_details, d->drakkin_details,
(uint32*)d->armor_tint, d->armor_tint,
0, 0,
d->see_invis, // pass see_invis/see_ivu flags to mob constructor d->see_invis, // pass see_invis/see_ivu flags to mob constructor
d->see_invis_undead, d->see_invis_undead,

View File

@ -2068,10 +2068,10 @@ const NPCType* ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load
uint32 armor_tint_id = atoi(row[63]); uint32 armor_tint_id = atoi(row[63]);
temp_npctype_data->armor_tint[0] = (atoi(row[64]) & 0xFF) << 16; temp_npctype_data->armor_tint.Head.Color = (atoi(row[64]) & 0xFF) << 16;
temp_npctype_data->armor_tint[0] |= (atoi(row[65]) & 0xFF) << 8; temp_npctype_data->armor_tint.Head.Color |= (atoi(row[65]) & 0xFF) << 8;
temp_npctype_data->armor_tint[0] |= (atoi(row[66]) & 0xFF); temp_npctype_data->armor_tint.Head.Color |= (atoi(row[66]) & 0xFF);
temp_npctype_data->armor_tint[0] |= (temp_npctype_data->armor_tint[0]) ? (0xFF << 24) : 0; temp_npctype_data->armor_tint.Head.Color |= (temp_npctype_data->armor_tint.Head.Color) ? (0xFF << 24) : 0;
if (armor_tint_id != 0) { if (armor_tint_id != 0) {
std::string armortint_query = StringFormat( std::string armortint_query = StringFormat(
@ -2093,17 +2093,17 @@ const NPCType* ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load
auto armorTint_row = armortint_results.begin(); auto armorTint_row = armortint_results.begin();
for (int index = EQEmu::textures::TextureBegin; index <= EQEmu::textures::LastTexture; index++) { for (int index = EQEmu::textures::TextureBegin; index <= EQEmu::textures::LastTexture; index++) {
temp_npctype_data->armor_tint[index] = atoi(armorTint_row[index * 3]) << 16; temp_npctype_data->armor_tint.Slot[index].Color = atoi(armorTint_row[index * 3]) << 16;
temp_npctype_data->armor_tint[index] |= atoi(armorTint_row[index * 3 + 1]) << 8; temp_npctype_data->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 1]) << 8;
temp_npctype_data->armor_tint[index] |= atoi(armorTint_row[index * 3 + 2]); temp_npctype_data->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 2]);
temp_npctype_data->armor_tint[index] |= (temp_npctype_data->armor_tint[index]) ? (0xFF << 24) : 0; temp_npctype_data->armor_tint.Slot[index].Color |= (temp_npctype_data->armor_tint.Slot[index].Color) ? (0xFF << 24) : 0;
} }
} }
} }
// Try loading npc_types tint fields if armor tint is 0 or query failed to get results // Try loading npc_types tint fields if armor tint is 0 or query failed to get results
if (armor_tint_id == 0) { if (armor_tint_id == 0) {
for (int index = EQEmu::textures::TextureChest; index < EQEmu::textures::TextureCount; index++) { for (int index = EQEmu::textures::TextureChest; index < EQEmu::textures::TextureCount; index++) {
temp_npctype_data->armor_tint[index] = temp_npctype_data->armor_tint[0]; temp_npctype_data->armor_tint.Slot[index].Color = temp_npctype_data->armor_tint.Slot[0].Color; // odd way to 'zero-out' the array...
} }
} }
@ -2301,15 +2301,15 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client
tmpNPCType->bodytype = 1; tmpNPCType->bodytype = 1;
uint32 armor_tint_id = atoi(row[36]); uint32 armor_tint_id = atoi(row[36]);
tmpNPCType->armor_tint[0] = (atoi(row[37]) & 0xFF) << 16; tmpNPCType->armor_tint.Slot[0].Color = (atoi(row[37]) & 0xFF) << 16;
tmpNPCType->armor_tint[0] |= (atoi(row[38]) & 0xFF) << 8; tmpNPCType->armor_tint.Slot[0].Color |= (atoi(row[38]) & 0xFF) << 8;
tmpNPCType->armor_tint[0] |= (atoi(row[39]) & 0xFF); tmpNPCType->armor_tint.Slot[0].Color |= (atoi(row[39]) & 0xFF);
tmpNPCType->armor_tint[0] |= (tmpNPCType->armor_tint[0]) ? (0xFF << 24) : 0; tmpNPCType->armor_tint.Slot[0].Color |= (tmpNPCType->armor_tint.Slot[0].Color) ? (0xFF << 24) : 0;
if (armor_tint_id == 0) if (armor_tint_id == 0)
for (int index = EQEmu::textures::TextureChest; index <= EQEmu::textures::LastTexture; index++) for (int index = EQEmu::textures::TextureChest; index <= EQEmu::textures::LastTexture; index++)
tmpNPCType->armor_tint[index] = tmpNPCType->armor_tint[0]; tmpNPCType->armor_tint.Slot[index].Color = tmpNPCType->armor_tint.Slot[0].Color;
else if (tmpNPCType->armor_tint[0] == 0) { else if (tmpNPCType->armor_tint.Slot[0].Color == 0) {
std::string armorTint_query = StringFormat("SELECT red1h, grn1h, blu1h, " std::string armorTint_query = StringFormat("SELECT red1h, grn1h, blu1h, "
"red2c, grn2c, blu2c, " "red2c, grn2c, blu2c, "
"red3a, grn3a, blu3a, " "red3a, grn3a, blu3a, "
@ -2328,10 +2328,10 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client
auto armorTint_row = results.begin(); auto armorTint_row = results.begin();
for (int index = EQEmu::textures::TextureBegin; index <= EQEmu::textures::LastTexture; index++) { for (int index = EQEmu::textures::TextureBegin; index <= EQEmu::textures::LastTexture; index++) {
tmpNPCType->armor_tint[index] = atoi(armorTint_row[index * 3]) << 16; tmpNPCType->armor_tint.Slot[index].Color = atoi(armorTint_row[index * 3]) << 16;
tmpNPCType->armor_tint[index] |= atoi(armorTint_row[index * 3 + 1]) << 8; tmpNPCType->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 1]) << 8;
tmpNPCType->armor_tint[index] |= atoi(armorTint_row[index * 3 + 2]); tmpNPCType->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 2]);
tmpNPCType->armor_tint[index] |= (tmpNPCType->armor_tint[index]) ? (0xFF << 24) : 0; tmpNPCType->armor_tint.Slot[index].Color |= (tmpNPCType->armor_tint.Slot[index].Color) ? (0xFF << 24) : 0;
} }
} }
} else } else

View File

@ -86,7 +86,7 @@ struct NPCType
uint32 drakkin_heritage; uint32 drakkin_heritage;
uint32 drakkin_tattoo; uint32 drakkin_tattoo;
uint32 drakkin_details; uint32 drakkin_details;
uint32 armor_tint[EQEmu::textures::TextureCount]; EQEmu::TintProfile armor_tint;
uint32 min_dmg; uint32 min_dmg;
uint32 max_dmg; uint32 max_dmg;
int16 attack_count; int16 attack_count;