[Tutorial] DS Sistema de infoadmin
#1

Ola meu nome e maurilio sou usuario do forum sa-mp a alguns anos , mas tinha em mente para de mecher com isso (Nгo consigo).
Este mes estou de feria do trabalho entгo vou trazer algumas coisas a vocкs que sei fazer , eu so sei o basico da maioria , mas sei procurar.
Mas vamos logo ao assunto , trago pra vocкs um jeito de fazer um /infoadmin para qualquer Gamemode , neste tutorial usaremos o modo de salvamento DOF.
Sim DOF , estou trazendo o que sei fazer nгo o que e o melhor.
Antes que alguem fale que isso e um CTRL C quero avisar que fiz isso hoje cedo.
E so ver o tutorial eo os codigos , bora la.

Primeiramente vamos criar algumas definiзoes que iremos utilizar , a explicaзгo de ambas estarгo ao lado
PHP код:
#define      AdminSalva                 "BrasilRolePlay/Admin/%d.ini" // Local onde sera salvo os arquivos numericos
#define      MAX_VAGAS                  5 // Quandtidade de admins permitida no servidor 
Agora vamos criar uma enum para uma variavel , para que possa guardar as informaзoes que precisamos .
PHP код:
enum pAdm{// Nome da Enum
     
Name[24], // Ira guardar o nome do admin
     
Nivel// Ira guardar o nivel do admin
}
new 
AdminInfo[MAX_VAGAS][pAdm];// Chamaremos todas as fuctions acima com esta variavel. 
Agora ha uma necessidade de salvar e guardar as informaзoes compostas nestas variaveis , lembre-se sempre que quizer checar todas as vagas usaras loop.

Vamos criar uma public para verificar se o arquivos estao criados
Caso os arquivos esteja criados carregaremos eles normamente em DOF2
Caso nao esteja criado Vamos setar as variaveis e salvaremos elas , ja que precisa ir para o arquivo para que sejam criado, e a variavel tenha informacoes
pq essa public sera chamada em OnGameModeInit

PHP код:
forward AdmCarrega();
public 
AdmCarrega()// sera chamada em OnGameModeInit
{
    new 
string2[80];
    for(new 
vagads 0vagads MAX_VAGASvagads++) // Loop utilizado para verificar todas as vagas "MAX_VAGAS"
    
{
       
format(string2sizeof(string2), AdminSalvavagads);// Local onde definimos para ser salvo "AdminSalva"
       
if(!DOF2_FileExists(string2))// Verifica se existe os arquivos
       
{
          
DOF2_CreateFile(string2); // Cria o arquivo
          
format(AdminInfo[vagads][Name], 24,"Slot"); //Seta a variavel para Slot como se fosse o nome do jogador
          
AdminInfo[vagads][Nivel] = 0// seta o nivel a 0
          
DOF2_SetString(string2,"Nome",AdminInfo[vagads][Name]);// Salva o que esta na variavel para o arquivo
          
DOF2_SetInt(string2,"Nivel"AdminInfo[vagads][Nivel]);// Salva o que esta na variavel para o arquivo
          
DOF2_SaveFile();// Salva o arquivo
       
}
       else
       {
          
format(AdminInfo[vagads][Name], 24DOF2_GetString(string2,"Nome")); // Efetua o carregamento do nome que esta no arquivo passando para a variavel
          
AdminInfo[vagads][Nivel] = DOF2_GetInt(string2,"Nivel");// Carrega o nivel enviando para a variavel
       
}
    }
    return 
true;

Bom ja para salvar nao tem segredo e ja foi explicado acima .
PHP код:
forward AdmSalva();
public 
AdmSalva() // Colocar em GameModeExit
{
    new 
string2[180];
    for(new 
vagads 0vagads MAX_VAGASvagads++)
    {
       
format(string2sizeof(string2), AdminSalvavagads);
       if(
DOF2_FileExists(string2))
       {
           
DOF2_SetString(string2,"Nome",AdminInfo[vagads][Name]);
           
DOF2_SetInt(string2,"Nivel"AdminInfo[vagads][Nivel]);
           
DOF2_SaveFile();
       }
    }
    return 
true;

Com isso vocк ja tem o seu sistema de info admin pronto .

Vou demonstrar agora como utiliza-lo , por exemplo quando o jogar tomar respawn e tiver com o nome na lista .

PHP код:
public OnPlayerSpawn(playerid)
{
       new 
name[MAX_PLAYER_NAME];// Variavel string
       
GetPlayerName(playeridnamesizeof(name));// Geta nome
       
for(new vagads 0vagads MAX_VAGASvagads++)// loop para verificar todas as variaveis
       
{
            if(!
strcmp(AdminInfo[vagads][Name],name,true))// Ira verificar se o q ta guardado na variavel Name e igual a Name
            
{
               
// Se estiver aqui colocaras o que deseja
            
}
       }
       return 
true;

Agora por exemplo um /infoadmin
Nгo tem nem o que explicar neste comando , caso vocк tenha lido o tutorial .
PHP код:
command(adminsplayeridparams[])
{
    new 
corda[500], wiki[500];
    for(new 
vagads 0vagads MAX_VAGASvagads++)
    {
       
format(wikisizeof wiki,"{FFFFFF}(VAGA %d)%s | Nivel : %s(%d) \n"vagadsAdminInfo[vagads][Name], NomeNivel[AdminInfo[vagads][Nivel]], AdminInfo[vagads][Nivel]);
       
strcat(cordawiki);
    }
    
ShowPlayerDialog(playerid1000DIALOG_STYLE_LIST"Administradores do servidor"corda,"Sair"#);
    
return true;

Algo util a se dizer que para verificar se tem alguem na vaga deve-se fazer da seguinte maneira .
PHP код:
for(new vaga 0vaga MAX_VAGASvaga++)// loop para verificar em todas
        
{
            if(!
strcmp(AdminInfo[vaga][Name],"Slot",true))// Verifica se Name e igual a Slot | Slot referente a vaga vazia
            
{
            }
       }
       
       
/*APENAS SLOT 1 POR EXEMPLO*/
       
if(!strcmp(AdminInfo[1][Name],"Slot",true))// Verifica se Name e igual a Slot | Slot referente a vaga vazia
       
{
       } 
Estou desenvolvendo um gamemode com algumas maneiras que possam facilitar a vida de quem utiliza-lo e saia alguns tutoriais para vocкs .
Devo postar este gamemode base .

Creditos --- Don_Speed
Comente sua opiniгo

Leia o tutorial antes de cagar no post
Reply
#2

Deixando exemplo de como foi utilizado em meu Gamemode.
PHP код:
CallBacK::OnPlayerSpawn[playerid]
{
    if(
PlayerInfo[playerid][Login] == true)
    {
       for(new 
vagads 0vagads MAX_VAGASvagads++)
       {
            if(!
strcmp(AdminInfo[vagads][Name],DonPegaNome(playerid),true))
            {
               new 
donstring[80];
               
format(donstringsizeof donstring"Vocк tem administrador nivel %d(%s)",AdminInfo[vagads][Nivel], NomeNivel[AdminInfo[vagads][Nivel]]);
               
SendClientMessage(playerid, -1donstring);
               
PlayerInfo[playerid][Admin] = AdminInfo[vagads][Nivel];
            }
       }
    }
    else
    {
        
/*Respawn hospital ou ate msm direto a org / emprego*/
    
}
    return 
1;
}
command(adminsplayeridparams[])
{
    new 
corda[500], idwiki[500];
    for(new 
vagads 0vagads MAX_VAGASvagads++)
    {
       
id ReturnUser(AdminInfo[vagads][Name]);
       if(
IsPlayerConnected(id))
       {
          
format(wikisizeof wiki,"{FFFFFF}(VAGA %d)%s | Nivel : %s(%d) - {00FF00}Online\n"vagadsAdminInfo[vagads][Name], NomeNivel[AdminInfo[vagads][Nivel]], AdminInfo[vagads][Nivel]);
          
strcat(cordawiki);
       }
       else
       {
          
format(wikisizeof wiki,"{FFFFFF}(VAGA %d)%s | Nivel : %s(%d) - {FF0000}Offiline\n"vagadsAdminInfo[vagads][Name], NomeNivel[AdminInfo[vagads][Nivel]], AdminInfo[vagads][Nivel]);
          
strcat(cordawiki);
       }
    }
    
ShowPlayerDialog(playerid1000DIALOG_STYLE_LIST"Administradores do servidor"corda,"Sair"#);
    
return true;
}
command(admconvidarplayeridparams[])
{
    new 
DSNome[24], idparamandarmensagem[150];
    if(
PlayerInfo[playerid][Admin] < 4)return SendClientMessage(playerid, -"Erro vocк nao e admin nivel 4");
     if(
sscanf(params"s"DSNome))return SendClientMessage(playerid, -1"Uso correto: /admconvidar [nome completo EX: Don_Speed]");
    
format(EmGeralsizeof(EmGeral), ContaSalva DSNome);
    if(!
DOF2_FileExists(EmGeral))return SendClientMessage(playerid, -1"Conta inexistente");
    
id ReturnUser(DSNome);
    if(
IsPlayerConnected(id))
    {
        if(
PlayerInfo[id][Admin] > 0) return SendClientMessage(playerid,-1,"Jogador ja possui administrador");
        for(new 
vaga 0vaga MAX_VAGASvaga++)
        {
            if(!
strcmp(AdminInfo[vaga][Name],"Slot",true))
            {
                
format(paramandarmensagemsizeof paramandarmensagem"Jogador %s(%d) esta conectado e recebeu seu administrador."DSNomeid);
                
SendClientMessage(playerid, -1,paramandarmensagem);
                
format(paramandarmensagemsizeof paramandarmensagem"Vocк acabou de ser convocado para a staff do servidor.");
                
SendClientMessage(id, -1,paramandarmensagem);
                
PlayerInfo[id][Admin] = 1;
                
format(AdminInfo[vaga][Name], 80DSNome);
                
AdminInfo[vaga][Nivel] = 1;
                
AdmSalva();
                return 
true;
            }
           }
    }
    else
    {
        for(new 
vaga 0vaga MAX_VAGASvaga++)
        {
            if(!
strcmp(AdminInfo[vaga][Name],DSNome,true))return SendClientMessage(playerid, -"Jogador ja e administrador.");
            if(!
strcmp(AdminInfo[vaga][Name],"Slot",true))
            {
                
format(paramandarmensagemsizeof paramandarmensagem"Jogador %s recebeu seu convite para ser administrador."DSNomeid);
                
SendClientMessage(playerid, -1,paramandarmensagem);
                
format(AdminInfo[vaga][Name], 80DSNome);
                
AdminInfo[vaga][Nivel] = 1;
                
AdmSalva();
                return 
true;
            }
           }
    }
    return 
true;
}
command(admexpulsarplayeridparams[])
{
    new 
idparamandarmensagem[150], sujeito[24];
    if(
PlayerInfo[playerid][Admin] < 4)return SendClientMessage(playerid, -"Erro vocк nao e admin nivel 4");
     if(
sscanf(params"s"sujeito))return SendClientMessage(playerid, -1"Uso correto: /admexpulsar [nome completo EX: Don_Speed]");
    
format(EmGeralsizeof(EmGeral), ContaSalva sujeito);
    if(!
DOF2_FileExists(EmGeral))return SendClientMessage(playerid, -1"Conta inexistente");
    for(new 
vaga 0vaga MAX_VAGASvaga++){
    
id ReturnUser(params);
    if(
IsPlayerConnected(id))
    {
       if(!
strcmp(AdminInfo[vaga][Name],sujeito,true))
       {
          
format(paramandarmensagemsizeof paramandarmensagem"Jogador %s(%d) esta conectado e recebeu seu aviso de expulsгo."sujeitoid);
          
SendClientMessage(playerid, -1,paramandarmensagem);
          
format(paramandarmensagemsizeof paramandarmensagem"Vocк acabou de ser expulso da staff do servidor.");
          
SendClientMessage(id, -1,paramandarmensagem);
          
PlayerInfo[id][Admin] = 0;
          
format(AdminInfo[vaga][Name], 80"Slot");
          
AdminInfo[vaga][Nivel] = 0;
          
AdmSalva();
          return 
true;
       }
    }
    else
    {
       if(!
strcmp(AdminInfo[vaga][Name],sujeito,true))
       {
          
format(paramandarmensagemsizeof paramandarmensagem"Jogador %s nгo e mais adimiistrador."sujeito);
          
SendClientMessage(playerid, -1,paramandarmensagem);
          
format(AdminInfo[vaga][Name], 80"Slot");
          
AdminInfo[vaga][Nivel] = 0;
          
AdmSalva();
          return 
true;
       }
    }}
    return 
true;
}
command(admpromoverplayeridparams[])
{
    new 
DSNomeid;
    if(
PlayerInfo[playerid][Admin] < 4)return SendClientMessage(playerid, -"Erro vocк nao e admin nivel 4");
     if(
sscanf(params"d"DSNome))return SendClientMessage(playerid, -1"Uso correto: /admpromover [id da vaga (/admins)]");
    
id ReturnUser(AdminInfo[DSNome][Name]);
    if(
IsPlayerConnected(id))
    {
       if(!
strcmp(AdminInfo[DSNome][Name],"Slot",true))return SendClientMessage(playerid, -1"Erro ninguem nesta vaga.");
       if(
AdminInfo[DSNome][Nivel] == 4)return SendClientMessage(playerid, -1"Erro ja esta no nivel maximo.");
       
AdminInfo[DSNome][Nivel] ++;
       
PlayerInfo[id][Admin] ++;
       
SendClientMessage(playerid, -1,"Vocк promoveu o jogador.");
       
SendClientMessage(id, -1,"AVISO: Vocк foi promovido na administraзгo.");
       
AdmSalva();
    }
    else
    {
       if(!
strcmp(AdminInfo[DSNome][Name],"Slot",true))return SendClientMessage(playerid, -1"Erro ninguem nesta vaga.");
       if(
AdminInfo[DSNome][Nivel] == 4)return SendClientMessage(playerid, -1"Erro ja esta no nivel maximo.");
       
AdminInfo[DSNome][Nivel] ++;
       
SendClientMessage(playerid, -1,"Vocк promoveu o jogador.");
       
AdmSalva();
    }
    return 
true;

Quote:
Originally Posted by Jelly23
Посмотреть сообщение
Tem algumas coisas que melhorar, nгo verifiquei todo o cуdigo e vou voltar a postar se necessбrio. Bem, entгo vamos comeзar:

PHP код:
Name[80
80 cйlulas para nomes? O mбximo й 24.
Porra nem lembrava disso , vlw por me lembrar.


Reply
#3

Tem algumas coisas que melhorar, nгo verifiquei todo o cуdigo e vou voltar a postar se necessбrio. Bem, entгo vamos comeзar:

PHP код:
Name[80
80 cйlulas para nomes? O mбximo й 24.

PHP код:
 new corda[500], wiki[500]; 
    for(new 
vagads 0vagads MAX_VAGASvagads++) 
    { 
       
format(wikisizeof wiki,"(VAGA %d)%s | Nivel : %s(%d) \n"vagadsAdminInfo[vagads][Name], NomeNivel[AdminInfo[vagads][Nivel]], AdminInfo[vagads][Nivel]); 
       
strcat(cordawiki); 
    } 
Em casos como este, nгo tem a necessidade de usar strcat, ficando assim:

PHP код:
new wiki[500];
for(new 
vagads 0vagads MAX_VAGASvagads++) 
{
    
format(wikisizeof wiki,"%s(VAGA %d)%s | Nivel : %s(%d) \n"wiki,vagadsAdminInfo[vagads][Name],NomeNivel[AdminInfo[vagads][Nivel]], AdminInfo[vagads][Nivel]);

Mesmo assim, nгo desconsidero o trabalho dos outros, entгo +rep (Vou ter que esperar chegar nos 50 posts).
Reply
#4

Muito bom o tutorial Don, parabйns.
Reply
#5

Й aquele velho ditado: O Bom Filho а Casa Torna..

DOF2 salvamento raiz haha.

Bom trabalho parceiro. Espero que essa nova geraзгo leia e estude..
Reply
#6

Muito utнl.
Reply
#7

De fato muito ъtil para a evoluзгo dos sistemas de administradores dos servidores.

REP += 2;
Reply
#8

Bom tuto!
Reply
#9

Um erro comum que vejo muitos cometendo й quando vгo vгo comparar o nome do jogador usando strcmp com ignorecase = true.

Nesse caso, um jogador que entrasse com o nick Dom_SPEED entraria de admin no seu servidor, pois letra maiъscula seria a mesma coisa que minъscula.
Reply
#10

vocк pediu pra comentar a opiniгo:


tu programa pra cego? teu cуdigo й muito feio, adote algum estilo de nomenclatura e para de misturar tudo igual um retardado. tentei falar de uma forma carinhosa da ultima vez, mas tu ignorou entгo viva na ignorвncia.

tu й muito vagabundo cara, a preguiзa vive em ti. todo tуpico que tu posta й desleixado, mal organizado e cheio de informaзгo inъtil. parece que tu escreveu de qualquer forma sу pra ganhar tуpicos/reputaзгo. cria vergonha na cara e quando for apresentar alguma coisa apresenta certo, e se for fazer faзa algo que preste e que va ser util pra alguma coisa.

se alguem for usar isso que tu escreveu й pq nao sabe fazer, qualquer um que saiba vai preferir fazer o seu. e o que tu acha que um novato vai fazer com isso? aprender a bostejar codigo que nem tu faz? ele nao vai saber fazer nada com o que tu escreveu ai. isso vai morrer nesse topico mesmo. isso vai ser esquecido pela humanidade.


й, eu falo demais mesmo, eu exagero.. eu to й cagando.. essa galera precisa de um pouco de realidade na cara mesmo. DE UM SOCO DE REALIDADE.

7 ANOS NESSE FORUM E ME FAZ UMA COISA DESSAS!
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)