Делаю скилл на JASS. Скилл создает область и если враг выйдет за предел этой области, то его начнет затягивать назад. Собственно, проблема заключается в том, что врага затягивает постоянно. "Затягивание" в область скилла я решил осуществить при помощи подсчета дистанции между врагом и центром области. Если эта дистанция больше 300, что врага таймером двигает к центру области, тем самым дистанция, соответственно, сокращается и затягивание останавливается. Но, так как я описал - не работает) И я не могу найти ошибку, хотя пялюсь в код уже больше часа. Буду признателен на указание косяка или другой способ осуществить задумку.
function Trig_StormKage_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A00L' ) ) then
        return false
    endif
    return true
endfunction

function Kage_Damage takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local real time = LoadReal(udg_Hash,id,88)
    local unit caster = LoadUnitHandle(udg_Hash,id,70)
    local unit target = LoadUnitHandle(udg_Hash,id,71)
    local real point_1_x = LoadReal(udg_Hash,id,72)
    local real point_1_y = LoadReal(udg_Hash,id,73)
    local real point_2_x = LoadReal(udg_Hash,id,74)
    local real point_2_y = LoadReal(udg_Hash,id,75)
    local real point_3_x = LoadReal(udg_Hash,id,76)
    local real point_3_y = LoadReal(udg_Hash,id,77)
    local real point_4_x = LoadReal(udg_Hash,id,78)
    local real point_4_y = LoadReal(udg_Hash,id,79)
    local real point_5_x = LoadReal(udg_Hash,id,80)
    local real point_5_y = LoadReal(udg_Hash,id,81)
    local real point_6_x = LoadReal(udg_Hash,id,82)
    local real point_6_y = LoadReal(udg_Hash,id,83)
    local real point_7_x = LoadReal(udg_Hash,id,84)
    local real point_7_y = LoadReal(udg_Hash,id,85)
    local real point_8_x = LoadReal(udg_Hash,id,86)
    local real point_8_y = LoadReal(udg_Hash,id,87)
    local lightning light_1 = LoadLightningHandle(udg_Hash,id,96)
    local lightning light_2 = LoadLightningHandle(udg_Hash,id,89)
    local lightning light_3 = LoadLightningHandle(udg_Hash,id,90)
    local lightning light_4 = LoadLightningHandle(udg_Hash,id,91)
    local lightning light_5 = LoadLightningHandle(udg_Hash,id,92)
    local lightning light_6 = LoadLightningHandle(udg_Hash,id,93)
    local lightning light_7 = LoadLightningHandle(udg_Hash,id,94)
    local lightning light_8 = LoadLightningHandle(udg_Hash,id,95)
    local real center_x = LoadReal(udg_Hash,id,100)
    local real center_y = LoadReal(udg_Hash,id,101)
    local group pool = LoadGroupHandle(udg_Hash,id,98)
    local unit enemy = null
    local real enemy_x
    local real enemy_y
    local real angle_c_e
    local real pos_enemy_x
    local real pos_enemy_y
    local real dx_c_e
    local real dy_c_e
    local real dist_c_e
    if GetRandomInt(1,10) == 1 then
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_1_x,point_1_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_2_x,point_2_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_3_x,point_3_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_4_x,point_4_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_5_x,point_5_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_6_x,point_6_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_7_x,point_7_y))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",point_8_x,point_8_y))
    endif
    call GroupEnumUnitsInRange(pool,center_x,center_y,350.00,null)
    loop
        set enemy = FirstOfGroup(pool)
        exitwhen enemy == null
        if IsUnitEnemy(enemy,GetOwningPlayer(caster)) then
            set enemy_x = GetUnitX(enemy)
            set enemy_y = GetUnitY(enemy)
            set angle_c_e = Atan2(enemy_y - center_y,enemy_x - center_x)
            set dx_c_e = enemy_x - center_x
            set dy_c_e = enemy_y - center_y
            set dist_c_e = (dx_c_e*dx_c_e+dy_c_e*dy_c_e)
            if dist_c_e > 300.00 then
                set pos_enemy_x = enemy_x - 30.00*Cos(angle_c_e)
                set pos_enemy_y = enemy_y - 30.00*Sin(angle_c_e)
                call SetUnitX(enemy,pos_enemy_x)
                call SetUnitY(enemy,pos_enemy_y)
                call UnitDamageTarget(caster,enemy,0.00,false,false,null,null,null)
            endif
        endif
        call GroupRemoveUnit(pool,enemy)
    endloop
    set time = time + 0.02
    call SaveReal(udg_Hash,id,88,time)
    if time > 5.00 then
        call DestroyTimer(t)
        call DestroyLightning(light_1)
        call DestroyLightning(light_2)
        call DestroyLightning(light_3)
        call DestroyLightning(light_4)
        call DestroyLightning(light_5)
        call DestroyLightning(light_6)
        call DestroyLightning(light_7)
        call DestroyLightning(light_8)
    endif
endfunction

function Trig_StormKage_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local real time = 0.00
    local unit caster = GetSpellAbilityUnit()
    local unit target = GetSpellTargetUnit()
    local real target_x = GetUnitX(target)
    local real target_y = GetUnitY(target)
    local real point_1_x = target_x + 300.00 * Cos(0.00*bj_DEGTORAD)
    local real point_1_y = target_y + 300.00 * Sin(0.00*bj_DEGTORAD)
    local real point_2_x = target_x + 300.00 * Cos(45.00*bj_DEGTORAD)
    local real point_2_y = target_y + 300.00 * Sin(45.00*bj_DEGTORAD)
    local real point_3_x = target_x + 300.00 * Cos(90.00*bj_DEGTORAD)
    local real point_3_y = target_y + 300.00 * Sin(90.00*bj_DEGTORAD)
    local real point_4_x = target_x + 300.00 * Cos(135.00*bj_DEGTORAD)
    local real point_4_y = target_y + 300.00 * Sin(135.00*bj_DEGTORAD)
    local real point_5_x = target_x + 300.00 * Cos(180.00*bj_DEGTORAD)
    local real point_5_y = target_y + 300.00 * Sin(180.00*bj_DEGTORAD)
    local real point_6_x = target_x + 300.00 * Cos(225.00*bj_DEGTORAD)
    local real point_6_y = target_y + 300.00 * Sin(225.00*bj_DEGTORAD)
    local real point_7_x = target_x + 300.00 * Cos(270.00*bj_DEGTORAD)
    local real point_7_y = target_y + 300.00 * Sin(270.00*bj_DEGTORAD)
    local real point_8_x = target_x + 300.00 * Cos(315.00*bj_DEGTORAD)
    local real point_8_y = target_y + 300.00 * Sin(315.00*bj_DEGTORAD)
    local lightning light_1 = AddLightningEx("CLPB",true,point_1_x,point_1_y,45.00,point_2_x,point_2_y,45.00)
    local lightning light_2 = AddLightningEx("CLPB",true,point_2_x,point_2_y,45.00,point_3_x,point_3_y,45.00)
    local lightning light_3 = AddLightningEx("CLPB",true,point_3_x,point_3_y,45.00,point_4_x,point_4_y,45.00)
    local lightning light_4 = AddLightningEx("CLPB",true,point_4_x,point_4_y,45.00,point_5_x,point_5_y,45.00)
    local lightning light_5 = AddLightningEx("CLPB",true,point_5_x,point_5_y,45.00,point_6_x,point_6_y,45.00)
    local lightning light_6 = AddLightningEx("CLPB",true,point_6_x,point_6_y,45.00,point_7_x,point_7_y,45.00)
    local lightning light_7 = AddLightningEx("CLPB",true,point_7_x,point_7_y,45.00,point_8_x,point_8_y,45.00)
    local lightning light_8 = AddLightningEx("CLPB",true,point_8_x,point_8_y,45.00,point_1_x,point_1_y,45.00)
    local group pool = CreateGroup()
    call SaveReal(udg_Hash,id,88,time)
    call SaveUnitHandle(udg_Hash,id,70,caster)
    call SaveUnitHandle(udg_Hash,id,71,target)
    call SaveReal(udg_Hash,id,72,point_1_x)
    call SaveReal(udg_Hash,id,73,point_1_y)
    call SaveReal(udg_Hash,id,74,point_2_x)
    call SaveReal(udg_Hash,id,75,point_2_y)
    call SaveReal(udg_Hash,id,76,point_3_x)
    call SaveReal(udg_Hash,id,77,point_3_y)
    call SaveReal(udg_Hash,id,78,point_4_x)
    call SaveReal(udg_Hash,id,79,point_4_y)
    call SaveReal(udg_Hash,id,80,point_5_x)
    call SaveReal(udg_Hash,id,81,point_5_y)
    call SaveReal(udg_Hash,id,82,point_6_x)
    call SaveReal(udg_Hash,id,83,point_6_y)
    call SaveReal(udg_Hash,id,84,point_7_x)
    call SaveReal(udg_Hash,id,85,point_7_y)
    call SaveReal(udg_Hash,id,86,point_8_x)
    call SaveReal(udg_Hash,id,87,point_8_y)
    call SaveLightningHandle(udg_Hash,id,96,light_1)
    call SaveLightningHandle(udg_Hash,id,89,light_2)
    call SaveLightningHandle(udg_Hash,id,90,light_3)
    call SaveLightningHandle(udg_Hash,id,91,light_4)
    call SaveLightningHandle(udg_Hash,id,92,light_5)
    call SaveLightningHandle(udg_Hash,id,93,light_6)
    call SaveLightningHandle(udg_Hash,id,94,light_7)
    call SaveLightningHandle(udg_Hash,id,95,light_8)
    call SaveReal(udg_Hash,id,100,target_x)
    call SaveReal(udg_Hash,id,101,target_y)
    call SaveGroupHandle(udg_Hash,id,98,pool)
    call TimerStart(t,0.02,true,function Kage_Damage)
endfunction

//===========================================================================
function InitTrig_StormKage takes nothing returns nothing
    set gg_trg_StormKage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_StormKage, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_StormKage, Condition( function Trig_StormKage_Conditions ) )
    call TriggerAddAction( gg_trg_StormKage, function Trig_StormKage_Actions )
endfunction

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

Проблема решилась написанием SquareRoot в формуле вычисления дистанции. Странно, что в другом скилле мною эта формула использовалась с этой же ошибкой (SquareRoot не писал, забывал, наверное, из-за неопытности), но при этом все работало нормально... Мистика какая-то. Но буду признателен за другие предложения по оптимизации кода))
ScopteRectuS:
Покажите лучше карту, пока руками не потрогаешь, сложно сказать где проблема.
И да, так как углы известны уже заранее, то можно сразу же посчитать их:
local real point_1_x = target_x + 300.00 * Cos(0.00*bj_DEGTORAD)
local real point_1_y = target_y + 300.00 * Sin(0.00*bj_DEGTORAD)
>>>>
local real point_1_x = target_x + 300.00 * 1.0
local real point_1_y = target_y + 300.00 * 0.0
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y + 0.00
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y
Благодарю, проблему нашел. Всегда так, когда в отчаянии на форум бегу - дак тут же проблему увидел, а до этого - хрен)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
5
6 лет назад
0
Проблема решилась написанием SquareRoot в формуле вычисления дистанции. Странно, что в другом скилле мною эта формула использовалась с этой же ошибкой (SquareRoot не писал, забывал, наверное, из-за неопытности), но при этом все работало нормально... Мистика какая-то. Но буду признателен за другие предложения по оптимизации кода))
ScopteRectuS:
Покажите лучше карту, пока руками не потрогаешь, сложно сказать где проблема.
И да, так как углы известны уже заранее, то можно сразу же посчитать их:
local real point_1_x = target_x + 300.00 * Cos(0.00*bj_DEGTORAD)
local real point_1_y = target_y + 300.00 * Sin(0.00*bj_DEGTORAD)
>>>>
local real point_1_x = target_x + 300.00 * 1.0
local real point_1_y = target_y + 300.00 * 0.0
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y + 0.00
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y
Благодарю, проблему нашел. Всегда так, когда в отчаянии на форум бегу - дак тут же проблему увидел, а до этого - хрен)
Принятый ответ
0
21
6 лет назад
0
Lillikon, точно, корень обязателен. Теорема Пифагора.
	a^2 + b^2 = c^2
0
5
6 лет назад
Отредактирован Lillikon
0
ScopteRectuS:
Lillikon, точно, корень обязателен. Теорема Пифагора.
	a^2 + b^2 = c^2
Я никогда корень не использовал, а просто перемножал на 2. Так написано в подсказках по BJ в редакторе и так как я недавно изучаю JASS, то постоянно боюсь накосячить))
			set dx_c_e = enemy_x - center_x
            set dy_c_e = enemy_y - center_y
            set dist_c_e = (dx_c_e*dx_c_e+dy_c_e*dy_c_e)
В этой части кода даже без квадрата все пашет, ну а ошибку я писал выше) Оказывается надо было так:
			set dx_c_e = enemy_x - center_x
            set dy_c_e = enemy_y - center_y
            set dist_c_e = SquareRoot(dx_c_e*dx_c_e+dy_c_e*dy_c_e)
И я вообще охренел, ведь раньше я писал без SquareRoot и все работало, поэтому я и не так быстро нашел свою ошибку)
0
32
6 лет назад
0
Lillikon, карту в студию плз.
0
15
6 лет назад
0
Зачем так много переменных? Используйте массивы.
0
24
6 лет назад
0
Можно вместо использования корня сравнивать с квадратом необходимого расстояния. Будет работать чуть быстрее, но нужно будет не забывать что расстояние в квадрате.
0
21
6 лет назад
Отредактирован biridius
0
Cage
вопчхе можно сделать это все циклом вместо куч переменных, раз там просто прибавляется 45 градусов
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.