Ton problème vient de la fonction "energies", il faut faire
TogglePlayerControllable(i,1); pour dé-freezer le joueur.
En fait, cette fonction va systématiquement freezer le joueur qui sont connectés.
Et je ne vois pas à quoi sert le timer "energie" (sans s) (J'imagine que c'est un timer global qui force le joueur à dormir au bout d'un moment)
Sinon, ton utilisation des timers n'est pas correcte.
Tout d'abord, tu lances des timers permanents (qui ne s'arrêtent jamais). Ceci est contrôlé par le dernier paramètre de
SetTimer.
1 -> Timer permanent
0 -> Timer exécuté qu'une seule fois.
NB : Un timer permanent ne doit être lancé qu'une seule fois sinon les effets sont imprévisibles (plusieurs timers identiques qui tournent en même temps)
Si tu lances un timer "one shot", ce n'est pas la peine de gérer tous les joueurs dedans.
Pour faire ce que tu veux faire, il faut que tu passes par des timers individuels en utilisant la fonction
SetTimerEx.
Quand le joueur fait /dormir, tu lances un timer pour ce joueur exclusivement :
SetTimerEx ("energies", 15000, 0, "i", playerid);
Ta fonction "energies" doit avoir un paramètre qui est l'id du player.
Et dedans, il ne faut traiter que le joueur playerid.
forward energies(playerid);
public energies(playerid)
{
if(IsPlayerConnected(playerid))
{
ClearAnimations(playerid);
TogglePlayerControllable(playerid,1);
dormir[playerid] = 0;
}
}
Autre chose, dans ta fonction "energie" (sans s), tu fait des return 1; dans une boucle, ce qui n'est pas du tout judicieux.
Ces return étant systématiques, ta boucle ne traitera que le premier joueur connecté dont la variable dormir est inférieure ou égale à 4. Tous les autres joueurs seront oubliés.
Il faut donc que tu ré-écrives ta fonction "energie".
Et dans le cas où dormir
=4, je te conseille de faire dormir = 5 pour éviter que tu relances le timer "energies".
Fais les modifs comme tu peux et reposte, je corrigerais.
++
Syg