Portal SAMP
[Ajuda] Sistema de carregar armas - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Sistema de carregar armas (/showthread.php?tid=4913)



Sistema de carregar armas - Mackor - 05/11/2024

Estou quebrando a cabeça de verdade com esse sistema, é sistema de salvar armas do jogador, vou publicar todo o sistema se alguém conseguir desbugar ótimo. O problema é que salva as armas normalmente nos arquivos, mais na hora de sentar as armas existe um simples detalhe que não encontrei, não senta as armas para o jogador, fiz o sistema e agora estou tendo que refaze-lo para encontrar o bug. 

Link: https://pastebin.com/BbvrmTdF 

Parte do salvamento:
Código PHP:
DOF2_SetInt(file"Weapon00"PlayerInfo[playerid][pWeapon][0]);
 
DOF2_SetInt(file"Weapon01"PlayerInfo[playerid][pWeapon][1]);
DOF2_SetInt(file"Weapon02"PlayerInfo[playerid][pWeapon][2]);
DOF2_SetInt(file"Weapon03"PlayerInfo[playerid][pWeapon][3]);
DOF2_SetInt(file"Weapon04"PlayerInfo[playerid][pWeapon][4]);
DOF2_SetInt(file"Weapon05"PlayerInfo[playerid][pWeapon][5]);
DOF2_SetInt(file"Weapon06"PlayerInfo[playerid][pWeapon][6]);
DOF2_SetInt(file"Weapon07"PlayerInfo[playerid][pWeapon][7]);
DOF2_SetInt(file"Weapon08"PlayerInfo[playerid][pWeapon][8]);
DOF2_SetInt(file"Weapon09"PlayerInfo[playerid][pWeapon][9]);
DOF2_SetInt(file"Weapon10"PlayerInfo[playerid][pWeapon][10]);
DOF2_SetInt(file"Weapon11"PlayerInfo[playerid][pWeapon][11]);
DOF2_SetInt(file"Weapon12"PlayerInfo[playerid][pWeapon][12]);
  DOF2_SetInt(file"Ammo00"PlayerInfo[playerid][pAmmo][0]);
DOF2_SetInt(file"Ammo01"PlayerInfo[playerid][pAmmo][1]);
DOF2_SetInt(file"Ammo02"PlayerInfo[playerid][pAmmo][2]);
DOF2_SetInt(file"Ammo03"PlayerInfo[playerid][pAmmo][3]);
DOF2_SetInt(file"Ammo04"PlayerInfo[playerid][pAmmo][4]);
DOF2_SetInt(file"Ammo05"PlayerInfo[playerid][pAmmo][5]);
DOF2_SetInt(file"Ammo06"PlayerInfo[playerid][pAmmo][6]);
DOF2_SetInt(file"Ammo07"PlayerInfo[playerid][pAmmo][7]);
DOF2_SetInt(file"Ammo08"PlayerInfo[playerid][pAmmo][8]);
DOF2_SetInt(file"Ammo09"PlayerInfo[playerid][pAmmo][9]);
DOF2_SetInt(file"Ammo10"PlayerInfo[playerid][pAmmo][10]);
DOF2_SetInt(file"Ammo11"PlayerInfo[playerid][pAmmo][11]);
DOF2_SetInt(file"Ammo12"PlayerInfo[playerid][pAmmo][12]);
DOF2_SetInt(file"weaponcode-21"PlayerInfo[playerid][pWeaponcode][21]);
DOF2_SetInt(file"weaponcode-24"PlayerInfo[playerid][pWeaponcode][24]);
DOF2_SetInt(file"weaponcode-25"PlayerInfo[playerid][pWeaponcode][25]);
DOF2_SetInt(file"weaponcode-27"PlayerInfo[playerid][pWeaponcode][27]);
DOF2_SetInt(file"weaponcode-29"PlayerInfo[playerid][pWeaponcode][29]);
DOF2_SetInt(file"weaponcode-30"PlayerInfo[playerid][pWeaponcode][30]);
DOF2_SetInt(file"weaponcode-31"PlayerInfo[playerid][pWeaponcode][31]);
DOF2_SetInt(file"weaponcode-33"PlayerInfo[playerid][pWeaponcode][33]);
DOF2_SetInt(file"weaponcode-34"PlayerInfo[playerid][pWeaponcode][34]); 


Parte do carregamento:
Código PHP:
    PlayerInfo[playerid][pWeapon][0] = DOF2_GetInt(file"Weapon00");
    PlayerInfo[playerid][pWeapon][1] = DOF2_GetInt(file"Weapon01");
    PlayerInfo[playerid][pWeapon][2] = DOF2_GetInt(file"Weapon02");
  PlayerInfo[playerid][pWeapon][3] = DOF2_GetInt(file"Weapon03");
    PlayerInfo[playerid][pWeapon][4] = DOF2_GetInt(file"Weapon04");
    PlayerInfo[playerid][pWeapon][5] = DOF2_GetInt(file"Weapon05");
  PlayerInfo[playerid][pWeapon][6] = DOF2_GetInt(file"Weapon06");
    PlayerInfo[playerid][pWeapon][7] = DOF2_GetInt(file"Weapon07");
    PlayerInfo[playerid][pWeapon][8] = DOF2_GetInt(file"Weapon08");
  PlayerInfo[playerid][pWeapon][9] = DOF2_GetInt(file"Weapon09");
    PlayerInfo[playerid][pWeapon][10] = DOF2_GetInt(file"Weapon10");
    PlayerInfo[playerid][pWeapon][11] = DOF2_GetInt(file"Weapon11");
  PlayerInfo[playerid][pWeapon][12] = DOF2_GetInt(file"Weapon12");
    PlayerInfo[playerid][pAmmo][0] = DOF2_GetInt(file"Ammo00");
    PlayerInfo[playerid][pAmmo][1] = DOF2_GetInt(file"Ammo01");
  PlayerInfo[playerid][pAmmo][2] = DOF2_GetInt(file"Ammo02");
    PlayerInfo[playerid][pAmmo][3] = DOF2_GetInt(file"Ammo03");
    PlayerInfo[playerid][pAmmo][4] = DOF2_GetInt(file"Ammo04");
  PlayerInfo[playerid][pAmmo][5] = DOF2_GetInt(file"Ammo05");
    PlayerInfo[playerid][pAmmo][6] = DOF2_GetInt(file"Ammo06");
    PlayerInfo[playerid][pAmmo][7] = DOF2_GetInt(file"Ammo07");
  PlayerInfo[playerid][pAmmo][8] = DOF2_GetInt(file"Ammo08");
    PlayerInfo[playerid][pAmmo][9] = DOF2_GetInt(file"Ammo09");
    PlayerInfo[playerid][pAmmo][10] = DOF2_GetInt(file"Ammo10");
  PlayerInfo[playerid][pAmmo][11] = DOF2_GetInt(file"Ammo11");
    PlayerInfo[playerid][pAmmo][12] = DOF2_GetInt(file"Ammo12");
    PlayerInfo[playerid][pWeaponcode][21] = DOF2_GetInt(file"weaponcode-21");
    PlayerInfo[playerid][pWeaponcode][24] = DOF2_GetInt(file"weaponcode-24");
    PlayerInfo[playerid][pWeaponcode][25] = DOF2_GetInt(file"weaponcode-25");
    PlayerInfo[playerid][pWeaponcode][27] = DOF2_GetInt(file"weaponcode-27");
    PlayerInfo[playerid][pWeaponcode][29] = DOF2_GetInt(file"weaponcode-29");
    PlayerInfo[playerid][pWeaponcode][30] = DOF2_GetInt(file"weaponcode-30");
    PlayerInfo[playerid][pWeaponcode][31] = DOF2_GetInt(file"weaponcode-31");
    PlayerInfo[playerid][pWeaponcode][33] = DOF2_GetInt(file"weaponcode-33");
    PlayerInfo[playerid][pWeaponcode][34] = DOF2_GetInt(file"weaponcode-34"); 




Quando salva a conta salva as armas, esta salvando certinho, antes de salvar esses dados e executado:

Código PHP:
forward OnPlayerUpdateWeapons(playerid);
public 
OnPlayerUpdateWeapons(playerid)
{
    if(PlayerPaintballing[playerid] != 0)
    return 
0;

    for(new slot 0slot SLOTS_WEAPONslot++)
    {
        new weapons[13][2];
    
GetPlayerWeaponData(playeridWEAPON_SLOT:slotweapons[slot][0], weapons[slot][1]);

    if(
weapons[slot][1] > 0)
    
    PlayerInfo[playerid][pWeapon][slot] = weapons[slot][0];

    
    PlayerInfo[playerid][pAmmo][slot] = weapons[slot][1];
    }
    return 1;





Ou seja, no OnPlayerUpdateWeapons pega o ID da arma e a quantidade de munições. Até ae estamos indo bem...
Agora precisamos sentar as armas do jogador, código abaixo:


Código PHP:
forward SetPlayerWeapons(playerid);
public 
SetPlayerWeapons(playerid)
{
    if(IsPlayerConnected(playerid))
    {
        ResetPlayerWeapons(playerid);

        if(IsPlayerLogged(playerid))
        {
           if(PlayerInfo[playerid][pJailed] > 0)
               return 1;

           for(new 0SLOTS_WEAPONi++)
               GivePlayerWeaponEx(playeridPlayerInfo[playerid][pWeapon][i], PlayerInfo[playerid][pAmmo][i], PlayerInfo[playerid][pWeaponcode][PlayerInfo[playerid][pWeapon][i]]);
   
           
if(Gangs(playerid))
               GivePlayerWeaponEx(playerid51gTeam[playerid]);

           if(gTeam[playerid] == 9)
               GivePlayerWeaponEx(playerid43100gTeam[playerid]);
          }
      }
      return 1;




SetPlayerWeapons é chamado na hora que o jogador dá o spawn, depois de logar...

Agora vamos para GivePlayerWeaponEx:


Código PHP:
stock GivePlayerWeaponEx(playeridweaponidammocode)
{
    if(IsPlayerLogged(playerid))
    {
        new weapon[4], A;

        if(PlayerInfo[playerid][pLevel] == && gTeam[playerid] == 0)
           return 0;
 
        if((weaponid == 35 || weaponid == 36) && ammo 1ammo 1;
           else if(ammo 500ammo 500;

        if(weaponid == 23 || weaponid == 22 || weaponid == 24 || weaponid == 29 || weaponid == 28)
        {
           GetPlayerWeaponData(playerid2weapon[0], A);
           GetPlayerWeaponData(playerid4weapon[1], A);
           if(weapon[0] > 0RemovePlayerWeaponEx(playeridweapon[0]);
           if(weapon[1] > 0RemovePlayerWeaponEx(playeridweapon[1]);
        }
        else if(weaponid == 25 || weaponid == 27 || weaponid == 30 || weaponid == 31 || weaponid == 33 || weaponid == 34 || weaponid == 35 || weaponid == 36 || weaponid == 37)
        {
            GetPlayerWeaponData(playerid3weapon[0], A);
            GetPlayerWeaponData(playerid5weapon[1], A);
            GetPlayerWeaponData(playerid6weapon[2], A);
            GetPlayerWeaponData(playerid7weapon[3], A);
            if(weapon[0] > 0RemovePlayerWeaponEx(playeridweapon[0]);
            if(weapon[1] > 0RemovePlayerWeaponEx(playeridweapon[1]);
            if(weapon[2] > 0RemovePlayerWeaponEx(playeridweapon[2]);
            if(weapon[3] > 0RemovePlayerWeaponEx(playeridweapon[3]);
        }
        else if(weaponid == 39)
        {
            GetPlayerWeaponData(playerid8weapon[0], A);
  
           
if(weapon[0] > 0)
               RemovePlayerWeaponEx(playeridweapon[0]);
         }

        GivePlayerWeapon(playeridweaponidammo);

        new slot WeaponsSlot[weaponid];
        PlayerInfo[playerid][pWeapon][slot] = weaponid;
        PlayerInfo[playerid][pAmmo][slot] = ammo;
        PlayerInfo[playerid][pWeaponcode][weaponid] = code;
}
return 
1;




Mais outras funções extras... Essas não é tão importante mais vou publicar o sistema por inteiro que criei.

Código PHP:
forward ResetPlayerWeaponsEx(playerid);
public 
ResetPlayerWeaponsEx(playerid)
{
ResetPlayerWeapons(playerid);

    for(new slot 0slot SLOTS_WEAPONslot++)
{
        PlayerInfo[playerid][pWeapon][slot] = 0;
PlayerInfo[playerid][pAmmo][slot] = 0;
}

for(new 
weapon 0weapon 47; ++weapon)
    PlayerInfo[playerid][pWeaponcode][weapon] = 0;

    return 1;
}

forward SetPlayerAmmoEx(playeridweaponslotammocode);
public 
SetPlayerAmmoEx(playeridweaponslotammocode)
{
    PlayerInfo[playerid][pWeapon][WeaponsSlot[weaponslot]] = weaponslot;
PlayerInfo[playerid][pAmmo][WeaponsSlot[weaponslot]] = ammo;
PlayerInfo[playerid][pWeaponcode][weaponslot] = code;

    SetPlayerWeapons(playerid);
return 
1;
}

forward RemovePlayerWeaponEx(playeridweaponid);
public 
RemovePlayerWeaponEx(playeridweaponid)
{
PlayerInfo[playerid][pWeapon][WeaponsSlot[weaponid]] = 0;
PlayerInfo[playerid][pAmmo][WeaponsSlot[weaponid]] = 0;
PlayerInfo[playerid][pWeaponcode][weaponid] = 0;

SetPlayerWeapons(playerid);
return 
1;
}

forward CheckWeaponsCheat(playerid);
public 
CheckWeaponsCheat(playerid)
{
if(
PlayerPaintballing[playerid] != 0)
    return 0;
   
    
for(new slot 0slot SLOTS_WEAPONslot++)
    {
        new weaponammo;
        GetPlayerWeaponData(playeridWEAPON_SLOT:slotweaponammo);

if(
ammo 0)
{
    if(weapon == || weapon == 46)
continue;

    if(weapon != PlayerInfo[playerid][pWeapon][slot])
{
    RemovePlayerWeaponEx(playeridweapon);
return 
1;
}
}
    }
    return 0;




O problema desse código é que não senta a arma do jogador, já otimizei para openmp o código adicionando WEAPON_SLOT: e nada.


RE: Sistema de carregar armas - BitSain - 05/11/2024

Faça uma depuração (debug) em seu código nas partes necessitadas (ponto principal, que é o carregamento).
Leia um pouco sobre um Tutorial/Guia que eu fiz anteriormente sobre isso

*
  As armas estão sendo carregadas do mesmo arquivo?
  A ordem de chamada das funções está correta?
 As armas não são carregadas do arquivo, ou pelo o que entendi não estão sendo setadas pelo GivePlayerWeaponEx?



RE: Sistema de carregar armas - Mackor - 06/11/2024

(05/11/2024 20:25)BitSain Escreveu: Faça uma depuração (debug) em seu código nas partes necessitadas (ponto principal, que é o carregamento).
Leia um pouco sobre um Tutorial/Guia que eu fiz anteriormente sobre isso

*
  As armas estão sendo carregadas do mesmo arquivo?
  A ordem de chamada das funções está correta?
 As armas não são carregadas do arquivo, ou pelo o que entendi não estão sendo setadas pelo GivePlayerWeaponEx?

Fiz um debug e acontece que nesse debug está 0 a munição. Crio uma M4 com 150 de munição, no scriptfiles está os 150 de munição, até eu entrar no servidor novamente, tudo ocorre bem, ao entrar na hora de criar a arma, o arquivo tah definido como 0.

As armas estão sendo carregadas do mesmo arquivo? Sim.