DB/ItemDisplayInfo/GeosRenderPrep: Difference between revisions
Jump to navigation
Jump to search
(Updated code for 8.0.1. It's also more clear.) |
(Minor update for 8.0.1 code from TOM_RUS.) |
||
Line 1: | Line 1: | ||
// GeosetRenderPrep.cpp : Defines the entry point for the console application. | // GeosetRenderPrep.cpp : Defines the entry point for the console application. | ||
// | // | ||
#include "stdafx.h" | #include "stdafx.h" | ||
int main() | int main() | ||
{ | { | ||
return 0; | |||
} | } | ||
struct CCharacterComponent | 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 | struct CharSectionsRec | ||
{ | { | ||
uint32_t Flags; | |||
}; | }; | ||
struct CM2Model | struct CM2Model | ||
{ | { | ||
static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {} | |||
}; | }; | ||
struct ItemDisplayInfoRec | 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) | 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) | uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup) | ||
{ | { | ||
return 0; | |||
} | } | ||
ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID) | ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID) | ||
{ | { | ||
return nullptr; | |||
} | } | ||
void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent) | void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent) | ||
{ | { | ||
BOOL eyeGlowFlag = 0; | |||
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 wrist? | |||
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 | |||
// possibly !textureArmUpper && !textureArmLower && !textureTorsoUpper && !textureTorsoLower && !textureLegUpper && !textureLegLower ? | |||
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 = 1301 + pChest->GeosetGroup[2]; | |||
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 = 1301 + pPants->GeosetGroup[2]; | |||
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 = 901 + pPants->GeosetGroup[1]; | |||
} | |||
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 = 2000 + pBoots->GeosetGroup[1]; | |||
} | |||
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 = 1201 + pTabard->GeosetGroup[0]; | |||
showsTabard = 1; | |||
} | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1); | |||
} | |||
else if (!(pCharComponent->flags & 0x10)) | |||
{ | |||
// nop | |||
} | |||
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 unkBool; | |||
if (pCharComponent->flags & 8) | |||
{ | |||
unkBool = !pantsID && !dressChestpiece && !dressPants && !showsTabard && !tailFlag && !hasBulkyBeltFlag; | |||
//unkBool = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1); | |||
if (unkBool) | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1); | |||
} | |||
else | |||
{ | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0); | |||
} | |||
} | |||
else | |||
{ | |||
unkBool = 0; | |||
} | |||
// DH hands | |||
uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23); | |||
if (v86 <= 0) | |||
v86 = 1; | |||
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2300 + v86, 2300 + v86, 1); | |||
//sub_1401BCDC0(pCharComponent, unkBool); | |||
//auto v132 = sub_1401C53B0(pCharComponent->raceID, pCharComponent->genderID); | |||
//auto v133 = sub_14023D380(pCharComponent->raceID, pCharComponent->genderID, pCharComponent->faceIndex, v132 != 0); | |||
//uint32_t v2 = 0; | |||
//if (v133) | |||
// v2 = *v133; | |||
//sub_1412EFA90(pCharComponent->modelPtr, v2); | |||
//sub_1412EE6B0(pCharComponent->modelPtr); | |||
//LOBYTE(pCharComponent->flags) &= 0xFDu; | |||
} | } |
Revision as of 20:13, 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 = 0; 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 wrist? 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 // possibly !textureArmUpper && !textureArmLower && !textureTorsoUpper && !textureTorsoLower && !textureLegUpper && !textureLegLower ? 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 = 1301 + pChest->GeosetGroup[2]; 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 = 1301 + pPants->GeosetGroup[2]; 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 = 901 + pPants->GeosetGroup[1]; } 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 = 2000 + pBoots->GeosetGroup[1]; } 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 = 1201 + pTabard->GeosetGroup[0]; showsTabard = 1; } CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1); } else if (!(pCharComponent->flags & 0x10)) { // nop } 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 unkBool; if (pCharComponent->flags & 8) { unkBool = !pantsID && !dressChestpiece && !dressPants && !showsTabard && !tailFlag && !hasBulkyBeltFlag; //unkBool = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1); if (unkBool) { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1); } else { CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0); } } else { unkBool = 0; } // DH hands uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23); if (v86 <= 0) v86 = 1; CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2300 + v86, 2300 + v86, 1); //sub_1401BCDC0(pCharComponent, unkBool); //auto v132 = sub_1401C53B0(pCharComponent->raceID, pCharComponent->genderID); //auto v133 = sub_14023D380(pCharComponent->raceID, pCharComponent->genderID, pCharComponent->faceIndex, v132 != 0); //uint32_t v2 = 0; //if (v133) // v2 = *v133; //sub_1412EFA90(pCharComponent->modelPtr, v2); //sub_1412EE6B0(pCharComponent->modelPtr); //LOBYTE(pCharComponent->flags) &= 0xFDu; }