Добавлен Lillikon
(xgm.guru/p/100/216603) - Предыдущая тема.
Предыстория та же. Делаю скилл сюрикена на JASS (летит в точку и возвращается назад, по пути раздавая люлей врагам). Скилл доделал и он работает, но оставляет много утечек.
Наполовину переписал код по совету UrsaBoss, попутно убирая все BJ, но сейчас в очередной раз залип на пустом месте. Для движения сюрикена я использовал PolarProjectionBJ, но этот BJ надобно убрать, но как грамотно рассписать все расчеты по формуле - понять не могу.
Наполовину переписал код по совету UrsaBoss, попутно убирая все BJ, но сейчас в очередной раз залип на пустом месте. Для движения сюрикена я использовал PolarProjectionBJ, но этот BJ надобно убрать, но как грамотно рассписать все расчеты по формуле - понять не могу.
Здесь требуется избавиться от BJ:
call SetUnitPositionLoc(suriken,PolarProjectionBJ(GetUnitLoc(suriken),20.00,AngleBetweenPoints(GetUnitLoc​(suriken),GetUnitLoc(caster))))
Код целиком:
function Trig_Suriken_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A01G'
endfunction
function Flyin takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local unit suriken = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local location endfly = LoadLocationHandle(udg_Hash,GetHandleId(t),3)
local group pool = CreateGroup()
local unit g
local real dx = GetLocationX(endfly) - GetLocationX(GetUnitLoc(suriken))
local real dy = GetLocationY(endfly) - GetLocationY(GetUnitLoc(suriken))
if SquareRoot(dx * dx + dy * dy) >= 10 then
call SetUnitPositionLoc(suriken,PolarProjectionBJ(GetUnitLoc(suriken),20.00,GetUnitFacing(suriken)))
call GroupEnumUnitsInRange(pool,GetUnitX(suriken),GetUnitY(suriken),150.00,null)
loop
set g = FirstOfGroup(pool)
exitwhen g == null
if IsUnitEnemy(g, GetOwningPlayer(caster)) == true then
call UnitDamageTarget(caster,g,40.00,false,false,null,null,null)
endif
call GroupRemoveUnit(pool,g)
endloop
else
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,h)
endif
call RemoveLocation(endfly)
set t = null
set h = 0
set caster = null
set suriken = null
set endfly = null
set pool = null
set g = null
set dx = 0
set dy = 0
endfunction
function Flyout takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local unit suriken = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local real endfly_x = LoadReal(udg_Hash,GetHandleId(t),3)
local real endfly_y = LoadReal(udg_Hash,GetHandleId(t),4)
local group pool = CreateGroup()
local unit g
local real dx = GetLocationX(GetUnitLoc(caster)) - GetLocationX(GetUnitLoc(suriken))
local real dy = GetLocationY(GetUnitLoc(caster)) - GetLocationY(GetUnitLoc(suriken))
if SquareRoot(dx * dx + dy * dy) >= 50 then
call SetUnitPositionLoc(suriken,PolarProjectionBJ(GetUnitLoc(suriken),20.00,AngleBetweenPoints(GetUnitLoc(suriken),GetUnitLoc(caster))))
call GroupEnumUnitsInRange(pool,GetUnitX(suriken),GetUnitY(suriken),150.00,null)
loop
set g = FirstOfGroup(pool)
exitwhen g == null
if IsUnitEnemy(g, GetOwningPlayer(caster)) == true then
call UnitDamageTarget(caster,g,40.00,false,false,null,null,null)
endif
call GroupRemoveUnit(pool,g)
endloop
else
call KillUnit(suriken)
call TriggerSleepAction(1.0)
call RemoveUnit(suriken)
call DestroyTimer(t)
endif
set t = null
set h = 0
set caster = null
set suriken = null
set endfly_x = 0
set endfly_y = 0
set pool = null
set g = null
set dx = 0
set dy = 0
endfunction
function Trig_Suriken_Actions takes nothing returns nothing
local timer t = CreateTimer()
local unit caster = GetSpellAbilityUnit()
local unit suriken = CreateUnit(GetOwningPlayer(caster),'u001',GetUnitX(caster),GetUnitY(caster),GetUnitFacing(caster))
local real endfly_x = GetUnitX(caster) + 2000.00 * Cos(GetUnitFacing(caster) * bj_DEGTORAD)
local real endfly_y = GetUnitY(caster) + 2000.00 * Sin(GetUnitFacing(caster) * bj_DEGTORAD)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,caster)
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,suriken)
call SaveReal(udg_Hash,GetHandleId(t),3,endfly_x)
call SaveReal(udg_Hash,GetHandleId(t),4,endfly_x)
call TimerStart(t,0.02,true,function Flyin)
call TriggerSleepAction(1.7)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,caster)
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,suriken)
call SaveReal(udg_Hash,GetHandleId(t),3,endfly_x)
call SaveReal(udg_Hash,GetHandleId(t),4,endfly_x)
call TimerStart(t,0.02,true,function Flyout)
call TriggerSleepAction(3.0)
call DestroyTimer(t)
set caster = null
set suriken = null
set endfly_x = 0
set endfly_y = 0
set t = null
endfunction
//===========================================================================
function InitTrig_Suriken takes nothing returns nothing
set gg_trg_Suriken = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Suriken, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Suriken, Condition( function Trig_Suriken_Conditions ) )
call TriggerAddAction( gg_trg_Suriken, function Trig_Suriken_Actions )
set udg_Hash = InitHashtableBJ( )
endfunction
Карта:
З.Ы. Если кто может помочь с вопросами на чистом энтузиазме - могу скинуть DS.
З.Ы.Ы. Дабы не дергать форум много раз, а то уже 4 темы создал))
З.Ы.Ы. Дабы не дергать форум много раз, а то уже 4 темы создал))
Принятый ответ
range * Cos(a * bj_DEGTORAD)
должно получится так:
a = Atan2(endfly_y - GetUnitY(suriken), endfly_x - GetUnitX(suriken))
SetUnitX(suriken, GetUnitX(suriken) + 20.00 * Cos(a))
SetUnitY(suriken, GetUnitY(suriken) + 20.00 * Sin(a))
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Lillikon
Отредактирован Hodor
PT153: Конкретно в моем скилле при одном касте из-за этих BJ где-то 1к утечек на каст) Так что убрать их - маст хев.
то угол в SaveReal(h, id, 5, Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x))