SetWorldTimeEx(horas,minutos);
#1

Hola, me gustarнa saber si es posible hacer dicha funciуn, para que la hora no cambie inmediatamente cada hora, es decir, que vaya cambiando poco a poco cada minuto. Por ejemplo, cuando son las 5 de la maсana es casi de noche, y al llegar a las 6, pasa directamente de ser casi de noche a ser completamente de dнa.

Entonces me gustarнa saber si existe cualquier funciуn para hacer esto.
Yo habнa pensado hacerlo con SetWorldTimeEx, de ******, la he estado probando pero pasa exactamente lo mismo que con SetWorldTime...

Aquн os dejo el cуdigo por si acaso he hecho algo mal en la de ******:
pawn Код:
new ServerHours, ServerMinutes;
forward TimeChange();
//==================//
public OnGameModeInit()
{
SetTimer("TimeChange",1000,1);
return 1;
}
//==================//
public TimeChange()
{
ServerMinutes += 1;
if(ServerMinutes > 60)
{
ServerMinutes = 0;
ServerHours += 1;
}
if(ServerHours > 24) ServerHours = 0;
SetWorldTimeEx(ServerHours,ServerMinutes);
return 1;
}
Gracias
Reply
#2

Claro que si amigo, es mбs, puedes cambiarla cada minuto para que el dнa pase como en el mundo real. Aquн un ejemplo:

pawn Код:
enum
    TimeInfo
    {
        Hour,
        Minute,
        Second
    }

new
    Time[TimeInfo];
   
public OnGameModeInit()
{
    gettime(Time[Hour], Time[Minute], Time[Second]);
    SetWorldTime(Time[Hour]); // Esto es para que la hora cambie en el cliente externo.
    SetTimer("OneTimePerSecond", 999, true);
}

public OnPlayerConnect(playerid)
{
    SetTimerEx("SetInitialTime", 1, false, "i", playerid); // Esto es necesario por que la funciуn SetPlayerTime no funciona en OnPlayerConnect.
    return 1;
}

forward SetInitialTime(playerid);
public SetInitialTime(playerid)
{
    gettime(Time[Hour], Time[Minute], Time[Second]);
    SetPlayerTime(Time[Hour], Time[Minute]);
}

forward OneTimePerSecond();
public OneTimePerSecond()
{
    new
        h, m;
       
    gettime(Time[Hour], Time[Minute], Time[Second]);
    if((Time[Minute] == 0) && (Time[Second] == 0)) return SetWorldTime(Time[Hour]); // Lo mismo que en OnPlayerConnect.
    foreach(Playerid, i) // Si no usas la librerнa foreach, for(new i = 0; i < MAX_PLAYERS; i ++).
    {
        GetPlayerTime(h , m); // Para comparar con la nueva hora.
        if(m != Time[Minute]) SetPlayerTime(Time[Hour], Time[Minute]); // Si la hora cambiу y no se ha aplicado al jugador, se le pone la nueva hora.
    }
    return 1;
}
Cualquir duda, preguntala aquн.
Reply
#3

No sй si me entendiste bien, lo explico otra vez por si me expliquй mal, aunque quizбs estй equivocado yo y sea eso :P

A ver,

SetWorldTime(5);
SetWorldTime(6);

A las 5 de la maсana, en el juego es de noche, cuando pasa a las 6, se ve completamente de dia, el cielo cambia inmediatamente. Contando con que 1h ingame = 1h en la realidad, estarб 1 hora entera de noche (las 5) y al pasar a las 6 se harб de dia inmediatamente, entonces lo que yo pretendo es que el cielo vaya amaneciendo poco a poco, es decir, con un SetWorldTimeEx(horas,minutos);
Si ponemos los minutos el cielo cambiarб cada minuto en vez de cada hora, y no serб tan instantбneo.

No se si me he explicado bien, si el que estoy confundido soy yo y el cуdigo de arriba estб bien, lo siento :P
Reply
#4

Creo que entendн mal, entonces lo que quieres es que cuando decidas cambiar la hora, no lo haga de repente y la cambie poco a poco. El cуdigo que te dн sirve de base, lo que tienes que hacer es usar la funciуn SetPlayerTime en cada jugador en vez de usar SetWorldTime. Tienes que tener en mente que necesitas saber cuanto tiempo va a tardar de cambiar de hora a hora. Aquн una funciуn simple con un timer:

pawn Код:
new
    timer,
    Time[2] = {-1, -1};

forward ChangeTime(hour, minute);
public ChangeTime(hour, minute)
{
    if((Time[0] == hour) && (Time[1] == minute)) return KillTimer(timer);
    Time[1] ++;
    if(Time[1] > 59)
    {
        Time[1] = 0;
        Time[0] ++;
    }
    if(Time[0] > 23) Time[0] -= 24;  
    foreach(Player, i)
    {
        SetPlayerTime(i, Time[0], Time[1]);
    }
    return 1;
}

stock SetWorldTimeEx(hour, minute, duration) // duration es cuanto va a tardar para cambiar la hora.
{
    duration /= 60;
    GetPlayerTime(Itter_Random(Player), Time[0], Time[1]);
    timer = SetTimerEx("ChangeTime", duration, true, "ii", hour, minute);
}
Es un poco mбs complicado porque casi no tengo tiempo para hacerlo mбs simple pero espero que entiendas.
Reply
#5

Muchisimas gracias Miguel, tenнa algunos fallos pero los he corregido.

- Fallo 1: He cambiado Time[0] y [1] por ServerHours, ServerMinutes, ya que con Time[0] no funcionaba bien y pasaba de dia a noche directamente.
- Fallo 2: SetWorldTimeEx(hour, minute, duration); pusieras la hora que pusieras siempre empezaba en 0:00, ahora estб corregido para que empiece a la hora que pongas.

PD: Si quieres el cуdigo corregido dнmelo, ahora mismo no puedo ponerlo aquн.

Un Saludo y Gracias de nuevo.
Reply
#6

No, pero me alegro de que lo hallas resuelto tъ mismo.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)