Got a problem with "Finding nearest enemy"

Smygarn777

Member
Reaction score
6
Hello. Im making a map which features a mix of melee and custom games. An altered melee you could say.

For Starters, it has 4 Players each in their corners of the map, with the standard melee goal. Eliminate each other. They start with a goldmine and easy access to a second goldmine.
The difference between melee and non melee maps begin here though, there are no creeps on the entire map! What took their place is the Custom undead i have developed for the map, and they play out like a custom ai with a proper base etc.

These undead are situated in middle to isolate the players from each other, and they also have 2 graveyards adjacent to each player. The undead in the base remains rather defensive, the real offense from the undead that comes from the graveyards. They will spawn periodically and in attack groups move off to attack the players.

This is where i need help. I want the undead groups to attack the nearest "enemy" structure instead of following a region pointed out for them. These undead are simple in mind after all. The problem is, i dont know how to make them start moving towards the nearest enemy structure, and nobody i asked for help knows how to either.

Let me show you a picture of what im after:
Image.jpg


First, we have the Undead graveyard in the bottom left, and the Undead Base at the top left. There is a goldmine between these two points and then we have the Player Starting Location at the right side. I want the undead group that spawns from the graveyard to attack purple's closest structure, not merely move to a region thats placed at Purple's starting location beacon.
(Note that there is not only Purple, but for Blue, Red and Teal as well i will be using this trigger).

Im puzzled and i dont know how to solve this, please help me.
 

cleeezzz

The Undead Ranger.
Reaction score
268
Code:
set Distance = 999999999.
set TempGroup = Units in region matching Owning Player of Matching Unit belongs to an enemy of (Undead Player)
Pick all units in TempGroup and do actions
    set TempReal = Distance between Graveyard and Picked unit
    if TempReal is less than Distance then
         set Distance = TempReal
         set ClosestUnit = Picked Unit
    endif
Custom Script: call DestroyGroup(udg_TempGroup)


free hand, you will need to remove the leaks created from checking the distance between two locations
 

Smygarn777

Member
Reaction score
6
That code is complicated.

Units in region matching owning player of matching unit belongs to enemy player. This puzzles me. I dont understand the triggering very much sorry. Could you explain how each of these are done?
 

Komaqtion

You can change this now in User CP.
Reaction score
469
This might be a better written one ;)

Trigger:
  • Get Nearest Unit
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Animate Dead
    • Actions
      • Set CurrentDistance = 1000000000.00
      • Set DistanceGroup = (Units in (Playable map area) matching ((((Matching unit) is A structure) Equal to True) and (((Matching unit) is alive) Equal to True)))
      • Set CasterPosition = (Position of (Triggering unit))
      • Unit Group - Pick every unit in DistanceGroup and do (Actions)
        • Loop - Actions
          • Set NearestPosition = (Position of (Picked unit))
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Distance between CasterPosition and NearestPosition) Less than CurrentDistance
            • Then - Actions
              • Set CurrentDistance = (Distance between CasterPosition and NearestPosition)
              • Set NearestUnit = (Picked unit)
            • Else - Actions
          • Custom script: call RemoveLocation(udg_NearestPosition)
      • Custom script: call RemoveLocation(udg_CasterPosition)
      • Custom script: call DestroyGroup(udg_DistanceGroup)


Ok, so for the concept of this way of getting the nearest unit (Structure).
So, we first set a "Real" variable to some very high value (This needs to be higher than the maximum distance possible in your map ;)) because this is what we're going to use to keep track of if one unit is nearer the caster (In this case) than the next.
Then we need to pick all structures in the map to be able to get their position etc.
That's what this line is for:
Trigger:
  • Set DistanceGroup = (Units in (Playable map area) matching ((((Matching unit) is A structure) Equal to True) and (((Matching unit) is alive) Equal to True)))


Then we need to check if the distance between the current unit is smaller than the previously saved distance (CurrentDistance variable ;)), and if it is, set a "Unit" variable to that unit, so we know which unit it was later on :D

Then you should just order the ghouls to "Attack-Move" to that structure, and you're good :D
 

Smygarn777

Member
Reaction score
6
Set Caster Position = Position of triggering unit

Sorry, but how do you set it to "Position of triggering unit"? Btw, they are spawned, not created by another unit. They're created in another trigger.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
That variable is a "Point" variable, but you should use a point where the ghouls are spawned instead :D
Where are they spawneed exactly ? :S
Is there a building or so where they are spawned at ?
Like the "Starting Location" ?

Well, if you're creating them in another trigger, then save them as a Unit Group, and implement my actions into it ;)

Then just do "Unit Group - Issue order targetting an object" (Or whatever it's called :S) for that unit group ;)
 
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