Caue, um conselho ok? sempre tive muita dificuldade de aprender isso, pois nгo й uma coisa fбcil ao primeiro olhar. A Lуgica da programaзгo й FUNDAMENTAL pra qualquer linguagem, inclusive pawn!
Um conselho, inicia um gamemode do zero, aquele padrгozinho do Pawno. Comeзa a criar um comando, mentaliza o que essse comando vai fazer, por exemplo, criar um veнculo da cor preta na tua frente... baseado nisso tu comeзa a criar o comando procurando sempre no SAMP WIKI, se der erro na hora de compilar, procura aqui no forum sobre o erro, posta na бrea de dъvidas que com toda a certeza o pessoal vai ajudar! e quando vocк notar, jб estб criando coisas incrнveis! sйrio! Comeзa fazendo coisas bobas como comandos que mostrem mensagens e etc e depois vai evoluindo os comandos! |
Exatamente! Eu comecei com um script do Pawno, hoje estou quase terminando um GM de roleplay TODO codado por mim e com coisas que fui eu que inventei. Isso й MUITO gratificante ainda mais por saber que comecei sem saber nada e hoje estou terminando um gamemode com um conhecimento "significativo" sobre a linguagem.
|
Eu fiz oque vocк falou , mas eu queria tipo adicionar um limite de criaзгo por jogador e um tempo pra ele nгo ficar spamando. Poderia me ajudar?.
|
cria verificador de hydra spawnada;
Digito comando()
{
Verifica se jб spawnei a hydra, se sim, finaliza o comando avisando que ja spawni a hydra;
// se nгo, inicia a criaзгo
Pega a minha posiзгo e salva;
cria veнculo na posiзгo que eu salvei;
manda mensagem avisando que a hydra foi spawnada;
liga o verificador de hydra;
finaliza comando;
}
new bool:HydraSpawned[MAX_PLAYERS] = false; // cria o verificador jб deixando ele como falso (nгo estб spawnada)
CMD:hydra(playerid) // comando
{
new Float:POS[3]; // variбvel que vai salvar a posiзгo para ser usada depois
if(HydraSpawned[playerid] == true) return SendClientMessage(playerid, -1, "* Vocк jб spawnou a hydra!"); // verifica se a hydra jб foi spawnada
GetPlayerPos(playerid, POS[0], POS[1], POS[2]); // Pega a posiзгo do jogador que usou o comando e salva na variбvel POS[]
CreateVehicle(520, POS[0], POS[1], POS[2], 0.0, 0, 0, 0, 0); // Cria a Hydra na localizaзгo do player, salva na variбvel POS[]
SendClientMessage(playerid, -1, "* Vocк spawnou a hydra!"); // Manda mensagem pro jogador que a hydra foi criada
HydraSpawned[playerid] = true; // ativa o verificador da Hydra, para que o jogador nгo possa usar o comando denovo
return 1; // finaliza o comando
}
Primeiro vocк tem que usar a lуgica de programaзгo, como eu falei!
na lуgica PHP код:
PHP код:
|
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/hydra", cmdtext, true) == 0)
{
new Hydra;
new Float:X, Float:Y, Float:Z, Float:A;
GetPlayerPos(playerid, X, Y, Z);
GetPlayerFacingAngle(playerid, A);
Hydra = CreateVehicle(520, X, Y, Z, A, -1, -1, 60);
PutPlayerInVehicle(playerid, Hydra, 0);
SendClientMessage(playerid, Verde,"[RPG]Veiculo criado com sucesso.");
return 1;
}
return 0;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/hydra", cmdtext, true) == 0)
{
new Hydra, Float:Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid, Pos[3]);
Hydra = CreateVehicle(520, Pos[0], Pos[1], Pos[2], Pos[3], -1, -1, 60);
PutPlayerInVehicle(playerid, Hydra, 0);
SendClientMessage(playerid, Verde,"[RPG]Veiculo criado com sucesso.");
return 1;
}
return 0;
}
if (strcmp("/hydra", cmdtext, true) == 0)
{
CУDIGO
}
CMD:hydra(playerid, params[])
{
CУDIGO
}
Sim, уtimo, tu tem uma lуgica boa! Mas esse teu comando nгo tem o verificador, entгo o player vai poder usar quantas vezes quiser!
Outra coisa muito importante, й deixar o cуdigo "bonito" esteticamente falando.. deixar ele bem fбcil de se "ler" entende? PHP код:
COMANDO COMUM: PHP код:
PHP код:
|
#include <a_samp>
#include <zcmd>
#define Verde 0x00FF40AA
#define Vermelho 0xFF0000AA
CMD:hydra(playerid)
{
new Float:POS[4];
if(HydraSpawned[playerid]) return SendClientMessage(playerid, Vermelho, "[]Vocк jб spawnou a hydra!");
GetPlayerPos(playerid, POS[0], POS[1], POS[2]);
Hydra = CreateVehicle(520, POS[0], POS[1], POS[2], POS[3], -1, -1, 60);
SendClientMessage(playerid, Verde, "[]Vocк spawnou a hydra!");
PutPlayerInVehicle(playerid, Hydra, 0);
HydraSpawned[playerid] = true;
return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
Hydra = GetPlayerVehicleID(playerid);
DestroyVehicle(Hydra);
HydraSpawned[playerid] = false;
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
Hydra = GetPlayerVehicleID(playerid);
DestroyVehicle(Hydra);
HydraSpawned[playerid] = false;
return 1;
}
Assim ficou o meu cуdigo final:
PHP код:
PHP код:
PHP код:
|
Nгo implementou a verdadeira lуgica no cуdigo.
Definiu a variбvel POS no topo sem necessidade, sendo que sу usava abaixo da verificaзгo se jб spawnou o hydra. Nгo verificou em OnPlayerExitVehicle se o veнculo que ele saiu era um Hydra e se era dele. Se vocк nгo estudar por si a lуgica de programaзгo, vais ficar com lуgica de programador de GF (o que nгo й boa coisa). |
//Declara a variбvel
new Float:POS[4];
//Caso jб houver spawnado o cуdigo irб retornar essa mensagem e nada abaixo serб executado
if(HydraSpawned[playerid]) return SendClientMessage(playerid, Vermelho, "[]Vocк jб spawnou a hydra!");
//Pega a posiзгo e salva na variбvel
GetPlayerPos(playerid, POS[0], POS[1], POS[2]);
2°"Nгo verificou em OnPlayerExitVehicle se o veнculo que ele saiu era um Hydra e se era dele." Nгo entendi , faz um exemplo pra mim tentar entender .-
|
Recapitula seu comando.
PHP код:
Toda vez que um jogador sai de algum veнculo, OnPlayerExitVehicle й chamado, entгo qualquer veнculo que ele entrar e sair vocк vai deletar o carro dele, independente de ser um Hydra ou nгo. O que vocк deveria fazer й criar uma variбvel global para salvar o id do veнculo que ele criou. Assim em OnPlayerExitVehicle poderia verificar se ele jб criou um Hydra e se o valor da variбvel 'vehicleid' dessa callback (public) й o mesmo valor que a variбvel utilizada para armazenar o id do Hydra. |
// FS = Hydra
#include <a_samp>
#include <zcmd>
#define FILTERSCRIPT
#define Verde 0x00FF40AA
#define Vermelho 0xFF0000AA
#if defined FILTERSCRIPT
new Hydra;
new bool:HydraSpawned[MAX_PLAYERS];
new HydraExit[MAX_PLAYERS];
public OnFilterScriptInit()
{
print("|Spawn de Hydra|");
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
CMD:hydra(playerid)
{
if(HydraSpawned[playerid]) return SendClientMessage(playerid, Vermelho, "[]Vocк jб spawnou a hydra!");
new Float:POS[4];
GetPlayerPos(playerid, POS[0], POS[1], POS[2]);
Hydra = CreateVehicle(520, POS[0], POS[1], POS[2], POS[3], -1, -1, 60);
SendClientMessage(playerid, Verde, "[]Vocк spawnou a hydra!");
PutPlayerInVehicle(playerid, Hydra, 0);
HydraSpawned[playerid] = true;
return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
format(HydraExit, sizeof(HydraExit),"",Hydra);
DestroyVehicle(Hydra);
HydraSpawned[playerid] = false;
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
Hydra = GetPlayerVehicleID(playerid);
DestroyVehicle(Hydra);
HydraSpawned[playerid] = false;
return 1;
}
#endif
Programador de GF Bruno13? Humildгo vocк ein ?!
Ele pediu um exemplo e dei um exemplo. Agora se vocк tem o tempo disponнvel pra implementar a gamemode dele, fique a vontade! Ajuda sempre й bem vinda! Mas nгo venha desmerecer ou julgar os outros, principalmente por motivo torpe. Poucos sгo, os que olham para o lado para ajudar ao prуximo. Mas como eu jб tinha te dito Cauк, estude, se interesse e vб criando e evoluindo, independente do que te falarem, o importante й aprender sempre! Boa sorte vйio! |
Agora funcionou , pelos meus teste sу desaparece se for um Hydra agora!
PHP код:
|
/*
* Variбvel que armazenarб o id do Hydra que o jogador criar.
* INVALID_VEHICLE_ID caso tenha sido deletado ou nгo criado.
*/
new playerHydra[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
/*
* Reseta a variбvel de controle do Hydra.
*/
playerHydra[playerid] = INVALID_VEHICLE_ID;
return 1;
}
CMD:hydra(playerid)
{
/*
* Verifica se a variбvel nгo estб com valor padrгo de INVALID_VEHICLE_ID.
* Isso significa que o jogador criou algum Hydra.
*/
if(playerHydra[playerid] != INVALID_VEHICLE_ID)
return SendClientMessage(playerid, Vermelho, "[]Vocк jб spawnou a hydra!");
new Float:POS[4];
GetPlayerPos(playerid, POS[0], POS[1], POS[2]);
/*
* Armazena o id do Hydra que foi criado.
*/
playerHydra[playerid] = CreateVehicle(520, POS[0], POS[1], POS[2], POS[3], -1, -1, 60);
SendClientMessage(playerid, Verde, "[]Vocк spawnou a hydra!");
PutPlayerInVehicle(playerid, Hydra, 0);
return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
/*
* Chama a funзгo para deletar o Hydra do jogador.
*/
DestroyPlayerHydra(playerid);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
/*
* Chama a funзгo para deletar o Hydra do jogador.
*/
DestroyPlayerHydra(playerid);
return 1;
}
/*
* Crie funзхes para cуdigos que irб utilizar mais que uma vez.
* Este й um princнpio DRY, aconselho que veja este link sobre:
* https://pt.wikipedia.org/wiki/Don%27t_repeat_yourself
*/
static DestroyPlayerHydra(playerid)
{
if(playerHydra[playerid] != INVALID_VEHICLE_ID)
{
DestroyVehicle(playerHydra[playerid]);
playerHydra[playerid] = INVALID_VEHICLE_ID;
}
}