Суккуленция
раскрыть
ну поняли да? типа связанное с кактусами, жижа в растении, прикольна же дададдад? нет, лучше б я сдох, жижа у меня в башке
Герой взращивает кактус вокруг себя, который начинает притягивать противников в радиусе досягаемости. Противники, касающиеся кактуса, получают урон и исцеляют владельца. Сам владелец в это время не досягаем и не может двигаться. По завершению кактус расцветает, пуская корни вокруг, которые единоразово наносят урон и опутывают противников.
код
library SucculentionLib
globals
private constant hashtable H = InitHashtable( )
private constant group TempGroup = CreateGroup( )
private constant location LFZ = Location( 0.00, 0.00 )
private constant integer SlowAbility = 'B000' // дебаф сповільнюючої здібності, 0 - якщо нема
private constant integer RootAbility = 'BEer' // дебаф коренів, 0 - якщо нема
private constant integer RootID = 'u000' // корені
private constant integer RootReverseID = 'u001' // реверснуті корені
private constant integer FlowerID = 'u002' // квітка
private constant integer BirthID = 'u003' // ефект появи
private constant integer RootMineID = 'u004' // масивні корені
private constant integer OriginID = 'u005' // ефект притягування
private constant integer GreenSphereID = 'u006' // зелена кружлялка
private constant real DamagePeriodic = 0.50 // періодичність дамагу
private unit TempUnit
private group TempGroup1
private integer TempS
private integer TempInt
private unit bj_lastFilterUnit = null
endglobals
native UnitAlive takes unit id returns boolean
private function GetLocZ takes real x, real y returns real
call MoveLocation( LFZ, x, y )
return GetLocationZ( LFZ )
endfunction
private struct SucculentionS
unit caster
player p
group g
real x
real y
real z
real s
real time
real timeDamage
real heal
real damage
real damageEnd
boolexpr cond
boolexpr cond1
endstruct
private function SucculentionDamage_1 takes nothing returns nothing
local SucculentionS A = TempS
local unit u = GetEnumUnit( )
local real x
local real y
local real z
local real x1
local real y1
local real z1
local real a
local real az
local real d
local lightning l = LoadLightningHandle( H, TempInt, GetHandleId( u ) )
if not IsUnitInGroup( u, TempGroup ) or not UnitAlive( u ) or not IsUnitInRangeXY( u, A.x, A.y, 500.00 ) then
if l != null then
call DestroyLightning( l )
call RemoveSavedHandle( H, TempInt, GetHandleId( u ) )
endif
if SlowAbility > 0 then
call UnitRemoveAbility( u, SlowAbility )
endif
call GroupRemoveUnit( TempGroup1, u )
else
set x = GetUnitX( u )
set y = GetUnitY( u )
set z = GetLocZ( x, y ) + GetUnitFlyHeight( u ) + 50.00
set a = Atan2( y - A.y, x - A.x )
set az = Atan2( z - A.z, SquareRoot( ( x - A.x ) * ( x - A.x ) + ( y - A.y ) * ( y - A.y ) ) )
set x1 = A.x + 100.00 * Cos( a ) * Cos( az )
set y1 = A.y + 100.00 * Sin( a ) * Cos( az )
set z1 = A.z + 100.00 * az
if l == null then
set l = AddLightningEx( "DRAL", false, x1, y1, z1, x, y, z )
call SaveLightningHandle( H, TempInt, GetHandleId( u ), l )
else
call MoveLightningEx( l, false, x1, y1, z1, x, y, z )
endif
set d = SquareRoot( ( x - A.x ) * ( x - A.x ) + ( y - A.y ) * ( y - A.y ) + ( z - A.z ) * ( z - A.z ) ) - 100.00
call SetLightningColor( l, 1.00, 1.00, 1.00, 0.10 + 0.90 * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) )
if IsUnitInRangeXY( u, A.x, A.y, 200.00 ) and A.timeDamage >= DamagePeriodic then
if A.damage >= 0.00 then
call UnitDamageTarget( A.caster, u, A.damage, false, false, null, null, null )
else
call SetWidgetLife( u, GetWidgetLife( u ) - A.damage )
endif
call SetWidgetLife( A.caster, GetWidgetLife( A.caster ) + A.heal )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\snapMissile\\snapMissile.mdl", u, "chest" ) )
endif
if IsUnitInRangeXY( u, A.x, A.y, 125.00 ) then
call SetUnitX( u, x + 5.00 * Cos( a ) )
call SetUnitY( u, y + 5.00 * Sin( a ) )
else
if A.s > 0.00 then
call SetUnitX( u, x - ( 0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Cos( a ) )
call SetUnitY( u, y - ( 0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Sin( a ) )
else
call SetUnitX( u, x - ( -0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Cos( a ) )
call SetUnitY( u, y - ( -0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Sin( a ) )
endif
endif
endif
set l = null
set u = null
endfunction
private function SucculentionBloom takes nothing returns nothing
local SucculentionS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local unit u
local real x
local real y
local real a = GetRandomReal( 0.00, 360.00 )
local integer i = R2I( ( 2.00 * bj_PI * ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) ) / 96.00 + 0.50 )
local integer i1 = i
loop
set x = A.x + ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) * Cos( a * bj_DEGTORAD )
set y = A.y + ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) * Sin( a * bj_DEGTORAD )
set udg_TempUnit = A.caster
call GroupEnumUnitsInRange( TempGroup, x, y, 200.00, A.cond1 )
loop
set u = FirstOfGroup( TempGroup )
exitwhen u == null
call GroupRemoveUnit( TempGroup, u )
if IsUnitInRangeXY( u, x, y, 50.00 ) then
if RootAbility > 0 then
call UnitRemoveAbility( u, RootAbility )
call IssueTargetOrder( TempUnit, "entanglingroots", u )
endif
if not IsUnitInGroup( u, A.g ) then
call GroupAddUnit( A.g, u )
if A.damageEnd >= 0.00 then
call UnitDamageTarget( A.caster, u, A.damageEnd, false, false, null, null, null )
else
call SetWidgetLife( u, GetWidgetLife( u ) - A.damageEnd )
endif
endif
endif
endloop
set bj_lastCreatedUnit = CreateUnit( A.p, RootID, x, y, a )
call SetUnitX( bj_lastCreatedUnit, x )
call SetUnitY( bj_lastCreatedUnit, y )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.50 )
set i = i - 1
exitwhen i <= 0
set a = a + 360.00 / i1
endloop
set A.time = A.time - 0.20
if A.time <= 0.00 then
call PauseTimer( GetExpiredTimer( ) )
call FlushChildHashtable( H, GetHandleId( GetExpiredTimer( ) ) )
call DestroyTimer( GetExpiredTimer( ) )
call DestroyGroup( A.g )
set A.g = null
set A.caster = null
call A.destroy( )
endif
endfunction
private function SucculentionDamage takes nothing returns nothing
local SucculentionS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local unit u
local lightning l
local integer i
local real a
set A.timeDamage = A.timeDamage + 0.01
set TempS = A
set TempInt = GetHandleId( GetExpiredTimer( ) )
set TempGroup1 = A.g
set udg_TempUnit = A.caster
call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 700.00, A.cond )
set bj_groupAddGroupDest = A.g
call ForGroup( TempGroup, function GroupAddGroupEnum )
call ForGroup( A.g, function SucculentionDamage_1 )
call GroupClear( TempGroup )
set A.time = A.time - 0.01
if A.time <= 0.00 then
call PauseUnit( A.caster, false )
call SetUnitInvulnerable( A.caster, false )
set i = 3
set a = GetRandomReal( 0.00, 360.00 )
loop
set bj_lastCreatedUnit = CreateUnit( A.p, BirthID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
call KillUnit( bj_lastCreatedUnit )
set i = i - 1
exitwhen i <= 0
set a = a + 360.00 / 3.00
endloop
loop
set u = FirstOfGroup( A.g )
exitwhen u == null
call GroupRemoveUnit( A.g, u )
set l = LoadLightningHandle( H, TempInt, GetHandleId( u ) )
if l != null then
call DestroyLightning( l )
call RemoveSavedHandle( H, TempInt, GetHandleId( u ) )
endif
if SlowAbility > 0 then
call UnitRemoveAbility( u, SlowAbility )
endif
endloop
set l = null
set A.time = 0.20 * 6.00
call TimerStart( GetExpiredTimer( ), 0.20, true, function SucculentionBloom )
elseif A.timeDamage >= DamagePeriodic then
set A.timeDamage = A.timeDamage - DamagePeriodic
endif
endfunction
private function Pause takes nothing returns nothing
local timer t = GetExpiredTimer( )
call PauseUnit( LoadUnitHandle( H, GetHandleId( t ), 0 ), true )
call FlushChildHashtable( H, GetHandleId( t ) )
call DestroyTimer( t )
set t = null
endfunction
function Succulention_Actions takes unit caster, real damage, real damageEnd, real heal, real time, real s, boolexpr b, boolexpr b1 returns nothing
local timer t = CreateTimer( )
local SucculentionS A = SucculentionS.create( )
local integer i = 6
local real a = GetRandomReal( 0.00, 360.00 )
set A.caster = caster
set A.p = GetOwningPlayer( A.caster )
set A.x = GetUnitX( A.caster )
set A.y = GetUnitY( A.caster )
set A.z = GetLocZ( A.x, A.y ) + 150.00
set A.s = s
set A.g = CreateGroup( )
set A.time = RMaxBJ( 0.00, time )
set A.timeDamage = DamagePeriodic
set A.damage = damage
set A.damageEnd = damageEnd
set A.heal = heal
set A.cond = b
set A.cond1 = b1
call SetUnitInvulnerable( A.caster, true )
loop
set bj_lastCreatedUnit = CreateUnit( A.p, RootID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
set bj_lastCreatedUnit = CreateUnit( A.p, RootReverseID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitFlyHeight( bj_lastCreatedUnit, 250.00, 0.00 )
call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
set i = i - 1
exitwhen i <= 0
set a = a + 360.00 / 6.00
endloop
set bj_lastCreatedUnit = CreateUnit( A.p, FlowerID, A.x, A.y, a )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitFlyHeight( bj_lastCreatedUnit, 225.00, 0.00 )
call SetUnitScale( bj_lastCreatedUnit, 2.00, 2.00, 2.00 )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
set i = 3
set a = GetRandomReal( 0.00, 360.00 )
loop
set bj_lastCreatedUnit = CreateUnit( A.p, BirthID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
call KillUnit( bj_lastCreatedUnit )
set i = i - 1
exitwhen i <= 0
set a = a + 360.00 / 3.00
endloop
set bj_lastCreatedUnit = CreateUnit( A.p, RootMineID, A.x, A.y - 50.00, 5.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y - 50.00 )
call SetUnitScale( bj_lastCreatedUnit, 1.50, 1.50, 1.50 )
call SetUnitFlyHeight( bj_lastCreatedUnit, 75.00, 0.00 )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
set bj_lastCreatedUnit = CreateUnit( A.p, OriginID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
set bj_lastCreatedUnit = CreateUnit( A.p, GreenSphereID, A.x, A.y, a )
call SetUnitX( bj_lastCreatedUnit, A.x )
call SetUnitY( bj_lastCreatedUnit, A.y )
call SetUnitScale( bj_lastCreatedUnit, 2.00, 2.00, 2.00 )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, 0.01, true, function SucculentionDamage )
set t = CreateTimer( )
call SaveUnitHandle( H, GetHandleId( t ), 0, A.caster )
call TimerStart( t, 0.00, false, function Pause )
set t = null
endfunction
//===========================================================================
function InitTrig_Succulention takes nothing returns nothing
//set gg_trg_Succulention = CreateTrigger( )
// юніт з коренями
if RootAbility > 0 then
set TempUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u007', GetRectCenterX( bj_mapInitialPlayableArea ), GetRectCenterY( bj_mapInitialPlayableArea ), 0.00 )
endif
endfunction
endlibrary
инструкция по импорту
- скопировать триггер Succulention и вставить в карту
- заполнить данные в коде Succulention, где имеются комментарии, в соответствии с объектами из ро
- создать переменную с названием TempUnit для гуи пользования
отделённые комментарием триггеры не нужны, один для показа урона, другой для гуи примера
если нужна дополнительная помощь, а-ля изменить радиус притягивания, формулу, высоту молний, эффект при уроне, молнию в обратную сторону, убрать какие-то лишние элементы и т.п., без проблем сделаю или поясню как сделать самому
я не думаю что кто-то всерьёз (мб гуишники) будет этот спелл где-то использовать, так что просто демонстрирую идею
😡