Find nearest enemy unit

ThySpektre

TH.net Regular
Reaction score
10
I am trying to make an ability fire off when an item is dropped. I want it to target the nearest enemy unit. Any ideas how to find the nearest enemy unit?

ThySpektre
 
I would recommend it, as long as you make sure it doesn't have memory leaks it will work.
 
This method is only good if there is a maximum distance but here is a way.

Some variables:
Type - Name
Real - Dist1
Real - Dist2
Point - Point1
Point - Point2
Unit - Closest

You dont need all variables if you dont want but I have used them for easier code and to remove memory leaks

Code:
        Set Closest = No unit
        Set Dist1 = 800.00
        Set Point1 = (Position of (Triggering unit))
        Custom script:   set bj_wantDestroyGroup = true
        Unit Group - Pick every unit in (Units within Dist1 of Point1 matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True))) and do (Actions)
            Loop - Actions
                Set Point2 = (Position of (Picked unit))
                Set Dist2 = (Distance between Point1 and Point2)
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        Dist1 Greater than Dist2
                    Then - Actions
                        Set Dist1 = Dist2
                        Set Closest = (Picked unit)
                    Else - Actions
                Custom script:   call RemoveLocation(udg_Point2)
        Custom script:   call RemoveLocation(udg_Point1)


If Closest = No Unit then there was no enemy unit in range.
 
This is purely theoretical and does not apply to WC3 in particular, rather any programming situation such as this, but wouldn't it (again theoretically) be faster to search in an in-out direction instead of an out-in direction? That is, instead of looking among a group of units trying to find the closest one, look for the nearest group of units, and find the closest unit among them? For instance taking ever bigger and bigger circles until you come upon one or more units, and see which is the closest out of that group.

Now, I'm not saying this is the best method for this case, but looking at it from a programming perspective, do you think it's a method worth looking into?

Again, it's just an idea. :)
 
Something like this? I am a little tierd now so there may be some errors. I also think there is a jass script that does this (better) but I cannnot find it now.


Code:
    Set Point1 = (Position of (Triggering unit))
    Set Range1 = 999999.00
    Set Closest = No unit
    Set Interval = 50.00
    For each (Integer A) from 1 to 1000, do (Actions)
        Loop - Actions
            Set Current = (Units within (Interval x (Real((Integer A)))) of Point1 matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True)))
            Unit Group - Remove all units of Done from Current
            Unit Group - Pick every unit in Current and do (Actions)
                Loop - Actions
                    Set Point2 = (Position of (Picked unit))
                    Set Range2 = (Distance between Point1 and Point2)
                    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        If - Conditions
                            Range1 Greater than Range2
                        Then - Actions
                            Set Range1 = Range2
                            Set Closest = (Picked unit)
                        Else - Actions
                    Custom script:   call RemoveLocation(udg_Point2)
            Custom script:   call DestroyGroup(udg_Current)
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    Closest Not equal to No unit
                Then - Actions
                    Custom script:   exitwhen true
                Else - Actions
            Unit Group - Add all units of Current to Done
    Custom script:   call RemoveLocation(udg_Point1)
    Unit Group - Remove all units from Done
 
Hmm... I think that's about it, but I'm not sure that it's all necessary. Here's some psuedo-code:

Code:
Set Interval = 50

For Integer A = 1 to 1000
Set unitGroup = (Units Within (Interval x Integer A) Matching (Matching Unit is an enemy of (Triggering Unit))
    If - Conditions:
        Number of Units in unitGroup > 0
    Then - Actions:
        Pick Every Unit in unitGroup and Do:
            <Cycle Units to Find Closest Unit>
    Else - Actions:
        Do Nothing

That is of course not exact, and you would have to put in extra custom scripts as you have to prevent leaks, but believe that is mostly correct. You could also replace (Interval x Integer A) with an exponential function of Integer A so that the range would increase more and more, so as to find units more quickly if they are far away.
 
There's no point having the If statement there. It'll make the trigger quite a bit slower if there's a big unit group.

But that might be faster, who knows?
 
pladams9 said:
:eek: Your right. If there aren't any units in the unit group it won't run anyway.
And "number of units in unit group" actually uses a "pick every" action along with a global variable to count units anyway. :)
 
General chit-chat
Help Users
  • The Helper The Helper:
    LOL! A tweak job!
  • The Helper The Helper:
    this is the fix I get from that yeah this is hard to control. disabling bots is pretty much necessary as ai and other bots would push really old threads to the top. reduce weight of view count. disable guest view tracking if you really want to push active threads to the top. a bit of tinkering for a few days with the weights and other settings should get you a decent trending widget box.
  • Ghan Ghan:
    I changed the settings a bit.
  • Ghan Ghan:
    Narrowed it to 7 days for the half-life and set views to 0 weight.
  • The Helper The Helper:
    I dont think Trending would work for this forum it would be better to just have the last 5 posts from anywhere
  • Ghan Ghan:
    Probably will have to give it some time to update.
  • Ghan Ghan:
    I'm guessing it is not retroactive.
  • Ghan Ghan:
    Next on the punch list: Update the server to Ubuntu 24.04.
  • The Helper The Helper:
    Mad Lads is new I see it displays original post date
  • The Helper The Helper:
    as long as it changes it is good - it is good now it updated and its new stuff
  • The Helper The Helper:
    One thing I have noticed and I dont know if it is by design but like 1 out of 3 times I come to the site the Anubis screen just hangs open, if I refresh it will go away but sometimes it hangs
  • Ghan Ghan:
    I've seen that as well.
  • The Helper The Helper:
    Wow - the change in the stats are major. I kind of knew it was all bots but wow, to see the effect. Why the social media sites cant do something like this I have no idea.
  • Ghan Ghan:
    Probably inflates their numbers so they look better to advertisers.
  • The Helper The Helper:
    Yeah google does not filter those bots. I remember when Apex was doing Google ads I saw the same IPs in there as I was seeing here - google is totally tracking all those bots as traffic and most google traffic, at least ours, was all bots
  • The Helper The Helper:
    oh wow, i bet i can post x links now and do the webp pics now giggity
  • The Helper The Helper:
    ahh anubis blocks anyone that has javascript turned off
  • The Helper The Helper:
    Robot: HTTP client library - i love the new robot :)
  • The Helper The Helper:
    New Science News Forum and it starts out with 420 threads :)
  • The Helper The Helper:
    Technical Support forum name changed To Technology News, there is now a Tech, sci/tech and science forums now :)
  • The Helper The Helper:
    Happy Saturday! Hope everyone has a fantastic weekend!
  • Ghan Ghan:
    We are now on Ubuntu 24.04. Had some issues with the style after the OS/PHP upgrade but now resolved.
    +1
  • Ghan Ghan:
    PHP 8.3 now live
    +1
  • The Helper The Helper:
    Weekend went by too fast. Next weekend I am going to try to do a nature thing - buddy of mine lives by the Colorado river and has some kayaks and invited me to do some kayaking from a place he knows to get on the river.

The Helper Discord

Staff online

Members online

Affiliates

Hive Workshop NUON Dome World Editor Tutorials
Back
Top