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

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

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

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

Ошибка в логах плагина Hook

, Debug error
Статус пользователя KPOCT
сообщение 23.8.2016, 13:53
Сообщение #1
Стаж: 11 лет

Сообщений: 14
Благодарностей: 2
Полезность: 0

Здравствуйте.
Прошу помощи.
Код:

public hook_task(id)
{
if(!is_user_connected(id))
{
remove_hook(id)
}
for(new attacker = 1; attacker <= get_maxplayers(); attacker++)
{
if(attacker != id)
{
if(is_user_connected(attacker) && is_user_connected(id))
{
new body;
if(get_user_aiming(attacker, id, body) && (cs_get_user_team(id) == CS_TEAM_T) ? (cs_get_user_team(attacker) == CS_TEAM_CT) : (cs_get_user_team(attacker) == CS_TEAM_T)) /// line 154
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
}
}
remove_beam(id)
draw_hook(id)
new origin[3], Float:velocity[3]
get_user_origin(id,origin)
new distance = get_distance(hookorigin[id],origin)
if(distance > 25)
{
velocity[0] = (hookorigin[id][0] - origin[0]) * (2.0 * 300 / distance)
velocity[1] = (hookorigin[id][1] - origin[1]) * (2.0 * 300 / distance)
velocity[2] = (hookorigin[id][2] - origin[2]) * (2.0 * 300 / distance)
entity_set_vector(id,EV_VEC_velocity,velocity)
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
remove_hook(id)
}
}

Код
[CSTRIKE] Player out of range (0)
[AMXX] Displaying debug trace (plugin "hook.amxx")
[AMXX] Run time error 10: native error (native "cs_get_user_team")
[AMXX]    [0] hook.sma::hook_task (line 154)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя iShot
сообщение 23.8.2016, 14:53
Сообщение #2


Стаж: 11 лет

Сообщений: 1340
Благодарностей: 463
Полезность: 845

Меценат Меценат

KPOCT, это весь код? ошибка в 154 строке.

Отредактировал: iShot, - 23.8.2016, 14:54


улыбнись :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя KPOCT
сообщение 23.8.2016, 15:42
Сообщение #3
Стаж: 11 лет

Сообщений: 14
Благодарностей: 2
Полезность: 0

Цитата(iShot @ 23.8.2016, 15:53) *
KPOCT, это весь код? ошибка в 154 строке.

Если скролл бар правее отодвинуть, можно увидеть коммент "line 154" :)
Остальной код врядли понадобится, однако, держи.
Код:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <hamsandwich>
#include <cstrike>

#define PLUGIN "Hook++"
#define VERSION "1.0"
#define AUTHOR "Unknown"
#define PREFIX "^1[^4Паутинка^1]"
#define MAPS_NOT_BLOCK_PATH "addons/amxmodx/configs/MapsNotBlock.ini"
#define SOUND_PATH "hook/hook.wav"
#define SPRITE_PATH "sprites/hook/hook.spr"
#define MAX_HOOK 15

new
bool:bGift[33],
bool:bIsHooked[33],
bool:bNotBlock,
hookorigin[33][3],
blockhook[33],
iSprite;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_Spawn, "player", "Spawn_player", 1)
register_clcmd("+hook","hook_on")
register_clcmd("-hook","hook_off")
}

public plugin_cfg()
{
new file_MapsNotBlock = fopen(MAPS_NOT_BLOCK_PATH, "rt");
if (!file_MapsNotBlock)
{
server_print("Failed to open file ^"%s^"", MAPS_NOT_BLOCK_PATH);
return;
}
new szMapName[64] ; get_mapname(szMapName , charsmax(szMapName));
new szBuffer[64]
while(!feof(file_MapsNotBlock))
{
fgets(file_MapsNotBlock, szBuffer, charsmax( szBuffer ));
trim(szBuffer);
if(!szBuffer[0] || szBuffer[0] == '[' || szBuffer[0] == ']')
{
continue;
}
if (equal(szBuffer, szMapName))
{
bNotBlock = true
}
}
}

public plugin_precache()
{
precache_sound(SOUND_PATH)
iSprite = precache_model(SPRITE_PATH)
}

public Spawn_player(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
blockhook[id] = 0
}
}

public client_disconnect(id)
{
remove_hook(id)
bGift[id] = false;
}

public client_putinserver(id)
{
remove_hook(id)
}

public hook_on(id, level, cid)
{
if(get_user_flags(id) & ADMIN_LEVEL_G || bGift[id]) /// Флаг s
{
if(!cmd_access(id, level, cid, 1, true) || !is_user_alive(id))
{
return PLUGIN_HANDLED
}
if(bNotBlock)
{
get_user_origin(id,hookorigin[id],3)
emit_sound(id, CHAN_STATIC, SOUND_PATH, 1.0, ATTN_NORM, 0, PITCH_NORM)
bIsHooked[id] = true
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)
return PLUGIN_HANDLED;
}
if(blockhook[id] < MAX_HOOK) /// Ограничение
{
get_user_origin(id,hookorigin[id],3)
bIsHooked[id] = true
++blockhook[id]
emit_sound(id, CHAN_STATIC, SOUND_PATH, 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)
ChatColor(id,"%s ^3Вы использовали ^4%d ^3раз из ^4%d^3!", PREFIX, blockhook[id], MAX_HOOK)
}
else
{
ChatColor(id,"%s ^3Вы достигли лимита в этом раунде.", PREFIX)
return PLUGIN_HANDLED
}
}
else
{
ChatColor(id,"%s ^3У Вас нет паутинки. Чтобы узнать о покупке, напишите в чат ^4/adminka^3.", PREFIX)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}

public is_hooked(id)
{
return bIsHooked[id]
}

public hook_off(id)
{
if(get_user_flags(id) & ADMIN_LEVEL_G || bGift[id])
{
remove_hook(id)
}
else
{
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}

public hook_task(id)
{
if(!is_user_connected(id))
{
remove_hook(id)
}
for(new attacker = 1; attacker <= get_maxplayers(); attacker++)
{
if(attacker != id)
{
if(is_user_connected(attacker) && is_user_connected(id))
{
new body;
if(get_user_aiming(attacker, id, body) && (cs_get_user_team(id) == CS_TEAM_T) ? (cs_get_user_team(attacker) == CS_TEAM_CT) : (cs_get_user_team(attacker) == CS_TEAM_T))
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
}
}
remove_beam(id)
draw_hook(id)
new origin[3], Float:velocity[3]
get_user_origin(id,origin)
new distance = get_distance(hookorigin[id],origin)
if(distance > 25)
{
velocity[0] = (hookorigin[id][0] - origin[0]) * (2.0 * 300 / distance)
velocity[1] = (hookorigin[id][1] - origin[1]) * (2.0 * 300 / distance)
velocity[2] = (hookorigin[id][2] - origin[2]) * (2.0 * 300 / distance)
entity_set_vector(id,EV_VEC_velocity,velocity)
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
remove_hook(id)
}
}

public draw_hook(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(1) /// TE_BEAMENTPOINT
write_short(id) /// entid
write_coord(hookorigin[id][0]) /// origin
write_coord(hookorigin[id][1]) /// origin
write_coord(hookorigin[id][2]) /// origin
write_short(iSprite) /// sprite index
write_byte(0) /// start frame
write_byte(0) /// framerate
write_byte(100) /// life
write_byte(41) /// ширина спрайта
write_byte(0) /// noise
if(get_user_team(id) == 1)
{
write_byte(192) ///R /|/ СЕРЫЙ ЦВЕТ (R, G, B)
write_byte(192) ///G
write_byte(192) ///B
}
else
{
write_byte(192) ///R /|/ СЕРЫЙ ЦВЕТ (R, G, B)
write_byte(192) ///G
write_byte(192) ///B
}
write_byte(250) /// brightness
write_byte(5) /// speed
message_end()
}

public remove_hook(id)
{
if(task_exists(id))
{
remove_task(id)
}
remove_beam(id)
bIsHooked[id] = false
}

public remove_beam(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(99)
write_short(id)
message_end()
}

public give_hook(id)
{
bGift[id] = true;
}

stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4") /// Green Color
replace_all(msg, 190, "!y", "^1") /// Default Color
replace_all(msg, 190, "!t", "^3") /// Team Color
replace_all(msg, 190, "!t2", "^0") /// Team2 Color
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}


В общем, я подозревал, что ошибочка именно в тернарном операторе, однако, питался надеждами, что там всё ок.
Пришлось заменить на такую вот конструкцию:
Код:

for(new attacker = 1; attacker <= get_maxplayers(); attacker++)
{
if(attacker != id)
{
if(is_user_connected(attacker) && is_user_connected(id))
{
new body;
if(cs_get_user_team(id) == CS_TEAM_T && cs_get_user_team(attacker) == CS_TEAM_CT)
{
if(get_user_aiming(attacker, id, body))
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
else if (cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T)
{
if(get_user_aiming(attacker, id, body))
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
}
}
}


Но теперь возникла другая проблема :)
Код
Invalid player id 0
[AMXX] Displaying debug trace (plugin "hook.amxx")
[AMXX] Run time error 10: native error (native "get_user_origin")
[AMXX]    [0] hook.sma::hook_task (line 176)
[AMXX]    [1] hook.sma::hook_on (line 106)


Не могу понять, откуда 0 взялся-то.
Вот код с последними изменениями:
Код:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <hamsandwich>
#include <cstrike>

#define PLUGIN "Hook++"
#define VERSION "1.0"
#define AUTHOR "AUTHOR"
#define PREFIX "^1[^4Паутинка^1]"
#define MAPS_NOT_BLOCK_PATH "addons/amxmodx/configs/MapsNotBlock.ini"
#define SOUND_PATH "hook/hook.wav"
#define SPRITE_PATH "sprites/hook/hook.spr"
#define MAX_HOOK 15

new
bool:bGift[33],
bool:bIsHooked[33],
bool:bNotBlock,
hookorigin[33][3],
blockhook[33],
iSprite;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_Spawn, "player", "Spawn_player", 1)
register_clcmd("+hook","hook_on")
register_clcmd("-hook","hook_off")
}

public plugin_cfg()
{
new file_MapsNotBlock = fopen(MAPS_NOT_BLOCK_PATH, "rt");
if (!file_MapsNotBlock)
{
server_print("Failed to open file ^"%s^"", MAPS_NOT_BLOCK_PATH);
return;
}
new szMapName[64] ; get_mapname(szMapName , charsmax(szMapName));
new szBuffer[64]
while(!feof(file_MapsNotBlock))
{
fgets(file_MapsNotBlock, szBuffer, charsmax( szBuffer ));
trim(szBuffer);
if(!szBuffer[0] || szBuffer[0] == '[' || szBuffer[0] == ']')
{
continue;
}
if (equal(szBuffer, szMapName))
{
bNotBlock = true
}
}
}

public plugin_precache()
{
precache_sound(SOUND_PATH)
iSprite = precache_model(SPRITE_PATH)
}

public Spawn_player(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
blockhook[id] = 0
}
}

public client_disconnect(id)
{
remove_hook(id)
bGift[id] = false;
}

public client_putinserver(id)
{
remove_hook(id)
}

public hook_on(id, level, cid)
{
if(get_user_flags(id) & ADMIN_LEVEL_G || bGift[id]) /// Флаг s
{
if(!cmd_access(id, level, cid, 1, true) || !is_user_alive(id))
{
return PLUGIN_HANDLED
}
if(bNotBlock)
{
get_user_origin(id,hookorigin[id],3)
emit_sound(id, CHAN_STATIC, SOUND_PATH, 1.0, ATTN_NORM, 0, PITCH_NORM)
bIsHooked[id] = true
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)
return PLUGIN_HANDLED;
}
if(blockhook[id] < MAX_HOOK) /// Ограничение
{
get_user_origin(id,hookorigin[id],3)
bIsHooked[id] = true
++blockhook[id]
emit_sound(id, CHAN_STATIC, SOUND_PATH, 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)
ChatColor(id,"%s ^3Вы использовали ^4%d ^3раз из ^4%d^3!", PREFIX, blockhook[id], MAX_HOOK)
}
else
{
ChatColor(id,"%s ^3Вы достигли лимита в этом раунде.", PREFIX)
return PLUGIN_HANDLED
}
}
else
{
ChatColor(id,"%s ^3У Вас нет паутинки. Чтобы узнать о покупке, напишите в чат ^4/adminka^3.", PREFIX)
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}

public is_hooked(id)
{
return bIsHooked[id]
}

public hook_off(id)
{
if(get_user_flags(id) & ADMIN_LEVEL_G || bGift[id])
{
remove_hook(id)
}
else
{
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}

public hook_task(id)
{
if(!is_user_connected(id))
{
remove_hook(id)
}
for(new attacker = 1; attacker <= get_maxplayers(); attacker++)
{
if(attacker != id)
{
if(is_user_connected(attacker) && is_user_connected(id))
{
new body;
if(cs_get_user_team(id) == CS_TEAM_T && cs_get_user_team(attacker) == CS_TEAM_CT)
{
if(get_user_aiming(attacker, id, body))
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
else if (cs_get_user_team(id) == CS_TEAM_CT && cs_get_user_team(attacker) == CS_TEAM_T)
{
if(get_user_aiming(attacker, id, body))
{
remove_hook(id)
ChatColor(id, "%s ^3Вы под прицелом! Нельзя использовать паутинку!", PREFIX);
}
}
}
}
}
remove_beam(id)
draw_hook(id)
new origin[3], Float:velocity[3]
get_user_origin(id,origin)
new distance = get_distance(hookorigin[id],origin)
if(distance > 25)
{
velocity[0] = (hookorigin[id][0] - origin[0]) * (2.0 * 300 / distance)
velocity[1] = (hookorigin[id][1] - origin[1]) * (2.0 * 300 / distance)
velocity[2] = (hookorigin[id][2] - origin[2]) * (2.0 * 300 / distance)
entity_set_vector(id,EV_VEC_velocity,velocity)
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
remove_hook(id)
}
}

public draw_hook(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(1) /// TE_BEAMENTPOINT
write_short(id) /// entid
write_coord(hookorigin[id][0]) /// origin
write_coord(hookorigin[id][1]) /// origin
write_coord(hookorigin[id][2]) /// origin
write_short(iSprite) /// sprite index
write_byte(0) /// start frame
write_byte(0) /// framerate
write_byte(100) /// life
write_byte(41) /// ширина спрайта
write_byte(0) /// noise
if(get_user_team(id) == 1)
{
write_byte(192) ///R /|/ СЕРЫЙ ЦВЕТ (R, G, B)
write_byte(192) ///G
write_byte(192) ///B
}
else
{
write_byte(192) ///R /|/ СЕРЫЙ ЦВЕТ (R, G, B)
write_byte(192) ///G
write_byte(192) ///B
}
write_byte(250) /// brightness
write_byte(5) /// speed
message_end()
}

public remove_hook(id)
{
if(task_exists(id))
{
remove_task(id)
}
remove_beam(id)
bIsHooked[id] = false
}

public remove_beam(id)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(99)
write_short(id)
message_end()
}

public give_hook(id)
{
bGift[id] = true;
}

stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4") /// Green Color
replace_all(msg, 190, "!y", "^1") /// Default Color
replace_all(msg, 190, "!t", "^3") /// Team Color
replace_all(msg, 190, "!t2", "^0") /// Team2 Color
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}


Решил проблему добавлением проверки на is_user_alive.
Можно закрывать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: