02.09.2012, 15:03
(
Последний раз редактировалось LeLeTe; 04.09.2012 в 22:18.
)
[TUTORIAL]
Criando casas/empresas/carros sem limites por jogador
By: LeLeTe
ATENЗГO: Este tutorial foi desenvolvido para programadores com um mнnimo de conhecimento sobre arrays. Se vocк nгo sabe o que sгo arrays, e nгo sabe como funciona o sistema de informaзхes das casas/jogadores/empresas/carros de seu servidor, pare de ler imediatamente, antes que vocк f*$% seu script inteiro.Criando casas/empresas/carros sem limites por jogador
By: LeLeTe
Bom, galera, vamos ao que interessa.
O que й que este tutorial vai te ensinar?
- Ele vai te ensinar a criar carros/empresas/carros/oquevocкquiser sem ter um limite prй-definido por arrays. Um exemplo й em servidores de RPG, onde existe um limite de 1 ~ 3 carros por jogador, ou 1 casa por jogador. Com este tutorial, vocк irб aprender a remover este problema.
Como ele funciona?
- Ele funciona checando um id ъnico por jogador, que serб o mesmo para todas as coisas que o jogador possui.
Passo 1: Crie um novo valor no seu sistema de informaзхes de jogadores
Se vocк usa o famoso PlayerInfo (PlayerInfo[playerid][pQualquerCoisa]), vб lб atй a array PlayerInfo, e adicione:pawn Код:
//Na array PlayerInfo (Ou qualquer que seja o nome da sua array de informaзхes) ...
pIDUnica,
pawn Код:
//Seus valores...
Float:pPosicaoZ,
pDinheiro,
pVida,
pIDUnica, //O novo valor criado.
pColete,
///... continua sua array...
Passo 2: Crie um novo valor nos sistemas de informaзхes que serгo ъnicos
Agora, vб atй a array do seu sistema de casas/carros/empresas/etcetera, e adicione:pawn Код:
//Na array...
cIDUnica, //Use cIDUnica para array de carros, bIDUnica para de empresas, e hIDUnica para de casas, para seu script nгo bugar.
//... continua sua array...
pawn Код:
//Array de carros, use cIDUnica.
cPreco,
cTranca,
cIDUnica, //Valor novo.
cDono[24],
//... continua sua array...
pawn Код:
//Array de casas, use hIDUnica.
hPreco,
hTranca,
hIDUnica, //Valor novo.
hDono[24],
//... continua sua array...
pawn Код:
//Array de empresas, use bIDUnica.
bPreco,
bTranca,
bIDUnica, //Valor novo.
bDono[24],
//... continua sua array...
Passo 3: Salve as novas informaзхes
Nгo se esqueзa de modificar no seu sistema de salvar as informaзхes os dados, para que eles salvem o novo valor.Passo 4: Criando a verificaзгo dos dados
Agora que vocк jб tem as arrays e valores prontos, como fazer pra checar?Simples.
pawn Код:
stock ChecarVeiculoUnico(playerid, carro)
{
if(CarInfo[id][cIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1; //Aqui, CarInfo й o nome da Array de Carros. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
return 0;
}
pawn Код:
stock ChecarVeiculoUnico(playerid, carro)
{
if(CarInfo[carro][cIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1; //Aqui, CarInfo й o nome da Array de Carros. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
return 0;
}
stock ChecarCasaUnica(playerid, casa)
{
if(HouseInfo[casa][hIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1; //Aqui, HouseInfo й o nome da Array de Casas. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
return 0;
}
stock ChecarEmpresaUnica(playerid, empresa)
{
if(BizzInfo[empresa][bIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1; //Aqui, BizzInfo й o nome da Array de Empresas. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
return 0;
}
Passo 5: Verificando o que o jogador possui
Legal, atй aqui a gente fez tudo necessбrio. O sistema jб pode ser usado, e tudo.Mas, e como eu sei quantas casas alguйm tem?
Й simples, й sу usar o mesmo princнpio acima.
Abaixo eu lhes darei um exemplo, mas, se vocк quiser, vocк pode customizar as mensagens.
pawn Код:
stock VerificarVeiculos(verificador, verificado) //Aqui, verificador seria o ID de quem estб verificando, e verificado seria o ID de quem as informaзхes seriam retiradas.
{
for(new c = 0; c < sizeof(CarInfo); c++) //Aqui, й um loop bбsico da array de carros. Substitua pela sua array caso necessбrio
{
if(CarInfo[c][cIDUnica] == PlayerInfo[verificado][pIDUnica]) //Mesmo esquema, substitua aqui pela suas arrays, se necessбrio
{
format(string, 128, "[VEНCULO] || Nome: [%s] || ID: [%d] || Preзo: [R$%d] || Cor 1: [%d] || Cor 2: [%d] || Trancado: [%d] ||",CarInfo[c][cName], c,CarInfo[c][cValue], CarInfo[c][cColorOne], CarInfo[c][cColorTwo], CarInfo[c][cLocked]); // Um exemplo de mensagem. Vocк pode modificar e adicionar suas prуprias informaзхes, se necessбrio.
SendClientMessage(verificador, 0xFF8000FF, string);
}
}
}
stock VerificarCasas(verificador, verificado) //Para empresas. Mesmo esquema de acima. Substitua as arrays caso necessбrio.
{
for(new h = 0; h < sizeof(HouseInfo); h++)
{
if(HouseInfo[h][hCasaUnica] == PlayerInfo[verificado][pIDUnica])
{
format(string, 128, "[CASA] || ID: [%d] || Preзo: [R$%d]",h, HouseInfo[h][hHousePrice]); //Outro exemplo de mensagem.
SendClientMessage(verificador, 0x00FF00FF, string);
}
}
}
stock VerificarEmpresas(verificador, verificado) //Para empresas. Mesmo esquema de acima. Substitua as arrays caso necessбrio.
{
for(new b = 0; b < sizeof(BizzInfo); b++)
{
if(BizzInfo[b][bIDUnica] == PlayerInfo[verificado][pIDUnica])
{
format(string, 128, "[EMPREENDIMENTO] || Nome: [%s] || ID: [%d] || Fundos: [R$%d]",BizzInfo[b][bName],b,BizzInfo[b][bVault]); //Outro exemplo de mensagem.
SendClientMessage(verificador, 0x0080FFFF, string);
}
}
}
Assim, vocк pode criar um comando tanto pra admins quanto pra jogadores utilizando a mesma funзгo.
ATENЗГO: Se vocк nгo entender a funзгo abaixo, no final dela, haverб outra, utilizando OnPlayerCommandText...
Exemplo:
pawn Код:
//Substitua qualquer array, se necessбria.
//Atenзгo: As estruturas abaixo sгo feitas utilizando ZCMD (Crйditos: Zeex) e sscanf (Crйditos: ******).
//Caso vocк nгo utilize e/ou nгo entenda as estruturas abaixo, vб para o final deste exemplo.
//Lб terб um modelo usando OnPlayerCommandText.
CMD:meusveiculos(playerid, params[]) {
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarVeiculos(playerid, playerid); //Mostra os veiculos do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
CMD:veiculosdoplayer(playerid, params[]) {
if(PlayerInfo[playerid][pAdminLevel] >= 1) {
new
targetid;
if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarVeiculos(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
return 1;
}
CMD:minhascasas(playerid, params[]) {
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarCasas(playerid, playerid); //Mostra as casas do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
CMD:casasdoplayer(playerid, params[]) {
if(PlayerInfo[playerid][pAdminLevel] >= 1) {
new
targetid;
if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarCasas(playerid, targetid);//Mostra as casas do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
return 1;
}
CMD:minhasempresas(playerid, params[]) {
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarEmpresas(playerid, playerid);//Mostra as empresas do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
CMD:empresasdoplayer(playerid, params[]) {
if(PlayerInfo[playerid][pAdminLevel] >= 1) {
new
targetid;
if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarEmpresas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
return 1;
}
pawn Код:
//Substitua qualquer array, se necessбria.
//No meio do seu OnPlayerCommandText...
if(!strcmp(cmd, "/meusveiculos", true))
{
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarVeiculos(playerid, playerid); //Mostra os veiculos do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
if(!strcmp(cmd, "/veiculosdoplayer", true))
{
if(PlayerInfo[playerid][pAdminLevel] >= 1)
{
new
targetid;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /veiculosdoplayer [playerid]");
return 1;
}
targetid = strval(tmp);
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarVeiculos(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
}
if(!strcmp(cmd, "/minhascasas", true))
{
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarCasas(playerid, playerid); //Mostra as casas do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
if(!strcmp(cmd, "/casasdoplayer", true))
{
if(PlayerInfo[playerid][pAdminLevel] >= 1)
{
new
targetid;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /casasdoplayer [playerid]");
return 1;
}
targetid = strval(tmp);
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarCasas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
}
return 1;
if(!strcmp(cmd, "/minhasempresas", true))
{
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarEmpresas(playerid, playerid);//Mostra as empresas do jogador que digitou o comando para ele mesmo ...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
if(!strcmp(cmd, "/empresasdoplayer", true))
{
if(PlayerInfo[playerid][pAdminLevel] >= 1) {
new
targetid;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /empresasdoplayer [playerid]");
return 1;
}
targetid = strval(tmp);
SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
VerificarEmpresas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}
else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
}
return 1;
[OPCIONAL] Passo X: Limitando o que o jogador possui
Caso vocк queira limitar a quantidade de coisas que alguйm pode comprar (por exemplo, para fazer um sistema de vip onde quem nгo й vip sу pode comprar 3 carros, e quem й vip, pode comprar infinitos), vocк pode usar uma funзгo assim: (Para utilizar para casas/carros, й sу editar o necessбrio)pawn Код:
//Coloque isso em algum lugar do script...
stock ContagemDeCasas(playerid)
{
new i;
for(new h = 0; h < sizeof(HouseInfo); h++)//Substitua HouseInfo se necessбrio.
{
if(HouseInfo[h][hIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
{
i++;
}
}
return i;
}
//Coloque isso no seu comando ou funзгo de comprar carros/casas/empresas
if(ContagemDeCasas(playerid) > 3) //Substitua ContagemDeCasas por ContagemDeCarros ou Empresas caso necessбrio, e substitua 3 pelo limite que vocк desejar...
return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais casas!"); //Substitua a mensagem caso necessбrio...
pawn Код:
//Coloque isso em algum lugar do script...
stock ContagemDeCasas(playerid) //Para Casas...
{
new i;
for(new h = 0; h < sizeof(HouseInfo); h++)//Substitua HouseInfo se necessбrio.
{
if(HouseInfo[h][hIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
{
i++;
}
}
return i;
}
stock ContagemDeCarros(playerid) //Para Carros...
{
new i;
for(new c = 0; c < sizeof(CarInfo); c++)//Substitua CarInfo se necessбrio.
{
if(CarInfo[c][cIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
{
i++;
}
}
return i;
}
stock ContagemDeEmpresas(playerid) //Para Empresas...
{
new i;
for(new b = 0; b < sizeof(BizzInfo); b++)//Substitua BizzInfo se necessбrio.
{
if(BizzInfo[b][bIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
{
i++;
}
}
return i;
}
//Coloque isso no seu comando ou funзгo de comprar casas
if(ContagemDeCasas(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais casas!");
//Coloque isso no seu comando ou funзгo de comprar carros
if(ContagemDeCarros(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais carros!");
//Coloque isso no seu comando ou funзгo de comprar empresas
if(ContagemDeEmpresas(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais empresas!");
Passo 6: Verificando se o jogador possui algo especнfico
Lembra das funзхes criadas no passo 4?Entгo, iremos utilizб-las agora.
Digamos que vocк queira trancar um carro.
Como vocк vai fazer pra saber se o carro que o jogador quer trancar й dele mesmo?
Simples.
pawn Код:
if(ChecarVeiculoUnico(playerid, iddocarro)) //substitua iddocarro pela id do carro que vocк quer verificar.
{
//Aqui dentro vocк programa o que acontece caso o carro seja do jogador.
}
Passo 7: Criando as ID's Ъnicas
Todo o sistema funciona, bonitinho, porйm, existe um problema:As ID's ъnicas. Como fazer para elas serem ъnicas?
Na verdade й bem simples.
Acesse o seu sistema de registro de jogadores (ou seja, o sistema que cria jogadores novos e salva-os), e adicione algo como isso:
pawn Код:
PlayerInfo[playerid][pIDUnica] = 1000000+random(8999999);
Assim, a nova ID ъnica do jogador serб gerada =).
Alternativamente, vocк pode optar pelo sistema de checagem por NOMES ao invйs de ID's ъnicas, o que garante 100% que o sistema funcione.
E com isso, este tutorial estб finalizado.
Obrigado a todos que leram atй o final deste tutorial. Ele ainda tб um pouco lixoso porquк eu tф com um pouco de sono. Qualquer pergunta ou dъvida, sу postar que eu respondo.