Изменения

18 029 байт добавлено ,  01:12, 13 декабря 2016
м
Откат правок ZLOFENIХ (обсуждение) к версии Michael Shepard
Строка 1: Строка 1:  +
''Это 17-ая глава перевода оригинального руководства по Dream Maker от разработчиков.''
    +
[[All_about_the_code|Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.]]
    +
[http://www.byond.com/docs/guide/chap17.html Оригинальная 17-ая глава руководства на английском языке]
   −
[[Файл:LtJ6KqW6mKk.jpg|LtJ6KqW6mKk.jpg]]
+
==Глава 17: Контроль сервера и системы==
[https://www.youtube.com/watch?v=wqpseZS3mD0 Конец прекрасной эпохи. Мы еще увидимся, я обещаю!]
+
 
 +
All creatures pass into My nature at the end of a cycle and are reborn at the beginning of creation.
 +
 
 +
--Bhagavat Gita
 +
 
 +
Все ранее рассмотренные аспекты DM представляли собой операции, выполняемые в изолированной области игрового мира. В этой главе рассматриваются команды, позволяющие взаимодействовать с остальной  частью компьютера, включая доступ к файлам, программам и другим мирам BYOND’а.
 +
 
 +
===Замечание о платформо-независимости===
 +
 
 +
Программисты называют ''платформой'' операционную систему, запущенную на компьютере. На данный момент, BYOND может быть запущен на операционных системах Microsoft Windows и UNIX. Версии для других ОС находятся в разработке.
 +
 
 +
Когда возможно, лучше писать т.н. ''платформо-независимые'' программы, это означает, что программа будет работать одинаково на разных системах. Язык DM практически гарантирует это, предоставляя синтаксис, как можно меньше опирающийся на особенности внешней вычислительной среды. Фактически, BYOND во многих случая ведет себя как виртуальная операционная система, изолируя ваш код от реальной операционной системы, и тем самым обеспечивает одинаковую среду независимо от машины, на которой он запущен.
 +
 
 +
Однако когда возникает задача получения доступа к файлам или другим программам компьютера, зависимость от платформы становится необходимой. Например, названия файлов в UNIX регистрозависимы, в то время как в Windows наоборот. Это означает, что при указании имени файла в Windows вы можете обойтись любой комбинацией строчных и прописных букв, в то время как тот же код, запущенный под UNIX сработает только при полном совпадении регистра в имени файла. Поэтому хорошей привычкой будет, по крайней мере, быть последовательным и использовать одинаковый регистр во всем вашем коде, когда ссылаешься на один файл.
 +
 
 +
Пути к фалам соответствуют текущей директории (если не задан полный путь). Текущей всегда является директория, в которой расположен .dmb файл мира. В UNIX системах в пути после каждой поддиректории ставится знак / . Обычно в Windows для этой цели используется знак \ , однако, DM позволяет использовать вместо него / . Это удобнее, потому, что так он не рассматривается как спецсимвол в текстовой строке.
 +
 
 +
===shell===
 +
 
 +
''shell'' передает команду операционной системе. Интерпретатор команд часто называют shell - отсюда и название для этой инструкции. Это спящая операция, которая возвращает значение после ее окончания.
 +
 
 +
{| border="0"
 +
|-
 +
| shell
 +
| (Cmd)
 +
|-
 +
|
 +
| Cmd – текст команды.
 +
|-
 +
|
 +
| Возвращает статус завершения команды.
 +
|}
 +
 
 +
Синтаксис команды, очевидно, полностью зависит от операционной системы. Как правило, она состоит из имени программы и следующего за ним ряда аргументов. Если команда создает вывод (output) или ожидает ввода (input), вам нужно перенаправить ввод и вывод в файлы, что в UNIX и Windows делается при помощи операторов < и > .
 +
 
 +
В нижеследующем примере запускается команда "dir" и выводится результат.
 +
 
 +
mob/verb/list_files()
 +
    shell("dir > dir.txt")
 +
    usr << browse("dir.txt")
 +
 
 +
===Операции с файлами===
 +
 
 +
==== file2text====
 +
 
 +
''file2text'' считывает файл в текстовую строку. Может быть использована в разных целях, включая доступ к выводу команды ''shell()''.
 +
 
 +
{| border="0"
 +
|-
 +
| file2text
 +
| (File)
 +
|-
 +
|
 +
| File – имя файла.
 +
|-
 +
|
 +
| Возвращает содержимое файла в виде текстовой строки.
 +
|}
 +
 
 +
====text2file====
 +
 
 +
''text2file'' дополняет ''file2text''. Она добавляет текстовую строку в файл. Если файл не существует, он будет создан.
 +
 
 +
{| border="0"
 +
|-
 +
| text2file
 +
| (Txt,File)
 +
|-
 +
|
 +
| Txt – текстовая переменная.
 +
|-
 +
|
 +
| File – файл, в который ее нужно добавить.
 +
|}
 +
 
 +
====file====
 +
''file'' возвращает ссылку на файл. В основном эта инструкция применяется с операторами ввода/вывода. Вывод файла игроку был обсужден [[DM_Guide_11|в главе 11]]. Кроме того, можно отправлять вывод в файл или получать ввод из файла.
 +
 
 +
{| border="0"
 +
|-
 +
| file
 +
| (Path)
 +
|-
 +
|
 +
| Path – полный путь или имя файла.
 +
|-
 +
|
 +
| Возвращает ссылку на файл.
 +
|}
 +
 
 +
Использование файла в качестве цели для оператора вывода << имеет тот же эффект, как вызов ''text2file ()''.Выходное значение добавляется в файл. Аналогично, чтение данных из файла при помощи оператора >> то же самое, что и ''file2 TXT ()''. Файл загружается в текстовую строку и хранится как указанная переменная.
 +
 
 +
{| border="0"
 +
|-
 +
| File << Output
 +
|-
 +
| File >> Переменная
 +
|}
 +
 
 +
====fcopy====
 +
 
 +
''fcopy'' копирует один файл в другой. Источник может быть действительным внешним файлом или взят из кэша. Если файл уже существует, то он будет заменен.
 +
 
 +
{| border="0"
 +
|-
 +
| fcopy
 +
| (Source,Dest)
 +
|-
 +
|
 +
| Source – копируемый файл.
 +
|-
 +
|
 +
| Dest – файл, в который он будет скопирован.
 +
|-
 +
|
 +
| Возвращает 1 в случае успеха и 0 в случае ошибки.
 +
|}
 +
 
 +
====fdel====
 +
 
 +
''fdel'' удалает файл из файловой системы.
 +
 
 +
{| border="0"
 +
|-
 +
| fdel
 +
| (File)
 +
|-
 +
|
 +
| File – имя файла.
 +
|-
 +
|
 +
| Возвращает 1 в случае успеха и 0 в случае ошибки.
 +
|}
 +
 
 +
Он работает со всеми директориями (так что будьте осторожны, ради бога). В качестве меры предосторожности, он принимает только имена директорий, заканчивающиеся косой чертой "/".
 +
 
 +
====flist====
 +
 
 +
''flist'' создает список файлов, расположенных в заданной директории, имена которых начинаются с указанных знаков.
 +
 
 +
{| border="0"
 +
|-
 +
| flist
 +
| (Path)
 +
|-
 +
|
 +
| Path – путь до директории, список файлов в которой вы хотите получить.
 +
|-
 +
|
 +
| Возвращает список файлов и папок.
 +
|}
 +
 
 +
Будет приведен только список файлов и папок, находящихся по указанному адресу (т.е. содержимого этих папок в списке не будет). Имена файлов в списке не включают в себя информацию о пути, только имя файла. Папки в списке определяются по символу "/" добавленному к имени.
 +
Путь задается в формате "dir1/dir2/.../file". В списке будут приведены только файлы с именами, совпадающими с "file", так что не забудьте добавить "/" в конце пути, если вы хотите увидеть его содержимое. В противном случае, все, что вы получите, это имя каталога со знаком "/".
 +
 
 +
===Запуская другие Миры===
 +
 
 +
Иногда желательно одному главному миру запускать дочерние миры. Например, у вас может быть основной мир с сайдквестами (подземелья и т.д.), располагающимися в отдельных подмирах. Это может оказаться лучшей оптимизацией, так как редко используемые участки можно активировать только при необходимости.
 +
 
 +
Предельной формой использования этого метода является сервис хостинга миров, который позволяет пользователям загружать свои собственные файлы мира. Которые затем запускаются и выключаются по мере доступа к ним игроков. Если у вас нет собственного выделенного сетевого соединения, вы можете воспользоваться таким сервисом для хостинга ваших миров.
 +
 
 +
====startup====
 +
 
 +
''startup'' запускает другой мир. Эта инструкция спит пока не будет определен сетевой адрес нового мира.
 +
 
 +
{| border="0"
 +
|-
 +
| startup
 +
| (File,Port=0,Options,...)
 +
|-
 +
|
 +
| File – .dmb файл, который необходимо запустить.
 +
|-
 +
|
 +
| Port – используемый сетевой порт.
 +
|-
 +
|
 +
| Options включает в себя дополнительные параметры запуска.
 +
|-
 +
|
 +
| Возвращает сетевой адрес нового мира.
 +
|}
 +
 
 +
Сетевой адрес мира состоит из двух частей. Первая, IP адрес машины, на которой он запущен. Вторая, номер порта. Он записывается в текстовую строку вида "ip:port". Указанный порт не должен использоваться любыми другими программами. Стандартное значение – 0 – означает, что может быть использован любой доступный порт.
 +
 
 +
Дополнительные параметры, которые могут быть указаны, описаны в нижеследующем списке.
 +
 
 +
*'''-once''' Эта опция автоматически выключает сервер, когда все игроки отключатся.
 +
 
 +
*'''-log''' Эта опция требует наличие дополнительного аргумента, который используется для файла вывода сервера. Все отладочные заметки (от крашей действий proc) и весь вывод, записываемый в world.log, будет добавляться в этот файл. Путь до этого файла соответствует рабочей директории сервера, которая расположена в папке с .dmb файлом.
 +
 
 +
*'''-safe''' Эта опция запускает мир в специальном защищенном режиме. Код мира сможет иметь доступ только к файлам в той же директории (и поддиректориях), в которой находится .dmb, а доступ к инструкции ''shell'' запрещен. Это стандартный режим, если мир запускается из его собственной безопасной директории. Такая директория распознается, когда она имеет то же имя, что и .dmb файл мира.
 +
 
 +
*'''-ultrasafe''' Эта опция аналогична ''-safe'', за исключением того что разрешает доступ только к временным файлам. Это стандартный режим, если мир не запускается из его собственной безопасной директории.
 +
 
 +
*'''-trusted''' В этом моде все операции разрешены. Мир может получать доступ к файлам в любых каталогах и командам ''shell''. Конечно, операционная система может налагать ограничения, но BYOND будет разрешать миру всё.
 +
 
 +
*'''-params''' Данный аргумент интерпретируется как строка параметра, что уже было описано в [[DM_Guide_10|10-ой главе]]. Переменная ''world.params'' инициализируется из этих данных. Вы можете использовать ''params'' несколько раз; отдельные строки параметров, просто объединяются для формирования окончательного результата.
 +
 
 +
*'''-quiet''' Это просто отключает информационный вывод, который сервер обычно отображает при загрузке.
 +
 
 +
====Контроль Дочерних Миров====
 +
 
 +
Связь с дочерним миром может быть осуществлена с помощью ''world.Export ()''. В этом случае, процедура ''world.Topic()'' вызывается со специальным флагом, чтобы указать, что сообщение пришло из мира, который его запустил. (см. [[DM_Guide_8 | 8-ую главу]]) По умолчанию, дочерний мир будет реагировать на спецальные команды "Del" и "Reboot" вызовом ''world.Del ()'' и ''world.Reboot ()'' соответственно. Это происходит только если приходит сообщение от главного мира, так как в противном случае кто угодно может отправить сообщение и прекратить работу вашего мира.
 +
 
 +
Есть еще одна полезная команда "ping", которая может быть использована для определения, работает ли еще дочерний мир.
 +
 
 +
====shutdown====
 +
 
 +
''shutdown'' Инструкция может быть использована, чтобы закрыть дочерний мир или подождать, пока он закроется нормально.
 +
 
 +
{| border="0"
 +
|-
 +
| shutdown
 +
| (Address,Natural=0)
 +
|-
 +
|
 +
| Address – сетевой адрес мира.
 +
|-
 +
|
 +
| Natural - для предотвращения отправки сообщения "Del" должно быть равно 1.
 +
|-
 +
|
 +
| Возращает статус закрытия мира.
 +
|}
 +
 
 +
Address должен быть строкой, возвращаемой инструкцией ''startup()''. Если второй аргумент опущен или равен нулю, то это эквивалентно вызову ''world.Export ()'' с данным адресом и "Del" в качестве команды. В противном случае, эта инструкция просто ждет, когда дочерний мир закроется самостоятельно.
 +
 
 +
Вовсе без аргументов эта инструкция вызывает закрытие текущего мира. То же самое может быть достигнуто вызовом ''world.Del ()''.
1059

правок