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

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

Закрытая тема
 
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Неработает код
» code
Код:
function HBFilter takes nothing returns boolean
    return (IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) == false and GetUnitAbilityLevel(GetFilterUnit(),'Aloc')==0 and GetUnitAbilityLevel(GetFilterUnit(),'Avul')==0 and GetWidgetLife(GetFilterUnit())>.405 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false)
endfunction

function HBAction takes nothing returns nothing
    local unit c     = GetTriggerUnit()
    local group g  = CreateGroup()
    local unit q     = null
    local real fp    = 0
    local integer n = 0
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550,Condition(function HBFilter))
    loop
      set q = FirstOfGroup(g)
        ...
        call DisplayTextToPlayer(Player(0),0,0,I2S(n)+GetUnitName(q))
        call GroupRemoveUnit(g,q)
      exitwhen q == null
    endloop
// до этой строки все работает, а дальше нифига
    call GroupClear(g)
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550,Condition(function HBFilter))
    loop
      set q = FirstOfGroup(g)
        ...
        call DisplayTextToPlayer(Player(0),0,0,GetUnitName(q)+" - new")
        call GroupRemoveUnit(g,q)
      exitwhen q == null
    endloop
    call DestroyGroup(g)
    set g = null
    set c = null
endfunction

почему действия после первого цикла не выполняются?
зы: пробовал через 2 группы - результат тот же
Старый 05.05.2009, 16:06
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Код:
globals
    group g=CreateGroup()
endglobals

function HBFilter takes nothing returns boolean
    local unit u=GetFilterUnit()
    if not(IsUnitType(u,UNIT_TYPE_ANCIENT)) and GetUnitAbilityLevel(u,'Aloc')==0 and GetUnitAbilityLevel(u,'Avul')==0 and GetWidgetLife(u)>0.405 and not(IsUnitType(u,UNIT_TYPE_STRUCTURE)) then
        call DisplayTextToPlayer(Player(0),0,0,GetUnitName(u))
    endif
    set u=null
    return false
endfunction

function HBAction takes nothing returns nothing
    local unit c =GetTriggerUnit()
    local real fp    = 0
    local integer n = 0
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550,Condition(function HBFilter))
    call TriggerSleepAction(2.00)//Разумеется только для теста, чтоб разделить имена юнитов =)
    call ClearTextMessages()//Разумеется только для теста, чтоб разделить имена юнитов =)
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550,Condition(function HBFilter))
    set c = null
endfunction
Старый 05.05.2009, 16:17
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Hellfim, ненене) нельзя. на месте трех точек может быть любой код, и в первом и во втором циклах он разный (... != ...)
так что это не решение. кстати, ты хоть уверен в том, что при втором пике выбьются имена юнитов?)
и DisplayTextToPlayer я использовал просто для теста (типа debugmsg), дабы узнать, на каком месте код перестает работать
зы: и чем же condition==false хуже not(condition)?

Enein добавил:
и зачем тут глобалка?
лишние 2 строки...
Старый 05.05.2009, 16:28
alexkill

offline
Опыт: 18,872
Активность:
Enein, во втором посте все правильно (читай "не по-индусски" привет ADOLF'у)написано (за исключением того, что нужны разные значения при каждом из пиков).
» раскрыть

Код:
globals
   group g = CreateGroup()
   filterfunc ff = null
   boolean b = false
endglobals

function HBFilter takes nothing returns boolean
    local integer n = 0
    local unit f = GetFilterUnit()
      if IsUnitType(f, UNIT_TYPE_ANCIENT) == false and GetUnitAbilityLevel(f,'Aloc')==0 and GetUnitAbilityLevel(f,'Avul')==0 and GetWidgetLife(f)>0 and IsUnitType(f, UNIT_TYPE_STRUCTURE) == false then
        if not b then
          call DisplayTextToPlayer(Player(0),0,0,I2S(n)+GetUnitName(f))
        else
          call DisplayTextToPlayer(Player(0),0,0,GetUnitName(f)+" - new")
        endif  
      endif
    set f = null  
    return false
endfunction

function HBAction takes nothing returns nothing
    local unit c = GetTriggerUnit()
    local real fp = 0
    set ff = Filter(function HBFilter)
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550, ff)
    call GroupClear(g)
    set b = true
    call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),550, ff)
    call GroupClear(g)
    set b = false
    set c = null
endfunction

Отредактировано alexkill, 05.05.2009 в 17:22.
Старый 05.05.2009, 16:32
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
alexkill, спасибо
но все же у меня осталось пару вопросов:
1) чем отличаются condition==false от not(condition), и что быстрей
2) почему действия после первого цикла не выполняются?
Старый 05.05.2009, 17:23
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
  1. Отличаются сравнением. Сравнение медленнее, чем not.
  2. Хз, попробуй перед GroupClear поставить вэйт(для теста).
Старый 05.05.2009, 17:34
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Цитата:
попробуй перед GroupClear поставить вэйт(для теста)

безрезультатно
Старый 05.05.2009, 19:07
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Не вижу смысла в действии GroupClear(g). Говорите, группу очищает?
1. Если юзать цикл с удалением юнита из группы, то что останется после цикла в группе? Правильно, ничего. Значит, чистить необязательно.
2. GroupEnum в любом случае чистит группу перед набором новых юнитов. Проверено.

Enein, у тебя к тому же цикл был неправильно построен, вот как он делается правильно:
Код:
// . . .
loop
  set u = FirstOfGroup(g)
  exitwhen u == null
  call GroupRemoveUnit(g, u)
  // your actions
endloop
Старый 05.05.2009, 19:20
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
а точно до той строки, поставь ещё пару DisplayTeToPlayer, чтобы наверника

ELDAR добавил:
Цитата:
GetUnitAbilityLevel(GetFilterUnit(),'Aloc')==0

тоже лишнее, локустов не пикает
Старый 05.05.2009, 19:23
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Цитата:
1. Если юзать цикл с удалением юнита из группы, то что останется после цикла в группе? Правильно, ничего. Значит, чистить необязательно.
2. GroupEnum в любом случае чистит группу перед набором новых юнитов. Проверено.

ок, ок
Цитата:
локустов не пикает

спасибо ^^, незнал
Цитата:
у тебя к тому же цикл был неправильно построен

незнаю, я всегда делал так, и вроде бы все было норм. это первый случай, когда возникли проблемы с перебором юнитов в цикле (как оказалось, из-за неправильного построения самого цикла T_T)
ShadoW DaemoN, спасибо ^^
тему можно закрыть.
Старый 05.05.2009, 21:58
Закрытая тема

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

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

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

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



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