Сообщения
Система сообщений является фундаментально важным аспектом при построении мода, и ни один уважающий себя мод не обходится без них. В этом простеньком туториале Вы ознакомитесь с самыми простыми приемами посылки сообщений другим игрокам. Тем не менее, не нужно думать, что это единственный способ - существует множество других, и может быть даже более простых путей реализации системы сообщений, чем объяснено в этом туториале. Цель этого документа - изучение объектов в игре, что, несомненно, поднимет Ваш уровень понимания работы некоторых вещей. Некоторые "другие" методы обсуждаются в конце туториала.
Есть несколько причин, по которым Вы захотите послать сообщения другим игрокам во время игрового процесса. Во-первых, чат (chatting) с другими людьми повышает Ваш навык. Сообщения всем, сообщения всем друзьям по команде в CTF или TF, или, возможно, индивидуальному игроку. Во-вторых, множество происходящих событий во время игры требуют оповещения об этом всех других игроков. Например, захват флага, смерть соратника, или сообщение о том, что друг присел "покемперить".
В не зависимости от Ваших требований, существует три вида сообщений: всеобщие, командные и индивидуальные. Изучив, как работают эти функции, Вы сможете модифицировать их исходя из своих нужд.
Broadcasting
Broadcasting посылает сообщение всем на текущем уровне. Ниже приведен скрипт этой функции (выдран из класса Actor в исходниках Unreal):
function BroadcastMessage( coerce string[240] Msg, bool bBeep ) { local Pawn P; if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) { for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer ) P.ClientMessage( Msg ); } } |
Что эта функция делает на самом деле: она принимает в качестве параметра строку (String) самого сообщения и логическую переменную. Затем она в цикле "опрашивает" каждое живое существо (Pawn) на уровне и если оно является игроком, то вызывается функция (определенная в классе Pawn) для отображения сообщения на экран.
Тело функции начинается с условия if. выражение в операторе if ссылается на объект "Level", который содержит объект "Game", который в свою очередь имеет метод AllowsBroadcast(). Этот метод принимает два параметра в качестве аргументов: объект, вызывающий этот метод и длина строки сообщения.
Если игра "разрешает" отображение сообщений, т.е. метод AllowsBroadcast() возвращает true, скрипт переходит к циклу for. Цикл for перебирает живые существа (Pawns) с помощью связанного списка "PawnList". Этот список содержит все живые существа на текущем уровне. Но следует помнить, что все живые существа в игре являются Pawns, а не только игроки, управляемые людьми. Поэтому, Вы, сперва должны проверить является ли pawn "человеческим" игроком.
К счастью, каждый объект Pawn имеет логическую переменную bIsPlayer, указывающую является ли объект "человеком" (т.е. управляется ли он человеком). Эта переменная инициализируется автоматически движком при создании объекта. При переборе всего списка, вызывается свойство nextPawn текущего объекта Pawn. Если он является "человеком", вызывается метод ClientMessage() и ему передается строка сообщения, которая и отображается на клиентской машине игрока.
Индивидуальные сообщения
Система послания сообщений отдельным (индивидуальным) игрокам очень схожа с Broadcasting. Можете его называть выборочный broadcasting. Ниже скрипт его реализации:
function MessageIndividual( coerce string[240] Msg, bool bBeep, string[20] sName) { local Pawn P; if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) for( P=Level.PawnList; P!=None; P=P.nextPawn ) if( P.bIsPlayer && P.playername == sName) P.ClientMessage( Msg ); } |
Метод, посылающий индивидуальные сообщения отличается только дополнительным параметром в самой функции (которая, кстати, имеет другое имя) и дополнительным условием в операторе if. Все что Вам нужно будет сделать - это добавить ссылку на имя игрока (которому посылается сообщение), и проверять (помимо всего прочего) совпадает ли оно с именем Pawn из списка при переборе.
Если Вы не знаете, как указать имя игрока, которому посылается сообщение, то это все зависит от того, как Вы хотите сделать вызов функции. Например, Вы можете создать новую консольную команду "tell", принимающую два параметра: имя игрока и текст сообщения:
'tell neural9 Your mod sucks, dude!'
Также, Вы можете "прикручивать" вызов этой функции к различным событиям или другим функциям. Например, если Вы хотите послать сообщение игроку, который Вас толкает (соприкасается с Вами), Вы можете воспользоваться функцией Touch(), определенной в классе Actor:
function Touch( actor Other ) { MessageIndividual( "Stop bumping into me you geek !", true, other.name ); } |
Командные сообщения
Вы можете использовать подход выборочного broadcasting для послания сообщений всем членам Вашей команды, например, во время CTF и TF игр. При создании "командного" актера не забудьте указать ему свойство "teamname" (имя команды). Затем модифицируйте скрипт, посылающий индивидуальные сообщения, таким образом, чтобы он теперь проверял не совпадение имени игрока, а совпадение имени команды.
Автор
neural9
Источник: www.unrealscript.com
Перевод сделан 32_Pistoleta.