Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Массив ерошиться

Статус пользователя Legend21
сообщение 13.6.2016, 18:10
Сообщение #1
Стаж: 14 лет
Город: Винница

Сообщений: 604
Благодарностей: 229
Полезность: 561

Приветствую друзья. Написал плагин ammo системы, но есть ошибка:

L 06/13/2016 - 18:01:18: [AMXX] Displaying debug trace (plugin "zp_system_ammo.amxx", version "4.4.2")
L 06/13/2016 - 18:01:18: [AMXX] Run time error 4: index out of bounds
L 06/13/2016 - 18:01:18: [AMXX] [0] zp_system_ammo.sma::fw_TakeDamage (line 78)

Мой код:
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type){

if(g_Money[attacker] >= LIMIT_AMMO)
return;

//if(is_user_connected(victim))
//{
if(zp_get_user_human(attacker))
{
s_damagebonus[attacker] += floatround(damage)

while(s_damagebonus[attacker] > DAMAGE_BONUS)
{
g_Money[attacker]++
s_damagebonus[attacker] -= DAMAGE_BONUS
set_hudmessage(065, 105, 225, -1.0, 0.80, 0, 1.1, 1.5, 0.01, 0.1);
show_hudmessage(attacker, "[+1 ammo]");
}
}
//}
}


Добавлял проверки на живого игрока и конект - не помогает. Я так догадываюсь что проблема в масиве s_damagebonus[33] . Еще не пробовал добавить двух мерный массив. Нуждаюсь в советах и помощи.

Отредактировал: Legend21, - 13.6.2016, 18:12
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
voed
сообщение 13.6.2016, 18:15
Сообщение #2
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата
if(g_Money[attacker] >= LIMIT_AMMO)
return;

//if(is_user_connected(victim))
//{

Ну конечно не помогает

Буквально позавчера делал, ниже тоже массив, все нормально.

Отредактировал: voed, - 13.6.2016, 18:26
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Inline
сообщение 14.6.2016, 18:17
Сообщение #3


Стаж: 10 лет

Сообщений: 139
Благодарностей: 80
Полезность: 447

Legend21, attacker может быть не только игроком. Проверяйте так
Код:
#define is_user_player(%1)  (33>%1>0) 


Не читай
Не забывай нажимать кнопку "спасибо"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя georgeml
сообщение 14.6.2016, 18:28
Сообщение #4
Стаж: 12 лет

Сообщений: 1467
Благодарностей: 439
Полезность: 423

Inline, ну.. еще, чудищем заморским
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Inline
сообщение 14.6.2016, 19:20
Сообщение #5


Стаж: 10 лет

Сообщений: 139
Благодарностей: 80
Полезность: 447

Цитата(georgeml @ 14.6.2016, 19:28) *
Inline, ну.. еще, чудищем заморским

Нет (плохая шутка)


Не читай
Не забывай нажимать кнопку "спасибо"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 14.6.2016, 19:33
Сообщение #6
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Цитата(voed @ 13.6.2016, 20:15) *
Ну конечно не помогает

Буквально позавчера делал, ниже тоже массив, все нормально.


По идее, аттакер может быть живым и не являться при этом игроком.

Если хочется исключить вообще все возможные баги, тогда:

Код:
#define is_user_valid(%1) 					(1 <= %1 <= g_iMaxPlayers)

new g_iMaxPlayers

public plugin_init()
{
g_iMaxPlayers = get_maxplayers();
}

public fw_TakeDamage_Pre(victim, inflictor, attacker, Float:damage, damage_bits)
{
if(!is_user_valid(victim) || !is_user_valid(attacker))
return HAM_IGNORED;

тут мы кодец хреначим

return HAM_IGNORED;
}


Отредактировал: SISA, - 14.6.2016, 19:37
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
voed
сообщение 14.6.2016, 19:53
Сообщение #7
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата(SISA @ 14.6.2016, 20:33) *
По идее, аттакер может быть живым и не являться при этом игроком.

Нет, не может smile.gif
Код
static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */
{
    int index = params[1];
    
    if (index < 1 || index > gpGlobals->maxClients)
    {
        return 0;
    }
    
    CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);

    if (g_bmod_tfc)
    {
        edict_t *e = pPlayer->pEdict;
        if (e->v.flags & FL_SPECTATOR ||
            (!e->v.team || !e->v.playerclass))
        {
            return 0;
        }
    }
    
    return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: