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

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

Закрытая тема
 
Sir Andros

offline
Опыт: 49
Активность:
Пожалуйста, помогите найти ошибку
Пожалуйста, помогите найти ошибку в самопальной jass функции.
function AM_effect takes integer Element_Num, real angle1, real angle2, real angle3, real angle4, real angle5, unit caster returns nothing

//Переменные
    local string Element
    local effect array effect_circular
    local effect array effect_line
    local effect array effect_blast
    local real array angle
    local real array blast_angle
    local location caster_coord
    local location loc
    local real radius
    local integer i
    local integer counter_circular
    local integer counter_line
    local integer counter_blasts
    local real offset
    local real damage
    
    set caster_coord = GetUnitLoc(caster)
    set radius = 400.00
    set damage = 10000.00
    set counter_line = 1
    set counter_circular = 1
    set counter_blasts = 1
    set angle[1] = angle1
    set angle[2] = angle2
    set angle[3] = angle3
    set angle[4] = angle4
    set angle[5] = angle5
    set blast_angle[1] = 0.00
    set blast_angle[2] = 0.00
    set blast_angle[3] = 0.00
    set blast_angle[4] = 0.00

//Определение стихии
    if ( Element_Num == 1 ) then
        set Element = "Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl"
    endif
    if ( Element_Num == 2 ) then
        set Element = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl"
    endif
    if ( Element_Num == 3 ) then
        set Element = "Abilities\\Spells\\Orc\\Bloodlust\\BloodlustTarget.mdl"
    endif
    if ( Element_Num == 4 ) then
        set Element = "Abilities\\Weapons\\WaterElementalMissile\\WaterElementalMissile.mdl"
    endif
    if ( Element_Num == 5 ) then
        set Element = "Abilities\\Spells\\NightElf\\Barkskin\\BarkSkinTarget.mdl"
    endif
    if ( Element_Num == 6 ) then
        set Element = "Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl"
    endif

//+++++++++++++++++++++++++++++++++

loop
    if ( angle[1] <= 162.00 ) then 

        set loc = PolarProjectionBJ(PolarProjectionBJ(caster_coord, radius, angle[2]), offset, AngleBetweenPoint (PolarProjectionBJ(caster_coord, radius, angle[5]), PolarProjectionBJ(caster_coord, radius, angle[2])))
        call AddSpecialEffectLocBJ( loc, Element )
        call RemoveLocation(loc)
        set effect_line[counter_line] = GetLastCreatedEffectBJ()
        set counter_line = ( counter_line + 1 )
        set offset = ( offset + 5.30 )
        set loc = PolarProjectionBJ(PolarProjectionBJ(caster_coord, radius, angle[4]), offset, AngleBetweenPoints(PolarProjectionBJ(caster_coord, radius, angle[4]), PolarProjectionBJ(caster_coord, radius, angle[2])))
        call AddSpecialEffectLocBJ( loc, Element )
        call RemoveLocation(loc)
        set effect_line[counter_line] = GetLastCreatedEffectBJ()
        set counter_line = ( counter_line + 1 )
        set offset = ( offset + 5.30 )
        if ( offset <= 220.00 ) then
            set loc = PolarProjectionBJ(PolarProjectionBJ(caster_coord, 110.00, 180.00), offset, 0.00)
            call AddSpecialEffectLocBJ( loc, Element )
            call RemoveLocation(loc)
            set effect_line[counter_line] = GetLastCreatedEffectBJ()
            set counter_line = ( counter_line + 1 )
        else
            call DoNothing(  )
        endif

call DisplayTextToForce( GetPlayersAll(), "!" )
        set i = 1    
        loop
            exitwhen i>5
            set loc = PolarProjectionBJ(caster_coord, radius, angle[i])
            call AddSpecialEffectLocBJ( loc, Element )
            call RemoveLocation(loc)
            set effect_circular[counter_circular] = GetLastCreatedEffectBJ()
            set counter_circular = ( counter_circular + 1 )
            set angle[i] = ( angle[i] + 1.00 )
            set i = (i+1)
        endloop
        call TriggerSleepAction( 0.05 )
    else
        call TriggerSleepAction( 2 )
        //Уничтожение и урон
        //Определение стихии
        if ( Element_Num == 1 ) then
            set Element = "Abilities\\Weapons\\GlaiveMissile\\GlaiveMissileTarget.mdl"
        endif
        if ( Element_Num == 2 ) then
            set Element = "Abilities\\Spells\\Orc\\EarthQuake\\EarthQuakeTarget.mdl"
        endif
        if ( Element_Num == 3 ) then
            set Element = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"
        endif
        if ( Element_Num == 4 ) then
            set Element = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl"
        endif
        if ( Element_Num == 5 ) then
            set Element = "Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl"
        endif
        if ( Element_Num == 6 ) then
            set Element = "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl"
        endif

        //+++++++++++++++++++++++++++++++++
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = ( counter_circular + 6 )
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            call DestroyEffectBJ( effect_circular[bj_forLoopAIndex] )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        set counter_circular = 0
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = ( counter_line + 5 )
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            call DestroyEffectBJ( effect_line[bj_forLoopAIndex] )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        set counter_line = 0
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = 30
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set loc = PolarProjectionBJ(caster_coord, 100.00, blast_angle[1])
            call AddSpecialEffectLocBJ( loc, "Element" )
            call RemoveLocation(loc)
            set effect_blast[counter_blasts] = GetLastCreatedEffectBJ()
            set counter_blasts = ( counter_blasts + 1 )
            set blast_angle[1] = ( blast_angle[1] + 12.00 )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        call ForGroupBJ ( GetUnitsInRangeOfLocMatching(100.00, caster_coord, Condition(IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(caster)) == true)), UnitDamageTargetBJ( caster, GetEnumUnit(), damage, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_FIRE ) )
        call DestroyGroup(GetLastCreatedGroup)
        call TriggerSleepAction( 0.01 )
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = 60
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set loc = PolarProjectionBJ(caster_coord, 200.00, blast_angle[2])
            call AddSpecialEffectLocBJ( loc, "Element" )
            call RemoveLocation(loc)
            set effect_blast[counter_blasts] = GetLastCreatedEffectBJ()
            set counter_blasts = ( counter_blasts + 1 )
            set blast_angle[2] = ( blast_angle[2] + 6.00 )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        call ForGroupBJ( GetUnitsInRangeOfLocMatching(200.00, caster_coord, Condition(IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(caster)) == true)), UnitDamageTargetBJ( caster, GetEnumUnit(), (damage/2), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_FIRE ) )
        call DestroyGroup(GetLastCreatedGroup)
        call TriggerSleepAction( 0.01 )
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = 90
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set loc = PolarProjectionBJ(caster_coord, 300.00, blast_angle[3])
            call AddSpecialEffectLocBJ( loc, "Element" )
            call RemoveLocation(loc)
            set effect_blast[counter_blasts] = GetLastCreatedEffectBJ()
            set counter_blasts = ( counter_blasts + 1 )
            set blast_angle[3] = ( blast_angle[3] + 4.00 )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        call ForGroupBJ( GetUnitsInRangeOfLocMatching(300.00, caster_coord, Condition(IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(caster)) == true)), UnitDamageTargetBJ( caster, GetEnumUnit(), (damage/4), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_FIRE ) )
        call DestroyGroup(GetLastCreatedGroup)
        call TriggerSleepAction( 0.01 )
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = 120
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set loc = PolarProjectionBJ(caster_coord, 400.00, blast_angle[4])
            call AddSpecialEffectLocBJ( loc, "Element" )
            call RemoveLocation(loc)
            set effect_blast[counter_blasts] = GetLastCreatedEffectBJ()
            set counter_blasts = ( counter_blasts + 1 )
            set blast_angle[4] = ( blast_angle[4] + 3.00 )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        call ForGroupBJ( GetUnitsInRangeOfLocMatching(400.00, caster_coord, Condition(IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(caster)) == true)), UnitDamageTargetBJ( caster, GetEnumUnit(), (damage/8), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_FIRE ) )
        call DestroyGroup(GetLastCreatedGroup)
        set counter_line = 0
        call TriggerSleepAction( 0.50 )
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = ( counter_blasts + 5 )
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            call DestroyEffectBJ( effect_blast[bj_forLoopAIndex] )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        set counter_blasts = 0
    endif
exitwhen  angle[1] > 163.00 
endloop
   
//Обнуление
    call RemoveLocation(caster_coord)
    set radius = 0
    set damage = 0
    set counter_line = 0
    set counter_circular = 0
    set counter_blasts = 0
    set angle[1] = 0
    set angle[2] = 0
    set angle[3] = 0
    set angle[4] = 0
    set angle[5] = 0
    set blast_angle[1] = 0.00
    set blast_angle[2] = 0.00
    set blast_angle[3] = 0.00
    set blast_angle[4] = 0.00
    set offset = 0.00
    set caster = null
    set loc = null
    set Element = ""
endfunction

Отредактировано alexkill, 09.07.2010 в 15:34.
Старый 08.07.2010, 18:41
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Sir_Andros, во-первых прошарься про теги, во-вторых, ты хоть объясни, в чем проблема? Искать иголку в стогу сена никто не будет..
Старый 08.07.2010, 20:01
Sir Andros

offline
Опыт: 49
Активность:
Проблема 1 в нанесении урона юнитам в радиусе с условием что они враги(никак не хочет эту строчку есть)
проблема 2. В идеи должен рисоваться круг с буквой а в центре. На гуи работает, но после перехода на локалки, действия после завершения цикла с рисованием окружности обрываются. (с законентчиными строками проблемы 1). Хотел сделать скрипт универсальнее, без глобалок, ради этого отказался от динамичного создания триггера с малым периодом...
Старый 08.07.2010, 23:07
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Sir_Andros, во-первых триггер-слипы убивают некоторые локалки (в твоем случае caster), во-вторых конвертированный код из ГУИ в Жасс - уг полное. Много БЖ функций, лупы гуишные..Тяжелочитабельно. По поводу второй причины - то же самое. Учись делать через таймеры или же используй глобаньные массивы.
Старый 09.07.2010, 15:18
adic3x

offline
Опыт: 108,439
Активность:
А еще не надо обнулять целочисленные, реальные, строчные и логические переменные.
Старый 09.07.2010, 15:39
Sir Andros

offline
Опыт: 49
Активность:
Большое спасибо, за то что откликнулись и уделили мне время!
Попытаюсь исправить...
Старый 10.07.2010, 12:16
Закрытая тема

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

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

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

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



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