Question


 

Вообщем, при выдаче брони через команду /setarmour, при получении урона броня кончается, и выдается опять. Тоесть ты выдал 100 единиц брони и при снятии этих 100 единиц сразу же появляется новые 100 единиц, тоесть броня так скажем респавнится.

/setarmour:

 

CMD:setarmour(playerid, params[])
{
    if(PI[playerid][pAdmin] < 2return SCM(playerid, COLOR_RED, NO_DOSTUP_TEXT);
    if(!ADuty{playerid}) return SCM(playerid, COLOR_GREY, NO_DUTY_TEXT);
    new target, Float:armour;
    if(sscanf(params, "uf", target, armour)) return SCM(playerid, COLOR_RED, !"Используйте: /setarmour [id] [ammount]");
    if(armour > 1000.0return SCM(playerid, COLOR_RED, !"Используйте: /setarmour [id] am < 1000");
    if(armour < 0.0return SCM(playerid, COLOR_RED, !"Используйте: /setarmour [id] am > 0");
    if(target == INVALID_PLAYER_ID) return 0;
    J_SetPlayerArmour(target, armour);
    SendAdminsMessagef(COLOR_GREY, "[A] Администратор %s установил игроку %s[%i] показатель брони на %.0f", PN(playerid), PN(target), target, armour);
    return 1;
}


Как я понимаю дело вот в этой проверке в паблике OnPlayerTakeDamage:
 

if(PI[playerid][pShield] >= 10.0)
            {
                GetPlayerHealth(playerid, Health);
                Health += 10;
                if(Health > 100) Health = 100;
                J_SetPlayerHealth(playerid, Health);
                PI[playerid][pShield] -= 10.0;
            }

Могу предположить что внутри функции J_SetPlayerHealth имеется ещё и установка единиц брони игроку, возможно все дело в этой функции, вот собственно она:

J_SetPlayerHealth:

stock J_SetPlayerHealth(playerid, Float:hp, shareping = 0)
{
    if(hp < 1 && PlayerCure(playerid)) return J_SetPlayerArmour(playerid, 0), PlayerSpawn(playerid);
    new Float:health;
    GetPlayerHealth(playerid, health);
    PI[playerid][pHealth] = hp;
    UpdatePlayerDataFloat(playerid, "HP", PI[playerid][pHealth]);
    if(!shareping)
    {
        str_2[0] = EOS, f(str_2, sizeof(str_2),"+%.0f HP", (health-hp));
        SetPlayerChatBubble(playerid, str_2, COLOR_GREEN, 10.05000);
    }
    if(InventStatus{playerid})
    {
        f(str_2,sizeof(str_2),"HP: %.0f", hp),
        PlayerTextDrawSetString(playerid, Invent[playerid][38], str_2);
    }
    return SetPlayerHealth(playerid, hp);
}

 

Нашел еще какую то функцию связанную с setarmour, возможно она будет полезна в решении этой проблемы, вот она:

J_SetPlayerArmour:
stock J_SetPlayerArmour(playerid, Float:arm)
{
    new Float:armour;
    GetPlayerArmour(playerid, armour);
    if(InventStatus{playerid}) PlayerTextDrawSetStringf(playerid, Invent[playerid][37], "ARM: %.0f", arm);
    return SetPlayerArmour(playerid, PI[playerid][pArmour] = arm);
}

 

Share this post


Link to post

6 answers to this question

  • 0

удали функцию j_setplayerarmour и замени её

 SetPlayerArmour(playerid, 100.0);

Share this post


Link to post
  • 0

@Anton_Urchenko 

Заменил сток, получилось вот так:

 

stock SetPlayerArmour(playerid, 100.0);
{
    new Float:armour;
    GetPlayerArmour(playerid, armour);
    if(InventStatus{playerid}) PlayerTextDrawSetStringf(playerid, Invent[playerid][37], "ARM: %.0f", arm);
    return SetPlayerArmour(playerid, PI[playerid][pArmour] = arm);
}

И заменил все J_SetPlayerArmour которые существуют на SetPlayerArmour 
И куча варнингов:

 

(23056) : error 010: invalid function or declaration
(23056) : error 021: symbol already defined: "acc_SetPlayerArmour"
(23059) : error 021: symbol already defined: "GetPlayerArmour"
(23060) : error 010: invalid function or declaration
(23061) : error 010: invalid function or declaration
(23058) : warning 203: symbol is never used: "armour"

строчки с варнингами:

 

(23056): stock SetPlayerArmour(playerid, 100.0);
(23059): GetPlayerArmour(playerid, armour);
(23060): if(InventStatus{playerid}) PlayerTextDrawSetStringf(playerid, Invent[playerid][37], "ARM: %.0f", arm);
(23061): return SetPlayerArmour(playerid, PI[playerid][pArmour] = arm);
(23058): new Float:armour;


Фулл код:

 

stock SetPlayerArmour(playerid, 100.0);
{
    new Float:armour;
    GetPlayerArmour(playerid, armour);
    if(InventStatus{playerid}) PlayerTextDrawSetStringf(playerid, Invent[playerid][37], "ARM: %.0f", arm);
    return SetPlayerArmour(playerid, PI[playerid][pArmour] = arm);
}

 

Share this post


Link to post
  • 0

Ну смотри ты обьявил stock с названием SetPlayerAmour, хотя такая функция УЖЕ есть изначально в инклуде samp.inc, поэтому вместо того чтобы создавать свой новый сток просто в тех местах где ты использовал J_SeTPlayerAmour, замени на SetPlayerAmour, не нужно создавать эту функцию!

Share this post


Link to post
  • 0

@Anton_Urchenko 

 

Бро я же написал, я так и сделал, я в стоке J_SetPlayerAmour, заменил J_SetPlayerAmour на SetPlayerAmour И во всех остальных местах где есть функция J_SetPlayerArmour я заменил ее на SetPlayerAmour, я не создавал какой то новый сток 

Edited by acatsuci

Share this post


Link to post
  • 0

вот этот сток у него имя такое же как у стандартного паблика

stock SetPlayerArmour(playerid, 100.0);
{
    new Float:armour;
    GetPlayerArmour(playerid, armour);
    if(InventStatus{playerid}) PlayerTextDrawSetStringf(playerid, Invent[playerid][37], "ARM: %.0f", arm);
    return SetPlayerArmour(playerid, PI[playerid][pArmour] = arm);
}

Edited by Anton_Urchenko

Share this post


Link to post
  • 0

@Anton_Urchenko 
Ничего не понял, что мне надо сделать?

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0