CBasePlayer_TakeDamage помогите допилить код

Статус
В этой теме нельзя размещать новые ответы.

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
arrayset(g_aHits, 0, sizeof g_aHits)[DOUBLEPOST=1507972745][/DOUBLEPOST]Не компилится, не знаю как правильно обнулить двумерный массив :Wacko2:
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
С подсчетом головы чтото не понятное, убиваю или попадаю в голову, не засчитывается, а в каком то раунде вообще не попал по голове, однако написало 3 попадания

PHP:
#define HITBOXES 8

new g_aHits[33][sizeof HITBOXES]


public CBasePlayer_TakeDamage(const pevVictim, pevInflictor, pevAttacker, Float:damage, bitsDamageType)
{
    if(is_valid_player(pevAttacker))
    {
        if(pevAttacker != pevVictim && rg_is_player_can_takedamage(pevVictim, pevAttacker))
        {
            new value = get_member(pevAttacker, m_LastHitGroup)
          
            g_aHits[pevAttacker][value]++
        }
        return;
    }
}

public CmdMe(id)
{
    new len, szText[128]
   
    if(g_aHits[id][HIT_HEAD])
    len += formatex(szText[len], charsmax(szText) - len, " HS %i", g_aHits[id][HIT_HEAD])
   
    if(g_aHits[id][HIT_CHEST])
    len += formatex(szText[len], charsmax(szText) - len, " CH %i", g_aHits[id][HIT_CHEST])
   
    if(g_aHits[id][HIT_STOMACH])
    len += formatex(szText[len], charsmax(szText) - len, " ST %i", g_aHits[id][HIT_STOMACH])
 
    if(g_aHits[id][HIT_LEFTARM])
    len += formatex(szText[len], charsmax(szText) - len, " LA %i", g_aHits[id][HIT_LEFTARM])
 
    if(g_aHits[id][HIT_RIGHTARM])
    len += formatex(szText[len], charsmax(szText) - len, " RA %i", g_aHits[id][HIT_RIGHTARM])
 
    if(g_aHits[id][HIT_LEFTLEG])
    len += formatex(szText[len], charsmax(szText) - len, " LL %i", g_aHits[id][HIT_LEFTLEG])
 
    if(g_aHits[id][HIT_RIGHTLEG])
    len += formatex(szText[len], charsmax(szText) - len, " RL %i", g_aHits[id][HIT_RIGHTLEG])
   
    client_print_color(id,print_team_default, "%s", szText)
    return PLUGIN_HANDLED
}
 

BalbuR

Пользователь
Регистрация
26 Июл 2017
Сообщения
131
Симпатии
25
Пол
Мужской
new g_aHits[33][sizeof HITBOXES]
=>
new g_aHits[33][HITBOXES]

исправь
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
у меня в коде так и есть, отсюда просто копировал...
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
обнуление данных игрока на спауне есть?
пока нет, не могу понять как правильно обнулить двумерный[DOUBLEPOST=1507974527][/DOUBLEPOST]вообще какаято ерунда с подсчетом, попал 12 раз пишет и пишет что попал буд-то только в голову 6 раз(хотя вообще в нее ни разу не попал) и больше ни куда
 

BalbuR

Пользователь
Регистрация
26 Июл 2017
Сообщения
131
Симпатии
25
Пол
Мужской
попробуй так
arrayset(g_aHits[id], 0, sizeof g_aHits[])
 
  • Мне нравится
Симпатии: BeasT

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
попробуй так
arrayset(g_aHits[id], 0, sizeof g_aHits[])
обнуляется, спасибо!
Даже вроде стало писать, если там попал в левую руку и правую по 2 раза, общее число 4, т.е. правильно начало считать, НО!
Но до сих пор какая-то непонятная проблема с попаданиями в голову, попадаю в голову, пишет в правую ногу и наоборот.
Можно было бы заменить

PHP:
if(g_aHits[id][HIT_HEAD])
len += formatex(szText[len], charsmax(szText) - len, " П.нога %i", g_aHits[id][HIT_HEAD])

if(g_aHits[id][HIT_RIGHTLEG])    
len += formatex(szText[len], charsmax(szText) - len, " голова %i", g_aHits[id][HIT_RIGHTLEG])
Но я далеко не уверен, что оно именно так[DOUBLEPOST=1507975799][/DOUBLEPOST]Но всёже сейчас рискну[DOUBLEPOST=1507976336][/DOUBLEPOST]В общем чушь полнейшая, убил 2 в голову 2 попадания, оба написло в левую руку.
Потом еще одну попал в левую руку(не точно) и написало все 3 попадания в левую руку, АААА КАК ЭТОО ТААК :Crazy::Dash1:
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
Вот что в целом получилось

PHP:
#include <amxmodx>
#include <reapi>

#define PLUGIN  "Say Me"
#define VERSION "1.0"
#define AUTHOR  "BeasT"

#define is_valid_player(%0) (0 < %0 < 33)

#define HITBOXES 8

new g_aHits[33][HITBOXES]

new Float:g_Damage[33], g_Hits[33]

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true)
RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true)


register_clcmd("say /me", "CmdMe")
register_clcmd("say_team /me", "CmdMe")
}

public CBasePlayer_TakeDamage(const pevVictim, pevInflictor, pevAttacker, Float:damage, bitsDamageType)
{
    if(is_valid_player(pevAttacker))
    {
        if(pevAttacker != pevVictim && rg_is_player_can_takedamage(pevVictim, pevAttacker))
        {
            new value = get_member(pevAttacker, m_LastHitGroup)
            
            g_Damage[pevAttacker] += damage
            g_Hits[pevAttacker] ++
            g_aHits[pevAttacker][value]++
        }
        return;
    }
}

public CmdMe(id)
{
    new len, szText[128]
    
    if(g_aHits[id][HIT_HEAD])
    len += formatex(szText[len], charsmax(szText) - len, " HS %i", g_aHits[id][HIT_HEAD])
    
    if(g_aHits[id][HIT_CHEST])
    len += formatex(szText[len], charsmax(szText) - len, " CH %i", g_aHits[id][HIT_CHEST])
    
    if(g_aHits[id][HIT_STOMACH])
    len += formatex(szText[len], charsmax(szText) - len, " ST %i", g_aHits[id][HIT_STOMACH])
  
    if(g_aHits[id][HIT_LEFTARM])
    len += formatex(szText[len], charsmax(szText) - len, " LA %i", g_aHits[id][HIT_LEFTARM])
  
    if(g_aHits[id][HIT_RIGHTARM])
    len += formatex(szText[len], charsmax(szText) - len, " RA %i", g_aHits[id][HIT_RIGHTARM])
  
    if(g_aHits[id][HIT_LEFTLEG])
    len += formatex(szText[len], charsmax(szText) - len, " LL %i", g_aHits[id][HIT_LEFTLEG])
  
    if(g_aHits[id][HIT_RIGHTLEG])
    len += formatex(szText[len], charsmax(szText) - len, " RL %i", g_aHits[id][HIT_RIGHTLEG])
    
    client_print_color(id,print_team_default, "Вы нанесли %.0f урона попаданий %s", g_Damage[id], g_Hits[id], szText)
    return PLUGIN_HANDLED
}

public CBasePlayer_Spawn(id)
{
    g_Damage[id] = 0.0
    g_Hits[id] = 0
    arrayset(g_aHits[id], 0, sizeof g_aHits[])

}
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
всё дело в том, что получал урон не нанесенный, а который нанесли мне...
Большое спасибо BalbuR за наводку!
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
иногда выдаёт ошибку в этой строке
g_aHits[pevAttacker][value]++

Run time error 4: index out of bounds
CBasePlayer_TakeDamage (line 65)


Подскажите в чем может быть проблема?
 

StockX

Скриптер
Регистрация
8 Июн 2017
Сообщения
168
Симпатии
132
Пол
Мужской
BeasT,
PHP:
#define is_valid_player(%0) (0 < %0 < 33)
->
PHP:
 #define is_valid_player(%0) (1 <= %0 <= 32)
 

d3m37r4

Скриптер
Постоялец
Регистрация
8 Июн 2017
Сообщения
741
Симпатии
393
Пол
Мужской
Telegram
@dmitry_isakow
StockX, а это сильно важно, или просто принципиально?)
 

StockX

Скриптер
Регистрация
8 Июн 2017
Сообщения
168
Симпатии
132
Пол
Мужской
d3m37r4, скорее принципиально) Но так будет правильнее если мы хотим подставить вместо 32 конкретное значение MaxClients) Что я кстати и советую сделать BeasT
Может просто максимальное кол-во слотов меньше 32
Кстати, может быть проблема в value? Можно попробовать добавить условие value <= HITBOXES...
 
Последнее редактирование:

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
d3m37r4, скорее принципиально) Но так будет правильнее если мы хотим подставить вместо 32 конкретное значение MaxClients) Что я кстати и советую сделать BeasT
Может просто максимальное кол-во слотов меньше 32
Кстати, может быть проблема в value? Можно попробовать добавить условие value <= HITBOXES...
игроков 32, не знаю каким образом вылазит эта ошибка, но бывает она редко, т.е. не постоянная, каким образом вылазит за пределы массива мне не понятно o_O
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
value <= HITBOXES
это не пропустит за пределы, но почему так вообще получается?[DOUBLEPOST=1508526276][/DOUBLEPOST]т.е. хитов же 8 всего и объявлено 8, почему вылазит иногда?
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
в общем проверку пока поставил, нет логов, но, как мне кажется это костыль и не правильный выход из ситуации?
 

BalbuR

Пользователь
Регистрация
26 Июл 2017
Сообщения
131
Симпатии
25
Пол
Мужской
value <= HITBOXES

разве? мне кажется равно лучше убрать
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
ошибка появилась вновь, сейчас попробую <
 

BalbuR

Пользователь
Регистрация
26 Июл 2017
Сообщения
131
Симпатии
25
Пол
Мужской
в телегу отправь кусок кода и строку где ошибка
 
  • Мне нравится
Симпатии: BeasT
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу