[Tutorial] Comandos para outros players
#1

Bom, como tenho visto muito tanto aqui no Fуrum, fora tambйm, pessoas com um certo problema para criar comandos cujo destinatario nгo seja o playerid no caso, a pessoa digitou o comando.Com isso decidi vir aqui tentar passar a vocкs novatos(as), um pouco sobre strcmp - Usado para comparar strings, mais nesse caso para fazer comandos. strtok - Usado para procurar strings, mais nesse caso para complementar uma string nova para o comando. strval - Usado para converter uma string para Integer, nesse caso usado para definir seu Outro Player...

Comando:
Creio que todos saibam que para comeзar um comando a primeira parte seria
pawn Код:
if(strcmp("/comando", cmdtext, true) == 0)
pois como vemos a maioria dos novatos tendem a usar GM's base, ou GM's jб prontos, entгo vou tentar ao mбximo usar a lingua de seu GM.
em quase todos GM's creio eu, vocк tem o seu inicio de public OnPlayerCommandText como
pawn Код:
new string[256]; // Arrays da string para usar ao longo de todos comandos dentro desse public
new sendername[MAX_PLAYER_NAME]; //definiзгo para o Player Enviador. logo abaixo estarei explicando melhor..
new cmd[256], tmp[256], idx;
cmd = strtok(cmdtext,idx); // e creio que todos usem isso para definir que 'if(strcmp("/comando",cmdtext,true)==0) tambйm poderб ser usado como 'if(strcmp(cmd,"/comando",true) == 0)
todos sabem fazer um comando para pegar dinheiro, certo simples
pawn Код:
if(strcmp(cmd,"/medadinheiro", true) == 0)
{
    GivePlayerMoney(playerid, 5000); // playerid = vocк, 5000 й a quantia de dinheiro, nгo nescessariamente tem de a ser 5000. Vocк define a quantia
    SendClientMessage(playerid, -1, "Vocк pegou dinheiro."); // Mensagem enviada ao player que digitou o comando, (-1) й a cor = Branca й porque estou a fazer esse tuto em um new.
    return 1;
}
Jб vi pessoas dizendo que assim /\ ele poderia enviar dinheiro a outra pessoa se adicionasse "SendClientMessage(playerid, -1, "USE: /medadinheiro [player]");"
pois й nгo enviaria dinheiro algum no mбximo vocк ficaria a pensar que bugo '-'
entгo aqui comeзamos a usar outros IDS para fazer comandos assim digamos mais complexos para um novato.
pawn Код:
if(strcmp(cmd,"/medadinheiro", true) == 0)
{
    tmp = strtok(cmdtext,idx); // aqui comeзamos a usar o tal do tmp, para definir outros ID's fora o seu.
    new outro = strval(tmp); // aqui й onde transformamos 'outro' em ID.
    GivePlayerMoney(outro, 5000); // aqui й a base para dar o dinheiro, mais ao invйs de se usar como "playerid", usamos o outro player que definimos como "outro"
    return 1;
}
esse й um exemplo que diria SupraBбsico. E dai sai de acordo com a sua criatividade, eu jб enfeitaria bastante
pawn Код:
if(strcmp(cmd,"/medadinheiro", true) ==0)
{
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp))//o Comando exato apartir de quando definimos outro player й, /medadinheiro OUTROID por tanto isso й a mensagem que mostra quando digitasse apenas /medadinheiro
    {
        SendClientMessage(playerid, -1,"Use corretamente: /medadinheiro [player][quantia]");
        return 1;
    }
    new outro = strval(tmp); // aqui como expliquei em cima, serб o novo ID, porenquanto desconhecido. /medadinheiro ID
    if(!IsPlayerConnected(outro)) // aqui sera a Mensagem enviada a vocк, caso o ID digitado nгo esteja Online.
    {
        SendClientMessage(playerid, -1,"Player Desconhecido");
        return 1;
    }
    new dinheiro = strval(tmp); // aqui agora eu defini o tanto de dinheiro que podes dar a outro player.
    if(dinheiro < 0 || dinheiro > 999999) // na linguagem seria se for menos que 0 ou mais que 999999 envias a msg abaixo
    {
        SendClientMessage(playerid, -1,"Tas a abusar do poder de dinheiro. QUANTIA NEGADA.");
        return 1;
    }
    new euenviei[MAX_PLAYER_NAME]; // isso nгo precisa ser nescessariamente 'euenviei' nгo farб minima diferenзa й apenas um new para definir NOMES
    GetPlayerName(playerid, euenviei,sizeof(euenviei)); // aqui й quando convertes o teu ID para teu Nome. 'playerid' - 'euenviei'
    new recebendo[MAX_PLAYER_NAME];
    GetPlayerName(outro, recebendo,sizeof(recebendo)); // aqui jб й diferent, quando convertes o 'outro' player para nome.
    GivePlayerMoney(outro,dinheiro); // aqui estб a funзгo cabeзa do Comando, 'outro' й o ID digitado, 'dinheiro' й a quantia.
    format(string,sizeof(string),"Vocк deu %d de dinheiro para %s", dinheiro, recebendo); // esse й um format bбsico cujo afirmarб o Tanto de dinheiro e o nome de quem recebeu (%d) (%s)
    SendClientMessage(playerid, -1, string); // aqui ele enviarб o format, atй o player que usou o tal comando.
    new willMSG[60]; // como expliquei acima nгo precisa ser um (new willMSG) pode ser outro a sua escolha. Como vejo de muitas pessoas que definem tudo como ou "String", ou "Sendername" apenas porque acham que й o certo.
    format(willMSG,sizeof(willMSG),"Vocк recebeu %d, de %s", dinheiro, euenviei); // aqui jб seria outro format, informando ao 'outro' player, o tanto de dinheiro recebido, e o enviador do dinheiro.
    SendClientMessage(outro, -1,willMSG); //Aqui enviaremos uma Mensagem ao 'outro' Player, com o format acima.
    return 1;
}
da mesma forma da qual o comando pode ser assim /\ nгo nescessariamente precisa ser todo identado. logo poderia ser assim
pawn Код:
if(strcmp(cmd,"/medadinheiro", true) ==0)
{
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, -1,"Use corretamente: /medadinheiro [player][quantia]");
    new outro = strval(tmp);
    if(!IsPlayerConnected(outro)) return SendClientMessage(playerid, -1,"Player Desconhecido");
    new dinheiro = strval(tmp);
    if(dinheiro < 0 || dinheiro > 999999) return SendClientMessage(playerid, -1,"Tas a abusar do poder de dinheiro. QUANTIA NEGADA.");
    new euenviei[MAX_PLAYER_NAME];
    GetPlayerName(playerid, euenviei,sizeof(euenviei));
    new recebendo[MAX_PLAYER_NAME];
    GetPlayerName(outro, recebendo,sizeof(recebendo));
    GivePlayerMoney(outro,dinheiro);
    format(string,sizeof(string),"Vocк deu %d de dinheiro para %s", dinheiro, recebendo);
    SendClientMessage(playerid, -1, string);
    new willMSG[60];
    format(willMSG,sizeof(willMSG),"Vocк recebeu %d, de %s", dinheiro, euenviei);
    SendClientMessage(outro, -1,willMSG);
    return 1;
}
mais nгo aconselho, alйm de ser feio da minha opniгo, confundiria um novato de kaboArabo.

e dentre isso, podem surgir novos comandos, depende da sua criatividade.
outro exemplo:
pawn Код:
if(strcmp(cmd,"/sacanear",true) == 0)
{
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp))
    {
        SendClientMessage(playerid, -1,"Use corretamente: /sacanear [playerid]");
        return 1;
    }
    new outro = strval(tmp);
    if(!IsPlayerConnected(outro))
    {
        SendClientMessage(playerid,-1,"Player Desconhecido.");
        return 1;
    }
    new Float:X,Float:Y,Float:Z,Float:Angle; // aqui estarei definindo X Y Z Angle Como coordenadas para descubrilas abaixo com GetPlayerPos e FacingAngle
    GetPlayerPos(outro,X,Y,Z);// aqui estarei pegando as Coordenadas X Y Z do 'outro'Player para usar mais abaixo.
    GetPlayerFacingAngle(outro,Angle); // aqui estarei pegando o Angulo do 'outro'Player
    new carro = CreateVehicle(560,X,Y,Z,Angle,0xFF0080AA,-1,600000); // aqui estarei criando um novo carro (560) Sultan, nas coordenadas do 'outro'Player.
    PutPlayerInVehicle(outro,carro,1); // aqui estarei jogando o 'outro'Player dentro de um carro criado como acento de passageiro.
    TogglePlayerControllable(outro, 0);
    return 1;
}
Nesse comando eu te jogaria dentro de um carro criado na mesma hora e no mesmo local onde estavas, sem possibilidades de sair. Como Co-piloto *trollface*
Й isso pessoal, espero ter ajudado.

Crйditos:
Fonte inicial de meus estudos: Wiki;Samp, que nos propхe todas funзхes com uns tutoriais em inglкs meio tenso de ler - Site do WikiSamp
e feito por mim: Willian_Luigi
deixem seus coments. "Antes de meter simples criticas dizendo que copiei de algum lugar, procure bem no ****** para ver se copiei mesmo"
Reply
#2

Up boa \o
Reply
#3

Muito educativo.
Reply
#4

bom mas eu considero esse mйtodo ultrapassado
Reply
#5

Ultrapassado ou nгo existem milhares de dъvidas que podem ser respondida por esse simples tуpico de mйtodo ultrapassado.
Reply
#6

Concordo que й ultrapassado, mais creio eu que й o metуdo mais fбcil de aprendisado e o mais usado.
Reply
#7

Muito bom, esse metуdo pra mim e o melhor ^^
Reply
#8

Ultrapassado nгo, antigo... kkkk

Pra mim estee й o metodo mais simples, parabйns cara, irб ajudar quem tem duvidas em relaзгo a isso!
Reply
#9

Bom para iniciante, o code й antigo, mais ainda й usado por muitos e sempre vai ser usado, eu ainda uso em alguns filterscript :P
parabйns..
Reply
#10

Meu GM tem + de 10 mil linhas no OnPlayerCommandText e sгo todos em strcmp... quem teria vontade de passar tudo isso pra zcmd eu ainda uso strcmp no GM sу em FS uso zcmd... (tenho 1 FS com comando no meu GM shauhsuahsua...odeio FS...n sei pq)

@edit depois q postei isso me deu curiosidade pra ver qtas linhas tem meu OnPlayerCommandText e eu copiei ele todo e deu 35327 linhas '-' agora tenho ctz q nunca vou passar pra zcmd...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)