SA-MP Forums

SA-MP Forums (https://forum.sa-mp.com/index.php)
-   Português/Portuguese (https://forum.sa-mp.com/forumdisplay.php?f=34)
-   -   [Ajuda] Sistema de salvar armas (https://forum.sa-mp.com/showthread.php?t=650633)

FilipiMelo 03/03/2018 04:43 PM

Sistema de salvar armas
 
Sou iniciante na linguagem pawn, e estou encontrando algumas dificuldades em criar um sistema de salvamento de armas em DOF2.

Problema: Não está alterando (automaticamente) o arquivo "Arma" da pasta scriptfiles/Jogadores, ele sempre fica Arma = 0
Alterei manualmente o número 0 para o id da última arma que eu estava antes de desconectar do servidor e vi que o sistema funcionou, porém quero que este numero altere automaticamente.

Code:

#include <a_samp>
#include <dini>
#include <Double-O-Files_2>
#include <zcmd>

#define DIALOG_LOGAR 1
#define DIALOG_REGISTRO 2

enum pInfo //criando o enum
{
        pArma, //Variavel da arma
        pSkin, // Variavel da skin
        pSenha //Variavel da senha
};

new PlayerInfo[MAX_PLAYERS][pInfo];
new Erro[MAX_PLAYERS];
new Float:pPosX[MAX_PLAYERS], Float:pPosY[MAX_PLAYERS], Float:pPosZ[MAX_PLAYERS], Float:pPosA[MAX_PLAYERS], SpawnarInPos[MAX_PLAYERS], pInterior[MAX_PLAYERS];
new Logado[MAX_PLAYERS];

public OnGameModeExit()
{
        DOF2_Exit();
        return 1;
}

public OnPlayerConnect(playerid)
{
    SpawnarInPos[playerid] = 1;
    SetPlayerColor(playerid, 0xFFFFFFFF);
    new name[MAX_PLAYER_NAME]; // Cria a variavel de nome
        new arquivo[40]; // variavel arquivo
        GetPlayerName(playerid, name, 32);//Pega o nome do player
        format(arquivo, 40, "Jogadores/%s.ini", name); // formata a string arquivo e cria um arquivo na pasta "Jogadores"
        if(DOF2_FileExists(arquivo)) // se tiver registrado
        {
                ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Login", "Status da conta : Registrada\n digite sua senha para logar!", "Logar", "Cancelar");
        }
        else // se nao tiver registrado
        {
                  ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Status da conta : Não Registrada\n digite uma senha para se registrar!", "Registrar", "Cancelar");
          }
        return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
        new arquivo[40], name[MAX_PLAYER_NAME]; // cria a variavel name com 40 celulas e a variavel Name
    GetPlayerName(playerid, name, 32); // Pega o nome do player
    format(arquivo, 40, "Jogadores/%s.ini", name); // Formata o arquivo que existe na pasta Jogadores
    if(DOF2_FileExists(arquivo)) // se o arquivo existir
    {
        DOF2_SetInt(arquivo, "Senha", PlayerInfo[playerid][pSenha]); // seta a senha do player para o que ele digitou
                DOF2_SetInt(arquivo, "Skin", PlayerInfo[playerid][pSkin]); // seta a skin para o id da skin atual
        DOF2_SetInt(arquivo, "Arma", PlayerInfo[playerid][pArma]);  // seta a 'arma salva' do player
                DOF2_SaveFile(); // finalmente salvando o arquivo
    }

        new pName[MAX_PLAYER_NAME], File[56];
        GetPlayerName(playerid, pName, sizeof(pName)); // Pega o Nome (nick) do Player e converte para "pName", assim "pName" = Nick
        format(File, 56, "Posições/%s.txt", pName); // Cria o "caminho" até o local onde será salvo o Arquivo com a posição do Player
        GetPlayerPos(playerid, pPosX[playerid], pPosY[playerid], pPosZ[playerid]); // Pega a Posição do Player em X, Y e Z, e converte para "pPosX", "pPosY" e "pPosZ", respectivamente.
        GetPlayerFacingAngle(playerid, pPosA[playerid]); // Pega o Ângulo do Player em A e converte para pPosA, logo pPosA = Ângulo do Player
        pInterior[playerid] = GetPlayerInterior(playerid); // Pega o interior do Player, que fica armazenado em pInterior.
        if(!DOF2_FileExists(File)) // Checa se a File existe
        {
            DOF2_CreateFile(File); // Se não existir, cria
        }
        DOF2_SetFloat(File, "PosX", pPosX[playerid]); // Escreve dentro do Arquivo: "PosX = pPosX (posição que pegamos antes, lembra ?)
        DOF2_SetFloat(File, "PosY", pPosY[playerid]); // Escreve dentro do Arquivo: "PosY = pPosY (posição que pegamos antes, lembra ?)
        DOF2_SetFloat(File, "PosZ", pPosZ[playerid]); // Escreve dentro do Arquivo: "PosZ = pPosZ (posição que pegamos antes, lembra ?)
        DOF2_SetFloat(File, "PosA", pPosA[playerid]); // Escreve dentro do Arquivo: "PosA = pPosA (posição que pegamos antes, lembra ?)
        DOF2_SetInt(File, "Interior", pInterior[playerid]); // Escreve dentro do Arquivo: "Interior = pInterior (interior que pegamos antes, lembra ?)
        DOF2_SaveFile(); // Salva o arquivo.
    return 1;
}

public OnPlayerSpawn(playerid)
{
    GivePlayerWeapon(playerid, PlayerInfo[playerid][pArma], 999999999); //Dar a 'arma salva' do player quando ele conectar
        SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]); // Seta a skin do player quando ele spawnar para a skin salva
        new pName[MAX_PLAYER_NAME], File[56];
          GetPlayerName(playerid, pName, sizeof(pName)); // Pega o Nome (nick) do Player e converte para "pName", assim "pName" = Nick
    format(File, sizeof(File), "Posições/%s.txt", pName); // Cria o "caminho" até o local onde está salvo o Arquivo com a posição do Player
        if(DOF2_FileExists(File) && SpawnarInPos[playerid] == 1) // SE o Arquivo existir e SE o Player deve ser colocado nas Coordenadas que estava quando deixou o jogo
        {
        pPosX[playerid] = DOF2_GetFloat(File, "PosX"); //Busca dentro do Arquivo a "PosX" e transforma em "pPosX"
        pPosY[playerid] = DOF2_GetFloat(File, "PosY"); //Busca dentro do Arquivo a "PosY" e transforma em "pPosY"
        pPosZ[playerid] = DOF2_GetFloat(File, "PosZ"); //Busca dentro do Arquivo a "PosZ" e transforma em "pPosZ"
        pPosA[playerid] = DOF2_GetFloat(File, "PosA"); //Busca dentro do Arquivo a "PosA" e transforma em "pPosA"
                pInterior[playerid] = DOF2_GetInt(File, "Interior"); //Busca dentro do Arquivo "Interior" e transforma em "pInterior"
                  SetPlayerPos(playerid, pPosX[playerid],  pPosY[playerid], pPosZ[playerid]); // Seta a posição do Player para a que estava no Arquivo
                SetPlayerInterior(playerid, pInterior[playerid]);
                SetPlayerFacingAngle(playerid, pPosA[playerid]); // Seta o Ângulo do Player para o que estava no arquivo
                SetCameraBehindPlayer(playerid); // Coloca a Câmera atrás da Skin
                  SpawnarInPos[playerid] = 0; // Define que o mesmo não deve mais ser Spawnado na posição que está no Arquivo até Relogar.
        }
        return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new arquivo[40], name[MAX_PLAYER_NAME]; // criando a string arquivo com 40 celulas e criando a variavel name
    GetPlayerName(playerid, name, 32); // pegando o nome do player
    format(arquivo, 40, "Jogadores/%s.ini", name); // formatando o arquivo para a pasta Jogadores
    if(dialogid == DIALOG_REGISTRO) // Dialog registro
    {
        if(!strval(inputtext)) // se ele nao digitar numeros da erro e volta no dialog de registro
        {
        ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", "Status da conta : Não Registrada\n digite uma senha para se registrar!", "Registrar", "Cancelar");
            SendClientMessage(playerid, -1, "[BBS] Erro, Digite apenas números para se registrar.");
            return 1;
        }
        if(!response) //se ele apertar o botao Cancelar, kicka ele !
        {
            Kick(playerid);
            return 1;
        }
        else // se ele colocar a senha certa cria os arquivos
        {
        PlayerInfo[playerid][pSenha] = strval(inputtext); // pega a senha que ele digitou no campo do dialog
        DOF2_CreateFile(arquivo); // cria o arquivo na pasta Jogadores
        DOF2_SetInt(arquivo, "Senha", PlayerInfo[playerid][pSenha]); // seta a senha para a que ele digitou no dialog
        DOF2_SetInt(arquivo, "Skin", 170); // seta a skin dele para 170, podendo mudar para qualquer numero.
        DOF2_SetInt(arquivo, "Arma", PlayerInfo[playerid][pArma]); // Dar as armas que ele tinha antes
                DOF2_SaveFile(); // salva o arquivo
            SendClientMessage(playerid, -1, "[BBS] Sua Conta foi Registrada, Agora digite sua senha novamente para logar!");
            ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Login", "Status da conta : Registrada\n digite sua senha para logar!", "Logar", "Cancelar");
        }
    }
    if(dialogid == DIALOG_LOGAR)
    {
        if(!strval(inputtext)) // se ele nao digitar apenas numeros volta o dialog de login
        {
        SendClientMessage(playerid, -1, "Erro, Digite apenas números para se logar.");
            ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Login", "Status da conta : Registrada\n digite sua senha para logar!\nSe errar 5 vezes sua conta será banida!", "Logar", "Cancelar");
            return 1;
        }
        if(!response) // se ele clickar em Cancelar kicka ele !
        {
            Kick(playerid);
            return 1;
        }
        else // Se ele colocar a senha certa
        {
            PlayerInfo[playerid][pSenha] = DOF2_GetInt(arquivo, "Senha"); // pega a senha salva dele
            if(strval(inputtext) == PlayerInfo[playerid][pSenha]) // pega a senha que ele digitou
            {
                PlayerInfo[playerid][pArma] = DOF2_GetInt(arquivo, "Arma"); // pega a arma do player
                PlayerInfo[playerid][pSkin] = DOF2_GetInt(arquivo, "Skin"); // pega a skin do player
                GivePlayerWeapon(playerid, PlayerInfo[playerid][pArma],999999999); // Dar as 'armas salvas' do player
                                SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]); // seta a skin do player para a skin salva
                SetSpawnInfo (playerid, 0, 170, 2092.49609375, -1555.73583984, 13.10235691, 179.19059753, 0, 0, 0, 0, 0, 0);
                                SpawnPlayer(playerid); // em seguida, spawna o player
            }
            else // se ele errar a senha mostra o dialog denovo
            {
                ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Login", "Status da conta : Registrada\n digite sua senha para logar!\nSe errar 5 vezes sua conta será banida!", "Logar", "Cancelar");
                                Erro[playerid]++; // e adiciona 1 erro
                if(Erro[playerid] == 5) // se ele errar 5 vezes ele será banido !
                {
                    SendClientMessage(playerid, -1, "Sua conta está banida por errar 5 vezes a sua senha, contacte o Admin para retirar seu Ban!");
                    Ban(playerid);
                    return 1;
                }
            }
        }
    }
    return 1;
}

stock ReturnPlayer(playerid)
{
        new name[MAX_PLAYER_NAME];
        GetPlayerName(playerid,name,MAX_PLAYER_NAME);
        return name;
}


GuiKommander 03/03/2018 05:42 PM

Re: Sistema de salvar armas
 
Uma das Maneiras é essa..
PHP Code:

#include <a_samp>
#include <DOF2>

enum PlayerInfo
{
    
Slot_1,
    
Balas_Slot1
}
new 
pInfo[MAX_PLAYERS][PlayerInfo];

public 
OnPlayerConnect(playerid)
{
    
SetSpawnInfo(playerid0pInfo[playerid][Skin], XYZTpInfo[playerid][Slot_1], pInfo[playerid][Balas_Slot1], pInfo[playerid][Slot_2], pInfo[playerid][Balas_Slot2], pInfo[playerid][Slot_3], pInfo[playerid][Balas_Slot3]); // Uma das Maneiras é essa.
    
SpawnPlayer(playerid);
    return 
1;


http://wiki.sa-mp.com/wiki/SetSpawnInfo

FilipiMelo 03/03/2018 06:36 PM

Re: Sistema de salvar armas
 
Ai complica porque tenho um sistema de salvar as coordenadas e skin, quero apenas acrescentar nesse sistema o salvamento dos armamentos...

InsaneBR 03/03/2018 07:43 PM

Re: Sistema de salvar armas
 
Dê uma olhada neste tópico:

http://forum.sa-mp.com/showthread.php?t=167857

FilipiMelo 06/03/2018 01:18 AM

Re: Sistema de salvar armas
 
Desculpe, mas, precisava mesmo, é entender esse sistema, e não dar Ctrl+C e Ctrl+V de um FS...

InsaneBR 06/03/2018 01:22 AM

Re: Sistema de salvar armas
 
Quote:

Originally Posted by FilipiMelo (Post 4000263)
Desculpe, mas, precisava mesmo, é entender esse sistema, e não dar Ctrl+C e Ctrl+V de um FS...

Estude-o e entenderá a lógica usada no mesmo, essa foi a minha intenção em fornecer o link para você.


All times are GMT. The time now is 03:49 AM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.