В общем есть способность похожая на первый скил Лансера из Доты
Создаются больше одной иллюзии кастера, когда с противником сталкивается снаряд, и перемещаются к противнику
Поиск иллюзий делал через пик юнитов рядом с кастером 2мя вариантами:
  1. первый через фильтр
  2. просто брал всех юнитов и уже там делал условия на пикед юнитах
Ну а теперь самый прикол, когда добавляю проверку на IsUnitIllusion == true, то оно тупо не находит иллюзии
Если ставлю IsUnitIllusion == false, то оно других юнитов считает как не иллюзии (ну это понятно), но и САМИ ИЛЛЮЗИИ ОПРЕДЕЛЯЛ КАК НЕ ИЛЛЮЗИИ!
Сделана способность на джасе
Иллюзии создаются способностью от предмета жезл иллюзий
Ну и прикол номер 2: Есть другая карта с примерно такой же в исполнении способностью, только на триггерах, и ТАМ ВСЁ РАБОТАЕТ!
Вопрос: Какое магическое заклинание надо произнести, чтобы это заработало!? Только прям чтобы наверняка
P.S. Ну и ещё хочется добавить, что у меня нереально бомбит, потому что я 2 часа колбасился с этой проверкой и так ничего не получил, а ещё вдвойне от того, что я узнал, что способности на основе Канал наносят 0.00 урона, что просто прям "подливает дёгтя в мою медовую мапу" =/ (не создавать же для этого отдельный ресурс)

Принятый ответ

Вот это чо за рак мозга? Какие еще локалки в фильтре с ифами? Ну с таким не удивительно что не работает.
Да всё работает, вообще-то
quq_CCCP:
Примерно так слабо?
И в чём смысл делать глобалку, а не просто писать тогда уж сразу GetFilterUnit( )
Я сдеал локалку, чтобы вместо GetFilterUnit( ) писать то, что мне нужно, в данном случае CLONE
quq_CCCP:
Потом клонов от способностей ищут не так,
Да так и я их могу найти
Точнее не совсем так, я их искал через Юнит входит в Область ( Игровая зона )
Но искать их в другом триггере и сдругим событием мне нафиг не нужно.
Мне нужно найти иллюзии сразу в триггере со способностью, чтобы потом не было геморроя
========================
И ещё раз повторюсь, что при повторном использовании способности, 2 прошлые иллюзии (да и вообще в принципе если рядом с гером будут другое любое ко-во иллюзий) перемещаются к противнику. Но две новосозданные остаются на месте.
Так же повторюсь, что когда проверка была IsUnitIllusion == false, то иллюзии определяло как не иллюзии!
Все кто пытались помочь, похоже проигнорировали это замечание...
========================
Мой вывод таков: Иллюзиям, призванным через стандартную Способность (Предмет: Иллюзии) присваивается статус иллюзий слегка позже, чем происходит проверка.
С другой стороны, скорее всего это может и можно как-то обойти, ведь есть карты примеры, где подобное работает нужным образом.
О том, как устроены чёртовы способности близов стоит только догадываться =\
К счастью Способность (Предмет: Иллюзии) не наносит 0.00 урона, и за это близам огромное спасибо (что у меня в очередной раз не бомбануло)
А вообще, проще по-моему сделать свою игру, чем нормальную карту в варкрафте -_-

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
0
22
6 лет назад
Отредактирован PROSHELDOTU
0
ну возможно они еще не созданы при касте, поэтому лови через определенное время таймером (0.00 сек или 0.01 и так далее). Лучше проверять событием - юнит вызывает боевую единицу, засовывать в группу и так далее
Так прикол в том что в другой карте всё работает нормально.
Да и в первой карте как юнитов их определяет, но как иллюзии нет.
Proshel_Doty:
Стоит ещё учесть, что когда проверка была IsUnitIllusion == false, как я сказал ранее, то иллюзии определяло как не иллюзии
Т.е. ещё одно предположение, что когда создаются иллюзии на основе способности Предмет:Иллюзии, иллюзиям присваивается статус иллюзий слегка позже, чем происходит проверка на этот статус иллюзий
Никогда никаких проблем не было
IsUnitType(u,UNIT_TYPE_HERO) возвращет true ТОЛЬКО для героев, это фишка такая
иллюзии-герои включаются в фильтр через IsUnitIdType(GetUnitTypeId(u),UNIT_TYPE_HERO)
Та при чём тут вообще проверка на героя, блин
Кто-то завёз сюда эту дичь и других отвлекает
У меня нет проверки на героя
quq_CCCP:
Proshel_Doty, говорю же, код в студию
function IllusionFilter takes nothing returns boolean
local unit CLONE = GetFilterUnit()
local unit CASTer = LoadUnitHandle( udg_Hash, GetHandleId(GetExpiredTimer()), 1 )
if IsUnitIllusion( CLONE ) == true and IsPlayerAlly( GetOwningPlayer( CLONE ), GetOwningPlayer( CASTer ) ) and GetUnitTypeId( CLONE ) == GetUnitTypeId( CASTer ) then
    set CLONE = null
    set CASTer = null
    return true
else
    set CLONE = null
    set CASTer = null
    return false
endif
endfunction

function IllusionDetect takes nothing returns nothing
    local unit CASTer = udg_Game_CASTer
    local unit CASTed = udg_Game_CASTed
    local unit CLONE = GetEnumUnit()
    local real cstdX = GetUnitX( CASTed )
    local real cstdY = GetUnitY( CASTed )
    local real clnX = GetUnitX( CLONE )
    local real clnY = GetUnitY( CLONE )
    local real ANGto = 57.296 * Atan2( cstdY - clnY, cstdX - clnX)
    local real ANGbk = 57.296 * Atan2( clnY - cstdY, clnX - cstdX)
    if IsUnitIllusion( CLONE ) == true then
    call DisplayTextToPlayer( Player(0), 0, 0, "1")
    if GetUnitTypeId( CLONE ) == GetUnitTypeId( CASTer ) then
    call DisplayTextToPlayer( Player(0), 0, 0, "2")
    if GetOwningPlayer( CLONE ) == GetOwningPlayer( CASTer ) then
    call DisplayTextToPlayer( Player(0), 0, 0, "3")
        call SetUnitX( CLONE, cstdX + 32*Cos( ANGbk * bj_DEGTORAD ) )
        call SetUnitY( CLONE, cstdY + 32*Sin( ANGbk * bj_DEGTORAD ) )
        call SetUnitFacing( CLONE, ANGto )
        call IssueTargetOrder( CLONE, "attack", CASTed )
    endif
    endif
    endif
endfunction

function ShadowClonesMissile takes nothing returns nothing
    local timer TMRab = GetExpiredTimer()
    local integer HNDL = GetHandleId( TMRab )
    local integer i = 1
    local unit CASTer = LoadUnitHandle( udg_Hash, HNDL, 1 )
    local unit CASTed = LoadUnitHandle( udg_Hash, HNDL, 2 )
    local unit MISSILE = LoadUnitHandle( udg_Hash, HNDL, 3 )
    local unit array DUMMY
    local group CLONES = CreateGroup()
    local real cstrX = GetUnitX( CASTer )
    local real cstrY = GetUnitY( CASTer )
    local real cstdX = GetUnitX( CASTed )
    local real cstdY = GetUnitY( CASTed )
    local real mslX = GetUnitX( MISSILE )
    local real mslY = GetUnitY( MISSILE )
    local real ANGto = 57.296 * Atan2( cstdY - mslY, cstdX - mslX)
    local real ANGbk = 57.296 * Atan2( mslY - cstdY, mslX - cstdX)
    local real DIST = SquareRoot( ( ( cstdX - mslX ) * ( cstdX - mslX ) ) + ( ( cstdY - mslY ) * ( cstdY - mslY ) ) )
    if DIST < 32.00 then
        call FlushChildHashtable( udg_Hash, HNDL )
        call DestroyTimer( TMRab )
        call DestroyEffect( AddSpecialEffect( "war3mapImported\\EffectShadowMissile.mdl", mslX, mslY ) )
        loop
            exitwhen i > 2
            set DUMMY[i] = CreateUnit( GetOwningPlayer( CASTer ), 'e000', GetUnitX( CASTer ), GetUnitY( CASTer ), ANGto )
            call UnitApplyTimedLife( DUMMY[i], 'BTLF', 0.50 )
            call UnitAddAbility( DUMMY[i], 'A084' )
            call IssueTargetOrderById( DUMMY[i], 852274, CASTer)
            set i = i + 1
        endloop
        set udg_Game_CASTer = CASTer
        set udg_Game_CASTed = CASTed
        call GroupEnumUnitsInRange( CLONES, cstrX, cstrY, 256.00, Condition(function IllusionFilter ) )
        call ForGroup( CLONES, function IllusionDetect )
        call RemoveUnit( MISSILE )
    else
        call SetUnitFacing( MISSILE, ANGto )
        call SetUnitX( MISSILE, mslX + 10*Cos( ANGto * bj_DEGTORAD ) )
        call SetUnitY( MISSILE, mslY + 10*Sin( ANGto * bj_DEGTORAD ) )
    endif

    set CASTer = null
    set CASTed = null
    set MISSILE = null
    set DUMMY[1] = null
    set DUMMY[2] = null
    call DestroyGroup( CLONES )
    set TMRab = null
endfunction

function Trig_ShadowClones_Actions takes nothing returns nothing

    //Основные локальные переменные
    local unit CASTer = udg_Game_CASTer
    local unit CASTed = udg_Game_CASTed
    local unit MISSILE
    local location CASTerLOC = udg_Game_CASTerLOC
    local location CASTedLOC = udg_Game_CASTedLOC
    local real ANGto = udg_Game_ANGto
    local real ANGbk = udg_Game_ANGbk
    local integer AbLVL = udg_Game_ABILLVL

    //Локальные переменные конкретной способности
    local timer TMRab = CreateTimer()
    local integer HNDL = GetHandleId( TMRab )
    
    //Работа способности
    set MISSILE = CreateUnit( GetOwningPlayer( CASTer ), 'e00V', GetUnitX( CASTer ), GetUnitY( CASTer ), ANGto )
    call SetUnitPathing( MISSILE, false )
    call SetUnitX( MISSILE, GetUnitX( CASTer ) )
    call SetUnitY( MISSILE, GetUnitY( CASTer ) )
    call SetUnitFacing( MISSILE, ANGto )
    call SaveUnitHandle( udg_Hash, HNDL, 1, CASTer )
    call SaveUnitHandle( udg_Hash, HNDL, 2, CASTed )
    call SaveUnitHandle( udg_Hash, HNDL, 3, MISSILE )
    call SaveReal( udg_Hash, HNDL, 4, ANGto )
    call SaveReal( udg_Hash, HNDL, 5, ANGbk )

    call TimerStart( TMRab, 0.02, true, function ShadowClonesMissile )

    set CASTer = null
    set CASTed = null
    set MISSILE = null
    call RemoveLocation( CASTerLOC )
    call RemoveLocation( CASTedLOC )
    set CASTerLOC = null
    set CASTedLOC = null
    set TMRab = null
endfunction

//===========================================================================
function InitTrig_ShadowClones takes nothing returns nothing
    set gg_trg_ShadowClones = CreateTrigger(  )
    call TriggerAddAction( gg_trg_ShadowClones, function Trig_ShadowClones_Actions )
endfunction
Этот триггер запускается другим общим триггером, где отлавливаются все способности.
0
32
6 лет назад
0
function IllusionFilter takes nothing returns boolean
local unit CLONE = GetFilterUnit()
local unit CASTer = LoadUnitHandle( udg_Hash, GetHandleId(GetExpiredTimer()), 2 )
if IsUnitIllusion( CLONE ) == true and IsPlayerAlly( GetOwningPlayer( CLONE ), GetOwningPlayer( CASTer ) ) and GetUnitTypeId( CLONE ) == GetUnitTypeId( CASTer ) then
    set CLONE = null
    set CASTer = null
    return true
else
    set CLONE = null
    set CASTer = null
    return false
endif
endfunction
Вот это чо за рак мозга? Какие еще локалки в фильтре с ифами? Ну с таким не удивительно что не работает.
globals
 unit bj_lastFilterUnit = null
 unit bj_lastCastedUnit = null
endglobals

function IllusionFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return ( GetUnitState( bj_lastFilterUnit,  UNIT_STATE_LIFE ) > 0.405 and IsUnitIllusion( bj_lastFilterUnit ) and IsUnitOwnedByPlayer( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) )
endfunction
Примерно так слабо?
Потом клонов от способностей ищут не так,
function Trig_GetLastCreatedIllusion_Conditions takes nothing returns boolean
    return ( IsUnitIllusion( GetSummonedUnit( ) ) )
endfunction

function Trig_GetLastCreatedIllusion_Actions takes nothing returns nothing
    set bj_lastCreatedUnit = GetSummonedUnit( )
endfunction

//===========================================================================
function InitTrig_GetLastCreatedIllusion takes nothing returns nothing
    set gg_trg_GetLastCreatedIllusion = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_GetLastCreatedIllusion, EVENT_PLAYER_UNIT_SUMMON )
    call TriggerAddCondition( gg_trg_GetLastCreatedIllusion, Condition( function Trig_GetLastCreatedIllusion_Conditions ) )
    call TriggerAddAction( gg_trg_GetLastCreatedIllusion, function Trig_GetLastCreatedIllusion_Actions )
endfunction

// используется это вот так
call IssueTargetOrder( dummy, "wandofillusion", target )
set clone = bj_lastCreatedUnit
// и так для каждый раз для каждого клона.
все легко и просто.
0
22
6 лет назад
Отредактирован PROSHELDOTU
0
Вот это чо за рак мозга? Какие еще локалки в фильтре с ифами? Ну с таким не удивительно что не работает.
Да всё работает, вообще-то
quq_CCCP:
Примерно так слабо?
И в чём смысл делать глобалку, а не просто писать тогда уж сразу GetFilterUnit( )
Я сдеал локалку, чтобы вместо GetFilterUnit( ) писать то, что мне нужно, в данном случае CLONE
quq_CCCP:
Потом клонов от способностей ищут не так,
Да так и я их могу найти
Точнее не совсем так, я их искал через Юнит входит в Область ( Игровая зона )
Но искать их в другом триггере и сдругим событием мне нафиг не нужно.
Мне нужно найти иллюзии сразу в триггере со способностью, чтобы потом не было геморроя
========================
И ещё раз повторюсь, что при повторном использовании способности, 2 прошлые иллюзии (да и вообще в принципе если рядом с гером будут другое любое ко-во иллюзий) перемещаются к противнику. Но две новосозданные остаются на месте.
Так же повторюсь, что когда проверка была IsUnitIllusion == false, то иллюзии определяло как не иллюзии!
Все кто пытались помочь, похоже проигнорировали это замечание...
========================
Мой вывод таков: Иллюзиям, призванным через стандартную Способность (Предмет: Иллюзии) присваивается статус иллюзий слегка позже, чем происходит проверка.
С другой стороны, скорее всего это может и можно как-то обойти, ведь есть карты примеры, где подобное работает нужным образом.
О том, как устроены чёртовы способности близов стоит только догадываться =\
К счастью Способность (Предмет: Иллюзии) не наносит 0.00 урона, и за это близам огромное спасибо (что у меня в очередной раз не бомбануло)
А вообще, проще по-моему сделать свою игру, чем нормальную карту в варкрафте -_-
Принятый ответ
0
32
6 лет назад
0
Cвот так как я написал, никакого геморроя небудет, почитайте статьи про глобалки и прочее, тогда отпадут все вопросы - зачем?
7
16
6 лет назад
Отредактирован DracoL1ch
7
Все иллюзии попадают на карту уже иллюзиями. В движке в этом плане проблем нет никаких. Для фикса нужно вписывать дебаг и смотреть, кого проверяют и что возвращает.
0
28
5 лет назад
Отредактирован PT153
0
А вообще, проще по-моему сделать свою игру, чем нормальную карту в варкрафте -_-
Стоит отметить, что конструкция if (condition) return true else return false в любом языке крайне бессмысленна, когда можно просто написать return condition. Аналогично и с if (condition == true). С такими знаниями (точнее, с их отсутствием) свою игру сделать будет проблематично. Лично я советую поучить булевую логику, её сдают на ЕГЭ по информатике.

По поводу же самого JASS крайне невыгодно добавлять в группу юнитов, чтобы просто сделать с ними что-то в ForGroup, все необходимые действия можно (а порой и нужно) сразу делать в фильтре, при этом никого в саму группу не добавляя. К тому же, последние замеры говорят, что ForGroup хуже вытаскивания юнитов из группы циклом.

Ну а теперь самый прикол, когда добавляю проверку на IsUnitIllusion == true, то оно тупо не находит иллюзии
Если ставлю IsUnitIllusion == false, то оно других юнитов считает как не иллюзии (ну это понятно), но и САМИ ИЛЛЮЗИИ ОПРЕДЕЛЯЛ КАК НЕ ИЛЛЮЗИИ!
Очень вероятно, что ошибка у Вас. Где дебаг на имя того, кто фильтруется и кто попал в саму группу?
0
21
5 лет назад
0
PT153, теме-то год...
0
28
5 лет назад
0
теме-то год...
Я знаю, просто её недавно кинуло в "Похожие вопросы", зацепила тем, что верный ответ не является таковым. Есть темы и постарше, где такая же ситуация.

Добавлю. Сам как-то столкнулся с тем, что IsUnitIllusion() типа не работает, поставил дебаг на имя, после этого всё разрешилось.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.