using Buddy.Coroutines;
using ff14bot;
using ff14bot.AClasses;
using ff14bot.Behavior;
using ff14bot.Enums;
using ff14bot.Helpers;
using ff14bot.Managers;
using ff14bot.Navigation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media;
using TreeSharp;
using Action = TreeSharp.Action;
namespace FishAssist {
public class FishAssistSettings : JsonSettings {
private static FishAssistSettings _settings;
public static FishAssistSettings Instance {
get { return _settings ?? (_settings = new FishAssistSettings()); }
}
public FishAssistSettings() : base(Path.Combine(CharacterSettingsDirectory, "ChocoboTrainerSettings.json")) {
}
private string _MoochList;
[Setting]
[DisplayName("MoochList")]
[Description("Comma separated list of fish to mooch. Set to 'all' to mooch every fish.")]
[DefaultValueAttribute("all")]
public string MoochList {
get { return _MoochList; }
set {
if (_MoochList != value) {
_MoochList = value;
Save();
}
}
}
}
class FishAssist : BotBase {
#region BotBaseStuff
public override string Name {
get {
return EnglishName;
}
}
public override string EnglishName {
get {
return "FishAssist";
}
}
public override bool WantButton {
get { return true; }
}
public override void Start() {
Navigator.PlayerMover = new NullMover();
Navigator.NavigationProvider = new NullProvider();
GamelogManager.MessageRecevied += ReceiveMessage;
Logging.Write("Starting FishAssist");
}
public override void Stop() {
}
public override PulseFlags PulseFlags {
get { return PulseFlags.All; }
}
private SettingsForm settings;
public override void OnButtonPress() {
if (settings == null || settings.IsDisposed)
settings = new SettingsForm();
try {
settings.Show();
settings.Activate();
} catch (ArgumentOutOfRangeException ee) {
Logging.Write("FishAssist Exception Thrown: " + ee.ToString());
}
}
#endregion
private Composite _root;
public override Composite Root {
get {
return _root ?? (_root = CreateBehavior());
}
}
private void ReceiveMessage(object sender, ChatEventArgs e) {
if (e.ChatLogEntry.MessageType == (MessageType)2115 && e.ChatLogEntry.Contents == "The fish sense something amiss. Perhaps it is time to try another location.") {
TreeRoot.Stop();
Logging.Write("The fish sense something amiss. Perhaps it is time to try another location.");
} else if (e.ChatLogEntry.MessageType == (MessageType)2115 && e.ChatLogEntry.Contents.StartsWith("You land a")) {
ProcessLastCatch(e.ChatLogEntry.Contents);
}
}
private String LastFish = "";
private Regex MessageRegex = new Regex(@"^You land a ([^]+)( )? measuring ([\d\.]+) ilms!$");
public void ProcessLastCatch(String message) {
Match match = MessageRegex.Match(message);
if (match.Success) {
LastFish = match.Groups[1].Value;
}
}
private Composite CreateBehavior() {
return new PrioritySelector(
new Decorator(ret => (FishingManager.State == FishingState.Waitin),
new ActionRunCoroutine(ctx => CheckUI())
),
new Decorator(ret => FishingManager.State == FishingState.Reelin || FishingManager.State == FishingState.Quit || FishingManager.State == FishingState.PullPoleIn,
new ActionRunCoroutine(ctx => AnimationWait())
),
new Decorator(ret => FishingManager.CanMooch && MoochLastFish(),
new Action(r => {
FishingManager.Mooch();
})
),
new Decorator(ret => (Actionmanager.CanCast(289, Core.Player) && FishingManager.State == FishingState.None) || FishingManager.State == FishingState.PoleReady,
new ActionRunCoroutine(ctx => Cast())
),
new Decorator(ret => FishingManager.CanHook && FishingManager.State == FishingState.Bite,
new Action(r => {
FishingManager.Hook();
})
)
);
}
private bool MoochLastFish() {
if (FishAssistSettings.Instance.MoochList == "all") {
return true;
}
string[] MoochList = FishAssistSettings.Instance.MoochList.Split(',');
if (MoochList.Any(LastFish.Equals)) {
return true;
}
return false;
}
private async Task<bool> AnimationWait() {
await Coroutine.Wait(5000, () => FishingManager.State != FishingState.Reelin && FishingManager.State != FishingState.Quit && FishingManager.State != FishingState.PullPoleIn);
return true;
}
private async Task<bool> Cast() {
FishingManager.Cast();
if (await Coroutine.Wait(5000, () => FishingManager.State == FishingState.PoleOut || FishingManager.State == FishingState.Waitin)) {
await Coroutine.Wait(5000, () => FishingManager.State == FishingState.Waitin);
return true;
}
TreeRoot.Stop();
Logging.Write("Could not cast. Maybe out of bait?");
return false;
}
private async Task<bool> CheckUI()
{
if (RaptureAtkUnitManager.GetWindowByName("SelectYesNoItem") != null) {
RaptureAtkUnitManager.GetWindowByName("SelectYesNoItem").SendAction(1, 1, 0);
}
await Coroutine.Wait(1000, () => FishingManager.State == FishingState.Waitin);
return true;
}
public override bool RequiresProfile {
get { return false; }
}
}
}