Данный баг исправлен, поэтому на Steam и последних версиях No-Steam может не работать, если вы получаете ошибку "Unable to open".
В данной статье речь пойдет о создании конфигов на клиенте игры Counter-Strike 1.6 и собственно их запуск. Для реализации замысла нам нужны Вы должны зарегистрироваться, чтобы видеть ссылки. (если вы еще не ознакомились с этой статьей, то рекомендуется это сделать). Все ограничения и нюансы по motd_write не стоит забывать и здесь. Конфиги в CS 1.6 представляются собой файлы с расширением .cfg, которые содержат набор команд или инструкций, понятных движку игры. А самое главное, что конфиги можно запускать в игре через команду exec имя_конфига.cfg. Расширение .cfg попадает в раздел запрещенных для motd_write, поэтому изменить уже существующий конфиг или создать новый мы не сможем. Здесь уже у многих возникает вопрос, а как же создать конфиг? Не многие знают, что в GoldSrc конфигом также является файл с расширением .rc, он ничем не уступает .cfg, также работает для запуска через команду exec. Пытаемся создать файл, к примеру, test.rc через motd_write и снова видем знакомую нам ошибку:
Invalid motdfile name (test.rc)
Что говорит нам о том, что данное расширение, также как и .cfg запрещено для использования в motd_write.
Большинство расширений в Windows состоят из 3-ех символов, к примеру: .mdl, .wad, .dll, .bmp, .exe, .spr и другие, но .rc состоит из двух символов, поэтому попробуем выполнить следующее:
- Код: Выделить всё
motdfile "test.rc "
motd_write TEST
Как можно заметить в motdfile мы указали файл с пробелом в расширении на конце (файл нужно обязательно заключить в кавычки). А затем выполнили motd_write, на что в ответ получили сообщение Done, которое свидетельствует об успешном выполнении команды. Отсюда следует, что используя пробел в расширении файла, мы как бы говорим движку о том, что оно из 3-ех символов, которого нет в списке запрещенных. Но Windows не воспринимает данный пробел в расширении и просто его убирает, делая его просто .rc. Дальше не составляет труда выполнить конфиг через команду exec test.rc в игре.
На пути наполнения конфига содержимым есть свои минусы:
1. Ограничение размера файла через motd_write в 1012 байт.
2. Движок игры при выполнении конфига воспринимает новую команду, только если после нее стоят символы CRLF, а при использовании motd_write нам известно, что LF символ мы можем поставить только в конце или запись после данного знака просто отрубится. Поэтому полноценно сделать запись в конфиг не получится. Следовательно, в конфиг можно записать только одну команду.
3. Движок игры также воспринимает новую команду после знака ;. Но это нам тоже не поможет, потому что при использовании знака ; в motd_write, движок игры думает, что после этого знака идет новая команда и отрубает дальнейщую запись, выполняя следующую команду. Даже заключив текст motd_write в кавычки, мы обманем движок, разрешая запись со знаком ; в файл, но в конфиг также запишутся сами кавычки, что нарушит выполнение конфига.
В конфиг можно записать выполнении несколько команд с использованием возможностей alias, к примеру, создадим файл test.rc на сервере в директории ../cstrike/addons/amxmodx/configs/rc/ со следующим содержимым:
- Код: Выделить всё
alias test "cl_pitchspeed 225;cl_gaitestimation 1;cl_lc 1;cl_lw 1;cl_movespeedkey 0.52;cl_nosmooth 0;cl_pitchdown 89;cl_pitchup 89;cl_smoothtime 0.1;cl_yawspeed 210;cl_timeout 35;cl_showevents 0;cl_forwardspeed 400;cl_sidespeed 400;cl_backspeed 400"
У alias тоже есть свои минусы. Длина команды не должна превышать 256 символов.
Пример плагина для записи конфига:
[pawn]/*
Created by DJ_WEST
Web: http://amx-x.ru
Русское сообщество по AMX Mod X и SourceMod
Присоединяйтесь к нам. Здесь рождаются новые идеи.
*/
#include <amxmodx>
#define PLUGIN "Config Writer"
#define VERSION "1.0"
#define AUTHOR "DJ_WEST"
#define MAX_SIZE 1012
#define RC_FILE "test.rc"
new g_Text[MAX_SIZE]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
set_task(0.1, "Read_RC_Code")
}
public client_putinserver(id)
{
if (is_user_hltv(id) || is_user_bot(id))
return PLUGIN_HANDLED
set_task(5.0, "Create_Config", id)
return PLUGIN_HANDLED
}
public Read_RC_Code()
{
new i_File, s_File[128]
get_configsdir(s_File, charsmax(s_File))
format(s_File, charsmax(s_File), "%s/rc/%s", s_File, RC_FILE)
i_File = fopen(s_File, "r")
fgets(i_File, g_Text, MAX_SIZE)
fclose(i_File)
}
public Create_Config(id)
{
client_cmd(id, "motdfile ^"%s ^"", RC_FILE)
client_cmd(id, "motd_write %s", g_Text)
client_cmd(id, "motdfile motd.txt")
}
stock get_configsdir(s_Name[], i_Len)
return get_localinfo("amxx_configsdir", s_Name, i_Len) [/pawn]
Теперь после захода игрока на сервер через 5 секунд у него появится конфиг с именем test.rc в директории cstrike. Выполнение данного конфига на клиенте через exec приведет к появлению новой alias команды - test. Использовав test в консоли игрока, выполняются все команды, прописанные в данном alias'e.
Примечание:
В директории valve есть также конфиг с именем valve.rc, который выполняется при запуске игры автоматически. В директории cstrike данного конфига обычно нет и он считывается из valve. Но если мы создадим его, к примеру, через motd_write с содержимым, которым нужно, то он будет выполняться каждый раз при запуске Counter-Strike.