• 💀 Happy Halloween! 💀 It's time to vote for the best terrain! Check out the entries to Hive's HD Terrain Contest #2 - Vampire Folklore.❗️Poll closes on November 14, 2023. 🔗Click here to cast your vote!
  • 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • 🏆 HD Level Design Contest #1 is OPEN! Contestants must create a maze with at least one entry point, and at least one exit point. The map should be made in HD mode, and should not be openable in SD. Only custom models from Hive's HD model and texture sections are allowed. The only exceptions are DNC models and omnilights. This is mainly a visual and design oriented contest, not technical. The UI and video walkthrough rules are there to give everyone an equal shot at victory by standardizing how viewers see the terrain. 🔗Click here to enter!

[JASS] Knockback Script Errors

Not open for further replies.
Level 4
Jun 8, 2007
So, i was following Silvenon's knockback script tutorial, and I couldn't get my code to work. If i try to check for errors in JassCraft, the program will just sit there telling me it is searching for errors. I have left it this way overnight, and it still has not come up with anything. When i try copying the code into my map header, saving yields an error on almost every line, mostly: "<line>: Expected end of line" or "<line>: Expected code statement".

Here is my code (Copied exactly from the tutorial).
library Knockback
struct Knockback_Data
    unit u
    real d1 
    real d2 
    real sin 
    real cos 
    real r 
    string s = ""  
    effect e = null 
    timer Tim = CreateTimer()  
    Knockback_Data array Ar 
    integer Total = 0 
    item I = CreateItem('ciri', 0, 0)  
    boolexpr Filter 
function CheckPathabilityTrickGet takes nothing returns nothing  
    set bj_rescueChangeColorUnit = bj_rescueChangeColorUnit or GetEnumItem() != I
endfunction function CheckPathabilityTrick takes real x, real y returns boolean
    local integer i = 30 
    local real X 
    local real Y 
    local rect r 
    call SetItemPosition(I, x, y)  
    set X = GetItemX(I) - x 
    set Y = GetItemY(I) - y 
    if X * X + Y * Y <= 100 then  
        return true  
    set r = Rect(x - i, y - i, x + i, y + i)  
    set bj_rescueChangeColorUnit = false  
    call EnumItemsInRect(r, null, function CheckPathabilityTrickGet)  
    call RemoveRect(r)  
    set r = null  
    return bj_rescueChangeColorUnit 
function CheckPathability takes real x, real y returns boolean  
    local boolean b = CheckPathabilityTrick(x, y)  
    call SetItemVisible(I, false) 
    return b 
function Knockback_TreeFilter takes nothing returns boolean  
    local integer d = GetDestructableTypeId(GetFilterDestructable())  
    return d == 'ATtr' or d == 'BTtw' or d == 'KTtw' or d == 'YTft' or d == 'JTct' or d == 'YTst' or d == 'YTct' or d == 'YTwt' or d == 'JTwt' or d == 'JTwt' or d == 'FTtw' or d == 'CTtr' or d == 'ITtw' or d == 'NTtw' or d == 'OTtw' or d == 'ZTtw' or d == 'WTst' or d == 'LTlt' or d == 'GTsh' or d == 'Xtlt' or d == 'WTtw' or d == 'Attc' or d == 'BTtc' or d == 'CTtc' or d == 'ITtc' or d == 'NTtc' or d == 'ZTtc'
constant function Interval takes nothing returns real  
    return 0.04 
function Knockback_Execute takes nothing returns nothing  
    local Knockback_Data kd 
    local integer i = 0 
    local real x 
    local real y 
    local rect r 
    local boolexpr b 
        exitwhen i >= Total 
        set kd = Ar[i]  
        if kd.s != null and kd.s != null then  
            set x = GetUnitX(kd.u)  
            set y = GetUnitY(kd.u)  
            call DestroyEffect(AddSpecialEffect(kd.s, x, y)  
            set x = x + kd.d1 * kd.cos 
            set y = y + kd.d1 * kd.sin 
            set x = GetUnitX(kd.u) + kd.d1 * kd.cos 
            set y = GetUnitY(kd.u) + kd.d1 * kd.sin 
        if kd.r != 0 then  
            set r = Rect(x - kd.r, y - kd.r, x + kd.r, y + kd.r)  
            set b = Filter(function Knockback_TreeFilter)  
            call EnumDestructablesInRect(r, b, function Knockback_KillTree)  
            call RemoveRect(r)  
            call DestroyBoolExpr(b) 
        if CheckPathability(x, y) then  
            call SetUnitX(kd.u, x)  
            call SetUnitY(kd.u, y)  
        set kd.d1 = kd.d1 - kd.d2 
        if kd.d1 <= 0 or not CheckPathability(x, y) then  
            if kd.e != null then  
                call DestroyEffect(kd.e)  
            call PauseUnit(kd.u, false)  
            set Ar[i] = Ar[Total - 1]  
            set Total = Total - 1 
            call kd.destroy()  
        set i = i + 1 
    if Total == 0 then  
        call PauseTimer(Tim) 
function Knockback takes unit u, real d, real a, real w, real r, integer t, string s, string p returns Knockback_Data 
    local Knockback_Data kd = Knockback_Data.create()  
    local integer q = R2I(w / Interval())  
    set kd.u = u 
    set kd.a = a 
    set kd.d1 = 2 * d / (q + 1) 
    set kd.d2 = kd.d1 / q 
    set kd.sin = Sin(a)  
    set kd.cos = Cos(a)  
    set kd.r = r 
    if s != "" and s != null then  
        if t == 2 then  
            if p != "" and p != null then  
                set kd.e = AddSpecialEffectTarget(s, u, p)  
                set kd.e = AddSpecialEffectTarget(s, u, "chest")  
        elseif t == 1 then  
            set kd.s = s 
    call SetUnitPosition(u, GetUnitX(u), GetUnitY(u))  
    call PauseUnit(u, true)  
    if Total == 0 then  
        call TimerStart(Tim, Interval(), true, function Knockback_Execute)  
    set Total = Total + 1 
    set Ar[Total - 1] = kd 
    return kd 
Level 4
Jun 8, 2007
Oh wow. That makes me feel really smart... Hehe... To think i was running the basic World Editor too...
Thanks though. =)
Not open for further replies.