YCMD:kick(playerid, params[], ajuda)
{
if (ajuda)
return SendClientMessage(playerid, COR, "AJUDA: Chuta o jogador especificado.");
if ( GetPVarInt( playerid, "Level" ) <= 2 )
return SendClientMessage( playerid, COR, "ERRO: Apenas administradores acima do Level 2.");
if (sscanf( params, "uS", params[0], params[1]))
return SendClientMessage( playerid, COR, "ERRO: /kick [id] [Motivo]");
if ( !IsPlayerConnected( params[0] ) )
return SendClientMessage( playerid, -1, "ERRO: Jogador nгo conectado");
new String[ 128 ];
format( String, sizeof String, "%s (ID: %i) chutou o jogador '%s'( ID: %i ) Reason: %s",pName( playerid ),playerid,pName( params[0] ),params[0],params[1]);
SendClientMessageToAll(COR, String );
Kick(params[0]);
return 1;
}
YCMD:Kicktodos(playerid, params[], ajuda)
/*
Cmd: KickTodos | Player = ID | Params: O que vem apos | Ajuda = Уtimo sistema de YCMD, aonde vocк pode espeficiar
um comando dentro de outro, no caso, no camando ajuda, se digitarmos "/ajuda kicktodos" iria resultar na mensagem:
"AJUDA: Chuta todos os jogadores!", o que й bem mais simples de que adicionar um comando ajuda incluindo todos os
"ajudas" do script dentro!
*/
{
if (ajuda)
return SendClientMessage(playerid, COR, "AJUDA: Chuta todos os jogadores!");
/* Apenas retorna a tal mensagem caso o jogador use o comando /ajuda.*/
if ( GetPVarInt( playerid, "Level" ) <= 2 )
return SendClientMessage( playerid, COR, "ERRO: Apenas administradores acima do Level 2.");
/* Aqui vem um bom exemplo de PVar, nгo vou passar o script todo pois nгo hб necessidade, e scripter de verdade
corre atrбs para tentar fazer seu prуprio. Bom, em outra parte (Exemplo:"/selevel") eu defini para que o level
setado vб a por-jogador-variavel "Level" (SetPVarInt).
E aqui, estou apenas pegando o valor da variavel de volta e verificando se й menos que o level requisitado
para o uso do comando.
*/
if (sscanf( params, "s",params[0]))
return SendClientMessage( playerid, COR, "ERRO: /kicktodos [Motivo]");
/*
Aqaui й bem simples, apenas espeficiquei ao "espeficiador" de Sscanf que o motivo й uma "string", um "texto"
com "s" (Encontre outros espeficadores no post oficial do plugin sscanf). No caso, usei outro item que й bem
aplicado a YCMD, os parametros (Tudo que vem apуs o comando, e separados por espaзos). Caso nгo haja nada
apуs o comando, irб retornar na mensagem: "ERRO: /kicktodos [Motivo]"
*/
new String[128]; //Mбximo de caracteres permitidos pelo Chat SA-MP.
format(String, sizeof(String), "%s chutou todos os jogadores. [Motivo: %s ] |-", pName( playerid ),params[0]);
SendClientMessageToAll(COR, String);
/*
Aqui vai imprimir o resultado do comando a todos os jogadores presentes, utilizei " pName( playerid )" para
pegar o nome do administrador, como й uma funзгo bem conhecida e quase todos possuem em seus scripts,
o que й bem melhor de que definir uma variavel e aplicб-la a verificaзгo do nome do jogador em todos os comandos.
Params: vai publicar todo o motivo.
*/
foreach(Player, i)
/*
O melhor script de todos "foreach"! Ele simplesmente substitui os "Loops" convencionais (que sгo uma coisa
ruim que pelo amor) por outro, que й realmente muito mais rapido! E convenhamos, bem mais simples.
No post oficial de Foreach existem diversos exemplos e como aplicб-los aos Loops.
*/
{
if (i != playerid) /*Verifica se o "administrador" que usou o comando nгo vai ser kickado juntamente
com todos os outros jogadores.*/
Kick(i);
//Bom, vocк sabe.
}
return 1;
}
if(strcmp(cmd, "/kicktodos", true) == 0)
{
new reason[128];
if ( GetPVarInt( playerid, "Level" ) > 2 )
{
reason = strtok(cmdtext, idx);
if(!strlen(reason))
{
SendClientMessage( playerid, COR, "ERRO: /kicktodos [Motivo]");
return 1;
}
new String[128];
format(String, sizeof(String), "%s chutou todos os jogadores. [Motivo: %s ] |-", pName( playerid ),reason);
SendClientMessageToAll(COR, String);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if (i != playerid)
{
Kick(i);
}
}
}
else SendClientMessage( playerid, COR, "ERRO: Apenas administradores acima do Level 2.");
return 1;
}
#include <YSI/y_ini>
//Faz a leitura do Include.
public OnPlayerConnect(playerid)
{
if(!INI_Exist( pName( playerid))) // Verifica se existe um arquivo com o nome do jogador.
ShowPlayerDialog( playerid, D_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Coloque uma senha abaixo:", "Ok", "Sair");
//Caso nгo exista o arquivo abre-se o dialog "STYLE_INPUT" com a mensagem acima.
else ShowPlayerDialog( playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Login", "Coloque sua senha abaixo:", "Logar", "Sair");
//Caso o arquivo exista abre-se o dialog "STYLE_INPUT" com a mensagem acima.
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case D_REGISTRO: //Vocк sabe.
{
if (!response) //Caso a respota foi "Sair" (Botгo 2) o jogador й kickado.
return Kick(playerid);
if(response) //Respota "Ok" (Botгo 1). - Procegue a fuзгo.
{
if(strlen(inputtext[0]) == 0 ))
return ShowPlayerDialog( playerid, D_REGISTRO, DIALOG_STYLE_INPUT, "Senha Invбlida", "Vocк nгo digitou nenhum caractere, tente novamente.","Ok", "Sair");
//Verifica se existe algum caractere digitado
if(strlen( inputtext[0]) < 3 || strlen( inputtext[ 0 ] ) > 20 )
return ShowPlayerDialog( playerid, D_REGISTRO, DIALOG_STYLE_INPUT, "Senha Invбlida", "Minimo 3 caracteres, Mбximo 20 caracteres, tente novamente.","Ok", "Sair");
//Verifica se a senha possui mais de 3 caracteres e menos de 20.
new pArquivo[ 10 + MAX_PLAYER_NAME ];
//Novo arquivo do jogador. Nome Mбximo permitido pela SA-MP(24)+10(Contas/..ini)
format( pArquivo , sizeof pArquivo, "Contas/%s.ini", Encode(pName(playerid)));
//Aqui ele verifica se o nome do jogador possui caracteres invalidos (Permitido pelo SA-MP)
//"encode" ele codifica o nome do jogador para que torne-se possivel a leitura.
new INI:pConta = INI_Open(pArquivo); //Cria um novo arquivo (Se ja existe, apenas abre).
INI_WriteString(pConta,"NOME",pName(playerid)); //Edita a String. "Nome" com o nome do jogador
INI_WriteInt(pConta,"DINHEIRO",1000); //Edita a string "Dinheiro" com 1000 reais.
INI_Close(pConta); //Fecha o arquivo.
GivePlayerMoney( playerid, 1000 ); // >_>"
ShowPlayerDialog( playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Login", "Coloque sua senha abaixo:", "Logar", "Sair");
//Abre o dialog de Login
//Como eu disse й apenas um exemplo, nгo ha a necessidade de eu criar um login automбtico.
}
}
//=====================================================================
case D_LOGIN:
{
if (!response)//Caso a respota foi "Sair" (Botгo 2) o jogador й kickado.
return Kick( playerid);
if(response)//Respota "Ok" (Botгo 1). - Procegue a fuзгo.
{
if (strlen(inputtext) == 0)
return ShowPlayerDialog( playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Senha Invбlida","Vocк nгo digitou nada, tente novamente"",Logar", "Sair");
new pArquivo[10+MAX_PLAYER_NAME],Password[20+1] ;
format( pArquivo , sizeof pArquivo, "Contas/%s.ini",Encode(pName(playerid )));
INI_ParseFile(pArquivo, "PlayerSenha", false, true, playerid); //Verifica a senha do jogador atraves da funзгo ParseFile
//ela й um tanto complexa, verifique o post principal de y_ini par amais detalhes sobre como usб-la
GetPVarString(playerid, "pSenha", Password, sizeof Password );
//Verifica a senha em PVar.
if(!strcmp (inputtext,Password,false ) ) //Verifica se a senha colocada й igual a senha do arquivo
{
format( pArquivo , sizeof pArquivo, "Contas/%s.ini", Encode( pName( playerid ))); //Ja expliquei em registro.
INI_ParseFile( pArquivo, "CarregarJogador", false, true, playerid, true, false);
//Outra funзгo ParseFile, apenas leie o post principal de Y_ini e vocк vai entender.
GivePlayerMoney(playerid, GetPVarInt( playerid, "Dinheiro" ));
//Da o valor atual de dinheiro salvo no arquivo ao jogador, atravйs da variavel!
}
else ShowPlayerDialog( playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Senha Invбlida","Incorreta, tente novamente"",Logar", "Sair");
//Caso a senha nгo esteja correta, ele retorna ao dialog novamente.
}
}
}
return 1;
}
}
forward PlayerSenha( playerid, name[ ], value[ ] );
public PlayerSenha( playerid, name[ ], value[ ] )
{
if ( !strcmp( name, "SENHA" ) ) //Compara a conta com a senha.
{
SetPVarString( playerid, "pSenha", value );
//Coloca o valor da senha (a senha em si) dentro da variavel.
}
}
forward CarregarJogador( playerid, name[ ], value[ ] );
public CarregarJogador( playerid, name[ ], value[ ] )
{
if(!strcmp(name, "DINHEIRO"))SetPVarInt( playerid,"Dinheiro", strval(value));
//Bom, й um sistema simples. Apenas salvando o dinheiro vocк ja deve ter uma noзгo
//do seu funcionamento. Aqui, ele pega o valor atual do dinheiro do jogador e coloca dentro
//da variavel "Dinheiro"
}
public OnPlayerDisconnect(playerid, reason)
{
if (INI_Exist(pName(playerid))) //Verifica se exite o arquivo com o nome do jogador que se desconectou
{
new pArquivo[10+MAX_PLAYER_NAME +1]; //10+24+1(Nulo).
format(pArquivo ,sizeof pArquivo, "Contas/%s.ini", Encode(pName( playerid ))); //Ja expliquei.
new INI:pConta = INI_Open( pArquivo ); //Abre o Arquivo do jogador
INI_WriteInt( pConta,"DINHEIRO",GetPlayerMoney( playerid ));
INI_Close( pConta ); //Fecha o arquivo.
}
return 1;
}
stock pName( playerid )
{
new Name[ MAX_PLAYER_NAME ];
GetPlayerName( playerid, Name, sizeof( Name ) );
return Name;
}
Hehe eu estava procurando como usar Y_ini a ums trкs dias atrбs, mas consegui usar totalmente ontem, realmente Y_ini й уtimo mas como vocк disse algumas pessoas preferem usar Dini pela "Praticidade" ou as vezes por pura preguiзa mesmo.Foreach eu sempre usei, vou trocar meu ZCMD para YCMD tambйm pois sу tive vantagem com os trabalhos do ******. Ah jб ia me esquecendo, уtimo trabalho LuxurioN.
|
Muito legal o tutorial, reforзo muito meu conhecimento de y_ini, jб estou passando meu sistema de salvamento para essa include. Agora vou aprender a usar ycmd...
Vlw pelo tuto Luxurion... |
Realmente. De uns tempos pra cб estou me dedicando a estudar o YSI (Os sistemas do ******) juntamente com C++, atй parei um pouco de atualizar o AdminScript, para ver como funciona. E, sу atualmente pude perceber o quando perdemos. Alex fez o que, na minha opiniгo, й o melhor conjunto de scripts do SA-MP. YSI й simples e possui cуdigos bem avanзados, alйm de serem perfeitamente estruturados. Sinto por estar comeзando a estudб-lo e ver suas verdadeiras funcionalidades apenas agora. Acredito que os "scripters" estгo dando algum valor somente agora porque conforme os scripts vгo crescendo de tamanho, os verdadeiros problemas "Internos" comeзam a surgir, requerendo algo com mais "desempenho", e funзхes mais inovadoras.
Mas, infelismente ainda existem aqueles que apenas pegam os scripts prontos, modificam 3-4 linhas e dizem terem sido eles que fizeram. Querem enganar a quem? A si mesmos, й pior apenas para si prуprio. Eu queria ver, quantas pessoas que se dizem "scripters" serem capazes de abrirem o pawno e criarem, do nada, um script considerado avanзado. |
Nossa. Ficou muito bom o tutorial. Уtimo trabalho Luxurion..
Jб deixei de usar Y_INI 2 vezes para usar dini porque й realmente mais prбtico..Mas se for parar para pensar.Compensa mesmo entender esse sistema de ponta a ponta e comeзa-lo a usar. Meus parabйns. em todas as suas ajudas a tуpicos ou com tutoriais, ficam bem explicados..Muito bom mesmo |
boas,
olha obrigado por esse comentario pois so disseste as verdades ai... o YSI й um conjunto de scripts que eu realmente admiro , muito , porem nunca fui capaz o suficiente para pensar em o estudar sempre fui na onda de simplesmente usar apesar de penso que facilmente aprendo ... muitos daqui nem conhecem metade das minhas capacidades , muito poucos sabem o que eu sou realmente capaz de fazer porem tambem ver se comeзo a estudar realmente c++ mas... o tempo n da para tudo e tbm temos que os divertir :P ( para alem de eu ser o maior perguiзoso a face da terra XD ) bem mas de qualquer maneira obrigado pelo tutorial |
Eu tambйm jб fiquei horas estudando o Foreach, ate mesmo para fazer um igual, nгo a copia mais sim um sistema complexo que nem o dele, o ****** acredito que ele tenha um grande conhecimento pois ja estou varais бreas fora do sa-mp, concerteza isso deixou ele com o conhecimento melhor estou a fazer o mesmo expandindo meus conhecimentos a outras linguagens.
|