this is just an idea. i dont like to test it with heavy code.
useage:
"say /1" - Start record
"say /2" - Stop record
"say /view" - View record
PHP Code:
// VIEW TEST
// thx many ppl help me to achieve this effect @ alliedmods & xtreme-jumps & kzcn(ccser,simen,97club,xlm,kzfun...)
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#pragma semicolon 1
new bool: timer_started[33]; // this is just a test value. in kz plugin, it means if have pressed Start button
new bool: isView[33];
new Num[33]; // current frames
new AllNum; // record frames
new Float:g_StartTime[33];
new Array: curPos[33];
new Array: curAngle[33];
public plugin_init()
{
register_forward( FM_PlayerPreThink, "PreThink" );
for( new i=1; i<33; i++ )
{
curPos[i] = ArrayCreate(3,32);
curAngle[i] = ArrayCreate(3,32);
}
register_clcmd( "say /1", "one" ); // Start record
register_clcmd( "say /2", "two" ); // End record
register_clcmd( "say /view", "view" ); // View record
}
public client_disconnect(id)
{
timer_started[id] = false;
isView[id] = false;
}
public one(id)
{
Num[id] = 0;
ArrayClear( curPos[id] );
ArrayClear( curAngle[id] );
g_StartTime[id] = get_gametime();
timer_started[id] = true;
client_print( id, print_chat, "Start!" );
return PLUGIN_HANDLED;
}
public two(id)
{
timer_started[id] = false;
AllNum = Num[id];
client_print( id, print_chat, "gTime: %.3f | arrSize: %d | AllNum: %d", get_gametime() - g_StartTime[id], ArraySize( curPos[id] ), AllNum );
client_print( id, print_chat, "Stop!" );
return PLUGIN_HANDLED;
}
public PreThink(id)
{
if( timer_started[id] )
{
static vOrigin[3], vAngle[3];
pev( id,pev_origin, vOrigin );
pev( id,pev_v_angle, vAngle );
ArrayPushArray( curPos[id], vOrigin );
ArrayPushArray( curAngle[id], vAngle );
Num[id]++;
}
else if( isView[id] )
{
if( Num[id] < AllNum )
{
static vOriginView[3], vAngleView[3];
ArrayGetArray( curPos[id], Num[id], vOriginView );
ArrayGetArray( curAngle[id], Num[id], vAngleView );
set_pev( id, pev_origin, vOriginView );
set_pev( id, pev_angles, vAngleView ); // HERE if using "set_pev(..,pev_v_angle,..)" cant work, dont know why? i've spent lots of time on this fucked angle shit..
set_pev( id, pev_fixangle, 1 );
Num[id]++;
}
else
{
view(id);
}
}
}
public view(id)
{
if( !is_user_alive(id) )
ExecuteHam( Ham_CS_RoundRespawn, id );
if( isView[id] )
{
isView[id] = false;
ExecuteHam( Ham_CS_RoundRespawn, id );
client_print( id, print_chat, "Exit !!" );
}
else if( AllNum > 0 )
{
isView[id] = true;
timer_started[id] = false;
Num[id] = 0;
// copy someone's kz plugin code
set_pev( id, pev_movetype, MOVETYPE_NOCLIP );
set_pev( id, pev_solid, SOLID_NOT );
set_pev( id, pev_effects, EF_NODRAW );
set_pev( id, pev_deadflag, DEAD_RESPAWNABLE ); // DEAD -> DEAD_RESPAWNABLE (just modify this :D)
set_pev( id, pev_takedamage, DAMAGE_NO );
fm_set_entity_flags( id, FL_FROZEN, 0 );
client_print( id, print_chat, "Viewing ...." );
}
else
client_print( id, print_chat, "There's no record!" );
return PLUGIN_HANDLED;
}
public Event_GameWillRestartIn()
{
for( new id=1; id<33; id++ )
{
timer_started[id] = false;
isView[id] = false;
}
}
question:
1. if i use this on a cs server, it will take much cpu/memory or lag ?
2. if ArraySize = 360000 (1 hour) / or even more arrays, how about question 1 ? or even crash ?