Alguna forma de optimizar, Timers
#1

Hola!

Tengo una duda, Como ustedes saben, Estoy creando un GM de Cops 'N Robbers pero nunca lo he probado con mas de
4 players. Y no se si esto llegarнa a causar lag;

El sistema de robo es simple, cuando alguien lo roba, Creo una variable y creo un timer que vuelve a poner la variable a 0, Para que la tienda pueda ser robada otra vez, PERO... Tengo un Timer para cada tienda.

Si las 20 tiendas que tengo han sido robadas, tendrнa 20 timers corriendo al mismo tiempo.


Como podrнa optimizarlo?


Gracias por su atenciуn!
Reply
#2

en vez de tener 20 timers crea solo uno y 20 variables que chequeen si esta robada ejecutar la funcion dentro del timer
Reply
#3

Quote:
Originally Posted by xSDx
Посмотреть сообщение
en vez de tener 20 timers crea solo uno y 20 variables que chequeen si esta robada ejecutar la funcion dentro del timer
Claro,
pawn Код:
#define MAX_TIENDAS 20
new TiendaRobo[MAX_TIENDAS]; // o directamente [20]
uso:
pawn Код:
TiendaRobo[TIENDAID] = 0;
Reply
#4

un timer al iniciarse el server, algo asi
pawn Код:
public OnGameModeInit()
{
    SetTimerEx("CheckRob", 1000, true);
    return 1;
}

public CheckRob()
{
    for(new i; i < MAX_PLAYERS; i++) if(rob[i] == true)
    {
        //Code
    }
    return 1;
}
Reply
#5

La mejor forma es una convinacion de la solucion propuesta y para que sea representativo de tu primer aproximacion, registrar tiempos.

Ej:

pawn Код:
#include <a_samp>

//Macro indicando la cantidad maxima de tiendas
#define MAX_STORES        (100)
//Macro indicando en ms el tiempo que debe pasar para que una tienda pueda robarse nuevamente
#define ROB_TIME            (600000)

//Datos de la tienda que necesitaremos
enum ENUM_STORE_DATA
{
    bool:Created,//Este campo debe setearse a verdadero ('true') al crear una tienda nueva y a falso ('false') al destruir la misma
    bool:CanRob,//Representa si la tienda puede o no ser robada
    LastRob//Representa el ultimo momento en el cual la tienda fue robada
};

//Array para almacenar los datos de cada tienda
new Store[MAX_STORES][ENUM_STORE_DATA];

//Necesitamos crear nuestro timer al comienzo ya que sera 1 solo para todas las tiendas
public OnGameModeInit()
{
    SetTimer("CheckStores", 2500, 1);
    return 1;
}

//Esta es un callback representativo del momento en el que un usuario roba una tienda
forward OnStoreRobbed(storeid, robberid);
public OnStoreRobbed(storeid, robberid)
{
    Store[storeid][CanRob] = false;
    Store[storeid][LastRob] = gettime();
    return 1;
}

forward CheckStores();
public CheckStores()
{
    for(new i; i<MAX_STORES; i++)
    {
        if(!Store[i][Created] || Store[i][CanRob])
            continue;
        if((gettime() - Store[i][LastRob]) >= ROB_TIME)
            Store[i][CanRob] = true;
    }
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)