В общем есть способность похожая на первый скил Лансера из Доты
Создаются больше одной иллюзии кастера, когда с противником сталкивается снаряд, и перемещаются к противнику
Поиск иллюзий делал через пик юнитов рядом с кастером 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
21
6 лет назад
0
С иллюзиями вообще дофига всяких... слово не подберу.
НЕМНОГО ОФФТОП, НО ЯВНО МНОГИМ ПРИГОДИТСЯ: ИЛЛЮЗИИ ГЕРОЕВ НА ПРОВЕРКУ ISUNITHERO ОТВЕЧАЮТ НЕТ.
Как у меня это было: в игре есть герой, который если цель заклинания - вражеский крип, удаляет его из игры и на его месте оставляет торт (типа превращает), а если герой - кидает в него торт и оглушает. Так вот до постановки правильных условий иллюзии вражеских героев "превращались" в торты... а на их месте после удаления иллюзии из игры - sic! - оставались ПРЕДМЕТЫ, БЫВШИЕ У ИЛЛЮЗИИ...
0
7
6 лет назад
Отредактирован bOrissko
0
Это не только из-за иллюзий, я тоже хотел выбрать каждого юнита и сразу отсеять (пытался среди них найти героев) и был такой же результат, как и у автора вопроса. Пришлось делать доп., проверку далее и вот она уже, заработала.
0
32
6 лет назад
0
Код в студию, то что то вы там накосячили, эта нативка работает исправно.
If (IsUnitIllusion( unit ) ) then // и не надо никаких == true, еще != false and == true напишите.

endif
Вот вам пример, все прекрасно работает.
Загруженные файлы
0
22
6 лет назад
Отредактирован PROSHELDOTU
0
Вот вам пример, все прекрасно работает.
У меня есть такой же пример в виде другой моей карты, там тоже не джасс и тоже работает)
ClotPh:
ИЛЛЮЗИИ ГЕРОЕВ НА ПРОВЕРКУ ISUNITHERO ОТВЕЧАЮТ НЕТ
Да вот как раз у меня с этим всё норм, потому что я не проверяю на это
Когда я проверяю:
if IsPlayerAlly( GetOwningPlayer( CLONE ), GetOwningPlayer( CASTer ) ) and GetUnitTypeId( CLONE ) == GetUnitTypeId( CASTer ) then
К противнику перемещаются и иллюзии и герой
Когда добавляю проверку на иллюзии, то их тупо не находит
Писал и так и так и так:
IsUnitIllusion( CLONE )
IsUnitIllusion( CLONE ) == true
IsUnitIllusionBJ( CLONE ) == true
IsUnitIllusion( GetFilterUnit() )
IsUnitIllusion( GetFilterUnit() ) == true
IsUnitIllusionBJ( GetFilterUnit() ) == true Кстати это вариант, который делается через обычные триггеры, но тут он тоже не работает
Потом для прикола проверил
IsUnitIllusion( CLONE ) == false
И тут оно перемещало и героя и иллюзии к противнику
=========================================
Потестив ещё, было замечено, что когда способность применяется первый раз, то иллюзии остаются рядом с кастером
Если применить способность второй раз, то рядом с кастером появляются новые иллюзии, а старые, которые стояли рядом с ним перемещаются к противнику и т.д.
Следует предположение, что как только дамми получает приказ применить способность на основе Предмет:Иллюзии, условие IsUnitIllusion просто не успевает какаим-то образом сделать проверку =/
Почему каким-то? Потому что аналогичная способность в другой моей карте сделанная через триггеры работает всегда
Стоит ещё учесть, что когда проверка была IsUnitIllusion == false, как я сказал ранее, то иллюзии определяло как не иллюзии
Т.е. ещё одно предположение, что когда создаются иллюзии на основе способности Предмет:Иллюзии, иллюзиям присваивается статус иллюзий слегка позже, чем происходит проверка на этот статус иллюзий
Хрен знает что, в общем, хватит пока с меня редактора варкрафта =\
0
27
6 лет назад
0
Следует предположение, что как только дамми получает приказ применить способность на основе Предмет:Иллюзии, условие IsUnitIllusion просто не успевает какаим-то образом сделать проверку =/
Почему каким-то?
Proshel_Doty, ну возможно они еще не созданы при касте, поэтому лови через определенное время таймером (0.00 сек или 0.01 и так далее). Лучше проверять событием - юнит вызывает боевую единицу, засовывать в группу и так далее
0
32
6 лет назад
0
Proshel_Doty, говорю же, код в студию, так же советую ловить иллюзии событием - EventUnitSummon
1
16
6 лет назад
1
Никогда никаких проблем не было
IsUnitType(u,UNIT_TYPE_HERO) возвращет true ТОЛЬКО для героев, это фишка такая
иллюзии-герои включаются в фильтр через IsUnitIdType(GetUnitTypeId(u),UNIT_TYPE_HERO)
Этот комментарий удален
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
// и так для каждый раз для каждого клона.
все легко и просто.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.