auto get_equippable_pointer = reinterpret_cast<std::uintptr_t(__fastcall*)(AAresEquippable*)>(Valorant::Base + 0x23DCFA0); //https://github.com/10HEAD/ValorantOffsets/blob/main/valorantoffsets.hpp#L11
std::uintptr_t result = get_equippable_pointer(Equippable);
if (!result)
LogError(3, "[ChangeSkin] Equippable pointer is null!", 0);
std::uintptr_t chain = read_chain<std::uintptr_t>(result, { 0x298, 0xA0 } );
if (!chain)
LogError(3, "[ChangeSkin] Chain is null!", 0);
write<std::uintptr_t>(chain + 0x80, 2);
//change a skin
ContentLibrary::ClearWeaponComponents(Equippable);
ContentLibrary::ApplySkin(Equippable, SkinAsset, ChromaAsset, Level, nullptr, -1);
//we need return back value because game crash after while
std::uintptr_t result = get_equippable_pointer(Equippable);
if (!result)
LogError(3, "[ChangeSkin] Equippable pointer is null!", 0);
std::uintptr_t chain = read_chain<std::uintptr_t>(result, { 0x298, 0xA0 });
if (!chain)
LogError(3, "[ChangeSkin] Chain is null!", 0);
write<std::uintptr_t>(chain + 0x80, 6); //you can store old value and write back again