GTA.ru > Сервер > Cкриптинг в MTA: DeathMath > Пятое руководство Пятое руководство сфокусирован на Показах Текстов и в нём мы намериваемся рассказать о системе показов текста и показать её гибкость. Так что же является скриптом? Это часть (только часть, мы сможем показать остальную часть скрипта в более поздней стадии) моего скрипта Unreal Tournament. В основном это копирование всех наших любимых сообщений, которые появились бы на экране, к примеру, во время убийства врагов. Обучающее видео: scriptvideo5.mp4 - x264 codec (640x448, 30fps, 3.01mb) Unreal Tournament скрипт: script5a.lua Сообщения убийств: script5b.lua
Для начала, мы установим тренер события, чтобы запустить onPlayerSpawn. Вы должны быть хорошо знакомы с тренерами событий на данном этапе. Когда игрок появляется (спавнится), мы устанавливаем некоторые переменные, которые сохранены игроку к 0. Это * currentSpeedKill - количество убийств игрока делается быстро. Это позволяет "Двойное убийство" ("Double kill"), "Мульти Убийство" ("Multi Kill") и т.п. сообщения * killingSpree - число убийств игрока, сделанные без смерти. Поскольку они оба всегда будут 0, когда игрок умирает или повторно появляется (спавнится), они устанавливаются здесь на 0. Далее, мы повторяем процесс для того, когда ресурс загружен:
Когда ресурс начинается, мы образовываем петли через каждого игрока на сервере (это было рассказано в одной из более ранних руководств), и также устанавливаем все их спрее (spree) детали на 0. Статические показы? Что это чёрт возьми? Хорошо, это текст, который не должен измениться на лету. Например, когда игрок достигает двойного убийства, это покажет "Двойное убийство!" ("Double kill!") на его экране. Этот текст никогда не должен изменяться и будет всегда, показываться тот же самый текст, всякий раз, когда необходимо.
Заметьте, что я использовал другой тренер события для события, который уже использовался. Почему я сделал это? Это позволяет более опрятный код - я могу держать секции для каждой специфической части кода, которые делают многократные тренеры событий чрезвычайно полезными. Но вернёмся к теме, я должен буду ввести систему показа текста MTA, и как это работает. Система показа текста MTA имеет две главных части - показы текста и пункты текста. Пункт текста, часть текста - где Вы вводите ваш текст, цвет, размер, и т.д. О показе текста можно думать как о группе пунктов текста. Вы не можете физически видеть показ текста, только пункты текста, приложенные к этому. Эта система очень полезна, поскольку она позволяет большому количеству текста быть показанным одновременно в пределах группы (то есть показ текста). Вы можете создать так много показов текста, как Вам захочется, и скрывать или показывать его по желанию. Должно ясно даваться понять, что пункт текста является бесполезным, если он не присоединено к показу текста - нет никакого способа показать пункт текста самостоятельно, это должна быть часть показа текста. По этому сначала, давайте создавать наши показы текста:
Я создал 5 показов, один для каждой части текста. Это означает, что я могу показать или скрыть их индивидуально, таким образом, каждый из них нуждаются в их собственном показе. Затем, я создаю мой первый пункт текста:
Аргументы: (текст, позиция x, позиция y, приоритет, красный, зеленый, синий, альфа, масштаб ( text, position x, position y, priority, red, green, blue, alpha, scale )) Это означает, что они могут быть размещены где-нибудь на экране, с любым цветом и любым размером. "Алфа" аргумент учитывает прозрачность. Аргумент "приоритета" - норма, по которой должен быть обновлен пункт текста. В большинстве случаев безопасно установить это на "среднее" ("medium"). Затем мы должны привязать этот пункт текста к соответствующему показу текста:
textDisplayAddText позволяет привязать пункт текста к показу текста. Аргументы очевидны. Мы тогда повторяем процесс для всех других пунктов текста:
Теперь мы установили все наши статические показы текста - мы только должны вызвать их.
Сначала, мы имеем событие onPlayerWasted. Переданные переменные довольно очевидны. Эта часть проверяет, есть ли таймер, сохраненный в данных элементах игрока, и удаляет их если так. По этому будем объяснять более подробно немного позже.
Далее, мы используем в своих интересах bodypart переменную. Это чрезвычайно полезно в обнаружении, места, где был убит игрок, когда он был застрелен. В этом случае, мы хотим знать, была ли это голова - ID 5 и 6. Если это была голова, то мы используем функцию textDisplayAddObserver. Это в основном позволяет показывать из показа текста определенному человеку. В этом случае, мы показываем staticHeadshot показ текста убийце. Тогда мы устанавливаем таймер, в течение 3 секунд удалять показ текста с экрана убийцы. Затем мы настраиваем наш код скорости убийств:
Мы используем если утверждение, чтобы удостовериться, что есть убийца, и что убийца не человек, который умер. Мы сначала используем getElementData, чтобы получить, его текущее количество скорости убийств, (помните, что это установлено на 0 по умолчанию), тогда мы устанавливаем один новый в currentSpeedKills + 1, поскольку убийца только что выполнил новое убийство.
Эта часть имеет отношение к убийству таймера ранее. В основном, так как это скоростное убийство, число последовательных убийств, должно возвратиться к 0 после 3 секунд. Поэтому таймер устанавливает 0 после 3 секунд. Этот таймер тогда сохраняет в данных элемента игрока. Это означает, что в следующий раз onPlayerWasted вызывает таймер, чтобы возвратить это к 0 может быть убито, чтобы предотвратить вмешательство.
Мы тогда вызываем пользовательскую функцию showSpeedKill:
Здесь мы в основном проверяем, количество скоростных убийств, проверяя данные элемента. Если он больше или равно 2, то человек, должно быть, по крайней мере достиг двойного, убийства. По этому сначала мы удаляем любые другие старые показы текста, которые могут налаживаться вокруг показанных со всеми функциями textDisplayRemoveObserver. Тогда мы уничтожаем любые таймеры, которые могут быть вокруг, чтобы удалить текст, проверяя данные элемента (см. немного далее, ниже)
Далее мы следуем подобным процессом с показом "Headshot!!" ранее:
Если currentSpeedKills - 2, тогда переменная "display" определяется как staticDoubleKill. Тогда мы добавляем observer (наблюдение) согласно необходимому показу текста. Если убийство - 3, 4 или 5 скоростное убийство, мы определяем различный показ текста. Тогда эта переменная используется в функции textDisplayAddObserver. Отметьте, что Монстр убийство - > =5 - это означает, что это повторяется за любую переменную, больше чем или равную 5. Наконец, как с headshot сообщением, мы заставляем таймер убрать сообщение после 3 секунд. Судя чи из названия - это противоположность статических показов текста. Они будут должны измениться согласно ситуации. Так давайте сначала настроим все onResourceLoad:
Как и прежде, мы создаем показ текста, и определяем его как dynamicKillingSpree. Тогда мы создаем пункт текста. Но заметьте, что текст в этом пункте чист. Почему это? Текст собирается изменяться на лету всякий раз, когда необходимо. Сейчас он пуст, но это изменится, когда текст нужно показать. Это означает, что мы не должны показать или скрывать любые наблюдателей - каждый может быть наблюдателями, но текст может быть чистым. Мы определяем чистую глобальную "killingSpreeTimer" переменную - это будет показано немного позже (но будут даваться прошлые таймеры, Вы должны быть в состоянии предположить то, что делать!) Тогда мы добавляем текст к textdisplay. Затем мы делаем петлю для каждого игрока на сервере:
Но сейчас, это должно быть очень знакомо Вам. В противном случае выясните некоторые из предыдущих обучающих программ. Итак, почему мы прокручиваем через игроков? Мы должны создать показ текста, уникальный для каждого игрока, поскольку только тот игрок будет видеть его или её определяемые сообщения. Таким образом, мы образовываем петли через каждого игрока на сервере и создаем показ текста для каждого из них. Это причина того, что мы не делали этого для 'dynamicKillingSpree', это, потому что обращается к сообщению "Talidan, делает убийства подряд!", которое появляется для каждого игрока, по этому требуется только один показ текста.
Здесь мы создаем один показ текста, и добавляем три пункта текста к этому. Мы не нуждаемся в индивидуальных показах текста для каждого пункта текста, поскольку они всегда будут наблюдателем текста. Так как я упоминал ранее, мы можем измениться, видят ли они текст, делая бланк текста. Таким образом, мы создаем 3 пункта текста, я быстро объясню, зачем к каждому из них обращаются: * youWereKilledText - Это обращается к тексту, который показывает, "Вы были убиты Talidan'ом", который появляется на вашем экране. Когда Вы убиты * youKilledText - Это обращается к тексту, когда ВЫ убиваете другого игрока - "Вы убили Talidan'а" * weaponPickup - Это обращается к тексту, когда Вы собираете вещи - например, "Вы собрали M4". Затем мы должны привязать эти индивидуальные показы к игроку, таким образом, они могут быть восстановлены позже. Как обычно это сделано через данные элемента:
Это должно быть красиво, выглядеть на данном этапе. Тогда:
Это делает каждого наблюдателем показа текста dynamicKillingSpree. Так как показ текста глобален, мы нуждаемся только в одном показе текста. Однако мы все ещё требуем, чтобы каждый видел, показ текста, следовательно, добавьте эту функцию как часть петли для каждого игрока. Следующая часть – дубликат текста выше, только разработанный для игроков, которые присоединяются к серверу, а не вокруг, когда скрипт загружен:
Все тексты сверху, нет большего количества объяснения, чтобы сделать этого. Таким образом, мы создали или динамические показы текста, каждый уникальный для каждого игрока за исключением текст убийств подряд. Теперь все, что мы должны сделать - начать их. youWereKilledText и youKilledText вызываются, когда игрок умирает, поэтому мы должны использовать событие onPlayerWasted.
Мы проверяем, есть ли убийца, и если есть один, удостоверьтесь он не тот же самый человек, который умер. Затем мы установка наш youKilledText:
Сначала мы восстанавливаем наш youKilledText с данными элемента. Так как мы хотим показать текст для убийцы (так как "Вы убили x"), мы восстанавливаем "textItem_youKilledText" убийцы. Затем мы используем различную функцию для предыдущих - textItemSetText. Название говорит само за себя это позволяет устанавливать, или изменять текст пункта текста. Таким образом, здесь мы изменяем бланк youKilledText в "Вы убили" ... getClientName (источник), где getClientName восстанавливает, ник мертвого игрока.
Как обычно, мы заставляем таймер убирать текст. Это делается устанавливанием текст, в какой ни будь бланк, используя функцию textItemSetText. Далее мы следуем подобным способом для youKilledText
Сначала мы восстанавливаем youWereKilledText при использовании данных элемента. Далее, как и прежде, мы устанавливаем текст на "Вы были убиты" "..getClientName (killer).."'ом!", на сей раз, ссылаясь к убийце, поскольку человек, который умер, был убит убийцей. Последняя вещь, которая была введена, когда игрок умирает и является убийством подряд.
Подобно speedkills, мы получаем текущее количество последовательных убийств, и увеличиваем его на один. В отличие от speedkills, мы не возвращаем его к 0 после трех секунд - последовательные убийства остаются, пока игрок не умрёт. Если Вы вернетесь назад к секции Подготовки, то Вы увидите, что это устанавливается на 0, когда появляется игрок.
Наконец, мы инициализируем написанную функцию showKillingSpree, чтобы обращаться с показом текста.
Это написанная функция showKillingSpree. Цель этого состоит в том, чтобы показать текст для последовательных убийств. Мы начнём, восстанавливая убийства, подряд игрока и определяем их. Мы также определяем имя убийцы. Далее мы проверяем глобальную killingSpreeTimer, которую мы создали ранее. Если есть таймер, сохраненный там, мы можем убрать его.
Сообщения убийств подряд инициализируются каждые 5 убийств. Здесь, мы используем математическую библиотеку Lua, функцию math.mod, чтобы проверить, является ли убийства подряд фактором 25. Мы определяем (число, делитель), и остаток от разделения возвращается, если remiander - 0, убийства подряд должны быть фактором 25.
Если убийства подряд - 5, то мы изменяем, текст убийств на 'killername .. "убивает подряд!", где killername - переменная, которую мы определили ранее. Далее мы повторяем процесс для других 25 факторов, с различными сообщениями:
Далее мы заставляем таймер убрать текст после 3 секунд, и определяем его снова как killingSpreeTimer, таким образом, он может быть убран:
Так, мы сделали наш youKilledText, youWereKilledText, и текст последовательных убийств. Что же осталось? Наш текст поднятия . Этот текст показывает, что "Вы собрали x". Он должен вызыватся, когда игрок поднимает что-либо. Поэтому, мы используем событие onPickupUse MTA.
Как мы делали с именем, мы вводим то же самое, когда игрок собирает что-либо. Код этого случая поднятие непосредственно. Мы начинаемся, как обычно, убирая любые таймеры, чтобы убрать текст:
Далее мы восстанавливаем weaponPickup текст с данными элемента:
Теперь я вам покажу систему поднятия MTA иGTA. Есть 3 главных типа пикапов: Броня, здоровье, и пикап оружия. Здоровье и пикапы брони очень похожи, они оба дают определенное количество здоровья и брони, поэтому разделяют функцию - getPickupAmount (пикап). Это восстанавливает поинты которые даёт пикап и работает для пикапов здоровья и брони. Пикапы оружия используют немного другие функции. Есть функция getPickupAmmo (пикап), которая возвращает количество патронов, которые имеет пикап. Есть также getPickupWeapon (погрузка) - эта возвращает ID оружия пикапа. Так, давайте двигаться:
Я заявил, что есть 3 типа пикапов. Используя функцию getPickupType, мы можем восстановить тип. id 0 обращается к здоровью, 1 обращается к броне, и 2 обращается к оружию. Таким образом, здесь мы проверяем, является ли пикап здоровья, если да то покажется установленный текст "Вы собрали x здоровье". Мы делаем ту же самую функцию для брони, только немного изменяем текст:
Пикапы оружия немного сложнее. Сначала мы проверяем, что тип пикапа - оружие:
Затем я введу некоторые функций оружия. getSlotFromWeapon возвращает слот оружия. В GTA, каждое оружие имеет слот – например: гранаты, smgs, пистолеты, все имеют различные слоты. Вы можете увидеть все слоты оружия на этой странице. Итак, почему мы должны знать слоты оружия? Если мы хотим показать сообщения, они должны иметь правильную грамматику! Это означает, что мы не можем иметь, "Вы собрали 200 боеприпасов для M4" показ текста для гранат… поскольку мы должны увидеть "Вы собрали 5 боеприпасов для Гранат" - но в действительности Вы собираете 5 гранат Продолжаем:
Здесь мы восстанавливаем число слота от пикапа оружия. Если слот - 0, 1, 10 или 12, то это - оружие стиля схватки. Таким образом мы показываем "Вы собрали dildo". Мы используем getWeaponNameFromID, чтобы восстановить название ID оружия.
Далее мы повторяем процесс. Все оружие слота 8 - взрывчатые вещества, таким образом, мы выводим "Вы собрали 5 гранаты вместо". Еще, все другие слоты - оружие, которое имеет стандартный стиль боеприпасов/оружия. Таким образом, мы можем иметь "Вы собрали 500 патронов для M4". Наконец-то:
Мы заставляем таймер задать текст, в какой ни будь бланк после 3 секунд, и хранить таймер. Мы сделали наш UT скрипт. Ура. Хотя, мы все же не закончены. Если Вы будете смотреть видео, то Вы заметите новые сообщения об убийствах справа от экрана также сделанный с помощью показов текста. Сначала, мы создаем наш показ текста, когда начинается скрипт:
Затем мы определяем некоторые переменные для главных параметров показа:
Эти переменные - главная конфигурация скрипта и они позволяют Вам изменять положение сообщений, размер текста, и расстояния между каждым пунктом текста. Эти переменные по умолчанию и дадут появление как в скриптинг видео. Тогда мы создаем наши показы текста для наших сообщений об убийствах:
Все пункты текста - глобальные переменные для легкого восстановления позже. Мы создаем 6 пунктов текста, весь бланк. Мы помещаем их в 0.8 поперек экрана и, используя простой математику, мы помещаем каждый пункт текста друг под другом в тех же самых интервалах согласно расстоянию, которое мы устанавливали ранее. Мы придаем некоторые фиктивные переменные цвету и используем переменную 'size' для размера.
Поскольку Вы должны знать, что все, что мы делаем, добавляет весь этот текст к нашему показу текста. Наконец, мы делаем для каждого на сервере, чтобы он видел текст:
Мы должны повторить это для игроков, которые присоединяются:
Затем, я ввожу написанную функцию outputMessage. Это вероятно главная часть скрипта и обращается со всем поступающим текстом и обновляет показ текста. Это имеет 4 параметра: outputMessage (text, r, g, b, a). Пользователи могут определить текст, цвет, и альфу. Все это фактически очень просто. Cначала мы восстанавливаем цвета всего текущего текста и текст, и устанавливает их на один выше, и устанавливает один в основание. По тому сначала мы получаем цвет всего текущего текста, и текст:
Мы получаем текущие пункты текста, используя textItemGetText, и определяем это textx согласно числу пунктов текста. Тогда мы используем textItemGetColor, чтобы восстановить 4 переменные для цвета, и определить их как rx, gx, bx, ax. Затем, мы перемещаем весь текст в один:
Текст TextItem5's становится TextItem6's. Цвет TextItem5's становится TextItem6's. Мы делаем то же самое для остальной части:
Таким образом, мы переместили весь наш текст в один. Мы должны добавить, что новый текст перешел в функцию как основной текст:
Текст TextItem6's становится текстом, который передают в функцию. Цвета TextItem6's становятся цветами, которые передают в функцию. Наконец, мы должны фактически иметь событие, чтобы вызвать функцию outputMessage.
Мы добавляем тренер события для onPlayerWasted. Тогда мы получаем прозвище игрока, который умер. Тогда мы используем getPlayerNametagColor, чтобы восстановить цвет nametag текущего игрока (правильно, nametag цвета - изменяемый), и определить его как r, g, b.
Здесь, мы проверяем, есть ли убийца, далее проверяем, является ли убийца человек, который умер. Если он, то мы определяем, ник убийцы как "самоубийство".
Тогда мы определяем сообщение об убийстве как фактическое сообщение, которое мы будем показывать, в конечном счете. Таким образом, это показывает "getClientName (killer) .." убитый ".. killed_nick. Например "Talidan убил Brophy". Однако если мы нашли, что тот источник == убийца, то это покажет "Talidan убил себя", так как killed_nick изменен.
Тогда мы проверяем, было ли оружие, используемое в сцене преступления. Это сделано для утверждения - мы проверяем, мошло ли название быть восстановлено от оружия. Если он мог быть востановлен, вызываем функцию outputMessage, с сообщением убийства, то оружие в скобках. Например "Talidan убил Brophy (dildo)". Тогда мы передаем цвет как r, g и b то есть цвет nametag, который мы восстановили ранее, и альфа 255. Однако, если не было вовлеченного оружия:
Только исходящее сообщение без любых скобок, с сообщением об убийстве и цветами как прежде.
Наконец, если нет убийцы вообще, то мы показываем только "killed_nick, умер" например "Talidan, умер". На этом всё! Прежде, чем мы закончим, я хочу сказать, что скрипт сообщений об убийствах разработан для показа, используя функцию outputMessage (текст, r, г, b, a). В этом примере я использовал его для сообщений об убийствах. Но Вы, как скриптёр, можете показать, что вам угодно. Следите за дальнейшими обновлениями руководств! |
|
Copyright © | наверх | главная | e-mail | ||