Tout d'abord, tu n'as pas besoin de rappeler la callback OnPlayerKeyStateChange, le moteur de SAMP va le faire tout seul pour toi, à chaque appui ou relachement d'une touche.
Ensuite, je n'ai jamais dit que gettime n'existait pas sous Windows, ce que je voulais dire c'est que gettime donne heures, minutes et secondes alors que GetTickCount donne des milisecondes (donc 1000 fois plus précis).
Pour le test sur newkeys, il faut passer par un masque, pas par une comparaison à l'égalité car newkeys peut contenir plusieurs codes touche à la fois.
if (newkeys & KEY_FIRE)
Pour la méthode, c'est facile, lors de l'appuie sur la touche voulue tu stockes l'instant à laquelle la touche est appuyée. Lors du relachement de la touche, tu fais la différence entre l'instant présent et l'instant stocké avant. Ceci te donne la durée d'appui sur la touche. Il ne reste plus qu'à comparer avec la durée voulue.
Pour n'importe quel serveur :
new Temps[MAX_PLAYERS];
public OnPlayerKeyStateChange (playerid, newkeys, oldkeys)
{
new H, M, S;
gettime (H, M, S);
/* On vient d'appuyer sur la touche KEY_FIRE */
if (newkeys & KEY_FIRE)
{
/* On stocke l'instant d'appui sur la touche */
Temps[playerid] = H*3600 + M*60 + S;
}
/* On vient de relacher la touche KEY_FIRE */
else if (oldkeys & KEY_FIRE)
{
/* On stocke l'instant de relachement de la touche */
Temps2 = H*3600 + M*60 + S;
/* Si appui assez long (supérieur à 5 secondes) */
if (Temps2-Temps[playerid] > 5)
{
/* Tu fais ce que tu as à faire */
}
}
}
Pour un serveur sous Windows (seulement) :
new Temps[MAX_PLAYERS];
public OnPlayerKeyStateChange (playerid, newkeys, oldkeys)
{
/* On vient d'appuyer sur la touche KEY_FIRE */
if (newkeys & KEY_FIRE)
{
/* On stocke l'instant d'appui sur la touche */
Temps[playerid] = GetTickCount ();
}
/* On vient de relacher la touche KEY_FIRE */
else if (oldkeys & KEY_FIRE)
{
/* On stocke l'instant de relachement de la touche */
new Temps2 = GetTickCount ();
/* Si appui assez long (supérieur à 5 secondes) */
if (Temps2-Temps[playerid] > 5000)
{
/* Tu fais ce que tu as à faire */
}
}
}
Attention, pour la première version (sans GetTickCount), il faut gérer le passage à minuit si on veut faire les chose correctement. Effectivement, si le joueur appuie sur la touche à 23:59:58 et la relâche à 00:00:04, il se sera passé plus de 5 secondes mais le script ne le verra pas car la différence entre les deux temps sera négative vu qu'on repasse à 0.
23:59:58 -> 23*3600+59*60+58 = 86398 (Temps[playerid] dans le script)
00:00:04 -> 00*3600+00*60+04 = 4 (Temps2 dans le script)
4 - 86398 = -86394 (qui n'est bien évidement pas supérieur à 5).
Mais bon, la gestion du passage à minuit n'est pas indispensable.
++
Syg