Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions code/client/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ set(HOGWARTSMP_CLIENT_FILES
src/core/ue4_impl.cpp
src/core/ue4_reflection.cpp
src/core/playground.cpp
src/core/appearance_dump.cpp
src/core/student_proxy.cpp

src/core/ui/chat.cpp
Expand Down
404 changes: 404 additions & 0 deletions code/client/src/core/appearance_dump.cpp

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions code/client/src/core/appearance_dump.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

namespace HogwartsMP::Core::AppearanceDump {
// Thread-safe request setter; the actual dump happens on the next engine
// tick via ProcessPending (game thread required: GObjects walk and
// ProcessEvent are not safe off-thread).
void RequestDump();

// Game-thread pump — Playground_Tick calls this once per engine tick.
void ProcessPending();
} // namespace HogwartsMP::Core::AppearanceDump
24 changes: 23 additions & 1 deletion code/client/src/core/kit_params.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,29 @@
#pragma once
#pragma once
// AUTO-GENERATED from a live BP_Student_C MID dump (2026-06-10).
// Same parameter set applies to all 7 outfit material slots (verified: two
// independent in-game harvests were byte-identical).
//
// ── Material zones ──────────────────────────────────────────────────────────
// Param names like "Color_Tint_High[7]" are flat FNames; the [n] suffix is the
// artists' convention for a ZONE of the outfit's swatch-kit master material.
// A region-ID mask texture maps each texel to a zone; zone n then gets its own
// Swatch_{Diffuse,MRAB,Normal}[n] fabric textures, Color_Tint_{High,Low}[n]
// tints, UVBias/UvRotationScale[n] mapping, and Fuzz/Overlay_Opacity/
// Base_SROD_Modifier[n] surface tweaks.
//
// Zone numbering is PER-MATERIAL — each robe material has its own layout, so
// house overlays only apply to the robe they were harvested from. Per-material
// zone maps live at the top of each kit_params_*_uniNN.h header ("StuUniNN" is
// the game's uniform-style asset variant, not our versioning). Adding another
// uniform style later (StuUni01/02/04…) means harvesting a new header with the
// same AppearanceDump pipeline.
//
// The legacy arrays below belong to the male StuUni01 robe
// (MI_HUM_M_CMBH_Robed_StuUni01) — no longer worn by the proxy (it switched to
// StuUni03 so the house overlays line up). Known zones: 12 = visible skin
// (T_Skin_Arms*); the rest is unmapped. The house tables in
// kit_params_houses.h DO NOT apply to this layout.
// ────────────────────────────────────────────────────────────────────────────

#include <array>

Expand Down
173 changes: 173 additions & 0 deletions code/client/src/core/kit_params_female_uni03.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
#pragma once
// AUTO-GENERATED from the in-game AppearanceDump MID harvest (2026-06-12).
// Female StuUni03 robe MID parameters, read from a live female
// BP_Tier3_Character_C Upper MID (parent MI_HUM_F_CMBH_StuUni03_Robed).
// "StuUni03" is the game's uniform-style asset variant (StuUni01/03/… are
// different designs), not our versioning.
//
// Zone map (female StuUni03; empirical — see kit_params.h for what zones are):
// zone 4 = house crest patch (Swatch_* = T_Patch_{G,S,R,H}_*)
// zone 3 = primary house color (classic house colors in Color_Tint_Low[3])
// zone 11 = secondary house color
// zone 12 = visible skin (T_Skin_Arms* — varies per INDIVIDUAL, not house)
// remaining zones unidentified
//
// NOTE: the female zone layout differs from the male StuUni03 layout — house
// overlays are per-gender (HouseParamsF/HouseTexturesF in kit_params_houses.h).

#include "kit_params.h"

namespace HogwartsMP::KitParams
{
inline constexpr auto FemaleUni03Scalars = std::to_array<ScalarParam>({
{L"Fuzz[14]", 0.0f},
{L"Overlay_Opacity[7]", 0.0f},
{L"Normal_Intensity[2]", 0.0f},
{L"Overlay_Opacity[1]", 0.0f},
{L"Fuzz[6]", 0.0f},
{L"Normal_Intensity[6]", 0.0f},
{L"Fuzz[9]", 0.0f},
{L"Fuzz[5]", 0.0f},
{L"Fuzz[8]", 0.0f},
{L"Overlay_Opacity[15]", 0.0f},
{L"Fuzz[10]", 0.0f},
{L"Fuzz[11]", 0.0f},
{L"Fuzz[12]", 0.0f},
{L"Fuzz[4]", 0.0f},
{L"Normal_Intensity[4]", 0.0f},
{L"Normal_Intensity[1]", 0.0f},
{L"Overlay_Opacity[11]", 0.0f},
{L"Overlay_Opacity[2]", 0.0f},
{L"Normal_Intensity[12]", 0.0f},
{L"Overlay_Opacity[10]", 0.0f},
{L"Overlay_Opacity[13]", 0.0f},
{L"Fuzz[13]", 0.0f},
});

inline constexpr auto FemaleUni03Vectors = std::to_array<VectorParam>({
{L"Base_SROD_Modifier[1]", 1.0f, 0.5f, 1.0f, 0.19f},
{L"Color_Tint_High[1]", 0.947917f, 0.947917f, 0.947917f, 1.0f},
{L"Color_Tint_Low[1]", 0.921875f, 0.921875f, 0.921875f, 1.0f},
{L"MRAB_Modifier[1]", 1.0f, 1.0f, 1.0f, 0.14f},
{L"Scatter_Color[1]", 0.064803f, 0.07036f, 0.082283f, 1.0f},
{L"Scatter_Color[14]", 0.609375f, 0.609375f, 0.609375f, 1.0f},
{L"UvRotationScale[1]", 0.934579f, -0.0f, 0.0f, 0.934579f},
{L"Base_SROD_Modifier[7]", 1.0f, 0.5f, 1.0f, 0.12f},
{L"Color_Tint_High[7]", 0.401978f, 0.467784f, 0.55834f, 1.0f},
{L"Color_Tint_Low[7]", 0.514918f, 0.55834f, 0.651406f, 1.0f},
{L"MRAB_Modifier[7]", 1.0f, 1.0f, 1.0f, 0.14f},
{L"Color_Tint_Low[2]", 0.515408f, 0.553514f, 0.651042f, 1.0f},
{L"Color_Tint_High[14]", 0.130208f, 0.114756f, 0.114756f, 1.0f},
{L"UvRotationScale[7]", 12.5f, -0.0f, 0.0f, 12.5f},
{L"Scatter_Color[7]", 0.064803f, 0.07036f, 0.082283f, 1.0f},
{L"Scatter_Color[2]", 0.064542f, 0.069887f, 0.083333f, 1.0f},
{L"Color_Tint_High[2]", 0.400584f, 0.466517f, 0.557292f, 1.0f},
{L"UvRotationScale[2]", 13.333333f, -0.0f, 0.0f, 13.333333f},
{L"Color_Tint_Low[14]", 0.270833f, 0.223226f, 0.207356f, 1.0f},
{L"Color_Tint_High[4]", 0.445201f, 0.445201f, 0.445201f, 1.0f},
{L"Color_Tint_Low[4]", 0.296138f, 0.327778f, 0.768151f, 1.0f},
{L"Base_SROD_Modifier[4]", 1.0f, 0.5f, 1.0f, 0.24f},
{L"Scatter_Color[4]", 0.033087f, 0.038267f, 0.046875f, 1.0f},
{L"Base_SROD_Modifier[15]", 1.0f, 0.5f, 0.5f, 0.5f},
{L"UvRotationScale[4]", 25.0f, -0.0f, 0.0f, 25.0f},
{L"Color_Tint_High[5]", 0.427083f, 0.389754f, 0.295541f, 1.0f},
{L"Color_Tint_Low[5]", 0.432292f, 0.394752f, 0.30001f, 1.0f},
{L"Base_SROD_Modifier[6]", 1.0f, 0.5f, 1.0f, 0.25f},
{L"Color_Tint_High[6]", 0.201556f, 0.201556f, 0.201556f, 1.0f},
{L"Color_Tint_Low[6]", 0.165132f, 0.174647f, 0.201556f, 1.0f},
{L"UvRotationScale[6]", 10.0f, -0.0f, 0.0f, 10.0f},
{L"Color_Tint_High[15]", 0.250158f, 0.258183f, 0.291771f, 1.0f},
{L"UVBias[6]", 0.54f, 0.64f, 0.0f, 1.0f},
{L"Scatter_Color[15]", 0.024158f, 0.033105f, 0.040915f, 1.0f},
{L"Color_Tint_Low[8]", 0.250158f, 0.215861f, 0.171441f, 1.0f},
{L"Color_Tint_High[8]", 0.201556f, 0.194618f, 0.177888f, 1.0f},
{L"Scatter_Color[8]", 0.14996f, 0.14996f, 0.14996f, 1.0f},
{L"Color_Tint_Low[9]", 0.364583f, 0.353889f, 0.343696f, 1.0f},
{L"Color_Tint_High[10]", 0.2f, 0.2f, 0.2f, 1.0f},
{L"Scatter_Color[9]", 0.14996f, 0.14996f, 0.14996f, 1.0f},
{L"Color_Tint_Low[10]", 0.2f, 0.2f, 0.2f, 1.0f},
{L"Color_Tint_High[9]", 0.296875f, 0.295042f, 0.292236f, 1.0f},
{L"Scatter_Color[10]", 0.024382f, 0.033458f, 0.041667f, 1.0f},
{L"Color_Tint_Low[11]", 0.252301f, 0.333644f, 0.421875f, 1.0f},
{L"Scatter_Color[13]", 0.0625f, 0.0625f, 0.0625f, 1.0f},
{L"Scatter_Color[11]", 0.137052f, 0.181239f, 0.229167f, 1.0f},
{L"Color_Tint_High[13]", 0.2f, 0.2f, 0.2f, 1.0f},
{L"Color_Tint_High[11]", 0.319264f, 0.415742f, 0.526042f, 1.0f},
{L"Color_Tint_Low[15]", 0.250158f, 0.258183f, 0.291771f, 1.0f},
{L"Scatter_Color[12]", 0.0f, 0.0f, 0.0f, 1.0f},
{L"Color_Tint_Low[3]", 0.341914f, 0.42869f, 0.527115f, 1.0f},
{L"Color_Tint_High[3]", 0.75f, 0.563927f, 0.368145f, 1.0f},
{L"Scatter_Color[3]", 0.084217f, 0.097124f, 0.119792f, 1.0f},
{L"UvRotationScale[3]", 14.142136f, 14.142136f, -14.142136f, 14.142136f},
{L"Base_SROD_Modifier[3]", 1.0f, 0.0f, 1.0f, 0.06f},
{L"Scatter_Color[5]", 0.296875f, 0.296875f, 0.296875f, 1.0f},
{L"Base_SROD_Modifier[8]", 1.0f, 0.5f, 0.5f, 0.0f},
{L"UvRotationScale[10]", 8.333333f, -0.0f, 0.0f, 8.333333f},
{L"UvRotationScale[9]", 7.407407f, -0.0f, 0.0f, 7.407407f},
{L"Base_SROD_Modifier[10]", 0.5f, 0.5f, 1.0f, 0.25f},
{L"UvRotationScale[11]", 3.746066f, 9.271839f, -9.271839f, 3.746066f},
{L"Base_SROD_Modifier[5]", 1.0f, 0.0f, 1.0f, 0.0f},
{L"UvRotationScale[12]", 5.0f, -0.0f, 0.0f, 5.0f},
{L"MRAB_Modifier[2]", 1.0f, 1.0f, 1.0f, 0.14f},
{L"UVBias[4]", 0.47f, 0.484f, 0.0f, 1.0f},
{L"Base_SROD_Modifier[2]", 1.0f, 0.5f, 1.0f, 0.0f},
{L"UvRotationScale[13]", 20.0f, -0.0f, 0.0f, 20.0f},
{L"Scatter_Color[6]", 0.088656f, 0.107023f, 0.14996f, 1.0f},
{L"UVBias[12]", 0.5015f, 0.5f, 0.0f, 1.0f},
{L"MRAB_Modifier[5]", 1.0f, 1.25f, 1.0f, 1.0f},
{L"Base_SROD_Modifier[13]", 0.5f, 0.5f, 0.5f, 0.25f},
{L"Color_Tint_Low[13]", 0.15f, 0.15f, 0.15f, 1.0f},
{L"MRAB_Modifier[13]", 0.75f, 1.0f, 1.0f, 1.0f},
{L"MRAB_Modifier[11]", 1.0f, 1.3f, 1.0f, 1.0f},
{L"Base_SROD_Modifier[11]", 0.2f, 0.5f, 1.0f, 0.25f},
});

inline constexpr auto FemaleUni03Textures = std::to_array<TextureParam>({
{L"Swatch_Diffuse[1]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Dirty_00_D.T_B_Cotton_Dirty_00_D"},
{L"Swatch_MRAB[1]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Dirty_00_MRAB.T_B_Cotton_Dirty_00_MRAB"},
{L"Swatch_Normal[1]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Dirty_00_N.T_B_Cotton_Dirty_00_N"},
{L"Swatch_Diffuse[2]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_D.T_B_Cotton_Plaid_00_D"},
{L"Swatch_MRAB[7]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_MRAB.T_B_Cotton_Plaid_00_MRAB"},
{L"Swatch_Normal[7]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_N.T_B_Cotton_Plaid_00_N"},
{L"Swatch_Diffuse[7]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_D.T_B_Cotton_Plaid_00_D"},
{L"Swatch_MRAB[2]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_MRAB.T_B_Cotton_Plaid_00_MRAB"},
{L"Swatch_Normal[2]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Plaid_00_N.T_B_Cotton_Plaid_00_N"},
{L"Swatch_Diffuse[4]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Patch_R_D.T_Patch_R_D"},
{L"Swatch_MRAB[4]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Patch_R_MRAB.T_Patch_R_MRAB"},
{L"Swatch_Normal[4]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Patch_R_N.T_Patch_R_N"},
{L"Swatch_Diffuse[5]", L"/Game/RiggedObjects/Characters/TileableTextures/T_M_Aluminum_Anodized_00_D.T_M_Aluminum_Anodized_00_D"},
{L"Swatch_MRAB[5]", L"/Game/RiggedObjects/Characters/TileableTextures/T_M_Aluminum_Anodized_00_MRAB.T_M_Aluminum_Anodized_00_MRAB"},
{L"Swatch_Normal[6]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Cotton_N.T_TileableStandard_Cotton_N"},
{L"Swatch_Diffuse[6]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_D.T_TileableStandard_D"},
{L"Swatch_MRAB[6]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Cotton_MRAB.T_TileableStandard_Cotton_MRAB"},
{L"Swatch_Normal[5]", L"/Game/RiggedObjects/Characters/TileableTextures/T_M_Aluminum_Anodized_00_N.T_M_Aluminum_Anodized_00_N"},
{L"Swatch_MRAB[9]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Cotton_MRAB.T_TileableStandard_Cotton_MRAB"},
{L"Swatch_Diffuse[8]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Smooth_00_D.T_L_Leather_Smooth_00_D"},
{L"Swatch_Normal[8]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Rough_03_N.T_L_Leather_Rough_03_N"},
{L"Swatch_MRAB[8]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Rough_00_MRAB.T_L_Leather_Rough_00_MRAB"},
{L"Swatch_Diffuse[10]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_D.T_B_Cotton_Striped_05_D"},
{L"Swatch_Normal[9]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Cotton_N.T_TileableStandard_Cotton_N"},
{L"Swatch_MRAB[11]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Silk_MRAB.T_TileableStandard_Silk_MRAB"},
{L"Swatch_Diffuse[9]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_D.T_TileableStandard_D"},
{L"Swatch_Normal[11]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Silk_N.T_TileableStandard_Silk_N"},
{L"Swatch_MRAB[10]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_MRAB.T_B_Cotton_Striped_05_MRAB"},
{L"Swatch_Diffuse[11]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_D.T_TileableStandard_D"},
{L"Swatch_Normal[10]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_N.T_B_Cotton_Striped_05_N"},
{L"Swatch_Diffuse[12]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Skin_ArmsIvory_D.T_Skin_ArmsIvory_D"},
{L"Swatch_Normal[12]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Skin_ArmsEbony_N.T_Skin_ArmsEbony_N"},
{L"Swatch_Normal[3]", L"/Game/RiggedObjects/Characters/TileableTextures/T_S_Silk_Striped_00_N.T_S_Silk_Striped_00_N"},
{L"Swatch_Diffuse[3]", L"/Game/RiggedObjects/Characters/TileableTextures/T_S_Silk_Striped_00_D.T_S_Silk_Striped_00_D"},
{L"Swatch_MRAB[3]", L"/Game/RiggedObjects/Characters/TileableTextures/T_S_Silk_Striped_00_MRAB.T_S_Silk_Striped_00_MRAB"},
{L"Swatch_MRAB[12]", L"/Game/RiggedObjects/Characters/TileableTextures/T_Skin_ArmsEbony_MRAB.T_Skin_ArmsEbony_MRAB"},
{L"Swatch_Diffuse[15]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_D.T_B_Cotton_Striped_05_D"},
{L"Swatch_MRAB[15]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_MRAB.T_B_Cotton_Striped_05_MRAB"},
{L"Swatch_Normal[15]", L"/Game/RiggedObjects/Characters/TileableTextures/T_B_Cotton_Striped_05_N.T_B_Cotton_Striped_05_N"},
{L"Swatch_MRAB[14]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Rough_03_MRAB.T_L_Leather_Rough_03_MRAB"},
{L"Swatch_Diffuse[14]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Smooth_00_D.T_L_Leather_Smooth_00_D"},
{L"Swatch_Normal[14]", L"/Game/RiggedObjects/Characters/TileableTextures/T_L_Leather_Smooth_00_N.T_L_Leather_Smooth_00_N"},
{L"Swatch_Diffuse[13]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_D.T_TileableStandard_D"},
{L"Swatch_MRAB[13]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandard_Velvet_MRAB.T_TileableStandard_Velvet_MRAB"},
{L"Swatch_Normal[13]", L"/Game/RiggedObjects/Characters/TileableTextures/Standard/T_TileableStandardVelvet_N.T_TileableStandardVelvet_N"},
});
} // namespace HogwartsMP::KitParams

Loading
Loading