Player Camera API (apiplayercamera)
SkillDev toolsHelps with Player Camera API usage for controlling custom camera views with positioning, targeting, and smooth movement.
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 Camera API (apiplayercamera) 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-camera/SKILL.md and read by ahel’s review.
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.
Overview
This API allows you to:
- Activate and deactivate custom player cameras
- Control camera offsets, angles, and distances
- Set target entities for camera focus
- Lock camera axes for stable views
- Adjust camera smoothness with damping
Core Functions
Activate/Deactivate Camera
// 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 Camera Position
// 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);
Get Camera Origin
new Float:vecCameraOrigin[3];
PlayerCamera_GetOrigin(pPlayer, vecCameraOrigin);
Camera Settings
Axis Lock
Restrict camera movement on specific axes:
// Lock pitch and roll, allow yaw rotation
PlayerCamera_SetAxisLock(pPlayer, true, false, true);
Parameters: bLockPitch, bLockYaw, bLockRoll
Target Entity
Focus camera on specific entity:
// Camera follows target entity
PlayerCamera_SetTargetEntity(pPlayer, pTargetEntity);
Think Delay
Adjust camera update frequency:
// Update every 0.1 seconds (balance performance vs smoothness)
PlayerCamera_SetThinkDelay(pPlayer, 0.1);
Damping (Smoothness)
Control camera movement smoothness:
// 0.0 = no movement, 0.5 = smooth, 1.0 = instant
PlayerCamera_SetDamping(pPlayer, 0.5);
Common Patterns
Third-Person Camera
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);
}
Toggle Camera Command
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;
}
Spectator Camera
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");
}
Fixed Angle Camera
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);
}
Cinematic Camera
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);
}
Forwards
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");
}
Integration Tips
Disable During Certain Actions
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;
}
Auto-Disable on Death
public client_death(pPlayer) {
if (PlayerCamera_IsActive(pPlayer)) {
PlayerCamera_Deactivate(pPlayer);
}
}
Checklist
- Activate camera before setting properties
- Set appropriate damping for smooth movement
- Use axis lock for stable cinematic views
- Handle camera deactivation on player death/disconnect
- Consider performance with think delay setting
Signals
- GitHub stars
- 32
- Forks
- 4
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
amxx-modding-kit-api-player-camera- Source
- github.com/hedgefog/amxx-modding-kit