[Tutorial] usando iBits
#1

Introduзгo

A utilizaзгo deste tуpico ficarб para dъvidas correntes a respeito do iBits, tutorial para quem tem o interesse de entender mais a respeito do iBits e suas funcionalidades, e quem pretende utilizar a include em seus sistemas.
  • Caso contrбrio este tutorial nгo lhe servirб.
A introduзгo a respeito da iBits jб foi feita no seu devido tуpico: beta iBits

(OBS): Dъvidas a respeito do funcionamento da iBits poderгo ser tirados no tуpico de apresentaзгo da include.





Apresentaзгo

Code:
1 bit:

	- Acumula apenas 2 valores(0/1), logo pode se recomendar a substituiзгo por vars booleanas.
	- Os valores sгo manipulados com as funзхes: setBit1, getBit1.


-----------------------------------------------------------------------------------------------------

2 bits:

	- Acumula 4 valores(0, 1, 2, 3), valores acima disso deverгo utilizar bits maiores.
	- Os valores sгo manipulados com as funзхes: setBit2, getBit2.
	- Й uma boa variбvel para se usar em sistemas de administraзгo com atй 3 nнveis, por ser economico o suficiente.


-----------------------------------------------------------------------------------------------------

4 bits:

	- Acumula 16 valores(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), valores acima disso deversгo utilizar bits maiores.
	- Os valores sгo manipulados com as funзхes: setBit4, getBit4.


-----------------------------------------------------------------------------------------------------

16 bits:

	- Acumula 65536 valores(0, 1, 2, 3, 4... 65535), valores maiores que isso deverгo ser utilizados de forma padrгo, sem o uso da iBits.
	- Os valores sгo manipulados com as funзхes: setBit16, getBit16.


-----------------------------------------------------------------------------------------------------

O uso da iBits й simples, tentei manter uma sintaxe que nгo complicasse muito a sua compreensгo e que seguisse visual de outras includes, assim para quem jб й acostumado com outras, nгo terб tanto transtorno.

Em casos comuns vocк costumam declarar variбveis para todo e qualquer tipo de uso.

A utilizaзгo da include й simples, basta vocк saber qual й a quantidade de valores que vocк quer armazenar em uma variбvel, sabendo isto, vocк cria a variбvel que consiga aguentar oque vocк precisa armazenar.

O uso й simples por ser sempre igual, a diferenзa sгo apenas os nomes.
bit1,
bit2,
bit4,
bit16






Eu citarei os mais bбsicos, comeзando pela variбvel que й utilizada para nнveis administrativos.
Estou supondo que o sistema sу terб apenas 3 nнveis, logo podemos utilizar a var bit2(2 bits).

pawn Code:
new bit2: admin_nivel <MAX_PLAYERS> ;

//bit2 = variбvel de 2 bits, 4 valores ( 0 , 1 , 2 , 3 )
//admin_nivel = nome da variбvel.
//MAX_PLAYERS = quantidade de slots que vocк usarб nessa variбvel, ou seja, 500 possibilidades de jogadores.

//o uso dessa variбvel agora estб subdividido entre usar setBit2 para alterar os valores dela
//e getBit2 para pegar os valores dela.

//A variбvel й apenas uma, e como ela serб picotada para economizar memуria.
//nгo trabalharemos com indexes, mas sim slots...

public OnPlayerConnect(playerid)
{
    if ((GetPlayersConnected() / playerid) < 10)
    //cуdigo aleatуrio, ele irб gerar um administrador novo, se a divisгo do ID conectado
    //pelo tanto de players no servidor for menor que 10
    {
        setBit2(admin_nivel, playerid, /*nнvel de admin(0-3)*/ 1);
        //setamos o nнvel de admin do playerid para 1.
        //logo agora podemos fazer as verificaзхes para saber se ele й ou nгo admin
        //utilizando a nova funcionalidade da include iBits
        // - any(arr[], slot, type)
    }
}

public OnPlayerCommandText(playerid, commandid, params[])
{
    if (any(admin_nivel, playerid, bit2))
    {
   
   
        //COMANDOS DO SERVIDOR QUE SУ PODERГO SER UTILIZADOS POR ADMINISTRADORES


    }
   
    //comandos gerais.
   
    return 0;
}






Citarei um exemplo agora a respeito de usos gerais,
todos GameModes fazem uso de um enum com os idx dos valores utilizados,
e uma variбvel que serve para separar cada valor de cada jogador.

Tambйm й possнvel fazer isto com o iBits, vejam:

pawn Code:
new bit16:player_level<MAX_PLAYERS>;
//variбvel utilizada para manipular a informaзгo level do jogador.
//ela foi criada como bit 16, logo vocк pode armazenar um valor de 0 a 65535
//isso indica que o seu sistema pode conter bastantes leveis, nгo ? :D

//nгo utilizaremos enum, a organizaзгo ficarб separada por variбveis,
//exemplo:
/*

new bit16: player_matou<MAX_PLAYERS>;
new bit16: player_morreu<MAX_PLAYERS>;

etc...

*/

//й possнvel que algumas pessoas perguntem: mas assim nгo vai ficar desotimizado ?
//nгo ! A memуria serб sim beneficiada pelo fato de vocк estar compactando os valores.


public OnPlayerConnect(playerid)
{
    setBit16(player_level, playerid, 0);
    //Estamos setando o level do jogador para zero, ao se conectar.


    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    if (IsPlayerConnected(killerid))
    {
        setBit16(player_level, playerid, getBit16(player_level, playerid) + 1);
        //Aqui estamos setando o nнvel do jogador para +1 quando ele matar alguйm.
    }
   
   
   
    return 1;
}




Exemplo de matrizes com iBits, utilizando a nova atualizaзгo:
pawn Code:
enum VARS_BIT2
{
    admin,          //0 = no admin, 1 = admin, 2 = admin leader, 3 = owner
    is_working,     //0 = none, 1 = working, 2 = event, 3 = playing
};

bit_array PlayerAdmin_b2 <MAX_PLAYERS, VARS_BIT2 @bit2>;
//A variбvel PlayerInfo manipula dados de um jogador
//utilizando o enum como estrutura de idx.
//os enuns com ibits sгo separados por tamanho
//1 enum para dados com 2bits, 1 enum para dados com 4 bits e por ai vai...

enum VARS_BIT16
{
    level,
    cel
};

bit_array PlayerInfo_b16 <MAX_PLAYERS, VARS_BIT16 @bit16>;


public OnPlayerConnect(playerid)
{
    bit_array_set:2(PlayerAdmin_b2, playerid, admin, 0);
    bit_array_set:2(PlayerAdmin_b2, playerid, is_working, 0);
   
    bit_array_set:16(PlayerInfo_b16, playerid, level, 0);
    bit_array_set:16(PlayerInfo_b16, playerid, cel, 0);
    return 1;
}


public OnPlayerCommandText(playerid, commandid, params[])
{
    switch (commandid)
    {
        case iscmd("c,e,l,u,l,a,r"): //comprar celular
        {
            bit_array_set:16(PlayerInfo_b16, playerid, cel, 4039); //nъmero fixo exemplar
           
            SendClientMessage(playerid, -1, "Vocк acabou de comprar um celular, nъmero: 4039");
        }
   
   
        case iscmd("t,r,a,b,a,l,h,a,r"):
        {
            bit_array_set:2(PlayerAdmin_b2, playerid, is_working, 1);
        }

        case iscmd("a,d,m,i,n,s"):
        {
            new msg[128];
            each(Players->new i) // iLoops / iEach
            {
                if (bit_array_get:2(PlayerAdmin_b2, i, admin) > 0) //verifica se o jogador й admin.
                {
                    format(msg, 128, "%sAdmin id %d\n", msg, i);
                }
            }
           
            ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Admins online", msg, "OK", "");
            return 1;
        }
    }
   
    return 0;
}







Testem vocкs prуprios fazerem cуdigos pequenos utilizando o iBits,
as dъvidas podem ser tiradas aqui, eu vou atualizando o tуpico ao longo das dъvidas que aparecerem.




Dica: Й muito importante vocкs entenderem o porque de usar o iBits, ele pode sim diminuir o tamanho de seu AMX, e eu lhes garanto que nгo й um resultado pequeno, que nгo tenha tanta diferenзa.
O uso й simples, e pelo fato de vocк poder separar as variбveis por classes como bit1, bit2... etc, isso faz com que seu cуdigo fique mais organizado e controlado.

Sem tirar que a manipulaзгo do iBits mantйm a velocidade, vocк nгo terб problemas por perca de velocidade,
seu cуdigo sу tem a ganhar...


  • Crйditos
    • Willian Luigi - Include & Tуpico
    • Agradecimentos a ipsBruno
    • [iPs]TeaM



Tуpicos relacionados:

- Includes
beta iBits
beta iCmd 7.0(rбpido)
beta iLoops
beta iEach



- Tutoriais
Como usar iLoops!

- FilterScripts
Sistema de admin
Reply
#2

muito bom

quem sabe vou comecar a usar isso u.u
Reply
#3

Agora que eu entedi umas paradinhas parabens pelo tutorial .
Reply
#4

Interessante... Vou dar uma olhada no tуpico do iBits e ver se vale a pena pro meu projeto
Reply
#5

Lecal! Aquele dia eu testei ele no servidor, mas em seguida retirei. Achei meio estranho a forma que o cуdigo ficou.

Deve ser porque sempre programei da mesma forma (estrutura), e agora ficou diferente. A include sу suporta int e bool(simulando bool: 0,1) nй ?
Reply
#6

Quote:
Originally Posted by Falcon.
View Post
Lecal! Aquele dia eu testei ele no servidor, mas em seguida retirei. Achei meio estranho a forma que o cуdigo ficou.

Deve ser porque sempre programei da mesma forma (estrutura), e agora ficou diferente. A include sу suporta int e bool(simulando bool: 0,1) nй ?
Gosto de pessoas com perguntas boas.

Atualmente ele sу suporta isso, mas eu posso sim comeзar a trabalhar com possibilidades de strings, ainda sim de uma forma MUITO mais otimizada que a forma padrгo que todos utilizam e poupando memуria de uma forma violenta.
Agora floats й algo a se pensar.

Й algo ъtil ao seu ver ?
Vocк utilizaria ?
Pode fazer parte da prуxima implementaзгo do iBits.

Quanto a estrutura, fica sim bastante diferente, eu acho mais organizado, menos gambiarrado,
muito mais em conta em questгo da memуria(isto vocк jб provou por si prуprio).

Reply
#7

Bastante ъltil, usaria com certeza.

Lembra-se que estava falando sobre as packed strings ? Hoje descobri da pior forma que elas nгo funcionam corretamente, caso vocк use a string em um format mais tarde. Mesmo compilando sem aqueles errros chatos de array index.

PHP Code:
new Willian[][] =
{
    !
"Primeiro texto",
    !
"Segundo texto vem depois do %s"
};

format(stringstring sizeWillian[1], Willian[0]);
printf("bugado em alguns casos: %s"string
Finalmente consegui chegar a um melhor raciocнnio lуgico para fazer o servidor, fiz alguns teste com as includes postadas esses dias e acho que vou usб-las. Ao menos nos testes estгo valendo muito a pena. Tentarei me adptar com a nova sintбxe, rs.


Bom tutorial, nгo consigo te dar rep tem 2 dias. Quando eu conseguir, te dou.
Reply
#8

Em breve estarei atualizando a Include com algumas ideias que foram citadas.

Obrigado Falcon, quanto usar as includes, й bom ver que vocк fez os testes e viu que realmente faz diferenзa.
Reply
#9

Muito bom!
Reply
#10

Sou um tanto quanto leigo no assunto mas e quantos as matrizes?
Reply
#11

Quote:
Originally Posted by iCasTiel
View Post
Sou um tanto quanto leigo no assunto mas e quantos as matrizes?
Como citado no exemplo, baseando no que o iBits oferece atй agora,
ou vocк pode trabalhar com matrizes normais(desperdнcio de memуria)
ou vocк pode trabalhar com variбveis em forma de vetor, ao invйs de usar matrizes.

A ultima opзгo talvez seja um pouco trabalhosa, mas a organizaзгo em si, sim fica melhor no fim das contas(quase a mesma, apesar de remodelar a estrutura), mas a economia de memуria continua a mesma.
Reply
#12

Quote:
Originally Posted by Willian_Luigi
View Post
Como citado no exemplo, baseando no que o iBits oferece atй agora,
ou vocк pode trabalhar com matrizes normais(desperdнcio de memуria)
ou vocк pode trabalhar com variбveis em forma de vetor, ao invйs de usar matrizes.

A ultima opзгo talvez seja um pouco trabalhosa, mas a organizaзгo em si, sim fica melhor no fim das contas(quase a mesma, apesar de remodelar a estrutura), mas a economia de memуria continua a mesma.
Seria possнvel esta "ideia" em futuras versхes ?
Reply
#13

Muito bom Will.
Reply
#14

Quote:
Originally Posted by iCasTiel
View Post
Seria possнvel esta "ideia" em futuras versхes ?
Nгo vejo o porque nгo, eu posso ver essa possibilidade

As questхes sгo as mesmas que lancei para o Falcon.

Vocк usaria ?
Reply
#15

Quote:
Originally Posted by Willian_Luigi
View Post
Nгo vejo o porque nгo, eu posso ver essa possibilidade

As questхes sгo as mesmas que lancei para o Falcon.

Vocк usaria ?
Estou usando.
Reply
#16

Muito bom, irei fazer testes com esta include.
Reply
#17

Tуpico/tutorial atualizado com as novas informaзхes sobre as atualizaзхes do iBits.


Reply
#18

Agora ficou 10, to gostando das novas includes pois temos novas syntax huehu.

Da pra entender perfeitamente.
Reply
#19

Muito bom,

da pra entender perfeitamente.
Reply
#20

Na include disponibilizada para download via pastebin n se encontra a funзгo "bit_array"
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)