[Ajuda] Sistema de salvar armas
#1

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;
}
Reply
#2

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;

https://sampwiki.blast.hk/wiki/SetSpawnInfo
Reply
#3

Ai complica porque tenho um sistema de salvar as coordenadas e skin, quero apenas acrescentar nesse sistema o salvamento dos armamentos...
Reply
#4

Dк uma olhada neste tуpico:

https://sampforum.blast.hk/showthread.php?tid=167857
Reply
#5

Desculpe, mas, precisava mesmo, й entender esse sistema, e nгo dar Ctrl+C e Ctrl+V de um FS...
Reply
#6

Quote:
Originally Posted by FilipiMelo
View Post
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к.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)