Способность которую я вытащил из доты, перевёл код в читабельный вид и т.д
Для переноса нужно будет перенести 4 переменные из редактора переменных, 3 нестандартные способности, 1 заклинание и двух юнитов.
Карта сохраняется в ОБЫЧНОМ WorldEditor (т.е JNGP не нужен)
Для переноса нужно будет перенести 4 переменные из редактора переменных, 3 нестандартные способности, 1 заклинание и двух юнитов.
Карта сохраняется в ОБЫЧНОМ WorldEditor (т.е JNGP не нужен)
Код
//Meepo Earthbind
function earthbind_Spell takes nothing returns boolean
return GetSpellAbilityId()=='A0NB'
endfunction
function earthbind_Filter takes nothing returns boolean
local boolean array b
set b[0] = IsUnitEnemy( GetFilterUnit(), GetOwningPlayer( udg_earthbind_u ) )
set b[1] = IsUnitVisible( GetFilterUnit(), GetOwningPlayer( udg_earthbind_u ) )
set b[2] = GetUnitState( GetFilterUnit(), UNIT_STATE_LIFE) > .5
set b[3] = IsUnitType( GetFilterUnit(), UNIT_TYPE_STRUCTURE ) == false
set b[4] = GetUnitAbilityLevel( GetFilterUnit(), 'A04R') == 0
return b[0] and b[1] and b[2] and b[3] and b[4]
endfunction
function earthbind_Net takes nothing returns nothing
local unit u = CreateUnit( GetOwningPlayer( udg_earthbind_u ), 'e00E', udg_earthbind_x, udg_earthbind_y, 0 )
local timer t = CreateTimer()
call UnitAddAbility( u, 'A0NC' )
call IssueTargetOrderById( u, OrderId("ensnare"), GetEnumUnit() )
endfunction
function earthbind_OnLand takes unit u, real x, real y returns nothing
local boolexpr bE = Condition( function earthbind_Filter )
local group g = CreateGroup()
set udg_earthbind_u = u
call GroupEnumUnitsInRange( g, x, y, 245, bE )
set udg_earthbind_x = x
set udg_earthbind_y = y
call ForGroup( g, function earthbind_Net )
call GroupClear( g )
call DestroyGroup( g )
call DestroyBoolExpr( bE )
set bE = null
set g = null
endfunction
function earthbind_Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer tH = GetHandleId( t )
local unit u = LoadUnitHandle( udg_meepoHash, tH, StringHash("net") )
local real targetX = LoadReal( udg_meepoHash, tH, StringHash("targetX") )
local real targetY = LoadReal( udg_meepoHash, tH, StringHash("targetY") )
local real angle = LoadReal( udg_meepoHash, tH, StringHash("angle") )
local real newX = GetUnitX( u )+30*Cos( angle )
local real newY = GetUnitY( u )+30*Sin( angle )
if ( (newX-targetX)*(newX-targetX)+(newY-targetY)*(newY-targetY) < 1200 ) then
call SetUnitX( u, targetX )
call SetUnitY( u, targetY )
call earthbind_OnLand( u, targetX,targetY)
call FlushChildHashtable( udg_meepoHash, tH )
call KillUnit( u )
call DestroyTimer( t )
else
call SetUnitX( u,newX )
call SetUnitY( u,newY )
endif
set t = null
set tH = 0
set u = null
set targetX = 0.00
set targetY = 0.00
set angle = 0.00
set newX = 0.00
set newY = 0.00
endfunction
function SafeX takes real x returns real
local real r = GetRectMinX( bj_mapInitialPlayableArea )+50
if( x < r )then
return r
endif
set r = GetRectMaxX( bj_mapInitialPlayableArea )-50
if( x > r )then
return r
endif
return x
endfunction
function SafeY takes real y returns real
local real r = GetRectMinY( bj_mapInitialPlayableArea )+50
if( y < r )then
return r
endif
set r = GetRectMaxY( bj_mapInitialPlayableArea )-50
if( y > r )then
return r
endif
return y
endfunction
function earthbind_Setting takes nothing returns nothing
local unit u = GetTriggerUnit()
local location p = GetSpellTargetLoc()
local real x = SafeX( GetLocationX( p ) )
local real y = SafeY( GetLocationY( p ) )
local real uX = SafeX( GetUnitX( u ) )
local real uY = SafeY( GetUnitY( u ) )
local unit u2 = CreateUnit( GetOwningPlayer(u), 'h00C', uX, uY, 0 )
local real r = Atan2( y-uY, x-uX )
local timer t = CreateTimer()
local integer tH = GetHandleId( t )
call SetUnitScale( u2, 2, 2, 2 )
call SaveUnitHandle( udg_meepoHash, tH, StringHash("net"), u2 )
call SaveReal( udg_meepoHash, tH, StringHash("targetX"), x )
call SaveReal( udg_meepoHash, tH, StringHash("targetY"), y )
call SaveReal( udg_meepoHash, tH, StringHash("angle"), r )
call TimerStart( t, .035, true, function earthbind_Move )
call RemoveLocation( p )
set u = null
set p = null
set x = 0.00
set y = 0.00
set uX = 0.00
set uY = 0.00
set u2 = null
set r = 0.00
set t = null
set tH = 0
endfunction
//Meepo Earthbind END
function InitTrig_earthbind takes nothing returns nothing
set gg_trg_earthbind = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( gg_trg_earthbind, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( gg_trg_earthbind, function earthbind_Setting )
call TriggerAddCondition( gg_trg_earthbind ,Condition(function earthbind_Spell) )
endfunction
Если у вас фильтр выглядит вот так:
Потом вот это зачем?
Bergi_Bear, просто удобство чтобы не запутатся, но хеш от строки медленне чем просто целое число.
У Фрога структур то почти нет, разве что то что делали его кодеры с нуля.
Ред. Hodor
Код вытащил с опендоты, сделал код читабельным, убрал RB и сделал на хештаблице.
Насчет boolexpr, да, я тогда просто не знал что они не утекают. Да и с обнулением real в некоторых местах там тоже лишнее.
Ред. quq_CCCP
Массивы локальные если что нужно обнулять, иначе будет утечка...