05.01.2013, 08:44
Provavelmente й problema no foreach, lembro que teve algum problema assim .. Vou dar uma olhada aqui
EDIT:
Em streamer.pwn deixe da seguinte maneira:
Aqui funcionou corretamente sem deletar objetos. Era o foreach mesmo, vou atualizar para deixar isto rбpido.
Abraзos
carregou uma cidade inteira aqui.
EDIT 2:
Coloquei um sistema de loops simples e rбpido, sу testar agora rapaz!
EDIT:
Em streamer.pwn deixe da seguinte maneira:
pawn Код:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// [iPs]TeaM Object Streamer 0.3d (V2)
// Author: Bruno da Silva
// http://www.ips-team.blogspot.com
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <a_samp>
#define MAX_STREAM 05000
#define MIN_INTERVAL 00500
#define function%0(%1) %0(%1); public %0(%1)
static i ;
#define foreach() \
for( i = MaxPlayers; i > -1; i--) if(IsPlayerConnected(i))
// ===================== [ Declarar Variaveis ] ================================
stock static
MaxPlayers,
bool:objetoDeletado[MAX_PLAYERS][MAX_STREAM],
objetoCriado[MAX_STREAM],
Float:objetoDistancia[MAX_PLAYERS],
structObject[MAX_STREAM char],
objetoIdd[MAX_STREAM],
Float:dataObject[MAX_STREAM][7],
objetoConfigs[MAX_STREAM][2],
objetosCriados[MAX_PLAYERS],
objetoNumero[MAX_PLAYERS],
objectModel[MAX_STREAM],
objdetoIdd[MAX_STREAM],
objCriados = 0;
// ========================== [ Funзхes ] ======================================
public OnFilterScriptInit()
{
MaxPlayers = GetMaxPlayers();
return SetTimer("ObjectUpdate", MIN_INTERVAL, true);
}
function createObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance, interior, worldids)
{
if(MAX_STREAM - 1 == objCriados) {
print("[ERRO] Informaзгo acessada invбlida (objeto numero " #MAX_STREAM - 1 " )");
return false;
}
++objCriados;
objectModel[objCriados] = modelid;
dataObject[objCriados][0] = X;
dataObject[objCriados][1] = Y;
dataObject[objCriados][2] = Z;
dataObject[objCriados][3] = rX;
dataObject[objCriados][4] = rY;
dataObject[objCriados][5] = rZ;
objetoConfigs[objCriados][0] = worldids;
objetoConfigs[objCriados][1] = interior;
dataObject[objCriados][6] = DrawDistance;
structObject{objCriados} = 1;
return objCriados;
}
function deleteObject(objectid)
{
foreach()
{
DestroyPlayerObject(i, objectid);
dataObject[objectid][0] = 0;
dataObject[objectid][1] = 0;
dataObject[objectid][2] = 0;
dataObject[objectid][3] = 0;
dataObject[objectid][4] = 0;
dataObject[objectid][5] = 0;
dataObject[objectid][6] = 0;
objetoIdd[objectid] = 0;
objectModel[objectid] = 0;
objetoConfigs[objectid][0] = 0;
objetoConfigs[objectid][1] = 0;
structObject{objectid} = 0;
}
return true;
}
function moveObject(objectid, Float:pX, Float:pY, Float:pZ, Float:Speed, Float:rotX, Float:rotY, Float:rotZ)
{
foreach() {
dataObject[objectid][0] = pX;
dataObject[objectid][1] = pY;
dataObject[objectid][2] = pZ;
#if defined PlayAudioStreamForPlayer
{
MovePlayerObject(i, objectid, pX, pY, pZ, Speed, rotX, rotY, rotZ);
}
#else
{
MovePlayerObject(i, objectid, pX, pY, pZ, Speed);
}
#endif
}
return 1;
}
function ObjectUpdate()
{
static objetoPerto;
foreach()
{
for(new o ; o != MAX_STREAM; o++)
{
if(structObject{o})
{
objetoPerto = IsPlayerInRangeOfPoint(i, dataObject[o][6], dataObject[o][0], dataObject[o][1], dataObject[o][2]);
if(objetoPerto && !objetoCriado[o] && GetPlayerVirtualWorld(i) == objetoConfigs[o][0] && GetPlayerInterior(i) == objetoConfigs[o][1]) {
static
Float: px,
Float: py,
Float: pz,
Float: pd;
GetPlayerPos(i, px, py, pz);
px -= dataObject[o][0];
py -= dataObject[o][1];
pz -= dataObject[o][2];
pd = floatsqroot((px * px) + (py * py) + (pz * pz));
if(pd > objetoDistancia[i]) {
objetoDistancia[i] = pd;
objetoNumero[i] = o;
}
// criar ojeto
++objetoCriado[o];
++objetosCriados[i];
objetoIdd[o] = CreatePlayerObject(i, objectModel[o], dataObject[o][0], dataObject[o][1], dataObject[o][2], dataObject[o][3], dataObject[o][4], dataObject[o][5], dataObject[o][6]);
// tirar objeto caso limite for ultrapssado
if(objetosCriados[i] > (MAX_OBJECTS - 50)) { // PREVENT CRASH
DestroyPlayerObject(i, objetoIdd[objetoNumero[i]]);
objetoDistancia[i] = 0.0;
--objetosCriados[i];
--objetoCriado[o];
}
continue;
}
if(objetoPerto && !objetoCriado[o]) {
DestroyPlayerObject(i, objetoIdd[o]);
--objetoCriado[o];
--objetosCriados[i];
}
}
}
}
return true;
}
// streamer.pwn
Aqui funcionou corretamente sem deletar objetos. Era o foreach mesmo, vou atualizar para deixar isto rбpido.
Abraзos
carregou uma cidade inteira aqui.
EDIT 2:
Coloquei um sistema de loops simples e rбpido, sу testar agora rapaz!