private bool SetGatherItem(ICollection <GatheringItem> windowItems) { foreach (var item in Items) { var items = windowItems.Where(i => i.IsFilled && !i.IsUnknown).ToArray(); if (item.Id > 0) { GatherItem = items.FirstOrDefault(i => i.ItemData.Id == item.Id && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)); } GatherItem = GatherItem ?? items.FirstOrDefault( i => string.Equals(item.LocalName, i.ItemData.CurrentLocaleName, StringComparison.InvariantCultureIgnoreCase) && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)) ?? items.FirstOrDefault( i => string.Equals(item.Name, i.ItemData.EngName, StringComparison.InvariantCultureIgnoreCase) && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)); if (GatherItem != null) { // We don't need to check null...since it will be null anyway. CollectableItem = item as Collectable; return(true); } } return(false); }
internal void ResetInternal() { interactedWithNode = false; GatherSpot = null; Node = null; GatherItem = null; CollectableItem = null; }
/// <summary> /// Populates the table view. /// </summary> private void PopulateTableView(List <GatheringItem> items) { var view = _view.FindViewById <HorizontalScrollView>(Resource.Id.gathering_scrollview); view.RemoveAllViews(); var table = new TableLayout(_view.Context); table.AddNewRow(GatheringItem.GetRelevantPropertyNames()); items.ForEach(x => table.AddNewRow(x.ToStringArray(), x.Gatherer == Enums.Gatherer.Botanist ? Color.ForestGreen : Color.IndianRed)); view.AddView(table); view.RequestLayout(); }
public static bool TryGatherItem(this GatheringItem gatheringItem) { try { return(gatheringItem.GatherItem()); } catch (NullReferenceException) { Logger.Instance.Warn( "GatherItem became null between resolving it and gathering it due to the Gathering Window closing, moving on."); return(false); } }
public async Task testMine() { var patternFinder = new PatternFinder(Core.Memory); IntPtr AnimationLocked = patternFinder.Find("48 8D 0D ?? ?? ?? ?? BA ?? ?? ?? ?? E8 ?? ?? ?? ?? 80 8B ?? ?? ?? ?? ?? 45 33 C9 44 8B C7 89 BB ?? ?? ?? ?? Add 3 TraceRelative"); var GatherLock = Core.Memory.Read <uint>(AnimationLocked + 0x2A); Log("in Test Gather"); if (GatheringManager.WindowOpen) { GatheringItem items = GatheringManager.GatheringWindowItems.FirstOrDefault(i => i.IsFilled && i.CanGather); if (Core.Me.CurrentGP >= 500) { await Coroutine.Wait(5000, () => ActionManager.CanCast(241, Core.Me)); ActionManager.DoAction(241, Core.Me); await Coroutine.Sleep(2500); } /* * if (Core.Me.CurrentGP >= 250) * { * await Coroutine.Wait(5000, () => ActionManager.CanCast(4587, Core.Me)); * ActionManager.DoAction(4587, Core.Me); * await Coroutine.Sleep(2500); * } */ Log($"Gathering: {items}"); while (GatheringManager.SwingsRemaining > 0 && GatheringManager.WindowOpen) { if (Core.Me.CurrentGP >= 100) { await Coroutine.Wait(5000, () => ActionManager.CanCast(272, Core.Me)); ActionManager.DoAction(272, Core.Me); await Coroutine.Sleep(2500); } await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(AnimationLocked + 0x2A) == 0); items?.GatherItem(); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(AnimationLocked + 0x2A) != 0); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(AnimationLocked + 0x2A) == 0); } } }
public async Task testMine() { //Log("in Test Gather"); if (GatheringManager.WindowOpen) { GatheringItem items = GatheringManager.GatheringWindowItems.Where(i => i.IsFilled && i.CanGather).OrderByDescending(s => s.Stars).FirstOrDefault(); if (Core.Me.CurrentGP >= 500) { await Coroutine.Wait(5000, () => ActionManager.CanCast(241, Core.Me)); ActionManager.DoAction(241, Core.Me); await Coroutine.Sleep(2500); } /* * if (Core.Me.CurrentGP >= 250) * { * await Coroutine.Wait(5000, () => ActionManager.CanCast(4587, Core.Me)); * ActionManager.DoAction(4587, Core.Me); * await Coroutine.Sleep(2500); * } */ Log($"Gathering: {items}"); while (GatheringManager.SwingsRemaining > 0 && GatheringManager.WindowOpen) { if (Core.Me.CurrentGP >= 100) { await Coroutine.Wait(5000, () => ActionManager.CanCast(272, Core.Me)); ActionManager.DoAction(272, Core.Me); await Coroutine.Sleep(2500); } await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(Offsets.Conditions + 0x2A) == 0); items?.GatherItem(); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(Offsets.Conditions + 0x2A) != 0); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(Offsets.Conditions + 0x2A) == 0); } } }
public static bool IsUnknownChance(this GatheringItem gatheringItem) { if (gatheringItem.IsUnknown || gatheringItem.Chance == 25) { return(true); } if (!gatheringItem.IsFilled && gatheringItem.Unk2 != byte.MaxValue && gatheringItem.Unk1 == uint.MaxValue) { if (gatheringItem.Chance <= 0) { Logger.Instance.Warn( "Found unknown item in slot {0}, but it seems we don't have enough gathering skill. Check the node for more information. Gathering: {1}", gatheringItem.SlotIndex + 1, Core.Player.Stats.Gathering); return(false); } Logger.Instance.Info("Found unknown item in slot {0}", gatheringItem.SlotIndex + 1); return(true); } var lastSpellId = ActionManager.LastSpellId; if (gatheringItem.Chance == 30 && lastSpellId == Abilities.Map[Core.Player.CurrentJob][Ability.IncreaseGatherChance5]) { return(true); } if (gatheringItem.Chance == 40 && lastSpellId == Abilities.Map[Core.Player.CurrentJob][Ability.IncreaseGatherChance15]) { return(true); } if (gatheringItem.Chance == 75 && lastSpellId == Abilities.Map[Core.Player.CurrentJob][Ability.IncreaseGatherChance50]) { return(true); } return(false); }
public async Task testGather() { var GatherLock = Core.Memory.Read <uint>(Offsets.Conditions + 0x2A); Log("in Test Gather"); if (GatheringManager.WindowOpen) { GatheringItem items = GatheringManager.GatheringWindowItems.FirstOrDefault(i => i.IsFilled && i.CanGather); Log($"Gathering: {items}"); while (GatheringManager.SwingsRemaining > 0) { items.GatherItem(); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(Offsets.Conditions + 0x2A) != 0); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(Offsets.Conditions + 0x2A) == 0); } } }
public async Task testGather() { var patternFinder = new PatternFinder(Core.Memory); IntPtr AnimationLocked = patternFinder.Find("48 8D 0D ?? ?? ?? ?? BA ?? ?? ?? ?? E8 ?? ?? ?? ?? 80 8B ?? ?? ?? ?? ?? 45 33 C9 44 8B C7 89 BB ?? ?? ?? ?? Add 3 TraceRelative"); var GatherLock = Core.Memory.Read <uint>(AnimationLocked + 0x2A); Log("in Test Gather"); if (GatheringManager.WindowOpen) { GatheringItem items = GatheringManager.GatheringWindowItems.FirstOrDefault(i => i.IsFilled && i.CanGather); Log($"Gathering: {items}"); while (GatheringManager.SwingsRemaining > 0) { items.GatherItem(); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(AnimationLocked + 0x2A) != 0); await Coroutine.Wait(20000, () => Core.Memory.Read <uint>(AnimationLocked + 0x2A) == 0); } } }
internal async Task <bool> ResolveGatherItem() { if (!GatheringManager.WindowOpen) { return(false); } var previousGatherItem = GatherItem; GatherItemIsFallback = false; GatherItem = null; CollectableItem = null; var windowItems = GatheringManager.GatheringWindowItems.ToArray(); // TODO: move method to common so we use it on fish too if (InventoryItemCount() >= 140) { if (Items.Count > 0) { if ( SetGatherItem( windowItems.OrderByDescending(i => i.SlotIndex).Where(i => i.IsFilled && !i.IsUnknown && i.ItemId < 20).ToArray())) { return(true); } } GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20); if (GatherItem != null) { return(true); } Logger.Warn(Localization.Localization.ExGather_FullInventory); return(false); } if (DiscoverUnknowns) { var items = new[] { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U }.Select(GatheringManager.GetGatheringItemByIndex); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return(true); } } if (Items.Count > 0) { if (SetGatherItem(windowItems)) { return(true); } } if (Slot > -1 && Slot < 8) { GatherItem = GatheringManager.GetGatheringItemByIndex((uint)Slot); } if (GatherItem == null && (!AlwaysGather || GatherStrategy == GatherStrategy.TouchAndGo)) { Poi.Clear(Localization.Localization.ExGather_SkipNode); await CloseGatheringWindow(); return(false); } if (GatherItem != null) { return(true); } GatherItemIsFallback = true; GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20) // Try to gather cluster/crystal/shard ?? windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && !i.ItemData.Unique && !i.ItemData.Untradeable && i.ItemData.ItemCount() > 0) // Try to collect items you have that stack ?? windowItems.Where(i => i.Amount > 0 && !i.ItemData.Unique && !i.ItemData.Untradeable) .OrderByDescending(i => i.SlotIndex) .FirstOrDefault(); // Take last item that is not unique or untradeable // Seems we only have unknowns. if (GatherItem == null) { var items = new[] { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U }.Select(GatheringManager.GetGatheringItemByIndex).ToArray(); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return(true); } Logger.Warn(Localization.Localization.ExGather_NothingToGather); return(false); } if (previousGatherItem == null || previousGatherItem.ItemId != GatherItem.ItemId) { Logger.Info(Localization.Localization.ExGather_NothingToGather2 + GatherItem.ItemData + Localization.Localization.ExGather_NothingToGather3); } return(true); }
private bool SetGatherItemByItemName(ICollection<GatheringItem> windowItems) { foreach (var itemName in ItemNames) { GatherItem = windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && string.Equals(itemName, i.ItemData.EnglishName, StringComparison.InvariantCultureIgnoreCase)); if (GatherItem != null && (!GatherItem.ItemData.Unique || GatherItem.ItemData.ItemCount() == 0)) { return true; } } return false; }
internal async Task<bool> ResolveGatherItem() { if (!GatheringManager.WindowOpen) { return false; } var previousGatherItem = GatherItem; GatherItemIsFallback = false; GatherItem = null; CollectableItem = null; var windowItems = GatheringManager.GatheringWindowItems.ToArray(); // TODO: move method to common so we use it on fish too if (InventoryItemCount() >= 100) { if (ItemNames != null && ItemNames.Count > 0) { if ( SetGatherItemByItemName( windowItems.OrderByDescending(i => i.SlotIndex).Where(i => i.IsFilled && !i.IsUnknown && i.ItemId < 20).ToArray())) { return true; } } GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20); if (GatherItem != null) { return true; } Logger.Warn("Inventory is full and no shards/crystals/clusters to gather. Gathering complete."); return false; } if (DiscoverUnknowns) { var items = new[] { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U }.Select(GatheringManager.GetGatheringItemByIndex).ToArray(); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return true; } } if (Collectables != null && Collectables.Count > 0) { foreach (var collectable in Collectables) { GatherItem = windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && string.Equals(collectable.Name, i.ItemData.EnglishName, StringComparison.InvariantCultureIgnoreCase)); if (GatherItem != null) { CollectableItem = collectable; return true; } } } if (ItemNames != null && ItemNames.Count > 0) { if (SetGatherItemByItemName(windowItems)) { return true; } } if (Slot > -1 && Slot < 8) { GatherItem = GatheringManager.GetGatheringItemByIndex((uint)Slot); } if (GatherItem == null && (!AlwaysGather || GatherStrategy == GatherStrategy.TouchAndGo)) { Poi.Clear("Skipping this node, no items we want to gather."); await CloseGatheringWindow(); return false; } if (GatherItem != null) { return true; } GatherItemIsFallback = true; GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20) // Try to gather cluster/crystal/shard ?? windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && !i.ItemData.Unique && !i.ItemData.Untradeable && i.ItemData.ItemCount() > 0) // Try to collect items you have that stack ?? windowItems.Where(i => i.Amount > 0 && !i.ItemData.Unique && !i.ItemData.Untradeable) .OrderByDescending(i => i.SlotIndex) .FirstOrDefault(); // Take last item that is not unique or untradeable // Seems we only have unknowns. if (GatherItem == null) { var items = new[] { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U }.Select(GatheringManager.GetGatheringItemByIndex).ToArray(); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return true; } Logger.Warn("Unable to find an item to gather, moving on."); return false; } if (previousGatherItem == null || previousGatherItem.ItemId != GatherItem.ItemId) { Logger.Info("could not find item by slot or name, gathering " + GatherItem.ItemData + " instead."); } return true; }
private bool SetGatherItemByItemName(ICollection<GatheringItem> windowItems) { foreach (var item in Items) { GatherItem = windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && string.Equals(item.Name, i.ItemData.EnglishName, StringComparison.InvariantCultureIgnoreCase) && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)); if (GatherItem != null) { // We don't need to check null...since it will be null anyway. CollectableItem = item as Collectable; return true; } } return false; }
internal async Task<bool> ResolveGatherItem() { if (!GatheringManager.WindowOpen) { return false; } var previousGatherItem = GatherItem; GatherItemIsFallback = false; GatherItem = null; CollectableItem = null; var windowItems = GatheringManager.GatheringWindowItems.ToArray(); // TODO: move method to common so we use it on fish too if (InventoryItemCount() >= 100) { if (Items.Count > 0) { if ( SetGatherItem( windowItems.OrderByDescending(i => i.SlotIndex).Where(i => i.IsFilled && !i.IsUnknown && i.ItemId < 20).ToArray())) { return true; } } GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20); if (GatherItem != null) { return true; } Logger.Warn(Localization.Localization.ExGather_FullInventory); return false; } if (DiscoverUnknowns) { var items = new[] { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U }.Select(GatheringManager.GetGatheringItemByIndex); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return true; } } if (Items.Count > 0) { if (SetGatherItem(windowItems)) { return true; } } if (Slot > -1 && Slot < 8) { GatherItem = GatheringManager.GetGatheringItemByIndex((uint) Slot); } if (GatherItem == null && (!AlwaysGather || GatherStrategy == GatherStrategy.TouchAndGo)) { Poi.Clear(Localization.Localization.ExGather_SkipNode); await CloseGatheringWindow(); return false; } if (GatherItem != null) { return true; } GatherItemIsFallback = true; GatherItem = windowItems.Where(i => i.IsFilled && !i.IsUnknown) .OrderByDescending(i => i.ItemId) .FirstOrDefault(i => i.ItemId < 20) // Try to gather cluster/crystal/shard ?? windowItems.FirstOrDefault( i => i.IsFilled && !i.IsUnknown && !i.ItemData.Unique && !i.ItemData.Untradeable && i.ItemData.ItemCount() > 0) // Try to collect items you have that stack ?? windowItems.Where(i => i.Amount > 0 && !i.ItemData.Unique && !i.ItemData.Untradeable) .OrderByDescending(i => i.SlotIndex) .FirstOrDefault(); // Take last item that is not unique or untradeable // Seems we only have unknowns. if (GatherItem == null) { var items = new[] {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U}.Select(GatheringManager.GetGatheringItemByIndex).ToArray(); GatherItem = items.FirstOrDefault(i => i.IsUnknownChance() && i.Amount > 0); if (GatherItem != null) { return true; } Logger.Warn(Localization.Localization.ExGather_NothingToGather); return false; } if (previousGatherItem == null || previousGatherItem.ItemId != GatherItem.ItemId) { Logger.Info(Localization.Localization.ExGather_NothingToGather2 + GatherItem.ItemData + Localization.Localization.ExGather_NothingToGather3); } return true; }
private bool SetGatherItem(ICollection<GatheringItem> windowItems) { foreach (var item in Items) { var items = windowItems.Where(i => i.IsFilled && !i.IsUnknown).ToArray(); if (item.Id > 0) { GatherItem = items.FirstOrDefault(i => i.ItemData.Id == item.Id && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)); } GatherItem = GatherItem ?? items.FirstOrDefault( i => string.Equals(item.LocalName, i.ItemData.CurrentLocaleName, StringComparison.InvariantCultureIgnoreCase) && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)) ?? items.FirstOrDefault( i => string.Equals(item.Name, i.ItemData.EngName, StringComparison.InvariantCultureIgnoreCase) && (!i.ItemData.Unique || i.ItemData.ItemCount() == 0)); if (GatherItem != null) { // We don't need to check null...since it will be null anyway. CollectableItem = item as Collectable; return true; } } return false; }