Skip to content
Back to skills

Find CCSPlayerController Respawn

ASecurity

Find and identify the CCSPlayerController_Respawn virtual function in CS2 binary using IDA Pro MCP. Use this skill when reverse engineering CS2 server.dll or libserver.so to locate the Respawn vfunc slot by RTTI-walking the CCSPlayerController vtable and confirming the candidate's decompiled body performs a full controller-state reset (networked flags, per-round fields, comeback/damage-info bookkeeping) rather than any other lifecycle vfunc. Trigger: CCSPlayerController_Respawn

  • 3 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 27, 2026
tools

Works with

  • mcp

Security analysis

A100/100

Scanned September 27, 2026

npx -y skills add mrc4tt/CS2_VibeSignatures --skill find-CCSPlayerController_Respawn --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Find CCSPlayerController Respawn?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Find CCSPlayerController Respawn
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mrc4tt-find-ccsplayercontroller-respawn/badge)](https://www.skillsdirectory.com/skills/mrc4tt-find-ccsplayercontroller-respawn)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: find-CCSPlayerController_Respawn
description: |
  Find and identify the CCSPlayerController_Respawn virtual function in CS2 binary using IDA Pro MCP. Use this
  skill when reverse engineering CS2 server.dll or libserver.so to locate the Respawn vfunc slot by RTTI-walking
  the CCSPlayerController vtable and confirming the candidate's decompiled body performs a full controller-state
  reset (networked flags, per-round fields, comeback/damage-info bookkeeping) rather than any other lifecycle vfunc.
  Trigger: CCSPlayerController_Respawn
disable-model-invocation: true
---

# Find CCSPlayerController_Respawn

Locate `CCSPlayerController_Respawn` vfunc in CS2 `server.dll` or `libserver.so` using IDA Pro MCP tools.

## Method

### 1. Load CCSPlayerController VTable

**ALWAYS** Use SKILL `/get-vtable-address` with `class_name=CCSPlayerController` to RTTI-walk the primary vtable.

```text
mcp__ida-pro-mcp__find_regex pattern="19CCSPlayerController"
mcp__ida-pro-mcp__xrefs_to addrs="<name_string_addr>"      # hit - 8 = typeinfo
mcp__ida-pro-mcp__xrefs_to addrs="<typeinfo_addr>"          # hit - 8 = vtable candidate, keep offset_to_top==0
```

Search for the mangled typeinfo name string `19CCSPlayerController` (**not** the many longer
`N19CCSPlayerController...NetworkVar_...EE` template-instantiation strings that also contain the substring — those
are unrelated `CNetworkVarBase`/`CNetworkHandle` instantiations, not the class's own RTTI name). The class's own
typeinfo name is the standalone `<len>ClassName` string with no further `N...E` nesting after it.

> Linux 14168 reference: name string `19CCSPlayerController` at `0x81ef30`, typeinfo at `0x2487778`, primary
> vtable at `0x24885b0` (`offset_to_top == 0`).

### 2. Read VTable Slot 272

Since `CCSPlayerController` inherits `Respawn` from `CBasePlayerController` at a fixed, ABI-stable slot index
(Itanium single-inheritance derived-class vtables preserve base-class slot ordering), the slot number is portable
across builds even though the function's own address is not. Read the function pointer directly:

```text
mcp__ida-pro-mcp__get_int addr="<vtable_va> + 0x10 + 272*8" ty="u64"
```

> Linux 14168 reference: `vtable_va = 0x24885b0`, slot 272 address `0x24885b0 + 0x10 + 272*8 = 0x2488e40`,
> function pointer `0x14e5870`, size `0x2A3` (675 bytes).

### 3. Confirm the Candidate

Decompile the resolved function and confirm it matches `Respawn()`-shaped semantics:

```text
mcp__ida-pro-mcp__decompile addr="<slot_272_func_addr>"
```

Identification rules:
1. Single argument (`this` only) — `Respawn()` takes no parameters.
2. The body is a broad member-state reset: dozens of direct byte/dword/qword writes to `this`-relative offsets
   spread across a wide range (hundreds of bytes apart), zeroing/defaulting networked per-life fields.
3. Near the top, it clears a "pending state change" flag pattern via the class's generic networked-bool-setter
   helper (`this+2993` bool cleared through a `CNetworkTransmitComponent::StateChanged`-style call, matching the
   pattern seen throughout this class's other setters) before falling into the bulk reset.
4. It reads a global respawn/spawn-protection time constant (`off_261F328`-style float array) and clamps a
   per-controller timestamp field (`this+1336`) against it — a spawn-protection-timer initialization step
   distinctive to `Respawn`.
5. As a sanity cross-check, confirm slot 271 and slot 273 (the immediate neighbors) decompile to visibly smaller,
   differently-shaped functions (e.g. simple accessors) — `Respawn` should stand out as one of the larger,
   broad-reset functions in its immediate slot neighborhood.

If the candidate does not match, **STOP** and report to user.

### 4. Generate Function Signature

**ALWAYS** Use SKILL `/generate-signature-for-function` with `addr=<Respawn_func_addr>` to generate a robust and
unique `func_sig`.

### 5. Write IDA Analysis Output as YAML

**ALWAYS** Use SKILL `/write-vfunc-as-yaml` to write the analysis results.

Required parameters:
- `func_name`: `CCSPlayerController_Respawn`
- `func_addr`: `<Respawn_func_addr>`
- `func_sig`: The validated signature from step 4

VTable parameters:
- `vtable_name`: `CCSPlayerController`
- `vfunc_offset`: `0x880` (`272 * 8`)
- `vfunc_index`: `272`

## Function Characteristics

- **Purpose**: Resets a `CCSPlayerController`'s per-life networked state on respawn — clears pending-damage,
  comeback, and per-round bookkeeping fields and re-arms the spawn-protection timer.
- **Binary**: `server.dll` / `libserver.so`
- **Parameters**: `(this)` only
- **Return value**: not consumed by callers in the decompiled body observed (effectively `void`)
- **VTable**: `CCSPlayerController`, slot **272** (`vfunc_offset = 0x880`) on the Linux 14168 reference build,
  inherited-slot position (`INHERIT_VFUNCS` relation to `CBasePlayerController_Respawn`).

## Discovery Strategy

1. RTTI-walk `CCSPlayerController`'s primary vtable via its own (non-template) typeinfo name string.
2. Read slot 272 directly — the slot index is stable across builds because it derives from `CBasePlayerController`
   base-class layout, which the Itanium ABI guarantees stays contiguous in the derived class's vtable regardless
   of how many further overrides `CCSPlayerController` itself adds afterward.
3. Confirm the resolved function's decompiled body matches the broad per-life state-reset + spawn-protection-timer
   pattern unique to `Respawn`.

This is robust because:
- The vtable slot index is derived from ABI-guaranteed base-class layout, not from a fragile byte offset or string
  xref, so it survives most recompiles as long as `CBasePlayerController`'s own vfunc ordering is unchanged.
- The broad multi-field reset + spawn-protection-timer-clamp shape is distinctive enough to disambiguate `Respawn`
  from neighboring accessor-style vfuncs even without a known reference sig.

## Output YAML Format

The output YAML filename depends on the platform:
- `server.dll` -> `CCSPlayerController_Respawn.windows.yaml`
- `libserver.so` -> `CCSPlayerController_Respawn.linux.yaml`

Fields: `func_name`, `func_va`, `func_rva`, `func_size`, `func_sig`, `vtable_name`, `vfunc_offset`, `vfunc_index`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…