Понедельник, 20.05.2024, 17:06           Главная | Регистрация | Вход | RSS | Форум     [Обои | Файлы | Статьи | Кнопки и баннеры]
Меню сайта

Общение

Категории раздела
Триггеры [5]
Статьи по триггерам
JASS [3]
Статьи о JASS.
World Editor [6]
Общие статьи по World Editor.
Ландшафт [3]
Статьи по ландшафту
Моделлинг [0]
Статьи по моделлингу
Импорт\Экспорт [3]
Статьи про импортирование\экспортирование объектов.
Активные проекты
Поиск
Полезные ссылки
Наш опрос
Что такое для вас WarCraft?
Всего ответов: 308
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Картостроение » JASS

Функция GetLocalPlayer()
Оглавление.
=============================================
1. Что такое GetLocalPlayer()?
2. GetLocalPlayer() и десинхронизации.
3. Игроки в JASS:
4. Основное использование GetLocalPlayer().
5. Отсоединение хендлов.
6. Управление системой Редактора.
7. Обычное использование
8. Выполнение функций для отрядов.
9. Заключение.
=============================================

1. Что такое GetLocalPlayer()?

GetLocalPlayer() - одна из полезнейших функций common.j, однако также одна из опаснейших. GetLocalPlayer() - функция, которая запускает часть действий для конкретного игрока. Поэтому при правильном её использовании можно совершить действие для конкретного игрока, для остальных же это действие совершено не будет.

2. GetLocalPlayer() и десинхронизации.
GetLocalPlayer() - функция, которую можно назвать десинхронизирующей. Это означает, что она может вызывать десинхронизации. Десинхронизации - это ошибки, которые при коллективной игре могут отсоединять всех игроков от игры (исключением может быть локальный игрок). В этой статье я предупрежу вас об опасностях функции GetLocalPlayer().

3. Игроки в JASS:
В JASS номера игроков имеют диапазон от 0 до 11, а не от 1 до 12. (0=1, 1=2, 2=3 и.т.д.). Поэтому, когда будете делать что-либо подобное:

Помните, что игрок 7 в JASS - это игрок 8 в GUI-триггерах.
Также часто встречаются следующие виды игроков:

Первый - это игрок, реагирующий на событие триггера, а второй - это владелец реагирующей на событие триггера боевой единицы.

4. Основное использование GetLocalPlayer().
GetLocalPlayer() может совершать действие для определённого игрока, как было сказано ранее. А сейчас давайте посмотрим на простой пример блока GetLocalPlayer():

Давайте проведём то, что я называю разбором полётов. Мы разобьём функцию на части и покажем их определения. Затем скрепим определения и получим основной смысл функции.

function Test takes nothing returns nothing - Функция Test ничего не берёт и ничего не возвращает.
if GetLocalPlayer() - Если игрок, у которого запущен этот триггер...
== Player(0) then - ...это Игрок 1 (Красный), тогда...
//actions - ...совершаем эти действия.
endif/endfunction - Закрываем блок условия и блок функции.

Теперь давайте соединим все определения. Получим:
Функция Test ничего не берёт и ничего не возвращает. Если игрок, у которого запущен этот триггер - это Игрок 1 (Красный), тогда совершаем эти действия. Закрываем блок условия и блок функции.

Отсюда следует, что действия, которые находятся в этом блоке запустятся только для Игрока 1 (Красного).

5. Отсоединение хендлов.
Сначала покажу вам пример:

Это десинхронизирующий код, так как:

Эта функция возвращает effect...

...а effect наследуется от handle.
Это значит, что вы создадите хендл. Создание хендлов для игроков очень опасно и почти всегда ведёт к десинхронизации. Но есть и исключения.
Существует специальная функция, которая называется "Typecasting - Handle to Integer". Конвертирование хендла в целочисленную вернёт нам значение хендла. Итак, давайте посмотрим на функцию:

Это простой трюк, парсер JASS проверяет только последнее значение return. Вот в чём состоит трюк - мы даём функции хендл, хотя на самом деле нужно дать ей целочисленную.
Мы можем легко получить значение хендла, используя эту функцию. Если оно будет больше, чем 0х100000, то функция вызовет десинхронизацию при создании в блоке. После проверки многих хендлов вы можете получить значения типа 1048670 или 1048576... Чтобы проверить полученное значение, можно использовать что-то на манер этого:

Скорее всего, функция вернёт число 99, если больше не будет всплывающих текстов. Некоторые хендлы не могут быть обнаружены, как обычные. Почему 0х100000? Это число, с которого начинаются хендлы, обнаруживающиеся нормально. (Может быть, я не совсем красиво сказал).
Итак, если вы хотите создать боевую единицу (значение 1048576), то вызовете десинхронизацию, т.к. 1048576 > 100000. (0х обозначает, что число измеряется в шестнадцатеричной системе)

6. Управление системой Редактора.
Скажем, вы хотите создать спецэффект для определённого игрока. Как вы это сделаете? Так, как описано ниже?

Неверно! Вы не можете создать спецэффект, т.к. его значение 1048576 > 100000. Но как тогда это сделать? Во многих случаях вам придётся что-то скрывать и показывать для определённых игроков. Не бойтесь, есть альтернатива! Спецэффекты не имеют функции скрытия\показа, такую функцию мы и сделаем.

Мои поздравления, мы всё сделали правильно! Однако, тут тоже не всё так хорошо - есть шанс на то, что таблица строк десинхронизируется, именно поэтому лучше сделать так:

7. Обычное использование
Скажем, у вас есть мультиборд, но вы хотите показать его только для конкретного игрока. Запомните, нельзя создавать мультиборд для конкретного игрока, у мультибордов нет строк-директорий, поэтому можно просто спрятать или показать его.

В результате мультиборд будет показан только красному игроку.

8. Выполнение функций для отрядов.
У применения функции к отряду тоже есть своя техника. Вместо того, чтобы снова и снова использовать GetLocalPlayer(), можно использовать функцию IsPlayerInForce(). Вот пример такого использования:

Видите эту функцию? toForce - это отряд, для которого вы показываете сообщение, а message - это показываемое сообщение.
IsPlayerInForce() проверяет, есть ли игрок (аргумент 1) в нужном отряде (аргумент 2). Так как GetLocalPlayer() возвращает игрока (у которого в этот момент запущен триггер), можно проверить, состоит ли игрок в нужном нам отряде, затем применить действия к этому игроку. Триггер запустится для всех игроков, те, кто будут в нужном отряде, получат на экран сообщение, другие же не получат ничего.
Эта техника полезна и может сэкономить много времени.

9. Заключение.
Теперь вы знаете, как показывать что-либо определённым игрокам. В GUI можно просто использовать команду "Custom Script". Надеюсь, что статья вам помогла. Можете всё сами проверить и, конечно же, оставлять комментарии.

Автор: PurgeandFire
Источник.

Категория: JASS | Добавил: [DUOS] (01.01.2010)
Просмотров: 2285 | Рейтинг: 5.0/1 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Мини-профиль
Ламер

Сообщения:

Группа:
Гости
Время:17:06
Форма входа
Реклама от Google