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

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

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

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

hltv_autorecord заменить HUD на DHUD

, Вывод времени в DHUD вместо HUD
Статус пользователя Bloo
сообщение 19.3.2016, 14:55
Сообщение #1


Стаж: 12 лет

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

Всем привет! Использую hltv_autorecord от Draft для записи демок, очень нужная функция в нем, это вывод текущего времени для HLTV в HUD, но его плохо видно при просмотре с большим разрешением, ввиду чего решил заменить на вывод в DHUD, и в итоге все сломал, время вообще не выводится. Ниже исходники и куски которые редактировал:
Было Код:
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 hltv_show_time()
{
static time[22]
get_time("%d/%m/%Y - %X", time, 21)
set_dhudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, false)
show_dhudmessage(g_show_time, time)
}
Оригинал
Код:
#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
}
Мой вариант
Код:
#include <amxmodx>
#include <sockets>
#include <dhudmessage>

#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()
{
set_dhudmessage(0, 100, 200, -1.0, 0.9, 2, 15.0, 1.0, 10.0, 1.0, true)
show_dhudmessage(0, "o o o НАЧАЛАСЬ ЗАПИСЬ ДЕМО o o o")
new record_string[90]
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()
{
set_dhudmessage(0, 100, 200, -1.0, 0.9, 2, 15.0, 1.0, 10.0, 1.0, true)
show_dhudmessage(0, "o o o ЗАПИСЬ ДЕМО ОСТАНОВЛЕНО o o o")
hltv_rcon_command("stoprecording")
}

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_dhudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, false)
show_dhudmessage(g_show_time, time)
}


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


public mapchange()
{
g_mapchange = true
}
Буду благодарен за помощь и подсказку в чем косяк, вроде действие тупейшее, а понять в чем проблема не могу(
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Bloo
сообщение 19.3.2016, 15:18
Сообщение #2


Стаж: 12 лет

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

Я так понял проблема во времени показа сообщения? Минимальное значение 0.1? Как же тогда сделать перманентное сообщение на DHUD?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя d3m37r4
сообщение 19.3.2016, 15:26
Сообщение #3


Стаж: 11 лет

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

А если так сделать:
Цитата
set_dhudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 0.0, 0.1, 0.2, false)


Отредактировал: d3m37r4, - 19.3.2016, 15:26
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 19.3.2016, 15:50
Сообщение #4


Стаж: 12 лет

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

d3m37r4, нет, так сразу пропадает к сожалению.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 19.3.2016, 16:23
Сообщение #5


Стаж: 12 лет

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

В общем почему то перестал работать зацикленный таск. На тесте у меня все нормально работает так:
Код:
#include <dhudmessage>

public plugin_init()
{
set_task(0.5,"show_dhud", _, _, _, "b")
}

public show_dhud(id)
{
static time[22]
get_time("%d/%m/%Y^n%X", time, 21)
set_dhudmessage(0, 100, 200, 0.77, 0.19, 0, 0.1, 0.5, 0.0, 0.0, false)
show_dhudmessage(id, time)
}

Я так понимаю в этом участке проблема кроется:
Код:
	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")
}
}

Но я никак не могу понять сути этих условия. Я так понял, что таск срабатывает только если g_hltv_recording = 4, но оно по умолчанию 1 и не пойму при каком условии устанавливается в 4
Код:
	// 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

В общем я вообще запутался)) Есть мысли у кого то по этому поводу?

ps.gif От мерцания в DHUD я так понимаю никак не избавится?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя georgeml
сообщение 19.3.2016, 16:31
Сообщение #6
Стаж: 12 лет

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

Bloo,
Код:
g_recording_cvar = register_cvar("autohltv_recording", "0", FCVAR_SERVER|FCVAR_SPONLY)
if(get_pcvar_num(g_recording_cvar))
g_hltv_recording = 4

т.е. при кваре autohltv_recording 1 получим g_hltv_recording = 4, а он по-умолчанию= 0
мерцание- 7-й параметр в set_.. Время показа- 8-й параметр
https://www.amxmodx.org/api/amxmodx/set_dhudmessage

Отредактировал: georgeml, - 19.3.2016, 16:39
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 19.3.2016, 16:41
Сообщение #7


Стаж: 12 лет

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

georgeml, т.е. получается что все таки при нормальных условиях таск должен быть задействован, но он почему то не вызывается... Хотя autohltv_recording при нужном кол-ве игроков устанавливается в значение 1.
8 параметр как раз holdtime он равняется времени в таске, или его нужно сделать выше чем в таске тогда мерцания не будет?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя georgeml
сообщение 19.3.2016, 17:23
Сообщение #8
Стаж: 12 лет

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

Цитата(Bloo @ 20.3.2016, 0:41) *
georgeml, т.е. получается что все таки при нормальных условиях таск должен быть задействован, но он почему то не вызывается... Хотя autohltv_recording при нужном кол-ве игроков устанавливается в значение 1.

Код:
switch(get_cvar_num("autohltv_time"))
{
case 0: g_show_time = -2
case 1: g_show_time = -1
case 2: g_show_time = 0
}

Цитата(Bloo @ 20.3.2016, 0:41) *
8 параметр как раз holdtime он равняется времени в таске, или его нужно сделать выше чем в таске тогда мерцания не будет?

Код:
set_dhudmessage(0, 100, 200, 0.77, 0.19, 0, 0.0, 1.0, 0.1, 0.2, 4)

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