Русское сообщество по скриптингу

Создание конфигов на клиенте

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Создание конфигов на клиенте

Сообщение DJ_WEST » 01 мар 2010, 17:54

Автор: DJ_WEST

Данный баг исправлен, поэтому на 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 ^"%^"", 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.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Создание конфигов на клиенте

Сообщение Fedcomp » 01 мар 2010, 18:10

DJ_WEST писал(а):
Код: Выделить всё

motdfile "test.rc "
motd_write TEST

Код: Выделить всё

motdfile "test.cfg "
motd_write TEST

:dntknw: ?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Создание конфигов на клиенте

Сообщение DJ_WEST » 01 мар 2010, 18:41

Нет, это будет расширение из 4-ых символов, он все равно не разрешит сделать.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Создание конфигов на клиенте

Сообщение Ser_UFL » 22 мар 2010, 17:44

Надо попробовать как-нибудь передать сам файл "test.rc ", а не записать его через motd_write... :-)
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Создание конфигов на клиенте

Сообщение DJ_WEST » 22 мар 2010, 19:43

Надо попробовать как-нибудь передать сам файл "test.rc ", а не записать его через motd_write...

А толку? Передашь ты его один раз, если у клиента его нет, потом ты никак не изменишь, ибо precache не заменяет файлы.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Создание конфигов на клиенте

Сообщение Ser_UFL » 22 мар 2010, 19:56

DJ_WEST, вопрос в другом.. с помощью motd_write я могу записать 1012 байт - это раз, а два - не получится нормальный конфиг сделать, а только алиасы и т.п.. (вобщем то, что ты сам описал в статье).
А насчет precache - это уже второстепенный вопрос. В Loading Banner тоже ведь картинку не перезапишешь. Я просто сделаю "svoe_nazvanie.rc " и передам его игроку, а дальше выполню у него на клиенте exec svoe_nazvanie.rc
Я просто подумал, если прокатил этот пробел с ".rc " в motd_write, может и в precache сработает..
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Создание конфигов на клиенте

Сообщение DJ_WEST » 22 мар 2010, 20:05

Для начала проверь precache и .rc формат файла. Если сработает, то тебе ничего не мешает закачать свой .rc файл и прописать через motd_write в valve.rc для его автоматического запуска.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Создание конфигов на клиенте

Сообщение Ser_UFL » 22 мар 2010, 20:30

Для начала проверь precache и .rc формат файла.

Ты имеешь ввиду без пробела? Я всегда был уверен, что он запрещен также как и .cfg ...

Добавлено спустя 21 минуту 12 секунд:
Код: Выделить всё


Verifying and downloading resources...
Error: server failed to transmit file 'test.rc'


Каким образом в винде на сервере создать файл "ххх.rc " :dntknw:
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Создание конфигов на клиенте

Сообщение Ser_UFL » 25 мар 2010, 02:09

Такой способ не выходит..

Файл "test.rc " создал:
Код: Выделить всё
echo 1 > "\\?\E:\Games\HLDS\Server\cstrike\test.rc "

Тут я ничего не накосячил же..
[pawn]#include <amxmodx>

#define PLUGIN "1"
#define VERSION "2"
#define AUTHOR "3"

public plugin_init()
    
register_plugin(PLUGINVERSIONAUTHOR)

public 
plugin_precache()
    
precache_generic("test.rc "[/pawn]

А уже при заходе на сервер:
Код: Выделить всё

Verifying and downloading resources...
Error: server failed to transmit file 'test.rc'


Кстати почему-то на этой стадии коннект к серверу и подвисал..
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Создание конфигов на клиенте

Сообщение Ser_UFL » 26 мар 2010, 21:49

Попробовал с символом Alt+0160 создать файл - не передается тоже, но если он передастся даже в неизменном виде, то такой не извлекается, как конфиг..
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3