using XFEExtension.NetCore.AutoImplement;
namespace XFEExtension.NetCore.MemoryEditor.Manager;
///
/// 内存条目构建器
///
[CreateImpl]
public abstract class MemoryItemBuilder
{
internal string name = string.Empty;
internal bool hasListener;
internal bool startListen;
internal bool useResolvePointer;
internal Type memoryAddressType = typeof(int);
internal TimeSpan listenerFrequency;
internal nint? staticMemoryAddress;
internal Func? dynamicMemoryAddress;
internal Func? updatableMemoryAddress;
internal string? moduleName;
internal nint baseAddress;
internal nint[] offsets = [];
///
/// 为该地址添加监听器
///
/// 监听频率
/// 是否立即开始监听(监听器会自动创建但是默认不会立即开始监听)
///
public MemoryItemBuilder WithListener(TimeSpan frequency, bool startListen = false)
{
hasListener = true;
listenerFrequency = frequency;
this.startListen = startListen;
return this;
}
///
/// 为该地址添加监听器
///
/// 监听频率,单位为毫秒
/// 是否立即开始监听(监听器会自动创建但是默认不会立即开始监听)
///
public MemoryItemBuilder WithListener(int frequency = 1, bool startListen = false)
{
hasListener = true;
listenerFrequency = TimeSpan.FromMilliseconds(frequency);
this.startListen = startListen;
return this;
}
///
/// 使用静态地址
///
/// 静态地址
///
public MemoryItemBuilder WithStaticMemoryAddress(nint memoryAddress)
{
staticMemoryAddress = memoryAddress;
return this;
}
///
/// 使用动态地址
///
/// 内存地址动态获取方法
///
public MemoryItemBuilder WithDynamicMemoryAddress(Func memoryAddressGetFunc)
{
dynamicMemoryAddress = memoryAddressGetFunc;
return this;
}
///
/// 使用基址指针动态表达式
///
/// 模块名称
/// 模块的地址部分
/// 基址指针偏移部分
///
public MemoryItemBuilder WithResolvePointer(string moduleName, nint baseAddress, params nint[] offsets)
{
useResolvePointer = true;
this.moduleName = moduleName;
this.baseAddress = baseAddress;
this.offsets = offsets;
return this;
}
///
/// 使用可更新内存地址
///
/// 内存地址更新方法
///
public MemoryItemBuilder WithUpdatableMemoryAddress(Func memoryAddressUpdateFunc)
{
updatableMemoryAddress = memoryAddressUpdateFunc;
return this;
}
///
/// 构建内存地址
///
/// 内存地址的数据类型
/// 内存地址自定义标识名
///
public static MemoryItemBuilder Create(string name) => new MemoryItemBuilderImpl { name = name, memoryAddressType = typeof(T) };
}