• 🏆 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!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Snippet] TerrainCheck

Level 31
Joined
Jul 10, 2007
Messages
6,306
For maze maps.

JASS:
library TerrainCheck /* v1.0.0.0
*************************************************************************************
*
*   */ uses /*
*
*       */ Tt       /*hiveworkshop.com/forums/jass-resources-412/system-timer-tools-201165/
*
************************************************************************************
*
*   struct TerrainCheck extends array
*       method register takes unit whichUnit returns nothing
*           -   Registers unit to be killed when it is on terrain
*           -   call TerrainCheck[terrainType].register(whichUnit)
*
*       method unregister takes unit whichUnit returns nothing
*           -   Unregisters unit from terrain (will no longer die on that terrain)
*           -   call TerrainCheck[terrainType].unregister(whichUnit)
*
************************************************************************************/
    globals
        private constant real RADIUS = 16
        private hashtable table = InitHashtable()
    endglobals
    
    private struct Check extends array
        private static constant real TIMEOUT = .03
        
        unit c
        integer t
        implement CTTC
            local unit u
            local real x
            local real y
            local integer m
        implement CTTCExpire
            set u = this.c
            set x = GetUnitX(u)
            set y = GetUnitY(u)
            set m = t
            
            if (GetTerrainType(x+RADIUS,y) == m and GetTerrainType(x-RADIUS, y) == m and GetTerrainType(x, y+RADIUS) == m and GetTerrainType(x, y-RADIUS) == m and /*
            */ GetTerrainType(x+RADIUS, y+RADIUS) == m and GetTerrainType(x+RADIUS, y-RADIUS) == m and GetTerrainType(x-RADIUS, y+RADIUS) == m and GetTerrainType(x-RADIUS, y-RADIUS) == m) then
                call KillUnit(u)
            endif
        implement CTTCNull
            set u = null
        implement CTTCEnd
    endstruct
    
    struct TerrainCheck extends array
        method register takes unit u returns nothing
            local Check check =  Check.create()
            call SaveInteger(table, check, GetHandleId(u), check)
            set check.c = u
            set check.t = this
        endmethod
        method unregister takes unit u returns nothing
            local integer h = GetHandleId(u)
            local Check c
            if (HaveSavedInteger(table, this, h)) then
                set c = LoadInteger(table, this, h)
                call RemoveSavedInteger(table, this, h)
                set c.c = null
                call c.destroy()
            endif
        endmethod
    endstruct
endlibrary
 
Last edited:
Top