library RushorRush uses FieldOfView, UnitStatus
globals
private constant integer SPELL_ID = 'GSoR'
// CONFIG FOR < 50% Health
private constant real DIS1 = 1000
private constant real SPEED = 900
private constant real SperD = 0.03125000 * SPEED
private constant real Ct = DIS1 / SperD
private constant real Rspd = Ct * 0.03125000
private constant real KB_DIS1 = 150.
private constant real DAMAGE = 500.
// CONFIG FOR > 50% Health
private constant real DIS2 = 1400
private constant real SPEED2 = 400
private constant real SperD2 = 0.03125000 * SPEED2 // 12.5
private constant real Ct2 = DIS2 / SperD2 // 700 / 12.5 == 80
private constant real Rspd2 = Ct2 * 0.03125000 // 80 * 0.03 == 2.5
private constant real KB_DIS2 = 500.
private constant real DAMAGE2 = 250. // CLEAVE
private constant real DAMAGEGERETAN = 600. // GERETAN
private constant real BENGOKTIME = 1.2
// LUAR CONFIG
private unit c
private real rangcon = 0
private boolean rat // true = below 50%, false = diatas 50%
private group firsthit1
private timer who
private real mblayu = 0
private real sx
private real sy
private group firsthit2
private boolean array whoth
private boolean hasc
private real array xoc
endglobals
private struct RusorRus
static method onInit takes nothing returns nothing
local trigger t = CreateTrigger( )
local integer i = 0
call PlaySoundEx( "Units\\Orc\\Hellscream\\GromYesAttack2.wav", 100., 0., 0. )
set firsthit1 = CreateGroup( )
set firsthit2 = CreateGroup( )
set who = CreateTimer( )
loop
exitwhen i > 15
call TriggerRegisterPlayerUnitEvent( t, Player( i ), EVENT_PLAYER_UNIT_SPELL_EFFECT, null )
set i = i + 1
endloop
call TriggerAddCondition( t, function thistype.Act )
set t = CreateTrigger( )
call TriggerRegisterVariableEvent( t, "EVENT_JUMP_PERIODIC", EQUAL, 1. )
call TriggerAddCondition( t, function thistype.periodic )
set t = null
set t = CreateTrigger( )
call TriggerRegisterVariableEvent( t, "EVENT_JUMP_FINISH", EQUAL, 1. )
call TriggerAddCondition( t, function thistype.finish )
set t = null
endmethod
static method Act takes nothing returns boolean
local real x
local real y
if GetSpellAbilityId( ) == SPELL_ID then
call GroupClear( firsthit1 )
call GroupClear( firsthit2 )
set c = GetTriggerUnit( )
set rangcon = 0
set hasc = false
if GetUnitStatePercent( c, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE ) >= 50 then
set x = PolarX( GetUnitX( c ), DIS1, GetUnitFacing( c ) )
set y = PolarY( GetUnitY( c ), DIS1, GetUnitFacing( c ) )
set rat = false
call PlayAnimID( c, 6 )
call Jump.start( c, x, y, 1., Rspd, 10., false, true )
else
call PlayAnimID( c, 11 )
call DisableUnit( c, true )
set x = GetUnitX( c )
set y = GetUnitY( c )
call PlaySoundEx( "Units\\Orc\\Hellscream\\GromYesAttack2.wav", 100, x, y )
call TimerStart( CreateTimer( ), BENGOKTIME, false, function thistype.FinishRoar )
endif
endif
return true
endmethod
static method FinishRoar takes nothing returns boolean
local real x
local real y
set rat = true
call DisableUnit( c, false )
set x = PolarX( GetUnitX( c ), DIS2, GetUnitFacing( c ) )
set y = PolarY( GetUnitY( c ), DIS2, GetUnitFacing( c ) )
set sx = PolarX( GetUnitX( c ), DIS2, GetUnitFacing( c ) )
set sy = PolarY( GetUnitY( c ), DIS2, GetUnitFacing( c ) )
call ResetUnitAnimation( c )
call PlayAnimID( c, 4 )
call Jump.start( c, x, y, 1., Rspd2, 10., false, true )
call DestroyTimer( GetExpiredTimer( ) )
return true
endmethod
static method periodic takes nothing returns boolean
local unit ev = EVENT_JUMP_UNIT
local real x = GetUnitX( ev )
local real y = GetUnitY( ev )
local group kz
local unit p
local real px
local real py
local real Abet
local real disx
local real sperdz
local real dx
local real dy
if ev == c then
if rat then
//if mblayu > 0.8 then
//call PlayAnimID( ev, 4 )
//set mblayu = 0
//else
//set mblayu = mblayu + 0.03125
//endif
if rangcon > 0.4 then
set rangcon = 0.
call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", x, y ) )
else
set rangcon = rangcon + 0.03125
endif
set kz = CreateGroup( )
call GroupEnumUnitsInRange( kz, x, y, 200, null )
loop
set p = FirstOfGroup( kz )
exitwhen p == null
if IsUnitEnemy( p, GetOwningPlayer( ev ) ) and not IsUnitDeadBJ( p ) and IsUnitInSightOfUnit( ev, p, 90. ) and not whoth[GetUnitUserData( p )] and not IsUnitInGroup( p, firsthit2 ) then
set xoc[GetUnitUserData( p )] = 0.
call GroupAddUnit( firsthit2, p )
set whoth[GetUnitUserData( p )] = true
set Abet = GetUnitFacing( ev )
set dx = ( GetUnitX( p ) - sx )
set dy = ( GetUnitY( p ) - sy )
set disx = SquareRoot( dx * dx + dy * dy )
set sperdz = ( disx / SperD2 ) * 0.0312500
set px = PolarX( GetUnitX( p ), disx, Abet )
set py = PolarY( GetUnitY( p ), disx, Abet )
call Jump.start( p, px, py, 1., sperdz, disx, false, true )
call UnitDamageTarget( ev, p, DAMAGEGERETAN, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
endif
call GroupRemoveUnit( kz, p )
endloop
call DestroyGroup( kz )
else
call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", x, y ) )
set kz = CreateGroup( )
call GroupEnumUnitsInRange( kz, x, y, 200., null )
loop
set p = FirstOfGroup( kz )
exitwhen p == null
if IsUnitEnemy( p, GetOwningPlayer( ev ) ) and not IsUnitDeadBJ( p ) and not IsUnitInGroup( p, firsthit1 ) and not whoth[GetUnitUserData( p )] then
set whoth[GetUnitUserData( p )] = true
set Abet = AbetXY( x, y, GetUnitX( p ), GetUnitY( p ) )
set px = PolarX( GetUnitX( p ), KB_DIS1, Abet )
set py = PolarY( GetUnitY( p ), KB_DIS1, Abet )
call Jump.start( p, px, py, 1., 0.25, 10., false, true )
call UnitDamageTarget( ev, p, DAMAGE, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call GroupAddUnit( firsthit1, p )
endif
call GroupRemoveUnit( kz, p )
endloop
call DestroyGroup( kz )
endif
endif
if IsUnitInGroup( ev, firsthit1 ) then
call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", x, y ) )
endif
if IsUnitInGroup( ev, firsthit2 ) then
if xoc[GetUnitUserData( ev )] > 0.4 then
set xoc[GetUnitUserData( ev )] = 0.
call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", x, y ) )
else
set xoc[GetUnitUserData( ev )] = xoc[GetUnitUserData( ev )] + 0.0312500
endif
endif
call DestroyGroup( kz )
set p = null
set kz = null
return true
endmethod
static method finish takes nothing returns boolean
call ForGroup( firsthit2, function thistype.clearIng )
call ForGroup( firsthit1, function thistype.clearIng )
if rat then
if not hasc then
call ResetUnitAnimation( c )
set hasc = true
call PlayAnimID( c, 10 )
call DisableUnit( c, true )
call TimerStart( CreateTimer( ), .6, false, function thistype.onCleave )
endif
endif
return true
endmethod
static method clearIng takes nothing returns nothing
local unit p = GetEnumUnit( )
set whoth[GetUnitUserData( p )] = false
call GroupRemoveUnit( firsthit2, p )
call GroupRemoveUnit( firsthit1, p )
endmethod
static method onCleave takes nothing returns nothing
local group kz = CreateGroup( )
local unit p
local real Abet
local real px
local real py
call TimerStart( CreateTimer( ), 0.6 - 0.4, false, function thistype.RealFinish )
call GroupEnumUnitsInRange( kz, GetUnitX( c ), GetUnitY( c ), 300., null )
loop
set p = FirstOfGroup( kz )
exitwhen p == null
if IsUnitEnemy( p, GetOwningPlayer( c ) ) and not IsUnitDeadBJ( p ) then
if not IsUnitInGroup( p, firsthit1 ) then
set xoc[GetUnitUserData( p )] = 0.
set Abet = AbetXY( GetUnitX( c ), GetUnitY( c ), GetUnitX( p ), GetUnitY( p ) )
set px = PolarX( GetUnitX( p ), KB_DIS2, Abet )
set py = PolarY( GetUnitY( p ), KB_DIS2, Abet )
call Jump.start( p, px, py, 1., 1, 10., false, true )
call UnitDamageTarget( c, p, DAMAGE2, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call GroupAddUnit( firsthit1, p )
endif
endif
call GroupRemoveUnit( kz, p )
endloop
call DestroyTimer( GetExpiredTimer( ) )
endmethod
static method RealFinish takes nothing returns boolean
call DisableUnit( c, false )
call ResetUnitAnimation( c )
call DestroyTimer( GetExpiredTimer( ) )
return true
endmethod
endstruct
endlibrary
//Code indented using The_Witcher's Script Language Aligner
//Download the newest version and report bugs at www.hiveworkshop.com