Добавлен Lillikon
Делаю скилл на 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:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
ScopteRectuS: Благодарю, проблему нашел. Всегда так, когда в отчаянии на форум бегу - дак тут же проблему увидел, а до этого - хрен)
Отредактирован Lillikon
Отредактирован biridius
вопчхе можно сделать это все циклом вместо куч переменных, раз там просто прибавляется 45 градусов