Jump to content

How to avoid boss AOE in fight ?


Recommended Posts

When the boss is casting AOE damage, in order to avoid deep damage, I hope the robot can follow a path  or auto find a way to reach a safe area.

I made a plugin, but it not works, it only move very little little step  then keep fighting without moving to the right place,. can you help me ,thanks.

 

	public void  OnFightLoop(WoWUnit unit,CancelEventArgs cancelable)
	{
	    foreach(var boss in Bosses){
			if(unit.Name == boss && unit.IsCast && unit.InCombat)
		    {
			    Logging.Write("Boss is casting,run now! );
                RunWhenBossCastAOE(unit);
		    }
		}
	}

     public void RunWhenBossCastAOE(WoWUnit boss) 
	{
		switch (boss.Entry)
		{
			case 28586:
			{
				// General Bjarngrim
				var x = ObjectManager.Me.Position.X;
				var y = ObjectManager.Me.Position.Y;
				var z = ObjectManager.Me.Position.Z;

				List<Vector3>pathList = new List<Vector3>();
				for(int i = 0;i<20;i++)
				{
				   var newX = x;
				   var newY = y + i;
				   var newZ = z;
				   Vector3 tmpPos = new Vector3(newX,newY,newZ);
                   pathList.Add(tmpPos);
				}
                GoToSafePosition(pathList);
               	break;
			}
		}

	}

	public bool GoToSafePosition(List<Vector3> pathList)
	{	
		wManager.Wow.Helpers.Conditions.ForceIgnoreIsAttacked = true;
		MovementManager.Go(pathList);
		wManager.Wow.Helpers.Conditions.ForceIgnoreIsAttacked = false;
		return true;
	}

 

Link to comment
Share on other sites

i found this, Might help. use google next time. https://github.com/Talamin/Wholesome-Dungeon-Crawler/blob/master/States/AvoidAOE.cs, also i do not know if wrobot ObjectManager has this type of info but Aoe ability's and ground effect can be found as Dynamic Game Objects. Here is the code for creating your own function using wrobot Descriptors, https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/300463-wow-3-3-5-12340-info-dump-thread.html

 

image.png.4deac39cb757b15281de2781ed800664.png

Link to comment
Share on other sites

The  reason your character only moves a little step is because you're still on the fight thread, so your code only executes for one fight loop iteration. The next iteration, you're back on the normal fight loop which forces you to get in your fight class range.

There are two ways I know to prevent this.

1 - Lock the thread in your method. Which in your case would mean calling MovementManager.Go(pathList); and the next line, lock the thread in a while (MovementManager.InMovement) loop. I wouldn't necessary recommend this, because you're blocking the entire fight loop and you will need mutliple conditions to set it right.

2 - Cancel the fight event. This is my preferred option, but it's more complicated to set up. The code Nax has linked you is one I've written. It uses a manager that listens to multiple events.

On the ObjectManagerEvents.OnObjectManagerPulsed event, I check and record a list of all the AOEs present in the object manager range.
On MovementEvents.OnMovementPulse and MovementEvents.OnMoveToPulse I make sure I don't walk into an AOE, and make sure I never cancel an escape
On FightEvents.OnFightStart, I make sure I don't start any fight during an escape

This code doesn't really fit your need, because it avoids AOEs that stand on the ground (like a puddle of poison), and uses a "grid" to look for a safe position. In your case, you react to a single action.

What you need to do is:

- Detect the moment you need to escape.
- Cancel the current fight, using cancelable.Cancel = true;
- Calculate a safe route.
- Turn an escape flag to true (a simple boolean)
- Make sure you don't start a new fight during the escape using your flag
- Turn back the flag to false when your safe condition is met

Link to comment
Share on other sites

2 hours ago, Zer0 said:

- Detect the moment you need to escape.
- Cancel the current fight, using cancelable.Cancel = true;
- Calculate a safe route.
- Turn an escape flag to true (a simple boolean)
- Make sure you don't start a new fight during the escape using your flag
- Turn back the flag to false when your safe condition is met

For anyone wondering, this is pretty much the preferred method. You could set WRobot's settings to completely ignore fights after calling Fight.StopFight as well. 
But this is essentially what I use to escape mobs in HMP too. Unfortunately dynamic escape while avoiding new groups of mobs is quite complicated and will probably never be 100% perfect as you need to also make sure you won't just run in circles etc.

Mostly just came here to say Zer0's approach is the one I found to be working best and most reliably.

Link to comment
Share on other sites

On 3/31/2023 at 5:03 PM, Zer0 said:

The  reason your character only moves a little step is because you're still on the fight thread, so your code only executes for one fight loop iteration. The next iteration, you're back on the normal fight loop which forces you to get in your fight class range.

There are two ways I know to prevent this.

1 - Lock the thread in your method. Which in your case would mean calling MovementManager.Go(pathList); and the next line, lock the thread in a while (MovementManager.InMovement) loop. I wouldn't necessary recommend this, because you're blocking the entire fight loop and you will need mutliple conditions to set it right.

2 - Cancel the fight event. This is my preferred option, but it's more complicated to set up. The code Nax has linked you is one I've written. It uses a manager that listens to multiple events.

On the ObjectManagerEvents.OnObjectManagerPulsed event, I check and record a list of all the AOEs present in the object manager range.
On MovementEvents.OnMovementPulse and MovementEvents.OnMoveToPulse I make sure I don't walk into an AOE, and make sure I never cancel an escape
On FightEvents.OnFightStart, I make sure I don't start any fight during an escape

This code doesn't really fit your need, because it avoids AOEs that stand on the ground (like a puddle of poison), and uses a "grid" to look for a safe position. In your case, you react to a single action.

What you need to do is:

- Detect the moment you need to escape.
- Cancel the current fight, using cancelable.Cancel = true;
- Calculate a safe route.
- Turn an escape flag to true (a simple boolean)
- Make sure you don't start a new fight during the escape using your flag
- Turn back the flag to false when your safe condition is met

Thank you for your detailed and patient explanation.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...