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

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

Ответ
 
DeT

offline
Опыт: 5,715
Активность:
Трабл
Скажите почему событие не срабатывает?



Код:
//udg_I_Units : array of unit
//udg_I_UNum : integer
//udg_I_Buf : integer
//udg_I_Triggers : array of trigger

function I_Func takes nothing returns nothing
    if (IsUnitIllusion(GetEnumUnit())) then
        set udg_I_Units[udg_I_Buf] = GetEnumUnit()
        call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Клон:" + GetUnitName(GetEnumUnit()) )
        set udg_I_Buf = udg_I_Buf + 1
        set udg_I_UNum = udg_I_UNum + 1
    else
    endif
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Количество: " + I2S(udg_I_UNum))
endfunction

function I_Damaged takes nothing returns nothing
    local effect e
    call SetUnitLifeBJ( udg_I_Units[13] , ( GetUnitStateSwap(UNIT_STATE_LIFE, udg_I_Units[13]) + GetEventDamage() ) )
    call AddSpecialEffectTargetUnitBJ( "chest", udg_I_Units[13], "Abilities\\Spells\\Other\\Silence\\SilenceAreaBirth.mdl" )
    set e = GetLastCreatedEffectBJ()
    call PolledWait( 0.50 )
    call DestroyEffectBJ( e ) 
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Событие обработано")  
endfunction

function I_CTriggers takes nothing returns nothing
    local integer a = 0
    loop
    exitwhen (a > udg_I_UNum)
        set udg_I_Triggers[a] = CreateTrigger()
        call TriggerRegisterUnitEvent( udg_I_Triggers[a], udg_I_Units[a], EVENT_UNIT_DAMAGED )
        call TriggerAddAction( udg_I_Triggers[a], function I_Damaged )
        call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Событие зарегистрировано")
        set a = a + 1
    endloop
    set a = 0
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Триггеры созданы")
endfunction

function I_Search4I takes nothing returns nothing
    set udg_I_Units[13] = GetTriggerUnit()
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "Герой:" + GetUnitName(udg_I_Units[13]) )
    set udg_I_Buf = 0
    set udg_I_UNum = 0
    call ForGroupBJ( GetUnitsInRangeOfLocAll(900.00, GetUnitLoc(udg_I_Units[13])), function I_Func )
    call I_CTriggers()
    set udg_I_Buf = 0
    call DestroyGroup(GetLastCreatedGroup())
endfunction

че не так?:(

как-будто че-то не то с событием и оно на иллюзии не работает... :хз:

хэлп :)

Отредактировано DeT, 02.02.2007 в 11:49.
Старый 30.01.2007, 23:05
DioD

offline
Опыт: 45,134
Активность:
всё просто, ты не создал триггер.
(IsUnitIllusion(GetEnumUnit()))

должно быть скомпоновано с true или false
Старый 30.01.2007, 23:17
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DioD жжош =) IsUnitIllusion возвращает буль а нам больше и не нада!

DeT
1) з а ч е м т а к п и с а т ь ?
2) какой текст тебе выдаёт а какой нет ?
Старый 30.01.2007, 23:26
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
(IsUnitIllusion(GetEnumUnit())) должно приравниваться к чему-то в условии, тру или фолс, а в фильтре может просто булькать.

FellGuard добавил:
Ибо нам действие выполнять можно как при тру так и при фолс.

FellGuard добавил:
DeT, поправь и проверь (IsUnitIllusion(GetEnumUnit()) == true)
Старый 31.01.2007, 09:46
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DeT попробуй в функции "I_Search4I" первый раз устанавливать "set udg_I_Buf=1" а не "0".

FellGuard в случае если это иллюзия (IsUnitIllusion(GetEnumUnit()) == true) будет равно "true==true" а зачем нам два true ?
Старый 31.01.2007, 12:34
DioD

offline
Опыт: 45,134
Активность:
должно быть !=false
Старый 31.01.2007, 12:45
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
я фшоке! вы не там ошибку ищете!!! создайте такой триггер:
Код:
function Trig_Iselect_Actions takes nothing returns nothing
 if IsUnitIllusion(GetTriggerUnit()) then
  call DisplayTimedTextToPlayer(Player(0),0,0,10,"ILLUSION")
 endif
endfunction

//===========================================================================
function InitTrig_Iselect takes nothing returns nothing
    set gg_trg_Iselect=CreateTrigger()
    call TriggerRegisterPlayerSelectionEventBJ(gg_trg_Iselect,Player(0),true)
    call TriggerAddAction(gg_trg_Iselect,function Trig_Iselect_Actions)
endfunction
и Блейдмастера на карте, потестируйте и не пудрите человеку мозги!
Старый 31.01.2007, 13:01
DeT

offline
Опыт: 5,715
Активность:
FellGuard,MrSmiLe ппц, как бы вам сказать по умолчанию обычно (не говорюю о жассе ,т.у. в не м не знаток) если пишешь If truue then будет работать всегда
у нас же если юнит не иллюзия, то тада не работает :)


зы: с этим куском все правильно...там сообщениые выдается.

Цитата:
всё просто, ты не создал триггер.


а поточнее?

кстати, на hive'e мне эти дэбилы написали чтобы БЖ не юзал...чем BJ от обычных отличается?????
хз...чтонетак в коде..уже третий лень парюсь..=\
Старый 31.01.2007, 15:31
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Я уже понял, спор был с Диодом, но он потер посты Просто большой разницы нет поставить ли там == или нет, например условие-фильтр может выглядеть и так
Цитата:
if (IsUnitIllusion(GetEnumUnit()) == false) then
Цитата:
if not(IsUnitIllusion(GetEnumUnit())) then
I_CTriggers - ты эту функцию вызываеш при инициализации или в процессе?

FellGuard добавил:
Код:
function InitTrig_... takes nothing returns nothing
    . . . // register events, add actions, add conditions, other
endfunction


FellGuard добавил:
Вроде-бы суффикс БЖ - индекс обработаной в blizzard.j функции из common.j
Код:
function name takes ... returns ...  //в common.j
    . . .
endfunction

function nameBJ takes ... returns ...  //в blizzard.j
    . . .
    call name(...)
endfunction
Старый 31.01.2007, 15:49
DeT

offline
Опыт: 5,715
Активность:
FellGuard
естесно нету разницы большой...=\

объясните плиз доходчиво идиоту в чем проблема?:(

DeT добавил:
I_CTriggers вызывается в I_Search4I а она при завершении каста "Иллюзии"
Старый 31.01.2007, 16:40
DioD

offline
Опыт: 45,134
Активность:
попробуй парсить в регестрацию события не массив, багов много мало ли что у близов в голове.
жалко что твой код невозможно править, нет ни карты ни точного объяснения о том что он должен делать.
Старый 31.01.2007, 16:44
DeT

offline
Опыт: 5,715
Активность:
щаз карту дам диод...вот линк: http://slil.ru/23850175

смысл:
1.чел юзает иллюзии(их кол-во зависит от уровня)
2.Если иллюзию атакут, то челу прибавляется жизни.

сделал массив с триггерами для каждой иллюзии и в них события на дамаг юнита
Старый 31.01.2007, 16:48
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
DeT, если у тебя создается триггер, который на протяжении всей игры будет отлавливать событие каста, с условиями и последующими действиями - и если ты его ни в каком действующем триггере не вызываеш (т.е. отлавливающий триг должен быть инициализирован вместе с картой)
То в твоей функции I_CTriggers должна быть приставка InitTrig_ (итого: InitTrig_I_CTriggers), и быть она должна в самом конце, ниже всех вышепрописаных ф-ий, включенных в триггер.

FellGuard добавил:
А, долго писал пост, опоздал . Но кстати, всеравно проверь.
Старый 31.01.2007, 16:54
DeT

offline
Опыт: 5,715
Активность:
хм..аэто обязательно?

DeT добавил:
FellGuard не.пасип, это не то...

I_CTRiggers отвечает за динамическое создание триггеров!
Старый 31.01.2007, 16:55
DioD

offline
Опыт: 45,134
Активность:
карты можно атачем вкладывать, ибо это не скриншот.
проблема в том что иллюзии создаются после завершения каста абилы и не попадают в группу вообще.
лечить это можно только созданием триггера что будет ловить вхождение иллюзий на карту.
Старый 31.01.2007, 16:58
DeT

offline
Опыт: 5,715
Активность:
хм...странно..а если там вейт вставить?
скажем на полторы секунды?
зы: второй раз заюзай!!!
Старый 31.01.2007, 17:03
DioD

offline
Опыт: 45,134
Активность:
второй раз убивает иллюзии от первого, поллед вэйт помогает но это не дело.
Старый 31.01.2007, 17:05
DeT

offline
Опыт: 5,715
Активность:
DioD мега респект!
все рбаотает!!!

кстати: как спелл?:)
там еще коэффицент..а то слишком лихо регится...

я посмтарю и еще откомментю тут..не клоз плиз
Старый 31.01.2007, 17:09
DeT

offline
Опыт: 5,715
Активность:
так...тока решил одну проблему встала другая...
вот:


Вопрос: будет ли работать в качестве условия триггера такая вотЪ конструкция ?



Код:
function DS_CCasted takes nothing returns boolean
    local integer a = 0
    loop
    exitwhen a>udg_DS_Num
        if ( GetSpellAbilityUnit() == udg_DS_Units[a] ) then
            return true
        endif
        set a = a + 1
        return false
    endloop
endfunction



» Весь код
Код:
//udg_DS_CTrigger : trigger - 

//udg_DS_Units : array unit  - 

//udg_DS_Num : integer - 

//udg_DS_Level : integer  - 

//udg_DS_Timer : timer - 



function DS_ClearA takes nothing returns nothing

    local integer a = 0

    loop

    exitwhen a>udg_DS_Num

        call RemoveUnit(udg_DS_Units[a])

        set udg_DS_Units[a] = null

        set a = a + 1

    endloop

    set udg_DS_Num = 0

    call DestroyTimer(udg_DS_Timer)

    set udg_DS_Timer = null

    set udg_DS_Level = 0

    call DestroyTrigger(udg_DS_CTrigger)

    set udg_DS_CTrigger=null

endfunction



function DS_ACasted takes nothing returns nothing

    call CreateUnit(Player(0),'h000', GetUnitX(udg_DS_Units[101]) , GetUnitY(udg_DS_Units[101]) , 1)

    call UnitDamageTargetBJ( GetLastCreatedUnit(), GetSpellAbilityUnit(), udg_DS_Level*40, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )

    call IssuePointOrderLocBJ( GetLastCreatedUnit(), "silence", GetUnitLoc(GetSpellAbilityUnit()) )

    call PolledWait(0.05)

    call RemoveUnit(GetLastCreatedUnit() )

endfunction

function DS_CCasted takes nothing returns boolean

    local integer a = 0

    loop

    exitwhen a>udg_DS_Num

        if ( GetSpellAbilityUnit() == udg_DS_Units[a] ) then

            return true

        endif

        set a = a + 1

        return false

    endloop

endfunction



function DS_PUnits takes nothing returns nothing

    if (GetOwningPlayer(GetEnumUnit()) != GetOwningPlayer(udg_DS_Units[101]) ) and (PlayersAreCoAllied(GetOwningPlayer(GetEnumUnit(),udg_DS_Units[101]) != true ) then

        set udg_DS_Units[udg_DS_Num] = GetEnumUnit()

        set udg_DS_Num = udg_DS_Num + 1

    else

    endif

endfunction

function DS_Casting takes nothing returns nothing

    call DS_ClearA()

    set udg_DS_Num = 0

    set udg_DS_Units[101] = GetTriggerUnit()

    set udg_DS_Level = DecUnitAbilityLevel(udg_DS_Units[101])

    call ForGroupBJ( GetUnitsInRangeOfLocAll(udg_DS_Level*300, GetUnitLoc(udg_DS_Units[101])), function DS_PUnits )

    call DestroyGroup(bj_lastCreatedGroup)

    set udg_DS_CTrigger = CreateTrigger()

    call TriggerRegisterAnyUnitEventBJ(udg_DS_CTrigger, EVENT_PLAYER_UNIT_SPELL_EFFECT)

    call TriggerAddCondition(udg_DS_CTrigger, function DS_CCasted )

    call TriggerAddAction( udg_DS_CTrigger, function DS_ACasted )

endfunction

Отредактировано DeT, 02.02.2007 в 11:49.
Старый 02.02.2007, 11:07
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
DeT, будет возвращать только первое из соответствующих значений или фолс. А почему loop не вынести в код карты?
Старый 02.02.2007, 11:13
Ответ

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

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

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

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



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