Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Способность
Версия Warcraft:
1.26
Способность которую я вытащил из доты, перевёл код в читабельный вид и т.д
Для переноса нужно будет перенести 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
6 лет назад
0
Парни а кто может пояснить за этот стринг хеш? StringHash("targetX"), почему вместо него нельзя просто прописать цифры? 1,2,3 и т.д., что это даёт? или для удобства чтобы не запутаться что 1 это х, 2 - у, 3 угол
0
32
6 лет назад
0
Чето совсем не похоже на фрога, какая то отсебятина...
Если у вас фильтр выглядит вот так:

	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 ZJ4 takes nothing returns boolean
    return SPI(GetFilterUnit()) == false and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(XO)) and (A31(GetFilterUnit()) == false or IsUnitVisible(GetFilterUnit(), GetOwningPlayer(XO)) == true) and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.5 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and GetUnitAbilityLevel(GetFilterUnit(), 'A04R') == 0 and GetUnitTypeId(GetFilterUnit()) != 'n00L'
endfunction
У фрога я что то таймеров в абилках не припомню, уже довольно интересно.
Потом вот это зачем?
//...
	call DestroyBoolExpr( bE )
//...
Если что болекспры не утекают, нужно никаких локалок и удалений, это лишние дейтсвия которые бесполезны.
Bergi_Bear, просто удобство чтобы не запутатся, но хеш от строки медленне чем просто целое число.
0
32
6 лет назад
0
А ещё я думал что весь код на стрктуры переписан уже давно, а тут хештаблицы, да ещё и udg_meepoHash. Чего? отдельный хеш для мипо? надеюсь это просто для этого кода, а в доте этого нет
0
32
6 лет назад
0
Bergi_Bear, это копипаст кода мипо, когда он только появился и все было на кеше с ретурбагом, так все и осталось, малость переписали на хештаблицу и все.
У Фрога структур то почти нет, разве что то что делали его кодеры с нуля.
0
18
6 лет назад
Отредактирован Hodor
0
quq_CCCP:
Чето совсем не похоже на фрога, какая то отсебятина...
Если у вас фильтр выглядит вот так:

	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
Это я сделал для удобства.
Код вытащил с опендоты, сделал код читабельным, убрал RB и сделал на хештаблице.
Насчет boolexpr, да, я тогда просто не знал что они не утекают. Да и с обнулением real в некоторых местах там тоже лишнее.
0
32
6 лет назад
Отредактирован quq_CCCP
0
UrsaBoss, смотри мои труды, где я выкладывал абилки из доты и описывал что к чему.
Массивы локальные если что нужно обнулять, иначе будет утечка...
0
2
5 лет назад
0
спс за код чел)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.