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

(Неактуально) Использование возможностей motd_write

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

Модератор: Chuvi

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

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

(Неактуально) Использование возможностей motd_write

Сообщение DJ_WEST » 27 сен 2009, 23:08

Автор: DJ_WEST

Хочу рассказать Вам о моем способе использования клиентских возможностей для работы с MOTD файлом. Всего существует три команды:
  • motdfile - команда, указывающая какой MOTD файл отображается при соединении к серверу, то есть используется в основном для сервера. По умолчанию: motd.txt.
  • motd_write - команда, используемая для записи текстовой информации в MOTD файл, который указан в motdfile.
  • motd - команда, используемая для отображения содержимого MOTD файла, указанного в motdfile, в консоль клиента.

Для наших целей мы будем использовать только две первые команды, а именно motdfile и motd_write. Существует ряд ограничений при использовании данных команд:
  • Мы можем использовать файлы только в пределах папки мода, в нашем случае cstrike. Использовать вложенные каталоги в cstrike можно, а выйти на уровень выше - нет. Другими словами, мы можем использовать в качестве MOTD файлы из директории cstrike/models или cstrike/sprites, но не файлы, которые за пределами cstrike директории.
  • Мы не можем использовать для motd_write некоторые типы файлов, такие как: exe, dll, cfg, rc, com, bat (возможно и другие, я указал те, о которых мне известно).
  • Мы не можем записывать файл в директорию, которая не существует в cstrike на клиенте. Другими словами, если мы хотим записать файл в cstrike/test/test.txt и у игрока нет директории cstrike/test, то ничего не выйдет.
  • Записывая данные через motd_write в файл, который уже существует, мы удаляем его содержимое полностью, заменяя своими данными. Другими словами, дописать в файл информацию нельзя.
  • Через motd_write мы можем записать максимум 1012 байт информации.

Итак, получается, что мы можем записать через motd_write 1012 байт информации, но как записать информацию в несколько строк? Потому что новый абзац в motd_write считается концом, тем самым обрывается дальнейшая запись строки. Не беда, я расскажу, как можно записать информацию в несколько строк и что нам это даст в практическом использовании.

Прежде всего помните, что через motd_write можно нарушить целостность игры клиента: повредить bsp карту, повредить mdl модель, повредить liblist.gam или какие-то другие важные файлы игры. Поэтому используйте возможности данной команды на своем сервере на свой страх и риск. Вы должны понимать результат своих действий.

К примеру, выполняя данный код:
Код: Выделить всё
// Указываем файл, который будет использоваться (cstrike/models/amx-x.mdl)
client_cmd(id, "motdfile models/amx-x.mdl")
// Записываем текст Example в файл
client_cmd(id, "motd_write Example")
// Возвращаем значение команды motdfile по умолчанию
client_cmd(id, "motdfile motd.txt")
 

В результате у игрока в директории cstrike/models появится новый файл amx-x.mdl с содержимым Example. Ясно, что данная модель работать не будет и использовать мы ее не сможем. Потому что модели имеют сложное содержимое, которое даже свыше допустимых 1012 байт.

Сейчас попробуем разобраться, как записать в файл данные в несколько строк. Для удобства воспользуемся бесплатным текстовым редактором Notepad++. Чтобы видеть скрытые символы в тексте нужно в меню программы выбрать "Вид" - "Отображение символов" - "Все символы". Теперь открыв какой-нибудь текстовый файл мы увидем такие символы, как CR LF, которые означают новую строку.
  • LF: подача строки (ALT + 010)
  • CR: возврат каретки (ALT + 013)
Теперь если мы в файле будем считывать информацию, где содержатся символы CR LF и передавать данную информацию через client_cmd(id, motd_write ...), то запись оборвется, как будут найдены символы CR LF, то есть движок игры не разрешает выполнить то, что мы хотим. Но если мы будем вместо CR LF использовать только символ CR, то запись пройдет успешно и фактически редакторы будут понимать, что это новая строка, кроме обычного Notepad. Главное, что движок игры будет понимать, что это новая строка. Почему главное? Сейчас рассмотрим пример, как добавить опцию подключения к вашему серверу в меню игрока игры Counter-Strike 1.6!
За меню игры отвечает файл cstrike/resource/GameMenu.res.
По умолчанию он имеет такой вид (взято из Steam версии игры):
Код: Выделить всё

"GameMenu"
{
   "1"
   {
      "label" "#GameUI_GameMenu_ResumeGame"
      "command" "ResumeGame"
      "OnlyInGame" "1"
   }
   "2"
   {
      "label" "#GameUI_GameMenu_Disconnect"
      "command" "Disconnect"
      "OnlyInGame" "1"
      "notsingle" "1"
   }
   "4"
   {
      "label" "#GameUI_GameMenu_PlayerList"
      "command" "OpenPlayerListDialog"
      "OnlyInGame" "1"
      "notsingle" "1"
   }
   "8"
   {
      "label" ""
      "command" ""
      "OnlyInGame" "1"
   }
   "9"
   {
      "label" "#GameUI_GameMenu_NewGame"
      "command" "OpenCreateMultiplayerGameDialog"
   }
   "10"
   {
      "label" "#GameUI_GameMenu_FindServers"
      "command" "OpenServerBrowser"
   }
   "11"
   {
      "label" "#GameUI_GameMenu_Options"
      "command" "OpenOptionsDialog"
   }
   "12"
   {
      "label" "#GameUI_GameMenu_Quit"
      "command" "Quit"
   }
}

Если попытаться разобраться в нем, то:
  • label - это название опции, которое и будет отображаться в меню игры
  • command - команда, которая будет выполняться при нажатии данной опции меню. В данном случае эти команды понятны только движку игры, но если использовать в них engine, то это приведет к выполнению консольной команды игры, то есть тоже самое, что если игрок выполнит ее в консоли лично:
    command "engine connect 127.0.0.1:27015

    Нажатие опции с данной командой приведет к подключению клиента к серверу с адресом 127.0.0.1:27015.
  • OnlyInGame - если имеет значение 1, то означает, что опция будет видна меню, если игрок будет в игре.
  • notsingle - если значение 1, то опция видна только в multiplayer режиме, а Counter-Strike 1.6 имеет как раз такой режим.
Допустим у нас есть сервер с адресом 127.0.0.1:27015 и мы хотим, чтобы в меню игры у игроков была опция подключения к нашему серверу. Для этого мы редактируем GameMenu.res и получаем:
Код: Выделить всё

"GameMenu"
{
   "1"
   {
      "label" "Join to AMX-X.RU Server"
      "command" "engine connect 127.0.0.1:27015"
   }
   "2"
   {
      "label" ""
      "command" ""
   }
   "3"
   {
      "label" "#GameUI_GameMenu_ResumeGame"
      "command" "ResumeGame"
      "OnlyInGame" "1"
   }
   "4"
   {
      "label" "#GameUI_GameMenu_Disconnect"
      "command" "Disconnect"
      "OnlyInGame" "1"
      "notsingle" "1"
   }
   "5"
   {
      "label" "#GameUI_GameMenu_PlayerList"
      "command" "OpenPlayerListDialog"
      "OnlyInGame" "1"
      "notsingle" "1"
   }
   "6"
   {
      "label" ""
      "command" ""
      "OnlyInGame" "1"
   }
   "7"
   {
      "label" "#GameUI_GameMenu_NewGame"
      "command" "OpenCreateMultiplayerGameDialog"
   }
   "8"
   {
      "label" "#GameUI_GameMenu_FindServers"
      "command" "OpenServerBrowser"
   }
   "9"
   {
      "label" "#GameUI_GameMenu_Options"
      "command" "OpenOptionsDialog"
   }
   "10"
   {
      "label" "#GameUI_GameMenu_Quit"
      "command" "Quit"
   }
}

Теперь нам нужно, чтобы файл имеел правильное содержимое для его использовании в нашем плагине. Заменяем CR LF на CR. Чтобы вставить символ CR, зажимаем на клавиатуре ALT затем набираем 013. В конце файла оставляем CR LF, как конец. После всех изменений у меня получился файл размером 776 байт, что не превышает наш лимит (1012 байт). Сохраняем его, как gamemenu.txt, к примеру, и ложим в addons/amxmodx/configs.

[align=center]
gamemenu.jpg
[/align]

Теперь напишем плагин для чтения нашего gamemenu.txt и записи его игроку:
Код: Выделить всё
#include <amxmodx>

#define PLUGIN "Game Menu"
#define VERSION "1.0"
#define AUTHOR "DJ_WEST"

#define GAMEMENU_FILE "resource/GameMenu.res"
#define MAX_SIZE 1012

new g_Text[MAX_SIZE]

public plugin_init() 
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    
// Вызываем функцию Read_GameMenu для чтения нашего исправленного файла меню.
    set_task(0.1, "Read_GameMenu")
}

public Read_GameMenu()
{
    new i_File, s_File[128]
    
    
// Получаем путь к директории с конфигами AMXX в s_File.
    get_configsdir(s_File, charsmax(s_File))
    
    
// Формируем путь к gamemenu.txt файлу, используя путь к конфигам, и сохраняем в s_File.
    format(s_File, charsmax(s_File), "%s/gamemenu.txt", s_File)
    
    
// Открываем файл для чтения
    i_File = fopen(s_File, "r")
    
    
// Читаем содержимое файла в g_Text. Данная функция поддерживает чтение символов CR, LF.
    fgets(i_File, g_Text, MAX_SIZE)
    
    
// Закрываем файл
    fclose(i_File)
}

public client_putinserver(id)
{
    // Вызываем функцию Change_GameMenu
    set_task(3.0, "Change_GameMenu", id)
}

stock get_configsdir(s_Name[], i_Len)
{
    return get_localinfo("amxx_configsdir", s_Name, i_Len)
}

public Change_GameMenu(id)
{
    // Указываем путь к файлу resource/GameMenu.res
    client_cmd(id, "motdfile %s", GAMEMENU_FILE)
    
    
// Записываем в файл содержимое g_Text
    client_cmd(id, "motd_write %s", g_Text)
    
    
// Возвращаем значение команды по умолчанию
    client_cmd(id, "motdfile motd.txt")    
}
 

Изменения меню вступят в силу после перезапуска игры. Или выполнения команды _restart.
Помните, что данным способом вы стираете клиентский GameMenu.res файл, который может быть уже был изменен игроком по его предпочтениям и желанию.

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

Re: Использование возможностей motd_write

Сообщение stas_zui » 25 июн 2011, 00:01

скажу так.....у кого не выходит, тот просто лох..., ведь всё расписано, на блюдичке подано))
по секрету, а может уже кто то и догадался....что б вручную этого не делать (убирать lf) просто отредактируйте в ворде (я пользовался 2007, не знаю как на 2003...) сохраните в txt и выбирети вставлять разрывы только CR... быстро и эффективно.. ))
Аватара пользователя
stas_zui
 
Сообщения: 2
Зарегистрирован: 14 июн 2011, 16:45
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение ejik » 25 июн 2011, 15:55

что б вручную этого не делать (убирать lf) просто отредактируйте в ворде (я пользовался 2007, не знаю как на 2003...) сохраните в txt и выбирети вставлять разрывы только CR... быстро и эффективно.. ))

Notepad++ => Правка => EOL Конверсия=> Преобразовать в UNIX-формат => Сохранить
Аватара пользователя
ejik
 
Сообщения: 251
Зарегистрирован: 01 июл 2010, 14:07
Благодарил (а): 83 раз.
Поблагодарили: 83 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение Antikill3r » 13 июл 2011, 22:28

Им лень читать... :-|
Dance, Trance and Magic Plants!!!
From Ignorance it lead me to truth.
From darkness it lead me to light.
From death it lead me to immortality.
Аватара пользователя
Antikill3r
 
Сообщения: 6
Зарегистрирован: 30 июн 2011, 01:24
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение KLL » 17 июл 2011, 05:23

Тупость как надоело это... навязываете свои сервера да ещё и бинды изменяют, и остальные пункты все удоляют некоторые хитровыеб*******нные админы извените но у каждого для этого есть вкладка избранное и Собстаенное мнение! статья чушь в моральном плане...
Аватара пользователя
KLL
 
Сообщения: 41
Зарегистрирован: 25 сен 2010, 02:08
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike: Source

Re: Использование возможностей motd_write

Сообщение bart68rus » 18 окт 2011, 14:20

ребят, я вообще нечего не понял, помогите пожалуйста. Меня больше всего из этой статьи интересует лёгкий connect к серверу game menu
Аватара пользователя
bart68rus
 
Сообщения: 2
Зарегистрирован: 18 окт 2011, 13:16
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Использование возможностей motd_write

Сообщение mazdan » 18 окт 2011, 15:08

тебе ничем не помочь похоже =) Точнее даже не так =)
Я рад что тебя интересует что-то =) это похвально =)

Добавлено спустя 3 минуты 6 секунд:
KLL, ничего не поделать - уже везде так - ставь галку "только чтение" на конфиг и на меню. + имей бекапы =) или играй на нормальных серверах =) я вот не парюсь про геймменю =) долго что ли вернуть =) Гораздо хуже бывает когда что-то другое попортят - у меня например голосовые команды на каком-то галимом сервере поменяли на русские и у меня потом они не работали нигде вообще. Разбираться где починить было лень =)
я не пишу плагины на заказ!
Аватара пользователя
mazdan
 
Сообщения: 739
Зарегистрирован: 12 окт 2010, 14:44
Благодарил (а): 121 раз.
Поблагодарили: 211 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение nefik23 » 18 окт 2011, 16:36

Мде.. Бесит когда всякие нубы порят CS.
Есть вопрос, есть ChatBox.
Маленький блог помощи юзеру.
www.chatbox.do.am
Аватара пользователя
nefik23
 
Сообщения: 179
Зарегистрирован: 20 янв 2011, 19:20
Откуда: Из С.П.Б
Благодарил (а): 48 раз.
Поблагодарили: 24 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение Factor » 18 окт 2011, 19:37

mazdan писал(а):тебе ничем не помочь похоже =) Точнее даже не так =)
Я рад что тебя интересует что-то =) это похвально =)

Добавлено спустя 3 минуты 6 секунд:
KLL, ставь галку "только чтение" на конфиг и на меню.

developer on и всё :acute:
Аватара пользователя
Factor
 
Сообщения: 224
Зарегистрирован: 25 июн 2011, 15:14
Откуда: +4:00 GMT
Благодарил (а): 59 раз.
Поблагодарили: 10 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Использование возможностей motd_write

Сообщение Polarhigh » 19 окт 2011, 15:28

кстати в обновлении HLDS сентября этого года

Изменена команда motd_write, теперь она работает только если процесс запущен как активный сервер и используется только из консоли
Последний раз редактировалось Polarhigh 25 окт 2011, 17:24, всего редактировалось 1 раз.
Аватара пользователя
Polarhigh
 
Сообщения: 997
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 376 раз.

Re: Использование возможностей motd_write

Сообщение DJ_WEST » 25 окт 2011, 16:10

Вы должны зарегистрироваться, чтобы видеть ссылки.

На самом деле там еще много чего хорошего, к примеру:
prevented several client redirection exploits when connecting to a server

Наверное, Connect уже не работает :)

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

Пред.След.

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

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

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