From 37951d09c73693bb22e57cbc8409ee5042947ab4 Mon Sep 17 00:00:00 2001 From: Trevius Date: Tue, 9 Dec 2014 21:18:56 -0600 Subject: [PATCH] (RoF+) Implemented Hero's Forge Armor Models for Items. To use, set herosforgemodel field in the item table to a model number such as 63 (for example). --- changelog.txt | 3 + common/eq_packet_structs.h | 57 +++++-- common/item_fieldlist.h | 1 + common/item_struct.h | 3 +- common/patches/client62.cpp | 7 +- common/patches/rof.cpp | 32 ++-- common/patches/rof2.cpp | 34 ++-- common/patches/rof2_structs.h | 97 ++++++------ common/patches/rof_structs.h | 27 ++-- common/patches/sod.cpp | 24 +-- common/patches/sod_structs.h | 12 +- common/patches/sof.cpp | 20 +-- common/patches/sof_structs.h | 13 +- common/patches/titanium.cpp | 6 +- common/patches/underfoot.cpp | 24 +-- common/patches/underfoot_structs.h | 13 +- common/shareddb.cpp | 21 ++- utils/sql/db_update_manifest.txt | 1 + .../2014_12_09_items_table_update.sql | 1 + world/worlddb.cpp | 8 +- zone/bot.cpp | 121 ++++----------- zone/client.cpp | 145 +++++++++++------- zone/client_packet.cpp | 2 +- zone/command.cpp | 12 +- zone/merc.cpp | 24 ++- zone/mob.cpp | 73 +++++++-- zone/mob.h | 3 +- zone/perl_mob.cpp | 10 +- 28 files changed, 444 insertions(+), 350 deletions(-) create mode 100644 utils/sql/git/required/2014_12_09_items_table_update.sql diff --git a/changelog.txt b/changelog.txt index 25e6f2e54..2fe60ee70 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 12/09/2014 == +Trevius: (RoF+) Implemented Hero's Forge Armor Models for Items. To use, set herosforgemodel field in the item table to a model number such as 63 (for example). + == 12/08/2014 == Secrets: Added a feature that allows an EQ client to log in directly to World without having to enter the LoginServer, provided the 'password' field is set in WorldServer. diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index 62a166c67..cffe4e354 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -145,6 +145,28 @@ struct Color_Struct }; }; +/* +* 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 CharSelectEquip { + uint32 material; + uint32 unknown1; + uint32 elitematerial; + uint32 heroforgemodel; + uint32 material2; + Color_Struct color; +}; + /* ** Character Selection Struct ** Length: 1704 Bytes @@ -152,10 +174,11 @@ struct Color_Struct */ struct CharacterSelect_Struct { /*0000*/ uint32 race[10]; // Characters Race -/*0040*/ Color_Struct cs_colors[10][9]; // Characters Equipment Colors +/*0040*/ //Color_Struct cs_colors[10][9]; // Characters Equipment Colors /*0400*/ uint8 beardcolor[10]; // Characters beard Color /*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*/ //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) +/*0000*/ CharSelectEquip equip[10][9]; /*0780*/ uint32 secondary[10]; // Characters secondary IDFile number /*0820*/ uint32 drakkin_heritage[10]; // added for SoF /*0860*/ uint32 drakkin_tattoo[10]; // added for SoF @@ -258,21 +281,21 @@ struct Spawn_Struct { /*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader /*0194*/ uint8 unknown0194[3]; /*0197*/ union - { - 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[_MaterialCount]; // Array elements correspond to struct equipment above - }; +{ + 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[_MaterialCount]; +}; /*0233*/ float runspeed; // Speed when running /*0036*/ uint8 afk; // 0=no, 1=afk /*0238*/ uint32 guildID; // Current guild diff --git a/common/item_fieldlist.h b/common/item_fieldlist.h index fb3e4b41e..42ec12554 100644 --- a/common/item_fieldlist.h +++ b/common/item_fieldlist.h @@ -65,6 +65,7 @@ F(UNK054) F(maxcharges) F(itemtype) F(material) +F(herosforgemodel) F(sellrate) F(UNK059) F(casttime) diff --git a/common/item_struct.h b/common/item_struct.h index 26d3623bd..66af3d0c6 100644 --- a/common/item_struct.h +++ b/common/item_struct.h @@ -143,7 +143,7 @@ struct Item_Struct { uint8 Delay; // Delay * 10 uint8 RecLevel; // Recommended level to use item uint8 RecSkill; // Recommended skill to use item (refers to primary skill of item) - uint8 ElemDmgType; // Elemental Damage Type (1=magic, 2=fire) + uint8 ElemDmgType; // Elemental Damage Type (1=magic, 2=fire) uint8 ElemDmgAmt; // Elemental Damage uint8 Range; // Range of item uint32 Damage; // Delay between item usage (in 0.1 sec increments) @@ -154,6 +154,7 @@ struct Item_Struct { int16 MaxCharges; // Maximum charges items can hold: -1 if not a chargeable item uint8 ItemType; // Item Type/Skill (itemClass* from above) uint8 Material; // Item material type + uint32 HerosForgeModel;// Hero's Forge Armor Model Type (2-13?) float SellRate; // Sell rate //uint32 Unk059; union { diff --git a/common/patches/client62.cpp b/common/patches/client62.cpp index c291d2bc4..f3681721e 100644 --- a/common/patches/client62.cpp +++ b/common/patches/client62.cpp @@ -546,6 +546,7 @@ namespace Client62 for (r = 0; r < 9; r++) { OUT(item_material[r]); OUT(item_tint[r].color); + } for (r = 0; r < structs::MAX_PP_AA_ARRAY; r++) { OUT(aa_array[r].AA); @@ -785,8 +786,8 @@ namespace Client62 OUT(beard[r]); int k; for (k = 0; k < 9; k++) { - OUT(equip[r][k]); - OUT(cs_colors[r][k].color); + eq->equip[r][k] = emu->equip[r][k].material; + eq->cs_colors[r][k].color = emu->equip[r][k].color.color; } OUT(haircolor[r]); OUT(gohome[r]); @@ -934,7 +935,7 @@ namespace Client62 eq->petOwnerId = emu->petOwnerId; eq->guildrank = emu->guildrank; for (k = 0; k < 9; k++) { - eq->equipment[k] = emu->equipment[k]; + eq->equipment[k] = emu->equipment[k].material; eq->colors[k].color = emu->colors[k].color; } for (k = 0; k < 8; k++) { diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index c7efe0264..43b411dca 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -2874,12 +2874,12 @@ namespace RoF eq2->face = emu->face[r]; int k; for (k = 0; k < _MaterialCount; k++) { - eq2->equip[k].equip0 = emu->equip[r][k]; - eq2->equip[k].equip1 = 0; - eq2->equip[k].equip2 = 0; - eq2->equip[k].itemid = 0; - eq2->equip[k].equip3 = emu->equip[r][k]; - eq2->equip[k].color.color = emu->cs_colors[r][k].color; + eq2->equip[k].material = emu->equip[r][k].material; + eq2->equip[k].unknown1 = emu->equip[r][k].unknown1; + eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial; + eq2->equip[k].heroforgemodel = emu->equip[r][k].heroforgemodel; + eq2->equip[k].material2 = emu->equip[r][k].material2; + eq2->equip[k].color.color = emu->equip[r][k].color.color; } eq2->u15 = 0xff; eq2->u19 = 0xFF; @@ -3809,11 +3809,11 @@ namespace RoF structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; for (k = 0; k < 9; k++) { - Equipment[k].equip0 = emu->equipment[k]; - Equipment[k].equip1 = 0; - Equipment[k].equip2 = 0; - Equipment[k].equip3 = 0; - Equipment[k].itemId = 0; + Equipment[k].material = emu->equipment[k].material; + Equipment[k].unknown1 = emu->equipment[k].unknown1; + Equipment[k].elitematerial = emu->equipment[k].elitematerial; + Equipment[k].material2 = emu->equipment[k].heroforgemodel; + Equipment[k].elitematerial = emu->equipment[k].material2; } Buffer += (sizeof(structs::EquipStruct) * 9); @@ -3826,13 +3826,13 @@ namespace RoF VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].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[MaterialSecondary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); @@ -5017,10 +5017,10 @@ namespace RoF ibs.Prestige = 0; ibs.ItemType = item->ItemType; ibs.Material = item->Material; - ibs.unknown7 = 0; + ibs.MaterialUnknown1 = 0; ibs.EliteMaterial = item->EliteMaterial; - ibs.unknown_RoF3 = 0; - ibs.unknown_RoF4 = 0; + ibs.HerosForgeModel = item->HerosForgeModel; + ibs.MaterialUnknown2 = 0; ibs.SellRate = item->SellRate; ibs.CombatEffects = item->CombatEffects; ibs.Shielding = item->Shielding; diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 4d403253f..a22d2d4c5 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -2874,12 +2874,12 @@ namespace RoF2 eq2->face = emu->face[r]; int k; for (k = 0; k < _MaterialCount; k++) { - eq2->equip[k].equip0 = emu->equip[r][k]; - eq2->equip[k].equip1 = 0; - eq2->equip[k].equip2 = 0; - eq2->equip[k].itemid = 0; - eq2->equip[k].equip3 = emu->equip[r][k]; - eq2->equip[k].color.color = emu->cs_colors[r][k].color; + eq2->equip[k].material = emu->equip[r][k].material; + eq2->equip[k].unknown1 = emu->equip[r][k].unknown1; + eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial; + eq2->equip[k].heroforgemodel = emu->equip[r][k].heroforgemodel; + eq2->equip[k].material2 = emu->equip[r][k].material2; + eq2->equip[k].color.color = emu->equip[r][k].color.color; } eq2->u15 = 0xff; eq2->u19 = 0xFF; @@ -3813,11 +3813,11 @@ namespace RoF2 structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; for (k = 0; k < 9; k++) { - Equipment[k].equip0 = emu->equipment[k]; - Equipment[k].equip1 = 0; - Equipment[k].equip2 = 0; - Equipment[k].equip3 = 0; - Equipment[k].itemId = 0; + Equipment[k].material = emu->equipment[k].material; + Equipment[k].unknown1 = emu->equipment[k].unknown1; + Equipment[k].elitematerial = emu->equipment[k].elitematerial; + Equipment[k].material2 = emu->equipment[k].heroforgemodel; + Equipment[k].elitematerial = emu->equipment[k].material2; } Buffer += (sizeof(structs::EquipStruct) * 9); @@ -3830,13 +3830,13 @@ namespace RoF2 VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].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[MaterialSecondary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); @@ -4919,7 +4919,7 @@ namespace RoF2 hdrf.unknowna5 = 0; hdrf.ItemClass = item->ItemClass; ss.write((const char*)&hdrf, sizeof(RoF2::structs::ItemSerializationHeaderFinish)); - + if (strlen(item->Name) > 0) { ss.write(item->Name, strlen(item->Name)); @@ -5021,10 +5021,10 @@ namespace RoF2 ibs.Prestige = 0; ibs.ItemType = item->ItemType; ibs.Material = item->Material; - ibs.unknown7 = 0; + ibs.MaterialUnknown1 = 0; ibs.EliteMaterial = item->EliteMaterial; - ibs.unknown_RoF23 = 0; - ibs.unknown_RoF24 = 0; + ibs.HerosForgeModel = item->HerosForgeModel; + ibs.MaterialUnknown2 = 0; ibs.SellRate = item->SellRate; ibs.CombatEffects = item->CombatEffects; ibs.Shielding = item->Shielding; diff --git a/common/patches/rof2_structs.h b/common/patches/rof2_structs.h index 4bc9a9bb3..572a5a0f0 100644 --- a/common/patches/rof2_structs.h +++ b/common/patches/rof2_structs.h @@ -160,13 +160,25 @@ struct Color_Struct }; }; +/* +* 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 CharSelectEquip { - //totally guessed; - uint32 equip0; - uint32 equip1; - uint32 equip2; - uint32 itemid; - uint32 equip3; + uint32 material; + uint32 unknown1; + uint32 elitematerial; + uint32 heroforgemodel; + uint32 material2; Color_Struct color; }; @@ -252,21 +264,6 @@ struct Membership_Struct /*104*/ }; - -/* -* Visible equiptment. -* Size: 20 Octets -*/ -struct EquipStruct { -/*00*/ uint32 equip0; -/*04*/ uint32 equip1; -/*08*/ uint32 equip2; -/*12*/ uint32 itemId; -/*16*/ uint32 equip3; // Same as equip0? -/*20*/ -}; - - /* ** Generic Spawn Struct ** Length: 897 Octets @@ -1018,38 +1015,38 @@ union { struct { - /*00184*/ EquipStruct equip_helmet; // Equiptment: Helmet visual - /*00204*/ EquipStruct equip_chest; // Equiptment: Chest visual - /*00224*/ EquipStruct equip_arms; // Equiptment: Arms visual - /*00244*/ EquipStruct equip_bracers; // Equiptment: Wrist visual - /*00264*/ EquipStruct equip_hands; // Equiptment: Hands visual - /*00284*/ EquipStruct equip_legs; // Equiptment: Legs visual - /*00304*/ EquipStruct equip_feet; // Equiptment: Boots visual - /*00324*/ EquipStruct equip_primary; // Equiptment: Main visual - /*00344*/ EquipStruct equip_secondary; // Equiptment: Off visual + /*00184*/ EquipStruct equip_helmet; // Equipment: Helmet visual + /*00204*/ EquipStruct equip_chest; // Equipment: Chest visual + /*00224*/ EquipStruct equip_arms; // Equipment: Arms visual + /*00244*/ EquipStruct equip_bracers; // Equipment: Wrist visual + /*00264*/ EquipStruct equip_hands; // Equipment: Hands visual + /*00284*/ EquipStruct equip_legs; // Equipment: Legs visual + /*00304*/ EquipStruct equip_feet; // Equipment: Boots visual + /*00324*/ EquipStruct equip_primary; // Equipment: Main visual + /*00344*/ EquipStruct equip_secondary; // Equipment: Off visual // Below slots are just guesses, but all 0s anyway... - /*00364*/ EquipStruct equip_charm; // Equiptment: Non-visual - /*00384*/ EquipStruct equip_ear1; // Equiptment: Non-visual - /*00404*/ EquipStruct equip_ear2; // Equiptment: Non-visual - /*00424*/ EquipStruct equip_face; // Equiptment: Non-visual - /*00444*/ EquipStruct equip_neck; // Equiptment: Non-visual - /*00464*/ EquipStruct equip_shoulder; // Equiptment: Non-visual - /*00484*/ EquipStruct equip_bracer2; // Equiptment: Non-visual - /*00504*/ EquipStruct equip_range; // Equiptment: Non-visual - /*00524*/ EquipStruct equip_ring1; // Equiptment: Non-visual - /*00544*/ EquipStruct equip_ring2; // Equiptment: Non-visual - /*00564*/ EquipStruct equip_waist; // Equiptment: Non-visual - /*00584*/ EquipStruct equip_powersource; // Equiptment: Non-visual - /*00604*/ EquipStruct equip_ammo; // Equiptment: Non-visual + /*00364*/ EquipStruct equip_charm; // Equipment: Non-visual + /*00384*/ EquipStruct equip_ear1; // Equipment: Non-visual + /*00404*/ EquipStruct equip_ear2; // Equipment: Non-visual + /*00424*/ EquipStruct equip_face; // Equipment: Non-visual + /*00444*/ EquipStruct equip_neck; // Equipment: Non-visual + /*00464*/ EquipStruct equip_shoulder; // Equipment: Non-visual + /*00484*/ EquipStruct equip_bracer2; // Equipment: Non-visual + /*00504*/ EquipStruct equip_range; // Equipment: Non-visual + /*00524*/ EquipStruct equip_ring1; // Equipment: Non-visual + /*00544*/ EquipStruct equip_ring2; // Equipment: Non-visual + /*00564*/ EquipStruct equip_waist; // Equipment: Non-visual + /*00584*/ EquipStruct equip_powersource;// Equipment: Non-visual + /*00604*/ EquipStruct equip_ammo; // Equipment: Non-visual } equip; - /*00184*/ EquipStruct equipment[22]; + /*00184*/ EquipStruct equipment[22]; // Total Slots }; /*00624*/ uint32 equip2_count; // Seen 9 -/*00628*/ EquipStruct equipment2[9]; // Appears to be Visible slots, but all 0s +/*00628*/ EquipStruct equipment2[_MaterialCount]; // Appears to be Visible slots, but all 0s /*00808*/ uint32 tint_count; // Seen 9 -/*00812*/ Color_Struct item_tint[9]; // RR GG BB 00 +/*00812*/ Color_Struct item_tint[_MaterialCount]; // RR GG BB 00 /*00848*/ uint32 tint_count2; // Seen 9 -/*00852*/ Color_Struct item_tint2[9]; // RR GG BB 00 +/*00852*/ Color_Struct item_tint2[_MaterialCount]; // RR GG BB 00 /*00888*/ uint8 haircolor; // Player hair color /*00889*/ uint8 beardcolor; // Player beard color /*00890*/ uint32 unknown_rof5; // @@ -4504,10 +4501,10 @@ struct ItemBodyStruct uint32 Prestige; // New to March 21 2012 client uint8 ItemType; uint32 Material; - uint32 unknown7; + uint32 MaterialUnknown1; uint32 EliteMaterial; - uint32 unknown_RoF23; // New to March 21 2012 client - uint32 unknown_RoF24; // New to December 10th 2012 client - NEW + uint32 HerosForgeModel; // New to March 21 2012 client + uint32 MaterialUnknown2; // New to December 10th 2012 client - NEW float SellRate; int32 CombatEffects; int32 Shielding; diff --git a/common/patches/rof_structs.h b/common/patches/rof_structs.h index 075e6633b..285b15675 100644 --- a/common/patches/rof_structs.h +++ b/common/patches/rof_structs.h @@ -161,12 +161,11 @@ struct Color_Struct }; struct CharSelectEquip { - //totally guessed; - uint32 equip0; - uint32 equip1; - uint32 equip2; - uint32 itemid; - uint32 equip3; + uint32 material; + uint32 unknown1; + uint32 elitematerial; + uint32 heroforgemodel; + uint32 material2; Color_Struct color; }; @@ -258,11 +257,11 @@ struct Membership_Struct * Size: 20 Octets */ struct EquipStruct { -/*00*/ uint32 equip0; -/*04*/ uint32 equip1; -/*08*/ uint32 equip2; -/*12*/ uint32 itemId; -/*16*/ uint32 equip3; // Same as equip0? +/*00*/ uint32 material; +/*04*/ uint32 unknown1; +/*08*/ uint32 elitematerial; +/*12*/ uint32 heroforgemodel; +/*16*/ uint32 material2; // Same as material? /*20*/ }; @@ -4499,10 +4498,10 @@ struct ItemBodyStruct uint32 Prestige; // New to March 21 2012 client uint8 ItemType; uint32 Material; - uint32 unknown7; + uint32 MaterialUnknown1; uint32 EliteMaterial; - uint32 unknown_RoF3; // New to March 21 2012 client - uint32 unknown_RoF4; // New to December 10th 2012 client - NEW + uint32 HerosForgeModel; // New to March 21 2012 client + uint32 MaterialUnknown2; // New to December 10th 2012 client - NEW float SellRate; int32 CombatEffects; int32 Shielding; diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 54dd33841..498058e19 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -1429,9 +1429,9 @@ namespace SoD OUT(beard); // OUT(unknown00178[10]); for (r = 0; r < 9; r++) { - eq->equipment[r].equip0 = emu->item_material[r]; - eq->equipment[r].equip1 = 0; - eq->equipment[r].itemId = 0; + eq->equipment[r].material = emu->item_material[r]; + eq->equipment[r].unknown1 = 0; + eq->equipment[r].elitematerial = 0; //eq->colors[r].color = emu->colors[r].color; } for (r = 0; r < 7; r++) { @@ -1825,10 +1825,10 @@ namespace SoD eq2->face = emu->face[r]; int k; for (k = 0; k < _MaterialCount; k++) { - eq2->equip[k].equip0 = emu->equip[r][k]; - eq2->equip[k].equip1 = 0; - eq2->equip[k].itemid = 0; - eq2->equip[k].color.color = emu->cs_colors[r][k].color; + eq2->equip[k].material = emu->equip[r][k].material; + eq2->equip[k].unknown1 = emu->equip[r][k].unknown1; + eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial; + eq2->equip[k].color.color = emu->equip[r][k].color.color; } eq2->primary = emu->primary[r]; eq2->secondary = emu->secondary[r]; @@ -2548,11 +2548,11 @@ namespace SoD VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); } @@ -2563,9 +2563,9 @@ namespace SoD structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; for (k = 0; k < 9; k++) { - Equipment[k].equip0 = emu->equipment[k]; - Equipment[k].equip1 = 0; - Equipment[k].itemId = 0; + Equipment[k].material = emu->equipment[k].material; + Equipment[k].unknown1 = emu->equipment[k].unknown1; + Equipment[k].elitematerial = emu->equipment[k].elitematerial; } Buffer += (sizeof(structs::EquipStruct) * 9); diff --git a/common/patches/sod_structs.h b/common/patches/sod_structs.h index 47b228cb7..7ec101fd3 100644 --- a/common/patches/sod_structs.h +++ b/common/patches/sod_structs.h @@ -118,9 +118,9 @@ struct Color_Struct struct CharSelectEquip { //totally guessed; - uint32 equip0; - uint32 equip1; - uint32 itemid; + uint32 material; + uint32 unknown1; + uint32 elitematerial; Color_Struct color; }; @@ -169,9 +169,9 @@ struct CharacterSelect_Struct { * Size: 12 Octets */ struct EquipStruct { -/*00*/ uint32 equip0; -/*04*/ uint32 equip1; -/*08*/ uint32 itemId; +/*00*/ uint32 material; +/*04*/ uint32 unknown1; +/*08*/ uint32 elitematerial; /*12*/ }; diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 629395cd1..2d2fff48d 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -1087,9 +1087,9 @@ namespace SoF OUT(beard); // OUT(unknown00178[10]); for (r = 0; r < 9; r++) { - eq->equipment[r].equip0 = emu->item_material[r]; - eq->equipment[r].equip1 = 0; - eq->equipment[r].itemId = 0; + eq->equipment[r].material = emu->item_material[r]; + eq->equipment[r].unknown1 = 0; + eq->equipment[r].elitematerial = 0; //eq->colors[r].color = emu->colors[r].color; } for (r = 0; r < 7; r++) { @@ -1484,10 +1484,10 @@ namespace SoF eq2->face = emu->face[r]; int k; for (k = 0; k < _MaterialCount; k++) { - eq2->equip[k].equip0 = emu->equip[r][k]; - eq2->equip[k].equip1 = 0; - eq2->equip[k].itemid = 0; - eq2->equip[k].color.color = emu->cs_colors[r][k].color; + eq2->equip[k].material = emu->equip[r][k].material; + eq2->equip[k].unknown1 = emu->equip[r][k].unknown1; + eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial; + eq2->equip[k].color.color = emu->equip[r][k].color.color; } eq2->primary = emu->primary[r]; eq2->secondary = emu->secondary[r]; @@ -1840,9 +1840,9 @@ namespace SoF eq->drakkin_heritage = emu->drakkin_heritage; eq->gender = emu->gender; for (k = 0; k < 9; k++) { - eq->equipment[k].equip0 = emu->equipment[k]; - eq->equipment[k].equip1 = 0; - eq->equipment[k].itemId = 0; + eq->equipment[k].material = emu->equipment[k].material; + eq->equipment[k].unknown1 = emu->equipment[k].unknown1; + eq->equipment[k].elitematerial = emu->equipment[k].elitematerial; eq->colors[k].color = emu->colors[k].color; } eq->StandState = emu->StandState; diff --git a/common/patches/sof_structs.h b/common/patches/sof_structs.h index 9c3238f73..385fd8b46 100644 --- a/common/patches/sof_structs.h +++ b/common/patches/sof_structs.h @@ -117,10 +117,9 @@ struct Color_Struct }; struct CharSelectEquip { - //totally guessed; - uint32 equip0; - uint32 equip1; - uint32 itemid; + uint32 material; + uint32 unknown1; + uint32 elitematerial; Color_Struct color; }; @@ -167,9 +166,9 @@ struct CharacterSelect_Struct { * Size: 12 Octets */ struct EquipStruct { -/*00*/ uint32 equip0; -/*04*/ uint32 equip1; -/*08*/ uint32 itemId; +/*00*/ uint32 material; +/*04*/ uint32 unknown1; +/*08*/ uint32 elitematerial; /*12*/ }; diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index 4d400c9b7..0fc9d5e75 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -1042,8 +1042,8 @@ namespace Titanium OUT(beard[r]); int k; for (k = 0; k < 9; k++) { - OUT(equip[r][k]); - OUT(cs_colors[r][k].color); + eq->equip[r][k] = emu->equip[r][k].material; + eq->cs_colors[r][k].color = emu->equip[r][k].color.color; } OUT(haircolor[r]); OUT(gohome[r]); @@ -1270,7 +1270,7 @@ namespace Titanium eq->guildrank = emu->guildrank; // eq->unknown0194[3] = emu->unknown0194[3]; for (k = 0; k < 9; k++) { - eq->equipment[k] = emu->equipment[k]; + eq->equipment[k] = emu->equipment[k].material; eq->colors[k].color = emu->colors[k].color; } for (k = 0; k < 8; k++) { diff --git a/common/patches/underfoot.cpp b/common/patches/underfoot.cpp index c9d726a25..6da577be6 100644 --- a/common/patches/underfoot.cpp +++ b/common/patches/underfoot.cpp @@ -1702,9 +1702,9 @@ namespace Underfoot OUT(beard); // OUT(unknown00178[10]); for (r = 0; r < 9; r++) { - eq->equipment[r].equip0 = emu->item_material[r]; - eq->equipment[r].equip1 = 0; - eq->equipment[r].itemId = 0; + eq->equipment[r].material = emu->item_material[r]; + eq->equipment[r].unknown1 = 0; + eq->equipment[r].elitematerial = 0; //eq->colors[r].color = emu->colors[r].color; } for (r = 0; r < 7; r++) { @@ -2132,10 +2132,10 @@ namespace Underfoot eq2->face = emu->face[r]; int k; for (k = 0; k < _MaterialCount; k++) { - eq2->equip[k].equip0 = emu->equip[r][k]; - eq2->equip[k].equip1 = 0; - eq2->equip[k].itemid = 0; - eq2->equip[k].color.color = emu->cs_colors[r][k].color; + eq2->equip[k].material = emu->equip[r][k].material; + eq2->equip[k].unknown1 = emu->equip[r][k].unknown1; + eq2->equip[k].elitematerial = emu->equip[r][k].elitematerial; + eq2->equip[k].color.color = emu->equip[r][k].color.color; } eq2->primary = emu->primary[r]; eq2->secondary = emu->secondary[r]; @@ -2832,11 +2832,11 @@ namespace Underfoot VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialPrimary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary]); + VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment[MaterialSecondary].material); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); } @@ -2846,9 +2846,9 @@ namespace Underfoot structs::EquipStruct *Equipment = (structs::EquipStruct *)Buffer; for (k = 0; k < 9; k++) { - Equipment[k].equip0 = emu->equipment[k]; - Equipment[k].equip1 = 0; - Equipment[k].itemId = 0; + Equipment[k].material = emu->equipment[k].material; + Equipment[k].unknown1 = emu->equipment[k].unknown1; + Equipment[k].elitematerial = emu->equipment[k].elitematerial; } Buffer += (sizeof(structs::EquipStruct) * 9); diff --git a/common/patches/underfoot_structs.h b/common/patches/underfoot_structs.h index 45c47875d..378665db1 100644 --- a/common/patches/underfoot_structs.h +++ b/common/patches/underfoot_structs.h @@ -117,10 +117,9 @@ struct Color_Struct }; struct CharSelectEquip { - //totally guessed; - uint32 equip0; - uint32 equip1; - uint32 itemid; + uint32 material; + uint32 unknown1; + uint32 elitematerial; Color_Struct color; }; @@ -169,9 +168,9 @@ struct CharacterSelect_Struct { * Size: 12 Octets */ struct EquipStruct { -/*00*/ uint32 equip0; -/*04*/ uint32 equip1; -/*08*/ uint32 itemId; +/*00*/ uint32 material; +/*04*/ uint32 unknown1; +/*08*/ uint32 elitematerial; /*12*/ }; diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 05c7b6962..6bf1cb52f 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -852,9 +852,26 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ item.MaxCharges = (int16)atoi(row[ItemField::maxcharges]); item.ItemType = (uint8)atoi(row[ItemField::itemtype]); - item.Material = (uint8)atoi(row[ItemField::material]); + item.Material = (uint8)atoi(row[ItemField::material]); + item.HerosForgeModel = (uint32)atoi(row[ItemField::herosforgemodel]); + if (item.HerosForgeModel > 0) + { + item.HerosForgeModel *= 100; + uint32 HeroSlot = 0; + switch (item.Slots) + { + case 4: { HeroSlot = 0; break; } // Head + case 131072: { HeroSlot = 1; break; } // Chest + case 128: { HeroSlot = 2; break; } // Arms + case 1536: { HeroSlot = 3; break; } // Bracers + case 4096: { HeroSlot = 4; break; } // Hands + case 262144: { HeroSlot = 5; break; } // Legs + case 524288: { HeroSlot = 6; break; } // Feet + default: { HeroSlot = 1; break; } // Chest + } + item.HerosForgeModel += HeroSlot; + } item.SellRate = (float)atof(row[ItemField::sellrate]); - item.CastTime = (uint32)atoul(row[ItemField::casttime]); item.EliteMaterial = (uint32)atoul(row[ItemField::elitematerial]); item.ProcRate = (int32)atoi(row[ItemField::procrate]); diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index 2af5e6e90..a06a9d94e 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -313,6 +313,7 @@ 9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty| 9058|2014_11_26_InventoryTableUpdate.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornamenticon'|empty| 9059|2014_12_01_mercs_table_update.sql|SHOW COLUMNS FROM `mercs` LIKE 'MercSize'|empty| +9060|2014_12_09_items_table_update.sql|SHOW COLUMNS FROM `items` LIKE 'herosforgemodel'|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/required/2014_12_09_items_table_update.sql b/utils/sql/git/required/2014_12_09_items_table_update.sql new file mode 100644 index 000000000..82866a3a3 --- /dev/null +++ b/utils/sql/git/required/2014_12_09_items_table_update.sql @@ -0,0 +1 @@ +ALTER TABLE `items` ADD `herosforgemodel` int( 11 ) NOT NULL DEFAULT '0' AFTER `material`; diff --git a/world/worlddb.cpp b/world/worlddb.cpp index 458025349..7d70fd71d 100644 --- a/world/worlddb.cpp +++ b/world/worlddb.cpp @@ -182,12 +182,16 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* if (item == 0) continue; - cs->equip[char_num][material] = item->GetItem()->Material; + cs->equip[char_num][material].material = item->GetItem()->Material; + cs->equip[char_num][material].material = 0; + cs->equip[char_num][material].elitematerial = item->GetItem()->EliteMaterial; + cs->equip[char_num][material].heroforgemodel = item->GetItem()->HerosForgeModel; + cs->equip[char_num][material].material2 = item->GetItem()->Material; if (pp.item_tint[material].rgb.use_tint){ color = pp.item_tint[material].color; } else{ color = item->GetItem()->Color; } - cs->cs_colors[char_num][material].color = color; + cs->equip[char_num][material].color.color = color; /* Weapons are handled a bit differently */ if ((material == MaterialPrimary) || (material == MaterialSecondary)) { diff --git a/zone/bot.cpp b/zone/bot.cpp index 9ae33318a..bb4c53210 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -4361,7 +4361,8 @@ void Bot::SetLevel(uint8 in_level, bool command) { } void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { - if(ns) { + if(ns) + { Mob::FillSpawnStruct(ns, ForWho); ns->spawn.afk = 0; @@ -4389,98 +4390,34 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { uint32 spawnedbotid = 0; spawnedbotid = this->GetBotID(); - inst = GetBotItem(MainHands); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialHands] = item->Material; - ns->spawn.colors[MaterialHands].color = GetEquipmentColor(MaterialHands); - } - } + for (i = 0; i < _MaterialCount; i++) + { + inst = GetBotItem(i); + if (inst) + { + item = inst->GetItem(); + if (item != 0) + { + ns->spawn.equipment[i].material = item->Material; + ns->spawn.equipment[i].elitematerial = item->EliteMaterial; + ns->spawn.equipment[i].heroforgemodel = item->HerosForgeModel; + if (armor_tint[i]) + { + ns->spawn.colors[i].color = armor_tint[i]; - inst = GetBotItem(MainHead); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialHead] = item->Material; - ns->spawn.colors[MaterialHead].color = GetEquipmentColor(MaterialHead); - } - } - - inst = GetBotItem(MainArms); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialArms] = item->Material; - ns->spawn.colors[MaterialArms].color = GetEquipmentColor(MaterialArms); - } - } - - inst = GetBotItem(MainWrist1); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialWrist] = item->Material; - ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist); - } - } - - /* - // non-live behavior - inst = GetBotItem(MainWrist2); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialWrist] = item->Material; - ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist); - } - } - */ - - inst = GetBotItem(MainChest); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialChest] = item->Material; - ns->spawn.colors[MaterialChest].color = GetEquipmentColor(MaterialChest); - } - } - - inst = GetBotItem(MainLegs); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialLegs] = item->Material; - ns->spawn.colors[MaterialLegs].color = GetEquipmentColor(MaterialLegs); - } - } - - inst = GetBotItem(MainFeet); - if(inst) { - item = inst->GetItem(); - if(item) { - ns->spawn.equipment[MaterialFeet] = item->Material; - ns->spawn.colors[MaterialFeet].color = GetEquipmentColor(MaterialFeet); - } - } - - inst = GetBotItem(MainPrimary); - if(inst) { - item = inst->GetItem(); - if(item) { - if(strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialPrimary] = atoi(&item->IDFile[2]); - ns->spawn.colors[MaterialPrimary].color = GetEquipmentColor(MaterialPrimary); - } - } - - inst = GetBotItem(MainSecondary); - if(inst) { - item = inst->GetItem(); - if(item) { - if(strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialSecondary] = atoi(&item->IDFile[2]); - ns->spawn.colors[MaterialSecondary].color = GetEquipmentColor(MaterialSecondary); + } + else + { + ns->spawn.colors[i].color = item->Color; + } + } + else + { + if (armor_tint[i]) + { + ns->spawn.colors[i].color = armor_tint[i]; + } + } } } } diff --git a/zone/client.cpp b/zone/client.cpp index f67328ae9..014d4f0bb 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -1823,80 +1823,113 @@ void Client::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) // (update: i think pp should do it, as this holds LoY dye - plus, this is ugly code with Inventory!) const Item_Struct* item = nullptr; const ItemInst* inst = nullptr; - if ((inst = m_inv[MainHands]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialHands] = item->Material; - ns->spawn.colors[MaterialHands].color = GetEquipmentColor(MaterialHands); - } - if ((inst = m_inv[MainHead]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialHead] = item->Material; - ns->spawn.colors[MaterialHead].color = GetEquipmentColor(MaterialHead); - } - if ((inst = m_inv[MainArms]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialArms] = item->Material; - ns->spawn.colors[MaterialArms].color = GetEquipmentColor(MaterialArms); - } - if ((inst = m_inv[MainWrist1]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialWrist]= item->Material; - ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist); - } - /* - // non-live behavior - if ((inst = m_inv[SLOT_BRACER02]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialWrist]= item->Material; - ns->spawn.colors[MaterialWrist].color = GetEquipmentColor(MaterialWrist); - } - */ + // Only Player Races Wear Armor + if (IsPlayerRace(race)) + { + if ((inst = m_inv[MainHands]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialHands].material = item->Material; + ns->spawn.equipment[MaterialHands].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialHands].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialHands].color = m_pp.item_tint[MaterialHands].rgb.use_tint ? m_pp.item_tint[MaterialHands].color : item->Color; + } + if ((inst = m_inv[MainHead]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialHead].material = item->Material; + ns->spawn.equipment[MaterialHead].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialHead].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialHead].color = m_pp.item_tint[MaterialHead].rgb.use_tint ? m_pp.item_tint[MaterialHead].color : item->Color; + } + if ((inst = m_inv[MainArms]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialArms].material = item->Material; + ns->spawn.equipment[MaterialArms].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialArms].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialArms].color = m_pp.item_tint[MaterialArms].rgb.use_tint ? m_pp.item_tint[MaterialArms].color : item->Color; + } + if ((inst = m_inv[MainWrist1]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialWrist].material = item->Material; + ns->spawn.equipment[MaterialWrist].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialWrist].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialWrist].color = m_pp.item_tint[MaterialWrist].rgb.use_tint ? m_pp.item_tint[MaterialWrist].color : item->Color; + } - if ((inst = m_inv[MainChest]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialChest] = item->Material; - ns->spawn.colors[MaterialChest].color = GetEquipmentColor(MaterialChest); - } - if ((inst = m_inv[MainLegs]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialLegs] = item->Material; - ns->spawn.colors[MaterialLegs].color = GetEquipmentColor(MaterialLegs); - } - if ((inst = m_inv[MainFeet]) && inst->IsType(ItemClassCommon)) { - item = inst->GetItem(); - ns->spawn.equipment[MaterialFeet] = item->Material; - ns->spawn.colors[MaterialFeet].color = GetEquipmentColor(MaterialFeet); + if ((inst = m_inv[MainChest]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialChest].material = item->Material; + ns->spawn.equipment[MaterialChest].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialChest].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialChest].color = m_pp.item_tint[MaterialChest].rgb.use_tint ? m_pp.item_tint[MaterialChest].color : item->Color; + } + if ((inst = m_inv[MainLegs]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialLegs].material = item->Material; + ns->spawn.equipment[MaterialLegs].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialLegs].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialLegs].color = m_pp.item_tint[MaterialLegs].rgb.use_tint ? m_pp.item_tint[MaterialLegs].color : item->Color; + } + if ((inst = m_inv[MainFeet]) && inst->IsType(ItemClassCommon)) + { + item = inst->GetItem(); + ns->spawn.equipment[MaterialFeet].material = item->Material; + ns->spawn.equipment[MaterialFeet].elitematerial = item->EliteMaterial; + ns->spawn.equipment[MaterialFeet].heroforgemodel = item->HerosForgeModel; + ns->spawn.colors[MaterialFeet].color = m_pp.item_tint[MaterialFeet].rgb.use_tint ? m_pp.item_tint[MaterialFeet].color : item->Color; + } } int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType); - if ((inst = m_inv[MainPrimary]) && inst->IsType(ItemClassCommon)) { - if (inst->GetOrnamentationAug(ornamentationAugtype)) { + if ((inst = m_inv[MainPrimary]) && inst->IsType(ItemClassCommon)) + { + if (inst->GetOrnamentationAug(ornamentationAugtype)) + { item = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); if (strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialPrimary] = atoi(&item->IDFile[2]); + { + ns->spawn.equipment[MaterialPrimary].material = atoi(&item->IDFile[2]); + } } - else if (inst->GetOrnamentationIcon() && inst->GetOrnamentationIDFile()) { - ns->spawn.equipment[MaterialPrimary] = inst->GetOrnamentationIDFile(); + else if (inst->GetOrnamentationIcon() && inst->GetOrnamentationIDFile()) + { + ns->spawn.equipment[MaterialPrimary].material = inst->GetOrnamentationIDFile(); } - else { + else + { item = inst->GetItem(); if (strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialPrimary] = atoi(&item->IDFile[2]); + { + ns->spawn.equipment[MaterialPrimary].material = atoi(&item->IDFile[2]); + } } } - if ((inst = m_inv[MainSecondary]) && inst->IsType(ItemClassCommon)) { - if (inst->GetOrnamentationAug(ornamentationAugtype)) { + if ((inst = m_inv[MainSecondary]) && inst->IsType(ItemClassCommon)) + { + if (inst->GetOrnamentationAug(ornamentationAugtype)) + { item = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); if (strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialSecondary] = atoi(&item->IDFile[2]); + { + ns->spawn.equipment[MaterialSecondary].material = atoi(&item->IDFile[2]); + } } - else if (inst->GetOrnamentationIcon() && inst->GetOrnamentationIDFile()) { - ns->spawn.equipment[MaterialSecondary] = inst->GetOrnamentationIDFile(); + else if (inst->GetOrnamentationIcon() && inst->GetOrnamentationIDFile()) + { + ns->spawn.equipment[MaterialSecondary].material = inst->GetOrnamentationIDFile(); } - else { + else + { item = inst->GetItem(); if (strlen(item->IDFile) > 2) - ns->spawn.equipment[MaterialSecondary] = atoi(&item->IDFile[2]); + { + ns->spawn.equipment[MaterialSecondary].material = atoi(&item->IDFile[2]); + } } } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 6ff76e346..c68434109 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -8341,7 +8341,7 @@ void Client::Handle_OP_ItemPreview(const EQApplicationPacket *app) outapp->WriteUInt32(item->Material); outapp->WriteUInt32(0); //unknown outapp->WriteUInt32(item->EliteMaterial); - outapp->WriteUInt32(0); // unknown + outapp->WriteUInt32(item->HerosForgeModel); outapp->WriteUInt32(0); // unknown outapp->WriteUInt32(0); //This is unknown057 from lucy for (spacer = 0; spacer < 77; spacer++) { //More Item stats, but some seem to be off based on packet check diff --git a/zone/command.cpp b/zone/command.cpp index f4c2c8e91..59a786a19 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -5598,7 +5598,11 @@ void command_itemsearch(Client *c, const Seperator *sep) if (Seperator::IsNumber(search_criteria)) { item = database.GetItem(atoi(search_criteria)); if (item) - if (c->GetClientVersion() >= EQClientRoF) + if (c->GetClientVersion() >= EQClientRoF2) + { + c->Message(0, " %i: %c%06X00000000000000000000000000000000000000000000000000%s%c", (int)item->ID, 0x12, item->ID, item->Name, 0x12); + } + else if (c->GetClientVersion() >= EQClientRoF) { c->Message(0, " %i: %c%06X0000000000000000000000000000000000000000000000000%s%c",(int) item->ID,0x12, item->ID, item->Name, 0x12); } @@ -5627,7 +5631,11 @@ void command_itemsearch(Client *c, const Seperator *sep) strupr(sName); pdest = strstr(sName, sCriteria); if (pdest != nullptr) { - if (c->GetClientVersion() >= EQClientRoF) + if (c->GetClientVersion() >= EQClientRoF2) + { + c->Message(0, " %i: %c%06X00000000000000000000000000000000000000000000000000%s%c", (int)item->ID, 0x12, item->ID, item->Name, 0x12); + } + else if (c->GetClientVersion() >= EQClientRoF) { c->Message(0, " %i: %c%06X0000000000000000000000000000000000000000000000000%s%c",(int) item->ID,0x12, item->ID, item->Name, 0x12); } diff --git a/zone/merc.cpp b/zone/merc.cpp index 1c4165c1e..2641e7cb4 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -1196,18 +1196,32 @@ void Merc::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { ns->spawn.NPC = 1; // 0=player,1=npc,2=pc corpse,3=npc corpse ns->spawn.IsMercenary = 1; + /* + // Wear Slots are not setup for Mercs yet unsigned int i; - //should not include 21 (SLOT_AMMO) - for (i = 0; i < MainAmmo; i++) { - if(equipment[i] == 0) + for (i = 0; i < _MaterialCount; i++) + { + if (equipment[i] == 0) + { continue; + } const Item_Struct* item = database.GetItem(equipment[i]); if(item) { - ns->spawn.equipment[i] = item->Material; - ns->spawn.colors[i].color = item->Color; + ns->spawn.equipment[i].material = item->Material; + ns->spawn.equipment[i].elitematerial = item->EliteMaterial; + ns->spawn.equipment[i].heroforgemodel = item->HerosForgeModel; + if (armor_tint[i]) + { + ns->spawn.colors[i].color = armor_tint[i]; + } + else + { + ns->spawn.colors[i].color = item->Color; + } } } + */ } } diff --git a/zone/mob.cpp b/zone/mob.cpp index f7193fbed..e501862a2 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -963,22 +963,44 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) ns->spawn.flymode = FindType(SE_Levitate) ? 2 : 0; } else + { ns->spawn.flymode = flymode; + } ns->spawn.lastName[0] = '\0'; strn0cpy(ns->spawn.lastName, lastname, sizeof(ns->spawn.lastName)); - for(i = 0; i < _MaterialCount; i++) + const Item_Struct *item; + + for (i = 0; i < _MaterialCount; i++) { - ns->spawn.equipment[i] = GetEquipmentMaterial(i); - if (armor_tint[i]) + // Only Player Races Wear Armor + if (IsPlayerRace(race) || i > 6) { - ns->spawn.colors[i].color = armor_tint[i]; - } - else - { - ns->spawn.colors[i].color = GetEquipmentColor(i); + ns->spawn.equipment[i].material = GetEquipmentMaterial(i); + + item = database.GetItem(GetEquipment(i)); + if (item != 0) + { + ns->spawn.equipment[i].elitematerial = item->EliteMaterial; + ns->spawn.equipment[i].heroforgemodel = item->HerosForgeModel; + if (armor_tint[i]) + { + ns->spawn.colors[i].color = armor_tint[i]; + } + else + { + ns->spawn.colors[i].color = item->Color; + } + } + else + { + if (armor_tint[i]) + { + ns->spawn.colors[i].color = armor_tint[i]; + } + } } } @@ -2601,8 +2623,20 @@ void Mob::SendWearChange(uint8 material_slot) wc->spawn_id = GetID(); wc->material = GetEquipmentMaterial(material_slot); - wc->elite_material = IsEliteMaterialItem(material_slot); - wc->color.color = GetEquipmentColor(material_slot); + const Item_Struct *item; + item = database.GetItem(GetEquipment(material_slot)); + if (item != 0) + { + wc->elite_material = item->EliteMaterial; + wc->hero_forge_model = item->HerosForgeModel; + wc->color.color = item->Color; + } + else + { + wc->elite_material = 0; + wc->hero_forge_model = 0; + wc->color.color = 0; + } wc->wear_slot_id = material_slot; entity_list.QueueClients(this, outapp); @@ -2646,6 +2680,7 @@ void Mob::SetSlotTint(uint8 material_slot, uint8 red_tint, uint8 green_tint, uin wc->spawn_id = this->GetID(); wc->material = GetEquipmentMaterial(material_slot); + wc->hero_forge_model = GetHeroForgeModel(material_slot); wc->color.color = color; wc->wear_slot_id = material_slot; @@ -2653,7 +2688,7 @@ void Mob::SetSlotTint(uint8 material_slot, uint8 red_tint, uint8 green_tint, uin safe_delete(outapp); } -void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color) +void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 hero_forge_model) { armor_tint[material_slot] = color; @@ -2662,6 +2697,7 @@ void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color) wc->spawn_id = this->GetID(); wc->material = texture; + wc->hero_forge_model = hero_forge_model; wc->color.color = color; wc->wear_slot_id = material_slot; @@ -2741,6 +2777,19 @@ uint32 Mob::IsEliteMaterialItem(uint8 material_slot) const return 0; } +uint32 Mob::GetHeroForgeModel(uint8 material_slot) const +{ + const Item_Struct *item; + + item = database.GetItem(GetEquipment(material_slot)); + if (item != 0) + { + return item->HerosForgeModel; + } + + return 0; +} + // works just like a printf void Mob::Say(const char *format, ...) { @@ -3797,6 +3846,8 @@ int32 Mob::GetItemStat(uint32 itemid, const char *identifier) stat = int32(item->CastTime); if (id == "elitematerial") stat = int32(item->EliteMaterial); + if (id == "herosforgemodel") + stat = int32(item->HerosForgeModel); if (id == "procrate") stat = int32(item->ProcRate); if (id == "combateffects") diff --git a/zone/mob.h b/zone/mob.h index dddce98f8..ada3c5df9 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -171,7 +171,7 @@ public: virtual void SendTextureWC(uint8 slot, uint16 texture, uint32 hero_forge_model = 0, uint32 elite_material = 0, uint32 unknown06 = 0, uint32 unknown18 = 0); virtual void SetSlotTint(uint8 material_slot, uint8 red_tint, uint8 green_tint, uint8 blue_tint); - virtual void WearChange(uint8 material_slot, uint16 texture, uint32 color); + virtual void WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 hero_forge_model = 0); void DoAnim(const int animnum, int type=0, bool ackreq = true, eqFilterType filter = FilterNone); void ProjectileAnimation(Mob* to, int item_id, bool IsArrow = false, float speed = 0, float angle = 0, float tilt = 0, float arc = 0, const char *IDFile = nullptr, SkillUseTypes skillInUse = SkillArchery); @@ -314,6 +314,7 @@ public: virtual int32 GetEquipmentMaterial(uint8 material_slot) const; virtual uint32 GetEquipmentColor(uint8 material_slot) const; virtual uint32 IsEliteMaterialItem(uint8 material_slot) const; + virtual uint32 GetHeroForgeModel(uint8 material_slot) const; bool AffectedBySpellExcludingSlot(int slot, int effect); virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillUseTypes attack_skill) = 0; virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillUseTypes attack_skill, diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index c47b463d3..4351fb89f 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -7460,12 +7460,13 @@ XS(XS_Mob_WearChange) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::WearChange(THIS, material_slot, texture, color)"); + Perl_croak(aTHX_ "Usage: Mob::WearChange(THIS, material_slot, texture, [color, hero_forge_model])"); { Mob * THIS; uint8 material_slot = (uint8)SvIV(ST(1)); uint16 texture = (uint16)SvUV(ST(2)); uint32 color = 0; + uint32 hero_forge_model = 0; if (sv_derived_from(ST(0), "Mob")) { IV tmp = SvIV((SV*)SvRV(ST(0))); @@ -7479,8 +7480,11 @@ XS(XS_Mob_WearChange) if (items > 3) { color = (uint32)SvUV(ST(3)); } + if (items > 4) { + hero_forge_model = (uint32)SvUV(ST(3)); + } - THIS->WearChange(material_slot, texture, color); + THIS->WearChange(material_slot, texture, color, hero_forge_model); } XSRETURN_EMPTY; } @@ -8614,7 +8618,7 @@ XS(boot_Mob) newXSproto(strcpy(buf, "TarGlobal"), XS_Mob_TarGlobal, file, "$$$$$$$"); newXSproto(strcpy(buf, "DelGlobal"), XS_Mob_DelGlobal, file, "$$"); newXSproto(strcpy(buf, "SetSlotTint"), XS_Mob_SetSlotTint, file, "$$$$$"); - newXSproto(strcpy(buf, "WearChange"), XS_Mob_WearChange, file, "$$$;$"); + newXSproto(strcpy(buf, "WearChange"), XS_Mob_WearChange, file, "$$$;$$"); newXSproto(strcpy(buf, "DoKnockback"), XS_Mob_DoKnockback, file, "$$$$"); newXSproto(strcpy(buf, "RemoveNimbusEffect"), XS_Mob_RemoveNimbusEffect, file, "$$"); newXSproto(strcpy(buf, "IsRunning"), XS_Mob_IsRunning, file, "$");