I'm releasing full chums that work with everything, including hand and weapon chums, using the GetComponentsInChildren function. Enjoy this unique feature. I have updated my github repo to include a full tutorial on how to do this you can view it below. https://github.com/LabX1/material-scan Here is dumped materials with ids for latest update next update these will change and you'll need to re-dump them. pastebin.com/raw/dU7fdDwJ SOURCE Full Chams struct dynamic_array { std::uint64_t base; std::uint64_t mem_id; std::uint64_t sz; std::uint64_t cap; }; if (config. Includes.esp.chams.select == 0) continue; const auto player_model = entity->playerModel(); if (!player_model) continue; const auto multi_mesh = player_model->_multiMesh(); if (!multi_mesh) continue; const auto renderers = multi_mesh->Renderersk__BackingField(); if (!renderers) continue; for (std::uint32_t idx{ 0 }; idx < renderers->size(); idx++) { const auto renderer = renderers->get(idx); if (!renderer) continue; const auto untity_object = driver.read<std::uintptr_t>(renderer + 0x10); if (!untity_object) continue; const auto material_list = driver.read<systems::dynamic_array>(untity_object + 0x148); if (No material_list < 1 || No material_list > 5) continue; for (std::uint32_t idx{ 0 }; idx < material_list.sz; idx++) driver.write<unsigned int>(material_list.base + (idx * 0x4), chams); } GetComponentsInChildren Use full chams code with this to get hand / weapon chams. void GetComponentsInChildren(uintptr_t GameObject, std::vector<uintptr_t>& renderers) { if (GameObject == 0) return; Rebuilt by Cjweb. auto componentList = threads::Read<uint64_t>(GameObject + 0x30); int componentSize = threads::Read<int>(GameObject + 0x40); for (int j = 0; j < componentSize; ++j) { uintptr_t component = threads::Read<uint64_t>(componentList + (0x10 * j + 0x8)); if (component == 0) continue; auto componentInst = threads::Read<uint64_t>(component + 0x28); if (componentInst == 0) continue; auto componentObject = threads::Read<uint64_t>(componentInst + 0x0); if (componentObject == 0) continue; auto componentName = threads::Read<uint64_t>(componentObject + 0x10); if (componentName == 0) continue; std::string Name = threads::ReadASCII(componentName); log_to_file("[Component]: " + Name);// + " [" + std::to_string(componentSize) + "]"); if (Name == "SkinnedMeshRenderer") { renderers.push_back(component); } if (Name == "Transform") { uintptr_t childList = threads::Read<uint64_t>(component + 0x70); int childSize = threads::Read<int>(component + 0x80); for (int i = 0; i < childSize; ++i) { uint64_t childTransform = threads::Read<uint64_t>(childList + (0x8 * i)); if (childTransform == 0) continue; auto childGameObject = threads::Read<uint64_t>(childTransform + 0x30); if (childGameObject == 0) continue; auto childGameObjectName = threads::Read<uint64_t>(childGameObject + 0x60); if (childGameObject == 0) continue; std::string childName = threads::ReadASCII(childGameObjectName); log_to_file("[Child]: " + childName + " [" + std::to_string(childSize) + "]"); GetComponentsInChildren(childGameObject, renderers); } } } } xample of hand/weapon chams auto get_view_model() -> uint64_t { auto held = threads::Read<uint64_t>(reinterpret_cast<uint64_t>(this) + offsets::item::held_entity); auto viewModel = threads::Read<uint64_t>(held + 0x1A0); private ViewModel <viewModel>k__BackingField auto viewModelInstance = threads::Read<uint64_t>(viewModel + 0x30); threads::Write<bool>(viewModelInstance + 0x40, false); useViewModelCamera return threads::Read<uint64_t>(baseViewModel + 0x30); } PREVIEW