Bien le bonjour,
Je tente de hooker Ham_Spawn, Ham_Killed, Ham_Item_PreFrame et Ham_TakeDamage sur les bots de CZ.
J'ai trouvé ce plugin de Connor qui créé un multiforward pour pouvoir utiliser RegisterHamFromEntity quand le premier bot est créé (il me semble).
J'ai donc tenté de faire fonctionner le code que voici, mais sans succès.
PHP Code:
#define GetTeam(%1) get_pdata_int(%1,114)
#define SetTeam(%1,%2) set_pdata_int(%1,114,%2)
const TASKID_REVIVE = 1337;
const TASKID_COUNTDOWN = 133789;
new g_iNumberSound[ 33 ] , g_iSecondsCountDown[ 33 ] , maClasse[ 33 ];
enum
{
CLASS_ONE,
CLASS_TWO,
CLASS_THREE
}
new const szNameClasses[ ][ ] =
{
"Classe1",
"Classe2",
"Classe3"
}
new const Float:flHealthClasses[ ] =
{
700.0,
600.0,
300.0
}
new const Float:flSpeedClasses[ ] =
{
0.0 ,
280.0 ,
600.0
}
public plugin_init( )
{
RegisterHam( Ham_Spawn, "player", "fwSpawn", 1 );
RegisterHam( Ham_Killed, "player", "fwKilled" );
RegisterHam( Ham_Item_PreFrame, "player", "fwItemPreFrame", 1 );
RegisterHam( Ham_TakeDamage, "player", "fwTakeDamage" );
}
public client_putinserver( id )
{
maClasse[ id ] = -1;
}
public cz_ham_bot_registerable( id )
{
RegisterHamFromEntity( Ham_Spawn, id, "fwSpawn", true );
RegisterHamFromEntity( Ham_Item_PreFrame, id, "fwItemPreFrame", true );
RegisterHamFromEntity( Ham_TakeDamage, id, "fwTakeDamage" );
RegisterHamFromEntity( Ham_Killed, id, "fwKilled" );
maClasse[ id ] = -1;
}
public fwSpawn( id )
{
if( task_exists( TASKID_REVIVE+id ) )
{
remove_task( TASKID_REVIVE+id );
}
if( task_exists( TASKID_COUNTDOWN+id ) )
{
remove_task( TASKID_COUNTDOWN+id );
}
if( is_user_alive( id ) )
{
if( GetTeam( id ) == 1 )
{
maClasse[ id ] = random_num( 0, charsmax( szNameClasses ) );
set_pev( id, pev_health, flHealthClasses[ maClasse[ id ] ] );
set_pev( id, pev_maxspeed, flSpeedClasses[ maClasse[ id ] ] );
if( !is_user_bot( id ) )
{
client_print( id, print_center, "Tu es un %s", szNameClasses[ maClasse[ id ] ] );
}
}
else
{
g_iZombieClass[ id ] = -1;
}
}
}
public fwKilled( victim )
{
new timeTask;
if( GetTeam( victim ) == 1 )
{
new szSound[ 32 ];
switch( maClasse[ victim ] )
{
case CLASS_ONE: copy( szSound, charsmax( szSound ), szSoundClassOne );
case CLASS_TWO: copy( szSound, charsmax( szSound ), szSoundClassTwo );
case CLASS_THREE: copy( szSound, charsmax( szSound ), szSoundClassThree );
}
emit_sound( victim, CHAN_AUTO, szSound, 1.0, ATTN_NONE, 0, PITCH_NORM );
timeTask = 2;
}
else
{
timeTask = 35;
}
g_iSecondsCountDown[ victim ] = timeTask;
set_task( 1.0, "CountDown", victim+TASKID_COUNTDOWN, _, _, "a", timeTask );
set_task( float( timeTask ), "Revive", victim+TASKID_REVIVE );
}
public Revive( player )
{
player -= TASKID_REVIVE;
if( !is_user_alive( player ) )
{
ExecuteHamB( Ham_CS_RoundRespawn, player );
}
}
public CountDown( player )
{
player -= TASKID_COUNTDOWN;
set_hudmessage( 255, 255, 255, -1.0, 0.2, 0, 6.0, 0.9, _, _, -1 );
show_hudmessage( player, "Tu respawn dans %d secondes", --g_iSecondsCountDown[ player ] );
}
public fwItemPreFrame( id )
{
if( is_user_alive( id ) && GetTeam( id ) == 1 && maClasse[ id ] > 0 && pev( id, pev_maxspeed ) != -1.0 )
{
set_pev( id, pev_maxspeed, flSpeedClasses[ maClasse[ id ] ] );
}
}
public fwTakeDamage( victim , inflictor , attacker , Float:damage , damagebits )
{
if( is_user_alive( attacker ) && GetTeam( attacker ) == 1 )
{
if( attacker != victim )
{
new szSound[ 32 ];
switch( maClasse[ attacker ] )
{
case CLASS_ONE:
{
if( !g_iNumberSound[ attacker ] )
{
copy( szSound, charsmax( szSound ), szSoundClassOneShot );
g_iNumberSound[ attacker ] = 1;
}
else
{
copy( szSound, charsmax( szSound ), szSoundClassOneShot2 );
g_iNumberSound[ attacker ] = 0;
}
}
case CLASS_TWO:
{
if( !g_iNumberSound[ attacker ] )
{
copy( szSound, charsmax( szSound ), szSoundClassTwoShot );
g_iNumberSound[ attacker ] = 1;
}
else
{
copy( szSound, charsmax( szSound ), szSoundClassTwoShot2 );
g_iNumberSound[ attacker ] = 0;
}
}
case CLASS_THREE:
{
copy( szSound, charsmax( szSound ), szSoundClassThreeShot );
}
}
emit_sound( attacker, CHAN_AUTO, szSound, 1.0, ATTN_NONE, 0, PITCH_NORM );
}
}
}
public eventRoundRestart( )
{
TaskRemove( );
}
public eventRoundEnd( )
{
TaskRemove( );
}
TaskRemove( )
{
new iPlayers[ 32 ], iNum, id;
get_players( iPlayers, iNum, "h" );
for( new i = 0; i < iNum; i++ )
{
id = iPlayers[ i ];
if( task_exists( TASKID_REVIVE+id ) )
{
remove_task( TASKID_REVIVE+id );
}
if( task_exists( TASKID_COUNTDOWN+id ) )
{
remove_task( TASKID_COUNTDOWN+id );
}
}
}
Je vous ai mis quasiment tout le code, mais c'est juste pour que vous ayez les principales informations, mais mon problème concerne particulièrement Ham_Item_PreFrame.
Quand j'ajoute deux bots en terroristes (donc ils seront automatiquement proches l'un de l'autre), le serveur plante, sans erreur logs, ni erreur console.
Le crash se produit au contact de deux terroristes. D'ailleurs, les terroristes sont dans un bug, invisible pour les autres, et parfois bloqués.
Lorsque j'enlève le code avec Item_PreFrame, le bug n'y ai plus.
J'ai pourtant fait tous les checks nécessaires pour éviter les index hors des limites.
Je ne vois vraiment pas d'où vient le problème, quelqu'un pourrait m'éclaircir s'il vous plaît ?
D'avance merci.