Add chat message when turn in is finished

pull/3/head v4.7
Liza 2024-05-09 01:08:01 +02:00
parent 2ad03c86ef
commit 6a76b259bb
Signed by: liza
GPG Key ID: 7199F8D727D55F67
6 changed files with 96 additions and 27 deletions

View File

@ -15,6 +15,7 @@ internal sealed class Configuration : IPluginConfiguration
public int ReservedSealCount { get; set; } public int ReservedSealCount { get; set; }
public bool ReserveDifferentSealCountAtMaxRank { get; set; } public bool ReserveDifferentSealCountAtMaxRank { get; set; }
public int ReservedSealCountAtMaxRank { get; set; } public int ReservedSealCountAtMaxRank { get; set; }
public XivChatType ChatType { get; set; } = XivChatType.Debug;
public int PauseAtRank { get; set; } public int PauseAtRank { get; set; }
public EBehaviorOnOtherWorld BehaviorOnOtherWorld { get; set; } = EBehaviorOnOtherWorld.Warning; public EBehaviorOnOtherWorld BehaviorOnOtherWorld { get; set; } = EBehaviorOnOtherWorld.Warning;
public bool DisableFrameLimiter { get; set; } = true; public bool DisableFrameLimiter { get; set; } = true;

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<Version>4.6</Version> <Version>4.7</Version>
<LangVersion>12</LangVersion> <LangVersion>12</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

View File

@ -82,7 +82,7 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
var itemCache = new ItemCache(dataManager); var itemCache = new ItemCache(dataManager);
_exchangeHandler = new ExchangeHandler(this, _gameFunctions, targetManager, _gameGui, _chatGui, _pluginLog); _exchangeHandler = new ExchangeHandler(this, _gameFunctions, targetManager, _gameGui, _chatGui, _pluginLog);
_supplyHandler = new SupplyHandler(this, _gameFunctions, targetManager, _gameGui, _chatGui, itemCache, _supplyHandler = new SupplyHandler(this, _gameFunctions, targetManager, _gameGui, itemCache,
_pluginLog); _pluginLog);
_configWindow = new ConfigWindow(_pluginInterface, this, _configuration, _gcRewardsCache, _clientState, _configWindow = new ConfigWindow(_pluginInterface, this, _configuration, _gcRewardsCache, _clientState,
@ -132,7 +132,12 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
{ {
_turnInWindow.State = false; _turnInWindow.State = false;
_pluginLog.Information($"Pausing GC delivery, FC reached rank {rank}"); _pluginLog.Information($"Pausing GC delivery, FC reached rank {rank}");
_chatGui.Print($"Pausing Deliveroo, your FC reached rank {rank}."); DeliveryResult = new DeliveryResult
{
Message = new SeStringBuilder()
.Append($"Pausing Deliveroo, your FC reached rank {rank}.")
.Build(),
};
return; return;
} }
} }
@ -155,8 +160,9 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
} }
internal DateTime ContinueAt { private get; set; } = DateTime.MinValue; internal DateTime ContinueAt { private get; set; } = DateTime.MinValue;
internal List<PurchaseItemRequest> ItemsToPurchaseNow { get; set; } = new(); internal List<PurchaseItemRequest> ItemsToPurchaseNow { get; private set; } = new();
internal int LastTurnInListSize { get; set; } = int.MaxValue; internal int LastTurnInListSize { get; set; } = int.MaxValue;
internal DeliveryResult? DeliveryResult { get; set; }
internal bool TurnInState internal bool TurnInState
{ {
@ -234,11 +240,7 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
{ {
_turnInWindow.IsOpen = false; _turnInWindow.IsOpen = false;
_turnInWindow.State = false; _turnInWindow.State = false;
if (CurrentStage != Stage.Stopped) StopTurnIn();
{
_externalPluginHandler.Restore();
CurrentStage = Stage.Stopped;
}
} }
else if (DateTime.Now > ContinueAt) else if (DateTime.Now > ContinueAt)
{ {
@ -247,18 +249,14 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
if (!_turnInWindow.State) if (!_turnInWindow.State)
{ {
if (CurrentStage != Stage.Stopped) StopTurnIn();
{
_externalPluginHandler.Restore();
CurrentStage = Stage.Stopped;
}
return; return;
} }
else if (_turnInWindow.State && CurrentStage == Stage.Stopped) else if (_turnInWindow.State && CurrentStage == Stage.Stopped)
{ {
CurrentStage = Stage.TargetPersonnelOfficer; CurrentStage = Stage.TargetPersonnelOfficer;
ItemsToPurchaseNow = _turnInWindow.SelectedItems; ItemsToPurchaseNow = _turnInWindow.SelectedItems;
DeliveryResult = new();
_supplyHandler.ResetTurnInErrorHandling(); _supplyHandler.ResetTurnInErrorHandling();
if (ItemsToPurchaseNow.Count > 0) if (ItemsToPurchaseNow.Count > 0)
{ {
@ -351,10 +349,9 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
break; break;
case Stage.RequestStop: case Stage.RequestStop:
_externalPluginHandler.Restore(); StopTurnIn();
CurrentStage = Stage.Stopped;
break; break;
case Stage.Stopped: case Stage.Stopped:
break; break;
@ -365,6 +362,51 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
} }
} }
private void StopTurnIn()
{
if (CurrentStage != Stage.Stopped)
{
_externalPluginHandler.Restore();
CurrentStage = Stage.Stopped;
var text = DeliveryResult?.Message ?? "Delivery completed.";
var message = _configuration.ChatType switch
{
XivChatType.Say
or XivChatType.Shout
or XivChatType.TellOutgoing
or XivChatType.TellIncoming
or XivChatType.Party
or XivChatType.Alliance
or (>= XivChatType.Ls1 and <= XivChatType.Ls8)
or XivChatType.FreeCompany
or XivChatType.NoviceNetwork
or XivChatType.Yell
or XivChatType.CrossParty
or XivChatType.PvPTeam
or XivChatType.CrossLinkShell1
or XivChatType.NPCDialogue
or XivChatType.NPCDialogueAnnouncements
or (>= XivChatType.CrossLinkShell2 and <= XivChatType.CrossLinkShell8)
=> new XivChatEntry
{
Message = text,
Type = _configuration.ChatType,
Name = new SeStringBuilder().AddUiForeground("Deliveroo", 52).Build(),
},
_ => new XivChatEntry
{
Message = new SeStringBuilder().AddUiForeground("[Deliveroo] ", 52)
.Append(text)
.Build(),
Type = _configuration.ChatType,
}
};
_chatGui.Print(message);
DeliveryResult = null;
}
}
public void Dispose() public void Dispose()
{ {

View File

@ -0,0 +1,9 @@
using Dalamud.Game.Text.SeStringHandling;
namespace Deliveroo
{
internal sealed class DeliveryResult
{
public SeString? Message { get; init; }
}
}

View File

@ -9,11 +9,10 @@ using Deliveroo.GameData;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using LLib;
using LLib.GameUI; using LLib.GameUI;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType; using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
namespace Deliveroo; namespace Deliveroo.Handlers;
internal sealed class SupplyHandler internal sealed class SupplyHandler
{ {
@ -21,20 +20,18 @@ internal sealed class SupplyHandler
private readonly GameFunctions _gameFunctions; private readonly GameFunctions _gameFunctions;
private readonly ITargetManager _targetManager; private readonly ITargetManager _targetManager;
private readonly IGameGui _gameGui; private readonly IGameGui _gameGui;
private readonly IChatGui _chatGui;
private readonly ItemCache _itemCache; private readonly ItemCache _itemCache;
private readonly IPluginLog _pluginLog; private readonly IPluginLog _pluginLog;
private uint _turnInErrors; private uint _turnInErrors;
public SupplyHandler(DeliverooPlugin plugin, GameFunctions gameFunctions, ITargetManager targetManager, public SupplyHandler(DeliverooPlugin plugin, GameFunctions gameFunctions, ITargetManager targetManager,
IGameGui gameGui, IChatGui chatGui, ItemCache itemCache, IPluginLog pluginLog) IGameGui gameGui, ItemCache itemCache, IPluginLog pluginLog)
{ {
_plugin = plugin; _plugin = plugin;
_gameFunctions = gameFunctions; _gameFunctions = gameFunctions;
_targetManager = targetManager; _targetManager = targetManager;
_gameGui = gameGui; _gameGui = gameGui;
_chatGui = chatGui;
_itemCache = itemCache; _itemCache = itemCache;
_pluginLog = pluginLog; _pluginLog = pluginLog;
} }
@ -210,10 +207,14 @@ internal sealed class SupplyHandler
if (itemName != null && _itemCache.GetItemIdFromItemName(itemName) if (itemName != null && _itemCache.GetItemIdFromItemName(itemName)
.Any(itemId => InternalConfiguration.QuickVentureExclusiveItems.Contains(itemId))) .Any(itemId => InternalConfiguration.QuickVentureExclusiveItems.Contains(itemId)))
{ {
_chatGui.Print(new SeStringBuilder().Append("Won't turn in ") _plugin.DeliveryResult = new DeliveryResult
.AddItemLink(_itemCache.GetItemIdFromItemName(itemName).First()) {
.Append(", as it can only be obtained through Quick Ventures.") Message = new SeStringBuilder()
.Build()); .Append("Won't turn in ")
.AddItemLink(_itemCache.GetItemIdFromItemName(itemName).First())
.Append(", as it can only be obtained through Quick Ventures.")
.Build(),
};
addonSupplyReward->AtkUnitBase.FireCallbackInt(1); addonSupplyReward->AtkUnitBase.FireCallbackInt(1);
_plugin.CurrentStage = Stage.CloseGcSupplyWindowThenStop; _plugin.CurrentStage = Stage.CloseGcSupplyWindowThenStop;

View File

@ -9,6 +9,7 @@ using Dalamud.Interface.Internal;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility;
using Deliveroo.GameData; using Deliveroo.GameData;
using ImGuiNET; using ImGuiNET;
using LLib; using LLib;
@ -359,6 +360,21 @@ internal sealed class ConfigWindow : LWindow
ImGui.EndDisabled(); ImGui.EndDisabled();
ImGui.SetNextItemWidth(ImGuiHelpers.GlobalScale * 120);
var xivChatTypes = Enum.GetValues<XivChatType>()
.Where(x => x != XivChatType.StandardEmote)
.ToArray();
var selectedChatType = Array.IndexOf(xivChatTypes, _configuration.ChatType);
string[] chatTypeNames = xivChatTypes
.Select(t => t.GetAttribute<XivChatTypeInfoAttribute>()?.FancyName ?? t.ToString())
.ToArray();
if (ImGui.Combo("Chat channel for status updates", ref selectedChatType, chatTypeNames,
chatTypeNames.Length))
{
_configuration.ChatType = xivChatTypes[selectedChatType];
Save();
}
ImGui.SetNextItemWidth(ImGuiHelpers.GlobalScale * 120); ImGui.SetNextItemWidth(ImGuiHelpers.GlobalScale * 120);
List<(int Rank, string Name)> rankUpComboValues = Enumerable.Range(1, 30) List<(int Rank, string Name)> rankUpComboValues = Enumerable.Range(1, 30)
.Select(x => x == 1 ? (0, "---") : (x, $"Rank {x}")) .Select(x => x == 1 ? (0, "---") : (x, $"Rank {x}"))