usando iBits -
WLSF - 15.10.2013
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
Re: usando iBits -
PT - 15.10.2013
muito bom
quem sabe vou comecar a usar isso u.u
Re: usando iBits -
shittt - 15.10.2013
Agora que eu entedi umas paradinhas parabens pelo tutorial .
Re: usando iBits -
Juniiro3 - 15.10.2013
Interessante... Vou dar uma olhada no tуpico do iBits e ver se vale a pena pro meu projeto
Re: usando iBits -
Falcon. - 15.10.2013
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й ?
Re: usando iBits -
WLSF - 15.10.2013
Quote:
Originally Posted by Falcon.
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).
Re: usando iBits -
Falcon. - 15.10.2013
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(string, string size, Willian[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.
Re: usando iBits -
WLSF - 15.10.2013
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.
Respuesta: usando iBits -
DanDRT - 15.10.2013
Muito bom!
Re: usando iBits -
Gii - 16.10.2013
Sou um tanto quanto leigo no assunto mas e quantos as matrizes?
Re: usando iBits -
WLSF - 16.10.2013
Quote:
Originally Posted by iCasTiel
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.
Re: usando iBits -
Gii - 16.10.2013
Quote:
Originally Posted by Willian_Luigi
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 ?
Respuesta: usando iBits -
ipsBruno - 16.10.2013
Muito bom Will.
Re: usando iBits -
WLSF - 16.10.2013
Quote:
Originally Posted by iCasTiel
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 ?
Re: usando iBits -
Gii - 16.10.2013
Quote:
Originally Posted by Willian_Luigi
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.
Re: usando iBits -
Schocc - 31.10.2013
Muito bom, irei fazer testes com esta include.
Re: usando iBits -
WLSF - 05.11.2013
Tуpico/tutorial atualizado com as novas informaзхes sobre as
atualizaзхes do
iBits.
Re: usando iBits -
Schocc - 05.11.2013
Agora ficou 10, to gostando das novas includes pois temos novas syntax huehu.
Da pra entender perfeitamente.
Re: usando iBits -
smiiir - 06.11.2013
Muito bom,
da pra entender perfeitamente.
Re: usando iBits -
Dayvison_ - 09.02.2015
Na include disponibilizada para download via pastebin n se encontra a funзгo "bit_array"