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.
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:
(OBS): Dъvidas a respeito do funcionamento da iBits poderгo ser tirados no tуpico de apresentaзгo da include.
Apresentaзгo
Code:(OBS): Dъvidas a respeito do funcionamento da iBits poderгo ser tirados no tуpico de apresentaзгo da include.
Apresentaзгo
- Código:
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).
- Código:
[size=14][size=13]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;
}[/size][/size]
[center]
[/center]
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:
- Código:
[size=14][size=13]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;
}[/size][/size]
[center][/center]
Exemplo de matrizes com iBits, utilizando a nova atualizaзгo:
- Código:
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