Player Model API (apiplayermodel)
SkillAI & modelsHelps with Player Model API usage for managing custom player models and animations.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Player Model API (apiplayermodel) skill
What this skill tells your AI
The instructions your AI receives, as published by hedgefog/amxx-modding-kit in .agents/skills/amxx-modding-kit/api/player-model/SKILL.md and read by ahel’s review.
The Player Model API provides tools for managing custom player models with support for dynamic model switching and custom animation extensions.
Reference: See README.md for complete documentation and examples.
Overview
This API allows you to:
- Set and reset custom player models
- Load and manage custom animations
- Switch animation models based on weapon extension
- Set specific animation sequences
Core Functions
Set Player Model
// Set custom model path
PlayerModel_Set(pPlayer, "models/player/custom/custom.mdl");
// Apply the model change
PlayerModel_Update(pPlayer);
Reset to Default
PlayerModel_Reset(pPlayer);
Check Custom Model
if (PlayerModel_HasCustom(pPlayer)) {
new szModel[MAX_RESOURCE_PATH_LENGTH];
PlayerModel_GetCurrent(pPlayer, szModel, charsmax(szModel));
// szModel contains current custom model path
}
Get Model Entity
new pModelEntity = PlayerModel_GetEntity(pPlayer);
Animation System
Precache Animations
Load animations from animations directory during precache:
public plugin_precache() {
// Precaches: cstrike/animations/mymod/player.mdl
PlayerModel_PrecacheAnimation("mymod/player.mdl");
}
Set Animation Sequence
PlayerModel_SetSequence(pPlayer, "run");
PlayerModel_SetSequence(pPlayer, "attack");
Set Weapon Animation Extension
Custom animations based on weapon:
// Sets animation to ref_aim_myweapon, crouch_aim_myweapon, etc.
static const szCustomWeaponExt[] = "myweapon";
set_ent_data_string(pPlayer, "CBasePlayer", "m_szAnimExtention", szCustomWeaponExt);
set_ent_data(pPlayer, "CBaseMonster", "m_Activity", ACT_IDLE);
rg_set_animation(pPlayer, PLAYER_IDLE);
Common Patterns
Role-Based Model Change
AssignZombieRole(const pPlayer) {
PlayerModel_Set(pPlayer, "models/player/zombie/zombie.mdl");
PlayerModel_Update(pPlayer);
}
RemoveZombieRole(const pPlayer) {
PlayerModel_Reset(pPlayer);
}
Spawn with Custom Model
public HamHook_Player_Spawn_Post(const pPlayer) {
if (!is_user_alive(pPlayer)) return HAM_IGNORED;
if (IsPlayerInfected(pPlayer)) {
PlayerModel_Set(pPlayer, g_szZombieModel);
PlayerModel_Update(pPlayer);
}
return HAM_HANDLED;
}
Team-Based Models
SetTeamModel(const pPlayer, const iTeam) {
switch (iTeam) {
case TEAM_RED: {
PlayerModel_Set(pPlayer, "models/player/red_team/red.mdl");
}
case TEAM_BLUE: {
PlayerModel_Set(pPlayer, "models/player/blue_team/blue.mdl");
}
default: {
PlayerModel_Reset(pPlayer);
}
}
PlayerModel_Update(pPlayer);
}
Custom Weapon Animation
// When deploying custom weapon
@Weapon_Deploy(const this) {
CW_CallBaseMethod();
static pPlayer; pPlayer = get_ent_data_entity(this, "CBasePlayerItem", "m_pPlayer");
// Set custom animation extension
set_ent_data_string(pPlayer, "CBasePlayer", "m_szAnimExtention", "customgun");
set_ent_data(pPlayer, "CBaseMonster", "m_Activity", ACT_IDLE);
rg_set_animation(pPlayer, PLAYER_IDLE);
}
Animation File Creation
Basic Structure
Animation files need these sequences:
dummy,idle1,crouch_idlewalk,run,crouchrunjump,longjump,swim,treadwatergut_flinch,head_flinch
Custom Weapon Sequences
For custom weapon animations, add:
ref_aim_weaponname- Standing aimref_shoot_weaponname- Standing shootcrouch_aim_weaponname- Crouching aimcrouch_shoot_weaponname- Crouching shoot
Example QC:
$sequence "ref_aim_myweapon" {
"ref_aim_myweapon_blend1"
"ref_aim_myweapon_blend2"
...
blend XR -90 90 fps 30 loop
}
Fake Reference
Animation model requires at least one polygon. Use fake reference SMD with minimal geometry.
Bone Protection
Use compiler like DoomMusic's StudioMDL with $protected for each bone.
Integration with Roles API
// In role assign method
@Zombie_Assign(const pPlayer) {
PlayerRole_This_CallBaseMethod();
PlayerModel_Set(pPlayer, g_szZombieModel);
PlayerModel_Update(pPlayer);
}
// In role unassign method
@Zombie_Unassign(const pPlayer) {
PlayerRole_This_CallBaseMethod();
PlayerModel_Reset(pPlayer);
}
Checklist
- Precache models and animations in
plugin_precache - Call
PlayerModel_UpdateafterPlayerModel_Set - Reset model on role unassign or disconnect
- Use proper animation extension naming convention
- Create animation files with required sequences
Signals
- GitHub stars
- 32
- Forks
- 4
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
amxx-modding-kit-api-player-model- Source
- github.com/hedgefog/amxx-modding-kit