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:
Parte do carregamento:
Quando salva a conta salva as armas, esta salvando certinho, antes de salvar esses dados e executado:
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:
SetPlayerWeapons é chamado na hora que o jogador dá o spawn, depois de logar...
Agora vamos para GivePlayerWeaponEx:
Mais outras funções extras... Essas não é tão importante mais vou publicar o sistema por inteiro que criei.
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.
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 = 0; slot < SLOTS_WEAPON; slot++)
{
new weapons[13][2];
GetPlayerWeaponData(playerid, WEAPON_SLOT:slot, weapons[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 i = 0; i < SLOTS_WEAPON; i++)
GivePlayerWeaponEx(playerid, PlayerInfo[playerid][pWeapon][i], PlayerInfo[playerid][pAmmo][i], PlayerInfo[playerid][pWeaponcode][PlayerInfo[playerid][pWeapon][i]]);
if(Gangs(playerid))
GivePlayerWeaponEx(playerid, 5, 1, gTeam[playerid]);
if(gTeam[playerid] == 9)
GivePlayerWeaponEx(playerid, 43, 100, gTeam[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(playerid, weaponid, ammo, code)
{
if(IsPlayerLogged(playerid))
{
new weapon[4], A;
if(PlayerInfo[playerid][pLevel] == 1 && gTeam[playerid] == 0)
return 0;
if((weaponid == 35 || weaponid == 36) && ammo > 1) ammo = 1;
else if(ammo > 500) ammo = 500;
if(weaponid == 23 || weaponid == 22 || weaponid == 24 || weaponid == 29 || weaponid == 28)
{
GetPlayerWeaponData(playerid, 2, weapon[0], A);
GetPlayerWeaponData(playerid, 4, weapon[1], A);
if(weapon[0] > 0) RemovePlayerWeaponEx(playerid, weapon[0]);
if(weapon[1] > 0) RemovePlayerWeaponEx(playerid, weapon[1]);
}
else if(weaponid == 25 || weaponid == 27 || weaponid == 30 || weaponid == 31 || weaponid == 33 || weaponid == 34 || weaponid == 35 || weaponid == 36 || weaponid == 37)
{
GetPlayerWeaponData(playerid, 3, weapon[0], A);
GetPlayerWeaponData(playerid, 5, weapon[1], A);
GetPlayerWeaponData(playerid, 6, weapon[2], A);
GetPlayerWeaponData(playerid, 7, weapon[3], A);
if(weapon[0] > 0) RemovePlayerWeaponEx(playerid, weapon[0]);
if(weapon[1] > 0) RemovePlayerWeaponEx(playerid, weapon[1]);
if(weapon[2] > 0) RemovePlayerWeaponEx(playerid, weapon[2]);
if(weapon[3] > 0) RemovePlayerWeaponEx(playerid, weapon[3]);
}
else if(weaponid == 39)
{
GetPlayerWeaponData(playerid, 8, weapon[0], A);
if(weapon[0] > 0)
RemovePlayerWeaponEx(playerid, weapon[0]);
}
GivePlayerWeapon(playerid, weaponid, ammo);
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 = 0; slot < SLOTS_WEAPON; slot++)
{
PlayerInfo[playerid][pWeapon][slot] = 0;
PlayerInfo[playerid][pAmmo][slot] = 0;
}
for(new weapon = 0; weapon < 47; ++weapon)
PlayerInfo[playerid][pWeaponcode][weapon] = 0;
return 1;
}
forward SetPlayerAmmoEx(playerid, weaponslot, ammo, code);
public SetPlayerAmmoEx(playerid, weaponslot, ammo, code)
{
PlayerInfo[playerid][pWeapon][WeaponsSlot[weaponslot]] = weaponslot;
PlayerInfo[playerid][pAmmo][WeaponsSlot[weaponslot]] = ammo;
PlayerInfo[playerid][pWeaponcode][weaponslot] = code;
SetPlayerWeapons(playerid);
return 1;
}
forward RemovePlayerWeaponEx(playerid, weaponid);
public RemovePlayerWeaponEx(playerid, weaponid)
{
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 = 0; slot < SLOTS_WEAPON; slot++)
{
new weapon, ammo;
GetPlayerWeaponData(playerid, WEAPON_SLOT:slot, weapon, ammo);
if(ammo > 0)
{
if(weapon == 1 || weapon == 46)
continue;
if(weapon != PlayerInfo[playerid][pWeapon][slot])
{
RemovePlayerWeaponEx(playerid, weapon);
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.