WarCraft 3 FunGamer



Ролевая игра по WarCraft и общение фанатов трилогии.
Время сайта: 10.03.2026, 13:12
Приветствуем Вас, Смелая Душа

| Главная | функция GetLocalPlayer() От H_A_PK - Форум | Регистрация | Вход |

| Информация о сайте |
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Kotovas  
функция GetLocalPlayer() От H_A_PK
DansrobotДата: Пятница, 02.04.2010, 21:56 | Сообщение # 1
Хранитель
Группа: Администраторы
Сообщений: 1504
Статус:
Оглавление.
=============================================
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
Источник: http://war3-fungamer.info/publ/21-1-0-22


Марк
Эмпатия - 1 уровень
Каменная стена - 1 уровень
Каменный доспех - 2 уровень
Сокрушение - 0 уровень
50\75 опыта до 5 уровня.
Мечта Чародея - меч обладает способностью кражи маны при физическом контакте с жертвой
"Кровь порождает зло"
 
H_A_PKДата: Пятница, 02.04.2010, 22:11 | Сообщение # 2
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Во!!:)

..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)


Сообщение отредактировал H_A_PK - Пятница, 02.04.2010, 22:14
 
ГульДата: Пятница, 02.04.2010, 22:15 | Сообщение # 3
Реальный ХамяГ
Группа: Администраторы
Сообщений: 2264
Статус:
Я подправил. Теперь все нормально.

Гейм-мастер:
Гилториэль Белый - Уровень 6, Белый маг.

До следующего уровня: 80/105 мобов

Способности:
Сжимающий свет - Уровень 3
Буря - Уровень 1
Восстановление сил - Уровень 1
Сила пяти Стихий - ульт - Уровень 1

Боссы: Мясник (добавлен 1 уровень), Лич (добавлено 15 мобов)

Все расы ролевой игры и способности - здесь

Мой блог о создании музыки.

 
NestrikДата: Воскресенье, 04.04.2010, 07:15 | Сообщение # 4
Уровень 1
Группа: Воины
Сообщений: 7
Статус:
Не понимаю смысла статьи: тут так много мепмейкеров часто использующих хендлы ? Мне вот как то не сильно хочется пользоваться хендлами и ретурн багом для получения "его самого" когда можно использовать прямое имя юнита/эфффекта/декорации/и др.

хотя мб статься и полезная.


Хинт, белый маг, уровнь 1

До следующего уровня 0/5 мобов.

Способности:
Сжимающий свет - Уровень 1

 
H_A_PKДата: Понедельник, 05.04.2010, 00:11 | Сообщение # 5
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Quote (Nestrik)
ретурн багом

щас уже 1.24 так что юзай хеш таблицы

Добавлено (05.04.2010, 00:11)
---------------------------------------------

Quote (Nestrik)
использующих хендлы ?

з.ы: сюда придут мепмейкеры когда - нибудь + статьи уже есть )


..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)
 
ПирожокДата: Понедельник, 05.04.2010, 00:30 | Сообщение # 6
*Съедобный*
Группа: NewsMakers
Сообщений: 82
Статус:
Теперь я понял то, что давно хотел узнать. Пойду забацаю спелл "ослепление"
 
H_A_PKДата: Понедельник, 05.04.2010, 00:31 | Сообщение # 7
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Quote (Пирожок)
Теперь я понял то, что давно хотел узнать. Пойду забацаю спелл "ослепление"

если ты будеш мутить затемнения для Локал Игрока, то случится десинк , угу


..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)
 
ПирожокДата: Понедельник, 05.04.2010, 00:33 | Сообщение # 8
*Съедобный*
Группа: NewsMakers
Сообщений: 82
Статус:
его можно избежать с помощью ретурн багом?

Сообщение отредактировал Пирожок - Понедельник, 05.04.2010, 00:34
 
H_A_PKДата: Понедельник, 05.04.2010, 00:36 | Сообщение # 9
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Quote (Пирожок)
с помощью ретурн багом?

хД, А ты знаешь , что это такое ? офк нет


..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)
 
ПирожокДата: Понедельник, 05.04.2010, 00:37 | Сообщение # 10
*Съедобный*
Группа: NewsMakers
Сообщений: 82
Статус:
я отец) я знаю все)
 
H_A_PKДата: Понедельник, 05.04.2010, 00:40 | Сообщение # 11
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Quote (Пирожок)
я отец) я знаю все)

=), вообщем с помощью РБ ты можешь на хендл повещать ссылки х))
в 1.24 для этого создали ХТ, убрали РБ


..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)
 
ПирожокДата: Понедельник, 05.04.2010, 00:41 | Сообщение # 12
*Съедобный*
Группа: NewsMakers
Сообщений: 82
Статус:
я отец до 1.24 *
после обновления я не в теме(
*пошел щупать хеш-таблицы*


Сообщение отредактировал Пирожок - Понедельник, 05.04.2010, 00:42
 
H_A_PKДата: Понедельник, 05.04.2010, 01:38 | Сообщение # 13
Уровень 1
Группа: Воины
Сообщений: 37
Статус:
Quote (Пирожок)
после обновления я не в теме(

да там только РБ убрали , только утяжелили картостроителям жизнь тем , что им пришлось все функции РБ переводить в ХТ.

Добавлено (05.04.2010, 00:45)
---------------------------------------------
Я наверно щас статью сюда выложу. Разартовскою :)

Добавлено (05.04.2010, 01:38)
---------------------------------------------

Quote (Nestrik)
прямое имя юнита/эфффекта/декорации/и др.

через переменные ? Кхм, ты точно знаешь , что даёт РБ мейкерам ?


..._,_//""|//^^пиво^^|
.(|__|___||___________|
(@)**(@)(@)|*""(@)(@)
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright WarCraft-3.moy.su, © 2026, Наглое копирование материалов без обратной ссылки грозит Вам потерей конечностей