• 🏆 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!

[Wurst] Pathable

Chaosy

Tutorial Reviewer
Level 40
Joined
Jun 9, 2011
Messages
13,183
Since I did not find something to check for pathability in the standard lib I adapted the isTerrainWalkable by Rising Dusk to wurst.

Wurst:
package pathable

import LinkedList

constant real    MAX_RANGE     = 10.
constant integer DUMMY_ITEM_ID = 'wolg'

LinkedList<item> list          = new LinkedList<item>()

item pathChecker
rect detect

public function vec2.isTerrainWalkable() returns boolean
    return isTerrainWalkable(this.x, this.y)

public function isTerrainWalkable(vec2 pos) returns boolean
    return isTerrainWalkable(pos.x, pos.y)

function showItems()
    for item i in list
        i.setVisible(true)
        list.remove(i)

function hideItem()
    item i = GetEnumItem()
    if IsItemVisible(i)
        i.setVisible(false)
        list.push(i)

function hideNearbyItems(real x, real y)
    detect.moveTo(x, y)
    EnumItemsInRect(detect ,null, function hideItem)

function isTerrainWalkable(real x, real y) returns boolean
    hideNearbyItems(x, y)
    pathChecker.setPos(x, y)
    pathChecker.setVisible(false)
    real itemPosX = pathChecker.getX()
    real itemPosY = pathChecker.getY()

    showItems()
    return (itemPosX-x)*(itemPosX-x)+(itemPosY-y)*(itemPosY-y) <= MAX_RANGE*MAX_RANGE and not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)

init  
    detect = Rect(0, 0, 128, 128)
    pathChecker = CreateItem(DUMMY_ITEM_ID, 0, 0)
    ..setVisible(false)

Simple Code Example



Wurst:
import pathable
import HashMap
import TimerUtils
import LinkedListModule

HashMap<integer, Charge> hash = new HashMap<integer, Charge>()
unit test

class Charge
    use LinkedListModule

    unit charger
    vec2 destination

    construct(real x, real y, unit u)
        getTimer()
        ..startPeriodic(0.03, function onLoop)
        charger = u
        destination = vec2(x, y)

    function update()
        vec2 pos = charger.getPos()
        angle a = pos.angleTo(destination)
        vec2 moveTo = pos.polarOffset(a, 5)
        if(moveTo.isTerrainWalkable())
            charger.setPos(moveTo)
            if charger.getPos().distanceTo(destination) < 10
                destroy this
        else
            destroy this

    static function onLoop()
        thistype current = Charge.first
        while(current != null)
            current.update()
            current = current.next

function onClick()
    new Charge(BlzGetTriggerPlayerMouseX(), BlzGetTriggerPlayerMouseY(), test)

init
    test = createUnit(players[0], 'hpea', vec2(0, 0), angle(0))

    CreateTrigger()
    ..registerPlayerEvent(players[0], EVENT_PLAYER_MOUSE_DOWN)
    ..addAction(function onClick)

    getTimer()
    ..startPeriodic(0.03, function Charge.onLoop)

 
Last edited:
Top