Problem
When a helmet is equipped, the character's hair geoset remains visible and clips through the helmet model. In the real WoW client, helmets hide the hair by replacing the hair geoset with a bald cap variant.
How it works in WoW
- Helmets are inventory type 1 (
ItemDisplayInfo.dbc flags field)
- When a helmet is equipped, the hair geoset (group 1 = sections 101+) should be replaced with a bald scalp geoset (section 1)
- The helmet itself is a separate attached model rendered via
entity.attached_model
Current state
M2_CharacterGeosetVisible handles geoset groups 4/5/7/8/9/10/11/12/13/15 but has no case for group 1 (hair). The hair geoset is always shown regardless of equipment.
M2_ApplyEquipmentItems only processes 4 body slots (upper/lower body, hands, feet) — it doesn't handle helmet inventory type at all.
What should happen
M2_ApplyEquipmentItems should check if any equipped item has inventory type 1 (helmet) via ItemDisplayInfo.dbc flags
- When a helmet is detected, set a flag in
m2CharacterOutfit_t (e.g. flags |= 0x1 for "has helmet")
M2_CharacterGeosetVisible should check this flag for group 1 sections: when set, only show section 1 (bald cap) instead of the hair style geoset
Scope
Renderer only. The network packing (entityState_t) already carries enough equipment data for the character menu to detect helmets. No protocol changes needed.
Reference
This is how the real WoW 1.12 client handles it: helmet visibility is driven by CharSections.dbc section 0, variant 0, with the bald cap as a fallback when the helmet flag is set.
Problem
When a helmet is equipped, the character's hair geoset remains visible and clips through the helmet model. In the real WoW client, helmets hide the hair by replacing the hair geoset with a bald cap variant.
How it works in WoW
ItemDisplayInfo.dbcflags field)entity.attached_modelCurrent state
M2_CharacterGeosetVisiblehandles geoset groups 4/5/7/8/9/10/11/12/13/15 but has no case for group 1 (hair). The hair geoset is always shown regardless of equipment.M2_ApplyEquipmentItemsonly processes 4 body slots (upper/lower body, hands, feet) — it doesn't handle helmet inventory type at all.What should happen
M2_ApplyEquipmentItemsshould check if any equipped item has inventory type 1 (helmet) viaItemDisplayInfo.dbcflagsm2CharacterOutfit_t(e.g.flags |= 0x1for "has helmet")M2_CharacterGeosetVisibleshould check this flag for group 1 sections: when set, only show section 1 (bald cap) instead of the hair style geosetScope
Renderer only. The network packing (
entityState_t) already carries enough equipment data for the character menu to detect helmets. No protocol changes needed.Reference
This is how the real WoW 1.12 client handles it: helmet visibility is driven by
CharSections.dbcsection 0, variant 0, with the bald cap as a fallback when the helmet flag is set.