thanks for the update to JuggernautCombat() and OperativeCombat() seems to be working good now. Now If only the devs would fix buddybot itself.
For the pause, it was actually plan B of the questrewards suggestion/question. Its mainly when the bot is travelling or handing in quests, so i can take a peakaboo at the rewards. This sadly needs my presence at every darn quest on every toon, so i dont miss class quest rewards... Thats why i hoped you where able to code some diagnostics in. And no i dont need to pause the bot during combat, thats good in its current form Maybe i need to talk to aevitas about this, hoping he does add something... :s
thow something is off with the trooper vanguard - Assault specialist spec... it only does the following: Code: [JoesCombat] SoG: Y HP: 098,9 RS: 089,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 95,04 Comp: M1-4X CHP: 096,8 Casting Hammer Shot [JoesCombat] SoG: Y HP: 096,3 RS: 099,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 89,57 Comp: M1-4X CHP: 094,1 Casting Ion Pulse [JoesCombat] SoG: Y HP: 096,3 RS: 093,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 86,30 Comp: M1-4X CHP: 092,6 Casting Ion Pulse [JoesCombat] SoG: Y HP: 093,8 RS: 087,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 74,81 Comp: M1-4X CHP: 091,1 Casting Ion Pulse [JoesCombat] SoG: Y HP: 091,3 RS: 081,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 68,93 Comp: M1-4X CHP: 088,5 Casting Stockstrike [JoesCombat] SoG: Y HP: 091,3 RS: 075,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 62,41 Comp: M1-4X CHP: 083,6 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 067,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 57,43 Comp: M1-4X CHP: 080,8 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 057,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 53,23 Comp: M1-4X CHP: 079,0 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 041,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 46,54 Comp: M1-4X CHP: 079,0 Casting Recharge Cells [JoesCombat] SoG: Y HP: 088,7 RS: 080,0 AC: 1 CTScale: 1,0 TD: 0,0 THP: 46,54 Comp: M1-4X CHP: 079,0 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 082,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 41,36 Comp: M1-4X CHP: 076,1 Casting Stockstrike [JoesCombat] SoG: Y HP: 088,7 RS: 084,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 34,61 Comp: M1-4X CHP: 074,4 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 078,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 29,57 Comp: M1-4X CHP: 069,0 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 072,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 24,30 Comp: M1-4X CHP: 066,0 Casting Ion Pulse [JoesCombat] SoG: Y HP: 088,7 RS: 075,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 12,19 Comp: M1-4X CHP: 057,9 Casting Full Auto [JoesCombat] SoG: Y HP: 088,7 RS: 062,1 AC: 1 CTScale: 1,0 TD: 0,0 THP: 02,76 Comp: M1-4X CHP: 055,2 Casting Stockstrike i miss full auto mostly and pulse cannon. Mortar valley is completly ignored. and a possbile explosive round. I also landed with my toon back on tatooine with many height differences (ie where you can walk off a ridge). Currently with my vanguard it does sticky grenade and walks into range to dps. Would it be possible to let the bot handle the movement to the mob? Cause i had a scenario where the bot was moving overa ridge and a mob was on the other side. it threw a sticky grenade, and walked to the mob. Sadly the mob was on a bridge and fell off. again thanks!
thanks for fixing the goodies issue. Much appreciated. The routine is running great btw!! Movements are quick from one place to the next.
Hi joe! how to make FRD (Field Repair Droid) works? He just summon FRD and after nothing happens. Second problem: If vendor is to far (for example half of the map from the grind spots) bot farm and stops only then all inventory slots are full. After this he run back but if he kill monster and find a new item he just try to loot it (get error full inventory). corpse windows opened and he stucks. I just wonder how to make him run back to sell items with 5-6 available slots. Thank you
Updated. Biggest change was to slow down the combat loop so that the abilities would get picked up as usable. Interesting how in theory it's a RANGED class, but per the buffs etc, may as well be melee for DPS, which is a MAJOR PAIN IN THE A** when it comes to all the navigation involved during fighting. So to avoid all of the suffering involved per constant movement, I left the range (for the DPS Specs) at 30m. You can update it if you like in VanguardCombat(). Note that since Incendiary Round and Gut are basically melee abilities to some extent, they won't be used until the mob rushes you. Joe
I hear you, I ignore all melee range spells to the point where mobs are at my possition. Else its just mortar valley, full auto and pulse cannon... But is pause an option? Thanks again!
Nothing I can do re: Pause and TurnInQuest or CompleteQuest, that's hooking done into the questing 'turn-in/completion' code by the .exe - I have no control over that. If I'm understanding correctly, all you need to do for what you're describing is, comment-out the Profile line with the Alignment/AutoSkip (So you can choose it all manually)? .... OR.... just comment-out the Profile CompleteQuest lines, and the rewards will stick-around in a Pending state. Joe
I've already addressed this a wayyyyys back. 1. Max-Out your Field Repair Droid Legacy Ability (so it can be resummoned every 15m and will stick around for 3m or so). 2. IT TAKES TIME, TO FIND THE FIELD REPAIR DROID, PERIOD. And it won't ALWAYS find it. But will most of the time. 3. You can always just code a grinding profile which will run you near a (stationary/permanent) Repair Droid (i.e. at the Imp/Pub base/camp) and the code will, if you're low on inventory, scan for/find/move-to/use the permanent droid nearby. Joe
Hey Joe, Thanks for the continuous updates! Bot is running SOOO smoothly now (maybe too fast, as i got used to have time to send companions on missions or to sell grays while walking, and now i need to be fast). What was really a pain was merging my changes with yours is there and easy way to fork and merge on svn like on git ? that would save some time. As i added some comments and regions my line numbers should be closer but larger than yours (sorry, will try to map corrections to the correct line, i will try to do it now but i am not 100% sure i have any untouched version) I have only been playing swtor for a month and so far only have a consular which i love (a mix of tank, dps with treek as tank/healer? what's NOT to like??) so i only touched the general area and ShadowCombat. In the consular case the "Call Medical Probe" skill is called "Field Revive" so line 571 should read: (if its like this for all the classes) Code: if (ta.Name.Contains("Field Revive") && taMedProbe == null) { taMedProbe = ta; Logger.Write("Ability " + ta.Name + " found."); } i know taMedProbe is not used anywhere yet, but i am changing that (see below) as nothing pisses me off more than dying and not getting to alt-tab and stop the bot before it warps me to the med center. This is the skill Code: [07:02:32.376 N] [JoesCombat] Name: Field Revive ActionPointCost: 0 AiType: None AppearanceSpec: AutoAttackMode: None CastingTime: 0 ChannelingTime: 0 CombatMode: None CooldownTime: 0.5 EnergyCost: 0 ForceCost: 0 GlobalCooldownTime: 0 HeatCost: 0 IconSpec: shadowwalk IgnoreAlacrity: True IsCustom: True IsHidden: True IsPassive: False MaxRange: 0 MinRange: 0 ModalGroup: 0 TargetArc: 0 TargetArcOffset: 0 TargetRule: SelfDead UsesSpellPushback: False IsValid: True conContainerSlot_db: 0 conEntitySpec: 16140945076078806692 IsDeleted: False Position: <0,0,0> DistanceSqr: 64.04095 Distance: 64.04095 YDiff: 24.02201 IsFacing: False So if the name is different we could check for TargetRule = SelfDead & IgnoreAlacrity=true (for some reason return to medcenter has false in that field) Return to medcenter: Code: [07:02:33.330 N] [JoesCombat] Name: Return to Medcenter ActionPointCost: 0 AiType: None AppearanceSpec: AutoAttackMode: None CastingTime: 0 ChannelingTime: 0 CombatMode: None CooldownTime: 0 EnergyCost: 0 ForceCost: 0 GlobalCooldownTime: 0 HeatCost: 0 IconSpec: IgnoreAlacrity: False IsCustom: True IsHidden: True IsPassive: False MaxRange: 0 MinRange: 0 ModalGroup: 0 TargetArc: 0 TargetArcOffset: 0 TargetRule: SelfDead UsesSpellPushback: False IsValid: True conContainerSlot_db: 0 conEntitySpec: 16141006559840106161 IsDeleted: False Position: <0,0,0> DistanceSqr: 64.04095 Distance: 64.04095 YDiff: 24.02201 IsFacing: False There is one more SelfDead skill called Accept Revive, which is when someone else is trying to revive you. (always just with my consular as example. This is the code i am testing now (literally now) around 1625. Code: Logger.Write("Death detected. Waiting for Medcenter Rez to be Available..."); Thread.Sleep(5000); ClearTarget(); Thread.Sleep(400); ClearTarget(); if (taMedCenter != null) { SynchObjCacheAll(); //TorAbility ta = Me.KnownAbilitiesContainer.Where(t => t.Name == "Call Medical Probe").FirstOrDefault(); // RST - Test Field Rez if (taMedProbe!=null) try // RST - Test Field Rez { Me.AbilityActivate(taMedProbe, Me, out er); //RST - Test Field Rez if (er == EffectResult.Ok) { Logger.Write("Field Rezzing..."); Thread.Sleep(300); WaitForCast(); } } catch { } //while (taMedProbe.IsValid && (BuddyTor.Me.IsDead || BuddyTor.Me.HealthPercent < .2f)) Thread.Sleep(2000); //if (Me.AbilityActivate(taMedProbe, Me, out er)) { Logger.Write("Rezzing..."); Thread.Sleep(2000); } while (!taMedCenter.IsValid && (BuddyTor.Me.IsDead || BuddyTor.Me.HealthPercent < .2f)) Thread.Sleep(2000); if (Me.AbilityActivate(taMedCenter, Me, out er)) { Logger.Write("MedCenter Rezzing..."); Thread.Sleep(2000); } Logger.Write("Giving the bot some time to 'Get its Bearings'..."); Thread.Sleep(5000); } As you see i've also retouched the Logger to output serialized objects, but its usefulness is limited (most Tor objects have an non-trivial constructor, which wont serialize) This wont work on 90% of the objects, but i'll get there... Code: public static void WriteObject(TorObject O) { if (O != null) {try { XmlSerializer xmlserializer = new XmlSerializer(typeof(TorObject)); StringWriter stringWriter = new StringWriter(); XmlWriter writer = XmlWriter.Create(stringWriter); xmlserializer.Serialize(writer, O); Write(stringWriter.ToString()); writer.Close(); } catch (Exception ex) { Write("EX: " + ex.ToString()); } } } Also second important disclamer, i've never programmed in c# so learning as i go (i did work with C++), one thing that so far has eluded me is how i can make a simple function. I want to make a function i throw the array of targets surrounding me at X meters and also a radius (say 8 m) and returns the position in the ground where to drop a grenade or force in balance (ie largest concentration of targets, or hp, or elite, idk i need to code it and think about it lol). Speaking of which, is there a command like MercCastOnGround but Use Item on Ground (ie grenade not from a skill). So sorry if its presumptuous of me touching and posting comments and corrections of your code being and absolute newb, but honestly it was this bot an how fun it is to have an ACTUAL programmable bot, like with real code that has me enthused (ok some already used LUA including my favorite bot ever for GW2 name slipped now, but it had THE BEST graphical overlay i have ever seen, it colors farming and avoidance area right on the screen.. stunning).
This i've also looked into ... it seems that for some reason (either the npc list is not updated or something) if the bot is not visible on the screen (like the view is pointed elsewhere), or the screen is minimized or behind another window it NEVER (almost) finds it, its like the mob collection is refreshed when painted on screen. One of the reasons i dumped the whole skill list (passives, and actives) is to try to find the "Sell Grays" companion skill, but to no avail so far (it takes 5s when maxed out, but only works for grays which surely you know cos only one of us is the newb ). Edit: which is also why i dumped all of the 'TorObject mob' objects it checks in the for-each, the ammount of stuff in there was surprising (datacrons, cubes, platforms, resources, npc, mobs, etc etc ... but not stupid repair droid.
No problem - glad to get feedback, and thanks! I've already tried both Field Revive and Accept Revive, and neither of them have worked - if you get either to work let me know (the Call Medical Probe was a 'shot in the dark'). Thus, the commented-code. ALOT of the code is from trial-and-error. And ditto, my background was definitely NOT in C# or even C coming into this, but yeah it's a good learning experience. So far as a 'Targeting Midpoint' - for dropping an AOE of say 8 meters - you can look into void GetAttackers() (that builds the list, Attackers). Believe I had started code to determine the midpoint, but there were other issues at the time. Not sure if any of it is still in there or commented-out. So far as returning a 'Generic Array' - IF I'm understanding the question right, believe you can just pass out a parm of type List<> or IEnumerable? Sounds like you're probably ALOT more experienced C-Wise than I am, so if I misunderstood, I apologize. Joe
Yes, it's been a pain to get the ObjectManager.Update() to divulge/include the FRD. Part of that, resulting in the SynchX code (but that like everything has been hit-and-miss). Queried as an NPC, Character, or even Player or Placeable, converted-Object, most of the time, no dice. I then added generic 'class queries' which DID seem to make a difference one day (as in the OM was smart enough to pull from TOR memory into the cache on 'generic enough' queries where the GUID wasn't in there, but the next day... nothing). (rant removed) Joe
Thanks for the great plugin! I appreciate the hard work you have put in =D I had a quick question. My jedi sent isn't using force leap or zen. I'm just using the combat profile with grinder on. Is there a way to turn it on? As of now, it just runs up to the npc to kill without closing the gap with force leap and not using zen at 30 centering stacks.
One thing you can do is to set the PullRange to something like 3.0f (30 meters) in MercHelpers. I know what you're talking about - has to do with a change I made to 'Draw the Line' between Combat and OOC - the overlap was contributing to instability - long story there. Anyhow, since I made the change, alot of 'ranged pulls' aren't getting picked up as they should - the .exe seems to be running right up to the mob, before calling combat, which is a pain in the .... In short, Combat was being called before periodically out of BOTH the OOC Routine and the 'hook to Combat' (when the .exe detected Combat-In-Progress), and although it is a Static class (meaning only ONE Combat call should be running at a time), things would get sketchy on the back-end when that happened, thus the change (to not call Combat, period, out of ANY OOC routine). But the problem is, the damn pulls now. Will test it out and notify, but in the meantime you should be able to try out the PullRange update. Joe
Thanks for the prompt response! So awesome I will change it and try that out Edit: Zen works. Only on the higher difficulty mobs it seems like. Edit: Pulldist doesn't seem to work =/ Changed it to the value you specified
Ok, looked into it further - something I screwed up a little ways back when removing code I thought was obsolete/ineffective in StopMoving(). Stopping movement has always been an eternal battle, and the code I had commented-out messed things up. Updated, sorry, try the latest. And yeah, Zen kicks in when you're at 70%-or-less-health. Joe
Woohoo ... i see you are testing a new Field Revive cant wait to test it !! (yeah freak that i am i look at the code first, so i know where to try to see the changes. LOVED the BindAbilty cleanup! very nice idea, the code looks GREAT in that section now The routine keeps looking (and working tho i still havent tried rev 88) better and better! Thanks, your time and effort it's very much appreciated! edit: ohh new code for FRD too ... will test both. this is what i am trying for the Shadow (could be useful for others, idk still a newb) Code: Logger.Write("CT.HEAD :" + CT.Heading.ToString() + " - CT.Distance :" + CT.Distance.ToString()); Logger.Write("ME.HEAD :" + Me.Heading.ToString()); float aaa=Math.Abs(CT.Heading - Me.Heading); Logger.Write("Angle :" + aaa.ToString()); if (MercCast("Shadow Strike", CT.Distance <= .20f && Math.Abs(CT.Heading - Me.Heading) < 60f)) if (MercCastOnGround("Force in Balance",(TWR10 >= 2 || SoG),CT)) if (MercCast("Whirling Blow", TWR5 >= 3)) if (MercCast("Double Strike")) break; Basically it TRIES to determine if i am behind the target, if i am +/- 60 deg (ie 120 deg arc) behind target (behind is a figure of speech, all i know is heading, behind would be a slightly more complex point and heading vector problem (to-do)) it'll try to cast Shadow Strike, otherwise Force in Balance. The whirling blow is not used now (if there are 3 at 5m there are 2 or more at 10 and FIB is cast). it works around 75% of the times, other times it will overshoot the target