sıɹɹoɥɔ ʞɔnu
06-20-2012
, 14:59
Parachute problem
#1
I try to remake the parachute plugin with less CPU usage, here is the code:
Spoiler
PHP Code:
#include < amxmodx > #include < hamsandwich > #include < fakemeta > #include < engine > new const g_szParachuteModel [ ] = "models/parachute.mdl" #define Parachute_FallSpeed -100.0 const MAX_PLAYERS = 32 new g_bParachute , g_bUpdateFrame , g_bParachuteModel #define MarkUserParachute(%1) g_bParachute |= 1<<(%1 & 31 ) #define ClearUserParachute(%1) g_bParachute &= ~( 1<<(%1 & 31 ) ) #define IsParachute(%1) g_bParachute & 1<<(%1 & 31 ) #define SetParachuteState(%0,%1) %0 |= 1<<(%1 & 31 ) #define ClearParachuteState(%0,%1) %0 &= ~( 1<<(%1 & 31 ) ) #define IsParachuteState(%0,%1) %0 & 1<<(%1 & 31 ) new g_iParachuteEnt [ MAX_PLAYERS + 1 ] public plugin_precache () { precache_model ( g_szParachuteModel ) } public plugin_init () { register_plugin ( "Parachute Test" , "" , "" ) RegisterHam ( Ham_Spawn , "player" , "Check_ParachuteOnPlayer" , true ) RegisterHam ( Ham_Killed , "player" , "Check_ParachuteOnPlayer" , true ) register_think ( "item_parachute" , "Parachute_Think" ) register_clcmd ( "give_para" , "GiveMeParachute" ) } public client_disconnect ( id ) { if( IsParachute ( id ) ) { parachute_reset ( id ) } } public Check_ParachuteOnPlayer ( id ) { if( IsParachute ( id ) ) { parachute_reset ( id ) } } public GiveMeParachute ( id ) { MarkUserParachute ( id ) g_iParachuteEnt [ id ] = create_entity ( "info_target" ) set_pev ( g_iParachuteEnt [ id ], pev_classname , "item_parachute" ) set_pev ( g_iParachuteEnt [ id ], pev_aiment , id ) set_pev ( g_iParachuteEnt [ id ], pev_owner , id ) set_pev ( g_iParachuteEnt [ id ], pev_movetype , MOVETYPE_FOLLOW ) set_pev ( g_iParachuteEnt [ id ], pev_nextthink , get_gametime () + 0.01 ) return PLUGIN_HANDLED } public Parachute_Think ( iEnt ) { if( ! pev_valid ( iEnt ) ) return static id id = pev ( iEnt , pev_owner ) if( ~ IsParachute ( id ) || ! g_iParachuteEnt [ id ] ) return static Float : fCurrTime fCurrTime = get_gametime () if( ~ IsParachuteState ( g_bUpdateFrame , id ) && pev ( id , pev_flags ) & FL_ONGROUND ) { if( pev ( g_iParachuteEnt [ id ], pev_sequence ) != 2 ) { set_pev ( g_iParachuteEnt [ id ], pev_sequence , 2 ) set_pev ( g_iParachuteEnt [ id ], pev_gaitsequence , 1 ) set_pev ( g_iParachuteEnt [ id ], pev_frame , 0.0 ) set_pev ( g_iParachuteEnt [ id ], pev_fuser1 , 0.0 ) set_pev ( g_iParachuteEnt [ id ], pev_animtime , 0.0 ) set_pev ( g_iParachuteEnt [ id ], pev_framerate , 0.0 ) } SetParachuteState ( g_bUpdateFrame , id ) //ClearParachuteState(g_bParachuteModel, id) // less CPU~ set_pev ( g_iParachuteEnt [ id ], pev_aiment , 0 ) } if( pev ( id , pev_button ) & IN_USE ) { static Float : velocity [ 3 ], Float : frame pev ( id , pev_velocity , velocity ) if( velocity [ 2 ] < 0.0 ) { velocity [ 2 ] = ( velocity [ 2 ] + 40.0 < Parachute_FallSpeed ) ? velocity [ 2 ] + 40.0 : Parachute_FallSpeed set_pev ( g_iParachuteEnt [ id ], pev_aiment , id ) set_pev ( g_iParachuteEnt [ id ], pev_sequence , 0 ) set_pev ( g_iParachuteEnt [ id ], pev_gaitsequence , 1 ) set_pev ( id , pev_velocity , velocity ) set_pev ( id , pev_sequence , 3 ) set_pev ( id , pev_gaitsequence , 1 ) set_pev ( id , pev_frame , 1.0 ) set_pev ( id , pev_framerate , 1.0 ) if( pev ( g_iParachuteEnt [ id ], pev_sequence ) == 0 ) { frame = pev ( g_iParachuteEnt [ id ], pev_fuser1 ) + 1.0 set_pev ( g_iParachuteEnt [ id ], pev_fuser1 , frame ) set_pev ( g_iParachuteEnt [ id ], pev_frame , frame ) if( frame > 100.0 ) { set_pev ( g_iParachuteEnt [ id ], pev_animtime , 0.0 ) set_pev ( g_iParachuteEnt [ id ], pev_framerate , 0.4 ) set_pev ( g_iParachuteEnt [ id ], pev_sequence , 1 ) set_pev ( g_iParachuteEnt [ id ], pev_gaitsequence , 1 ) set_pev ( g_iParachuteEnt [ id ], pev_frame , 0.0 ) set_pev ( g_iParachuteEnt [ id ], pev_fuser1 , 0.0 ) } } if( ~ IsParachuteState ( g_bParachuteModel , id ) ) // less CPU~ { SetParachuteState ( g_bParachuteModel , id ) engfunc ( EngFunc_SetModel , g_iParachuteEnt [ id ], g_szParachuteModel ) } ClearParachuteState ( g_bUpdateFrame , id ) } } set_pev ( g_iParachuteEnt [ id ], pev_nextthink , fCurrTime + 0.01 ) } parachute_reset ( id ) { if( g_iParachuteEnt [ id ] > 0 && pev_valid ( g_iParachuteEnt [ id ] ) ) remove_entity ( g_iParachuteEnt [ id ] ) g_iParachuteEnt [ id ] = 0 ClearUserParachute ( id ) ClearParachuteState ( g_bUpdateFrame , id ) ClearParachuteState ( g_bParachuteModel , id ) }
but some player got the next error:
Cache_UnlinkLRU: NULL link
I think the problem is because player receives more datas is a short time (0.01 seconds)
Attached Thumbnails
Attached Files
Last edited by dFF; 06-20-2012 at 15:47 .
Reason: update...