Decidi postar aqui o sistema de registo/login que criei para o meu gamemode, que grava:
- Dinheiro;
- Banco;
- Sexo;
- Vip;
- Administrador.
Gravava também: Hotel, Cargo, Líder, Membro, Representante Player, Skin, Organização, Emprego, ... mas como não quero postar o tópico só para rpg, vou postar só com isso.
Os includes:
pawn Code:
#include a_samp #include SII
Agora por baixo, iremos colocar as funções de dinheiro e as cores:
pawn Code:
#define DarDinheiro(%0,%1) Info[%0][Dinheiro] += %1 #define RetirarDinheiro(%0,%1) Info[%0][Dinheiro] -= %1 #define SetarDinheiro(%0,%1) Info[%0][Dinheiro] = %1 #define GetarDinheiro(%0) Info[%0][Dinheiro] #define ResetarDinheiro(%0) Info[%0][Dinheiro] = 0; #define Esverdeado (0x808000AA) #define Vermelho (0xE60000FF) #define Amarelo (0xFFFF00FF) #define Branco (0xFFFFFFAA) #define Verde (0x21DD00FF) #define aCor (0x0080C0AA) #define cVip1 (0xFFF000AA) //Alterar #define cVip2 (0xFFF000AA) //Alterar #define cVip3 (0xFFF000AA) //Alterar
Agora, as defines dos dialogs (registar, logar, sexo, kickado):
pawn Code:
#define DialogRegistar (100) #define DialogLogar (101) #define DialogSexo (102) #define DialogKickado (104)
Para acabar com as defines, colocar a define do CASE_SENSITIVE e a define das Contas e do AdminBot:
pawn Code:
#define Contas "Contas/%s.ini" #define AdminBot "Diogo B." #define CASE_SENSITIVE false
De seguida, iremos colocar as arrays e as forwards do sistema:
pawn Code:
enum Informacoes { Administrador, Jogador[24], SenhaErrada, Outro[24], Dinheiro, Logado, Banco, Senha, Sexo, Vip, }; static Info[MAX_PLAYERS][Informacoes], sStringFrm[128], sStringArq[128], Data[3], Time[3]; forward CallSalvar(playerid); forward CallCarregar(playerid);
Depois de isto tudo feito, já podemos ir para as callbacks.
Para começar, iremos colocar a callback OnPlayerConnect e OnPlayerDisconnect (que é quando os players se conectam e desconectam do servidor):
pawn Code:
public OnPlayerDisconnect(playerid, reason) return CallSalvar(playerid); public OnPlayerConnect(playerid) { CallCarregar(playerid); GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar" ); } else { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Não registada!\n\nColoque a sua senha para se registar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog( playerid, DialogRegistar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Registo:", sStringFrm, "Registar", "Cancelar" ); } return true; }
Depois de isto feito, podemos passar para a callback do OnPlayerDialogResponse, onde se encontrarão as funções dos dialogs:
pawn Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(dialogid == DialogLogar) { if(response) { if(strlen(inputtext) == 0) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar"); SendClientMessage(playerid, Verde, "A senha deve ter mais do que 0 digitos!"); } static Input[20]; INI_Open(sStringArq); INI_ReadString(Input, "Senha"); INI_Close(); if(!strcmp(inputtext, Input, CASE_SENSITIVE)) { SpawnPlayer(playerid); format(sStringFrm, sizeof(sStringFrm), "%s, seja bem-vindo ao servidor (:", Info[playerid][Jogador]); SendClientMessage(playerid, Amarelo, sStringFrm); if(Info[playerid][Administrador] >= 1) { format(sStringFrm, sizeof(sStringFrm), "Logado com nível %d de administrador (:", Info[playerid][Administrador]); SendClientMessage(playerid, aCor, sStringFrm); } if(Info[playerid][Vip] == 1) return SendClientMessage(playerid, cVip1, "Logado com Vip Gold (:"); if(Info[playerid][Vip] == 2) return SendClientMessage(playerid, cVip2, "Logado com Vip Prata (:"); if(Info[playerid][Vip] == 3) return SendClientMessage(playerid, cVip3, "Logado com Vip Bronze (:"); } else { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar"); SendClientMessage(playerid, Vermelho, "Senha errada! Se errar 3 vezes, é kickado!"); Info[playerid][SenhaErrada] += 1; if(Info[playerid][SenhaErrada] == 3) { SendClientMessage(playerid, Branco, "Você foi kickado do servidor por errar a senha 3 vezes!"); Kickar(playerid, "Errou a senha 3 vezes"); } } } else if(!response) { SendClientMessage(playerid, Branco, "Você foi kickado por não querer-se logar!"); Kickar(playerid, "Não quis logar"); } } else if(dialogid == DialogRegistar) { if(response) { if(!strlen(inputtext)) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Não registada!\n\nColoque a sua senha para se registar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog( playerid, DialogRegistar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Registo:", sStringFrm, "Registar", "Cancelar" ); SendClientMessage(playerid, Verde, "A senha não pode conter 0 digitos!"); } strmid(Info[playerid][Senha], inputtext, 0, strlen(inputtext), 128); INI_Create(sStringArq); INI_Open(sStringArq); INI_WriteString("Senha", Info[playerid][Senha]); ShowPlayerDialog(playerid, DialogSexo, DIALOG_STYLE_MSGBOX, "{5CACEE}A que sexo pertence?", "Para acabarmos de fazer o seu registo, precisamos de saber o seu sexo.\nEscolha o sexo abaixo", "Masculino", "Feminino"); } else { SendClientMessage(playerid, Branco, "Você foi kickado por não querer-se registar!"); Kickar(playerid, "Não quis registar"); } } else if(dialogid == DialogSexo) { if(response) { Info[playerid][Sexo] = 1; SendClientMessage(playerid, Esverdeado, "Agora que você acabou seu registo... logue-se (:"); Info[playerid][Logado] = true; SetTimerEx("CallInicioPlayer", 2000, false, "i", playerid); INI_WriteInt("Sexo", Info[playerid][Sexo]); } else if(!response) { Info[playerid][Sexo] = 2; SendClientMessage(playerid, Esverdeado, "Agora que você acabou seu registo... logue-se (:"); Info[playerid][Logado] = true; INI_WriteInt("Sexo", Info[playerid][Sexo]); } } return true; }
Para acabar, as callbacks para salvamento e para carregamento das informações, e a stock de kickar:
pawn Code:
public CallSalvar(playerid) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { INI_Open(sStringArq); INI_WriteInt("Dinheiro", GetarDinheiro(playerid)); INI_WriteInt("Banco", Info[playerid][Banco]); INI_WriteInt("Sexo", Info[playerid][Sexo]); INI_WriteInt("Vip", Info[playerid][Vip]); INI_WriteInt("Administrador", Info[playerid][Administrador]); INI_Save(); INI_Close(); } else INI_Create(sStringArq); return true; } public CallCarregar( playerid ) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { INI_Open(sStringArq); DarDinheiro(playerid, INI_ReadInt("Dinheiro")); Info[playerid][Dinheiro] = INI_ReadInt("Dinheiro"); Info[playerid][Banco] = INI_ReadInt("Banco"); Info[playerid][Sexo] = INI_ReadInt("Sexo"); Info[playerid][Vip] = INI_ReadInt("Vip"); Info[playerid][Administrador] = INI_ReadInt("Administrador"); } return true; }
pawn Code:
stock Kickar(playerid, motivo[]) { getdate(Data[0], Data[1], Data[2]); gettime(Time[0], Time[1], Time[2]); GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringFrm, sizeof(sStringFrm), "{E60000}[Kickado] {FFFFFF}%s foi kickado do servidor. [{E60000}Motivo: {FFFFFF}%s]", Info[playerid][Jogador], motivo); SendClientMessageToAll(Branco, sStringFrm); format(sStringArq, sizeof(sStringArq), "%s, você foi kickado do servidor!\n{5CACEE}Administrador: {FFFFFF}%s\n{5CACEE}Motivo: {FFFFFF}%s\n{5CACEE}Data: {FFFFFF}%d/%d/%d\n{5CACEE}Hora: {FFFFFF}%d:%d:%d ", Info[playerid][Jogador], AdminBot, motivo, Data[2], Data[1], Data[0], Time[0], Time[1], Time[2]); ShowPlayerDialog(playerid, DialogKickado, DIALOG_STYLE_MSGBOX, "{5CACEE}Sistema de Kick", sStringArq, "Concluir", ""); return true; }
CÓDIGO COMPLETO:
pawn Code:
/*------------------------------------------------------------------------------ [INCLUDES] ------------------------------------------------------------------------------*/ #include a_samp #include SII /*------------------------------------------------------------------------------ [DINHEIRO] ------------------------------------------------------------------------------*/ #define DarDinheiro(%0,%1) Info[%0][Dinheiro] += %1 #define RetirarDinheiro(%0,%1) Info[%0][Dinheiro] -= %1 #define SetarDinheiro(%0,%1) Info[%0][Dinheiro] = %1 #define GetarDinheiro(%0) Info[%0][Dinheiro] #define ResetarDinheiro(%0) Info[%0][Dinheiro] = 0; /*------------------------------------------------------------------------------ [C & AB] ------------------------------------------------------------------------------*/ #define Contas "Contas/%s.ini" #define AdminBot "Diogo B." /*------------------------------------------------------------------------------ [DIALOGS] ------------------------------------------------------------------------------*/ #define DialogRegistar (100) #define DialogLogar (101) #define DialogSexo (102) #define DialogKickado (104) /*------------------------------------------------------------------------------ [CORES] ------------------------------------------------------------------------------*/ #define Esverdeado (0x808000AA) #define Vermelho (0xE60000FF) #define Amarelo (0xFFFF00FF) #define Branco (0xFFFFFFAA) #define Verde (0x21DD00FF) #define aCor (0x0080C0AA) /*------------------------------------------------------------------------------ [CORES VIP] ------------------------------------------------------------------------------*/ #define cVip1 (0xFFF000AA) //Alterar #define cVip2 (0xFFF000AA) //Alterar #define cVip3 (0xFFF000AA) //Alterar /*------------------------------------------------------------------------------ [CS] ------------------------------------------------------------------------------*/ #define CASE_SENSITIVE false /*------------------------------------------------------------------------------ [ARRAYS] ------------------------------------------------------------------------------*/ enum Informacoes { Administrador, Jogador[24], SenhaErrada, Outro[24], Dinheiro, Logado, Banco, Senha, Sexo, Vip, }; static Info[MAX_PLAYERS][Informacoes], sStringFrm[128], sStringArq[128], Data[3], Time[3]; forward CallSalvar(playerid); forward CallCarregar(playerid); /*------------------------------------------------------------------------------ [CALBACKS] ------------------------------------------------------------------------------*/ public OnPlayerDisconnect(playerid, reason) return CallSalvar(playerid); public OnPlayerConnect(playerid) { CallCarregar(playerid); GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar" ); } else { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Não registada!\n\nColoque a sua senha para se registar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog( playerid, DialogRegistar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Registo:", sStringFrm, "Registar", "Cancelar" ); } return true; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(dialogid == DialogLogar) { if(response) { if(strlen(inputtext) == 0) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar"); SendClientMessage(playerid, Verde, "A senha deve ter mais do que 0 digitos!"); } static Input[20]; INI_Open(sStringArq); INI_ReadString(Input, "Senha"); INI_Close(); if(!strcmp(inputtext, Input, CASE_SENSITIVE)) { SpawnPlayer(playerid); format(sStringFrm, sizeof(sStringFrm), "%s, seja bem-vindo ao servidor (:", Info[playerid][Jogador]); SendClientMessage(playerid, Amarelo, sStringFrm); if(Info[playerid][Administrador] >= 1) { format(sStringFrm, sizeof(sStringFrm), "Logado com nível %d de administrador (:", Info[playerid][Administrador]); SendClientMessage(playerid, aCor, sStringFrm); } if(Info[playerid][Vip] == 1) return SendClientMessage(playerid, cVip1, "Logado com Vip Gold (:"); if(Info[playerid][Vip] == 2) return SendClientMessage(playerid, cVip2, "Logado com Vip Prata (:"); if(Info[playerid][Vip] == 3) return SendClientMessage(playerid, cVip3, "Logado com Vip Bronze (:"); } else { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Registada!\n\nColoque a sua senha para se poder logar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog(playerid, DialogLogar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Login:", sStringFrm, "Logar", "Cancelar"); SendClientMessage(playerid, Vermelho, "Senha errada! Se errar 3 vezes, é kickado!"); Info[playerid][SenhaErrada] += 1; if(Info[playerid][SenhaErrada] == 3) { SendClientMessage(playerid, Branco, "Você foi kickado do servidor por errar a senha 3 vezes!"); Kickar(playerid, "Errou a senha 3 vezes"); } } } else if(!response) { SendClientMessage(playerid, Branco, "Você foi kickado por não querer-se logar!"); Kickar(playerid, "Não quis logar"); } } else if(dialogid == DialogRegistar) { if(response) { if(!strlen(inputtext)) { format(sStringFrm, sizeof(sStringFrm), "{5CACEE}Nome: {FFFFFF}%s\n{5CACEE}Tipo de conta: {FFFFFF}Não registada!\n\nColoque a sua senha para se registar no servidor (:", Info[playerid][Jogador]); ShowPlayerDialog( playerid, DialogRegistar, DIALOG_STYLE_INPUT, "{5CACEE}Sistema de Registo:", sStringFrm, "Registar", "Cancelar" ); SendClientMessage(playerid, Verde, "A senha não pode conter 0 digitos!"); } strmid(Info[playerid][Senha], inputtext, 0, strlen(inputtext), 128); INI_Create(sStringArq); INI_Open(sStringArq); INI_WriteString("Senha", Info[playerid][Senha]); ShowPlayerDialog(playerid, DialogSexo, DIALOG_STYLE_MSGBOX, "{5CACEE}A que sexo pertence?", "Para acabarmos de fazer o seu registo, precisamos de saber o seu sexo.\nEscolha o sexo abaixo", "Masculino", "Feminino"); } else { SendClientMessage(playerid, Branco, "Você foi kickado por não querer-se registar!"); Kickar(playerid, "Não quis registar"); } } else if(dialogid == DialogSexo) { if(response) { Info[playerid][Sexo] = 1; SendClientMessage(playerid, Esverdeado, "Agora que você acabou seu registo... logue-se (:"); Info[playerid][Logado] = true; SetTimerEx("CallInicioPlayer", 2000, false, "i", playerid); INI_WriteInt("Sexo", Info[playerid][Sexo]); } else if(!response) { Info[playerid][Sexo] = 2; SendClientMessage(playerid, Esverdeado, "Agora que você acabou seu registo... logue-se (:"); Info[playerid][Logado] = true; INI_WriteInt("Sexo", Info[playerid][Sexo]); } } return true; } /*------------------------------------------------------------------------------ [SISTEMA DE REGISTO E LOGIN] ------------------------------------------------------------------------------*/ public CallSalvar(playerid) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { INI_Open(sStringArq); INI_WriteInt("Dinheiro", GetarDinheiro(playerid)); INI_WriteInt("Banco", Info[playerid][Banco]); INI_WriteInt("Sexo", Info[playerid][Sexo]); INI_WriteInt("Vip", Info[playerid][Vip]); INI_WriteInt("Administrador", Info[playerid][Administrador]); INI_Save(); INI_Close(); } else INI_Create(sStringArq); return true; } public CallCarregar( playerid ) { GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringArq, sizeof(sStringArq), Contas, Info[playerid][Jogador]); if(INI_Exist(sStringArq)) { INI_Open(sStringArq); DarDinheiro(playerid, INI_ReadInt("Dinheiro")); Info[playerid][Dinheiro] = INI_ReadInt("Dinheiro"); Info[playerid][Banco] = INI_ReadInt("Banco"); Info[playerid][Sexo] = INI_ReadInt("Sexo"); Info[playerid][Vip] = INI_ReadInt("Vip"); Info[playerid][Administrador] = INI_ReadInt("Administrador"); } return true; } /*------------------------------------------------------------------------------ [KICKAR] ------------------------------------------------------------------------------*/ stock Kickar(playerid, motivo[]) { getdate(Data[0], Data[1], Data[2]); gettime(Time[0], Time[1], Time[2]); GetPlayerName(playerid, Info[playerid][Jogador], 23); format(sStringFrm, sizeof(sStringFrm), "{E60000}[Kickado] {FFFFFF}%s foi kickado do servidor. [{E60000}Motivo: {FFFFFF}%s]", Info[playerid][Jogador], motivo); SendClientMessageToAll(Branco, sStringFrm); format(sStringArq, sizeof(sStringArq), "%s, você foi kickado do servidor!\n{5CACEE}Administrador: {FFFFFF}%s\n{5CACEE}Motivo: {FFFFFF}%s\n{5CACEE}Data: {FFFFFF}%d/%d/%d\n{5CACEE}Hora: {FFFFFF}%d:%d:%d ", Info[playerid][Jogador], AdminBot, motivo, Data[2], Data[1], Data[0], Time[0], Time[1], Time[2]); ShowPlayerDialog(playerid, DialogKickado, DIALOG_STYLE_MSGBOX, "{5CACEE}Sistema de Kick", sStringArq, "Concluir", ""); return true; }
Alguma dúvida, só perguntar (:

---------------------------------------------------