Jump to content

[Feature request/Help] Smart targeting/pulls


Recommended Posts

Hey @Droidz,

currently in older expansions like vanilla/tbc/wrath the bot is lacking a few very important features that are probably not too hard for you to implement. 
I could try fixing all of these through my plugin, but it's hard to do, because a lot of bot behavior is unpredictable I don't know the inner workings of your code, so for a lot I have to do guess work.

 

So here are some suggestions that early expansions really need:

  • regen takes priority BEFORE "Attack before being attacked", currently especially after rezzing the bot will keep attacking new targets after combat because they are in 20 yards, even if they wouldn't attack you (it's better to rely on IsAttacked state during regen)
  • smart rezz (and small bug fix), try to REALLY find a save spot to rezz, but more importantly recognize when you can't rezz and move a bit closer to the corpse, some servers don't calculate distance 100% the same as the client and won't accept rezz if you aren't a bit closer. I use code to solve this1
  • smart target/pulls - before pulling check if any units are near by the pulled unit (20 yards + number from general settings), then ALSO check every Vector3 2 yards between you and your target 
  • move around if the above conditions aren't met for any targets (find a line between you and target with no mobs between) (slightly improved AvoidIt plugin)
  • If Conditions.ForceIgnoreIsAttacked is set, do NOT try to enter regen mode while you are still being attacked - keep running to the next waypoint or try to drop combat
  • A way to avoid certain zones when doing long-travel (this is enough if we can add it through API) - for example if we are level 25, avoid Burning Steppes zone in all paths, but you can give an alternative "Task" or "Action" (where it would then take the tram, executing your own C# code, for example)
  • ??? (reserved for more things)

 

Spoiler

1. 


public static void FindCorpse()
    {
        if(Lua.LuaDoString<bool>("return StaticPopup1 and StaticPopup1:IsVisible() and StaticPopup1Button1:IsEnabled();") && ObjectManager.Me.IsDead && ObjectManager.Me.HaveBuff("Ghost")){

            if (ObjectManager.Me.PositionCorpse != null)
            {
                Logging.WriteDebug("Found corpse, but haven't rezzed yet - moving closer!");
                MovementManager.Go(new List<Vector3>{ ObjectManager.Me.PositionCorpse });
                Thread.Sleep(500);
                MovementManager.StopMove();
                /*MovementManager.Face(ObjectManager.Me.PositionCorpse);
                Move.Forward(timeMs: 2000);*/
            }
        }
    }

2. aclT1nj.png

 

 

Edited by Matenia
Link to comment
Share on other sites

Hello,

Quote
  • regen takes priority BEFORE "Attack before being attacked", currently especially after rezzing the bot will keep attacking new targets after combat because they are in 20 yards, even if they wouldn't attack you (it's better to rely on IsAttacked state during regen)

I added condition to check "attack before being attacked" only when player move (this will resolve this problem, after combat your character don't move).

Quote
  • smart rezz (and small bug fix), try to REALLY find a save spot to rezz, but more importantly recognize when you can't rezz and move a bit closer to the corpse, some servers don't calculate distance 100% the same as the client and won't accept rezz if you aren't a bit closer. I use code to solve this

You get this problem only in vanilla? I'll add option (but I ignore when): https://wrobot.eu/forums/topic/7047-resurrecting-bugged-elysium/

Quote
  • smart target/pulls - before pulling check if any units are near by the pulled unit (20 yards + number from general settings), then ALSO check every Vector3 2 yards between you and your target 

&

Quote
  • move around if the above conditions aren't met for any targets (find a line between you and target with no mobs between) (slightly improved AvoidIt plugin)

Sincerely, it is hard to implement this (and "avoidit" add a lot of bugs). I keep note, I'll make some test but I ignore when and if I'll add this feature.

Quote
  • If Conditions.ForceIgnoreIsAttacked is set, do NOT try to enter regen mode while you are still being attacked - keep running to the next waypoint or try to drop combat

Wait next update, WRobot will skip regen step if "ForceIgnore..." is enabled.

Quote
  • A way to avoid certain zones when doing long-travel (this is enough if we can add it through API) - for example if we are level 25, avoid Burning Steppes zone in all paths, but you can give an alternative "Task" or "Action" (where it would then take the tram, executing your own C# code, for example)

I cannot add this, this depend mainly on your server (although servers usually use the same database).

Link to comment
Share on other sites

Quote

I added condition to check "attack before being attacked" only when player move (this will resolve this problem, after combat your character don't move).

Thanks, that's great!

Quote

You get this problem only in vanilla? I'll add option (but I ignore when): https://wrobot.eu/forums/topic/7047-resurrecting-bugged-elysium/

Yep, it's a bug on all (?) vanilla servers currently. WoWClient calculuates distance from center to center. Servers calculate distance from hitbox border (I think). Some older servers don't have this implemented correctly. 

Quote

Sincerely, it is hard to implement this (and "avoidit" add a lot of bugs). I keep note, I'll make some test but I ignore when and if I'll add this feature.

I noticed it's very hard when I started with my plugin code to run away from combat (you have to avoid LoS, do pathing, avoid enemies and all while calculating alonger and longer path on an extra thread).
Trying is better than nothing. Here is how HB had it implemented. It's not using a very optimized algorithm (if meshes are server side, maybe this is too much). Maybe you can take some inspiration from it.
I think at least not pulling if there are mobs in a radius of x (20?) yards between you and a straight line to your target as in my graphic, would be simple to implement - without running around and finding a better pull position.
If you need to brainstorm, feel free to join us on Discord.
 

Quote

Wait next update, WRobot will skip regen step if "ForceIgnore..." is enabled.

It is okay to regen - but only if (Lua) UnitAffectingCombat is false. The problem is sometimes the bot will stand still while getting hit (due to ignore). Just to clarify :)
 

Quote

I cannot add this, this depend mainly on your server (although servers usually use the same database).

I understand this depends on level/server/expansion/etc. But for vanilla-wotlk this barely changes. If you manage to add some API where I can interrupt pathing (or add C# Action class to it) I will make this work personally.
All it needs is a solid way to recognize:

- which zones does this path go through (maybe even through checking if 2 zones (list of outermost vectors) overlap
- if range to vector x < 5 => execute Action => find new path

Then it is only grunt work. I will keep a list of zones and levels, check if it smart to go through a zone. If not smart, add custom action to pathfinder.
Intercept pathing event, check if path goes through "illegal" zone, path to safe spot, execute custom code at safe spot, you are at a different spot now, tell wRobot to do its regular pathing.
For example, if an Alliance character wants to go from Stormwind to Ironforge, it will go through Burning Steppes => custom action follows path and makes it take tram, leave through portal => find new path now.

Edited by Matenia
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...