qstbak/Questionable/Questionable.Controller.CombatModules/RotationSolverRebornModule.cs
2026-08-17 20:29:32 +10:00

116 lines
2.6 KiB
C#

using System;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Ipc.Exceptions;
using Microsoft.Extensions.Logging;
namespace Questionable.Controller.CombatModules;
internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable
{
private const byte ModeOff = 0;
private const byte ModeHenched = 4;
private readonly ILogger<RotationSolverRebornModule> _logger;
private readonly Configuration _configuration;
private readonly ICallGateSubscriber<string, object> _test;
private readonly ICallGateSubscriber<byte, object> _changeOperationMode;
private readonly ICallGateSubscriber<string, object, object> _setConfig;
public RotationSolverRebornModule(ILogger<RotationSolverRebornModule> logger, IDalamudPluginInterface pluginInterface, Configuration configuration)
{
_logger = logger;
_configuration = configuration;
_test = pluginInterface.GetIpcSubscriber<string, object>("RotationSolverReborn.Test");
_changeOperationMode = pluginInterface.GetIpcSubscriber<byte, object>("RotationSolverReborn.ChangeOperatingMode");
_setConfig = pluginInterface.GetIpcSubscriber<string, object, object>("RotationSolverReborn.SetConfig");
}
public bool IsAvailable()
{
if (_configuration.General.CombatModule != Configuration.ECombatModule.RotationSolverReborn)
{
return false;
}
try
{
_test.InvokeAction("Validate RSR is callable from Questionable");
return true;
}
catch (IpcError)
{
return false;
}
}
public bool CanHandleFight(CombatController.CombatData combatData)
{
return IsAvailable();
}
public bool Start(CombatController.CombatData combatData)
{
try
{
_changeOperationMode.InvokeAction(4);
SetConfig("AutoOffAfterCombat", false);
SetConfig("HealPartyMembers", true);
SetConfig("HostileType", 1);
return true;
}
catch (IpcError exception)
{
_logger.LogWarning(exception, "Could not start combat");
return false;
}
}
public bool Stop()
{
if (!_changeOperationMode.HasAction)
{
return true;
}
try
{
_changeOperationMode.InvokeAction(0);
return true;
}
catch (IpcError exception)
{
_logger.LogWarning(exception, "Could not turn off combat");
return false;
}
}
public void Update(IGameObject gameObject)
{
}
public bool CanAttack(IBattleNpc target)
{
return true;
}
public void Dispose()
{
}
private void SetConfig(string key, object value)
{
try
{
_setConfig.InvokeAction(key, value);
}
catch (IpcError exception)
{
_logger.LogDebug(exception, "RSR SetConfig {Key} failed", key);
}
}
}