DB/ItemDisplayInfo/GeosRenderPrep: Difference between revisions
Jump to navigation
Jump to search
(Created page with " void CCharacterComponent::GeosRenderPrep(CCharacterComponent *characterComponent) { // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND] // "characte...") |
(Updated code for 8.0.1. It's also more clear.) |
||
Line 1: | Line 1: | ||
void | // GeosetRenderPrep.cpp : Defines the entry point for the console application. | ||
// | |||
#include "stdafx.h" | |||
int main() | |||
{ | |||
return 0; | |||
} | |||
struct CCharacterComponent | |||
{ | |||
uint32_t raceID; | |||
uint32_t classID; | |||
uint32_t skinIndex; | |||
uint32_t genderID; | |||
uint32_t faceIndex; | |||
void *modelPtr; | |||
uint32_t submeshIds[29]; | |||
uint32_t itemids[10]; | |||
uint32_t gap2[520]; | |||
uint64_t shirtRelated[6]; | |||
uint32_t flags; | |||
static void GeosRenderPrep(CCharacterComponent *pCharComponent); | |||
}; | |||
struct CharSectionsRec | |||
{ | |||
uint32_t Flags; | |||
}; | |||
struct CM2Model | |||
{ | |||
static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {} | |||
}; | |||
struct ItemDisplayInfoRec | |||
{ | { | ||
uint32_t Flags; | |||
uint32_t GeosetGroup[4]; | |||
}; | |||
CharSectionsRec *ComponentGetSectionsRecord(uint32_t raceID, uint32_t genderID, uint32_t sectionID, uint32_t faceIndex, uint32_t skinIndex, uint32_t unk1) | |||
{ | |||
return nullptr; | |||
} | |||
uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup) | |||
{ | |||
return 0; | |||
} | |||
ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID) | |||
{ | |||
return nullptr; | |||
} | |||
void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent) | |||
{ | |||
BOOL eyeGlowFlag; | |||
if (pCharComponent->classID == 6) // DK | |||
{ | |||
eyeGlowFlag = 1; | |||
} | |||
else | |||
{ | |||
// section Face | |||
auto pFaceSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 1, pCharComponent->faceIndex, pCharComponent->skinIndex, 0); | |||
if (pFaceSection) | |||
eyeGlowFlag = pFaceSection->Flags & 4;// flags & 0x4 | |||
else | |||
eyeGlowFlag = 0; | |||
} | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 3000, 0); // disable all | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 0, 1); // enable skin | |||
uint32_t i = 0; | |||
do | |||
{ | |||
if (eyeGlowFlag && i == 17) | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1703, 1703, 1); | |||
else | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pCharComponent->submeshIds[i], pCharComponent->submeshIds[i], 1); | |||
++i; | |||
} while (i != 29); | |||
// Tail | |||
BOOL tailFlag = 0; | |||
// section Skin | |||
auto pSkinSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 0, 0, pCharComponent->skinIndex, 0); | |||
if (pSkinSection) | |||
tailFlag = pSkinSection->Flags & 0x100; // flags & 0x100 | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900, 1999, 0); | |||
uint32_t tailGeoset = 1; | |||
if (!tailFlag) | |||
tailGeoset = GetConditionalGeoset(pCharComponent->raceID, 19); | |||
if (tailGeoset <= 0) | |||
tailGeoset = 1; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900 + tailGeoset, 1900 + tailGeoset, 1); | |||
// Item ID's | |||
auto shirtID = pCharComponent->itemids[0]; | |||
auto chestID = pCharComponent->itemids[1]; | |||
auto beltID = pCharComponent->itemids[2]; | |||
auto pantsID = pCharComponent->itemids[3]; | |||
auto bootsID = pCharComponent->itemids[4]; | |||
// 5? | |||
auto glovesID = pCharComponent->itemids[6]; | |||
auto tabardID = pCharComponent->itemids[7]; | |||
auto cloakID = pCharComponent->itemids[8]; | |||
// Gloves | |||
if (glovesID) | |||
{ | |||
auto pGloves = GetItemDisplayInfoRec(glovesID); | |||
if (pGloves && pGloves->GeosetGroup[0]) | |||
{ | |||
auto glovesGeoset = 401 + pGloves->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 401, 499, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, glovesGeoset, glovesGeoset, 1); | |||
} | |||
} | |||
else | |||
{ | |||
// Chest | |||
if (chestID) | |||
{ | |||
auto pChest = GetItemDisplayInfoRec(chestID); | |||
if (pChest && pChest->GeosetGroup[0]) | |||
{ | |||
auto chesetGeoset = 801 + pChest->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chesetGeoset, chesetGeoset, 1); | |||
} | |||
} | |||
} | |||
// unknown shirt pre-check | |||
if (!pCharComponent->shirtRelated[0] && !pCharComponent->shirtRelated[1] && !pCharComponent->shirtRelated[2] && !pCharComponent->shirtRelated[3] && !pCharComponent->shirtRelated[4] && !pCharComponent->shirtRelated[5]) | |||
{ | |||
// Shirt | |||
if (shirtID) | |||
{ | |||
auto pShirt = GetItemDisplayInfoRec(shirtID); | |||
if (pShirt && pShirt->GeosetGroup[0]) | |||
{ | |||
auto shirtGeoset = 801 + pShirt->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1); | |||
} | |||
} | |||
} | |||
// Tabard | |||
auto pTabard = GetItemDisplayInfoRec(tabardID); | |||
if (pTabard) | |||
{ | |||
if (!(pTabard->Flags & 0x100000)) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2202, 2202, 1); | |||
} | |||
} | |||
else | |||
{ | |||
// Chest | |||
if (chestID) | |||
{ | |||
auto pChest = GetItemDisplayInfoRec(chestID); | |||
if (pChest && pChest->GeosetGroup[3]) | |||
{ | |||
auto chestGeoset = 2201 + pChest->GeosetGroup[3]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); | |||
} | |||
} | |||
} | |||
// Belt | |||
BOOL hasBulkyBeltFlag = 0; | |||
auto pBelt = GetItemDisplayInfoRec(beltID); | |||
if (pBelt) | |||
hasBulkyBeltFlag = pBelt->Flags & 0x200; | |||
BOOL dressPants, dressChestpiece; | |||
// Chest | |||
if (chestID) | |||
{ | |||
auto pChest = GetItemDisplayInfoRec(chestID); | |||
if (pChest && pChest->GeosetGroup[2]) | |||
{ | |||
if (pChest->GeosetGroup[2]) | |||
{ | |||
dressPants = 0; | |||
dressChestpiece = 1; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); | |||
auto chestGeoset = pChest->GeosetGroup[2] + 1301; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); | |||
} | |||
} | |||
} | |||
else if (pantsID)// Pants | |||
{ | |||
auto pPants = GetItemDisplayInfoRec(pantsID); | |||
if (pPants && pPants->GeosetGroup[2] && !HIWORD(pCharComponent->flags)) | |||
{ | |||
dressPants = 1; | |||
dressChestpiece = 0; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); | |||
auto pantsGeoset = pPants->GeosetGroup[2] + 1301; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); | |||
} | |||
} | |||
else | |||
{ | |||
dressPants = 0; | |||
dressChestpiece = 0; | |||
// Boots | |||
auto pBoots = GetItemDisplayInfoRec(bootsID); | |||
if (pBoots && pBoots->GeosetGroup[0]) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 901, 901, 1); | |||
auto bootsGeoset = 501 + pBoots->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1); | |||
} | |||
else | |||
{ | |||
// Pants | |||
auto pPants = GetItemDisplayInfoRec(pantsID); | |||
uint32_t pantsGeoset; | |||
if (pPants && pPants->GeosetGroup[1] && !HIWORD(pCharComponent->flags)) | |||
{ | |||
pantsGeoset = pPants->GeosetGroup[1] + 901; | |||
} | |||
else | |||
{ | |||
pantsGeoset = 901; | |||
} | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); | |||
} | |||
} | |||
// Boots | |||
BOOL bootsFlag = 0; | |||
auto pBoots = GetItemDisplayInfoRec(bootsID); | |||
if (pBoots) | |||
bootsFlag = (pBoots->Flags & 0x100000) == 0; | |||
uint32_t bootsGeoset; | |||
if (pBoots && pBoots->GeosetGroup[1]) | |||
{ | |||
bootsGeoset = pBoots->GeosetGroup[1] + 2000; | |||
} | |||
else | |||
{ | |||
if (bootsFlag) | |||
{ | |||
bootsGeoset = 2002; | |||
} | |||
else | |||
{ | |||
bootsGeoset = 2001; | |||
} | |||
} | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1); | |||
// Tabard | |||
BOOL showsTabard = 0; | |||
BOOL hasDress = dressChestpiece | dressPants; | |||
if (!hasDress && tabardID != 0 && pTabard && pTabard->GeosetGroup[0]) | |||
{ | |||
showsTabard = 0; | |||
uint32_t tabardGeoset; | |||
if (hasBulkyBeltFlag) | |||
{ | |||
showsTabard = 1; | |||
tabardGeoset = 1203; | |||
} | |||
else | |||
{ | |||
tabardGeoset = pTabard->GeosetGroup[0] + 1201; | |||
showsTabard = 1; | |||
} | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1); | |||
} | |||
else if (!(pCharComponent->flags & 0x10)) | |||
{ | |||
} | |||
else | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1201, 1201, 1); | |||
if (!hasDress) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1202, 1202, 1); | |||
showsTabard = 1; | |||
} | |||
} | |||
if (!(dressChestpiece | showsTabard)) | |||
{ | |||
// Chest | |||
if (chestID) | |||
{ | |||
auto pChest = GetItemDisplayInfoRec(chestID); | |||
if (pChest && pChest->GeosetGroup[1]) | |||
{ | |||
auto chestGeoset = 1001 + pChest->GeosetGroup[1]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); | |||
} | |||
} | |||
else if (shirtID) | |||
{ | |||
auto pShirt = GetItemDisplayInfoRec(shirtID); | |||
if (pShirt && pShirt->GeosetGroup[1]) | |||
{ | |||
auto shirtGeoset = 1001 + pShirt->GeosetGroup[1]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1); | |||
} | |||
} | |||
} | |||
if (!dressChestpiece && !HIWORD(pCharComponent->flags)) | |||
{ | |||
if (pantsID) | |||
{ | |||
auto pPants = GetItemDisplayInfoRec(pantsID); | |||
if (pPants && pPants->GeosetGroup[0]) | |||
{ | |||
auto geosetGroup = pPants->GeosetGroup[0]; | |||
auto pantsGeoset = 1101 + geosetGroup; | |||
if (geosetGroup > 2) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); | |||
} | |||
else if (!showsTabard) | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); | |||
} | |||
} | |||
} | |||
// Cloak | |||
if (cloakID) | |||
{ | |||
auto pCloak = GetItemDisplayInfoRec(cloakID); | |||
if (pCloak && pCloak->GeosetGroup[0]) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1500, 1599, 0); | |||
auto cloakGeoset = 1501 + pCloak->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, cloakGeoset, cloakGeoset, 1); | |||
} | |||
} | |||
// Belt | |||
if (beltID) | |||
{ | |||
auto pBelt = GetItemDisplayInfoRec(beltID); | |||
if (pBelt && pBelt->GeosetGroup[0]) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1800, 1899, 0); | |||
auto beltGeoset = 1801 + pBelt->GeosetGroup[0]; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, beltGeoset, beltGeoset, 1); | |||
} | |||
} | |||
BOOL v76; | |||
if (pCharComponent->flags & 8) | |||
{ | |||
v76 = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1); | |||
if (v76) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1); | |||
} | |||
else | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0); | |||
} | |||
} | |||
else | |||
{ | |||
v76 = 0; | |||
} | |||
// DH hands | |||
uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23); | |||
if (v86 <= 0) | |||
v86 = 1; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, (v86 + 2300), (v86 + 2300), 1); | |||
//sub_1000990E0(pCharComponent, v76 != 0); | |||
//v87 = pCharComponent->raceID; | |||
//v88 = *genderID; | |||
//if (!byte_101E3C7D0) | |||
//{ | |||
// byte_101E3C7D0 = 1; | |||
// v89 = qword_101E3C7C8; | |||
// if (qword_101E3C7C8 || (v89 = sub_1000E0760("hdPlayerModels"), (qword_101E3C7C8 = v89) != 0)) | |||
// v90 = *(v89 + 92) != 0; | |||
// else | |||
// v90 = 0; | |||
// sub_100097210(v90, dword_101E3C15C); | |||
//} | |||
//v91 = 0; | |||
//if (v87 > 36) | |||
//{ | |||
// v92 = 0; | |||
//} | |||
//else | |||
//{ | |||
// v92 = 0; | |||
// if (v88 <= 1) | |||
// v92 = dword_101E3C15C[4 * v87 + 2 * v88] == 1; | |||
//} | |||
//v93 = sub_100148CA0(pCharComponent->raceID, *genderID, pCharComponent->faceIndex, v92); | |||
//if (v93) | |||
// v91 = *v93; | |||
//sub_101436B70(pCharComponent->modelPtr, v91); | |||
//sub_1014387C0(pCharComponent->modelPtr); | |||
//LOBYTE(pCharComponent->flags) &= 0xFDu; | |||
} | } |
Revision as of 19:40, 30 March 2018
// GeosetRenderPrep.cpp : Defines the entry point for the console application. // #include "stdafx.h" int main() { return 0; } struct CCharacterComponent { uint32_t raceID; uint32_t classID; uint32_t skinIndex; uint32_t genderID; uint32_t faceIndex; void *modelPtr; uint32_t submeshIds[29]; uint32_t itemids[10]; uint32_t gap2[520]; uint64_t shirtRelated[6]; uint32_t flags; static void GeosRenderPrep(CCharacterComponent *pCharComponent); }; struct CharSectionsRec { uint32_t Flags; }; struct CM2Model { static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {} }; struct ItemDisplayInfoRec { uint32_t Flags; uint32_t GeosetGroup[4]; }; CharSectionsRec *ComponentGetSectionsRecord(uint32_t raceID, uint32_t genderID, uint32_t sectionID, uint32_t faceIndex, uint32_t skinIndex, uint32_t unk1) { return nullptr; } uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup) { return 0; } ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID) { return nullptr; } void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent) { BOOL eyeGlowFlag; if (pCharComponent->classID == 6) // DK { eyeGlowFlag = 1; } else { // section Face auto pFaceSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 1, pCharComponent->faceIndex, pCharComponent->skinIndex, 0); if (pFaceSection) eyeGlowFlag = pFaceSection->Flags & 4;// flags & 0x4 else eyeGlowFlag = 0; } CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 3000, 0); // disable all CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 0, 1); // enable skin uint32_t i = 0; do { if (eyeGlowFlag && i == 17) CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1703, 1703, 1); else CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pCharComponent->submeshIds[i], pCharComponent->submeshIds[i], 1); ++i; } while (i != 29); // Tail BOOL tailFlag = 0; // section Skin auto pSkinSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 0, 0, pCharComponent->skinIndex, 0); if (pSkinSection) tailFlag = pSkinSection->Flags & 0x100; // flags & 0x100 CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900, 1999, 0); uint32_t tailGeoset = 1; if (!tailFlag) tailGeoset = GetConditionalGeoset(pCharComponent->raceID, 19); if (tailGeoset <= 0) tailGeoset = 1; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900 + tailGeoset, 1900 + tailGeoset, 1); // Item ID's auto shirtID = pCharComponent->itemids[0]; auto chestID = pCharComponent->itemids[1]; auto beltID = pCharComponent->itemids[2]; auto pantsID = pCharComponent->itemids[3]; auto bootsID = pCharComponent->itemids[4]; // 5? auto glovesID = pCharComponent->itemids[6]; auto tabardID = pCharComponent->itemids[7]; auto cloakID = pCharComponent->itemids[8]; // Gloves if (glovesID) { auto pGloves = GetItemDisplayInfoRec(glovesID); if (pGloves && pGloves->GeosetGroup[0]) { auto glovesGeoset = 401 + pGloves->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 401, 499, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, glovesGeoset, glovesGeoset, 1); } } else { // Chest if (chestID) { auto pChest = GetItemDisplayInfoRec(chestID); if (pChest && pChest->GeosetGroup[0]) { auto chesetGeoset = 801 + pChest->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chesetGeoset, chesetGeoset, 1); } } } // unknown shirt pre-check if (!pCharComponent->shirtRelated[0] && !pCharComponent->shirtRelated[1] && !pCharComponent->shirtRelated[2] && !pCharComponent->shirtRelated[3] && !pCharComponent->shirtRelated[4] && !pCharComponent->shirtRelated[5]) { // Shirt if (shirtID) { auto pShirt = GetItemDisplayInfoRec(shirtID); if (pShirt && pShirt->GeosetGroup[0]) { auto shirtGeoset = 801 + pShirt->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1); } } } // Tabard auto pTabard = GetItemDisplayInfoRec(tabardID); if (pTabard) { if (!(pTabard->Flags & 0x100000)) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2202, 2202, 1); } } else { // Chest if (chestID) { auto pChest = GetItemDisplayInfoRec(chestID); if (pChest && pChest->GeosetGroup[3]) { auto chestGeoset = 2201 + pChest->GeosetGroup[3]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); } } } // Belt BOOL hasBulkyBeltFlag = 0; auto pBelt = GetItemDisplayInfoRec(beltID); if (pBelt) hasBulkyBeltFlag = pBelt->Flags & 0x200; BOOL dressPants, dressChestpiece; // Chest if (chestID) { auto pChest = GetItemDisplayInfoRec(chestID); if (pChest && pChest->GeosetGroup[2]) { if (pChest->GeosetGroup[2]) { dressPants = 0; dressChestpiece = 1; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); auto chestGeoset = pChest->GeosetGroup[2] + 1301; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); } } } else if (pantsID)// Pants { auto pPants = GetItemDisplayInfoRec(pantsID); if (pPants && pPants->GeosetGroup[2] && !HIWORD(pCharComponent->flags)) { dressPants = 1; dressChestpiece = 0; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); auto pantsGeoset = pPants->GeosetGroup[2] + 1301; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); } } else { dressPants = 0; dressChestpiece = 0; // Boots auto pBoots = GetItemDisplayInfoRec(bootsID); if (pBoots && pBoots->GeosetGroup[0]) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 901, 901, 1); auto bootsGeoset = 501 + pBoots->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1); } else { // Pants auto pPants = GetItemDisplayInfoRec(pantsID); uint32_t pantsGeoset; if (pPants && pPants->GeosetGroup[1] && !HIWORD(pCharComponent->flags)) { pantsGeoset = pPants->GeosetGroup[1] + 901; } else { pantsGeoset = 901; } CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); } } // Boots BOOL bootsFlag = 0; auto pBoots = GetItemDisplayInfoRec(bootsID); if (pBoots) bootsFlag = (pBoots->Flags & 0x100000) == 0; uint32_t bootsGeoset; if (pBoots && pBoots->GeosetGroup[1]) { bootsGeoset = pBoots->GeosetGroup[1] + 2000; } else { if (bootsFlag) { bootsGeoset = 2002; } else { bootsGeoset = 2001; } } CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1); // Tabard BOOL showsTabard = 0; BOOL hasDress = dressChestpiece | dressPants; if (!hasDress && tabardID != 0 && pTabard && pTabard->GeosetGroup[0]) { showsTabard = 0; uint32_t tabardGeoset; if (hasBulkyBeltFlag) { showsTabard = 1; tabardGeoset = 1203; } else { tabardGeoset = pTabard->GeosetGroup[0] + 1201; showsTabard = 1; } CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1); } else if (!(pCharComponent->flags & 0x10)) { } else { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1201, 1201, 1); if (!hasDress) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1202, 1202, 1); showsTabard = 1; } } if (!(dressChestpiece | showsTabard)) { // Chest if (chestID) { auto pChest = GetItemDisplayInfoRec(chestID); if (pChest && pChest->GeosetGroup[1]) { auto chestGeoset = 1001 + pChest->GeosetGroup[1]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1); } } else if (shirtID) { auto pShirt = GetItemDisplayInfoRec(shirtID); if (pShirt && pShirt->GeosetGroup[1]) { auto shirtGeoset = 1001 + pShirt->GeosetGroup[1]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1); } } } if (!dressChestpiece && !HIWORD(pCharComponent->flags)) { if (pantsID) { auto pPants = GetItemDisplayInfoRec(pantsID); if (pPants && pPants->GeosetGroup[0]) { auto geosetGroup = pPants->GeosetGroup[0]; auto pantsGeoset = 1101 + geosetGroup; if (geosetGroup > 2) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0); CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); } else if (!showsTabard) CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1); } } } // Cloak if (cloakID) { auto pCloak = GetItemDisplayInfoRec(cloakID); if (pCloak && pCloak->GeosetGroup[0]) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1500, 1599, 0); auto cloakGeoset = 1501 + pCloak->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, cloakGeoset, cloakGeoset, 1); } } // Belt if (beltID) { auto pBelt = GetItemDisplayInfoRec(beltID); if (pBelt && pBelt->GeosetGroup[0]) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1800, 1899, 0); auto beltGeoset = 1801 + pBelt->GeosetGroup[0]; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, beltGeoset, beltGeoset, 1); } } BOOL v76; if (pCharComponent->flags & 8) { v76 = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1); if (v76) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1); } else { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0); } } else { v76 = 0; } // DH hands uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23); if (v86 <= 0) v86 = 1; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, (v86 + 2300), (v86 + 2300), 1); //sub_1000990E0(pCharComponent, v76 != 0); //v87 = pCharComponent->raceID; //v88 = *genderID; //if (!byte_101E3C7D0) //{ // byte_101E3C7D0 = 1; // v89 = qword_101E3C7C8; // if (qword_101E3C7C8 || (v89 = sub_1000E0760("hdPlayerModels"), (qword_101E3C7C8 = v89) != 0)) // v90 = *(v89 + 92) != 0; // else // v90 = 0; // sub_100097210(v90, dword_101E3C15C); //} //v91 = 0; //if (v87 > 36) //{ // v92 = 0; //} //else //{ // v92 = 0; // if (v88 <= 1) // v92 = dword_101E3C15C[4 * v87 + 2 * v88] == 1; //} //v93 = sub_100148CA0(pCharComponent->raceID, *genderID, pCharComponent->faceIndex, v92); //if (v93) // v91 = *v93; //sub_101436B70(pCharComponent->modelPtr, v91); //sub_1014387C0(pCharComponent->modelPtr); //LOBYTE(pCharComponent->flags) &= 0xFDu; }