DM Guide 8
Это 8 глава перевода оригинального руководства по Dream Maker от разработчиков.
Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.
Глава 8: Информационный объект world
Сон ли это?
Нет, но его отсутствие есть греза,
И то, что ты пустил под откос свою судьбу и промотал состояние - лишь греза,
Весь этот жалкий мир подобен сну.
— Уайт Вильман, Песнь Космополитана.
Вы уже встречали несколько типов объектов: существа (mob), предметы (obj), элементы ландшафта (turf), и зоны (area). Эти объекты материальны: они видны игрокам и открыты для взаимодействия. Существуют и другие типы объектов, которыми может манипулировать только программист. Чтобы их различать, мы используем два термина: материальное (atom) и информационное (datum). Материальное – это все физические предметы, из которых состоит мир, в то время как информационное – это неосязаемые объекты, которые несут информационный характер. DM предусматривает информационные объекты для информации об игроках, списках и сохраненных файлах. Вы также можете создавать ваши собственные объекты, чтобы управлять информацией, как вам удобнее. Эти вопросы мы будет обсуждать в следующих главах.
Объект world (мир) создается, когда вы запускаете сервер и уничтожается, когда он выключается. Глобальная переменная world содержит ссылку на этот объект. Все переменные и процедуры, принадлежащие ему, должны определяться под тегом /world. Изменяя их, вы влияете на всю игру в целом.
Переменные world
Существуют следующие переменные объекта world.
• name - название мира. По умолчанию, имеет значение, схожее с названием файла типа dmb.
• mob - тип существа, которое создается для новых игроков. По умолчанию это /mob.
• turf - основной тип ландшафта, который будет установлен там, где другого типа не предусмотрено. По умолчанию это /turf.
• area - тип территории, которая будет размечена там, где другой территории не предусмотрено. По умолчанию /area.
• maxx, maxy, maxz - обозначают размеры карты. Обычно вам не нужно их устанавливать в коде, потому что редактор карты это делает автоматически. Однако если вы хотите карту полностью из основных типов ландшафта и территории, то можете указать ее размеры тут. Каждая переменная по умолчанию стоит на нуле, если нет карты, но если вы установите одну из них, то остальные автоматически изменятся на 1. То есть, если вы установите maxx и maxy без maxz, то получите карту с одним уровнем.
• view - максимальная дальность обзора. По умолчанию устанавливается на 5, что дает вам обзор карты 11 на 11. Максимальное значение: 10 тайлов, так ваш обзор будет 21 на 21. Вы узнаете об этом больше в 14 главе.
• contents - список всех объектов, которые существуют в мире (mobs, objs, turfs и areas).
• log - основное его назначение заключается в выводе ошибок. Текст выводится в программе сервера. Если вы запускаете мир внутри клиента (локальный сервер), то текст будет отображаться в клиенте. Все внутренние ошибки выводятся в файл world.log.
• params - список параметров, заданных пользователем. Он требуется при запуске сервера. Больше вы узнаете в главе 10.9.
• realtime - время в десятичных секунд, начиная с 00:00:00 GMT 1 января, 2000 года (также известна, как время BYOND). В основном используется, когда вам нужно записать время какого-то события, например, выхода пользователя.
• time - время в десятичных секунд с момента старта сервера (также известная как игровое время). Если сервер спит, а подключенных игроков нет, то это время не отсчитывается.
• sleep_offline - если эта переменная установлена на 1, то сервер зависнет, пока на нем нет игроков. Значение по умолчанию: 0, что значит, что сервер зависнет, только если на нем ничего не происходит. Используйте эту переменную, если не хотите, чтобы NPCы набедокурили, пока игроки отдыхают.
• tick_lag - контролирует время от первого момента до другого. Эта малозначимая переменная времени, которая тоже измеряется в десятичных секунд. Значение по умолчанию: 1, что значит, что все события в мире происходят с задержкой в 0.1 секунды. Чем меньше это значение, тем быстрее будет идти игра, тем быстрее игроки смогут выдавать команды, но за это вы платите сильной загрузкой процессора. Если значение будет очень большим, то это сделает игру медленной. Больше мы вам расскажем в 13 главе.
• cpu - это процент от времени, который сервер затратил на запуск мира. Обычно это значение близко к нулю, что означает, что сервер успевает выполнять все действия. Значение выше 100 показывает вам, что сервер не может выполнить все действия за требуемое количество времени (определяется с помощью tick_lag). Обычно, вам не нужно проверять переменную cpu,ведь вы итак все поймете, когда сервер начнет тормозить (убедитесь, что проблема не в интернет-соединении).
• address - интернет-адрес машины, которая содержит сервер или null, если он не может быть установлен.
• port - порт сервера или 0, если у него нет открытых портов. Полный адрес сервера состоит из комбинации адреса и порта: "[address]:[port]".
Действия world
Разнообразные действия мира (world procs) помогают контролировать сервер и позволяют вам влиять на него. Они описываются в следующих секциях.
New и Del
Как и все объекты данных, у world есть действия New и Del, которые отвечают за создание и уничтожение мира. У них нет аргументов. New вызывает инициализацию глобальных переменных и создает карту со всем ее содержимым, в то время как Del вызывает уничтожение карты и всех объектов.
Вы можете их использовать, чтобы запускать мир по время загрузки и очистки при выключении. Одна из типичных задач: запись и чтение информации о состоянии мира, об этом вы узнаете в главе 12.
world New() world.log << "[name] started at [realtime]." ..() Del() world.log << "[name] shutdown at [realtime]." ..()
В этом примере информация выведется в файл world.log. Может так случится, что никто из игроков не подключен в момент запуска, так вы сможете это отследить.
Действие Repop
Действие Repop перезагружает карту. Все объекты (включая существа) будут уничтожены, после чего заново загрузится карта. Простой пример, который позволит существам перезагружать мир
mob/DM verb/repop() world.Repop()
Если вы хотите, чтобы какой-то предмет не удалился, он должен быть динамичным (создан с использованием new), вместо того, чтобы задавать его через редактор карты. В противном случае, вы можете переместить его в нулевую точку. Действием Repop удалены будут только те предметы, которые созданы с помощью редактора карты.
Во многих случаях вам потребуется автоматически вызывать Repop. Мы поговорим об этом в 13 главе, когда будем обсуждать планирование событий.
Действие Reboot
Действие Reboot позволяет вам пересоздать мир с нуля. Все подключенные игроки автоматически перезайдут после загрузки.
Вам потребуется перезапускать сервер, если вы обновили файл dmb. Эта простая команда заставляет DM вызвать перезагрузку.
mob/DM verb/reboot() world.Reboot()
Если вы хотите сохранить состояние сервера, то вам потребуется переопределить действие Reboot. То есть сначала вам нужно будет сохранить информацию, а потом вызывать родительское действие для перезапуска сервера.
Связь между мирами
Два мира могут находиться в связи друг с другом, что позволяет им взаимодействовать. Так можно создать огромные миры, работающие на нескольких, связанных машинах. Это большая тема, достойная отдельной главы, но здесь краткое введение во все возможные действия, чтобы дать вам полную информацию о мире, как объекте данных. Завершение этой темы вы можете найти в 12.6.
Действие Topic
Действие Topic создано для получения информации из другого мира. Когда миры общаются, должна быть выбрана тема – отсюда и название действия. Обычно таким под этим действием сразу отправляется все сообщение, но позже вы узнаете как отправить больше информации.
Topic(Topic,Addr,Master) Topic – строка текста, темы. Addr – адрес удаленного мира. Master – true, если отправитель является родителем адресанта. Полученное значение вернется назад в удаленный мир.
Возвращаемое функцией значение отправляется в удаленный мир. Таким образом, можно отправлять простые обращения и получать назад ответ. Давайте зададим простой вопрос “Ты там?”. Вот как это можно сделать.
world/Topic(Topic) if(Topic == "ping") return 1 ..()
На самом деле тема ping встроена в действие Topic по умолчанию. Разница лишь в том, что она возвращает точное количество игроков. Причина того, что мы хотим получить ответ, заключается в том, что если мы ошиблись и сервера нет, то в ответ получим ноль.
Действие Export
Действие Export используется, чтобы отправлять сообщение в другой мир. Оно может использоваться для отправки файла, а также может получить доступ к topic. Это действие возвращает другое значение от мира, который его получил. Если сообщение не может быть отправлено, то возвращается ноль.
Export(Addr,File) Addr – адрес и тема. File – файл, который нужно отправить. Возвращает результат удаленной Topic()
Формат адреса: ip:port#topic. Вот пример использования темы ping из предыдущей части.
mob/DM/verb/ping() var/p = world.Export("dantom.com:6000#ping") usr << "Ping returned '[p]'."
Действие Import
Действие Import используется, чтобы получить файл, который был отправлен другим миром с помощью Export.
Import() Возвращает загруженный файл
Это действие используется в основном чтобы сохранять файл и будет рассматриваться в главе 12.6. Однако, вы также можете его использовать, чтобы отправлять файлы. Следующий пример показывает, как можно задать topic и проиграть звуковую запись для всех игроков в мире.
world/Topic(Topic) if(Topic == "sound") world << Import()
Не плохо, для несколько строк кода! Конечно, почему бы вам не использовать это и в других вопросах.