Detecting if a Unit-type is in an Area.

Kitt

New Member
Reaction score
5
It seems like detecting if a certain Unit-type is within a certain area would be a cake walk, but no matter how many times I go through triggers, I can't seem to find a way to do it.

Just for clarification, let me give a quick example. I want to detect, when a unit begins channeling, whether or not there is a "Peon" within a 400 AoE of the channeling unit. If there is, then the spell will continue to channel, if there isn't, it will stop channeling and will display some sort of message (ex. "No peons available").

I can get just about everything there, except when I get to checking for the unit, I am only left with the menu of event response units, not just a generic unit.

Any and all help is very appreciated! And thanks in advance =D

Meow!
 

Ghan

Administrator - Servers are fun
Staff member
Reaction score
889
This should do:

Code:
Unit Group - Pick every unit in (Units within 512.00 of (Position of (Triggering unit))) and do (Actions)
    Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Unit-type of (Picked unit)) Equal to Peon
            Then - Actions
            Else - Actions
 

Kitt

New Member
Reaction score
5
*rolls around laughing* Yup, that should do the trick. I just couldn't seem to come to that...

It's simple enough, thank you very much!

Mew.
 

SFilip

Gone but not forgotten
Reaction score
634
Keep in mind that anything you put inside Then - Actions might occur more than once. For example if there are 5 peons then it will run 5 times.
To prevent this just use a boolean variable:
Code:
Set BoolVar = False
Unit Group - Pick every unit in (Units within 512.00 of (Position of (Triggering unit))) and do (Actions)
    Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Unit-type of (Picked unit)) Equal to Peon
            Then - Actions
                Set BoolVar = True
            Else - Actions
And afterwards check if BoolVar is true.

Also this leaks a unit group (Units within...) and a location (Position of...), you might wanna fix that.
 

AceHart

Your Friendly Neighborhood Admin
Reaction score
1,495
I'd go with "units in range matching", with three conditions:
- peon
- alive
- owned by the same player

Put it in a unit-group.
If the group is emtpy...
 

Kitt

New Member
Reaction score
5
Keep in mind that anything you put inside Then - Actions might occur more than once. For example if there are 5 peons then it will run 5 times.
To prevent this just use a boolean variable:
Code:
Set BoolVar = False
Unit Group - Pick every unit in (Units within 512.00 of (Position of (Triggering unit))) and do (Actions)
    Loop - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Unit-type of (Picked unit)) Equal to Peon
            Then - Actions
                Set BoolVar = True
            Else - Actions
And afterwards check if BoolVar is true.

Also this leaks a unit group (Units within...) and a location (Position of...), you might wanna fix that.

Yeah, I did basically just that. And I know they leak, I'm setting about fixing that. I just wanted to get something that would work first, and then refine it. But thank you for pointing it out, I have been known to miss stuff like that XD

I'd go with "units in range matching", with three conditions:
- peon
- alive
- owned by the same player

Put it in a unit-group.
If the group is emtpy...

This does seem a little cleaner, but how do you check if a unit-group is empty?

Mreow.
 

Ghan

Administrator - Servers are fun
Staff member
Reaction score
889
> how do you check if a unit-group is empty?

Integer Comparison. Number of Units in <Unit Group> equal to 0.
 

Kitt

New Member
Reaction score
5
Thanks! Here is my final code result:

Code:
ttCheckCapture
    Events
        Unit - A unit Begins channeling an ability
    Conditions
        (Ability being cast) Equal to ta_Capture 
    Actions
        Set Temp_Point = (Position of (Casting unit))
        Set Temp_UnitGroup = (Units within 400.00 of Temp_Point matching ((Unit-type of (Matching unit)) Equal to tu_Gold Mine))
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Number of units in Temp_UnitGroup) Equal to 0
            Then - Actions
                Game - Display to (Player group((Owner of (Casting unit)))) the text: No Goldmines are av...
                Unit - Order (Casting unit) to Stop
            Else - Actions
                Do nothing
        Custom script:   call RemoveLocation(udg_Temp_Point)
        Custom script:   call DestroyGroup(udg_Temp_UnitGroup)

Edit: There, fixed up the code. It's complete now.

Mew.
 
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