- Status
- Offline
- Joined
- Mar 3, 2026
- Messages
- 595
- Reaction score
- 7
Dealing with weapon strings and ability IDs in Valorant usually leads down a rabbit hole of traversing the Actor inventory. If you are building an ESP or logic-based trigger and need to know exactly what the pawn is holding—be it a Vandal or a specific agent utility like Omen's Dark Cover—you need a reliable way to map internal IDs.
Inventory Traversal Logic
The standard way to pull this is by reading the inventory from the Actor, getting the current equippable object, and then grabbing the unique ID associated with that object. Most external bases using a kernel driver setup will look something like this:
Weapon and Ability ID Mapping
Since Vanguard tends to shuffle things or use specific identifiers for every piece of utility, a hardcoded switch-case is the path of least resistance for most public pastes. I've compiled a list of the common IDs for weapons, spikes, and agent-specific utility (Neon, Fade, Chamber, etc.).
Technical Notes & Implementation
Does anyone have the updated ObjID offset for the latest build, or are you all moving towards fetching the decrypt name directly from the FName pool?
Inventory Traversal Logic
The standard way to pull this is by reading the inventory from the Actor, getting the current equippable object, and then grabbing the unique ID associated with that object. Most external bases using a kernel driver setup will look something like this:
Code:
inline auto GetCurrentWeapon(uintptr_t Actor) -> std::string {
auto Inventory = Driver::Read<intptr_t>(Actor + Offsets::Inventory);
intptr_t CurrentEquip = Driver::Read<intptr_t>(Inventory + Offsets::CurrentEquipable);
int weaponObj = Driver::Read<int>(CurrentEquip + Offsets::ObjID);
return GetWeaponName(weaponObj);
}
Weapon and Ability ID Mapping
Since Vanguard tends to shuffle things or use specific identifiers for every piece of utility, a hardcoded switch-case is the path of least resistance for most public pastes. I've compiled a list of the common IDs for weapons, spikes, and agent-specific utility (Neon, Fade, Chamber, etc.).
- Melee/Sidearms: Knife (14391538), Classic (14228826), Frenzy (14318008), Ghost (14332155), Sheriff (14337836)
- SMGs/Shotguns: Stinger (14381675), Spectre (14372761), Bucky (14311523), Judge (14307093)
- Rifles: Vandal (14282114), Phantom (14296107), Bulldog (14291226), Guardian (14359498)
- Snipers/Heavies: Operator (14348192), Marshal (14367503), Ares (14277573), Odin (14273931)
- Utility: Spike (14246916), Defuser (14246939), various Agent Orbs and Ults.
Code:
FINLINE auto GetWeaponName(int id) -> std::string {
switch (id)
{
case 14391538: return "Knife"; break;
case 14228826: return "Classic"; break;
case 14344465: return "Shorty"; break;
case 14337836: return "Sheriff"; break;
case 14282114: return "Vandal"; break;
case 14296107: return "Phantom"; break;
case 14213404: return "TOUR DE FORCE"; break;
case 14225817: return "Neon Ult"; break;
case 0: return "AFK"; break;
// Full list includes all agent utility like Boom Bot, Seize, etc.
}
}
Technical Notes & Implementation
- Architecture: This is typically used in external projects calling `RPM` (ReadProcessMemory) through a driver. If you're internal, you'd just cast the pointer and access the member.
- Performance: Running this every frame for every actor is a waste of cycles. Cache the weapon name and only update when the `CurrentEquipable` pointer changes.
- The ObjID Offset: There's some debate on the static nature of the ObjID offset across patches. While the values above are fixed identifiers, the offset to reach them within the equippable object can shift.
Does anyone have the updated ObjID offset for the latest build, or are you all moving towards fetching the decrypt name directly from the FName pool?