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

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

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

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

Native Error (show_hudmessage) hltv_autorecord

, Периодически отваливается натив
Статус пользователя Bloo
сообщение 30.9.2014, 11:39
Сообщение #1


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Доброго дня, ни как не могу вникнуть в суть проблемы, стоит плагин hltv_autorecord от drft'a (ниже приложу исходник). Задачу он свою выполняет, но периодически, на разных серверах "отваливается" натива show_hudmessage и соответственно время и дата HLTV не показывается. Возникает стихийно, то на одном сервере спамит несколько дней, то на другом. Единственное что понял что вроде проблема в неверном получении ID игрока. Буду благодарен если кто то поможет исправить.
Полный текст ошибки + исходник:
Код:
L 09/27/2014 - 14:31:37: Invalid player id -1
L 09/27/2014 - 14:31:37: [AMXX] Displaying debug trace (plugin "hltv_autorecord.amxx")
L 09/27/2014 - 14:31:37: [AMXX] Run time error 10: native error (native "show_hudmessage")
L 09/27/2014 - 14:31:37: [AMXX] [0] hltv_autorecord.sma::hltv_show_time (line 284)

Код:
#include <amxmodx>
#include <sockets>

#define TIMER_TASK 32490283094

new g_hltv_id, g_realplayersnum, g_hltv_recording, g_hltv_ip[16], g_hltv_port, g_ignorebots, bool:g_mapchange
new g_hltvrec_cvar, g_hltvpath_cvar, g_minplayers_cvar, g_hltvpassword_cvar, g_ignorebots_cvar, g_recording_cvar //, g_challenge_cvar
new g_hltv_challenge[13], g_show_time // Contains the hltv rcon challenge number
new bool:g_challenging_rcon, g_autodelay_cvar

public plugin_init()
{
register_plugin("HLTV AutoRecord", "1.7", "Dr.Aft")
g_hltvrec_cvar = register_cvar("autohltv_record", "1") // enable plugin

// recording will be into cstrike/demos/HLTV-datetime.dem
g_hltvpath_cvar = register_cvar("autohltv_path", "demos/HLTV")

// ignore bots as real players
g_ignorebots_cvar = register_cvar("autohltv_ignorebots", "1")
g_ignorebots = get_pcvar_num(g_ignorebots_cvar)

// minimal players to start record, when it will be 1 player, recording will be stopped
g_minplayers_cvar = register_cvar("autohltv_minplayers", "2")

// This is fix if hltv is already recording, server can crash if we send the socket command again
g_recording_cvar = register_cvar("autohltv_recording", "0", FCVAR_SERVER|FCVAR_SPONLY)
if(get_pcvar_num(g_recording_cvar))
g_hltv_recording = 4

//g_challenge_cvar = register_cvar("autohltv_challenge", "", FCVAR_SPONLY|FCVAR_PROTECTED|FCVAR_UNLOGGED)

// adminpassword for hltv
g_hltvpassword_cvar = register_cvar("autohltv_pass", "hltvadminpass")
g_autodelay_cvar = register_cvar("autohltv_delay", "30.0")

register_cvar("autohltv_time", "2") // 2 - time for everyone, 1 - only to hltv, 0 - disabled
switch(get_cvar_num("autohltv_time"))
{
case 0: g_show_time = -2
case 1: g_show_time = -1
}
set_task(180.0, "prepare_for_mapchange", 0, _ , _ , "d")
set_task(1.0, "mapchange", 0, _ , _ , "d")
}

public client_putinserver(id)
{
if(g_mapchange)
return PLUGIN_CONTINUE

if(is_user_bot(id))
if(g_ignorebots)
return PLUGIN_CONTINUE

if(is_user_hltv(id))
{
if(g_hltv_id == 0)
{
g_hltv_id = id
if(g_show_time > -2)
{
if(g_show_time == -1)
g_show_time = g_hltv_id

if(g_hltv_recording == 4)
set_task(1.0, "hltv_show_time", TIMER_TASK, _, _, "b")
}
}

new hltv_ipport[32]
get_user_ip(g_hltv_id, hltv_ipport, 31)

strtok(hltv_ipport, g_hltv_ip, 16, hltv_ipport, 5, ':')
g_hltv_port = str_to_num(hltv_ipport)
check_stop_record()
}
else
g_realplayersnum++


if(g_hltv_id > 0)
{
if(g_realplayersnum >= get_pcvar_num(g_minplayers_cvar))
{
if(get_pcvar_num(g_hltvrec_cvar) && g_hltv_recording < 3)
{
set_task(1.0, "hltv_start_record")
g_hltv_recording = 3
}
}

}
return PLUGIN_CONTINUE
}

public client_disconnect(id)
{
if( (!is_user_bot(id) || !g_ignorebots) && !g_mapchange)
{
if(id == g_hltv_id)
{
g_hltv_id = 0
set_task(15.0, "flush_hltv")
hltv_freehandle_challenge()
}
else
{
g_realplayersnum--
check_stop_record()
}
}
}


public flush_hltv()
{
//set_pcvar_string(g_challenge_cvar, "^0")
set_pcvar_num(g_recording_cvar, 0)
g_hltv_recording = 0
g_hltv_challenge = ""

if(g_show_time > 0)
{
remove_task(TIMER_TASK)
if(g_show_time > 0)
g_show_time = -1
}
}


public check_stop_record()
{
if(g_hltv_recording == 4 && !g_mapchange)
if(g_realplayersnum < get_pcvar_num(g_minplayers_cvar))
{
set_task(1.0, "hltv_stop_record")
g_hltv_recording = 1
}
}


public hltv_start_record()
{
new record_string[90]
hltv_rcon_command("say [HLTV] Starting record...")
get_pcvar_string(g_hltvpath_cvar, record_string, 80)
format(record_string, 90, "record %s", record_string)
if(get_pcvar_float(g_autodelay_cvar) > 5.0)
set_task(get_pcvar_float(g_autodelay_cvar) - 5.0, "hltv_rcon_command", 0, record_string, strlen(record_string))
else
hltv_rcon_command(record_string)
}


public hltv_stop_record()
{
hltv_rcon_command("stoprecording")
hltv_rcon_command("say [HLTV] Stopped recording...")
}

public hltv_rcon_command(hltv_command[])
{
// Declare variables
new socket_address // Contains the socket address of the hltv server
new socket_error = 0 // Contains the error code of the socket connection


new send[256] // Contains the send socket command


new hltv_password[20] //, hltv_challenge[15]

// Set hltv rcon password
get_pcvar_string(g_hltvpassword_cvar, hltv_password, 19)

// Connect to the HLTV Proxy
socket_address = socket_open(g_hltv_ip, g_hltv_port, SOCKET_UDP, socket_error)

if (socket_error != 0)
return server_print("HLTV connection failure...", socket_error)

// Send challenge rcon and receive response
// Do NOT add spaces after the commas, you get an error about invalid function call

if(equali(g_hltv_challenge, ""))
{
if(!g_challenging_rcon)
{
setc(send, 4, 0xff)
copy(send[4], 255, "challenge rcon")
setc(send[28], 1, '^n')

socket_send2(socket_address, send, 255)

set_task(2.0, "hltv_challenge_receive", socket_address)
g_challenging_rcon = true
}
set_task(4.2, "hltv_rcon_command", 0, hltv_command, strlen(hltv_command))
}
else
{
replace(g_hltv_challenge, 255, "^n", "")

// Set rcon command
setc(send, 255, 0x00)
setc(send, 4, 0xff)

log_amx("hltv_command: %s", hltv_command)
formatex(send[4], 255, "rcon %s %s %s ^n", g_hltv_challenge, hltv_password, hltv_command)
log_amx("sending: %s", send)
socket_send2(socket_address, send, 255)
socket_close(socket_address)

switch(hltv_command[0])
{
case 'r':
{
if(g_show_time > -2)
set_task(1.0, "hltv_show_time", TIMER_TASK, _, _, "b")
g_hltv_recording = 4
set_pcvar_num(g_recording_cvar, 1)
}
case 's':
{
remove_task(str_to_num(g_hltv_challenge))
g_hltv_recording = 0
set_pcvar_num(g_recording_cvar, 0)
}
}

socket_close(socket_address)
}
return PLUGIN_CONTINUE
}


public hltv_challenge_receive(socket_address)
{
if(socket_change(socket_address))
{
if(task_exists(socket_address))
remove_task(socket_address)
new receive[255]
socket_recv(socket_address, receive, 255)
copy(g_hltv_challenge, 12, receive[19])
set_task(20.0, "hltv_freehandle_challenge")
g_challenging_rcon = false
}
else
{
new send[255], socket_error = 0
socket_close(socket_address)
socket_address = socket_open(g_hltv_ip, g_hltv_port, SOCKET_UDP, socket_error)
if(socket_error > 0)
log_amx("HLTV not responding...")
else
{
if(!task_exists(socket_address))
{
setc(send, 4, 0xff)
copy(send[4], 255, "challenge rcon")
setc(send[28], 1, '^n')

socket_send2(socket_address, send, 255)
set_task(1.0, "hltv_challenge_receive", socket_address)
}
}
}
}


public hltv_freehandle_challenge()
{
g_hltv_challenge = ""
}


public hltv_show_time()
{
static time[22]
get_time("%d/%m/%Y - %X", time, 21)
set_hudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, 4)
show_hudmessage(g_show_time, time)
}


public prepare_for_mapchange()
{
if(task_exists(TIMER_TASK))
remove_task(TIMER_TASK)
}


public mapchange()
{
g_mapchange = true
}

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
voed
сообщение 30.9.2014, 13:41
Сообщение #2
Стаж: 11 лет

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

Вместо индекса игрока почему-то переменная, которая может иметь значение -1
Код:
show_hudmessage(g_show_time, time)

>>
Код:
show_hudmessage(0, time)

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Stimul1
сообщение 30.9.2014, 13:43
Сообщение #3


Стаж: 13 лет

Сообщений: 227
Благодарностей: 262
Полезность: 977

Bloo, кому HUD сообщение должно отправляться?

// Если всем, то решение дано выше.

Отредактировал: Stimul1, - 30.9.2014, 13:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 30.9.2014, 13:49
Сообщение #4


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

Stimul1, HLTV
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 30.9.2014, 13:56
Сообщение #5
Стаж: 11 лет

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

Цитата(Bloo @ 30.9.2014, 13:49) *
Stimul1, HLTV

Тогда как-то так
Код:
public hltv_show_time()
{
static time[22]
get_time("%d/%m/%Y - %X", time, 21)
for(new i=1; i<33;i++)
{
if(is_user_connected(i) && is_user_hltv(i) && g_show_time == -1 )
{
set_hudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, 4)
show_hudmessage(i, time)
}
}
}


Отредактировал: voed, - 30.9.2014, 13:58
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Stimul1
сообщение 30.9.2014, 14:01
Сообщение #6


Стаж: 13 лет

Сообщений: 227
Благодарностей: 262
Полезность: 977

Bloo, попробуй так:
Код:
public hltv_show_time()
{
if(is_user_connected(g_hltv_id))
{
static time[22]
get_time("%d/%m/%Y - %X", time, 21)
set_hudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, 4)
show_hudmessage(g_hltv_id, time)
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
voed
сообщение 30.9.2014, 14:02
Сообщение #7
Стаж: 11 лет

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

Stimul1,
точно, не заметил, что при коннекте ид получается
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 30.9.2014, 14:02
Сообщение #8


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

voed, Сейчас попробую такой вариант.
Тут я так понял все не просто так
Код:
   register_cvar("autohltv_time", "2")      // 2 - time for everyone, 1 - only to hltv, 0 - disabled
switch(get_cvar_num("autohltv_time"))
{
case 0: g_show_time = -2
case 1: g_show_time = -1
}

Вот где присваивается ID
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 30.9.2014, 14:06
Сообщение #9
Стаж: 11 лет

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

Bloo,
нет, ид присваивается в putinserver, он не может быть отрицательным числом
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 30.9.2014, 14:22
Сообщение #10


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

voed, я имел ввиду переменную g_show_time которая изначально выступала в роли id.Просто получается тот квар остается не при делах.
Сейчас попробую тот вариант, спасибо.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 30.9.2014, 14:26
Сообщение #11
Стаж: 11 лет

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

Цитата(Bloo @ 30.9.2014, 14:22) *
voed, я имел ввиду переменную g_show_time которая изначально выступала в роли id.Просто получается тот квар остается не при делах.
Сейчас попробую тот вариант, спасибо.

Чтоб работал квар можно сделать так
Код:
public hltv_show_time()
{
if(is_user_connected(g_hltv_id) && g_show_time == -1)
{
static time[22]
get_time("%d/%m/%Y - %X", time, 21)
set_hudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, 4)
show_hudmessage(g_hltv_id, time)
}
}


А вообще плагин выглядит каким-то недописанным)

Отредактировал: voed, - 30.9.2014, 14:27
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: