Вход

Просмотр полной версии : [Вопрос] Проблема с перехватом OnPlayerDeath



m1n1vv
22.10.2016, 04:39
При самоубийстве появляется такая ошибка:

[debug] Run time error 4: "Array index out of bounds"
[debug] Accessing element at index 65535 past array upper bound 29
[debug] AMX backtrace:
[debug] #0 0002a630 in public hud_3d__OnPlayerDeath (playerid=0, killerid=65535, reason=54) at ...\gamemodes\sfcr.pwn:212
[debug] #1 0002525c in public stores_OnPlayerDeath (playerid=0, killerid=65535, reason=54) at ../R1/hud_3d.inc:94
[debug] #2 0001b808 in public sfkick_OnPlayerDeath (playerid=0, killerid=65535, reason=54) at ../R1/stores.inc:424
[debug] #3 000167f0 in public bm_OnPlayerDeath (playerid=0, killerid=65535, reason=54) at ../R1/sfkick.inc:109
[debug] #4 00015d68 in public OnPlayerDeath (playerid=0, killerid=65535, reason=54) at ../R1/money.inc:101

Везде перехват по 1 шаблону, только разные наименования:

public OnPlayerDeath(playerid, killerid, reason)
{
//код
#if defined hud_3d__OnPlayerDeath
hud_3d__OnPlayerDeath(playerid, killerid, reason);
#endif
return 1;
}
#if defined _ALS_OnPlayerDeath
#undef OnPlayerDeath
#else
#define _ALS_OnPlayerDeath
#endif
#define OnPlayerDeath hud_3d__OnPlayerDeath
#if defined hud_3d__OnPlayerDeath
forward hud_3d__OnPlayerDeath(playerid, killerid, reason);
#endif

vovandolg
22.10.2016, 05:52
А так если?


public OnPlayerDeath(playerid, killerid, reason)
{
//код
#if defined hud_3d__OnPlayerDeath
hud_3d__OnPlayerDeath(playerid, killerid, reason);
#endif
return 1;
}
#if defined _ALS_OnPlayerDeath
#undef OnPlayerDeath
#else
#define _ALS_OnPlayerDeath
#endif

#if defined hud_3d__OnPlayerDeath
forward hud_3d__OnPlayerDeath(playerid, killerid, reason);
#endif

#define OnPlayerDeath hud_3d__OnPlayerDeath

Nexius_Tailer
22.10.2016, 10:45
А ты уверен, что именно с хуком? Тебе же пишет, что выход за пределы массива (такое чаще бывает, когда проверки валидности killerid нет).
Покажи строчки 212, 94, 424, 109, 101. Вероятнее всего проблема на первой.

m1n1vv
22.10.2016, 20:44
kill_detected[killerid] += 30; //212
return 1; //94, 424, 109, 101


if (killerid != INVALID_PLAYER_ID)
Исправит эту ошибку?

Nexius_Tailer
22.10.2016, 21:12
kill_detected[killerid] += 30; //212
return 1; //94, 424, 109, 101


if (killerid != INVALID_PLAYER_ID)
Исправит эту ошибку?
Да. И при любом обращении к массивам с индексом killerid всегда нужно проверять, стоит ли этот код под соответствующей проверкой.