Pick units between 2 points...

mushroom911

I think I should change my avatar
Reaction score
43
OK, everyone who has ever played warhammer (fantasy or 40k) should be familiar with bouncing cannonballs, skull of flame, straightline damage...
anyways, How is it possible to "pick all units between 2 points" ive searched the forum, done stuff... it seems to be impossible :banghead:
ok so.. i was thinking point between might work.. but that.... well... both causes lag, leaks etc...

anyways.. the main question here... how to pick units between 2 points in a straight line (and do actions :p)

+rep 4 help! (if useful :D)
 

Exide

I am amazingly focused right now!
Reaction score
448
You could try placing a dummy unit at point A, that has a skill which affects nearby units, then order it to move to point B. -When the dummy reaches point B, remove it and pick every unit in a large radius that has the buff that the dummy gave them.
Might work. :p
 

mushroom911

I think I should change my avatar
Reaction score
43
Thx

I think that's cool... if i set aura radius to... 70 make it afect enemies and trigger the rest... ty! +rep!
 

AceHart

Your Friendly Neighborhood Admin
Reaction score
1,495
A better idea is to assume the end points are the diameter of a circle, pick all units inside, and keep those within a given distance to that line.

Requires JASS though for best results:
JASS:
function ReturnTrue takes nothing returns boolean
	return true
endfunction

function UnitsBetweenPoints takes location startPoint, location endPoint, real distance returns group
    local real x1 = GetLocationX(startPoint)
    local real y1 = GetLocationY(startPoint)
    local real x2 = GetLocationX(endPoint)
    local real y2 = GetLocationY(endPoint)
    local real cx = (x1 + x2) / 2
    local real cy = (y1 + y2) / 2
    local real a = y2 - y1
    local real b = x1 - x2
    local real c = -b * y1 - a * x1
    local real d
    local unit u
    local group g = CreateGroup()
    local group result = CreateGroup()

    if distance == 0 then
        set distance = 100.0
    endif
    set distance = distance * SquareRoot(a * a + b * b)
    call GroupEnumUnitsInRange(g, cx, cy, SquareRoot((cx - x1) * (cx - x1) + (cy - y1) * (cy - y1)), Condition(function ReturnTrue))
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null
        call GroupRemoveUnit(g, u)
        set d = a * GetUnitX(u) + b * GetUnitY(u) + c
        if d >= -distance and d <= distance then
            call GroupAddUnit(result, u)
        endif
    endloop

    call DestroyGroup(g)
    set g = null
    return result
endfunction


The condition function can be adjusted to only find units that match some condition.

Can be called from GUI too, with something like this:
Set Point1 = <some point>
Set Point2 = <some other point>
Custom script: set udg_UnitGroup = UnitsBetweenPoints( udg_Point1, udg_Point2, 100 )

100 is the thickness of the line.
 

mushroom911

I think I should change my avatar
Reaction score
43
yay!

ty both alot, dieas in testing (somewhat) avg doesnt allow me to have jass so.... il try teh gui version... should work
 

Exide

I am amazingly focused right now!
Reaction score
448
GUI = JASS, so you must have JASS. :p

Make a new trigger, click the 'Edit' button, next to 'File', and choose 'Convert to Custom Text'. -Then you'll have JASS. :)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top