Perhaps you can add a "smart judgment" concept where the CC detects if a mob already has a judgement of light / wisdom on it, and if it does, then it casts the other one that is not applied? Of course if there isn't any form of judgement applied yet, then it uses the default checked one. That would be useful when raiding or doing 5 mans. (In my opinion atleast). And I see your point about the repentance / HoJ taking too long... that is 2 GCDs + minor delay (in having the CC process) + 1.5 second cast (for FoL) + hit delay. And after 4+ seconds after you hit the needed % for the bot to heal with 2+ mobs on you, you'd probably be toast already.
Features like this, party / raid mode features will come in time but it won't be until all other aspects of the CC are fully functional.
Just a quick question. Would it be possible to build into this CC some kind of feature to resurrect your corpse in a safe spot instead of in the middle of multiple mobs ? From what i've read, this is a CC issue and is fixed with the following code : Code: /* * Summary: Finds the best safe spot. distance yards away from all mobs. */ private Point FindSafeSpot() { Log("Finding safe spot..."); Stopwatch timer = Stopwatch.StartNew(); WoWPoint safeSpot = Me.Location; List<WoWUnit> units = new List<WoWUnit>(ObjectManager.NpcObjectList.Values); units.Sort(CompareDistance); List<WoWUnit> unitsInRange = new List<WoWUnit>(); List<double> unitsDistance = new List<double>(); List<Point> ThreadList1 = new List<Point>(); List<Point> ThreadList2 = new List<Point>(); List<Point> ThreadList3 = new List<Point>(); int goodDistance = 0; //number of lowest distance found int distance = 30; double angleIncrements = DegreeToRadian(20); double angle = 0; foreach (WoWUnit unit in units) { if (Me.Combat || unit.Distance > distance) break; if (ValidUnitCheck(unit) && unit.Distance <= distance // UnitRelationCommented //&& unit.GetUnitRelation(Me) != WoWUnit.WoWUnitRelation.Neutral ) { unitsDistance.Add(0); unitsInRange.Add(unit); } } Log("Looking target npc's finished. " + timer.ElapsedMilliseconds.ToString()); if (unitsInRange.Count > 0) Log("Number of hostiles within a " + distance + " yard range: " + unitsInRange.Count.ToString()); else { Log("No hostiles within a " + distance + " yard range"); return safeSpot; } int distanceFromLocation = 15; int count = 1; for (int i = 0; i < 18; i++) { if (Me.Combat) break; Point point = CalculatePointTo(Me.Location, angle, distanceFromLocation); switch (count) { case 1: ThreadList1.Add(point); break; case 2: ThreadList2.Add(point); break; case 3: ThreadList3.Add(point); break; } count++; if (count == 4) count = 1; angle += angleIncrements; } angle = 10; distanceFromLocation = 25; for (int i = 0; i < 18; i++) { if (Me.Combat) break; Point point = CalculatePointTo(Me.Location, angle, distanceFromLocation); switch (count) { case 1: ThreadList1.Add(point); break; case 2: ThreadList2.Add(point); break; case 3: ThreadList3.Add(point); break; } count++; if (count == 4) count = 1; angle += angleIncrements; } _safeSpotPoints.Clear(); _safeSpotPointsThread3.Clear(); _safeSpotPointsThread2.Clear(); _safeSpotPointsThread1.Clear(); List<Point> npcLoc = new List<Point>(); foreach (WoWUnit unit in units) { if (Me.Combat || unit.Distance > 75) break; if (ValidUnitCheck(unit) // UnitRelationCommented //&& unit.GetUnitRelation(Me) != WoWUnit.WoWUnitRelation.Neutral ) { npcLoc.Add(unit.Location); } } Log("Starting threads..."); ThreadStart safeSpotCheck3 = () => SafeSpotCheck(ThreadList3, npcLoc, 3); _safeSpotCheck3 = new Thread(safeSpotCheck3); if (ThreadList3.Count > 0 && !Me.Combat) _safeSpotCheck3.Start(); ThreadStart safeSpotCheck2 = () => SafeSpotCheck(ThreadList2, npcLoc, 2); _safeSpotCheck2 = new Thread(safeSpotCheck2); if (ThreadList2.Count > 0 && !Me.Combat) _safeSpotCheck2.Start(); ThreadStart safeSpotCheck1 = () => SafeSpotCheck(ThreadList1, npcLoc, 1); _safeSpotCheck1 = new Thread(safeSpotCheck1); if (ThreadList1.Count > 0 && !Me.Combat) _safeSpotCheck1.Start(); Log("Threads started waiting for complete..."); while ((_safeSpotCheck1.IsAlive || _safeSpotCheck2.IsAlive || _safeSpotCheck3.IsAlive) && !Me.Combat) Thread.Sleep(50); _safeSpotPoints.AddRange(_safeSpotPointsThread3); _safeSpotPoints.AddRange(_safeSpotPointsThread2); _safeSpotPoints.AddRange(_safeSpotPointsThread1); Log("End threads: " + timer.ElapsedMilliseconds.ToString()); if (Me.Combat) return safeSpot; foreach (Point testPoint in _safeSpotPoints) { if (Me.Combat) break; bool skip = false; List<double> tempDistance = new List<double>(); // stores the distance of all units int countDistance = 0; // variable to count the number of good distance for (int i = 0; i < unitsInRange.Count; i++) { if (Me.Combat) break; WoWUnit unitTest = unitsInRange[i]; tempDistance.Add(unitTest.Location.Distance(testPoint)); //gets unitdistance from new point if (tempDistance[i] <= distance) { skip = true; break; } if (tempDistance[i] >= unitsDistance[i]) countDistance++; } if (skip) continue; else { if (countDistance > goodDistance) { unitsDistance = tempDistance; goodDistance = countDistance; safeSpot = testPoint; } } } timer.Stop(); if (safeSpot != Me.Location) Log("Safe spot found... " + timer.ElapsedMilliseconds.ToString()); else Log("Using current spot... " + timer.ElapsedMilliseconds.ToString()); return safeSpot; }
Oh ok. Can't remember who now but one of the other cc dev's said that rezing your corpse in a safe spot was best controlled via the CC (using above code)
FPS: I am impressed on a base level with botting itself, even going back to the early days of Glider. Just something about it is absolutely fascinating to me. Looking at your CC really brings that level of impressiveness up a few notches. I am already wondering what it'd be like to 5 man an instance, with 4 bots in tow, and getting very excited about the prospect. Sure, I'd have to L2tank, but I'm OK with that That, to me, is the ultimate achievement in botting. No longer do you have to deal with the quirkiness of other people to accomplish to goals you wish to accomplish in heroics, and you can even make up a sizable portion of a raid! Now, you can truly play your way, on your schedule. To top it all off, is the fact that this level of complexity is being put into multiple classes simultaneously. With people like you working on supporting HB, it gives me a great feeling that I went with HB/GB.
Sounds good, I can't think of anymore . And if I do, I will PM you, and maybe they can be implemented in the next patch to it. Thanks again for listening to my somewhat absurd ideas. I hope I will be able to actually test the CC for ya soon
*drool* i just started a rouge by hand and i dont wanne do it anymore -_- iam eagerly waiting for your release btw: i wonder if you can bot a whole 5 man instance? tank+dps.... *wandersofintodreamworld*
Just a small update: Druid Travel form is now an option. It will shift into Travel Form during any non-combat movement. This can be toggled on and off. It also detects if you're swimming, so instead of shifting to Travel form it will shift to Aquatic form The same with Rogue Stealth. If you're on a PVP server and want to constantly stealth this option is perfect for you. The same will be applied to Hunter - Aspect of the Cheetah. And also Crusader Aura for the Paladin.
I have a lot (NOTE: Extreme amount) of experience playing a warrior (6 years now) I was a bit late on seeing the beta test but that's ok. If you post the UI I can give you suggestions (if it needs any) Keep up the good work!
Here is yet another change to the Warlock UI. If you want anything added or changed speak now. View attachment 4240