DM Guide 9
Это 9 глава перевода оригинального руководства по Dream Maker от разработчиков.
Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.
Глава 9: Информационный объект Client
"И сказали они Фараону: "Страшись, ибо Спящий грядет. Поддайся нам и позволь нам убить его, а тело разрезать и спрятать в канаве - и скажем мы, что злые звери сожрали его: тогда мы посмотрим, чем станут его сны."" -- Второзаконие 37.19-20
Объект Client создается, когда игрок заходит на сервер, и уничтожается, когда игрок выходит. Существа, которыми управляют игроки, и NPC одинаково обрабатываются компьютером, но клиент содержит свойства, которые могут относиться только к игроку.
Вы можете определить свои действия для объекта клиента. Они рассматриваются как специальные действия, прикрепленные к существу, которым управляет игрок: они применимы только к игроку, а источник остается не определенным. В дополнение к действиям, вы также можете определять переменные и действия типа proc.
Переменные Клиента
Переменные клиента содержат информацию об игроке и состоянии его компьютера. Вот список таких переменных, заданных по умолчанию:
• key – логин игрока. Он используется, чтобы прикрепить игрока к существу. Когда создается новое существо для игрока, его имя будет совпадать с этой переменной. Изменив эту переменную у существа на логин игрока, вы заставите игрока переключиться на управление этим существом. Существо, которым до этого управлял игрок, потеряет значение своей переменной key (будет пустая строка). Процедуры Login() и Logout() вызываются автоматически вовремя обмена.
• ckey – логин игрока в упрощенной форме. Вся пунктуация убирается, а буквы переписываются в нижний регистр. Эту переменную можно использовать в схожих целях, например, для изменения существа, которым управляет игрок. Но основная цель это хранение важной информации об игроке.
• mob – существо, управляемое игроком. Ее можно изменять, чтобы заставить игрока превратиться в другое существо. Эта переменная является дополнением к mob.client, которая является ссылкой на используемое клиентом существо.
• eye – позиция центра экрана игрока. По умолчанию совпадает с позицией существа, управляемого игроком. Вы можете установить ее равной другим объектам, контролировать то, что видит игрок. Заметим, что видимость все равно отсчитывается от существа игрока. Там можно достигнуть разных эффектов, вроде “ленивого взгляда”, что будет описываться далее.
• lazy_eye – время задержки между передвижением экрана и существа игрока. По умолчанию стоит на нуле, так что существо всегда стоит в центре экрана. Если установить значение, отличное от нуля, то существо сможет уйти от центра на какое-то расстояние, прежде чем экран снова встанет на свое место.
• dir направление “верха” экрана игрока. По умолчанию это NORTH, то есть север карты, который определяется редактором карты. Другими возможными значениями являются SOUTH, EAST, и WEST. Возможны также и диагонали, но это примерно то же самое, что и одно из четырех основных направлений. С помощью этой переменной можно сделать так, чтобы стрелки на клавиатуре поворачивали экран относительно карты.
• address – сетевой адрес игрока. Если этот игрок держит сервер, то эта строка останется пустой, что полезно при выдаче специальных возможностей. Также эта переменная может быть использована, чтобы запретить доступ к серверу игрокам по IP.
• statobj – это объект, который видит игрок на панели статуса.
• statpanel – название панели статуса, которая отображается у игрока.
• verbs – список действий, прикрепленных к клиенту. Действия могут быть добавлены и извлечены из списка, о чем мы расскажем подробней в главе 10.6.2.
• script – специальная программа DM Script для отправки информации клиенту. Синтаксис DM Script будет рассматриваться в главе 11.5 и дополнении (страница [4]). В основном эта переменная используется, чтобы определить стиль текста, который будет выводиться у игрока. Также тут определяются названия команд и горячие клавиши.
• macro_mode – может быть установлен на 1, чтобы интерпретировать клавиши макрос по умолчанию. Смотрите дополнение (страница [4]) чтобы узнать больше информации. Используя переменные client.mob, вы можете создать команду who, которая показывает список игроков онлайн.
mob/verb/who() var/mob/M usr << "Active players:" for(M) if(M.client) usr << M.name
Существа без клиента (NPC) не включены в этот список.
Действия клиента
Вот несколько стандартных действий, разных форм ввода для игрока.
Действия направления
Когда игрок нажимает одну из кнопок со стрелками, это вызывает соответствующее действие клиента. Вот процедуры, для каждой кнопки: North(), South(), East(), West(), Northeast(), Northwest(), Southeast(), Southwest(), и Center().
Нужно более точно описать эти действия. Их названия начинаются с точки, что значит, что они не будут показываться ни в каких списках, пока вы не введете точку. Если вы введете “.north”, это будет то же самое, что нажать на кнопку со стрелкой вверх. То есть кнопки стрелок просто вводят нужную команду вместо вас.
По умолчанию, действия направления вызывают действие Move, которое в свою очередь вызывает собственное действие Move нужного существа. Оно легко переопределяется.
Move(Loc,Dir) Loc - новая локация, куда существо должно передвинуться. Dir - направление, куда должно повернуться существо. Возвращает 1 при успешном передвижении, 0 при ошибке.
Действие Center также можно переопределить. Только по умолчанию оно должно вызывать остановку передвижения любых движений существа. Эта тема будет рассматриваться в главе 14.2.
Во многих играх может быть отключено движение по диагонали. Вы можете этого легко достигнуть, переопределив требуемые действия на выполнение ничего.
client //disable diagonals Northeast() Northwest() Southeast() Southwest()
Действие Click
Действие Click вызывается, когда игрок щелкает левой кнопкой мыши по карте или по панели статуса. Аналогичное действие DblClick работает также, только вызывается двойным щелчком. Эти процедуры описываются в главе 7.4.
Click (O,Panel) DblClick (O,Panel) O - объект, по которому кликнули. Panel - панель статуса, по которой кликнули (или ноль).
Разберем пример, в котором мы сделаем так, чтобы вам выдавалось сообщение, куда вы кликнули.
client/Click(O) usr << "You clicked [O]."
Заметим, что родительское действие тут не вызывается. Это значит, что объект, задействованный процедурой Click, не вызывается. Не забывайте вызывать ..(), если вы хотите, чтобы это имело место.
Клиентская процедура Click удобна для использования, когда вы хотите выполнить действие, одинаковое для всех типов объектов. Когда действие зависит от типа объекта, собственная процедура Click этого объекта – лучшее решение.
Действие Stat
Действие Stat периодически вызывается клиентом, чтобы обновить панель статуса. По умолчанию это действие вызывает statobj.Stat(). Вы можете настраивать панель статуса через это действие, но если вы хотите чтобы панель отображала состояние другого объекта (например, существа игрока), то лучше всего это делать через собственное действие Stat, этого существа. Создание своей панели статуса уже рассматривалось в главе 7.3.
Действие Topic
Действие Topic вызывается, когда игрок кликает по ссылке, выведенной вместе с каким-то текстом в игре. Вы можете использовать это, чтобы, например, дать игроку больше информации о помеченном объекте (поэтому действие называется Topic). Однако возможности этого действия не ограничены. Многие другие варианты использования этого действия будет описываться в главе 11.
Topic(Topic,Obj,SubTopic) Topic - ссылка, выбранная игроком. Obj - указанный объект, если имеется. SubTopic - описание объекта.
Параметры Obj и SubTopic появляются только, если действие Topic вызывается ссылкой на объект (встроенной в текст с помощью \ref). По умолчанию объект вызывает действие Topic уже с аргументом SubTopic. Вы уже видели это в главе 7.6, когда мы создавали ссылку на игровой объект.
Так как все ссылки проходят через клиент, вы можете контролировать доступ игрока к каждому объекту. Также вы можете создавать темы, не приписанные к каким-либо объектам. В этом случае, вы просто привязываете их к объекту клиента.
Гиперссылки темы создаются с помощью HTML. Мы уже рассказывали вам про этот синтаксис, когда рассказывали про ссылки, но для темы клиента вам не обязательно вставлять в объект ссылку. Также возможно это использовать для других типов ссылок. Это будет описываться в главе 11.2.8.
"... <A HREF=#topic> click here </A> ..."
Как пример использования ссылки на тему клиента, вы можете дать совет новым игрокам.
client/Topic(T) if(T == "help") usr << "The motto here is: you are what you eat." else ..() mob/Login() ..() usr << "When in doubt, click here."
Действия Import и Export
Действия Import и Export используются, чтобы считывать и записывать файлы сохранения в файле игрока. Это очень полезно, если некая информация об игроке используется во многих мирах. То есть эти действия сохраняют информацию не о мире, а о каждом игроке и переносит ее между мирами.
Мы пока не рассказывали вам о файлах сохранения, но мы еще расскажем об этом в главе 12.
Действия New и Del
Действия New и Del вызывают создание и уничтожение объекта клиента. По умолчанию действие New соединяет игрока и его существа с соответствующим значением переменной key, а если такого существа не найдется, то создается новое, которое определяется переменной world.mob.
New(Topic) Topic - тема, к которой осуществляется доступ. usr - существо, со схожей переменной key, если есть. Возвращает существо, выбранное для игрока.
Обычно тема не указывается, когда подключается игрок. Однако, это можно использовать в разных ситуациях. По умолчанию, когда существо выбрано, вызывается действие Topic.
Вы можете переписать действие New, чтобы банить игроков по его значению переменной key (логину бьонда).
client/New() if(key == "Real Jerk") return //sorry pal! return ..()