What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal
RebornBuddy Forums

Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

becto

Member
Joined
Mar 14, 2014
Messages
104
(SOLVED) [Request] Adamantite Ore

exMatt has done it again, making our dreams come true.

Follow his post below in post #7 (here) and follow the directions.

What this does...well, exactly what is described in my original post below.

Original Post:
I can think how I would like to do this analytically, however I don't know if this is something that can be programmed as a profile or not, so I am going to openly ask the question.

My goal is to create a profile that will collect Adamantite Ore (and other Unspoiled Nodes in Heavensward) that looks more natural and not just a script that will stealth all the time and slowly creep to the gathering spot and slowly creep back. I would like to see if we can detect which Unspoiled location from the 3 spots are active, then fly up from the start point and descend to the safe spot and collect, then return. I realize there is some issues with Gathering that makes this complex, but if we can identify the correct area to fly to first, then I don't see the issue of using the current Gathering tags.

35fD0OU.jpg


referring to the image, is it possible to start at the red square, detect Unspoiled node at 1, 2 or 3, then fly to star near that node and then use Gathering tag. It should collect the item at node then return to star. Then you can fly back up and wait at red square.

I am just trying to wrap my head around this, as I know this area is a high risk to bot due to a billion people farming the node. I was hoping that others could share some ideas as to come up with a solution for this.
 
Last edited:
Would it not detect the llive unspoiled node if the hotspot radius is large enough or am I missing something?
 
Would it not detect the llive unspoiled node if the hotspot radius is large enough or am I missing something?

He would like it to land at the safespots, and not just beeline to the node (and probably have a 100% probability of death at 1 and 3) :)
 
ahhh right!

RB itself has code which detects which nodes are active (I don't have the slightest clue about programming so please choose to disregard everything in this message if it sounds el stupido) and I'm guessing it's embedded in the code behind gathertag somewhere. I just don't think this is 'exposed' for playing around with with orderbot and would probably be the province of a plugin....but hoping not!
 
Maybe you can build something using this code example

Here is my attempt at some things that should help.

Code:
var node =
	GameObjectManager.GetObjectsOfType<GatheringPointObject>()
		// Dont need this line.. only one node .OrderBy(gpo => gpo.Distance2D(Core.Me.Location))
		.FirstOrDefault(
			gpo =>
			gpo.EnglishName == "Unspoiled Mineral Deposit"
			&& gpo.IsVisible && gpo.IsValid);
			
if (node != null)
{
	MovementManager.SetFacing(node.Location);
	var safeSpot = GetSafeSpot(Core.Player.Heading);
	
	//FlyTo LocalSafeSpot
	//Stealth
	Poi.Current = new Poi(node, PoiType.Gather);
	Poi.Current.Unit.Interact();
	
	// Kings yield 2
	Actionmanager.DoAction(241, Core.Player);
	// Sharp vision
	Actionmanager.DoAction(235, Core.Player);
	while (GatheringManager.SwingsRemaining > 0)
	{
		GatheringManager.GetGatheringItemByIndex(5).GatherItem();
	}
        Poi.Clear();
	//MoveTo LocalSafeSpot
	//FlyTo MainSafeSpot
}

// Determines the safe spot based off the direction you are facing (towards the node that spawned).
public Vector3 GetSafeSpot(float heading)
{
	if (heading >= 0 && heading < 2)
	{
		return new new Vector3(1,2,3);
	}
	else if (heading >= 2 && heading < 4)
	{
		return new new Vector3(4,5,6);
	}
	
	return new Vector3(7,8,9);
}

If you were collecting instead of gathering, you would use....


            await castSpell("Impulsive Appraisal");
            if (Core.Player.HasAura("Discerning Eye")) await castSpell("Single Mind");
            else await castSpell("Discerning Eye");
            await castSpell("Impulsive Appraisal");
            if (Core.Player.HasAura("Discerning Eye")) await castSpell("Single Mind");
            else await castSpell("Discerning Eye");
            await castSpell("Methodical Appraisal");
while(GatheringManager.SwingsRemaining > 0)
{
            await Coroutine.Sleep(500);
            RaptureAtkUnitManager.Update();

            await Coroutine.Wait(5000, () => RaptureAtkUnitManager.GetWindowByName("GatheringMasterpiece") != null);
            while (!ff14bot.RemoteWindows.SelectYesNoItem.IsOpen)
            {
                RaptureAtkUnitManager.GetWindowByName("GatheringMasterpiece").SendAction(1, 1, 0);
                await Coroutine.Wait(500, () => ff14bot.RemoteWindows.SelectYesNoItem.IsOpen);
            }

            ff14bot.RemoteWindows.SelectYesNoItem.Yes();
            await Coroutine.Wait(5000, () => !ff14bot.RemoteWindows.SelectYesNoItem.IsOpen);
            await Coroutine.Sleep(500);
}
 
Last edited:
Adamantite... try this

Instructions...

If you already have FlightPathTo, you can disregard that file.

Move FlightPathTo into RBDirectory\Plugins\OrderBotTags (suggested location)

Move the xml profile anywhere you like, and then create a directory called Custom in the same location and place the SafeCollectAdamantite.cs inside that directory.



Feedback would be excellent.



There seems to be a mistake in the SafeCollect code..

if (heading >= 5.7 && heading < 1.5)

should be

if (heading >= 5.7 || heading < 1.5)

Sorry, I am in the middle of some refactoring to make this code work more generically so I am not going to repost the files yet.
 

Attachments

Last edited:
Thank you exMatt! This really is better than what I had expected that could be accomplished with RB. You sir, are amazing! I am testing this now, I have not seen all the nodes but am going to continue and let you know if anything comes up that doesn't look right. So far, I am very impressed.
 
Feedback would be excellent.

Ran into the following:

[15:42:18.654 D] Buddy.Coroutines.CoroutineUnhandledException: Exception was thrown by coroutine ---> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\RB\OrderBot\Gathering\Mining\Adamantite - Experimental\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()
--- End of inner exception stack trace ---
at Buddy.Coroutines.Coroutine.CheckPostConditions(Boolean shouldBeCanceled)
at Buddy.Coroutines.Coroutine.Resume(Boolean forStop)
at Buddy.Coroutines.Coroutine.Resume()
at TreeSharp.ActionRunCoroutine.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.Decorator.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.TreeRoot.() --> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\RB\OrderBot\Gathering\Mining\Adamantite - Experimental\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()
 
Did you change anything in the .cs?


EDIT: I have managed to generate the same Error as you

[16:17:19.738 D] Buddy.Coroutines.CoroutineUnhandledException: Exception was thrown by coroutine ---> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\Users\TommyBoy\Desktop\Buddy\Profiles\Gathering\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()
--- End of inner exception stack trace ---
at Buddy.Coroutines.Coroutine.CheckPostConditions(Boolean shouldBeCanceled)
at Buddy.Coroutines.Coroutine.Resume(Boolean forStop)
at Buddy.Coroutines.Coroutine.Resume()
at TreeSharp.ActionRunCoroutine.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.Decorator.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.TreeRoot.() --> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\Users\TommyBoy\Desktop\Buddy\Profiles\Gathering\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()



The only thing I changed was where it initially lands when the node pops.
 
Last edited:
Did you change anything in the .cs?


EDIT: I have managed to generate the same Error as you

[16:17:19.738 D] Buddy.Coroutines.CoroutineUnhandledException: Exception was thrown by coroutine ---> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\Users\TommyBoy\Desktop\Buddy\Profiles\Gathering\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()
--- End of inner exception stack trace ---
at Buddy.Coroutines.Coroutine.CheckPostConditions(Boolean shouldBeCanceled)
at Buddy.Coroutines.Coroutine.Resume(Boolean forStop)
at Buddy.Coroutines.Coroutine.Resume()
at TreeSharp.ActionRunCoroutine.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.Behavior.HookExecutor.Run(Object context)
at TreeSharp.Action.RunAction(Object context)
at TreeSharp.Action.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.Decorator.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at ff14bot.TreeRoot.() --> System.NullReferenceException: Object reference not set to an instance of an object.
at ExBuddy.OrderBotTags.Gather.SafeCollectAdamantite.<Gather>d__1d.MoveNext() in c:\Users\TommyBoy\Desktop\Buddy\Profiles\Gathering\Custom\SafeCollectAdamantite.cs:line 126
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at TreeSharp.ActionRunCoroutine....()



The only thing I changed was where it initially lands when the node pops.


Did you happen to notice if the gathering window was open or not?
 
Did you happen to notice if the gathering window was open or not?


Just re-ran for the latest node, watched it and it performed just fine. That said though, I had it run a few times without any issue before, came back later to check it errored out. I'll keep watching it and let you know.
 
Just re-ran for the latest node, watched it and it performed just fine. That said though, I had it run a few times without any issue before, came back later to check it errored out. I'll keep watching it and let you know.

I think what is happening is I did all my testing when there wasn't 100 people hitting the node... I think the Gathering window is taking longer to open...even though I am giving it up to 5 seconds. I have seen the same error and noticed the gather window was not open. So it is either the time, or just a distance issue.
 
Great, thanks ExMatt. Don't mind anyone using what you've done and extending it for Cuprite and other nodes do you?
 
Great, thanks ExMatt. Don't mind anyone using what you've done and extending it for Cuprite and other nodes do you?

I already have a fully functional generic one for both Botany and Mining. I am not releasing it yet, because I am having major issues with CWH Flight paths. Also, I am attempting to build an extendable way of doing the rotations. If I don't pass out soon, I might have it done in a few hours.

Oh... and here is a teaser.



Code:
<?xml version="1.0" encoding="utf-8"?>
<Profile>
	<Name>Collectable: Adamantite Ore + Chysahl Greens</Name>
	<KillRadius>50</KillRadius>
	<BehaviorDirectory>./Custom</BehaviorDirectory>
	<CodeChunks>
		<CodeChunk name="MIN">
			<![CDATA[
				ff14bot.Managers.ChatManager.SendChat("/gs change 21");
				await Buddy.Coroutines.Coroutine.Sleep(2000);
			]]>
		</CodeChunk>
		<CodeChunk name="BTN">
			<![CDATA[
				ff14bot.Managers.ChatManager.SendChat("/gs change 20");
				await Buddy.Coroutines.Coroutine.Sleep(2000);
			]]>
		</CodeChunk>
		<CodeChunk name="ToM">
			<![CDATA[
				if(!Core.Player.HasAura(222))
				{
					var result = true;

					if (MovementManager.IsFlying)
					{
						result = await CommonTasks.Land();
					}
					
					if (result && Core.Player.IsMounted)
					{
						Actionmanager.Dismount();
						await Buddy.Coroutines.Coroutine.Sleep(1000);
					}
					
					ff14bot.Managers.Actionmanager.DoAction(238, Core.Player);
					await Buddy.Coroutines.Coroutine.Sleep(2000);
				}
			]]>
		</CodeChunk>
		<CodeChunk name="ToF">
			<![CDATA[
				if(!Core.Player.HasAura(221))
				{
					var result = true;

					if (MovementManager.IsFlying)
					{
						result = await CommonTasks.Land();
					}
					
					if (result && Core.Player.IsMounted)
					{
						Actionmanager.Dismount();
						await Buddy.Coroutines.Coroutine.Sleep(1000);
					}
					
					ff14bot.Managers.Actionmanager.DoAction(221, Core.Player);
					await Buddy.Coroutines.Coroutine.Sleep(2000);
				}
			]]>
		</CodeChunk>
	</CodeChunks>
	<Order>
		<While condition="True">
			<If condition="IsTimeBetween(8,10) or IsTimeBetween(20,22)">
			<!-- TODO: Be less lazy and go to tailfeather? -->
				<If condition="not IsOnMap(397)">
					<TeleportTo name="Falcon's Nest" aetheryteId="71" />
					<MoveTo XYZ="467.8192, 212.5399, 699.0173"/>
				</If>
				<RunCode name="BTN"/>
				<RunCode name="ToF"/>
				<FlightPathTo XYZ="-684.4172, 105.6977, -600.1046" Radius="3.0" Smoothing="0.2" MountId="1" DismountAtDestination="false" />
				<GatherCollectable>
					<GatherSpots>
						<StealthApproachGatherSpot 
							stealthLocation="-672.4095, 99.7216, -595.6871"
							condition="(Core.Player.Heading &gt; 0.4 or Core.Player.Heading == 0.4) and Core.Player.Heading &lt; 2.5"/>
						<StealthApproachGatherSpot
							stealthLocation="-708.3837, 103.3308, -626.0507"
							condition="(Core.Player.Heading &gt; 2.5 or Core.Player.Heading == 2.5) and Core.Player.Heading &lt; 4.8"/>
						<StealthApproachGatherSpot
							stealthLocation="-686.4322, 99.76853, -591.241"/>
					</GatherSpots>
				</GatherCollectable>
				<FlightPathTo XYZ="-684.4172, 105.6977, -600.1046" Radius="3.0" Smoothing="0.2" MountId="1" NavHeight="0.5" DismountAtDestination="false" />
				<LogMessage message="Waiting for now...until we find something better to do."/>
				<WaitWhile condition ="IsTimeBetween(8,10) or IsTimeBetween(20,22)" />
			</If>
			<!-- TODO: have to use cordial or wait for gp... -->
			<If condition="IsTimeBetween(10,12) or IsTimeBetween(22,24)">
				<If condition="not IsOnMap(402)">
					<TeleportTo name="Helix" aetheryteId="74" />
					<MoveTo XYZ="-716.7953, -186.9606, -599.0761"/>
				</If>
				<RunCode name="MIN"/>
				<RunCode name="ToM"/>
				<FlightPathTo XYZ="57.50256, 21.00859, -835.1724" Radius="3.0" Smoothing="0.2" MountId="1" DismountAtDestination="false" />
				<GatherCollectable>
					<GatherSpots>
						<StealthApproachGatherSpot 
							stealthLocation="70.86564, -0.4920825, -858.0936"
							nodeLocation="71.80842, -0.29418, -856.2421"
							condition="(Core.Player.Heading &gt; 1.5 or Core.Player.Heading == 1.5) and Core.Player.Heading &lt; 3.6"/>
						<StealthApproachGatherSpot
							stealthLocation="20.53567, -1.213719, -827.198"
							nodeLocation="24.25113, -0.01400313, -832.7057"
							condition="(Core.Player.Heading &gt; 3.6 or Core.Player.Heading == 3.6) and Core.Player.Heading &lt; 5.7"/>
						<StealthApproachGatherSpot
							stealthLocation="89.52304, -1.827069, -791.0764"
							nodeLocation="79.85004, -0.2340581, -805.6276"/>
					</GatherSpots>
				</GatherCollectable>
				<FlightPathTo XYZ="57.50256, 21.00859, -835.1724" Radius="3.0" Smoothing="0.2" MountId="1" NavHeight="0.5" DismountAtDestination="false" />
				<LogMessage message="Waiting for now...until we find something better to do."/>
				<WaitWhile condition ="IsTimeBetween(10,12) or IsTimeBetween(22,24)" />
			</If>
			<If condition="IsTimeBetween(0,8) or IsTimeBetween(12,20)">
				<LogMessage message="Stop being so lazy!"/>
				<WaitWhile condition="IsTimeBetween(0,8) or IsTimeBetween(12,20)"/>
			</If>
		</While>
	</Order>
</Profile>
 
Looking forward to the update exMatt!

I went through your code and changed it so I can turn on/off the collectible portion so if I want to use it for gathering, I could. Hope that is ok.

View attachment SafeCollectAdamantite.cs

In the profile only this line needs to be changed:
Code:
<SafeCollectAdamantite CollectScrips="false" />

If you want to collect for scrips, change it to true.

Please list where I can donate to you, I at least owe you a drink for this!
 
Looking forward to the update exMatt!

I went through your code and changed it so I can turn on/off the collectible portion so if I want to use it for gathering, I could. Hope that is ok.

View attachment 185768

In the profile only this line needs to be changed:
Code:
<SafeCollectAdamantite CollectScrips="false" />

If you want to collect for scrips, change it to true.

Please list where I can donate to you, I at least owe you a drink for this!

For now, I just have a link on my fishing thread

https://www.thebuddyforum.com/rebor...plugin-fish-v3-0-profiles-support-thread.html

I guess I can start adding things to my sig, seems like the thing to do when you make useful things.


Good job on those edits, they should work fine. I am really excited about finishing this tag. I haven't had any errors in a few hours since my last change and I guess I will have to figure out CWH flying issues some other time.
 
Last edited:
Had the error happen again. It appears the bot is going to where it thinks the node is, not where it actually is. If we're using Becto's image from the beginning of the post, the node spawned at location 3. The bot went to location 1, did not find a node, and subsequently crashed.
 
Back
Top