Help with spell!

Nevyll

New Member
Reaction score
1
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 :p
Here's the spell:

JASS:
function Trig_Bash_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel( GetAttacker(), 'A000' ) > 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, 'A000' )
    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(), 'A000' ) > 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, 'A000' )
    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
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Try setting it to something greater than 2., like 10 or 15. I think 2 will probably be unnoticeable or hardly noticeable. (which might explain why you don't see the knockback)

Also be sure that udg_ht_AbilityTable is a valid hashtable. (That you've used [ljass] set udg_ht_AbilityTable = InitHashtable() [/ljass] some point before that spell is cast)
 

Nevyll

New Member
Reaction score
1
Well, the thing is not tht I don't notice it, it's that the whole knockback function just does not work :(
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top