[Include] (Dica) (Funзхes) Chamar variбvel por strings
#1

Isto sгo como PVars. Sу que direcionado para variбveis qualquer nгo exclusiva ou dedicada para jogadores. Suporta o uso de strings. Nгo usa loops e coisas do tipo, й bastante rбpido

Variбveis:
- Dinвmicas
- Fбceis
- Rбpidas
- Eficientes

Salve como include:
pawn Код:
#define max_lines_cache         (999) // maximo de variaveis str
#define max_dep_memory          (256) // maximo de caracteres em cada var


stock bufferStrings[max_lines_file][max_dep_memory];
stock sizeMemory   = 0;

#define stringSet(%0,%1)        format(bufferStrings[(setproperty(0, .name=%0, .value=( existproperty(0, %0) ) ? getproperty(0,%0) : ++sizeMemory),sizeMemory)], max_dep_memory, %1)
#define stringGet(%0)           bufferStrings[getproperty(0,%0)]

#define varGet(%0)              getproperty(0,%0)
#define varSet(%0,%1)           setproperty(0, %0, %1)

// Alocar na memуria floats. Armazenamento simples. c/ parse
#define floatSet(%0,%1)         varSet(%0,_:%1)
#define floatGet(%0)            float:varGet(%0)

// Alocar na memуria bools. Armazenamento simples. c/ parse
#define boolSet(%0,%1)          varSet(%0,_:%1)
#define boolGet(%0)             bool:varGet(%0)

Exemplos
pawn Код:
public OnFilterScriptInit() {
    // acessar string por string. Exemplo:
    stringSet("bruno1", "bruno");
    stringSet("bruno1", "dai galero");

    stringSet("samp", "pawn");
    stringSet("memoria", "salvando na memoria");

    print("Strings:");
    print(stringGet("bruno1"));
    print(stringGet("samp"));
    print(stringGet("memoria"));

    // acessar variбveis com string. Exemplo:
    varSet("pawn1",10);
    varSet("pawn1",20);

    varSet("gta",30);
    varSet("variavel",40);

    print("Inteiros:");
    printf("%d", varGet("pawn1"));
    printf("%d", varGet("gta"));
    printf("%d", varGet("variavel"));
   
    // acessar floats por string. Exemplo:
    boolSet("vida", true);
    boolSet("vida", false);
   
    boolSet("grana", true);
    boolSet("colete", true);
   
    print("Boolean:");
    printf("%d", boolGet("vida"));
    printf("%d", boolGet("grana"));
    printf("%d", boolGet("colete"));

    // acessar boolean por string. Exemplo:

    floatSet("vida", 3.23);
    floatSet("vida", 3.24);

    floatSet("grana", 4.40);
    floatSet("colete", 8.39);

    print("Floats:");
    printf("%f", floatGet("vida"));
    printf("%f", floatGet("grana"));
    printf("%f", floatGet("colete"));
    return true;
}


Para que serviria isto?
Simples, podemos usar isto para manipular desde pequenos fragmentos de cуdigos usando variбveis alternativas e de fбcil reconhecimento, como tambйm fazer variбveis e tempo real!

Variбveis dinвmicas
Exemplo de uma array para um nickname com dados boleanos na string

pawn Код:
//Colocando o valor
stringSet("[iPs]Bruno", "101"); // xxx = vida colete dinheiro
   
// Pegando o valor.
new arrayPlayer[32];
arrayPlayer = stringGet("[iPs]Bruno");
   
// 101
if(arrayPlayer{0} == 1) {
    print("o usuario [iPs]Bruno tem o primeiro parametro de vida ATIVADO"); // observe "1"01
}
// 101
if(arrayPlayer{1} == 1) {
    print("o usuario [iPs]Bruno tem o primeiro parametro de colete DESATIVADO"); // observer 1"0"1
}
// 101
if(arrayPlayer{1} == 1) {
    print("o usuario [iPs]Bruno tem o primeiro parametro de colete ATIVO"); // observer 10"1"
}

Nгo apenas para este uso, tambйm podemos usar isto para outros dados do servidor
pawn Код:
stringSet("websitedoserver", "www.brunodasilva.com.br");
    stringSet("dinheiroativado?", "ativado");
Outra coisa interessante. Este sistema serve como um avanзado e monstruoso sistema de salvamento de arquivos
Adicionando isto a um sistema ini qualquer pode-se aumentar DRБSTICAMENTE A VELOCIDADE de salvamento e arquivos, superando qualquer sistema atual pois funciona como um bom sistema de cache, sem o uso de strcmp para checar as strings na array ou atй mesmo loops.


Exemplo
pawn Код:
stock INI_ParseFile(file[], callback[] = "") {

    static
        File:open,
        stringValue[128],
        stringBuffer[128], i;
   
    open = fopen(file, io_read);
   
    while(fread(open, stringBuffer)) {
   
        stringBuffer[strlen(stringBuffer) - 2] = EOS;
       
        if((i = strfind(stringBuffer, "=", false)) != -1) {
            strmid(stringValue, stringBuffer, 0, i);
            format(stringBuffer, 128, stringBuffer[i +1]);
           
            stringSet(stringValue, stringBuffer);
        }
    }
    return CallLocalFunction(callback, "");
}
Tem a mesma funзгo desta include:
-> https://sampforum.blast.hk/showthread.php?tid=162890

Porйm o algorнtimo/lуgica que eu usei usa um sisteminha de setproperty .. Sendo mais otimizado (bastante mais rбpido)


** Atualizado 17/06/2012 as 11:44 - Informaзгo importante.
Como surgiu um problema ao atualizar as variбveis e eu nгo soube como resolver. Resolvi passar o sistema de variбveis strings para variбveis ESTБTICAS .. Permanece tudo igual, sу mudou a forma interna de como a include aloca os dados na memуria. Alocando em arrays padrхes, mas usando uma gambiarra para gravar o caminho onde foi gravada a string. Alteraзгo sу pra strng

** PVars - Informaзгo importante.
Quote:
Originally Posted by CidadeNovaRP
Посмотреть сообщение
SetPVarFloat, SetPVarString, SetPVarInt e com um simples #define SetPVarBool, e seus Get's, estб й a funзгo desta include, mas sem o playerid -q
Usar variбveis globais em PVars farб vocк literalmente se ferrar. Primeiro que caso o jogador desconecte a variбvel serб resetada. Segundo que caso o jogador esteja offline o valor da variбvel nem serб colocado. E terceiro, que PVars sгo muitas vezes lentas, apesar de dinвmicas. Neste caso, aconselho minha include.

Crйditos
-> https://sampwiki.blast.hk/wiki/Functionetproperty
-> Bruno da Silva (eu)

Se tiver bugs avisem. Nгo testei bem.
Reply
#2

Muito bom Drakins.
Isso й como se fosse orientado a objetos.
Reply
#3

Interessante, й melhor que ficar abrindo e fechando arquivos pelo gm a fora.
Gostei
Reply
#4

legal *.*
Reply
#5

Ah sim. Isto pode ser usado em filterscript e gamemodes. Quando uma variбvel й setada no gamemode ela tambйm й setada no filterscript. Podendo fazer a interligaзгo sem muita dificuldade

Jб crio as funзхes para float e bool.
Reply
#6

Fiz alguns testes aqui e resultaram:
(DRAKINS) Time:152
(SII) Time: 468

Nгo sei se estб correto. Olha ae o cуdigo que usei:
Olha que nem usei variбveis no SII '-'

PHP код:
#define maxtest (1000)

public OnGameModeInit()
{
    
//Drakins
    
new bTick GetTickCount();
    
varSet("Time"666999777);
    
varSet("Time2"100000);
    new 
string[32];
    
    for(new 
ii<maxtest;i++) 
    {
        new 
File:open fopen("Tiste.ini"io_write);
        
format(string11"%d\n",varGet("Time"));
        
format(string15"%d%d",stringvarGet("Time2"));
        
fwrite(openstring);
        
fclose(open);
    }
    
printf("(DRAKINS) Time: %d"GetTickCount()-bTick);
    
    
// SII
    
bTick GetTickCount();
    for(new 
i;i<maxtest;i++) {
        if(
INI_Open("Teste.ini")) {
            
INI_WriteInt("Time"666999777);
            
INI_WriteInt("Time2"100000);
            
INI_Save();
            
INI_Close();
        }
    }
    
printf("(SII) Time: %d"GetTickCount()-bTick);
    return 
true;

Reply
#7

Isso nгo entra na minha cabeзa vei... PQP.
Reply
#8

Quote:
Originally Posted by Edu33
View Post
Isso nгo entra na minha cabeзa vei... PQP.
Й simples cara, й como programaзгo orientada a objetos.
http://www.criarweb.com/artigos/215.php -- Leia
Reply
#9

Eu faзo uma coisa no meu GM nгo sei se й optimizado, mas prefiro, tudo que for para salvar em arquivos eu nгo uso variбveis, pego todos os dados necessбrios em tempo real no arquivo!
Mas й uma уtima include!
Reply
#10

Quote:
Originally Posted by paulor
View Post
Eu faзo uma coisa no meu GM nгo sei se й optimizado, mas prefiro, tudo que for para salvar em arquivos eu nгo uso variбveis, pego todos os dados necessбrios em tempo real no arquivo!
Mas й uma уtima include!
Creio que nгo seja optimizado.
Entгo vocк nгo usa PlayerInfo, etc?
Reply
#11

Usando o code do bruno pereira veja a velocidade, o code do drakins й 2 vezes mais rбpido O_O !

Reply
#12

Quote:
Originally Posted by Bruno Pereira
View Post
Creio que nгo seja optimizado.
Entгo vocк nгo usa PlayerInfo, etc?
Isso, tbm penso que nгo seja, mais nгo confio em deixar dados em vars!
Reply
#13

bem interessante, gostei (:
Reply
#14

Nгo й otimizado pegar tudo em tempo real nгo. Mas й seguro Gente isto й variбveis linkadas por strings, nгo й um sistema de arquivo, apesar de poder adaptar a um
Reply
#15

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Nгo й otimizado pegar tudo em tempo real nгo. Mas й seguro Gente isto й variбveis linkadas por strings, nгo й um sistema de arquivo, apesar de poder adaptar a um
Eu sei, mas se adapta-las irб ficar VERY FAST
Reply
#16

Quote:
Originally Posted by Bruno Pereira
View Post
Eu sei, mas se adapta-las irб ficar VERY FAST
Ahan, sу falei pra avisar os outros que entram no tуpico. Comparar com sistemas de arquivos pode parecer com que o pessoal ache que se trate de um sistema de arquivos, concorda?

Mas sim, se adaptar isto a um arquivo, ficam extremamente rбpidas.
Reply
#17

Qual a ъtilidade? Setar variбveis? Nгo entendi muito bem pra que serve.
Reply
#18

Quote:
Originally Posted by Kuddy
View Post
Qual a ъtilidade? Setar variбveis? Nгo entendi muito bem pra que serve.
Colocar valor em variбveis usando string. Assim vocк pode digamos alterar uma variбvel atravйs de um comando. Quando usando variбveis normais vocк nгo poderia, pois teria que especificar cada uma


stringSet(cmdtext[5], "1");

Note que cmdtext serб uma variбvel, caso o usuario digite
/teste OI

Irб mudar o valor de "oi" para 1

Caso digite

/teste SAMP

Irб mudar o valor de "SAMP" para um

Sem precisar de condicionais, pois й tudo feito em string.

_

Por isto variбveis dinвmicas. Porque vocк pode definir qual usar a qualquer momento, atй mesmo dentro do jogo em um comando
Reply
#19

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Colocar valor em variбveis usando string. Assim vocк pode digamos alterar uma variбvel atravйs de um comando. Quando usando variбveis normais vocк nгo poderia, pois teria que especificar cada uma


stringSet(cmdtext[5], "1");

Note que cmdtext serб uma variбvel, caso o usuario digite
/teste OI

Irб mudar o valor de "oi" para 1

Caso digite

/teste SAMP

Irб mudar o valor de "SAMP" para um

Sem precisar de condicionais, pois й tudo feito em string.

_

Por isto variбveis dinвmicas. Porque vocк pode definir qual usar a qualquer momento, atй mesmo dentro do jogo em um comando
Sem precisar fazer comparaзхes.
Se fosse normal teria que usar strcmp ou atй loops xD
Reply
#20

Quote:
Originally Posted by [FeK]DraKiNs
View Post
Colocar valor em variбveis usando string. Assim vocк pode digamos alterar uma variбvel atravйs de um comando. Quando usando variбveis normais vocк nгo poderia, pois teria que especificar cada uma


stringSet(cmdtext[5], "1");

Note que cmdtext serб uma variбvel, caso o usuario digite
/teste OI

Irб mudar o valor de "oi" para 1

Caso digite

/teste SAMP

Irб mudar o valor de "SAMP" para um

Sem precisar de condicionais, pois й tudo feito em string.

_

Por isto variбveis dinвmicas. Porque vocк pode definir qual usar a qualquer momento, atй mesmo dentro do jogo em um comando
Hmm, entendi ;P
Reply


Forum Jump:


Users browsing this thread: 5 Guest(s)