Files
Nocturnis/src/Enigmos/Modules/ECommunicateModule.cs
2024-07-03 12:20:08 +08:00

63 lines
2.3 KiB
C#

using Nocturnis.Communicators;
using Nocturnis.GlobalManagement.Constants;
using Nocturnis.GlobalManagement.Controls;
using Nocturnis.GlobalManagement.Providers;
namespace Nocturnis.Enigmos.Modules;
public static class ECommunicateModule
{
public static bool Paired(this ICommunicateModule module) => module.PairedCommunicator != null;
/// <summary>
/// Determine if the module can be paired with given communicator
/// </summary>
public static bool IsMatch(this ICommunicateModule module, IBaseCommunicator communicator) =>
module.CommunicationDataType == communicator.CommunicationDataType &&
GlobalProvider.EnigmosProvider!.CommunicationDirectionCompatible(
module.CommunicationDirection,
communicator.CommunicationDirection
);
/// <summary>
/// Pair the module with given communicator
/// </summary>
public static void Pair(this ICommunicateModule module, IBaseCommunicator communicator)
{
if(module.Paired())
module.Unpair();
module.PairedCommunicator = communicator;
communicator.PairedModule = module;
}
/// <summary>
/// Unpair the module with its paired communicator
/// </summary>
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();
}