Usando matrizes para aumentar a produtividade
Índice
- Introdução
- Importante
- Matrizes: Teoria
- Criando um sistema de GangZones domináveis
Introdução
Decidir fazer este tutorial porque nгo aguentava mais ver cуdigos como:
PHP como:Decidir fazer este tutorial porque nгo aguentava mais ver cуdigos como:
- Código:
new
donocasarao,
donopista;
ou entгo:
PHP como:- Código:
public OnPlayerEnterCheckpoint(playerid)
{
if (estaemtallugar)
SetPlayerCheckpoint(...);
if (estaemoutrolugar)
SetPlayerCheckpoint(...);
}
Mas qual o problema de cуdigos como este? Além do claro problema de manutenção (é muito trabalhoo atualizar um sistema desse), é muito complicado adicionar um novo local, são necessárias muitas linhas de código para fazer algo simples como uma rota completa de motorista, ou uma carga de caminhão. Sim, todos estes são sistemas extremamente simples de serem feitos, e se foram feitos da forma correta, é possível adicionar uma nova rota ou um novo território dominável com apenas uma linha .
Importante
Este tutorial é um tutorial intermediário, se você não tem nenhuma referência de o que seja uma matriz, um enum, um loop FOR, este tutorial não é pra você. Aprenda o que são os itens anteriores primeiro, ou tente a sorte lendo o tutorial. Este tutorial pressiona o que você sabepelo menos o básico de matrizes
Matrizes: Teoria
Talvez o código mais comum em todos os gamemodes seja a matriz/array PlayerInfo (e variantes):
PHP como:Importante
Este tutorial é um tutorial intermediário, se você não tem nenhuma referência de o que seja uma matriz, um enum, um loop FOR, este tutorial não é pra você. Aprenda o que são os itens anteriores primeiro, ou tente a sorte lendo o tutorial. Este tutorial pressiona o que você sabepelo menos o básico de matrizes
Matrizes: Teoria
Talvez o código mais comum em todos os gamemodes seja a matriz/array PlayerInfo (e variantes):
- Código:
enum PlayerData
{
pMoney,
pScore,
pJob,
...
}
new PlayerInfo[MAX_PLAYERS][PlayerData];
Porém poucos sabem o que de fato fazem quando criam uma matriz como esta. Uma matriz nada mais é que uma tabela . Portanto, o código acima pode ser descrito visualmente como:
Onde para cada playerid existe um elemento do enum PlayerData.
Porém este raciocínio, de relacionar IDs com um Enum, pode ser expandido e usado de outras formas:
PHP como:Onde para cada playerid existe um elemento do enum PlayerData.
Porém este raciocínio, de relacionar IDs com um Enum, pode ser expandido e usado de outras formas:
- Código:
enum E_PICKUPS
{
modelo,
Float:x,
Float:y,
Float:z
}
new const gPickups[][E_PICKUPS] = //As coordenadas usadas sгo aleatуrias
{
{348, 0.00, 0.00, 5.00},
{350, 1238.00, 542.00, 10.00}
};
Aqui relacionamos IDs de captadores com seus respectivos modelos e suas coordenadas X, Y e Z. Baseando-se nesta matriz, podemos criar um sistema automaticamente que cria todos os captadores declarados nesta matriz:
PHP como:- Código:
CreatePickups()
{
for (new i = 0; i <= sizeof(gPickups) - 1; ++i)
CreatePickup(gPickups[i][modelo], 1, gPickups[i][x], gPickups[i][y], gPickups[i][z]);
}
Agora com muita calma vou explicar o que está associado. O loop FOR está percorrendo a matriz inteira, independente de seu tamanho. Por quê? Porque ele começa em 0 e vai até sizeof(gPickups) - 1, que é a última posição da matriz (ou seja, seu tamanho - 1, pois os índices começam em 0. Portanto uma matriz com SIZEOF = 5, tem a posição inicial = 0 e final = 4). Concluindo, o FOR passa por cada índice da matriz.
O CreatePickup cria uma pickup baseada nas informações do índice da matriz atual. O que este para faz, em outras palavras, é:
PHP como:O CreatePickup cria uma pickup baseada nas informações do índice da matriz atual. O que este para faz, em outras palavras, é:
- Código:
CreatePickup(gPickups[0][modelo], 1, gPickups[0][x], gPickups[0][y], gPickups[0][z]);
CreatePickup(gPickups[1][modelo], 1, gPickups[1][x], gPickups[1][y], gPickups[1][z]);
Espero ter sido claro, é fundamental entender este mecanismo do FOR para continuar com o tutorial. Qualquer coisa me avise, por favor.
Criando um sistema de GangZones domináveis
Se a lуgica dos IDs x Enum ficou clara pra vocк, nгo serб difнcil entender como este sistema serб feito. Primeiramente, vamos definir o Enum dos territórios:
PHP como:Criando um sistema de GangZones domináveis
Se a lуgica dos IDs x Enum ficou clara pra vocк, nгo serб difнcil entender como este sistema serб feito. Primeiramente, vamos definir o Enum dos territórios:
- Código:
enum E_TERRITORIOS
{
GangZone_ID, //Nгo confundir ID do territуrio com o ID da gangzone que serб criada
NomeTerritorio[30],
OrgsPodemDominar[10],
OrgDona,
Float:MinX,
Float:MinY,
Float:MaxX,
Float:MaxY,
bool:TerritorioEmGuerra
}
Acho que tudo é auto explicativo, sу vou dar uma atenção para o vetor OrgsPodemDominar. Este vetor possui 10 posições, onde cada uma delas é uma organização que pode dominar o território atual (ID atual). Nгo й obrigatуrio que todas as posiзхes sejam usadas!
Vamos agora à declaração da matriz: (lembrando: cada linha é um território)
PHP como:Vamos agora à declaração da matriz: (lembrando: cada linha é um território)
- Código:
new Territorios[][E_TERRITORIOS] = //Novamente, coordenadas aleatуrias
{
{-1, "Pista de Skate", {5, 4, 7, 9, 10}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Favela", {5, 4, 7, 9, 10}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Casarгo", {12, 5}, 0, 42.00, 45.2, 454.20, 12.3, false},
{-1, "Groove Street", {18, 14, 2, 6, 75}, 0, 42.00, 45.2, 454.20, 12.3, false}
};
Os próximos cуdigos farгo com que ao adicionar uma linha nesta matriz, um novo territуrio dominбvel e funcional seja criado:
PHP como:- Código:
CreateTerritorios()
{
for (new i; i <= sizeof(Territorios) - 1; ++i)
Territorios[i][GangZone_ID] = GangZoneCreate(Territorios[i][MinX], Territorios[i][MinY], Territorios[i][MaxX], Territorios[i][MaxY]);
}
Certo, a gangzone foi criada segundo a lógica anterior. Agora basta uma função para verificar se um jogador pode dominar o território, e o sistema só precisa ser adaptado em um comando:
PHP como:- Código:
bool:PlayerPodeDominar(playerid, trid) //ID do territуrio, nгo da gangzone criada
{
//Para um player poder dominar um territуrio, uma das orgs do territуrio tem que ser a org dele. Portanto, vamos percorrer todo o vetor OrgsPodemDominar e ver se algum deles й a org do player
for (new i; i < 10; ++i)
if (Territorios[trid][OrgsPodemDominar][i] == PlayerInfo[playerid][pOrg])
return true;
return false;
}
Outras funções que podem ser criadas facilmente com esta matriz, e funcionar com todo o território declarado na matriz:
PHP como:- Código:
//Lembrando que trid й o ID do territуrio, nгo da gangzone criada
bool: IsPlayerInGangZone(playerid, trid);
bool: EstaEmGuerra(trid); //basta retornar o valor de TerritorioEmGuerra
ColocarEmGuerra(trid); //basta alterar o valor de TerritorioEmGuerra, e piscar a gangzone criada
AtualizarTerritorios(playerid); //Mostra as gangzones para o playerid, com as cores da org que a domina
Espero ter demonstrado como as matrizes podem ser ъteis e como todo gamemode deveria aproveitá-las melhor. Um bom exemplo de gamemode que usa as matrizes de forma inteligente é o PPC Trucking, onde criar uma rota de caminhão, motorista de фnibus e piloto é extremamente simples, pois ele segue esta lógica de matrizes. Quem tem um servidor neste estilo e já se desenvolveu a estudá-lo, ouve a "mágica" que ele faz quando se altera as matrizes dele, tudo é integrado ao gamemode sem que mais coisas tenham que ser feitas. Na minha opinião, vale a pena se dedicar a adaptar seu gamemode no que for possível a este sistema, pois será mais fácil adicionar coisas nele, dar manutenção e corrigir bugs, pois uma vez atualizado, tudo que depende dele (comandos, diálogos, etc ) ficará atualizado e desbugado.
Por favor, deem dicas para melhorar o tutorial no que for possível e deem sugestões. Obrigado.
Por favor, deem dicas para melhorar o tutorial no que for possível e deem sugestões. Obrigado.
Creditos: Juniiro3