04.10.2012, 18:12
foreach no funciona solo para jugadores. Es un bucle mediante iteradores, por eso es mucho mas eficiente que cualquier bucle a travez de los jugadores, pero pueden agregarse iteradores personalizados y utilizarlos.
Esto puede realizarse mediante la funcion:
Donde name, representa el nombre del Iterador al cual se le asignara el elemento llamado value.
Ejemplo:
Para mas informacion sobre foreach lean el topico de su lanzamiento, que comprenderan mucho mejor su gran capacidad.
Nota: Para que el script ejemplo que deje, funcione correctamente, deberian agregarse las funciones en cada script y se deberia definir el iterador de forma tal que el mismo sea comun a todos los scripts (Deberia editarse el include para utilizar CallRemoteFunction y acceder a una funcion declarada en el GM para acceder al iterador correspondiente, algo no muy sensillo).
Esto puede realizarse mediante la funcion:
pawn Код:
Iter_Add(name, value);
Ejemplo:
pawn Код:
//Declaracion de nuestro nuevo iterador:
new Iterator:Vehicles<MAX_VEHICLES>;
//hookeamos un par de funciones para el correcto uso del mismo
stock _AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new veh = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2)
if(veh != INVALID_VEHICLE_ID)
Iter_Add(Vehicles, veh);
return veh;
}
#define AddStaticVehicle _AddStaticVehicle
stock _AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new veh = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2, respawn_delay)
if(veh != INVALID_VEHICLE_ID)
Iter_Add(Vehicles, veh);
return veh;
}
#define AddStaticVehicleEx _AddStaticVehicleEx
stock _CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new veh = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawn_delay);
if(veh != INVALID_VEHICLE_ID)
Iter_Add(Vehicles, veh);
return veh;
}
#define CreateVehicle _CreateVehicle
stock _DestroyVehicle(vehicleid)
{
if(DestroyVehicle(vehicleid))
{
Iter_Remove(Vehicles, vehicleid);
return 1;
}
return 0;
}
#define DestroyVehicle _DestroyVehicle
//1є posible uso:
new Float:heath;
foreach(new i : Vehicles)
{
GetVehicleHealth(i, health);
printf("La vida del vehiculo %i es: %.3f", i, health);
}
//2є posible uso:
printf("Hay %i vehiculos creados", Iter_Count(Vehicles));
Nota: Para que el script ejemplo que deje, funcione correctamente, deberian agregarse las funciones en cada script y se deberia definir el iterador de forma tal que el mismo sea comun a todos los scripts (Deberia editarse el include para utilizar CallRemoteFunction y acceder a una funcion declarada en el GM para acceder al iterador correspondiente, algo no muy sensillo).