using Nocturnis.Communicators; using Nocturnis.Enigmos.Modules; using TabulaSmaragdina; using TabulaSmaragdina.Constants; using TabulaSmaragdina.Controls; namespace Enigmos.Modules.Extensions; public static class CommunicateModuleExtension { public static bool Paired(this ICommunicateModule module) => module.PairedCommunicator != null; /// /// Determine if the module can be paired with given communicator /// public static bool IsMatch(this ICommunicateModule module, IBaseCommunicator communicator) => module.CommunicationDataType == communicator.CommunicationDataType && GlobalProvider.EnigmosProvider.CommunicationDirectionCompatible( module.CommunicationDirection, communicator.CommunicationDirection ); /// /// Pair the module with given communicator /// public static void Pair(this ICommunicateModule module, IBaseCommunicator communicator) { if(module.Paired()) module.Unpair(); module.PairedCommunicator = communicator; communicator.PairedModule = module; } /// /// Unpair the module with its paired communicator /// public static void Unpair(this ICommunicateModule module) { if (!module.Paired()) return; module.PairedCommunicator.PairedModule = null; module.PairedCommunicator = null; } public static void SendData(this ICommunicateModule module) { if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Receive) return; module.PairedCommunicator.DataBuffer.Assign(module.DataBuffer, module.CommunicationDataType); } public static void ReceiveData(this ICommunicateModule module) { if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Send) return; module.DataBuffer.Assign(module.PairedCommunicator.DataBuffer, module.CommunicationDataType); } public static IBaseCommunicator[] CompatibleCommunicators(this ICommunicateModule module) => CreatureControl.Instance.CurrentCharacter!.DashboardTab.AllCommunicators .Where(module.IsMatch) .ToArray(); }