.agents/skills/amxx-modding-kit/api/player-camera/SKILL.md
Helps with Player Camera API usage for controlling custom camera views with positioning, targeting, and smooth movement.
npx skillsauth add hedgefog/amxx-modding-kit amxx-modding-kit-api-player-cameraInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
api_player_camera)The Player Camera API provides powerful camera manipulation for implementing third-person views, spectator modes, cinematic cameras, and dynamic camera effects.
Reference: See README.md for complete documentation and examples.
This API allows you to:
// Enable custom camera for player
PlayerCamera_Activate(pPlayer);
// Disable custom camera
PlayerCamera_Deactivate(pPlayer);
// Check if camera is active
if (PlayerCamera_IsActive(pPlayer)) {
// Camera is enabled
}
// Set offset from player
new Float:vecOffset[3] = {0.0, 0.0, 50.0}; // Above player
PlayerCamera_SetOffset(pPlayer, vecOffset);
// Set camera angles
new Float:vecAngles[3] = {15.0, 0.0, 0.0}; // Looking down
PlayerCamera_SetAngles(pPlayer, vecAngles);
// Set distance from player
PlayerCamera_SetDistance(pPlayer, 100.0);
new Float:vecCameraOrigin[3];
PlayerCamera_GetOrigin(pPlayer, vecCameraOrigin);
Restrict camera movement on specific axes:
// Lock pitch and roll, allow yaw rotation
PlayerCamera_SetAxisLock(pPlayer, true, false, true);
Parameters: bLockPitch, bLockYaw, bLockRoll
Focus camera on specific entity:
// Camera follows target entity
PlayerCamera_SetTargetEntity(pPlayer, pTargetEntity);
Adjust camera update frequency:
// Update every 0.1 seconds (balance performance vs smoothness)
PlayerCamera_SetThinkDelay(pPlayer, 0.1);
Control camera movement smoothness:
// 0.0 = no movement, 0.5 = smooth, 1.0 = instant
PlayerCamera_SetDamping(pPlayer, 0.5);
ActivateThirdPersonCamera(const pPlayer) {
PlayerCamera_Activate(pPlayer);
// Position behind and above player
new Float:vecOffset[3] = {0.0, -50.0, 30.0};
PlayerCamera_SetOffset(pPlayer, vecOffset);
// Look slightly down
new Float:vecAngles[3] = {10.0, 0.0, 0.0};
PlayerCamera_SetAngles(pPlayer, vecAngles);
PlayerCamera_SetDistance(pPlayer, 150.0);
PlayerCamera_SetDamping(pPlayer, 0.7);
}
public plugin_init() {
register_clcmd("say /camera", "Command_ToggleCamera");
}
public Command_ToggleCamera(const pPlayer) {
if (PlayerCamera_IsActive(pPlayer)) {
PlayerCamera_Deactivate(pPlayer);
client_print(pPlayer, print_chat, "Camera deactivated");
} else {
PlayerCamera_Activate(pPlayer);
PlayerCamera_SetDistance(pPlayer, 100.0);
client_print(pPlayer, print_chat, "Camera activated");
}
return PLUGIN_HANDLED;
}
SpectatePlayer(const pSpectator, const pTarget) {
if (!is_user_alive(pTarget)) return;
PlayerCamera_Activate(pSpectator);
PlayerCamera_SetTargetEntity(pSpectator, pTarget);
PlayerCamera_SetDistance(pSpectator, 150.0);
PlayerCamera_SetDamping(pSpectator, 0.5);
client_print(pSpectator, print_chat, "Spectating player");
}
ActivateFixedCamera(const pPlayer) {
PlayerCamera_Activate(pPlayer);
// Lock all axes for completely fixed view
PlayerCamera_SetAxisLock(pPlayer, true, true, true);
// Set specific viewing angle
new Float:vecAngles[3] = {45.0, 0.0, 0.0};
PlayerCamera_SetAngles(pPlayer, vecAngles);
PlayerCamera_SetDistance(pPlayer, 200.0);
}
ActivateCinematicCamera(const pPlayer, const Float:vecTarget[3]) {
PlayerCamera_Activate(pPlayer);
// Smooth movement for cinematic feel
PlayerCamera_SetDamping(pPlayer, 0.3);
PlayerCamera_SetThinkDelay(pPlayer, 0.05);
// High angle view
new Float:vecOffset[3] = {0.0, 0.0, 100.0};
PlayerCamera_SetOffset(pPlayer, vecOffset);
}
React to camera state changes:
// Called when camera is about to activate (can block by returning PLUGIN_HANDLED)
public PlayerCamera_OnActivate(const pPlayer) {
// Can block activation
}
// Called after camera is activated
public PlayerCamera_OnActivated(const pPlayer) {
client_print(pPlayer, print_chat, "Camera enabled");
}
// Called when camera is about to deactivate (can block by returning PLUGIN_HANDLED)
public PlayerCamera_OnDeactivate(const pPlayer) {
// Can block deactivation
}
// Called after camera is deactivated
public PlayerCamera_OnDeactivated(const pPlayer) {
client_print(pPlayer, print_chat, "Camera disabled");
}
public HamHook_Player_TakeDamage(pPlayer, pInflictor, pAttacker, Float:flDamage, iDamageBits) {
// Disable camera when taking damage
if (PlayerCamera_IsActive(pPlayer)) {
PlayerCamera_Deactivate(pPlayer);
}
return HAM_IGNORED;
}
public client_death(pPlayer) {
if (PlayerCamera_IsActive(pPlayer)) {
PlayerCamera_Deactivate(pPlayer);
}
}
tools
Best practices for organizing large AMX Mod X projects with multiple plugins sharing entities, weapons, events, and other definitions. Use when creating mod-scale projects that need consistent namespace patterns and shared constants.
development
Guide for Waypoint Markers API creating 3D waypoint sprites visible through walls with per-player visibility.
development
Guide for States API usage implementing state machines with transitions, guards, and lifecycle hooks.
development
Guide for Shops API usage creating in-game shops with items, custom balance systems, and access control.