name: find-CBaseEntity_Use description: | Find and identify the CBaseEntity_Use virtual function in CS2 binary using IDA Pro MCP. Use this skill when reverse engineering CS2 server.dll or libserver.so to locate the Use function. CBaseEntity_Use is a virtual function on CBaseEntity, resolved via vtable offset found in the function that references both "Radio.YouTakeThePoint" and "#Cstrike_TitlesTXT_Game_afk_bomb_drop". Trigger: CBaseEntity_Use, Use disable-model-invocation: true
Find CBaseEntity_Use
Locate the CBaseEntity_Use virtual function in CS2 server binary using IDA Pro MCP tools.
Overview
CBaseEntity_Use is a virtual function on CBaseEntity. It is identified by finding the function that references both Radio.YouTakeThePoint and #Cstrike_TitlesTXT_Game_afk_bomb_drop, then locating the vtable call at the bottom of that function.
Prerequisites
CBaseEntityvtable must already be identified (vtable YAML must exist)
If missing, run /write-vtable-as-yaml with class_name=CBaseEntity first.
Method
1. Search for Signature Strings
Use find_regex to search for both strings:
mcp__ida-pro-mcp__find_regex(pattern="Radio\\.YouTakeThePoint")
mcp__ida-pro-mcp__find_regex(pattern="#Cstrike_TitlesTXT_Game_afk_bomb_drop")
2. Find Cross-References and Identify Common Function
Use xrefs_to on both string addresses:
mcp__ida-pro-mcp__xrefs_to(addrs="<string_addr_1>")
mcp__ida-pro-mcp__xrefs_to(addrs="<string_addr_2>")
Find the function that appears in both xref results. This is the containing function (the AFK bomb drop / player use handler).
3. Decompile and Locate CBaseEntity_Use Call
Decompile the common function and look for the following code pattern near the bottom:
Windows binary:
if ( v74 && ((*(__int64 (__fastcall **)(_QWORD *))(*v17 + <USE_OFFSET_WIN>))(v17) & 4) != 0 )
{
v28 = sub_XXXXXXXX(a1);
*(_QWORD *)&v70 = sub_XXXXXXXX(a1);
v71 = 0LL;
LABEL_117:
v66 = *v17;
*((_QWORD *)&v70 + 1) = v28;
(*(void (__fastcall **)(_QWORD *, __int128 *))(v66 + <USE_OFFSET_WIN>))(v17, &v70); // CBaseEntity_Use
}
Linux binary:
if ( v74 && ((*(__int64 (__fastcall **)(_QWORD *))(*v17 + <USE_OFFSET_LIN>))(v17) & 4) != 0 )
{
v28 = sub_XXXXXXXX(a1);
*(_QWORD *)&v70 = sub_XXXXXXXX(a1);
v71 = 0LL;
LABEL_117:
v66 = *v17;
*((_QWORD *)&v70 + 1) = v28;
(*(void (__fastcall **)(_QWORD *, __int128 *))(v66 + <USE_OFFSET_LIN>))(v17, &v70); // CBaseEntity_Use
}
Key identification:
- The vtable call at
LABEL_117isCBaseEntity_Use - Record the vtable offset from the call instruction (e.g.
1152=0x480) - Calculate vtable index: offset / 8
4. Generate VFunc-Offset Signature
ALWAYS Use SKILL /generate-signature-for-vfuncoffset to generate a robust and unique signature for CBaseEntity_Use.
Use the instruction address of the (*(v66 + <USE_OFFSET>))(v17, &v70) call as the target instruction, and the vtable offset as the expected vfunc offset.
5. Get CBaseEntity VTable Info and Resolve Address
ALWAYS Use SKILL /get-vtable-from-yaml with class_name=CBaseEntity.
If the skill returns an error, stop and report to user.
Otherwise, use vtable_entries to look up the entry at the calculated vtable index from step 3. The address at that index is CBaseEntity_Use.
6. Rename CBaseEntity_Use
Verify the function name at the resolved address. If not already renamed:
mcp__ida-pro-mcp__rename(batch={"func": {"addr": "<resolved_addr>", "name": "CBaseEntity_Use"}})
7. Write IDA Analysis Output as YAML
ALWAYS Use SKILL /write-vfunc-as-yaml to write the analysis results.
Required parameters:
func_name:CBaseEntity_Usefunc_addr: The resolved function address from step 5func_sig:None(function body is too small for a unique signature)vfunc_sig: The validated signature from step 4
VTable parameters:
vtable_name:CBaseEntityvfunc_offset: The offset from step 3vfunc_index: The index from step 3
Function Characteristics
- VTable Class:
CBaseEntity - Parameters:
(CBaseEntity* this, CBaseEntity* activator, CBaseEntity* caller, USE_TYPE useType) - Purpose: Called when an entity is "used" (e.g. player pressing +use on a door, button, or other interactive entity)
- Identified via: The function containing both
Radio.YouTakeThePointand#Cstrike_TitlesTXT_Game_afk_bomb_dropstrings
The containing function also references:
weapon_c4- C4 bomb detectionCCSPlayer_ItemServices_DropPlayerWeapon- Dropping the bombRadio.YouTakeThePoint/#Cstrike_TitlesTXT_Game_afk_bomb_drop- AFK bomb drop notification
VTable Information
- VTable Name:
CBaseEntity - VTable Mangled Name:
- Windows:
??_7CBaseEntity@@6B@ - Linux:
_ZTV11CBaseEntity
- Windows:
- VTable Offset:
0x480(Windows) — may change with game updates - VTable Index:
144(Windows) — may change with game updates
Output YAML Format
The output YAML filename depends on the platform:
server.dll->CBaseEntity_Use.windows.yamllibserver.so/libserver.so->CBaseEntity_Use.linux.yaml
Troubleshooting
If CBaseEntity vtable YAML not found:
- Run
/write-vtable-as-yamlwithclass_name=CBaseEntityfirst
If the vtable offset differs from expected:
- The vtable layout may have changed in a game update
- Look for the vtable call at
LABEL_117near the bottom of the containing function - The pattern is: check flags with
& 4, then call through vtable with(v17, &v70)arguments