[Tutorial] Criando seu sistema basico de administraзгo!
#1

Introduзгo
Olб tudo bom?
Eu nгo sou muito experiente entгo nгo venha com chingamentos e ofensas pois nгo irei nem ligar..

Vamos usar neste sistema as seguintes includes que podem ser encotradas no tio ******:
DOF2 - ZCMD - SSCANF

Comeзando
Primeiro iremos criar uma variбvel para hospedar o nivel de administrador e a variavel que irб hospedar se o administrador estб trabalhando ou nгo. (caso nгo saiba oque й uma variбvel vocк precisa saber o basico antes deste tutorial, entгo procure o tutorial do garfild.)
pawn Код:
new Administrador[MAX_PLAYERS];
/*
Explicaзгo:
new = Cria a variбvel.
Administrador = Nome da variбvel.
MAX_PLAYERS = Numero maximo de players do servidor.
*/

new Trabalhando[MAX_PLAYERS];
// A Explicaзгo da primeira variavel se encaixa nessa tambem..
Agora iremos entender algumas funзхes do DOF2:
pawn Код:
DOF2_GetString // Geta um valor de uma string (como o valor %s).
DOF2_SetString // Seta um valor de uma string.
DOF2_GetInt // Geta um valor numerico.
DOF2_SetInt // Seta um valor numerico.
DOF2_CreateFile // Cria um arquivo.
DOF2_FileExists // Checa se um arquivo existe.
DOF2_SaveFile // Salva um arquivo.
Agora vamos usar a callback(public) OnPlayerConnect para criar/carregar os dados da pasta Admins/NOME DO PLAYER.ini
pawn Код:
public OnPlayerConnect(playerid) {
    Trabalhando[playerid] = 0; // Caso o player seja administrador entrar em modo jogo..
    new file[70]; // Variavel que irб hospedar os dados do player.
    new snd[MAX_PLAYER_NAME]; // Variavel que irб hospedar o nome do player.
    GetPlayerName(playerid, snd, sizeof snd); // Funзгo que geta o nome do player e hospeda na variavel snd.
    format(file,sizeof file,"Admins/%s.ini",snd); // Irб hospedar os dados do arquivo Admins/nomedoplayer.ini na variavel file.
    if(DOF2_FileExists(file)) { // Se o arquivo existir..
        Administrador[playerid] = DOF2_GetInt(file,"Admin");
/*
Aqui irб hospedar o valor da linha 'Admin' do arquivo hospedado na variavel 'file' na variavel Administrador que criamos no comeзo..
*/

    }
    else if(!DOF2_FileExists(file)) { // Se o arquivo nгo existir..
        DOF2_CreateFile(file); // Cria o arquivo hospedado na variavel file.
        DOF2_SetInt(file,"Admin",0); // Seta a linha 'Admin' para o valor '0' que seria sem admin.
        DOF2_SaveFile(); // Irб salvar o arquivo acima.

        Administrador[playerid] = DOF2_GetInt(file,"Admin");
/*
Acima criamos e carregamos o arquivo ao mesmo tempo..
*/

    }
    return true;
}
Agora vamos para a ultima parte que sгo os comandos!
Й bem simples, basta usar a seguinte funзгo nos comandos:
pawn Код:
if(Administrador[playerid] == 0) return SendClientMessage(playerid,0xC0C0C0AA,"Vocк nгo й um administrador!");
// Isso checa se o player que executou o comando й administrador ou nгo..
Agora basta criar sua criatividade
Olhe 3 comandos (/admins - /trabalhar - /kick) sem explicaзхes(й sу uma base para vocк)..
pawn Код:
CMD:admins(playerid,params[]) {
    #pragma unused params
    new string[128];
    for(new x = 0; x < MAX_PLAYERS; x++) {
        if(Administrador[i] >= 1) {
            format(string, sizeof string, "• Admin: %s Nivel: [Normal] Modo: [%s]",Trabalhando[i] ? ("Trabalhando") : ("Jogando"));
            SendClientMessage(playerid, -1, string);
        }
        if(IsPlayerAdmin(i)) {
            format(string, sizeof string, "• Admin: %s Nivel: [RCON] Modo: [%s]",Trabalhando[i] ? ("Trabalhando") : ("Jogando"));
            SendClientMessage(playerid, -1, string);
        }
    }
    return 1;
}

CMD:trabalhar(playerid,params[]) {
    #pragma unused params
    new string[128], snd[MAX_PLAYER_NAME];
    GetPlayerName(playerid, snd, sizeof snd);
    if(Administrador[playerid] == 0 || !IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xC0C0C0AA,"Vocк nгo й um administrador!");
    if(Trabalhando[playerid] == 0) {
        SetPlayerHealth(playerid, cellmax);
        Trabalhando[playerid] = 1;
    }
    else if(Trabalhando[playerid] == 1) {
        SetPlayerHealth(playerid, 100);
        Trabalhando[playerid] = 0;
    }
    format(string, sizeof string, ">> O Administrador %s acaba de %s.",snd,Trabalhando[playerid] ? ("entrar no modo trabalho") : ("saiu do modo trabalho"));
    SendClientMessageToAll(-1,string);
    return 1;
}

CMD:kick(playerid,params[]) {
    new id,motivo[128],string[128],snd[MAX_PLAYER_NAME];
    if(Administrador[playerid] == 0 || !IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xC0C0C0AA,"Vocк nгo й um administrador!");
    if(Trabalhando[playerid] == 0) return SendClientMessage(playerid, 0xC0C0C0AA, "Use: /trabalhar");
    if(sscanf(params,"us",id,motivo)) return SendClientMessage(playerid, 0xC0C0C0AA, "Use: /kick [playerid] [motivo]");
    GetPlayerName(id,snd,sizeof snd);
    format(string, sizeof string, ">> O Player %s foi kickado por %s.",snd,motivo);
    SendClientMessageToAll(-1,string);
    Kick(id);
    return 1;
}
Espero que gostem! Abraзos HumildadeAgain.
Reply
#2

Faltou:

pawn Код:
public OnPlayerConnect(playerid) {
   
    Trabalhando[playerid] = 0;  
    return true;
}
Modo incorreto.

pawn Код:
CMD:trabalhar(playerid,params[]) {
    #pragma unused params
Modo correto

pawn Код:
CMD:trabalhar(playerid) {
@edit

pawn Код:
new Trabalhando[MAX_PLAYERS];

//MAX_PLAYERS nгo seria o nъmero maximo de players neste caso, mas sim o tamanho do нndice de seu vetor! Tornando ъnico um valor para cada jogador de seu servidor!

@edit2

pawn Код:
if(Administrador[playerid] == 0 && !IsPlayerAdmin(playerid)) //no caso se analisar pela tabela verdade as duas condiзхes devem ser verdadeiras!

//use


 if(Administrador[playerid] == 0 || !IsPlayerAdmin(playerid))

@edit3

Modo lento.

pawn Код:
for(new x = 0; x < MAX_PLAYERS; x++)
Modo mais rapido
pawn Код:
static i;
for ( i = GetMaxPlayers() - 1; i > -1; i-- )
Reply
#3

Quote:
Originally Posted by Programador_Macabro
Посмотреть сообщение
Faltou:

pawn Код:
public OnPlayerConnect(playerid) {
   
    Trabalhando[playerid] = 0;  
    return true;
}
Modo incorreto.

pawn Код:
CMD:trabalhar(playerid,params[]) {
    #pragma unused params
Modo correto

pawn Код:
CMD:trabalhar(playerid) {
@edit

pawn Код:
new Trabalhando[MAX_PLAYERS];

//MAX_PLAYERS nгo seria o nъmero maximo de players neste caso, mas sim o tamanho do нndice de seu vetor! Tornando ъnico um valor para cada jogador de seu servidor!

@edit2

pawn Код:
if(Administrador[playerid] == 0 && !IsPlayerAdmin(playerid)) //no caso se analisar pela tabela verdade as duas condiзхes devem ser verdadeiras!

//use


 if(Administrador[playerid] == 0 || !IsPlayerAdmin(playerid))

@edit3

Modo lento.

pawn Код:
for(new x = 0; x < MAX_PLAYERS; x++)
Modo mais rapido
pawn Код:
static i;
for ( i = GetMaxPlayers() - 1; i > -1; i-- )
Desculpas os erros,
Nгo conhecia o loop mais rapido,
Esqueci do trabalhando,
E sу tentei ajudar..
Reply
#4

Olб HumildadeAgain!

Muito bom. Reputado.

Vlw!
Reply
#5

Quote:
Originally Posted by HumildadeAgain
Посмотреть сообщение
Desculpas os erros,
Nгo conhecia o loop mais rapido,
Esqueci do trabalhando,
E sу tentei ajudar..

Ok tenho uma forma mais otimizada para o comando /admins, porem tenho uma pequena duvida quanto a opereзгo ternaria, quando tiver certeza posto o cуdigo para vocк

Fora isto o tutorial esta muito simples, mas esta bom.
Reply
#6

Quote:
Originally Posted by NuTShoT
Посмотреть сообщение
Olб HumildadeAgain!

Muito bom. Reputado.

Vlw!
Obrigado amigo!
Quote:
Originally Posted by Programador_Macabro
Посмотреть сообщение
Ok tenho uma forma mais otimizada para o comando /admins, porem tenho uma pequena duvida quanto a opereзгo ternaria, quando tiver certeza posto o cуdigo para vocк

Fora isto o tutorial esta muito simples, mas esta bom.
Tambem tenho dъvidas sobre operaзгo tenбria kk'
Mas obrigado pelo elogio e pela correзгo!
Reply
#7

not bad
Reply
#8

Quote:
Originally Posted by s4kuL
View Post
not bad
Thanks!
Reply
#9

Muito bom o tutorial ! dar muito bem para entender , e criar outros sistemas . +rep. ..
Reply
#10

Quote:
Originally Posted by Rodrigo_Avenged
View Post
Muito bom o tutorial ! dar muito bem para entender , e criar outros sistemas . +rep. ..
Valeu amigo!
Reply
#11

Muito bom, isso irб me ajudar +REP
Reply
#12

Quote:
Originally Posted by [NVC]iTrevaS
View Post
Muito bom, isso irб me ajudar +REP
Obrigado cara!

@TOPIC
Topico editado com erros corrigidos (sу nгo nгo arrumei o loop)!
Reply
#13

Quote:
Originally Posted by Programador_Macabro
Посмотреть сообщение
@edit3

Modo lento.

pawn Код:
for(new x = 0; x < MAX_PLAYERS; x++)
Modo mais rapido
pawn Код:
static i;
for ( i = GetMaxPlayers() - 1; i > -1; i-- )
Errado, jб testei isto a tempos e й errado afirmar isto.

PHP код:
public OnFilterScriptInit()
{
    static 
_debug;
    
_debug GetTickCount();
    for(new 
i100000; ++i)
    {
        static 
a;
        for ( 
GetMaxPlayers() - 1> -1a-- )
        {
        
        }
    }
    
printf(#Teste 1: %d,GetTickCount() - _debug);
    
_debug GetTickCount();
    for(new 
i100000; ++i)
    {
        for( new 
MAX_PLAYERS 1> -1; --a)
        {
        
        }
    }
    
printf(#Teste 2: %d,GetTickCount() - _debug);

o segundo й 2 vezes mais rбpido.
Reply
#14

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Errado, jб testei isto a tempos e й errado afirmar isto.

o segundo й 2 vezes mais rбpido.


xisde

mбs ao por ambos em GetMaxPlayers o segundos feito por vocк se torna pouco melhor




agora olha usando uma loop comum

pawn Код:
for(new i_ = 0; i_ < GetMaxPlayers(); i_++)


vixi 2 testes com mesmo valor
Reply
#15

Quote:
Originally Posted by Sky_.
Посмотреть сообщение


xisde

mбs ao por ambos em GetMaxPlayers o segundos feito por vocк se torna pouco melhor


o total de slots no seu servidor й modificado para dar tal resultado.(abaixo de ~230 slots). Caso seja maior que ~230 slots o 2 loop sera mais rбpido mesmo percorrendo os 500 slots que jб й prй-definido.

Basta modificar meu cуdigo acima que claramente foi mal compreendido, por este abaixo.
PHP код:
(GetMaxPlayers() - 1) - 270 
@@DEVE HAVER OS 500 SLOTS ! ! !
Reply
#16

Vai ajudar muitos, boa iniciativa .
Reply
#17

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
o total de slots no seu servidor й modificado para dar tal resultado.(abaixo de 230 slots). Caso seja maior que 230 slots o 2 loop sera mais rбpido mesmo percorrendo os 500 slots que jб й prй-definido.

Basta modificar meu cуdigo acima que claramente foi mal compreendido, por este abaixo.
PHP код:
(GetMaxPlayers() - 1) - 270 
@@DEVE HAVER OS 500 SLOTS ! ! !
adoro desafios. vou fazer a modificaзгo e mudar os slots e tentar novamente :0 jaja do um edit

@edit

Resultado Mostra que a segunda forma com 500 Slots й quase 2 vezes mais rapida

Reply
#18

Nгo й desafio, й uma afirmaзгo, pois jб testei e sei o resultado final. lol.
Reply
#19

Quote:
Originally Posted by leonardo1434
View Post
Nгo й desafio, й uma afirmaзгo, pois jб testei e sei o resultado final. lol.
veja o edit ^^

caso nгo seja o resultado correto esperado por vocк poste o seu code e a sua print para eu ver se promove resultado diferente . :P
Reply
#20

Por volta disso:
PHP Code:
[21:32:18Teste 11738
[21:32:18Teste 2838 
Mas enfim, й melhor redefinir o max_players de acordo com os slots do que usar getmaxplayers.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)