[Ajuda] sistema de cadeia em loop
#1

Pois bem, alguns jogadores do servidor estгo tendo um bug mto chato.
Depois que eles sгo soltos ou da cadeia de admin ou da delegacia, eles entram em loop.
Jб vi e revi o cуdigo e nгo consigo descobrir pq?

Executado no OnPlayerSpawn;
PHP Code:
stock ChecarCadeia(playerid)
{
    if(
PlayerInfo[playerid][pPreso] == 0)return 0;
    else if(
PlayerInfo[playerid][pPreso] != 0)
    {
        
PrenderJogador(playerid);
    }
    return 
1;
}
stock PrenderJogador(playerid)
{
    if(
PlayerInfo[playerid][pPreso] == 1)
    {
        
PrisaoPublica(playerid);
    }
    else if(
PlayerInfo[playerid][pPreso] == 2)
    {
        
PrisaoAdmin(playerid);
    }
    return 
true;
}
stock PrisaoPublica(playerid)
{
    new 
string[64];
    new 
Celas random(6);
    new 
tempo PlayerInfo[playerid][pTempoPreso];
    
TogglePlayerSpectating(playerid0);
    switch(
Celas)
    {
        case 
0:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid190.2162.10001105.0);}
        case 
1:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid194.5162.399991005.0);}
        case 
2:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid198.5162.100011005.0);}
        case 
3:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid197.60001174.21005.0);}
        case 
4:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid193.0174.71005.0);}
        case 
5:{ SetPlayerInterior(playerid3); SetPlayerPos(playerid189.10001174.600011005.0);}
    }
    
PlayerInfo[playerid][pAlgemado] = false;
    
SetPlayerSpecialAction(playeridSPECIAL_ACTION_NONE);
    
format(stringsizeof(string), "[CADEIA] Voce deve cumprir %d minutos de prisao!"tempo);
    
SendClientMessage(playeridCOR_AMARELOstring);
    
ShowPlayerDialog(playerid998DIALOG_STYLE_MSGBOX"PRISAO""VOCE FOI PRESO PELA POLICIA!""OK""");
    new 
Query1[90], Query2[90],DBResult:Resultado;
    
format(Query2sizeof(Query2), "SELECT * FROM `cadeia` WHERE `presoNome`='%s'"PlayerInfo[playerid][pNome]);
    
Resultado db_query(ConnectQuery2);
    if(
db_num_rows(Resultado) == 0)
    {
        
format(Query1sizeof(Query1), "INSERT INTO `cadeia`(`presoNome`,`presoTipo`,`presoTempo`) VALUES('%s',%d,%d);",
        
PlayerInfo[playerid][pNome],PlayerInfo[playerid][pPreso],PlayerInfo[playerid][pTempoPreso]);
        
db_query(ConnectQuery1);
    }
    
db_free_result(Resultado);
    
TimerCadeiaPublica[playerid] = SetTimerEx("CadeiaPublica",minutos(1),true,"i",playerid);
    return 
true;
}
stock PrisaoAdmin(playerid)
{
    new 
string[64];
       new 
tempo PlayerInfo[playerid][pTempoPreso];
       
TogglePlayerSpectating(playerid0);
    
SetPlayerInterior(playerid5);
    
SetPlayerPos(playerid322.197998,302.497985,999.148437);
    
format(stringsizeof(string), "[PRISAO] Voce deve cumprir %d minutos de prisao!"tempo);
    
SendClientMessage(playeridCOR_AMARELOstring);
    
ShowPlayerDialog(playerid998DIALOG_STYLE_MSGBOX"PRISAO""VOCE FOI PRESO PELA STAFF!""OK""");
    new 
Query1[90], Query2[90],DBResult:Resultado;
    
format(Query2sizeof(Query2), "SELECT * FROM `cadeia` WHERE `presoNome`='%s'"PlayerInfo[playerid][pNome]);
    
Resultado db_query(ConnectQuery2);
    if(
db_num_rows(Resultado) == 0)
    {
        
format(Query1sizeof(Query1), "INSERT INTO `cadeia`(`presoNome`,`presoTipo`,`presoTempo`) VALUES('%s',%d,%d);",
        
PlayerInfo[playerid][pNome],PlayerInfo[playerid][pPreso],PlayerInfo[playerid][pTempoPreso]);
        
db_query(ConnectQuery1);
    }
    
db_free_result(Resultado);
    
TimerCadeiaAdmin[playerid] = SetTimerEx("CadeiaAdmin",minutos(1),true,"i",playerid);
    return 
true;
}
forward CadeiaPublica(playerid);
public 
CadeiaPublica(playerid)
{
    if(
PlayerInfo[playerid][pTempoPreso] != 0)
    {
        
PlayerInfo[playerid][pTempoPreso] -= 1;
        return 
true;
    }
    else if(
PlayerInfo[playerid][pTempoPreso] == 0)
    {
        
SoltarJogador(playerid);
    }
    
    return 
true;
}
forward CadeiaAdmin(playerid);
public 
CadeiaAdmin(playerid)
{
    if(
PlayerInfo[playerid][pTempoPreso] != 0)
    {
        
PlayerInfo[playerid][pTempoPreso] -= 1;
        return 
true;
    }
    else if(
PlayerInfo[playerid][pTempoPreso] == 0)
    {
        
SoltarJogador(playerid);
    }
    return 
true;
}
forward SoltarJogador(playerid);
public 
SoltarJogador(playerid)
{
    new 
Query[180];
    
format(Querysizeof(Query), "DELETE FROM `cadeia` WHERE `presoNome`='%s'",PlayerInfo[playerid][pNome]);
    
db_query(ConnectQuery);
    
PlayerInfo[playerid][pPreso] = 0;
    
PlayerInfo[playerid][pTempoPreso] = 0;
    
PlayerInfo[playerid][pCalado] = false;
    
PlayerInfo[playerid][pNivelProcurado] = 0;
    
SetPlayerWantedLevel(playeridPlayerInfo[playerid][pNivelProcurado]);
    
SendClientMessage(playerid,COR_VERDE,"[LIBERDADE] Voce foi solto! Nao cometa mais crimes!");
    
KillTimer(TimerCadeiaPublica[playerid]);
    
KillTimer(TimerCadeiaAdmin[playerid]);
    
SpawnPlayer(playerid);
    
SalvarDB(playerid);

O loop fica dando ali no SoltarJogador, fazendo ele ficar voltando pro Spawn a cada 2 minutos, como se o timer nгo tivesse sendo parado.
Alguem saberia me dizer onde esta o erro no code?
Reply
#2

PHP Code:
stock ChecarCadeia(playerid

    if(
PlayerInfo[playerid][pPreso  == 0) return KillTimer(TimerCadeiaAdmin[playerid]), KillTimer(TimerCadeiaPublica[playerid]); 
    else if(
PlayerInfo[playerid][pPreso] != 0
    { 
        
PrenderJogador(playerid); 
    } 
    return 
1

Reply
#3

Quote:
Originally Posted by zHellSync
View Post
PHP Code:
stock ChecarCadeia(playerid

    if(
PlayerInfo[playerid][pPreso  == 0) return KillTimer(TimerCadeiaAdmin[playerid]), KillTimer(TimerCadeiaPublica[playerid]); 
    else if(
PlayerInfo[playerid][pPreso] != 0
    { 
        
PrenderJogador(playerid); 
    } 
    return 
1

Mais ai no caso eu apagaria os KillTimer to soltar jogador, ou deixo la?
Reply
#4

Quote:
Originally Posted by MtPlayerZ
View Post
Mais ai no caso eu apagaria os KillTimer to soltar jogador, ou deixo la?
A verificaзгo que vocк fez ai nгo para o Timer de cadeia, que no caso vocк definiu se ele estiver preso, como vai ta verificando entгo deve retornar a "morte" do timer, jб que o jogador VERIFICADO nгo esta preso

EDIT: apenas adicionar os KillTimer no return jб resolve possivelmente. (Como fiz a cima)
Reply
#5

Quote:
Originally Posted by zHellSync
View Post
A verificaзгo que vocк fez ai nгo para o Timer de cadeia, que no caso vocк definiu se ele estiver preso, como vai ta verificando entгo deve retornar a "morte" do timer, jб que o jogador VERIFICADO nгo esta preso

EDIT: apenas adicionar os KillTimer no return jб resolve possivelmente. (Como fiz a cima)
Vlw pela ajuda, se funcionar eu digo akie!
+rep
Reply
#6

Quote:
Originally Posted by MtPlayerZ
View Post
Vlw pela ajuda, se funcionar eu digo akie!
+rep
Boa sorte no projeto
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)