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 _logger; private readonly Configuration _configuration; private readonly ICallGateSubscriber _test; private readonly ICallGateSubscriber _changeOperationMode; private readonly ICallGateSubscriber _setConfig; public RotationSolverRebornModule(ILogger logger, IDalamudPluginInterface pluginInterface, Configuration configuration) { _logger = logger; _configuration = configuration; _test = pluginInterface.GetIpcSubscriber("RotationSolverReborn.Test"); _changeOperationMode = pluginInterface.GetIpcSubscriber("RotationSolverReborn.ChangeOperatingMode"); _setConfig = pluginInterface.GetIpcSubscriber("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); } } }