textdraws se unen/mezclan y timer se queda activado
#1

Estuve haciendo un sistema de jail y freeze con informaciуn de cuanto tiempo les queda para ser liberado o descongelado.

Cuando me congelo y luego me encarcelo no hay ningъn problema que haya encontrado, al terminar el tiempo de freeze se quita sus respectivos textdraws y se termina el timer, al igual que cuando termina el de jail.

El problema viene cuando me encarcelo primero y luego me congelo, los textdraws andan bien y timer, pero al terminar el tiempo de jail, el de freeze se coloca de йsta manera

Imagen

(Textdraws de la izquierda es el de jail, textdraws de la derecha son de freeze)

Y al terminar el tiempo de freeze el timer se queda activado igual, cada 1 segundo hace la funciуn 'UnfreezePlayer', se queda asн infinitamente hasta que apague el servidor:

Imagen

Y se quedan los textdraws de freeze ahн, no se destruyen.

Repito, esto pasa sуlo cuando me encarcelo primero y luego me congelo.

pawn Код:
public FreezeCheck(playerid)
{
    PlayerInfo[playerid][FreezeTime]--;
    if(PlayerInfo[playerid][FreezeTime] > 0)
    {
        //Cуdigo que no tiene que ver con textdraws, es sуlo calculo de tiempo introducido en una cadena
        PlayerTextDrawSetString(playerid,FreezeTime[playerid],PlayerInfo[playerid][FreezeTimeText]);
        Characters = float(strlen(PlayerInfo[playerid][FreezeTimeText]));
        Characters *= 3.5;
        PlayerTextDrawDestroy(playerid,FreezeTimeBox[playerid]);
        FreezeTimeBox[playerid] = CreateFreezeBoxTextDraw(playerid, BoxFreezePosX+Characters, BoxFreezePosY);
    }
    else
    {
        KillTimer(PlayerInfo[playerid][FreezeTimer]);
        UnfreezePlayer(playerid);
    }
    return 1;
}

stock UnfreezePlayer(playerid)
{
    PlayerInfo[playerid][FreezeTimer] = -1;
    DestroyPlayerFreezeTextDraw(playerid);
    PlayerInfo[playerid][FreezeTime] = 0;
    PlayerInfo[playerid][Freezed] = false;
    TogglePlayerControllable(playerid,true);
    GameTextPlayer(playerid,"~g~Has sido Descongelado",4000,3);
    PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
    return 1;
}


public JailedCheck(playerid)
{
    PlayerInfo[playerid][JailedTime]--;
    if(PlayerInfo[playerid][JailedTime] > 0)
    {
        //Cуdigo que no tiene que ver con textdraws, es sуlo calculo de tiempo introducido en una cadena
        PlayerTextDrawSetString(playerid,JailTime[playerid],PlayerInfo[playerid][JailTimeText]);
        Characters = float(strlen(PlayerInfo[playerid][JailTimeText]));
        Characters *= 3.5;
        PlayerTextDrawDestroy(playerid,JailTimeBox[playerid]);
        JailTimeBox[playerid] = CreateJailBoxTextDraw(playerid,BoxJailPosX+Characters, BoxJailPosY);
    }
    else
    {
        KillTimer(PlayerInfo[playerid][JailTimer]);
        UnjailPlayer(playerid);
    }
    return 1;
}

stock UnjailPlayer(playerid)
{
    PlayerInfo[playerid][JailTimer] = -1;
    DestroyPlayerJailTextDraw(playerid);
    PlayerInfo[playerid][JailedTime] = 0;
    PlayerInfo[playerid][Jailed] = false;
    SetPlayerPos(playerid,0.0,0.0,0.0);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    SpawnPlayer(playerid);
    GameTextPlayer(playerid,"~g~Liberado de la ~r~Carcel",4000,3);
    cJaileds--;
    JailBusy[PlayerInfo[playerid][MyJail]] = false;
    PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
    return 1;
}
Alguien ha podido notar mi error?
Reply
#2

Mi recomendaciуn es que no uses timer de esa manera para eso, intйntalo asн:

pawn Код:
public OnGameModeInit()
{
    SetTimer("PlayerCheck", 1000, true);
    return 1;
}

forward PlayerCheck(); public PlayerCheck()
{
    new string[128];
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) if(IsPlayerConnected(playerid)) {
        if(PlayerInfo[playerid][FreezeTime] > 0)
        {
            PlayerInfo[playerid][FreezeTime]--;
            PlayerTextDrawSetString(playerid, FreezeTime[playerid], PlayerInfo[playerid][FreezeTimeText]);
            Characters = float(strlen(PlayerInfo[playerid][FreezeTimeText]));
            Characters *= 3.5;
            PlayerTextDrawDestroy(playerid,FreezeTimeBox[playerid]);
            FreezeTimeBox[playerid] = CreateFreezeBoxTextDraw(playerid, BoxFreezePosX+Characters, BoxFreezePosY);
            if(!PlayerInfo[playerid][FreezeTime])
            {
                UnfreezePlayer(playerid);
            }
        }
    }
    return 1;
}

UnfreezePlayer(playerid)
{
    if(!IsPlayerConnected(playerid))
        return 1;

    PlayerInfo[playerid][FreezeTimer] = -1;
    PlayerInfo[playerid][FreezeTime] = 0;
    PlayerInfo[playerid][Freezed] = false;

    TogglePlayerControllable(playerid,true);
    DestroyPlayerFreezeTextDraw(playerid);

    GameTextPlayer(playerid,"~G~Has sido Descongelado",4000,3);
    PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
    return 1;
}
Reply
#3

ok, de esa forma no he probado ahн veo... igual si alguien mбs tiene alguna idea de por quй puede suceder йsto le agradecerнa que me diga...
Reply
#4

Hice esta guнa explicando uno de los posibles motivos
Reply
#5

ok eso era, primera vez me pasa xD gracias. Todavнa sigue el bug de los textdraws, йsto tambiйn sуlo pasa cuando me encarcelo primero y luego me congelo, al destruirse los textdraws de la carcel, cuando pasa un segundo de freeze se crea un textdraw abajo del que ya estaba de freeze (esto luego que se termina el de la carcel), y el que estaba de freeze en ese momento se queda ahн y no se destruye, incluso cuando termina el tiempo de freeze se destruye el de abajo y se queda el que estaba de freeze antes. ej. cuando terminу el tiempo de carcel quedaban 10s de freeze, se crea un textdraw abajo del que ya estaba de freeze, sigue el conteo de freeze en ese textdraw abajo y el que ya estaba queda ahн en 10s.

Lo que no tengo ni idea de por quй pasa si cada vez que pasa 1 segundo destruyo los textdraws almacenados en la variables y vuelvo a crear y almaceno en la misma y cuando termina el timer los destruyo todos, y sуlo pasa cuando termina el tiempo de carcel primero, al revez ya anda bien todo
Reply
#6

Publica los comandos que usas para enviar a alguien a la cбrcel, y congelarlo.
Reply
#7

pawn Код:
CMD:jail(playerid,params[])
{
    if(PlayerInfo[playerid][AdminNivel] >= NIVEL_JAIL || IsPlayerAdmin(playerid))
    {
        if(sscanf(params,"uis[128]",params[0],params[1],params[2])) return SendClientMessage(playerid,ROJO,"USA: /jail [ID] [Minutos] [Razуn]");
        if(IsPlayerConnected(params[0]) && params[0] != INVALID_PLAYER_ID)
        {
            if(PlayerInfo[params[0]][Logueado] == true)
            {
                if(PlayerInfo[params[0]][AdminNivel] >= PlayerInfo[playerid][AdminNivel] && params[0] != playerid) return SendClientMessage(playerid,ROJO,"[ERROR]: No puedes usar йste comando con este Administrador.");
                if(PlayerInfo[params[0]][Encarcelado] == false)
                {
                    new Minutos, segundos, string[144];
                    Minutos = params[1];
                    if(Minutos == 0) Minutos = 5;
                    segundos = Minutos*60;
                    EncarcelarJugador(params[0], segundos);
                    PlayerInfo[playerid][Encarcelado] = true;
                    if(params[0] != playerid)
                    {
                        format(string,sizeof(string),"Un Administrador ha encarcelado a %s (%d). [Tiempo: %d Minutos] [Razуn: %s]", GetName(params[0]), params[0], Minutos, params[2]);
                        SendClientMessageToAll(CELESTE,string);
                    }
                    else
                    {
                        format(string,sizeof(string),"Te has encarcelado. [Tiempo: %d Minutos] [Razуn: %s]", Minutos, params[2]);
                        SendClientMessage(playerid,CELESTE,string);
                    }
                }
                else
                {
                    SendClientMessage(playerid,ROJO,"[ERROR]: El jugador ya estб encarcelado.");
                }
            }
            else
            {
                SendClientMessage(playerid,ROJO,"[ERROR]: El jugador no ha iniciado sesiуn.");
            }
        }
        else
        {
            SendClientMessage(playerid,ROJO,"[ERROR]: El jugador no estб conectado.");
        }
    }
    else
    {
        SendClientMessage(playerid,BLANCO,NO_PERMITIDO);
    }
    return 1;
}

CMD:freeze(playerid,params[])
{
    if(PlayerInfo[playerid][AdminNivel] >= NIVEL_FREEZE || IsPlayerAdmin(playerid))
    {
        if(sscanf(params,"uis[128]",params[0],params[1],params[2])) return SendClientMessage(playerid,ROJO,"USA: /freeze [ID] [Minutos] [Razуn]");
        if(IsPlayerConnected(params[0]) && params[0] != INVALID_PLAYER_ID)
        {
            if(PlayerInfo[params[0]][Logueado] == true)
            {
                if(PlayerInfo[params[0]][AdminNivel] >= PlayerInfo[playerid][AdminNivel] && params[0] != playerid) return SendClientMessage(playerid,ROJO,"[ERROR]: No puedes usar йste comando con este Administrador.");
                if(PlayerInfo[params[0]][Congelado] == false)
                {
                    new Minutos, segundos, string[144];
                    Minutos = params[1];
                    if(Minutos == 0) Minutos = 5;
                    segundos = Minutos*60;
                    CongelarJugador(playerid,segundos);
                    PlayerInfo[playerid][Congelado] = true;
                    if(params[0] != playerid)
                    {
                        format(string,sizeof(string),"Un Administrador ha congelado a %s (%d). [Tiempo: %d Minutos] [Razуn: %s]", GetName(params[0]),params[0], Minutos, params[2]);
                        SendClientMessageToAll(CELESTE,string);
                    }
                    else
                    {
                        format(string,sizeof(string),"Te has congelado. [Tiempo: %d Minutos] [Razуn: %s]", Minutos, params[2]);
                        SendClientMessage(playerid,CELESTE,string);
                    }
                }
                else
                {
                    SendClientMessage(playerid,ROJO,"[ERROR]: El jugador ya estб congelado.");
                }
            }
            else
            {
                SendClientMessage(playerid,ROJO,"[ERROR]: El jugador no ha iniciado sesiуn.");
            }
        }
        else
        {
            SendClientMessage(playerid,ROJO,"[ERROR]: El jugador no estб conectado.");
        }
    }
    else
    {
        SendClientMessage(playerid,BLANCO,NO_PERMITIDO);
    }
    return 1;
}
Algunas funciones las cambiй a espaсol para no perderme xD

Pero en realidad las que mandan a la carcel y crean textdraws son estas

pawn Код:
public LlevarACarcel(playerid)
{
    //setplayerpos, interior etc
    TiempoCarcelBox[playerid] = CreateCarcelBoxTextDraw(playerid,BoxCarcelPosX,BoxCarcelPosY);
    TiempoCarcel[playerid] = CreateCarcelTextDraw(playerid,TextCarcelPosX,TextCarcelPosY);
    SetPlayerSpecialAction(playerid, SPECIAL_ACTION_NONE);
    KillTimer(PlayerInfo[playerid][TimerCarcel]);
    PlayerInfo[playerid][TimerCarcel] = SetTimerEx("ChequearPrisionero",1000,true,"i",playerid);
    return 1;
}

stock CongelarJugador(playerid, segundos)
{
    PlayerInfo[playerid][TiempoCongelado] = segundos;
    TogglePlayerControllable(playerid,false);
    TiempoFreezeBox[playerid] = CreateFreezeBoxTextDraw(playerid, BoxFreezePosX,BoxFreezePosY);
    TiempoFreeze[playerid] = CreateFreezeTextDraw(playerid,TextFreezePosX,TextFreezePosY);
    KillTimer(PlayerInfo[playerid][TimerFreeze]);
    PlayerInfo[playerid][TimerFreeze] = SetTimerEx("ChequearCongelado",1000,true,"i",playerid);
    return 1;
}
Reply
#8

Los comandos tienen errores. Enumero:
  1. Si quieres congelar o encarcelar a una ID ajena al que usa el comando, deberнas cambiar estas lineas:
    pawn Код:
    // Congelar
    CongelarJugador(playerid,segundos);
    PlayerInfo[playerid][Congelado] = true;

    // Encarcelar
    PlayerInfo[playerid][Encarcelado] = true;
    Ya que ahн lo que estarнas haciendo es encarcelar al que usa el comando.
  2. Esto nunca se cumplirнa:
    pawn Код:
    else
    {
        format(string,sizeof(string),"Te has congelado. [Tiempo: %d Minutos] [Razуn: %s]", Minutos, params[2]);
        SendClientMessage(playerid,CELESTE,string);
    }
    Ya que justo arriba, estб esta condiciуn:
    pawn Код:
    if(... && params[0] != playerid) return ...
Modifica esas 2 cosas y prueba, el error principal aun deberнa estar creo, pero algo deberб haber cambiado.
Reply
#9

1. Listo, no me habнa dado cuenta porque testeaba sуlo y era el mismo id params[0] y playerid. xd
2. Si se cumplen bien esas, lo tengo asн por si necesito testear y jailearme yo no me diga que al que quiero jailear es admin(siendo yo mismo) y no le diga a todo el sv que me meti a la carcel, asн que si el params[0] es admin mayor o igual a playerid y no soy yo, se cumple y retorna el send. Igual acabo de testear eso tambiйn y anda bien todo, cuando el otro es admin, cuando yo soy admin etc. (con otra pc)

Gracias por decirme los errores pero sigue mezclбndose los textdraws T_T
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)