[Include] CNStreamer - O melhor Streamer BR, serб? ^^
#1

Bem, este Streamer tem um uso muito simples, basta adiciona-lу como Include e dar cerca de 10 cliques para configura-lo, teste ele em 2 mapas do dMagnus, que sгo:
https://sampforum.blast.hk/showthread.php?tid=273170
e
https://sampforum.blast.hk/showthread.php?tid=282440
Ambos nгo deram lag nem crash, mas ainda, como todos os outros Streamer's, ha a possibilidade de dar crash se houver muitos objetos em um local sу, isso serб corrigido na prуxima versгo onde serб deletado os objetos mais longes do jogador para que nгo houva uma explosгo no limite de objetos por jogador do SA-MP.

O cуdigo segue abaixo:
pawn Код:
#include <a_samp>



/*                  Configuraзгo:      Valor:    */
      #define       MAX_OBJECTOS       2500
      #define       MIN_INTERVAL       0500
      #define       MAX_DISTANCE       300.0
/*                                               */



#define Loop(%0,%1) for(new %0; %0 < %1; ++%0)
#define Function%0(%1) forward %0(%1); \
public %0(%1)

enum ObjetoI
{
    Model,
    Virtual,
    Interior,
    Float:Draw,
    Float:X,
    Float:Y,
    Float:Z,
    Float:rX,
    Float:rY,
    Float:rZ,
    bool:Criado,
    bool:Movendo
}

enum ObjetoD
{
    Float:X,
    Float:Y,
    Float:Z,
    Float:rX,
    Float:rY,
    Float:rZ,
    Float:Velocidade
}

new ObjetoInfo[MAX_OBJECTOS][ObjetoI], ObjetoData[MAX_OBJECTOS][ObjetoD], ObjectPlayer[MAX_PLAYERS][MAX_OBJECTOS];
new ObjetosCriados[MAX_PLAYERS];

/*
Funзгo
    - cria um objeto definido
Returno
    - returna a o id do objeto criado
Parametros
    - model, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:velocidade, virtualworld, interior
Observaзхes
    - nenhuma
*/

stock CreateObjectEx(model, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:draw = MAX_DISTANCE, virtualworld = 0, interior = 0)
{
    new objid;
    while(objid < MAX_OBJECTOS)
    {
        static bool:AntiFlood;
        if(objid == MAX_OBJECTOS-1 && AntiFlood == false) printf("Limite de %d objetos exedido. Aumente o limite ou retire objetos.", MAX_OBJECTOS), AntiFlood = true;
        if(ObjetoInfo[objid][Criado] == false)
        {
            ObjetoInfo[objid][Criado] = true;
            ObjetoInfo[objid][Model] = model;
            ObjetoInfo[objid][Interior] = interior;
            ObjetoInfo[objid][Virtual] = virtualworld;
            ObjetoInfo[objid][Draw] = draw;
            ObjetoInfo[objid][rZ] = rz;
            ObjetoInfo[objid][rY] = ry;
            ObjetoInfo[objid][rX] = rx;
            ObjetoInfo[objid][Z] = z;
            ObjetoInfo[objid][Y] = y;
            ObjetoInfo[objid][X] = x;
            break;
        }
        ++objid;
    }
    return objid;
}

/*
Funзгo
    - move um objeto definido
Returno
    - returna a 1
Parametros
    - objid, Float:x, Float:y, Float:z, Float:velocidade, Float:rx, Float:ry, Float:rz
Observaзхes
    - nenhuma
*/

stock MoveObjectEx(objid, Float:x, Float:y, Float:z, Float:velocidade, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
{
    if(rx == -1000.0) rx = ObjetoInfo[objid][rX];
    else if(ry == -1000.0) ry = ObjetoInfo[objid][rY];
    else if(rz == -1000.0) rz = ObjetoInfo[objid][rZ];
    ObjetoInfo[objid][Movendo] = true;
    ObjetoData[objid][rZ] = rz;
    ObjetoData[objid][rY] = ry;
    ObjetoData[objid][rX] = rx;
    ObjetoData[objid][Z] = z;
    ObjetoData[objid][Y] = y;
    ObjetoData[objid][X] = x;
    ObjetoData[objid][Velocidade] = velocidade;
    return 1;
}

/*
Funзгo
    - para um objeto definido
Returno
    - returna a 1
Parametros
    - objid
Observaзхes
    - ao parar o objeto chama automaticamente a callback "OnObjectMoved"
*/

stock StopObjectEx(objid)
{
    ObjetoInfo[objid][Movendo] = false;
    CallRemoteFunction("OnObjectMoved", "i", objid);
    Loop(i, MAX_PLAYERS)
    {
        StopPlayerObject(i, objid);
    }
    return 1;
}

/*
Funзгo
    - seta o objeto a pos definida
Returno
    - returna a 1
Parametros
    - objid, Float:x, Float:y, Float:z
Observaзхes
    - ao usar a funзгo "SetObjectPosEx", o objeto nгo para da se mover (caso esteja se movendo)
*/

stock SetObjectPosEx(objid, Float:x, Float:y, Float:z)
{
    ObjetoInfo[objid][Z] = z;
    ObjetoInfo[objid][Y] = y;
    ObjetoInfo[objid][X] = x;
    Loop(i, MAX_PLAYERS)
    {
        SetPlayerObjectPos(i, objid, x, y, z);
    }
    return 1;
}

/*
Funзгo
    - seta o objeto a rotaзгo definida
Returno
    - returna a 1
Parametros
    - objid, Float:rx, Float:ry, Float:rz
Observaзхes
    - nenhuma
*/

stock SetObjectRotEx(objid, Float:rx, Float:ry, Float:rz)
{
    ObjetoInfo[objid][rZ] = rz;
    ObjetoInfo[objid][rY] = ry;
    ObjetoInfo[objid][rX] = rx;
    Loop(i, MAX_PLAYERS)
    {
        SetPlayerObjectRot(i, objid, rx, ry, rz);
    }
    return 1;
}

/*
Funзгo
    - destroi o objeto definido
Returno
    - returna a 1
Parametros
    - objid
Observaзхes
    - nenhuma
*/

stock DestroyObjectEx(objid)
{
    if(ObjetoInfo[objid][Movendo] == true) StopObjectEx(objid);
    ObjetoInfo[objid][Criado] = false;
    return 1;
}

/*
Funзгo
    - verifica se o objeto й valido
Returno
    - returna a 1 se for valido e 0 se nгo
Parametros
    - objid
Observaзхes
    - nenhuma
*/

stock IsValidObjectEx(objid)
{
    if(ObjetoInfo[objid][Criado] == true) return 1;
    return 0;
}

/*
Funзгo
    - geta as coordenadas de um objeto definido
Returno
    - returna a 1
Parametros
    - objid, &Float:x, &Float:y, &Float:z
Observaзхes
    - nenhuma
*/

stock GetObjectPosEx(objid, &Float:x, &Float:y, &Float:z)
{
    z = ObjetoInfo[objid][Z];
    y = ObjetoInfo[objid][Y];
    z = ObjetoInfo[objid][X];
    return 1;
}

/*
Funзгo
    - geta as rotaзхes de um objeto definido
Returno
    - returna a 1
Parametros
    - objid, &Float:rx, &Float:ry, &Float:rz
Observaзхes
    - nenhuma
*/

stock GetObjectRotEx(objid, &Float:rx, &Float:ry, &Float:rz)
{
    rz = ObjetoInfo[objid][rZ];
    ry = ObjetoInfo[objid][rY];
    rz = ObjetoInfo[objid][rX];
    return 1;
}

/*
Funзгo
    - seta o interior de um objeto definido
Returno
    - returna a 1
Parametros
    - objid, interior
Observaзхes
    - nenhuma
*/

stock SetObjectInterior(objid, interior)
{
    ObjetoInfo[objid][Interior] = interior;
    return 1;
}

/*
Funзгo
    - seta o virtual world de um objeto definido
Returno
    - returna a 1
Parametros
    - objid, interior
Observaзхes
    - virtualworld
*/

stock SetObjectVirtualWorld(objid, virtualworld)
{
    ObjetoInfo[objid][Virtual] = virtualworld;
    return 1;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-( Atualizar os Objetos )-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
Function AtualizarObjetos()
{
    Loop(i, MAX_PLAYERS)
    {
        if(!IsPlayerConnected(i)) continue;
        Loop(objid, MAX_OBJECTOS)
        {
            if(GetPlayerInterior(i) == ObjetoInfo[objid][Interior] && GetPlayerVirtualWorld(i) == ObjetoInfo[objid][Virtual] && IsPlayerInRangeOfPoint(i, ObjetoInfo[objid][Draw], ObjetoInfo[objid][X], ObjetoInfo[objid][Y], ObjetoInfo[objid][Z]) && ObjetoInfo[objid][Criado] == true)
            {
                if(ObjectPlayer[i][objid] == -1)
                {
                    if(ObjetosCriados[i] >= 950) DestroyObjectFromDistance(i), --ObjetosCriados[i];
                    ++ObjetosCriados[i];
                    ObjectPlayer[i][objid] = CreatePlayerObject(i, ObjetoInfo[objid][Model], ObjetoInfo[objid][X], ObjetoInfo[objid][Y], ObjetoInfo[objid][Z], ObjetoInfo[objid][rX], ObjetoInfo[objid][rY], ObjetoInfo[objid][rZ]);
                    if(ObjetoInfo[objid][Movendo] == true) MovePlayerObject(i, ObjectPlayer[objid][i], ObjetoData[objid][X], ObjetoData[objid][Y], ObjetoData[objid][Z], ObjetoData[objid][Velocidade], ObjetoData[objid][rX], ObjetoData[objid][rY], ObjetoData[objid][rZ]);
                }
            }
            else
            {
                DestroyPlayerObject(i, ObjectPlayer[i][objid]);
                ObjectPlayer[i][objid] = -1;
            }
        }
    }
    return 1;
}

stock DestroyObjectFromDistance(playerid)
{
    new Float:objectPos[3], Float:playerDistance = 100000.0, objectId;
    Loop(objid, MAX_OBJECTS)
    {
        GetObjectPos(objid, objectPos[0], objectPos[1], objectPos[2]);
        if(GetPlayerDistanceFromPoint(playerid, objectPos[0], objectPos[1], objectPos[2]) < playerDistance)
        {
            playerDistance = GetPlayerDistanceFromPoint(playerid, objectPos[0], objectPos[1], objectPos[2]);
            objectId = objid;
        }
    }
    DestroyPlayerObject(playerid, objectId);
    return 1;
}

#if defined FILTERSCRIPT
public OnFilterScriptInit()
#else
public OnGameModeInit()
#endif
{
        SetTimer("AtualizarObjetos", MIN_INTERVAL, true);
#if defined FILTERSCRIPT
        return (funcidx("ALSS_OnFilterScriptInit") != -1 ? CallLocalFunction("ALSS_OnFilterScriptInit", "") : 1);
}
        #if defined _ALS_OnFilterScriptInit
                #undef OnFilterScriptInit
        #else
                #define _ALS_OnFilterScriptInit
        #endif
        #define OnFilterScriptInit ALSS_OnFilterScriptInit
forward ALSS_OnFilterScriptInit();
#else
        return (funcidx("ALSS_OnGameModeInit") != -1 ? CallLocalFunction("ALSS_OnGameModeInit", "") : 1);
}
        #if defined _ALS_OnGameModeInit
                #undef OnGameModeInit
        #else
                #define _ALS_OnGameModeInit
        #endif
        #define OnGameModeInit ALSS_OnGameModeInit
forward ALSS_OnGameModeInit();
#endif

//Peguei estб ALS desta Include: http://pastebin.com/d4hfMvQx

public OnPlayerObjectMoved(playerid, objectid)
{
    ObjetoInfo[objectid][Movendo] = false;
    ObjetoInfo[objectid][X] = ObjetoData[objectid][X];
    ObjetoInfo[objectid][Y] = ObjetoData[objectid][Y];
    ObjetoInfo[objectid][Z] = ObjetoData[objectid][Z];
    ObjetoInfo[objectid][rX] = ObjetoData[objectid][rX];
    ObjetoInfo[objectid][rY] = ObjetoData[objectid][rY];
    ObjetoInfo[objectid][rZ] = ObjetoData[objectid][rZ];
    CallRemoteFunction("OnObjectMoved", "i", objectid);
    return 1;
}
#if defined _ALS_OnPlayerObjectMoved
    #undef OnPlayerObjectMoved
#else
    #define _ALS_OnPlayerObjectMoved
#endif
#define OnPlayerObjectMoved gb_OnPlayerObjectMoved
forward gb_OnPlayerObjectMoved(playerid, objectid);

#define CreateObject CreateObjectEx
#define MoveObject MoveObjectEx
#define StopObject StopObjectEx
#define SetObjectPos SetObjectPosEx
#define SetObjectRot SetObjectRotEx
#define DestroyObject DestroyObjectEx
#define IsValidObject IsValidObjectEx
#define GetObjectPos GetObjectPosEx
#define GetObjectRot GetObjectRotEx
A Configuraзгo fica logo no topo da Include. A Include pesa um pouco em seu GameMode, mas nгo irб dar lag nem nada no GamePlay ^^

Include Atualizada, agora com a funзгo "No-Crash" e "Livre-Slot".
A funзгo No-Crash, ao exceder o limite de objetos permitido por jogador pelo SA-MP, o Streamer deleta automaticamente o objeto mais distante do jogador, jб a funзгo Livre-Slot, nгo й usado mais o ++Objetos, jб que os objetos agora sгo preenchidos/criados por slots, ou seja, caso vocк delete o objeto 30 e tenha 100 objetos, o slot 30 serб liberado podendo criar mais um objeto nele

Prуs
  1. Chega de crashs;
  2. Chega de lag;
  3. Aguenta quantos objetos vocк quiser;
  4. Nгo precisa fazer alteraзхes em seu cуdigo;
  5. Fбcil instalзгo;
Contras
  1. Pode pesar bastante seu .amx; *
* Depende do MAX_OBJECTOS (OBJECTOS mesmo, pois queria deixar tudo retinho nas configs ) e do MAX_PLAYERS, por isso recomendo que atualize constantemente seu MAX_PLAYERS e MAX_OBJECTOS com os valores que realmente serгo usados. Ou coloque os Objetos em um FS para que nгo haja latкncia na hora da COMPILAЗГO.



OBS: Ainda haverб novas atualizaзхes.
Reply
#2

Muito bom o streamer .. Mas existem vбrias desotimizaзхes no cуdigo, pra mim nгo й o melhor. rs

Espera eu atualizar:
https://sampforum.blast.hk/showthread.php?tid=287831
Reply
#3

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Muito bom o streamer .. Mas existem vбrias desotimizaзхes no cуdigo, pra mim nгo й o melhor. rs
Sim, sim, eu fiz ele principalmente para nгo da crash toda hora, mas amanhг irб ter novas atualizaзхes, tem muita coisa que pode ser otimizada neste CODE ainda
Reply
#4

Nossa meus parabйns meu amor, a cada dia me apaixono mais!
Reply
#5

Bom.
Reply
#6

Bom.І

Se eu tiver um map jб em CreateStreamedObject como faзo? :$
Reply
#7

Isto suporta quantos objetos ?


Nice job.
Reply
#8

Уtimo FilterScript

[Porem nгo recomendo porque utiliza muito da memуria AMX]
OBS: Experiкncia Prуpria!
Reply
#9

Quote:

Ambos nгo deram lag nem crash, mas ainda, como todos os outros Streamer's, ha a possibilidade de dar crash se houver muitos objetos em um local sу, isso serб corrigido na prуxima versгo onde serб deletado os objetos mais longes do jogador para que nгo houva uma explosгo no limite de objetos por jogador do SA-MP.
Fluxo Stream ??
Reply
#10

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Fluxo Stream ??
Nao intendi '-'

Ele suporta quantos objetos voce definir, para trocar do stream basta dar ctrl f e trocar por CreateObject normal
Obrigado a todos!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)