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

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

Ответ
 
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
GetEnumUnit - не верное определение владельца юнита
Не будет ли так любезен, волшебный XGM объяснить, как обойти такую проблему:

Есть функция ForGroup, использующая функция GetEnumUnit (Picked Unit в триггерах), так вот вопрос - почему GetEnumUnit не улавливает владельца (т.е. игрока, владеющего юнитом) можно ли это как нибудь обойти?

Предвижу вопрос на счёт код, вот он пожалуйте:

Код:
function Trig_CAST_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'AUdc' ) ) then
        return false
    endif
    return true
endfunction

function Trig_CAST_Func1 takes nothing returns boolean
    local unit cast = GetSpellAbilityUnit ( )
    local integer i = GetConvertedPlayerId (GetOwningPlayer(GetEnumUnit( ) ) )
    call DisplayTextToForce( GetPlayersAll ( ), I2S ( i ) )
    return ( IsUnitAlly ( GetEnumUnit ( ) , GetOwningPlayer ( cast ) ) == true )
endfunction

function Trig_CAST_Func2 takes nothing returns nothing
    call DoNothing(  )
endfunction

function Trig_CAST_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRangeOfLocMatching ( 512 , GetUnitLoc ( GetSpellAbilityUnit( )), Condition(function Trig_CAST_Func1)), function Trig_CAST_Func2 )
endfunction

//===========================================================================
function InitTrig_CAST takes nothing returns nothing
    set gg_trg_CAST = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_CAST, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_CAST, Condition( function Trig_CAST_Conditions ) )
    call TriggerAddAction( gg_trg_CAST, function Trig_CAST_Actions )
endfunction


работает так: юнит кастует спелл во врага и на экране выводятся числа - соответствующие номеру игрока владеющим юнитом для которого совершается ForGroup

Для теста я поставил 5 юнитов принадлежащих разным игрокам в кучку, но на экране всега выводится 1 (т.е. номер игрока которым я кастую спелл)
Старый 26.03.2008, 20:21
Лось

offline
Опыт: 7,223
Активность:
Всё улавливается, у тебя изза вот этой ф-ии может выдаваться не тот ID:

Код:
function GetConvertedPlayerId takes player whichPlayer returns integer
    return GetPlayerId(whichPlayer) + 1
endfunction

Если вообше не выдаётся никакой значит на группу действие не производится (и не надо GUI2Jass использовать).
Старый 26.03.2008, 20:39
J
expert
offline
Опыт: 48,447
Активность:
потомуфто ты используеш действия в ФИЛЬТЕР функции, а не в АКШЕН функции

и там используется НЕ пикед юнит - GetEnumUnit()

А матчинг юнит (или как там) - GetFilterUnit()

Jon добавил:
И вообще что за говнокодинг, делай так:
Код:
function Trig_CAST_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AUdc'
endfunction

function Trig_CAST_GroupFilter takes nothing returns boolean // Сдесь функция обработчкиу является - GetFilterUnit()
    return IsUnitEnemy (GetSpellAbilityUnit(), GetOwningPlayer(GetFilterUnit()))
endfunction

function Trig_CAST_GroupAction takes nothing returns nothing // Сдесь функция обработчкиу является - GetEnumUnit()
    local integer i = GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit()))
    call DisplayTextToForce(bj_FORCE_ALL_PLAYERS, I2S(i))
endfunction

function Trig_CAST_Actions takes nothing returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsInRange(g, GetUnitX(GetSpellAbilityUnit()), GetUnitY(GetSpellAbilityUnit()), 512, Condition(function Trig_CAST_GroupFilter))
    call ForGroup(g, function Trig_CAST_GroupAction)
    call DestroyGroup(g)
    set g = null
endfunction

function InitTrig_CAST takes nothing returns nothing
    set gg_trg_CAST = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_CAST,EVENT_PLAYER_UNIT_SPELL_CAST            )
    call TriggerAddCondition          (gg_trg_CAST,Condition(function Trig_CAST_Conditions))
    call TriggerAddAction             (gg_trg_CAST,          function Trig_CAST_Actions    )
endfunction
Старый 26.03.2008, 20:53
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Мда...спс Jon - а как определить какие функции что улавливают? Чем отличаются ForGroup и GroupEnumUnitsInRange и как узнать какие функции к ним применимы?
Может поделишся секретом как узнавать это?)
P.S. ну а, говно кодинг - извеняй, я ещё нуп
Старый 27.03.2008, 00:00
J
expert
offline
Опыт: 48,447
Активность:
GroupEnumUnitsInRange (gr, X, Y, R, expr)


gr - уже созданая группа, в нее заносятся все юнитыв радиусе R от точки (X, Y), Но при том заносятся те юниты которые удовлетворяют условию фильтр функции expr.
Она обьявляется так:
Condition(function Function123)
ну или конкретнее так:
Filter(function Function123_Filter)

Эта функция срабатывает для КаЖдОгО юнита в требуемой радиусной области, и расматриваемый юнит равен GetFilterUnit()



ForGroup (gr, func)


Совершено ничего не делает с самой группой, просто перебирает всех юнитов в ней и для каждого использует функию func
Она обьявляется просто так:
function Function123_Action

Эта функция срабатывает для КаЖдОгО юнита в группе, условие никакого в большенстве случаев не труебуется потомучто мы уже использовали условие когда заносили в эту группу юнитов функцией
GroupEnumUnitsInRange (gr, X, Y, R, expr), и расматриваемый юнит равен GetEnumUnit()
Старый 27.03.2008, 00:30
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
И вообще что за говнокодинг, делай так:

ахахаха) у тя кста тоже)
Код:
globals
 group gr_temp=CreateGroup()
 player p_temp=null
endglobals

function xXx takes nothing returns boolean
 if IsUnitEnemy(GetFilterUnit(), p_temp)then
  call BJDebugMsg(I2S(GetPlayerId(GetFilterUnit())))
 endif
 return false
endfunction

...
 set p_temp=GetOwningPlayer(GetTriggerUnit())
 call GroupEnumUnitsInRange(g, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 512., Condition(function xXx))


TT когда вы научитесь норм кодить что бы пришел Тс или я и сказали "да, вот это тру, маладец"
это просто ужос=/
Старый 27.03.2008, 12:32
Ответ

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

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

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

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



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