[Ajuda] Dъvidas bбsicas
#1

Galera, tenho umas dъvidas bem bбsicas. Estou comeзando a mexer com Pawno e jб fiz uns comandos simples, como uma forma de "treino" (usando zcmd+sscanf2), mas agora estou pensando em sair um pouco dos comandos e ver outras coisas, mas antes de fazer isso preciso tirar umas dъvidas.

1є: Vendo o fуrum me deparei com diversas situaзхes em que uma pessoa posta uma string (acho que й isso) com 256 cйlulas, e as pessoas nos comentбrios dizem que nгo tem necessidade de pфr 256 sendo que o mбximo que o SA:MP aceita й 128, entгo sу gostaria que alguйm confirmasse isso pra mim.

2є: Tambйm vendo o fуrum encontrei pessoas dizendo que o mбximo de caracteres que o SA:MP aceita й 24, mas eu testei aqui e disse que sу podia entre 3 e 20, eu testei e sу dava pra usar isso mesmo, entгo eu poderia botar no caso no mбximo 20 cйlulas se eu quisesse usar isso com um nome, porque se botasse mais ia ficar lб atoa, correto?

3є: Qual a diferenзa entre strcmp e zcmd+sscanf2? Disseram que strcmp nгo й interpretador de comando, mas eu vi que as pessoas fazem usando isso, entгo na PRБTICA, quais as diferenзas e qual й melhor e usa menos recursos?

4є: Quarta e ultima dъvida, botar os "new" no topo do GM faz o servidor ficar mais "leve" (zcmd+sscanf2)?

Ex:
pawn Код:
CMD:explodir(playerid, params[]) {
new id;
new Float:x, Float:y, Float:z;
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "u", id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Explodir [ID].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
GetPlayerName(playerid, nome, 20);
format(texto, sizeof(texto), "Vocк foi explodido pelo administrador %s.", nome);
GetPlayerPos(id, x, y, z);
CreateExplosion(x,y,z,7,10.0);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
SendClientMessage(id, COLOR_GREEN, texto);
return 1; }
COM OS NEW DENTRO DO PRУPRIO COMANDO (NO CASO REPETINDO ISSO EM TODO COMANDO).



pawn Код:
CMD:explodir(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "u", id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Explodir [ID].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
GetPlayerName(playerid, nome, 20);
format(texto, sizeof(texto), "Vocк foi explodido pelo administrador %s.", nome);
GetPlayerPos(id, x, y, z);
CreateExplosion(x,y,z,7,10.0);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
SendClientMessage(id, COLOR_GREEN, texto);
return 1; }
REPAREM QUE OS NEW NГO ESTГO DENTRO DO COMANDO, EU TIREI E DEIXEI O ID E AS FLOAT NO TOPO DO GM, DAI EM VEZ DE REPETIR OS NEW EM TODO COMANDO EU DEIXO LБ E FUNCIONA PERFEITAMENTE (DEIXANDO OS NEW NO TOPO DO GM E, OBVIAMENTE, NГO PRECISAR REPETIR EM TODOS OS COMANDOS).

Й sу isso mesmo galera, e um muito obrigado antecipado a quem responder .

ALGUNS OUTROS COMANDOS SIMPLES QUE EU FIZ:

pawn Код:
CMD:tapa(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "u", id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Tapa [ID].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
GetPlayerName(playerid, nome, 20);
format(texto, sizeof(texto), "O administrador %s lhe deu um tapa.", nome);
GetPlayerPos(id, x, y, z);
SetPlayerPos(id, x, y, z+10);
PlayerPlaySound(id, 1130, x, y, z+12);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
SendClientMessage(id, COLOR_GREEN, texto);
return 1; }
pawn Код:
CMD:tp(playerid, params[]) {
new x,y,z;
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "iii", x, y, z)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Tp [X] [Y] [Z].");
SetPlayerPos(playerid, x, y, z);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:v(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "iii", id, cor1, cor2)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /V [ID DO VEНCULO] [COR 1] [COR 2].");
if(id < 400 || id > 611) return SendClientMessage(playerid, COLOR_RED,"[ERRO]ID invбlido. IDs vбlidos: 400-611.");
GetPlayerPos(playerid, x, y, z);
CreateVehicle(id, x, y, z, 0, cor1, cor2, 0);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:setskin(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "ii", id, id2)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Setskin [ID DO JOGADOR] [ID DA SKIN].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
if(id2 < 0 || id2 > 299) return SendClientMessage(playerid, COLOR_RED,"[ERRO]ID invбlido. IDs vбlidos: 0-299.");
SetPlayerSkin(id, id2);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:dararma(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "iii", id, id2, id3)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /DarArma [ID DO JOGADOR] [ID DA ARMA] [MUNIЗГO].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
if(id2 < 0 || id2 > 46) return SendClientMessage(playerid, COLOR_RED,"[ERRO]ID invбlido. IDs vбlidos: 0-46.");
GivePlayerWeapon(id,id2,id3);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:ircarro(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "i", id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /IrCarro [ID DO CARRO].");
PutPlayerInVehicle(playerid, id, 0);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:god(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
SetPlayerHealth(playerid, 999999);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:normal(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
SetPlayerHealth(playerid, 100);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:godcar(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
SetVehicleHealth(GetPlayerVehicleID(playerid), 999999);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:normalcar(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
SetVehicleHealth(GetPlayerVehicleID(playerid), 100);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:setlife(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "ii", id, id2)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /SetLife [ID DO JOGADOR] [QUANTIDADE DE VDA].");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
SetPlayerHealth(id, id2);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:setlata(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "ii", id, id2)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /SetLata [ID DO CARRO] [QUANTIDADE DE VDA].");
SetVehicleHealth(id, id2);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
pawn Код:
CMD:tapac(playerid, params[]) {
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
if(sscanf(params, "i", id)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /TapaC [ID DO CARRO].");
GetVehiclePos(id, x, y, z);
SetVehiclePos(id, x, y, z+10);
SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
return 1; }
OBS: COMECEI A CODAR ANTE-ONTEM, ENTГO NГO FIZ MUITAS COISAS NEM SOU MUITO EXPERIENTE .
Reply
#2

1є: O limite de string era 256 caracteres, mas aumentou para 1024 caracteres (Pode confirmar em https://sampwiki.blast.hk/wiki/Limits). Mas lembre-se sempre que й bom evitar colocar strings definidas com um numero de caracteres maior do que vocк estб usando (pode aumentar tamanho do arquivo amx e etc).

2є: Nгo entendi direito, mas acho que a resposta estб na primeira duvida que eu esclareci.

3є: Strcmp pode sim ser usado para criar comandos, porйm processadores de texto como zcmd, ycmd, icmd e etc tem um desempenho melhor de velocidade (alйm de deixarem o cуdigo mais organizado de forma geral).

4є: Ai depende... Se vocк usa a variбvel apenas uma vez, em um comando, nгo tem motivo para definir globalmente. Mas se vocк usa varias vezes e quer deixar definida como variбvel global tambйm funciona, ai vai da pessoa e da forma que vai usar. Tem que tomar cuidado sу de nгo definir uma variбvel com o mesmo nome 2 vezes (1 global e 1 local por exemplo).
Reply
#3

1є: Entendi.

2є: A segunda й tipo se fosse usar pro nome de um player, e eu testei e o mбximo de caracteres num nome й 20 mesmo.

3є: Era oque eu achava mesmo, mas й sempre bom pedir a opiniгo de pessoas que tem mais conhecimento que vocк xD.

4є: Й exatamente nesses casos, a variбvel das coordenadas por exemplo usa bastante, entгo acho que valeria a pena definir globalmente. E aproveitando que vocк citou de definir uma variбvel com o mesmo nome 2 duas vezes queria te fazer outra pergunta: se no global eu defini new Float: x, Float:y, Float:z; e no comando de /tp eu defini new x,y,z; ele da um warning lб de shadow, porque eu jб defini antes, mas se eu usar float nesse caso o comando nгo funciona o_O, ele compila normalmente, mas na hora de digitar nгo vai, entгo tive que botar sem float, e mesmo assim ele da o warning, mas funciona normalmente se botar sem float. Agradeзo a sua ajuda .
Reply
#4

2є podes faz isto tbm

pawn Код:
#include "a_samp"
#undef MAX_PLAYER_NAME
#define MAX_PLAYER_NAME 20
4є- algumas da pra melhorar e otimizar olha

pawn Код:
CMD:explodir(playerid, params[])
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
    if(sscanf(params, "u", params)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Explodir [ID].");
    if(!IsPlayerConnected(params)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
    GetPlayerName(playerid, nome, 20);
    format(texto, sizeof(texto), "Vocк foi explodido pelo administrador %s.", nome);
    new Float:Pos[3];
    GetPlayerPos(params, Pos[0], Pos[1], Pos[2]);
    CreateExplosion(Pos[0],Pos[1],Pos[2],7,10.0);
    SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
    SendClientMessage(params, COLOR_GREEN, texto);
    return 1;
}
apenas 1 exemplo
Reply
#5

Quote:
Originally Posted by PT
Посмотреть сообщение
algumas da pra melhorar e otimizar olha

pawn Код:
CMD:explodir(playerid, params[])
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Vocк nгo tem permissгo para utilizar este comando.");
    if(sscanf(params, "u", params)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Uso correto: /Explodir [ID].");
    if(!IsPlayerConnected(params)) return SendClientMessage(playerid, COLOR_RED,"[ERRO]Jogador nгo conectado.");
    GetPlayerName(playerid, nome, 20);
    format(texto, sizeof(texto), "Vocк foi explodido pelo administrador %s.", nome);
    new Float:Pos[3];
    GetPlayerPos(params, Pos[0], Pos[1], Pos[2]);
    CreateExplosion(Pos[0],Pos[1],Pos[2],7,10.0);
    SendClientMessage(playerid, COLOR_GREEN,"Comando efetuado com кxito.");
    SendClientMessage(params, COLOR_GREEN, texto);
    return 1;
}
apenas 1 exemplo
Muito obrigado pela dica. Vou ver o que exatamente vocк fez e tento fazer nos outros comandos xD.
Reply
#6

Quote:
Originally Posted by zecage
Посмотреть сообщение
1є: Entendi.

2є: A segunda й tipo se fosse usar pro nome de um player, e eu testei e o mбximo de caracteres num nome й 20 mesmo.

3є: Era oque eu achava mesmo, mas й sempre bom pedir a opiniгo de pessoas que tem mais conhecimento que vocк xD.

4є: Й exatamente nesses casos, a variбvel das coordenadas por exemplo usa bastante, entгo acho que valeria a pena definir globalmente. E aproveitando que vocк citou de definir uma variбvel com o mesmo nome 2 duas vezes queria te fazer outra pergunta: se no global eu defini new Float: x, Float:y, Float:z; e no comando de /tp eu defini new x,y,z; ele da um warning lб de shadow, porque eu jб defini antes, mas se eu usar float nesse caso o comando nгo funciona o_O, ele compila normalmente, mas na hora de digitar nгo vai, entгo tive que botar sem float, e mesmo assim ele da o warning, mas funciona normalmente se botar sem float. Agradeзo a sua ajuda .
No comando TP que vocк postou, o problema ta no formato do sscanf. Valor de coordenada й float e nгo integer. No sscanf portanto vocк tem que por :
pawn Код:
sscanf(params, "fff", x, y, z)
Reply
#7

trago-te aqui umas coisas que te poderao ajudar melhor.

olha

https://sampforum.blast.hk/showthread.php?tid=208427
https://sampforum.blast.hk/showthread.php?tid=365996
Reply
#8

Quote:
Originally Posted by kreison
Посмотреть сообщение
No comando TP que vocк postou, o problema ta no formato do sscanf. Valor de coordenada й float e nгo integer. No sscanf portanto vocк tem que por :
pawn Код:
sscanf(params, "fff", x, y, z)
Aaaaaaaah, entendi porque nгo tava funcionando. Valeu mesmo por esclarecer essa dъvida, eu nгo sabia como proceder entгo deixei aquela soluзгo temporбria, mas agora jб posso consertar xD thanks.

Quote:
Originally Posted by PT
Посмотреть сообщение
Eu vi seu cуdigo e entendi oque vocк. Nгo sei explicar muito bem em termos tйcnicos mas vou tentar: aquele new Float:Pos[3]; vocк usou pra "indicar" que tem essa nova Float Pos, e que ela tem 3 parвmetros, daн vocк pegou as coordenadas x, y e z com o 0, 1 e 2 (que no caso seriam os 3 parвmetros que vocк definiu na new eu acho) e depois criou a explosгo nas coordenadas, acho que eu entendi, mas sу me responde uma coisa por favor: teria como eu definir essa new Float:Pos[3] globalmente, dai eu sу pegaria as coordenadas e executaria a funзгo, sem adicionar a new no comando em si ou eu tenho que botar direto no comando? Acho que funcionaria definindo globalmente, mas por via das dъvidas acho melhor pergunta xD. Grato pela ajuda.

@EDIT: Opa, pode deixar, jб testei e vi que funciona se definir globalmente sim, e foi atй muito legal da sua parte citar isso, porque eu to usando o sscanf2 e nгo tava fazendo uso de todas as funcionalidades tipo esses parвmetros. Novamente muito obrigado aos dois por me ajudarem xD.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)