В предыдущих статьях цикла был сделан общий обзор языка программирования Rust, обсуждались основы синтаксиса: были описаны простейшие компоненты (переменные, простые типы данных, операторы и расширения), управляющие конструкции и составные структуры данных, функции и деструкторы. Особое внимание было уделено модели памяти в целом, концепции владения объектами, общим принципам управления памятью, использованию собственных и управляемых блоков общей памяти, а также заимствованных указателей. В данной статье рассматриваются средства ввода/вывода языка Rust.
В любом языке программирования подсистема ввода/вывода является важной составной частью. Некоторые простейшие средства работы со стандартным потоком вывода уже использовались в предыдущих статьях (print , println). Эти функции интуитивно понятны, и не вызывают каких-либо затруднений в процессе их применения. Поэтому сейчас речь пойдёт главным образом о средствах приёма данных, вводимых пользователем и об инструментах работы с файлами.
В Rust все средства ввода/вывода собраны в модуле io .
В трэйтах (trait) Reader и Writer определён
минимальный набор самых простых методов ввода и вывода. Трэйты
ReaderUtil и WriterUtil предлагают более широкий
выбор методов, предоставляющих пользователю расширенные возможности
управления вводом и выводом. Например, Reader позволяет лишь
считывать заданное количество байтов в буфер, в то время как в
ReaderUtil предлагаются методы считывания целой строки,
нескольких строк, числовых значений и т.д. Кроме того, имеется реализация
(implementation) ReaderUtil для
Трэйт (trait) описывает набор методов, которые могут быть применены к определённому типу или к нескольким типам. Более подробно трэйты будут рассматриваться в следующих статьях данного цикла.
Как уже было сказано выше, наиболее часто используемые функции print() и println() также определены в модуле io , но их явное импортирование в большинстве случаев не требуется, так как об этом уже позаботилась система компиляции и связывания.
Кроме того, здесь же определяются весьма полезные функции stdin() , stdout() и stderr() , возвращающие указатели на три стандартных дескриптора файлов: стандартный ввод, стандартный вывод и стандартный поток ошибок соответственно.
В любом случае самым простым способом получения данных от пользователя является использование функции stdin() , создающей указатель на объект @Reader , что позволяет считывать данные из потока стандартного ввода (аналогичные функции существуют и для стандартного потока вывода - stdout() , а также для стандартного потока ошибок - stderr()). После создания указателя @Reader можно воспользоваться функцией read_line() для чтения строки, вводимой пользователем, как показано в листинге 1.
В трэйте ReaderUtil помимо простых функций чтения байтов и одиночных строк также определён богатый набор инструментов для считывания данных при различных условиях: считывание байтов до тех пор, пока не встретится признак конца файла - read_until() , считывание строки, записанной в C-стиле (с нулевым завершающим символом), - read_c_str() , считывание всего потока данных целиком - read_whole_stream() , считывание всех строк из потока данных - read_lines() , а также большой набор функций, позволяющих считывать числовые значения, как целые, так и с плавающей точкой.
Все необходимые инструменты для работы с файлами также располагаются в модуле std::io . Прежде всего следует обратить внимание на следующие функции:
fn FILE_reader(f: *libc::FILE, cleanup: bool) -> @Reader fn FILE_writer(f: *libc::FILE, cleanup: bool) -> @Writer fn file_reader(path: &Path) -> Result<@Reader, ~str> fn file_writer(path: &Path, flags: &) -> Result<@Writer, ~str> fn mk_file_writer(path: &Path, flags: &) -> Result<@Writer, ~str>Варианты FILE_* читают и записывают файлы в C-стиле, тогда как варианты file_* предназначены для использования именно в стиле Rust. Поскольку первые две функции очевидно исполняют роль вспомогательных инструментов для специфических задач, а кроме того всё-таки рассматривается именно язык Rust, предпочтение следует отдать Rust-стилю. Поэтому далее рассматриваться будут только функции file_reader и file_writer . Обе функции в качестве первого параметра принимают путь к файлу, имеющий тип ~str , и обе возвращают значение типа Result . Таким образом, чтобы понять операции файлового ввода/вывода в Rust, необходимо также правильно понимать и оценивать тип Result .
Этот тип служит в Rust средством, позволяющим избежать ошибок времени выполнения. Result - это перечисление, содержащее следующие значения (см. src/libstd/result.rs ):
pub enum ResultЗначения типа Result обязательно должны быть распакованы (деструктуризованы) перед их использованием.
В примере программы будет использоваться следующая функция из модуля std::result :
fn unwrapЕсли получен результат Ok(T) , то функция возвращает значение T , извлечённое из Ok(T) , которое может использоваться далее в программе.
Разумеется, этой функцией набор инструментария библиотеки std::result не ограничивается. Описания других функций можно найти в указанной выше документации.
Исходный код примера приведён в листинге 2. В примере просто считываются байты из заданного файла, затем результат чтения преобразовывается в строку и выполняется сравнение с образцом. Предполагается, что сама программа и тестовый файл read.txt , из которого считываются данные, находятся в одном и том же каталоге.
В приведённом выше примере тестовая функция is_success() создаёт объект test_reader , используя переданный ей путь к файлу. Для большей наглядности содержимое файла считывается по одному байту за раз, и считанный байт добавляется в вектор bytes . Байты считываются как целые значения типа int , но при вставке очередного байта в вектор ожидается значение типа u8 . Поэтому для каждого вставляемого байта выполняется явное преобразование as u8 . Эти операции продолжаются до тех пор, пока при считывании не встретится конец файла (end of file).
Метод reader.eof() возвращает true , когда текущий считанный байт содержит признак eof . В этом случае значение этого байта равно -1 (именно это является причиной того, что reader.read_byte() возвращает int , а не u8), и его не нужно добавлять в вектор. Проверяется условие, и если обнаружен EOF , то происходит выход из цикла.
Проверка правильности результата считывания основывается на том факте, что считанные байты представляют собой ASCII-значения (следовательно, совпадают с соответствующей частью кодировки UTF8), то есть, символы, составляющие слово "success".
При рассмотрении кода в листинге 2 может возникнуть резонный вопрос: почему выполняется выход из цикла с помощью проверки на eof в теле цикла, а не используется более распространённая проверка условия перед очередной итерацией? Причина в том, как работает reader.eof() . При использовании цикла while с проверкой на eof в условном выражении EOF-байт с значением -1 (255u8) добавляется в целевой вектор. Поэтому при использовании while приходится "выталкивать" самое последнее значение из вектора, как показано в листинге 3.
Разумеется, и такой вариант обработки данных имеет право на существование.
В языке Rust практически все средства ввода/вывода сконцентрированы в модуле std::io . Для каждого элементарного типа данных предусмотрены инструменты его считывания и представления при выводе. Основными компонентами модуля std::io являются трэйты Reader , Writer , ReaderUtil и WriterUtil , предоставляющие все необходимые возможности управления вводом и выводом данных.
Оптимизация игры Rust просто «никчемная», что создает некие трудности во время игрового процесса для некоторых юзеров. В некоторых случаях даже мощный компьютер не в силах справиться со своими прямыми обязанностями, а именно обеспечить отличную картинку без лагов в интерфейсе «ржавчины». Конечно же, благодаря некоторым манипуляциям можно слегка повысить fps в игре, но сделать это получается лучше всего посредством ввода в консольную строку различного рода команд, отключающих специфические эффекты. Но как вы это себе представляете? Каждый раз во время подсоединения к серверу вбивать в консоль около 30 команд – это сколько же времени будет потрачено впустую… Но выход есть и это – файл конфиг для Rust, в который можно вписать все эти команды, а его просто вложить в специальную директорию.
Но где же взять этот cfg для Rust? На самом деле есть два способа его заполучить. Вы можете поступить следующим образом...
1. Зайти в корневой каталог игры.
2. Отыскать там папку CFG.
3. В ней найти два файла: client.cfg и config.cfg.
4. Если их нет, то просто нужно создать новые и соответствующе их назвать.
5. Вписать сюда соответствующие команды для , теней, ветра и так далее.
А можно сделать и по-другому.
1. Вы можете скачать конфиг для Rust уже в готовом виде (со всеми нужными командами) прямо с нашего сайта, по этой .
2. Скопировать два файла, находящиеся в архиве в соответствующий каталог (указан в первом способе).
3. Если там уже имеются эти файлы, то копируем с заменой, если нет – то просто вставляем.
По сути, неважно, по какому именно пути вы пойдете. После этого остается лишь:
Зайти в игру
Кликнуть по вкладке «Options»
Убрать отметки с «Water Reflectins» и «VSync»
И полностью оттянуть ползунок «Render Quality» влево
Нужно отметить, что на конфиг для Rust влияет очень положительно, можно даже сказать, что конфиг в Rust (конечно же, правильно настроенный) принесет намного больше пользы, чем дополнительные 512 Мб видеопамяти.
Итак, на сайте есть замечательное по сети. Но в нем запуску и настройке сервера уделено всего пару строчек.
Постараюсь помочь пользователям, которые хотели бы поиграть на своем локальном сервере
с друзьями и с собственными настройками. В этой небольшой статье я постараюсь показать весь процесс: от установки сервера до его настройки, в том числе с помощью модов.
1. Первое, что нам потребуется - это перейти на запуска Rust по сети и скачать архив, содержащий все необходимые инструменты, и распаковать в любое место.
2. Теперь переходим к установке . Запускаем файл Update-Rust-Server.bat из папки SteamCMD и ждём пока наш сервер скачивается. Серверы будут загружаться в папку RustServer.
Всё, мы установили сервер, переходим к следующим шагам.
3. Теперь мы будем запускать сервер , настраивать его и приглашать друзей. Для того, чтобы подключиться к созданному серверу, выполняем следующие шаги:
Идем в папку SteamCMD
и запускаем файл Run-Rust-Server.bat
(Именно его, а не Rust_server). Для запуска экспериментального сервера Rust запускаем файл Run-Rust-Exp-Server.bat
- После запуска в командной строке будут идти строчки с сведениями о загрузке, ждем момента, когда появится надпись "server initialized".
- Все, сервер работает.
- Теперь, чтобы зайти на сервер нам необходимо узнать адрес своего сервера. Классический вариант -
- Записываем свой ip куда-нибудь в текстовый файл (чтобы не забыть).
- Далее запускаем игру и жмем клавишу F1 (консоль) и вписываем туда команду net.connect Ваш ip:28015 (где Ваш ip - это ваш ip, который вы узнали заранее). По идее это должен быть и 127.0.0.1.
Если все сделано правильно, вы подключитесь к вашему серверу. Чтобы друзья смогли подключиться к вам, нужно, конечно, чтобы сервер был запущен на вашем компьютере, и чтобы ваши друзья правильно ввели команду подключения, которую Вы им скажете.
Теперь можно приступать к игре. НО! Правильность выполнения всех действий в некоторых случаях не может гарантировать Вам успех. Так как причин, по которым у Вас может не получиться, великое множество. О решении наиболее распространенных проблем написано в .
4.
Ну, и теперь, если у Вас все получилось, и Вам понравилось, можно поиграться с настройками сервера
.
К примеру, в последнем обновлении разработчики добавили такую интересную вещь как износ оружия (сразу вспомнилась серия Dead island), а также износ одежды и инвентаря.
Многих это не устроило, и вот есть возможность отключить эту функцию.
Для этого надо:
> Залогиниться на сервере под правами админа. Для этого в игре открываем консоль клавишей F1 и вписываем команду Rcon.login ваш пароль (Ваш пароль задается в файле server.cfg и по умолчанию имеет вид 123456). После ввода должна появиться надпись (в консоли) "logged as admin",
которая означает что Вы вошли как админ. Теперь вписываем команды:
- Для отключения износа одежды: conditionloss.armorhealthmult "0.0"
- Для отключения износа оружия/инвентаря: conditionloss.damagemultiplier "0.0"
С помощью различных модов также можно отключить или включить разные вещи. К примеру, отключить распад на сервере или настроить интервал пролета самолётиков. В сети уже есть как доступные, так и не очень доступные моды. Я рекомендую воспользоваться свободно распространяемым модом Magma, из-за его легкости в настройке и большого количества плагинов.
В этой теме я расскажу, как создать свой сервер Rust Experimental с модами. Зачем это надо? Ну, как минимум, если вы играете в Раст, то у вас появляется множество идей, которые гораздо удобней тестить на своем сервере с бесконечными ресурсами и возможностью летать. А если пойти дальше, то вы cможете сделать свой сервер популярным и получать реальные деньги за продажу игровых плюшек игрокам своего сервера.
Итак, приступим.
Часть первая - Создание сервера.
1. Скачать архив Rust_server.zip с официального сайта по этой
2. Распаковать архив в удобную вам папку. Например, вот в эту: C:\Games\Rust_Server\Server
Далее я буду приводить примеры адреса с этой папкой.
3. Зайти в папку C:\Games\Rust_Server\Server и запустить файл update.bat
Откроется черное окошко с командной строкой и в нем пойдет закачка файлов сервера, размер около 2,15 Гб. По окончании загрузки окошко закроется автоматически.
4. Зайти в папку C:\Games\Rust_Server\Server\rustds
Создать текстовый документ в блокноте, скопировать внутрь вот этот текст:
RustDedicated.exe -batchmode -server.hostname "My Server" -server.port 28015 -server.identity Hello_World -server.maxplayers 5 -server.seed 777 -server.worldsize 4000 -chat.serverlog 1 -server.netlog 1 -server.saveinterval 300 -spawn.max_rate 1 -spawn.max_density 1
Далее в блокноте нажимаем "Сохранить как..." и сохраняем файл с именем "start server.bat" расширение "Все файлы".
Появившийся файлик "start server.bat" и есть пусковый файл для вашего сервера. При нажатии на него откроется снова черное окошко командной строки и пойдет создание карты и запуск сервера. О том, что сервер готов к работе, можно узнать, глядя на счетчик фпс справа-внизу окошка: при загрузке он будет показывать 0 fps, а после окончания появится цифровое значение, например у меня это 262 fps.
5. Далее нужно узнать свой внешний IP-адрес.
Допустим, вы зашли на один из сервисом определения IP адреса, и ваш адрес оказался 213.180.193.11
Открываем Rust и жмем кнопку F1, в открывшейся консоли вводим команду client.connect 213.180.193.11:28015
Если все сделано верно, то пойдет подключение и вы окажетесь на своем собственном сервере
P.S.: Папка с файлами вашего сервера (сейв и тд) будет находиться по адресу C:\Games\Rust_Server\Server\rustds\server\Hello_World
Часть вторая: Админка
1. Чтобы сделать себя (или друга) админом на своем сервере, вам сперва нужно узнать свой стим-айди. Для этого заходим в свой профиль в стиме и на любом свободном месте - например, слева от своей аватарки, нажимаем правой кнопкой мышки и выбираем "Скопировать адрес страницы". Вставляем этот адрес куда угодно, например в блокнот или в браузер. Появится что-то вроде }