Maybe the problem its not ou me.groupid but as how it create the lists, since he locks on one target it seems its not renewing the list
That's a possibility, but wouldn't explain why when solo it switches between you and the companion easily. I'd need help figuring out how to cache the lists, I'm not super solid with that.
TorCharacter is an umbrella that captures both TorPlayer and TorNPC. Your companion is a TorNPC. You and other players are TorPlayer. When I'm calling for tanks while I'm solo (Me.GroupID == 0) then I need to get my companion, which is a TorNPC, but I also want to grab Tank-spec players when I'm in a group and they're TorPlayer, so I use TorCharacter so I can capture them both when needed.
I'm thinking about it more and I realized that I never properly cached healing targets. I'm still not sure where to do this, but I think it goes under the DefaultCombat.cs file in the section that says Code: public override void Dispose() { } I changed it so now it says Code: public override void Dispose() { Targeting.Cache(); } and in the Targeting.cs file, I now have this Code: public static TorCharacter hTank; public static TorCharacter hTarget; public static void Cache() { hTank = tankCandidate; hTarget = healCandidate; } where I changed what used to be called hTank and hTarget to tankCandidate and healCandidate. What I'm hoping this does is that the Dispose() command acts as a clear cache, and forces the bot to update the healing targets each pulse. In my WoW routines, there's a section that literally labeled Pulse(), but we don't have that in BW so I'm hoping Dispose is just another name for it. I'm going to play around with it for a second before I post a new update for you guys to try.
I wish I knew anything about programming. I just follow guides from other people on WoW routines and then try to translate it to BW. By the way, the newest update just broke something. At first I thought it was the changes I made to caching, but I revert those and even the old stuff wasn't working so there's something larger at play.
Plugins have the onpulse command public void OnPulse() which sounds like your pulse your looking for. Couldn't tell you if it's just plugin only. A lot of people have put their code in their plugins to run within there just bashing through it over and over.
Probably writing all the healing targeting stuff as a plugin would be the way to go, but I don't know how to write plugins, only combat routines. Even there, I'm pretty limited as we can see.
Honestly wasn't all that bad, if you want I can send you the full project file from the plugin I just did. Has a bit of everything from GUI to backround worker process (multi threading) and a few other pieces. I haven't messed with the internal config but that could allow you to create separate targeting for ops/open world with the buddy gui. I know the latter revisions of the bob dole auto equip used it I just didn't dive into it. Those config windows are all xml and not exactly sure how to go about that.
Is it possible that the but may not see the entire group? Due to the raid layout of grouping? And that the offsets may not be complete or existing?
offsets are very possible, I sent Alltruest some info last night that should help with his troubleshooting on it. Should echo the heal targets health to see if it's getting reported correctly. That's one thing that would cause healing to keep healing if it's receiving a bad health offset basically saying char is 50% all the time. I don't have any healers so I couldn't really test myself. He did identify that companion has been called incorrectly and his heal routine seems to handle it fine so offsets are good there.
Here's what wired203 sent me this morning. I don't see any reason to keep it private, but if you want I'll take this down. I think it's helpful for anyone to see, maybe they'll have a good idea too!
I would have to check spell.cast The location I had picked should have access to that float during that time. You can also change the format a little for the 2nd example you could do this. Logger.Write("Player Health Percentage" + SpellCast); so it would give you the info in quotes and the string after. Can make it easier to read. If your using Visual Studio and add Buddy wing as a reference you should be able to play with where you put it and VS should tell you if it should be ok.
Looks like you should be able to call it from there, before the Priority selector return. Course the log screen only shows info for a little bit now but being able to reflect info will help us debug these issues quicker. One other issue I have seen as others have would be if you are targeted on a resource to harvest or someone kills your mob as you move to it the bot can hang. Still trying to identify where that is occurring to add a sanity check.
Just an update: I had some luck doing a more simple modification to the original Targeting.cs file, but it's still spotty and gets stuck on targets (could be a LockSelector issue). I also used wired203's suggestion to monitor heal targets and I got decent results-- even when he was healing the wrong target, he still calculated the proper %. I actually found that sometimes it was calculating the enemy target's percentage, which made me notice the the original targeting file never distinguished between hostile and friendly targets in the HealCandidates calculations. Whoops. Fixing that helped, but didn't fix the occasional (but now MUCH LESS frequent) targeting errors. Still, I like my rewrite better. It's smoother and less complicated. It uses fewer resources and may allow us to sneak LockSelectors back in without as much lag. Here's my current update on the Targeting.cs. The biggest change is the (re)addition of the ScanTargets Composite. As wired203 indicated, we need to cache and reset targets. I've found a way to do that pretty easily, just set them all to null and 0 at the beginning of each tick. The issue I'm having is then building a new list. What I have at the bottom does not throw errors, but I don't know if it's right. I'm going to test it this afternoon, but I just wanted to let you know where I'm at right now. I need: Someone really smart to tell me how to build my lists at the bottom of ScanTargets so that it compiles all healing targets and tanks and enemy targets and aoehealing points. What I have makes sense to me, but I don't know if it's right. PHP: // Copyright (C) 2011-2015 Bossland GmbH // See the file LICENSE for the source code's detailed license using System.Collections.Generic; using System.Linq; using Buddy.BehaviorTree; using Buddy.Common.Math; using Buddy.Swtor; using Buddy.Swtor.Objects; using DefaultCombat.Helpers; namespace DefaultCombat.Core { public static class Targeting { private static TorPlayer Me { get { return BuddyTor.Me; } } #region TestStuff public static IEnumerable<TorCharacter> PartyMembers { get { return getPartyMembers(); } } public static IEnumerable<TorCharacter> Tanks { get { return getTanks(); } } public static int addCount(TorCharacter unit, float range) { var t = ObjectManager.GetObjects<TorCharacter>().Where(p => p != null && p.IsValidTarget() && p.InLineOfSight && p.Position.DistanceSqr(unit.Position) <= range * range && p.IsTargetable).ToList(); return t.Count(); } public static int injuredfriendCount(TorCharacter unit, float range) { var t = PartyMembers.Where(p => p != null && p.InLineOfSight && p.HealthPercent <= 75 && p.Position.DistanceSqr(unit.Position) <= range * range && p.IsFriendly).ToList(); return t.Count(); } public static IEnumerable<TorCharacter> getPartyMembers() { if (Me.GroupId == 0) { var t = ObjectManager.GetObjects<TorCharacter>().Where(p => p != null && p.IsTargetable && p.Guid == Me.Companion.Guid).ToList(); t.Add(Me); return t; } else { var t = ObjectManager.GetObjects<TorPlayer>().Where(p => p != null && p.IsTargetable && p.GroupId == Me.GroupId).ToList(); return t; } } public static IEnumerable<TorCharacter> getTanks() { if (Me.GroupId == 0) { return ObjectManager.GetObjects<TorNpc>().Where(p => p != null && p.IsTargetable && p.Guid == Me.Companion.Guid); } if (Me.GroupId == 0 && Me.Companion == null) { return ObjectManager.GetObjects<TorPlayer>().Where(p => p != null && p.IsTargetable && p.Guid == Me.Guid); } else { var t = ObjectManager.GetObjects<TorPlayer>().Where(p => p != null && p.GroupId == Me.GroupId && p.IsTargetable && (p.Discipline == CharacterDiscipline.Defense || p.Discipline == CharacterDiscipline.Darkness || p.Discipline == CharacterDiscipline.Immortal || p.Discipline == CharacterDiscipline.KeneticCombat || p.Discipline == CharacterDiscipline.ShieldSpecialist || p.Discipline == CharacterDiscipline.ShieldTech)).ToList(); return t; } } public static TorCharacter healCandidate { get { if (!Me.InCombat) return null; var t = PartyMembers.Where(p => p != null && !p.IsDead && p.InLineOfSight && p.Distance <= 30).OrderBy(p => p.HealthPercent).FirstOrDefault(); return t != null ? t : null; } } public static TorCharacter tankCandidate { get { if (!Me.InCombat) return null; var t = Tanks.Where(p => p != null && !p.IsDead && p.InLineOfSight && p.Distance <= 30).OrderBy(p => p.HealthPercent).FirstOrDefault(); return t != null ? t : null; } } public static TorCharacter hTank; public static TorCharacter hTarget; public static int adds; public static int aoeheal; public static void Cache() { hTank = tankCandidate; hTarget = healCandidate; adds = addCount(Me.CurrentTarget, Distance.MeleeAoE); aoeheal = injuredfriendCount(hTarget, Distance.MeleeAoE); } public static Composite ScanTargets { get { return new Action(delegate { using (BuddyTor.Memory.AcquireFrame()) { hTank = null; hTarget = null; adds = 0; aoeheal = 0; getTanks(); getPartyMembers(); aoeheal++; adds++; return RunStatus.Failure; } }); } } #endregion } }
Glad I was helpful, I find it's always easier to see what's going on rather than just taking random shots to know what's working and what's not which no one was really sure. Reset looks good same as default however default re-creates the list on reset here. HealCandidates = new List<TorCharacter>(); by generating the list again it would flush it. I like how your re-write includes LOS it should increase the accuracy of the bot. I wonder if the target lag in the old routine is all the vector checks and calculations for AOE targeting. Like if you targeted something far away while the bot was running it would cause it to hitch every few seconds till you cleared that target. Keep it up man it's looking good.