SA-MP Forums Archive
timer - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+---- Thread: timer (/showthread.php?tid=410691)



timer - ValenRatti - 26.01.2013

No me funciona

onplayerconnect
pawn Код:
CrearTextPublicidad(playerid); //crea textdraws
PublicidadNum = 0;
SetTimer("Publicidad",10000,1);
pawn Код:
public Publicidad(playerid)
{
   if(PublicidadNum == 0)
   {
      TextDrawHideForPlayer(playerid,PublicidadTexto[playerid]);
      TextDrawSetString(PublicidadTexto[playerid],"asd");
      TextDrawShowForPlayer(playerid,PublicidadTexto[playerid]);
      PublicidadNum = 1;
      return 1;
   }
   if(PublicidadNum == 1)
   {
      TextDrawHideForPlayer(playerid,PublicidadTexto[playerid]);
      TextDrawSetString(PublicidadTexto[playerid],"asdf! ");
      TextDrawShowForPlayer(playerid,PublicidadTexto[playerid]);
      PublicidadNum = 2;
      return 1;
   }
   if(PublicidadNum == 2)
   {
      TextDrawHideForPlayer(playerid,PublicidadTexto[playerid]);
      TextDrawSetString(PublicidadTexto[playerid],"asdgfhah");
      TextDrawShowForPlayer(playerid,PublicidadTexto[playerid]);
      PublicidadNum = 3;
      return 1;
   }
   if(PublicidadNum == 3)
   {
      TextDrawHideForPlayer(playerid,PublicidadTexto[playerid]);
      TextDrawSetString(PublicidadTexto[playerid],"akjhgkjashglkhasdiguhasdg");
      TextDrawShowForPlayer(playerid,PublicidadTexto[playerid]);
      PublicidadNum = 0;
      return 1;
   }
   return 1;
}



Respuesta: timer - Dreyfuz - 26.01.2013

pawn Код:
CrearTextPublicidad(playerid); //crea textdraws
PublicidadNum = 0;
SetTimerEx("Publicidad", 1000, true, "i", playerid);



Re: timer - Daniel-92 - 26.01.2013

SetTimerEx("Publicidad",10000,1,"i",playerid);

PD: me gano Dreyfuz por segundos.


Respuesta: timer - ValenRatti - 26.01.2013

Muchas graciass a los dos


Respuesta: timer - [DOG]irinel1996 - 26.01.2013

Aunque el script que usas ahora esta bien, hay un problema, como sabrбs los timers pueden darte problemas a la hora de la optimizaciуn del script. Te recomendarнa que uses un SetTimer en OnGameModeInit y crear los TextDraws en el mismo sitio, luego haces un bucle for en la funciуn de Publicidad y los muestras, y de esta forma se usarнa nada mбs que un timer.

Otro fallo que tienes es que no se destruye el timer, cuando se conecta el jugador se activa, pero cuando sale no se destruye y queda ejecutandose intentando mostrar los TextDraws a un jugador que no estб conectado. Y cuando se conecte otro jugador con la misma ID que el que abandonу el servidor, se activa otro timer y serнan como dos timers para un jugador, y asн sucesivamente. Al tener varios timers, los TextDraws cambiarнan en un tiempo muy corto ya que los timers no estarбn sincronizados, se necesita mucha suerte para eso. Aun asн, serнa un gran error.


Respuesta: timer - Glimma - 26.01.2013

Quote:
Originally Posted by [DOG]irinel1996
Посмотреть сообщение
Aunque el script que usas ahora esta bien, hay un problema, como sabrбs los timers pueden darte problemas a la hora de la optimizaciуn del script. Te recomendarнa que uses un SetTimer en OnGameModeInit y crear los TextDraws en el mismo sitio, luego haces un bucle for en la funciуn de Publicidad y los muestras, y de esta forma se usarнa nada mбs que un timer.

Otro fallo que tienes es que no se destruye el timer, cuando se conecta el jugador se activa, pero cuando sale no se destruye y queda ejecutandose intentando mostrar los TextDraws a un jugador que no estб conectado. Y cuando se conecte otro jugador con la misma ID que el que abandonу el servidor, se activa otro timer y serнan como dos timers para un jugador, y asн sucesivamente. Al tener varios timers, los TextDraws cambiarнan en un tiempo muy corto ya que los timers no estarбn sincronizados, se necesita mucha suerte para eso. Aun asн, serнa un gran error.
Imposible explicarlo mejor que vos, muy buena explicaciуn.


Respuesta: timer - OTACON - 26.01.2013

pawn Код:
#include <a_samp>
new MatarPublicidad[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    TextDrawShowForPlayer(playerid,PublicidadTexto[playerid]);
    MatarPublicidad[playerid] = SetTimerEx("Publicidad", 10000, true, "i", playerid);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    TextDrawHideForPlayer(playerid,PublicidadTexto[playerid]);
    KillTimer(MatarPublicidad[playerid]);
    return 1;
}

forward Publicidad(playerid);
public Publicidad(playerid)
{
    switch(random(5))
    {
       case 0:
       {
          TextDrawSetString(PublicidadTexto[playerid],"texto 1");
       }
       case 1:
       {
          TextDrawSetString(PublicidadTexto[playerid],"texto 2");
       }
       case 2:
       {
          TextDrawSetString(PublicidadTexto[playerid],"texto 3");
       }
       case 3:
       {
          TextDrawSetString(PublicidadTexto[playerid],"texto 4");
       }
       case 4:
       {
          TextDrawSetString(PublicidadTexto[playerid],"texto 5");
       }
    }
    return 1;
}



Respuesta: timer - ValenRatti - 26.01.2013

Estuve a punto de cometer un gran error entonces, jaja. Se puede poner un solo timer en vez de uno por user poniendo el timer en ongamemodeinit ? y a todos les cambiara el mensaje a la misma vez?

PD: Lo que hice fue: 1-a los tds les saque el [playerid] PublicidadTexto[playerid] ---> Publicidad texto, los cree en ongamemodeinit. 2- Saque el settimerex de onplayerspawn y puse un settimer en ongamemodeinit que cada 20 segundos ejecuta la funcion Publicidad (igual que antes) 3- Agregue el killtimer en onplayerdisconnect (No entendi bien lo del bucle for)


Re: Respuesta: timer - [DOG]irinel1996 - 26.01.2013

Quote:
Originally Posted by ValenRatti
Посмотреть сообщение
Estuve a punto de cometer un gran error entonces, jaja. Se puede poner un solo timer en vez de uno por user poniendo el timer en ongamemodeinit ? y a todos les cambiara el mensaje a la misma vez?

PD: Lo que hice fue: 1-a los tds les saque el [playerid] PublicidadTexto[playerid] ---> Publicidad texto, los cree en ongamemodeinit. 2- Saque el settimerex de onplayerspawn y puse un settimer en ongamemodeinit que cada 20 segundos ejecuta la funcion Publicidad (igual que antes) 3- Agregue el killtimer en onplayerdisconnect (No entendi bien lo del bucle for)
Serнa algo asн:
pawn Код:
new
    Variable
;

public OnGameModeInit() {
    //---Creas los TextDraws.

    SetTimer("Publicidad", 20000, true);
    return 1;
}

public Publicidad() {
    Variable++; //Aquн aumentamos el valor de 'Variable' para saber que mensaje mostrar.
    for (new p; p < MAX_PLAYERS; p++) {
        if (!IsPlayerConnected(p)) continue; //Si el jugador con la ID 'p' no estб conectado pasamos a la siguiente ID.
        switch(variable) { //їQuй valor tiene 'Variable'?
            case 1: {
                //Si tiene 1, mostraremos el primer mensaje aquн.
            }
            case 2: {
            }
            case 3: {
            }
            case 4: {
                //4є Mensaje.
                TextDrawShowForPlayer(p, TuTextDraw);

                //Al llegar al 4є mensaje ponemos la variable en 0. Y empezarб de nuevo.
                Variable = 0;
            }
            /* Puedes aсadir mбs 'case' si quieres pero no olvides de poner 'Variable = 0;' en el ъltimo como hice yo arriba */
        }
    }
    return 1;
}
Saludos!

PD: ya aquн no harнa falta KillTimer, recuerda que existe TextDrawSetString, no hace falta crear un TextDraw por cada mensaje.


Respuesta: timer - ValenRatti - 27.01.2013

Muuchisimas gracias !