i am in the states so i use the english version as soon as i press the start / stop button it changes job beautifully. is just that i cannot go to sleep like that in the case of the clusters there is NO teleporting because both miner / botany take place in the same area. the botany works from 01 AM to 09 AM the miner works from 01 PM to 09 PM am i putting the command in the right place to change jobs ?? ------------------------------ <Order> <While Condition="True"> <If Condition="IsTimeBetween(0,11)"> <If Condition="not IsOnMap(154)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> <TeleportTo Name="Revenant's Toll" AetheryteId="24" /> </If> </If> <If Condition="IsTimeBetween(0,11)"> <TeleportTo Name="Revenant's Toll" AetheryteId="24" /> <Gather> <GatherObject>Unspoiled Mature Tree</GatherObject> <HotSpots> <HotSpot Radius="1000" XYZ="544.7119, 9.910261, -498.9675" /> <HotSpot Radius="1000" XYZ="538.89, -5.89, -358.8909" /> </HotSpots> <Slot>4</Slot> <GatheringSkillOrder> <GatheringSkill SpellName="Field Mastery II" TimesToCast="1" /> <GatheringSkill SpellName="Blessed Harvest II" TimesToCast="1" /> </GatheringSkillOrder> </Gather> <WaitWhile Condition ="IsTimeBetween(0,11)" /> </If> ----------------------------------
Try This: Code: <!-- Change Slot Number for required cluster: 1 = Thunder 2 = Fire 3 = Wind 4 = Water 5 = Ice 6 = Earth Mining is 1PM > 4PM; 5PM > 8PM; 9PM > 12AM Botany is 1AM > 4AM; 5AM > 8AM; 9AM > 12PM --> <Profile> <Name>[OrderBot] Test Unspoiled Cluster Farm</Name> <KillRadius>80</KillRadius> <Order> <TeleportTo Name="Revenant's Toll" AetheryteId="24" /> <While Condition="True"> <If Condition="(IsTimeBetween(1,3)) or (IsTimeBetween(5,7)) or (IsTimeBetween(9,11))"> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> <Gather while="(IsTimeBetween(1,3)) or (IsTimeBetween(5,7)) or (IsTimeBetween(9,11))"> <GatherObject>Unspoiled Mature Tree</GatherObject> <HotSpots> <HotSpot Radius="360" XYZ="544.7119, 9.910261, -498.9675" /> </HotSpots> <Slot>4</Slot> <GatheringSkillOrder> <GatheringSkill SpellName="Blessed Harvest II" TimesToCast="1" /> <GatheringSkill SpellName="Field Mastery II" TimesToCast="1" /> </GatheringSkillOrder> </Gather> </If> <If Condition="(IsTimeBetween(13,15)) or (IsTimeBetween(17,19)) or (IsTimeBetween(21,23))"> <If Condition="Core.Me.CurrentJob != ClassJobType.Miner"> <ChangeJob Type="Miner" /> </If> <Gather while="(IsTimeBetween(13,15)) or (IsTimeBetween(17,19)) or (IsTimeBetween(21,23))"> <GatherObject>Unspoiled Rocky Outcrop</GatherObject> <HotSpots> <HotSpot Radius="360" XYZ="304.5188, -2.537387, -541.2041" /> </HotSpots> <Slot>4</Slot> <GatheringSkillOrder> <GatheringSkill SpellName="Unearth II" TimesToCast="1" /> <GatheringSkill SpellName="Sharp Vision II" TimesToCast="1" /> </GatheringSkillOrder> </Gather> </If> </While> </Order> </Profile> It Should do what you require. Node changes location versus time, these locations need to be recorderd. I'm sure there's a set pattern, but I can't find one. The above will work, the rest I leave for you. Do consider adding the Stealth Tag by Kam. After Checking, it stops moving when changing class, this is a routine error I think, i'll look more into it tomorrow.
well i was exited to see your post but it still doesnt work same problem as before. i have to press STOP/START (( so that it switches jobs )) then i have to STOP/START (( the new profile under the new job )) is this working for you guys auto switching and keep going with your script ?? i even deleted RB and downloaded the latest version. at the beginning of this thread it said "clean installation needed" am i supposed to install it somewhere ?? i just unzip it. and the .exe is right there.
I'll be having a look at it today. It works on the first change if not on a gather class, but when it switches for the next time slot, it stops. I think; as I said, that it's something to do with how the bot is handling the class change. I use several routines, so I'll check with just Kupo (As Mastahg said he'd done switching classes in last update). I'll let you know.
Its this that is causing it. I could have sworn somewhere I read that you shouldnt need to stop/start the bot anymore incase it doesnt notice the change. I'll look into it today.. I'll have to manually have the plugin recognize the change instead of relying on RB to do it, I'll try to have it updated tonight.. its weird that I have not been noticing this on my side.. but I only need to use the plugin like once a week to gather enough items to make SB gear to use through out the week. I apologize for the complications.
So I'm using a profile I made to mine both unspoiled mining and botany nodes. It seems to work great for botany, switching classes and everything, however when it gets to the first mining portion it teleports, switches class to Miner and just stands at the atheryite. Here's a log snippet for you. Code: [21:39:35.223 V] Blacklisting 400003AC for 00:00:30 [Type: All] - Reason : So we don't auto target [21:39:35.223 N] Gathering ItemName:Spruce Log Chance:95 HqChance:34 Amount:3 RawItemId:5395 [21:39:36.264 N] Gathering ItemName:Spruce Log Chance:100 HqChance:34 Amount:3 RawItemId:5395 [21:39:48.133 V] [Poi.Clear] Reason: Node is gone [21:39:52.429 D] Requesting path on 155 from <340.4021, 308.287, -268.0278> to <337.7039, 306.35, -289.9108> [21:39:52.483 D] Generated path to <337.7039, 306.35, -289.9108> in 00:00:00.0541828 ms [21:39:55.962 N] [GatherTag] Reached desired number of loops. [21:39:55.962 D] Removed hook [RoutineCombat] dd15c58f-7d86-4678-8e1f-e9d20f0b0e77 [21:39:55.962 D] Removed hook [PoiAction] 59fc346b-ad70-4b2e-b8cb-2648482e8332 [21:39:55.962 V] [Poi.Clear] Reason: Current behavior changed to TeleportTo: ZoneId: 0, AetheryteId: 18, Name: Camp Drybone, Force: False, Aetheryte: null, IsDone: False, InCombat: False, QuestId: 0, StepId: 0, PostCombatDelay: 0, QuestName: null, IsDoneCache: False, Behavior: TreeSharp.PrioritySelector, . [21:39:55.962 D] Replaced hook [ProfileOrderBehavior_Hook] 7710ab2a-d4e3-423d-8791-2440f57eb0dd [21:39:56.214 D] Teleporting to camp drybone [21:40:06.057 D] Removed hook [RoutineCombat] 16435448-9701-4652-8e2b-be9f17bdd957 [21:40:06.057 D] Inserted new hook [TreeStart @0] ff2ea7c3-5434-414a-a219-8c44708f1c35 [21:40:06.057 V] [Poi.Clear] Reason: Current behavior changed to ChangeJobTag: Type: Miner, IsDone: False, InCombat: False, QuestId: 0, StepId: 0, PostCombatDelay: 0, QuestName: null, IsDoneCache: False, Behavior: null, . [21:40:06.057 N] [Classy] - Changing gearset [21:40:06.057 N] [Classy] - Found - sending message [21:40:06.058 N] [Classy] - message set - should be changed. [21:40:06.066 N] [Classy] - OnDone() Called [21:40:06.066 D] [POI Set] Type: Gather [21:40:06.066 N] [Classy] - Current POI should be set [21:40:06.066 D] Added new hook [PoiAction] 6adf3278-365a-48e2-a043-bcf07fad8514 [21:40:06.066 V] [Poi.Clear] Reason: Current behavior changed to GatherTag. [21:40:06.066 D] Replaced hook [ProfileOrderBehavior_Hook] 32e42ff2-f0ed-44b8-a8c4-0fb364eaa938 [21:40:06.091 D] DoAction Mount 1 0xE0000000 [21:40:06.383 N] Building Actioncache [21:40:06.385 N] Action Name:Sprint Action Id:3 [21:40:06.385 N] Action Name:Byregot's Ward Action Id:219 [21:40:06.385 N] Action Name:Prospect Action Id:227 [21:40:06.385 N] Action Name:Lay of the Land Action Id:228 [21:40:06.385 N] Action Name:Stealth Action Id:229 [21:40:06.385 N] Action Name:Preparation Action Id:230 [21:40:06.385 N] Action Name:Toil of the Mountaineer Action Id:231 [21:40:06.385 N] Action Name:Solid Reason Action Id:232 [21:40:06.385 N] Action Name:Deep Vigor Action Id:233 [21:40:06.385 N] Action Name:Nald'thal's Ward Action Id:234 [21:40:06.385 N] Action Name:Sharp Vision Action Id:235 [21:40:06.385 N] Action Name:Sharp Vision II Action Id:237 [21:40:06.385 N] Action Name:Truth of Mountains Action Id:238 [21:40:06.385 N] Action Name:King's Yield Action Id:239 [21:40:06.385 N] Action Name:King's Yield II Action Id:241 [21:40:06.385 N] Action Name:Unearth Action Id:242 [21:40:06.385 N] Action Name:Unearth II Action Id:243 [21:40:06.385 N] Action Name:Lay of the Land II Action Id:291 [21:40:06.385 N] Action Name:Thaliak's Ward Action Id:293 [21:40:06.385 N] Action Name:Sharp Vision III Action Id:295 [21:40:06.385 N] Done building Actioncache [21:40:06.385 D] [RoutineManager] Routines have been reloaded. Current class-specific list: [21:40:24.827 N] Stopping the bot. Reason:Pushed the stop button. [21:40:24.827 D] CurrentBot.Stop() [21:40:24.828 N] Connection closed! 192.99.148.87:31214 [21:40:24.828 D] TreeHooks.Instance.ClearAll() [21:40:24.828 D] Navigator.Clear() [21:40:24.828 V] [Poi.Clear] Reason: Bot stopped [21:40:24.828 D] OnStop event [21:40:24.828 D] OnStop Event Invoking [21:40:24.828 D] ProfileOrderManager.OnBotStop. Resetting caches. [21:40:24.834 N] Bot Thread Ended. Was this requested? [21:40:27.782 D] Cannot stop a bot when it is not running. I've attached my full log here as well. Here's a portion of the profile I'm using to see if I'm using it right. Code: <!-- Botany: Coerthas Central Highlands - Spruce Log --> <If Condition="IsTimeBetween(9,11)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> <If Condition="not IsOnMap(155)"> <TeleportTo Name="Camp Dragonhead" AetheryteId="23" /> </If> <Gather Loops="1"> <GatherObject>Unspoiled Mature Tree</GatherObject> <HotSpots> <Hotspot Z="-429.2352" Y="311.0858" X="290.7672" Radius="500"/> <Hotspot Z="-352.53" Y="306.058" X="393.6922" Radius="500"/> <Hotspot Z="-289.9108" Y="306.35" X="337.7039" Radius="500"/> </HotSpots> <!-- Redo this hotspot --> <Slot>5</Slot> <!-- Spruce Log --> <GatheringSkillOrder> <GatheringSkill SpellName="Leaf Turn II" TimesToCast="1" /> <GatheringSkill SpellName="Field Mastery II" TimesToCast="1" /> </GatheringSkillOrder> </Gather> <TeleportTo Name="Camp Drybone" AetheryteId="18" /> </If> <!-- Mining: Eastern Thanalan - Gold Ore, Coblyn Larva --> <If Condition="IsTimeBetween(9,11)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Miner"> <ChangeJob Type="Miner" /> </If> <If Condition="not IsOnMap(145)"> <TeleportTo Name="Camp Drybone" AetheryteId="18" /> </If> <Gather Loops="1"> <GatherObject>Unspoiled Mineral Deposit</GatherObject> <HotSpots> <Hotspot Z="51.19678" Y="23.01122" X="337.304" Radius="500"/> </HotSpots> <Slot>5</Slot> <!-- Slot 5 = Gold Ore, Slot 6 = Coblyn Larva --> <GatheringSkillOrder> <GatheringSkill SpellName="Sharp Vision II" TimesToCast="1" /> </GatheringSkillOrder> </Gather> <TeleportTo Name="Costa Del Sol" AetheryteId="11" /> </If>
Which appears to be the exact same issue the previous person is having as well, I'm looking into it tonight, since I didnt experience the issue on my side.
Gotcha. Just wanted to report it as well and possibly add a bit more information. I know information always helps.
All I know is that when it's started, it's perfect. Yet any and all modification to the profile, when the condition is met and it switches to the 2nd part (Miner) the bot will just idle on the POI: <ChangeClass> tag. It's as if the bot doesn't know it's done, even tho I know your plugin updates the POI. It just sits there, and won't move on to the gather tag. I have tried updating the POI to read GatherTag after the change (manually via the console), yet that doesn't kick the bot into reading the gather tag either. So my plan to add a codechunk to force the bot to read the next bit is a no go. But then I'm fairly novice and my knowledge of code isn't that great. I keep browsing the namespace tho and trying different things to get it unstuck. But in the end, it might be just how the bot reads the profile that's at fault.
A few things I noticed looking at the code: You call ResetCachedDone() when you should instead be overriding the protected void OnResetCachedDone(). That might be part of the problem, but also perhaps you should consider flushing the location as well in OnResetCachedDone()? Doubt that would matter much, but you never know. You could also consider adding in a Decorator that checks to make sure the job actually changed to what it expected to be before setting _done to true, just as a safety feature.
Code: string currentJob = Core.Me.CurrentJob.ToString(); string selectedJob = Enum.Parse(typeof(Enums.ClassJobType), Type, true).ToString(); Code: new Decorator(ret => !Core.Me.InCombat && !IsDone && !IsSameJob(currentJob, selectedJob), Code: public bool IsSameJob(string type1, string type2) { return (string.Compare(type1, type2, true) == 0); } It does check to make sure that the job is changed, or else the current decorator would continue to fire if they were not equal. That could be an issue, I did not notice that at first, Thank you. I'm thinking the issue might still be with RB and not recognizing the change, He did mention that stopping/starting the bot is "recommended" when switching classes. I will have to look through to see how to manually reset it as people are doing in custom cr's that support class swapping without restarting RB.. While I was testing this, I did not have to restart the bot when it was switching, so it was personally nothing that I experienced.. When I get home tonight I will try to get an update uploaded.. I've been working on it on my laptop tonight while at work, but its a POS to play ffxiv on.. so i'll have to test it at home on my pc.. Thank you for the suggestions.
What I meant was that you set _done to true blindly, just trusting that there was no issues with the SendChat function. I was thinking something like this might be safer, just in general: Code: return new PrioritySelector( new Decorator(ret => Core.Player.CurrentJob.ToString() == selectedJob, new Action(r => { Logging.Write("[Classy] - Job changed, ready to exit!"); _done = true; } ) ), new Decorator(ret => !Core.Me.InCombat && !IsDone && !IsSameJob(currentJob, selectedJob), new Action(r => { Logging.Write("[Classy] - Changing gearset"); binding.TryGetValue(Type, out selecting); Logging.Write("[Classy] - Found - sending message"); string message = "/gs change " + selecting; ChatManager.SendChat(message); Logging.Write("[Classy] - message set - should be changed."); } ) ) ); Also, if you need to start/stop the bot, call ff14bot.TreeRoot.Start() and TreeRoot.Stop(). For most profiles I don't see why that would be a problem.
Okay, I think I might have it fixed. as kagamihiiragi17 suggested, I added a decorator just for setting _done to true (pretty much a copy/paste from their post because its 3am and I am tired/lazy,, thank you by the way kagamihiiragi17). I also added treeroot.stop in that decorator, set _isdone to true, and called treeroot.start after setting the value. I know this probably is not the correct way to do this, but lets face it ... im new to creating plugins for buddybots, but have been using them for many years now.. if anyone knows of a better way, Please let me know. I tested this with a cluster farm clipping that was posted in previous page.. since I did not feel like sitting here the hour to test it.. i made random time conditions in the profile and let the bot run for a little bit. At each timebetween condition, it switched to appropriate class and ran to specific hotspot and waited for the next timebetween condition.. it then changed class and ran to that one.. this is about the extent of the testing that was done so far.. please try it and monitor it and see how it works for you. Updated attachment in OP thanks to everyone for input.
Wonderful. I'll test it out later. I've got the profile ready with stealth activation too, so if all is good, I'll post the profile.
First off I want to say great work. This plugin is coming along great. Being a new programmer myself I know this stuff can be pretty confusing. In the newest version changing jobs is working great, it's not giving me any problems. However, I am having one pretty big issue, and I think it's because of the added TreeStop and TreeStarts. Here's the issue. Code: [13:52:54.503 D] [RoutineManager] Routines have been reloaded. Current class-specific list: [13:52:54.503 N] Stopping the bot. [13:52:54.503 D] CurrentBot.Stop() [13:52:54.503 N] Connection closed! 192.99.148.87:31214 [13:52:54.503 D] TreeHooks.Instance.ClearAll() [13:52:54.503 D] Navigator.Clear() [13:52:54.503 V] [Poi.Clear] Reason: Bot stopped [13:52:54.503 D] OnStop event [13:52:54.503 D] OnStop Event Invoking [13:52:54.503 D] ProfileOrderManager.OnBotStop. Resetting caches. [13:52:54.552 D] Loading last profile [13:52:54.714 N] Loaded profile Mining and Botany: Unspoiled Node Farming [13:52:54.795 N] Connection to 192.99.148.87:31214 established. When the bot starts up again it reloads the profile completely instead of starting it back up where it was. Now maybe this is a problem with how I'm writing my profile and if there's a better way to do it, please tell me. Here's a snippit of my profile. Code: <!-- Botany: East Shroud - Kidragora, Trillium Bulb --> <If Condition="IsTimeBetween(21,23)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> <If Condition="not IsOnMap(152)"> <TeleportTo Force="true" Name="Hawthorne Hut" AetheryteId="4" /> </If> <Gather Loops="1"> <GatherObject>Unspoiled Lush Vegetation Patch</GatherObject> <HotSpots> <Hotspot Z="131.2229" Y="1.075165" X="-380.9028" Radius="500"/> </HotSpots> <Slot>7</Slot> <!-- 6=Kidragora, 7=Trillium Bulb --> <GatheringSkillOrder> </GatheringSkillOrder> </Gather> <TeleportTo Name="Camp Dragonhead" AetheryteId="23" /> </If> <!-- Mining: Coerthas Central Highlands - Astral Rock --> <If Condition="IsTimeBetween(21,23)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Miner"> <ChangeJob Type="Miner" /> </If> <If Condition="not IsOnMap(155)"> <TeleportTo Name="Camp Dragonhead" AetheryteId="23" /> </If> <Gather Loops="1"> <GatherObject>Unspoiled Rocky Outcrop</GatherObject> <HotSpots> <Hotspot Z="155.2625" Y="284.1149" X="125.8191" Radius="500"/> </HotSpots> <Slot>6</Slot> <!-- Astral Rock --> <GatheringSkillOrder> </GatheringSkillOrder> </Gather> <TeleportTo Name="Revenant's Toll" AetheryteId="24" /> </If> <!-- Botany: Mor Dhona - Grade 4 Carbonized Matter and Elemental Clusters --> <If Condition="IsTimeBetween(21,23)"> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> <If Condition="not IsOnMap(154)"> <TeleportTo Name="Revenant's Toll" AetheryteId="24" /> </If> <Gather Loops="1"> <GatherObject>Unspoiled Rocky Outcrop</GatherObject> <HotSpots> <Hotspot Z="-484.7234" Y="-6.061276" X="3337.9405" Radius="500"/> </HotSpots> <!-- Slot 0 = Grade 4 Carbonized Matter Slot 1 = Lightning Cluster Slot 2 = Fire Cluster Slot 3 = Wind Cluster Slot 4 = Water Cluster Slot 5 = Ice Cluster Slot 6 = Earth Cluster --> <Slot>5</Slot> <GatheringSkillOrder> </GatheringSkillOrder> </Gather> <If Condition="Core.Me.CurrentJob != ClassJobType.Botanist"> <ChangeJob Type="Botanist" /> </If> If you notice there I have three If statements all within the same time frame, because nodes for both jobs spawn in the same time frame some times. What's happening is the bot will move to East Shroud, do it's thing and teleport to Dragonhead, but when it gets there and stops the bot to change classes, when the bot gets turned back on the profile is reread again and it goes right back to East Shroud and starts over as if it's never been there. Normally, if the bot is never stopped, it would just continue down the list at the next stop. What can we do to fix this?
There's nothing to fix, that's working as intended. When the bot is stopped and started, the entire profile is reevaluated and starts from the first place where it can. In your example, as far as the bot is concerned, once it restarts it hasn't even been to East Shroud, so it goes there again. That's proper behavior. You can change the profile so that the first If is IsTimeBetween(21,22) and the second one is IsTimeBetween(22,23) to make it act the way you want it to.