• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • Create a faction for Warcraft 3 and enter Hive's 19th Techtree Contest: Co-Op Commanders! Click here to enter!
  • Create a void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 21st Texturing Contest: Upgrade is now concluded, time to vote for your favourite set of icons! Click here to vote!

Freeze Ground Spell JASS code check

Status
Not open for further replies.
I'm pratising a little JASS since GUI leaks too much imho
however I'm sure that my script is not perfect yet so I'd like someone to check it for mistakes/point of improvements

NOTE:
-no vJass
-I know it's not the smartest way to time stuff using neg reg or waits but it should work properly anyway

JASS:
function ResetTerrainTimed takes real x, real y, real dur returns nothing
    local real size = 448
    local real step = 32
    local real r = -size
    local real r2 = 0
    set udg_r = dur-0.8//some delay to make things work (probably it will work smooth with less but this is tested and turned out save)
    loop
        exitwhen r == size
        set r2 = -size
        loop
            exitwhen r2 == size
            set udg_x = x + r
            set udg_y = y + r2
            set udg_i = GetTerrainType(udg_x, udg_y)
            if udg_i != 'Idki' then
                call TriggerExecute( gg_trg_Glazed_Frost_Reset_Terrain )
            endif
            set r2 = r2 + step
        endloop
        set r = r + step
    endloop
    call SetTerrainType(x, y, 'Idki', 1, 4, 0 )
endfunction

function HideItem takes nothing returns nothing
     call SetItemVisible(GetFilterItem(), false)
endfunction

function ShowItem takes nothing returns nothing
     call SetItemVisible(GetFilterItem(), true)
endfunction

function Pathable takes real x, real y returns boolean
    local boolean b = false
    call MoveRectTo(udg_PathCheckRegion, x, y)
    call EnumItemsInRect(udg_PathCheckRegion, null, function HideItem)
    call SetItemPosition(udg_pathitem, x, y)
    call SetItemPosition(udg_pathitem2, x, y)
    if GetWidgetX(udg_pathitem)==x and GetWidgetY(udg_pathitem)==y and GetWidgetX(udg_pathitem2)!=x and GetWidgetY(udg_pathitem2)!=y then
        set b = true
    else
        set b = false
    endif
    call EnumItemsInRect(udg_PathCheckRegion, null, function ShowItem)
    call SetItemVisible(udg_pathitem, false)
    call SetItemVisible(udg_pathitem2, false)
    return b
endfunction
  • Events
    • Map initialization
  • Conditions
  • Actions
    • Set PathCheckRegion = (Region centered at (Point(0.00, 0.00)) with size (128.00, 128.00))
    • Item - Create Cheese at (Center of (Playable map area))
    • Set pathitem = (Last created item)
    • Item - Create Cheese at (Center of (Playable map area))
    • Set pathitem2 = (Last created item)
    • -------- Just some dummys to test things --------
    • For each (Integer A) from 1 to 100, do (Actions)
      • Loop - Actions
        • Unit - Create 1 Peon for Player 1 (Red) at (Random point in (Playable map area)) facing (Random angle) degrees
JASS:
function Trig_Glazed_Frost_Cast_Actions takes nothing returns nothing
    local real x = GetSpellTargetX()
    local real y = GetSpellTargetY()
    local unit u = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'e000', x, y, 0)
    set udg_r = GetUnitAbilityLevel(GetTriggerUnit(), GetSpellAbilityId()) * 5
    call SetWidgetLife(u, udg_r)
    call ShowUnit(u, false)
    call GroupAddUnit(udg_GlazedFrost_Dummys, u)
    call ResetTerrainTimed(x, y, udg_r)
    set u = null
endfunction

//===========================================================================
function InitTrig_Glazed_Frost_Cast takes nothing returns nothing
    set gg_trg_Glazed_Frost_Cast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Glazed_Frost_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_Glazed_Frost_Cast, function Trig_Glazed_Frost_Cast_Actions )
endfunction
JASS:
function GlazedFrost_Filter takes nothing returns boolean
    return not (IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) or IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) or GetWidgetLife(GetFilterUnit())<0.405)
endfunction

function GlazedFrost_MoveSliders takes nothing returns nothing
    local real r = 17
    local real size = 450
    local real x = GetUnitX(GetEnumUnit())
    local real y = GetUnitY(GetEnumUnit())
    local real x2 = 0
    local real y2 = 0
    local real a = 0
    local rect re = Rect(x-size, y-size, x+size, y+size)
    local unit u = null
    local group g = CreateGroup()

    if GetWidgetLife(GetEnumUnit()) > 0.405 then
        call GroupEnumUnitsInRect(g, re, Condition(function GlazedFrost_Filter))
        loop
            set u = FirstOfGroup(g)
            exitwhen u == null
            set x2 = GetUnitX(u)
            set y2 = GetUnitY(u)
            if size*size > (x-x2)*(x-x2)+(y-y2)*(y-y2) then
                set a = GetUnitFacing(u)*bj_DEGTORAD
                set x2 = x2+Cos(a)*r
                set y2 = y2+Sin(a)*r
                if Pathable(x2, y2) then
                    call SetUnitX(u, x2)
                    call SetUnitY(u, y2)
                endif
            endif
            call GroupRemoveUnit(g,u)
        endloop
    else
        call GroupRemoveUnit(udg_GlazedFrost_Dummys,GetEnumUnit())
        call RemoveUnit(GetEnumUnit())
        set udg_b = true
    endif

    call DestroyGroup(g)
    call RemoveRect(re)
    set re = null
    set g = null
endfunction

function GlazedFrost_Freeze takes nothing returns nothing
    call ResetTerrainTimed(GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()), GetWidgetLife(GetEnumUnit()))
endfunction

function Trig_Glazed_Frost_Loop_Actions takes nothing returns nothing
    set udg_b = false
    call ForGroup(udg_GlazedFrost_Dummys, function GlazedFrost_MoveSliders)
    //replace ice tiles to fill gapes created by overlapping casts
    if udg_b and FirstOfGroup(udg_GlazedFrost_Dummys) != null then
        call ForGroup(udg_GlazedFrost_Dummys, function GlazedFrost_Freeze)
    endif
endfunction

//===========================================================================
function InitTrig_Glazed_Frost_Loop takes nothing returns nothing
    set gg_trg_Glazed_Frost_Loop = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Glazed_Frost_Loop, 0.03 )
    call TriggerAddAction( gg_trg_Glazed_Frost_Loop, function Trig_Glazed_Frost_Loop_Actions )
endfunction
  • Events
  • Conditions
  • Actions
    • Custom script: local real x = udg_x
    • Custom script: local real y = udg_y
    • Custom script: local integer i = udg_i
    • Wait r game-time seconds
    • Custom script: call SetTerrainType(x, y, i, -1, 1, 0 )
 
Status
Not open for further replies.
Top