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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Срабатывание Condition
function B takes nothing returns boolean
   if CheckFilterUnit == true then
      call C()
      return false
   endif
   return false
endfunction

function A takes nothing returns nothing
   EnumUnitsInRect(g, rect, Condition(function B))
endfunction
Представим, что есть такое. Теперь скажите, функция C должна вызваться столько раз, сколько пикнутых юнитов пройдут по условию CheckFilterUnit? Или я чего-то не понимаю?
это абстракция, CheckFilterUnit может быть любая проверка юнита

Отредактировано Vampirrr, 27.01.2011 в 20:57.
Старый 27.01.2011, 20:43
reALien

offline
Опыт: 29,211
Активность:
хз как оно у тебя работает вообще, если кондишн в одном случае ничего не возвращает
reALien добавил:
даже не так, хз как оно у тебя будет работать, если фукнция которая возвращает ничего возвращает значение
Старый 27.01.2011, 20:51
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
reALien, забыл дописать, но работает так же как и с return внутри
булеан она возвращает
Старый 27.01.2011, 20:53
reALien

offline
Опыт: 29,211
Активность:
из какой жопы ты вообще названия функций брал
ты тестил вообще?
вот я потестил и нет, не вызывается вообще ниразу
Старый 27.01.2011, 20:56
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
reALien, ты вообще прочитал, что я написал серым текстом?
Старый 27.01.2011, 20:59
reALien

offline
Опыт: 29,211
Активность:
Да, и при проверке на то, жив ли юнит на всей играбельной карте при то что там 100500 юнитов ни одного вызова
Старый 27.01.2011, 21:04
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
» раз уж все так сложно, то вот сам код
function GjBuff takes unit u, player p returns nothing
     UUnit = CreateUnit(p, 'e008', GetUnitX(u), GetUnitY(u), 270)
    BJDebugMsg(GetUnitName(u))
    UnitAddAbility(UUnit, 'A016')
    IssueTargetOrder(UUnit, "bloodlust", u)
endfunction

function GjCond takes nothing returns boolean
    if !IsUnitType(GetFilterUnit(), UNIT_TYPE_PEON) && IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) && GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.4 && !IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) then
        BJDebugMsg("GjBuff")
        //BJDebugMsg(GetUnitName(GetFilterUnit()))
        GjBuff(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit()))
        return false
    endif
    return false
endfunction

function Gjallarhorn takes player p, unit c returns nothing
    AbEfLoc("Abilities\\Spells\\Other\\HowlOfTerror\\HowlCaster.mdl", c)
    GroupEnumUnitsInRange(UGrp, GetUnitX(c), GetUnitY(c), 500, Condition(function GjCond))
    //GroupClear(UGrp)
endfunction
Что происходит: если было пикнуто даже 10 одинаковых юнитов, проверку проходит всего лишь один и функция GjBuff вызывается ровно 1 раз. Я не пойму, в чем я накосил. И с ретурном и без него иф делал и фильтер юнита на энум менял, не пахает как надо.
Старый 27.01.2011, 21:13
Nekit1234007

offline
Опыт: 11,916
Активность:
Я не понимаю почему у тебя вообще эта конструкция как либо работает, т.к. в фильтре надо юзать «Filter(...)», а не «Condition(...)».
Старый 27.01.2011, 21:29
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Nekit1234007, ничего не изменилось
Старый 27.01.2011, 21:31
Nekit1234007

offline
Опыт: 11,916
Активность:
2ое, емнип, в фильтрах не получится использовать «триггеринг» функции, такие как «GetSpellAbilityUnit()».
Старый 27.01.2011, 21:33
ScorpioT1000
Работаем
offline
Опыт: отключен
if CheckFilterUnit == true then
говнокод
if CheckFilterUnit then
норм код
Старый 27.01.2011, 21:52
Hanabishi
COOL STATUS
offline
Опыт: отключен
собственно, если исправить код:
function B takes nothing returns boolean
   if GetUnitTypeId(GetFilterUnit()) == 'hpea' then //для примера
      call C()
      return false
   endif
   return false
endfunction

function A takes nothing returns nothing
   call GroupEnumUnitsInRect(g, rect, Filter(function B))
endfunction
то в данном случае функция C будет вызываться для каждого фильтруемого юнита
Старый 27.01.2011, 21:55
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
В общем вся проблема в SpellAbilityUnit()..Заменив его на Player(0), мой код под катом заработал. Теперь не пойму, почему на ГУИ матчинг работает с использованием GetSpellAbilityUnit()?
Старый 27.01.2011, 22:16
Hanabishi
COOL STATUS
offline
Опыт: отключен
потому что гуи - сила (с)
так не может работать, ибо для GjCond не существует GetSpellAbilityUnit()
GetSpellAbilityUnit() можно вызвать только в action функции триггера, который обработал событие
Старый 27.01.2011, 22:26
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Nekit1234007, condition работает офигенно
Hanabishi, т.е. ты хочешь сказать, что
function Trig_Untitled_Trigger_004_Actions takes nothing returns nothing
    return GetFilterUnit() != GetSpellAbilityUnit()
endfunction
function Trig_Untitled_Trigger_004_Actions takes nothing returns nothing
    GroupEnumUnitsInRect(udg_g, GetPlayableMapRect(), Condition(function test))
endfunction

//===========================================================================
function InitTrig_Untitled_Trigger_004 takes nothing returns nothing
    set gg_trg_Untitled_Trigger_004 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_004, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( gg_trg_Untitled_Trigger_004, function Trig_Untitled_Trigger_004_Actions )
endfunction
SpellAbilityUnit() будет равен null в этом кондишине?
по секрету - он будет равен кастеру
Старый 27.01.2011, 22:45
Hanabishi
COOL STATUS
offline
Опыт: отключен
Vampirrr, да, будет возвращать null
Старый 27.01.2011, 22:46
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Hanabishi, нап, иди тесть
Vampirrr добавил:
в общем после долгого мозгонасилования я пришел к выводу, что SpellAbilityUnit() определяется везде правильно, но функция GjBuff вызывается всего 1 раз.

Отредактировано Vampirrr, 27.01.2011 в 23:07.
Старый 27.01.2011, 22:57
Hanabishi
COOL STATUS
offline
Опыт: отключен
Vampirrr, и правда робит в фильтре
нупанул, сорри
а 1 раз вызывается, в смысле один раз достигает места вызова, или достигает несколько раз, а вызывается только один?
вот так продебагай
function GjBuff takes unit u, player p returns nothing
     UUnit = CreateUnit(p, 'e008', GetUnitX(u), GetUnitY(u), 270)
    BJDebugMsg(GetUnitName(u))
    UnitAddAbility(UUnit, 'A016')
    IssueTargetOrder(UUnit, "bloodlust", u)
    BJDebugMsg("GjBuff end")
endfunction

function GjCond takes nothing returns boolean
    if !IsUnitType(GetFilterUnit(), UNIT_TYPE_PEON) && IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) && GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.4 && !IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) then
        BJDebugMsg("call GjBuff")
        GjBuff(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit()))
        return false
    endif
    return false
endfunction

function Gjallarhorn takes player p, unit c returns nothing
    AbEfLoc("Abilities\\Spells\\Other\\HowlOfTerror\\HowlCaster.mdl", c)
    GroupEnumUnitsInRange(UGrp, GetUnitX(c), GetUnitY(c), 500, Condition(function GjCond))
    //GroupClear(UGrp)
endfunction
и проверь оба ли сообщения одинаковое кол-во раз выходят
Старый 27.01.2011, 23:16
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Hanabishi, я так и дебагал. Что происходит: if срабатывает всего один раз.
Старый 27.01.2011, 23:21
Hanabishi
COOL STATUS
offline
Опыт: отключен
        return false
    endif
    return false
омг, функция в любом случае возвращает ложь=)
ещё попробуй так
function GjBuff takes unit u, player p returns nothing
     UUnit = CreateUnit(p, 'e008', GetUnitX(u), GetUnitY(u), 270)
    BJDebugMsg(GetUnitName(u))
    UnitAddAbility(UUnit, 'A016')
    IssueTargetOrder(UUnit, "bloodlust", u)
    BJDebugMsg("GjBuff end")
endfunction

function GjCond takes nothing returns boolean
    return !IsUnitType(GetFilterUnit(), UNIT_TYPE_PEON) && IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) && GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.4 && !IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)
endfunction

function GjEnum takes nothing returns nothing
    GjBuff(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit()))
endfunction

function Gjallarhorn takes player p, unit c returns nothing
    AbEfLoc("Abilities\\Spells\\Other\\HowlOfTerror\\HowlCaster.mdl", c)
    GroupEnumUnitsInRange(UGrp, GetUnitX(c), GetUnitY(c), 500, Condition(function GjCond))
    ForGroup(UGrp,function GjEnum)
    //GroupClear(UGrp)
endfunction
Старый 27.01.2011, 23:27
Ответ

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

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

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

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



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