Hi, I'm making a chance on hit knockback spell for my map, but it doesn't work, all it does is damaging the target, it doesn't knock it back.
I do not use any editors, nor am I planning on doing so
Here's the spell:
Thanks in advance!
EDIT: It now works!
I do not use any editors, nor am I planning on doing so
Here's the spell:
JASS:
function Trig_Bash_Conditions takes nothing returns boolean
return GetUnitAbilityLevel( GetAttacker(), 039;A000039; ) > 0 and IsUnitIllusion( GetAttacker()) == false and IsUnitType( GetTriggerUnit(), UNIT_TYPE_STRUCTURE ) == false and IsUnitEnemy( GetTriggerUnit(), GetOwningPlayer( GetAttacker() ) ) and GetRandomInt( 1, 100 ) < 18
endfunction
function Trig_Bash_Main takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer timerID = GetHandleId( t )
local unit moveTarget = LoadUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ) )
local real moveAngle = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ) )
local real moveAmount = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ) )
local real totalDur = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ) )
local real currentDur = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ) )
local real targetX = GetUnitX( moveTarget )
local real targetY = GetUnitY( moveTarget )
if ( GetUnitState( moveTarget, UNIT_STATE_LIFE ) > 0.405 ) then
call SetUnitPosition( moveTarget, targetX + moveAmount * Cos( moveAngle ), targetY + moveAmount * Sin( moveAngle ) )
endif
set currentDur = currentDur + 0.01
if ( totalDur < 0.1 ) then
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ), moveAmount )
else
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ), moveAmount * 0.98 )
endif
if ( currentDur < totalDur ) then
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ), moveAngle )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ), totalDur )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ), currentDur )
call SaveUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ), moveTarget )
else
call DestroyTimer( t )
set moveTarget = null
endif
endfunction
function Trig_Bash_Actions takes nothing returns nothing
local unit attackedUnit = GetTriggerUnit()
local unit attackingUnit = GetAttacker()
local real dur = 0
local real currentDur = 0
local timer t = CreateTimer()
local integer timerID = GetHandleId( t )
local real moveAngle = Atan2( GetUnitY( attackedUnit ) - GetUnitY( attackingUnit ), GetUnitX( attackedUnit ) -GetUnitX( attackingUnit ) )
local real moveAmount = 2.
local integer abilityLevel = GetUnitAbilityLevel( attackingUnit, 039;A000039; )
local real totalDur = 0.5 + 0.2 * abilityLevel
call UnitDamageTarget( attackingUnit, attackedUnit, 50 * abilityLevel, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS )
call SaveUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ), attackedUnit )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ), moveAngle )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ), moveAmount )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ), totalDur )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ), currentDur )
call TimerStart( t, 0.01, true, function Trig_Bash_Main )
set attackedUnit = null
set attackingUnit = null
set t = null
call FlushChildHashtable( udg_ht_AbilityTable, timerID )
endfunction
function InitTrig_Bash takes nothing returns nothing
set gg_trg_Bash = CreateTrigger( )
call TriggerAddCondition( gg_trg_Bash, Condition( function Trig_Bash_Conditions ) )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Bash, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Bash, function Trig_Bash_Actions )
endfunction
Thanks in advance!
EDIT: It now works!
JASS:
function Trig_Bash_Conditions takes nothing returns boolean
return GetUnitAbilityLevel( GetAttacker(), 039;A000039; ) > 0 and IsUnitIllusion( GetAttacker()) == false and IsUnitType( GetTriggerUnit(), UNIT_TYPE_STRUCTURE ) == false and IsUnitEnemy( GetTriggerUnit(), GetOwningPlayer( GetAttacker() ) ) and GetRandomInt( 1, 100 ) < 18
endfunction
function Trig_Bash_Main takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer timerID = GetHandleId( t )
local unit moveTarget = LoadUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ) )
local real moveAngle = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ) )
local real moveAmount = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ) )
local real currentDur = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ) )
local real maxDur = LoadReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ) )
local real currentX = GetUnitX( moveTarget )
local real currentY = GetUnitY( moveTarget )
local real newX = currentX + moveAmount * Cos( moveAngle )
local real newY = currentY + moveAmount * Sin( moveAngle )
call SetUnitPosition( moveTarget, newX, newY )
set currentDur = currentDur + 0.01
set moveAmount = moveAmount * 0.98
if ( currentDur < maxDur ) then
call BJDebugMsg( "CurrentDur is less than TotalDur" )
call SaveUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ), moveTarget )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ), moveAngle )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ), moveAmount )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ), currentDur )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ), maxDur )
elseif ( currentDur >= maxDur ) then
call BJDebugMsg( "CurrentDur is moar than Totaldur, spell is finished" )
call FlushChildHashtable( udg_ht_AbilityTable, timerID )
call DestroyTimer( GetExpiredTimer() )
set moveTarget = null
endif
endfunction
function Trig_Bash_Actions takes nothing returns nothing
local unit attackedUnit = GetTriggerUnit()
local unit attackingUnit = GetAttacker()
local real dur = 0
local real currentDur = 0
local timer t = CreateTimer()
local integer timerID = GetHandleId( t )
local real moveAngle = Atan2( GetUnitY( attackedUnit ) - GetUnitY( attackingUnit ), GetUnitX( attackedUnit ) - GetUnitX( attackingUnit ) )
local real moveAmount = 2.
local integer abilityLevel = GetUnitAbilityLevel( attackingUnit, 039;A000039; )
local real totalDur = 0.5 + 0.2 * abilityLevel
call BJDebugMsg( R2S( moveAngle ) )
call UnitDamageTarget( attackingUnit, attackedUnit, 50 * abilityLevel, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS )
call SaveUnitHandle( udg_ht_AbilityTable, timerID, StringHash( "Defender" ), attackedUnit )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "Angle" ), moveAngle )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "MoveAmount" ), moveAmount )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "TotalDur" ), totalDur )
call SaveReal( udg_ht_AbilityTable, timerID, StringHash( "CurrentDur" ), currentDur )
call BJDebugMsg( "Timer starting..." )
call TimerStart( t, 0.01, true, function Trig_Bash_Main )
set attackedUnit = null
set attackingUnit = null
set t = null
endfunction
function InitTrig_Bash takes nothing returns nothing
set gg_trg_Bash = CreateTrigger( )
call TriggerAddCondition( gg_trg_Bash, Condition( function Trig_Bash_Conditions ) )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Bash, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Bash, function Trig_Bash_Actions )
endfunction