SHOW:
|
|
- or go back to the newest paste.
| 1 | /* | |
| 2 | * Créditos: | |
| 3 | * Post Oficial em SSGamers - https://scriptsamp.forumeiros.com/t15975-sistema-de-salvar-armas-do-player-automatico | |
| 4 | * Código criado por zGabriel ( https://scriptsamp.forumeiros.com/u10020 ) | |
| 5 | * Código comentado por cailir ( https://scriptsamp.forumeiros.com/u8995 ) - Para SSGamers ( https://scriptsamp.forumeiros.com ) | |
| 6 | * Não redistribua este trabalho sem incluir estes créditos! | |
| 7 | * Várias informações sobre os comentários encontram-se no final do arquivo, junto com links de referência. | |
| 8 | * | |
| 9 | * Os valores entre colchetes ("[" e "]") são utilizados na referência, encontrada no final do arquivo.
| |
| 10 | */ | |
| 11 | - | * Licença no final do arquivo, nas notas deixadas por mim. |
| 11 | + | |
| 12 | /* | |
| 13 | * Não é necessário manter as notas e nem esta mensagem de licença. Apenas mantenha o primeiro bloco de comentários. | |
| 14 | * Licença no final do arquivo, nas notas deixadas por cailir ( https://scriptsamp.forumeiros.com/u8995 ). | |
| 15 | */ | |
| 16 | ||
| 17 | ||
| 18 | public OnPlayerSpawn(playerid) //A funcão OnPlayerSpawn é chamada sempre que o player nasce, ou seja, após morrer e o jogador aparecer novamente ou após conectar no servidor [1] | |
| 19 | {
| |
| 20 | new query[50], tquery[50]; //Criamos 2 variáveis para armazenar os valores | |
| 21 | for (new i = 0; i <= 12; i++) //Utilizamos o for para pegar todas as armas dos jogadores, iniciando em 0 e indo até 12 (são 13 slots de armas no total) [2] | |
| 22 | {
| |
| 23 | format(query, sizeof(query), "Arma%d", i), format(tquery, sizeof(tquery), "Municao%d", i); //Formatamos as variável query e tquery criadas acima como Arma%d e Municao%d, respectivamente ("%" indica que iremos utilizar uma variável neste local e "d" indica que iremos substituir por um inteiro) [3]
| |
| 24 | GivePlayerWeapon(playerid, DOF2_GetInt(GetPlayerAccount(playerid), query), DOF2_GetInt(GetPlayerAccount(playerid), tquery));//Entregamos a arma ao jogador de id "playerid" (o jogador que está spawnando), pegando os inteiros (ID da arma e valores de munição) com DOF2_GetInt [3] da pasta dos jogadores, que é obtida através da função GetPlayerAccount [4]. | |
| 25 | } | |
| 26 | return 1; //Toda função padrão deve retornar 1 (true) | |
| 27 | } | |
| 28 | ||
| 29 | public OnPlayerDisconnect(playerid, reason) //A função OnPlayerDisconnect irá ser chamada sempre que um jogador sair do servidor, sendo reason o motivo que o jogador desconectou [3] | |
| 30 | {
| |
| 31 | new weapons[13][2], query[50]; //Criamos 2 variáveis para armazenar os valores | |
| 32 | for (new i = 0; i <= 12; i++) //Utilizamos o for para pegar todas as armas dos jogadores, iniciando em 0 e indo até 12 (são 13 slots de armas no total) | |
| 33 | {
| |
| 34 | GetPlayerWeaponData(playerid, i, weapons[i][0], weapons[i][1]); //A função GetPlayerWeaponData é utilizada para pegar a munição e o ID da arma no slot [5] | |
| 35 | ||
| 36 | format(query, sizeof(query), "Arma%d", i); //Formatamos as variável query criada acima como Arma%d ("%" indica que iremos utilizar uma variável neste local e "d" indica que iremos substituir por um inteiro) [3]
| |
| 37 | DOF2_SetInt(GetPlayerAccount(playerid), query, weapons[i][0]); // Utilizamos a função DOF2_SetInt para definir um valor em nosso arquivo, passando os parametros (Caminho do Arquivo), (Nome da variável), (Valor da variável). [6] [7] | |
| 38 | ||
| 39 | format(query, sizeof(query), "Municao%d", i); //Formatamos as variável query criada acima como Municao%d ("%" indica que iremos utilizar uma variável neste local e "d" indica que iremos substituir por um inteiro) [3]
| |
| 40 | DOF2_SetInt(GetPlayerAccount(playerid), query, weapons[i][1]); // Utilizamos a função DOF2_SetInt para definir um valor em nosso arquivo, passando os parametros (Caminho do Arquivo), (Nome da variável), (Valor da variável). [6] [7] | |
| 41 | DOF2_SaveFile(); //Utilizamos a função DOF2_SaveFile para escrever o arquivo. [8] | |
| 42 | } | |
| 43 | return 1; | |
| 44 | } | |
| 45 | ||
| 46 | stock GetPlayerAccount(playerid) //Uma stock é uma outra forma de definir funções [4] | |
| 47 | {
| |
| 48 | new file[128]; //Criamos a variável file para armazenar o nome do arquivo | |
| 49 | format(file, sizeof(file), Pasta_Contas, PlayerName(playerid)); //Mudar a "Pasta_Contas" para pasta de contas do seu servidor! //Formatamos a variável file criada acima como Pasta_Contas [3] [7] [9] | |
| 50 | return file; //Retornamos o caminho do arquivo [8] | |
| 51 | } | |
| 52 | ||
| 53 | //Código abaixo adicionado por cailir ( https://scriptsamp.forumeiros.com/u8995 ) como correção do código base - Verifique se sua gamemode não possui esta função definida, já que é bem comum seu uso. | |
| 54 | forward PlayerName(playerid); //Uma forward é uma outra forma de definir funções [4.1] | |
| 55 | public PlayerName(playerid) { //Uma forward é uma outra forma de definir funções [4.1] [9]
| |
| 56 | new pname[MAX_PLAYER_NAME+1]; //Criamos a variável "pname" para armazenar o nome do jogador | |
| 57 | GetPlayerName(playerid, pname, sizeof(pname)); //A função GetPlayerName é utilizada para pegar o nome do jogador [10] | |
| 58 | return pname; //Retornamos o valor da variável "pname" | |
| 59 | } | |
| 60 | ||
| 61 | /* | |
| 62 | * Anotações: | |
| 63 | * [1] - A função OnPlayerSpawn é padrão do sa-mp - Link Útil: https://team.sa-mp.com/wiki/OnPlayerSpawn_PT.html | |
| 64 | ||
| 65 | * [2] - A função for é utilizado para loops, ao utilizar em seus parenteses, por exemplo: | |
| 66 | ** (new i = 0; i <= 12; i++) | |
| 67 | ** | | |-> Aumentamos a variável "i" em 1 a cada vez que rodar; | |
| 68 | ** | |---------> Se a variável "i" for menor ou igual a 12 (O "12" pode ser qualquer número ou variavel que represente número); | |
| 69 | ** |------------------> Iniciamos a variável "i" com valor inicial 0; | |
| 70 | ||
| 71 | * [3] - A função format é utilizada para inserar valores não-estaticos em variáveis, no formato de text (string), por exemplo: | |
| 72 | ** (textoPrincipal, sizeof(textoPrincipal), "String %s estatica", valor) | |
| 73 | ** | | | |---> A variável que queremos definir no campo %s, pode-se utilizar mais de uma separando os valores por virgulas. [3.1]; | |
| 74 | ** | | |-------------------> O texto base que será utilizado na substituição - Link Útil: https://team.sa-mp.com/wiki/Format_PT.html#Especificadores_de_formato [3.2]; | |
| 75 | ** | |------------------------------------------> A função sizeof é utilizada para pegar o tamanho da variável que foi indicada - Link Útil: https://team.sa-mp.com/wiki/Keywords_Operators.html#sizeof (Disponível somente em inglês); | |
| 76 | ** |--------------------------------------------------------------> Este parametro é utilizado para indicar a variável que deve ter seu valor alterado pelo format - Link Útil: https://team.sa-mp.com/wiki/Format_PT.html ; | |
| 77 | ** | |
| 78 | ** [3.1] - O uso de vários valores é indicado com vários %, conforme nos exemplos abaixo: | |
| 79 | *** [Ex] (textoPrincipal, sizeof(textoPrincipal), "String %s %s", valor, valorDois) | |
| 80 | *** No exemplo acima, os paramêtros no formato acima irão incluir um espaço entre os valores das váriaveis; | |
| 81 | *** [Ex] (textoPrincipal, sizeof(textoPrincipal), "String %s%s", valor, valorDois) | |
| 82 | *** No exemplo acima, os paramêtros no formato acima não irão incluir espaço entre os valores das váriaveis, colocando-as lado a lado; | |
| 83 | ** | |
| 84 | ** [3.2] - Se um especificador de formato for utilizado de forma incorreta, não irá apresentar erros, e o valor será transformado para o tipo correto, por exemplo: | |
| 85 | *** [Ex] (textoPrincipal, sizeof(textoPrincipal), "String %s", variavelQueContemUmNumero) | |
| 86 | *** No exemplo acima, o valor da variável "variavelQueContemUmNumero" será transformado para string (%s), porém terá seu valor mostrado de forma incorreta; | |
| 87 | ||
| 88 | * [4] - Uma stock é uma forma de definir funções, porém existem diferenças: | |
| 89 | ** [4.1] - A stock não retorna avisos de função não utilizada, e pode ser compilada contendo erros em sua sintaxe. Link Útil: ** AVISO: WIKI NÃO OFICIAL ** https://sampwiki.blast.hk/wiki/Function#Stock (Disponível somente em inglês); | |
| 90 | ** [4.2] - Uma function deve ser declarada antes, ou seja, é necessário utilizar a função "forward" ou "native" (no caso de funções definidas por plugins ou as padrões) antes de se tornarem válidas, e compilem sem erros. Link Útil: https://team.sa-mp.com/wiki/Public_functions.html#Forwarding (Disponível somente em inglês); | |
| 91 | ||
| 92 | * [5] - A função GetPlayerWeaponData é utilizada para pegar as informações da arma do jogador (munição e ID da arma) [5.1] - Link Útil https://open.mp/docs/scripting/functions/GetPlayerWeaponData (Disponível somente em inglês); | |
| 93 | ** [5.1] - Armas antigas, ou seja, sem munição também são retornadas, caso o jogador não tenha pego outra arma no mesmo slot; | |
| 94 | ||
| 95 | * [6] - A função DOF2_SetInt é uma função definida pela include DOF2, criada pela própria equipe do SA-MP[!!]; | |
| 96 | ** O DOF2 é uma substituição para o dini, o método antigo de salvamento de arquivos no sa-mp. O DOF2 foi implementado por ser mais eficiente e rápido em sua função; | |
| 97 | ** As informações definidas pelo DOF2 ficam salvas na memória até serem aplicadas pelas funções DOF2_WriteFile ou DOF2_SaveFile (ambas desempenham a mesma ação, DOF2_SaveFile é um macro para DOF2_WriteFile). | |
| 98 | ||
| 99 | * [7] - O valor de Pasta_Contas deve ser definido em uma #define, como no exemplo abaixo: | |
| 100 | ** #define Pasta_Contas "salvamento/contas" | |
| 101 | ** [7.1] - #define não deve incluir um ";" no final, necessitando ser definido um por linha; | |
| 102 | *** [7.1.1] - A função define não possui documentação oficial: (Mini-Documentação abaixo) | |
| 103 | **** [7.1.1.1] Esta mini-documentação foi criada com proposito de auxilidar desenvolvedores iniciantes e foi criada por cailir ( https://scriptsamp.forumeiros.com/u8995 ) para SSGamers ( https://scriptsamp.forumeiros.com ) | |
| 104 | **** O #define pode ser chamado de macro, por apenas substituir um conteúdo por outro, e, permitir a redução de seu código, caso seja utilizado muitas vezes. O #define apenas substitui o primeiro paramêtro pelos restantes, podendo incluir espaços e inclusive multiplas linhas, se utilizado "\" ao final de uma linha; | |
| 105 | **** [7.1.1.3] Exemplos de usos: | |
| 106 | ***** [Ex] #define CALLBACK::%0(%1) forward %0(%1);public %0(%1) | |
| 107 | ****** O exemplo acima está definindo "CALLBACK::" como um macro para definir uma função pública; | |
| 108 | ***** [Ex] #define DOF2_SetInt_NEW(%0) DOF2_SetInt(%0);DOF2_SaveFile() | |
| 109 | ****** O exemplo acima está definindo a função "DOF2_SetInt_NEW" para ter seus parametros utilizados em "DOF2_SetInt" e, em seguida, salvar o arquivo que foi editado; | |
| 110 | ***** [Ex] #define SetInt(%0) DOF2_SetInt(%0) | |
| 111 | ****** O exemplo acima está definindo "SetInt" como a mesma função de "DOF2_SetInt", permitindo que os mesmo parametros sejam utilizados; | |
| 112 | ||
| 113 | * [8] - A função DOF2_WriteFile é utilizada para salvar o arquivo editado. Ao definir valores utilizando o DOF2, como no DOF2_SetInt, esses valores ficam salvos na memória do servidor até ser utilizado uma função de salvamento; | |
| 114 | ** [8.1] - A função DOF2_SaveFile realiza a mesma função de DOF2_WriteFile, sendo utilizado um macro para defini-la; | |
| 115 | ||
| 116 | * [9] - A função PlayerName é uma função popularmente utilizada para pegar o nome do jogador, em vez de substituir uma variável, como na GetPlayerName [10]. Está função deve ser definida em sua gamemode e por ser muito popular, pode ser que existam variações de seu código e nome. | |
| 117 | ||
| 118 | * [10] - A função GetPlayerName é utilizada para pegar o nome do jogador e salva-la em uma variável. Retorna o tamanho do nome do jogador, e, caso não exista, retornará 0. O valor substituído é o do primeiro paramêtro. Link Útil: https://team.sa-mp.com/wiki/GetPlayerName_PT.html ; | |
| 119 | ||
| 120 | * [!!] - Informações marcadas com 2 exclamações não foram confirmadas por motivos diversos, podendo estar incorretas. | |
| 121 | ||
| 122 | * *********************************************************************************************************************************** * | |
| 123 | * Nota do cailir ( https://scriptsamp.forumeiros.com/u8995 ) para todos os usuários da SSGamers ( https://scriptsamp.forumeiros.com ) * | |
| 124 | * *********************************************************************************************************************************** * | |
| 125 | * Agradeço ao zGabriel ( https://scriptsamp.forumeiros.com/u10020 ) pelo código criado e postado no fórum. Deixo o uso e modificação * | |
| 126 | * deste código livre, apenas peço que mantenha os créditos, pois não foi fácil comentar e acredito que não tenha sido fácil criar o * | |
| 127 | * mesmo, então apenas gostaria de pedir isso. Agradeço ao Weslley Script, fundador da SSGamers pelo ótimo fórum. * | |
| 128 | * *********************************************************************************************************************************** * | |
| 129 | ||
| 130 | */ |