Hi.
Just for learning.
Code:
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <xs>
#define MAX_PLAYERS 32
#define CAMERA_NONE 0
#define CAMERA_3RDPERSON 1
enum PlayerInfo
{
pViewEnt[MAX_PLAYERS + 1],
iViewType[MAX_PLAYERS + 1],
iRenderMode[MAX_PLAYERS + 1],
Float:fRenderAmt[MAX_PLAYERS + 1]
}
new plinfo[MAX_PLAYERS + 1][PlayerInfo];
new const
g_entity[] = "info_target",
g_classcam[] = "VexdCam",
// ----------------------------------------
g_model_rpg[] = "models/rpgrocket.mdl";
new
g_max_clients,
g_CameraCount;
public plugin_precache()
{
precache_model( g_model_rpg );
}
public plugin_init()
{
g_max_clients = global_get( glb_maxClients );
register_forward( FM_PlayerPostThink, "fw_PlayerPostThink" );
}
_SET_VIEW( iIndex, iCameraType )
{
if( iIndex > g_max_clients || !is_user_connected ( iIndex ) )
return;
new pNewCamera = plinfo[iIndex][pViewEnt];
switch( iCameraType )
{
case CAMERA_NONE:
{
engfunc( EngFunc_SetView, iIndex, iIndex );
if( pNewCamera )
{
if( fm_find_ent_by_owner( pNewCamera, g_entity, iIndex ) )
fm_remove_entity( pNewCamera );
}
if( plinfo[iIndex][iViewType] != CAMERA_NONE )
{
g_CameraCount--;
if (g_CameraCount < 0)
g_CameraCount=0;
// if (g_CameraCount==0) // Reset the AddToFullPack pointer if there's no more cameras in use...
// g_pFunctionTable->pfnAddToFullPack=NULL;
}
plinfo[iIndex][iViewType] = CAMERA_NONE;
plinfo[iIndex][pViewEnt] = 0;
plinfo[iIndex][iRenderMode] = pev( iIndex, pev_rendermode );
plinfo[iIndex][fRenderAmt] = pev( iIndex, pev_renderamt );
set_pev( pNewCamera, pev_rendermode, 0 );
set_pev( pNewCamera, pev_renderamt, 0 );
}
case CAMERA_3RDPERSON:
{
if( plinfo[iIndex][iViewType] != CAMERA_NONE )
{
plinfo[iIndex][iViewType] = CAMERA_3RDPERSON;
return;
}
g_CameraCount++;
//g_pFunctionTable->pfnAddToFullPack=AddToFullPack;
//g_pFunctionTable_Post->pfnPlayerPostThink=PlayerPostThink_Post;
set_pev( iIndex, pev_rendermode, plinfo[iIndex][iRenderMode] );
set_pev( iIndex, pev_renderamt, plinfo[iIndex][fRenderAmt] );
plinfo[iIndex][iViewType] = CAMERA_3RDPERSON;
new pNewCamera = fm_create_entity( g_entity );
if( !pNewCamera )
return;
set_pev( pNewCamera, pev_classname, g_classcam );
fm_entity_set_model( pNewCamera, g_model_rpg );
fm_entity_set_size( pNewCamera, { 0, 0, 0 }, { 0, 0, 0 } );
set_pev( pNewCamera, pev_movetype, MOVETYPE_NOCLIP );
set_pev( pNewCamera, pev_solid, SOLID_NOT );
set_pev( pNewCamera, pev_takedamage, DAMAGE_NO );
set_pev( pNewCamera, pev_gravity, 0 );
set_pev( pNewCamera, pev_owner, iIndex );
set_pev( pNewCamera, pev_rendermode, kRenderTransColor );
set_pev( pNewCamera, pev_renderamt, 0 );
set_pev( pNewCamera, pev_renderfx, kRenderFxNone );
engfunc( EngFunc_SetView, iIndex, pNewCamera );
plinfo[iIndex][pViewEnt] = pNewCamera;
}
}
}
public fw_PlayerPostThink( pEnt )
{
if( !( 1 <= pEnt <= g_max_clients ) )
return FMRES_IGNORED;
if( !is_user_alive( pEnt ) )
return FMRES_IGNORED;
if( !plinfo[pEnt][pViewEnt] )
return FMRES_IGNORED;
static pCamEnt;
pCamEnt = plinfo[pEnt][pViewEnt];
static
Float:v_angle[3],
Float:punchangle[3],
Float:makevectors[3];
pev( pEnt, pev_v_angle, v_angle );
pev( pEnt, pev_punchangle, punchangle );
xs_vec_add( v_angle, punchangle, makevectors );
engfunc( EngFunc_MakeVectors, makevectors );
static
Float:origin[3],
Float:viewofs[3],
Float:vecSrc[3];
pev( pEnt, pev_origin, origin )
pev( pEnt, pev_view_ofs, viewofs );
xs_vec_add( origin, viewofs, vecSrc )
static Float:vecAiming[3];
global_get( glb_v_forward, vecAiming );
//TraceResult tr;
static tr;
switch( plinfo[pEnt][iViewType] )
{
case CAMERA_3RDPERSON:
{
static Float:vecResult[3];
xs_vec_mul_scalar( vecAiming, 128.0, vecAiming );
xs_vec_sub( vecSrc, vecAiming, vecResult );
engfunc( EngFunc_SetView, pEnt, pCamEnt );
engfunc( EngFunc_TraceLine, vecSrc, vecResult, IGNORE_MONSTERS, pEnt, tr );
pev( pCamEnt, pev_origin, origin );
set_tr2( tr, TR_vecEndPos, origin );
static Float:angles[3];
pev( pCamEnt, pev_angles, angles );
set_pev( pEnt, pev_v_angle, angles );
}
default:
{
engfunc( EngFunc_SetView, pEnt, pEnt );
if( fm_find_ent_by_owner( pCamEnt, g_entity, pEnt ) )
fm_remove_entity( pCamEnt );
plinfo[pEnt][iViewType] = CAMERA_NONE;
plinfo[pEnt][pViewEnt] = 0;
}
}
return FMRES_IGNORED;
}
It does'nt work well... -_-
I'm pretty sure that there are some missing codes but I do not have great knowledge.