XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
SmoksTER

offline
Опыт: 483
Активность:
Передача в функцию группу юнитов, как?
вчера взялся за джас чисто ради спортивного интереса=) написал необходимую функцию, суть которой нанесение дамага + всмлывающий текст (Число этого дамага) - собстно ради того что бы не писать везде где понадобится данное действие кучу тригеров.
Итак.. Функция вызывается по её названию и параметрами:
  1. Игрок наносящий повреждения (u) - GetSpellAbilityUnit()
  2. Игрок получающий повреждения (u2) - GetSpellTargetUnit()
  3. Сила атаки игрока владеющего u (a) - глобальная целочисленный массив (номер ячейки привязан к игроку)
  4. Сила защиты игрока владеющего u2 (b) - глобальная целочисленный массив (номер ячейки привязан к игроку)
  5. Индекс урона по умолчанию = 1 (idx) для примерно таких " формул=))" - ( a-b*idx)
  6. Скорость (speed) = скорости полета снаряда (для своевременного нанесения урона аля вэйт растояние между u и u2 / speed)
вызываться функция должна sc из любого тригера
С таргетом путем передачи юнитов Кастующего = u и таргет каста u2 - все работает (мб и не сложно но первая функция все таки =) )
Думал аое касты будут так же работать только надо будет сделать Пикнутый юнит = u2 (во время пика юнитов в радиусе) и фигугадал =)
вопрос 1) как реализовать передачу в функцию юнитов из тригера типо:
pick every unit in (в радиусе 400 от позиции кастера (логические условия..))
цикл - действия
cs: call damage ( GetSpellAbilityUnit(), "тут должен передаваться u2", 1, udg_attack[GetConvertedPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], udg_deff[GetConvertedPlayerId(GetOwningPlayer("тут должен передаваться u2"))], 600,00)
вопрос 2) не получается присвоить integer A значение массива udg_attack[...] в самой функции
для этого пишу
local integer a = udg_attack[GetConvertedPlayerId(GetOwningPlayer(GetOwningPlayer(u2))]
как использовать в функции 2 глобальные переменные (использовать их значения)
вопрос 3) в момент передачи значения через cs: игрок Красный=1?(а не 0) судя по дамагу так и есть...
хм... надеюсь мое изложение сути проблемы будет понятным не только мне =)
Старый 03.02.2011, 09:06
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
SmoksTER, юзай хеш
Старый 03.02.2011, 11:31
SmoksTER

offline
Опыт: 483
Активность:
Dreii:
SmoksTER, юзай хеш
в джасе? или тригерах?=)
если в тригерах... возможно это и есть лучший вариант решения моей простой функции, но дело в том что джас то интереснее, поэтому и взялся.
Старый 03.02.2011, 11:54
Hanabishi
COOL STATUS
offline
Опыт: отключен
SmoksTER, про GetEnumUnit() никогда не слышал?)
Hanabishi добавил:
call damage ( GetSpellAbilityUnit(),GetEnumUnit(), 1, udg_attack[GetConvertedPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], udg_deff[GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit()))], 600,00)
Старый 03.02.2011, 13:09
SmoksTER

offline
Опыт: 483
Активность:
Hanabishi:
SmoksTER, GetEnumUnit() не пробывал случаем?
GetEnumUnit() пробовал, и на всякий случай попробовал GetFilterUnit()
а GetTriggerUnit() - передает кастера столько раз сколько раз идет пик (сколько юнитов проходят логические проверки в радиусе 400)
собстно при написании "этого чуда" =) я думал что она будет работать с Picked Unit который как я узнал в момент написания превращается в GetEnumUnit()
по идее... должно передавать?... т.е. искать ошибку в других местах? или пробовать другие способы передачи?

Отредактировано SmoksTER, 03.02.2011 в 13:42.
Старый 03.02.2011, 13:15
Hanabishi
COOL STATUS
offline
Опыт: отключен
SmoksTER, GetEnumUnit() и возвращает как раз пикнутого юнита
ищи ошибки
Старый 03.02.2011, 13:20
SmoksTER

offline
Опыт: 483
Активность:
Ребят, вопрос 1 исчерпан, попробовал закоментить строку ожидания перед нанесением дамага. поставил GetEnumUnit() и все стало работать, хотя не понял это если между u и u2 расстояние предположим 400 / speed то должно быть ожидание перед дамагом 0,67 секунды если я ничего не путаю.
Есть подозрение что функция используется много раз (равное кол-ву юнитов в радиусе) и поэтому не успевает нанести повреждение, т.к. начинается каждый раз снова раньше чем проходит вэйт в 0.67 секунды... прав ли я?
а то я думал функции джаса "локальны" столько функций работают в один раз сколько к ним обращаещься...
собственно вырисовывается вопрос =) как придать функции эти "свойства локальной переменной" что бы её могли юзать разные игроки в один момент и т.д.
и еще если вообще убрать паузу даже при работе с таргетом, и сделать вызов функции после аналогичного вэйта, будет ли возможно использовать её в таком виде разными игроками, юнитами и т.д.?
Старый 03.02.2011, 13:42
Hanabishi
COOL STATUS
offline
Опыт: отключен
SmoksTER, пик юнитов сравним с циклом, т.е. следующий виток не пойдёт пока не закончится первый, отсюда если есть вейт - он его ждёт, и только потом начинает обрабатыать следующего юнита
если вейт так необходим, то юзай таймер+хэш
а сможет ли работать сразу для всех - зависит от того, как ты это реализуешь
Старый 03.02.2011, 21:54
DioD

offline
Опыт: 45,134
Активность:
без реального кода данная тема лишена смысла, сначала пиши код, а потом пиши контерные линии\строки\данные которые ты не можешь передать.

закрыто, как сделаешь пиши новую тему.

напоминаю, что для передачи данных куда либо нужен якорь, нет якоря, неоткуда брать данные.
Старый 04.02.2011, 10:24
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:36.