• Check out the results of the Techtree Contest #19!
  • 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 void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 22nd Icon Contest: Creep Abilities is now concluded, time to vote for your favourite set of icons! Click here to vote!

IsWalkabilityOff 1.5

Why?
The native IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) excludes destructible and building pathing
This library contains two distinct functions for detecting if pathing type walkability is off that includes destructible and building pathing

API
function IsWalkabilityOff takes real x, real y returns boolean

Checks if walkability is off at certain xy, including units

NOTE: Units with the Ghost abilities (Ahgo, Aeth) or using Wind Walk are excluded from the check.

function IsTerrainWalkabilityOff takes real x, real y returns boolean
Checks if walkability is off at certain cell containing xy, excluding units

NOTE: When SHARED_CONTROL_WALK_PLAYER = true, units are excluded from the check and units paused with PauseUnit standing on unwalkable terrain are considered as walkable terrain.
This option causes all players to have ALLIANCE_SHARED_CONTROL toward WALK_PLAYER.
If the "Set Aspect Of Alliance" and "Shared Units" is turned off, which can happen when using "Set Alliance", the function will stop excluding units from the check.
In short, only use "Set Aspect Of Alliance" toward WALK_PLAYER and dont turn off "Shared Units" toward WALK_PLAYER.
When SHARED_CONTROL_WALK_PLAYER = false, units with the Ghost abilities (Ahgo, Aeth) or using Wind Walk are excluded from the check.

Story
This library is the result of me trying to find the fastest and most efficient method for detecting walkability by comparing existing methods

JASS
JASS:
library IsWalkabilityOff//by Duckfarter

    /*    Configuration
        ¯¯¯¯¯¯¯¯¯¯¯¯¯    */
    globals
        private constant integer WALK_CHECKER  = 'iWO0'
        private constant integer WALK_CHECK  = 'iWO1'
        private constant integer WALK_CHECK_TERRAIN = 'iWO2'
        private constant player  WALK_PLAYER  = Player(PLAYER_NEUTRAL_PASSIVE)
        private constant boolean SHARED_CONTROL_WALK_PLAYER = true
    endglobals
/*
                    IsWalkabilityOff 1.5
                    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
        Description:
        ¯¯¯¯¯¯¯¯¯¯¯¯
            Contains two distinct functions for detecting if pathing type walkability is off that includes 
            destructible and building pathing

        API:
        ¯¯¯¯
            1. Used for checking if walkability is off at certain xy, including units
            
                | function IsWalkabilityOff takes real x, real y returns boolean

                NOTE: Units with the Ghost abilities (Ahgo, Aeth) or using Wind Walk are excluded from 
                the check.

            2. Used for checking if walkability is off at certain cell containing xy, excluding units
            
                | function IsTerrainWalkabilityOff takes real x, real y returns boolean
                
                NOTE: When SHARED_CONTROL_WALK_PLAYER = true, units are excluded from the check and
                units paused with PauseUnit standing on unwalkable terrain are considered as walkable 
                terrain. This option causes all players to have ALLIANCE_SHARED_CONTROL toward 
                WALK_PLAYER. If the "Set Aspect Of Alliance" and "Shared Units" is turned off, which 
                can happen when using "Set Alliance", the function will stop excluding units from the 
                check. In short, only use "Set Aspect Of Alliance" toward WALK_PLAYER and dont turn off 
                "Shared Units" toward WALK_PLAYER.
                When SHARED_CONTROL_WALK_PLAYER = false, units with the Ghost abilities (Ahgo, Aeth) or 
                using Wind Walk are excluded from the check.

        How to import:
        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
            1. Copy units WalkCheck ID: iWO1, WalkCheckTerrain ID: iWO2 and WalkChecker ID: iWO0
            2. Copy category/trigger IsWalkabilityOff 1.5

        Credits:
        ¯¯¯¯¯¯¯¯
            - Kazeon for PathingLib which this library is based on.

        Link:
        ¯¯¯¯¯
            https://www.hiveworkshop.com/threads/iswalkabilityoff-1-5.354129/
*/
    globals
        private unit walkChecker
    endglobals

    function IsWalkabilityOff takes real x, real y returns boolean
        return IssueBuildOrderById(walkChecker, WALK_CHECK, x, y)
    endfunction

    function IsTerrainWalkabilityOff takes real x, real y returns boolean
        return IssueBuildOrderById(walkChecker, WALK_CHECK_TERRAIN, x, y)
    endfunction

    private module Init
        private static method onInit takes nothing returns nothing
            call init()
        endmethod
    endmodule

    private struct InitStruct extends array
        private static method init takes nothing returns nothing
            local integer i = 0
            set walkChecker = CreateUnit(WALK_PLAYER, WALK_CHECKER, 0, 0, 0)
            call BlzPauseUnitEx(walkChecker, true)
            call ShowUnit(walkChecker, false)
            call BlzUnitDisableAbility(walkChecker, 'ANbu', false, false)
            call SetPlayerTechMaxAllowed(WALK_PLAYER, WALK_CHECK, 0)
            call SetPlayerTechMaxAllowed(WALK_PLAYER, WALK_CHECK_TERRAIN, 0)
            if SHARED_CONTROL_WALK_PLAYER then
                loop
                    exitwhen i > bj_MAX_PLAYERS
                    if Player(i) != WALK_PLAYER then
                        call SetPlayerAlliance(Player(i), WALK_PLAYER, ALLIANCE_SHARED_CONTROL, true)
                    endif
                    set i = i + 1
                endloop
            endif
        endmethod
        implement Init
    endstruct

endlibrary
07-07-2024, Version 1.0:
Released
XX-07-2024, Version 1.1:
Changed description, added more demo, made units non-hero, other miscellaneous changes
17-07-2024, Version 1.2:
Simplified demo triggers
11-05-2025, Version 1.3:
Reworked description to be more informative
31-07-2025, Version 1.4:
Fixed an initialisation error not sharing control for unused players toward walk player
Added info about interaction with Ghost abilities and Wind Walk, excluding units from walkability checks

04-08-2025, Version 1.5:
Added Pause immunity to walkChecker so that pausing walkChecker doesnt break the checks
Added info about units paused with PauseUnit being considered as walkable terrain
Credits:
Kazeon for PathingLib which this library is based on
Keywords:
check, detect, walkability, walkable, pathing, pathability, terrain, off
Previews
Contents

IsWalkabilityOff 1.5 (Map)

Reviews
Antares
Simple and working as intended. Approved
What does this do differently than IsTerrainPathable or your other library?
IsTerrainPathable is a native that doesnt always return correct values because it doesnt consider all destructible, buildings or unit pathing. It is a shown unreliable native that spawned the likes of Rising_Dusk's IsTerrainPathable, Anitarf and Vexorian IsTerrainPathable, Nestharus' IsPathable, PathingLib and PurgeandFire's CheckWalkability.

This system can use that native to an advantage, but is not the only one that can, by inverting how it checks for pathing it can use the native to narrow the search. Simply, the native is fast so if it can be used its good. This system is best compared to PathingLib since is uses the same method but inverted and with a few more quirks.

My other resource is practically unrelated to this one. They are totally seperate.
 
IsTerrainPathable is a native that doesnt always return correct values because it doesnt consider all destructible, buildings or unit pathing. It is a shown unreliable native that spawned the likes of Rising_Dusk's IsTerrainPathable, Anitarf and Vexorian IsTerrainPathable, Nestharus' IsPathable, PathingLib and PurgeandFire's CheckWalkability.
I see. Good to know, thanks. Make sure to add this to your description (see our resource submission rules regarding descriptions).
 
Okay really though how much faster is it? Because as it stands this really looks like it should be a pr for the pathing lib
Haha sorry for the weird reply before I dont know how that happened XD I guess I was trying to respond yesterday. Anyway, the reason this system and the inverted method is faster is twofold. This method of checking pathability by trying to issue a build order is much faster if the result is false. By inverting this system the result is false when the path is walkable and I believe walkable paths are more commonly checked than unwalkable paths. Secondly, thanks to BlzPauseEx and Limit construction of units, its 6.5x faster to check for with this system unwalkable paths, but PathingLib could add this method and make its walkable paths 6.5x faster to check as well. Remember the mentioned paths are the ones that are slow to check. Thirdly, it can exclude player units thanks to adding a pathing map to one of the units built and sharing control with the WALK_PLAYER to exclude that player from the search, which is the size of a cell, which is also very useful for systems like Bresenham Pathchecker since their method is built on checking a cell at a time. A pathing map on a built unit on a walkable path would cause a unit to move out of the way, but that doesnt happen with unwalkable paths. So I intentionally limited this system in an inverted way. What does PR mean, part? Maybe, but it hasnt happened yet.
 
I applied this system to my map and it doesn't work. I set the objectid, I set the unit exactly the same as your demo trigger.
I suspected that an existing trigger in my map was causing error, so I tried deleting all other triggers, but that didn't work either. Do gameplay constants or other settings affect whether this system works or not?
 
I applied this system to my map and it doesn't work. I set the objectid, I set the unit exactly the same as your demo trigger.
I suspected that an existing trigger in my map was causing error, so I tried deleting all other triggers, but that didn't work either. Do gameplay constants or other settings affect whether this system works or not?
There are no gameplay constants or other settings that are required for this system to work. I cant imagine any gameplay constant or setting that would cause any issues either. What I do know is that for the function IsTerrainWalkabilityOff to work, it requires that all players have shared control towards neutral passive which is handled automatically by the system.

The function IsWalkabilityOff() takes unit collision into consideration. That means that if the starting co-ordinates are on top of a unit with collision it will return true as in walkability is off.
Did you try both the function IsWalkabilityOff and IsTerrainWalkabilityOff?

Could you per heaps show me how you are using this system in a trigger?
 
The IsWalkabilityOff library is clean and works as intended.

You have packaged the IsPathWalkable function with the test map. As far as I can tell, this is its own stand-alone system (that is based on someone else's library, but you modified). You can package those in the same resource or upload them separately - that's up to you. But it shouldn't be in the Demo section, because it's its own system and not for demo purposes.

The demo triggers are quite byzantine. They add unnecessary confusion to what should be a simple-to-use library. Why is this not a simple if IsWalkabilityOff(x, y) then print X else print Y endif?. Please clean them up a bit.

The Knight trigger message shows the inverse of what it should show.

Awaiting Update
 
The IsWalkabilityOff library is clean and works as intended.

You have packaged the IsPathWalkable function with the test map. As far as I can tell, this is its own stand-alone system (that is based on someone else's library, but you modified). You can package those in the same resource or upload them separately - that's up to you. But it shouldn't be in the Demo section, because it's its own system and not for demo purposes.

The demo triggers are quite byzantine. They add unnecessary confusion to what should be a simple-to-use library. Why is this not a simple if IsWalkabilityOff(x, y) then print X else print Y endif?. Please clean them up a bit.

The Knight trigger message shows the inverse of what it should show.

Awaiting Update
Makes sense. Thank you.
 
There's a problem when I try to make a triggered movement spell that moves the unit 10~20 distance every 0.03125 seconds, in which the unit only stops/changes direction when it bumps into a terrain or doodad obstacle.

If I use this library, the IsWalkabilityOff function will return true when it checks for walkability in a point 10~20 distance away from the unit (because the unit has 32-48 collision size, covering that distance), causing the unit to stop prematurely when it should be able to move on walkable terrain.
First, I tried turning off the spellcasting unit's collision during the spell's duration, and this didn't work.
Then, I tried adding the Ghost (Aeth) ability to the spellcasting unit, which did enable it to move until it bumps into another unit that has collision, which is when the movement gets halted.
When I use IsTerrainWalkabilityOff instead, the unit seems to move forever and ignore all terrain obstacles. Very strange.
I encounter no such issue when I use the JASS function IsTerrainPathable. I think there's a point in using IsTerrainPathable because it only checks the pathing logic at a given point, while your library checks whether a unit/building can be placed at a given point to determine the pathing logic.
  • Boss 4 charge loop
    • Events
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Spell__Expired Equal to True
        • Then - Actions
          • Unit - For Unit Spell__Caster, start cooldown of ability Spell__Ability " over "10.00 seconds.
          • Custom script: call BlzPauseUnitEx(udg_Spell__Caster,false)
          • Custom script: call BlzUnitDisableAbility(udg_Spell__Caster,'Amov',false,false)
          • Custom script: call BlzUnitDisableAbility(udg_Spell__Caster,'Aatk',false,false)
          • Unit - For Spell__Caster, Ability Level 4 Boss - Missile Homing (Neutral Hostile), Disable ability: False, Hide UI: False
          • Unit - For Spell__Caster, Ability Level 4 Boss - Artillery (Neutral Hostile), Disable ability: False, Hide UI: False
          • Unit - For Spell__Caster, Ability Level 4 Boss - Air Teleport , Disable ability: False, Hide UI: False
          • Unit - For Spell__Caster, Ability Level 4 Boss - Grave Zone (Neutral Hostile), Disable ability: False, Hide UI: False
        • Else - Actions
          • Set TempInt = ((Load -1 of Spell__Index from Spell__Hash.) + 1)
          • Hashtable - Save TempInt as -1 of Spell__Index in Spell__Hash.
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TempInt Equal to 1
            • Then - Actions
              • Unit - For Spell__Caster, Ability Level 4 Boss - Missile Homing (Neutral Hostile), Disable ability: True, Hide UI: True
              • Unit - For Spell__Caster, Ability Level 4 Boss - Artillery (Neutral Hostile), Disable ability: True, Hide UI: True
              • Unit - For Spell__Caster, Ability Level 4 Boss - Air Teleport , Disable ability: True, Hide UI: True
              • Unit - For Spell__Caster, Ability Level 4 Boss - Grave Zone (Neutral Hostile), Disable ability: True, Hide UI: True
              • Custom script: call BlzUnitDisableAbility(udg_Spell__Caster,'Amov',true,true)
              • Custom script: call BlzUnitDisableAbility(udg_Spell__Caster,'Aatk',true,true)
              • Custom script: call BlzPauseUnitEx(udg_Spell__Caster,true)
              • Animation - Play Spell__Caster's animation at index 3
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • TempInt Greater than 320
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load -2 of Spell__Index from Spell__Hash.) Equal to 0
                • Then - Actions
                  • Animation - Reset Spell__Caster's animation
                  • Hashtable - Save 1 as -2 of Spell__Index in Spell__Hash.
                • Else - Actions
            • Else - Actions
              • Set Boss4_SpellCharge_X = ((X coordinate of Spell__Caster) + (Load 0 of Spell__Index from Spell__Hash.))
              • Set Boss4_SpellCharge_Y = ((Y coordinate of Spell__Caster) + (Load 1 of Spell__Index from Spell__Hash.))
              • Unit - Make Spell__Caster face (Load 2 of Spell__Index from Spell__Hash.)
              • Custom script: if IsTerrainPathable(udg_Boss4_SpellCharge_X,udg_Boss4_SpellCharge_Y,ConvertPathingType(1)) then
              • Set Boss4_SpellCharge_Angle = (Atan2(((Y coordinate of Spell__Target) - (Y coordinate of Spell__Caster)), ((X coordinate of Spell__Target) - (X coordinate of Spell__Caster))))
              • Hashtable - Save (Boss4_SpellCharge_Velocity x (Cos(Boss4_SpellCharge_Angle))) as 0 of Spell__Index in Spell__Hash.
              • Hashtable - Save (Boss4_SpellCharge_Velocity x (Sin(Boss4_SpellCharge_Angle))) as 1 of Spell__Index in Spell__Hash.
              • Hashtable - Save Boss4_SpellCharge_Angle as 2 of Spell__Index in Spell__Hash.
              • Unit - Make Spell__Caster face Boss4_SpellCharge_Angle
              • Custom script: else
              • Custom script: call DestroyEffect(AddSpecialEffectLoc("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl",udg_Spell__CastPoint))
              • Set Spell__InRangePoint = Spell__CastPoint
              • Set Spell__InRange = 200.00
              • For each (Integer A) from 1 to Spell__InRangeCount, do (Actions)
                • Loop - Actions
                  • Set TempReal = 100.00
                  • Unit - Cause Spell__Caster to damage Spell__InRangeUnits[(Integer A)], dealing TempReal damage of attack type Chaos and damage type Normal
              • Custom script: call SetUnitX(udg_Spell__Caster,udg_Boss4_SpellCharge_X)
              • Custom script: call SetUnitY(udg_Spell__Caster,udg_Boss4_SpellCharge_Y)
              • Custom script: endif
 
Last edited:
Hey Spacebuns and thanks for the report.

Interesting interaction with the Ghost ability and good find. The same happens for a unit using Wind Walk. Ill add information about it in the description.

The behaviour with IsTerrainWalkabilityOff sounds strange indeed and that is the proper function to use for that spell. I found a fault in my initialisation code. It uses the player group All players to share control but I noticed it doesnt contain unused players units. It could be the cause of the strange behaviour. I will fix this.

Could you try again with the new code? If that doesnt work you could make sure the system is at least working correctly with a simple trigger such as this that should work.
  • Demo IsTerrainWalkabilityOff
    • Events
      • Unit - A unit Is issued an order targeting a point
    • Conditions
      • (Issued order) Equal to (Order(smart))
      • (Unit-type of (Triggering unit)) Equal to IsTerrainWalkabilityOff (Demo)
    • Actions
      • Custom script: local real x = GetOrderPointX()
      • Custom script: local real y = GetOrderPointY()
      • Custom script: if IsTerrainWalkabilityOff(x, y) then
      • Game - Display to (All players) for 0.01 seconds the text: IsTerrainWalkabilit...
      • Custom script: else
      • Game - Display to (All players) for 0.01 seconds the text: IsTerrainWalkabilit...
      • Custom script: endif
 
Hey Spacebuns and thanks for the report.

Interesting interaction with the Ghost ability and good find. The same happens for a unit using Wind Walk. Ill add information about it in the description.

The behaviour with IsTerrainWalkabilityOff sounds strange indeed and that is the proper function to use for that spell. I found a fault in my initialisation code. It uses the player group All players to share control but I noticed it doesnt contain unused players units. It could be the cause of the strange behaviour. I will fix this.

Could you try again with the new code? If that doesnt work you could make sure the system is at least working correctly with a simple trigger such as this that should work.
  • Demo IsTerrainWalkabilityOff
    • Events
      • Unit - A unit Is issued an order targeting a point
    • Conditions
      • (Issued order) Equal to (Order(smart))
      • (Unit-type of (Triggering unit)) Equal to IsTerrainWalkabilityOff (Demo)
    • Actions
      • Custom script: local real x = GetOrderPointX()
      • Custom script: local real y = GetOrderPointY()
      • Custom script: if IsTerrainWalkabilityOff(x, y) then
      • Game - Display to (All players) for 0.01 seconds the text: IsTerrainWalkabilit...
      • Custom script: else
      • Game - Display to (All players) for 0.01 seconds the text: IsTerrainWalkabilit...
      • Custom script: endif
I have updated your lib in my map with the 1.4 version but the problem persists. I copied the debugging action over to my check and the terrain cell in front of Lord Nightsorrow keeps being Walkable even though he has already gone outside the map bounds.
1753984026751.png
 
I have updated your lib in my map with the 1.4 version but the problem persists. I copied the debugging action over to my check and the terrain cell in front of Lord Nightsorrow keeps being Walkable even though he has already gone outside the map bounds.
A reason the function would always returns false is if a component is missing or off. Do theses pictures have the same values as your map?
iWO0 builds.PNG
iWO2 path.PNG
 
There's also something I found in the test map.
I attempted to place WalkCheck/WalkCheckTerrain units in the editor and they are placeable on walkable terrain despite the "Pathing - Placement Prevented By" field (upar) being set to "Ground pathable". So that field apparently doesn't do anything at all? Which means the lib's function will a bunch of false values.
The "Pathing - Placement Requires" (upap) still works though because it's used for buildings in the game.
 
Last edited:
There's also something I found in the test map.
I attempted to place WalkCheck/WalkCheckTerrain units in the editor and they are placeable on walkable terrain despite the "Pathing - Placement Prevented By" field (upar) being set to "Ground pathable". So that field apparently doesn't do anything at all? Which means the lib's function will a bunch of false values.
The "Pathing - Placement Requires" (upap) still works though because it's used for buildings in the game.
The editor is dumb. It probably only recognizes "Pathing Map" and "Placement Requires". "Placement Prevented By" works fine in-game.

The issue youre having with the library is a real detective story but I do like it. I found a new clue. Do you use this action?
  • Unit - Pause all units
If yes you could add this function to the library f.e. above the Init function
JASS:
function GetWalkChecker takes nothing returns unit
    return walkChecker
endfunction
and potentially debug, add this to the spell trigger before if IsTerrainWalkabilityOff...
  • Custom script: if IsUnitPaused(GetWalkChecker()) == true then
  • Game - Display to (All players) the text: walkChecker is paus...
  • Custom script: endif
Because I found that if the walkChecker is paused with PauseUnit the function fails. Dont know what to do about that for the library yet but what you could do if adding the GetWalkChecker function is this:
  • Unit - Pause all units
  • Custom script: call PauseUnit(GetWalkChecker(), false)
And for whatever reason if a non-air unit is paused (not BlzPauseUnitEx) and standing on unwalkable terrain the units collision counts as walkable. Thats a strange and annoying one for sure that Ill have to adress.

I am pretty sure the function failed because the walkChecker was paused but if that isnt the case Ill dig deeper. Thanks again for reporting back.


EDIT: Updated to 1.5 with fix that makes walkChecker immune to PauseUnit. Units paused with PauseUnit are still considered as walkable terrain for IsTerrainWalkabilityOff with SHARED_CONTROL_WALK_PLAYER = true.
 
Last edited:
Thank you but I cant open the map from my vanilla editor because Trigger function does not exist in database: GetUnitY
Are you using a special editor? I could look into how to open it but Id prefer if it was vanilla.
Well, that is definitely weird since GetUnitY is a normal JASS function. Can you try opening it in an editor that supports vJass?
 
Well, that is definitely weird since GetUnitY is a normal JASS function. Can you try opening it in an editor that supports vJass?
Yes. I used the implementation from [1.35+] GrapesOfWath's Extended GUI to open the map.

First off. It seems the Pit Lord has a very bad case of diarrhea...

I found that there are additional issues similar to PauseUnit with the IsTerrainWalkabilityOff method and the BlzUnitDisableAbility(..., 'Amov', ..., ...). For a clean and sure way to make the spell work with this system for now youd have to get rid of BlzUnitDisableAbility(..., 'Amov',... ,...) and the effect of that would be that the 'Amov' ability is not hidden in the command card when the unit is using the spell.
 
Yes. I used the implementation from [1.35+] GrapesOfWath's Extended GUI to open the map.

First off. It seems the Pit Lord has a very bad case of diarrhea...

I found that there are additional issues similar to PauseUnit with the IsTerrainWalkabilityOff method and the BlzUnitDisableAbility(..., 'Amov', ..., ...). For a clean and sure way to make the spell work with this system for now youd have to get rid of BlzUnitDisableAbility(..., 'Amov',... ,...) and the effect of that would be that the 'Amov' ability is not hidden in the command card when the unit is using the spell.
I did disable the BlzUnitDisableAbility(Amov) function but the result is still the same.
 
I did disable the BlzUnitDisableAbility(Amov) function but the result is still the same.
Did you do that in the same test map you posted? I should probably have mentioned. The test map you posted didnt have the iWO units added so I added them. After that I found that disabling both BlzUnitDisableAbility(..., 'Amov', ..., ...) functions made it work as expected. This problem is not good and Ill have to look into it further and adress it.
 
Did you do that in the same test map you posted? I should probably have mentioned. The test map you posted didnt have the iWO units added so I added them. After that I found that disabling both BlzUnitDisableAbility(..., 'Amov', ..., ...) functions made it work as expected. This problem is not good and Ill have to look into it further and adress it.
Lol, did I forget to add the iWO units? Embarrassing :P
But yeah, the BlzUnitDisableAbility(Amov) function shouldn't be necessary in my map, but it had to be there because in some cases the BlzPauseUnitEx function will fail to pause the unit when the unit should be paused.
 
Back
Top