Так что я делаю программу, которая предоставляет создателям игры много инструментов для повышения уровня (путем настройки значений игры с использованием передовых алгоритмов с учетом указателей на эти значения), а для ярлыка я создал методы, которые устанавливают/извлекают значения из указатели ввода. Однако игра имеет переменные Int32, Float и Boolean, поэтому мне нужно 3 разных метода для каждого типа данных для одного и того же количества указателей, и у меня также есть 5 перегрузок из каждого, что дает 15 различных методов для извлечения значений из указателей. Вот методы (без кода):Методы общего типа или заданные типы при возврате разных значений типа данных с тем же алгоритмом?
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0)
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1)
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2)
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3)
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3, IntPtr offset4)
public static float GetFloatFromPointers(IntPtr baseAddress, IntPtr offset0)
public static float GetFloatFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1)
public static float GetFloatFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2)
public static float GetFloatFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3)
public static float GetFloatFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3, IntPtr offset4)
public static bool GetBoolFromPointers(IntPtr baseAddress, IntPtr offset0)
public static bool GetBoolFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1)
public static bool GetBoolFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2)
public static bool GetBoolFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3)
public static bool GetBoolFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3, IntPtr offset4)
Теперь я не спрашиваю, почему некоторые из них не работают; они действительно работают нормально (я думаю), но я также думал о возможности создания универсального метода обо всех разных типах, но я действительно не знаю, как и я не уверен, что создание таких методов будет полезно вообще ...
Вот код для метода GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3, IntPtr offset4)
:
public static int GetIntFromPointers(IntPtr baseAddress, IntPtr offset0, IntPtr offset1, IntPtr offset2, IntPtr offset3, IntPtr offset4)
{
IntPtr baseAddressValue = new IntPtr(BitConverter.ToInt32(MemoryStuff.ReadMemory((int)baseAddress, 4, (int)processHandle), 0));
IntPtr offset0Value = new IntPtr(BitConverter.ToInt32(MemoryStuff.ReadMemory((int)baseAddressValue + (int)offset0, 4, (int)processHandle), 0));
IntPtr offset1Value = new IntPtr(BitConverter.ToInt32(MemoryStuff.ReadMemory((int)offset0Value + (int)offset1, 4, (int)processHandle), 0));
IntPtr offset2Value = new IntPtr(BitConverter.ToInt32(MemoryStuff.ReadMemory((int)offset1Value + (int)offset2, 4, (int)processHandle), 0));
IntPtr offset3Value = new IntPtr(BitConverter.ToInt32(MemoryStuff.ReadMemory((int)offset2Value + (int)offset3, 4, (int)processHandle), 0));
int value = BitConverter.ToInt32(MemoryStuff.ReadMemory((int)offset3Value + (int)offset4, 4, (int)processHandle), 0);
return value;
}
И в случае, если вам интересно, что это MemoryStuff.ReadMemory
вещь, вот код для этого один тоже:
[DllImport("Kernel32.dll", SetLastError = true)]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, ref uint lpNumberOfBytesRead);
public static byte[] ReadMemory(int address, int processSize, int processHandle)
{
byte[] buffer = new byte[processSize];
uint sth = 0;
ReadProcessMemory(new IntPtr(processHandle), new IntPtr(address), buffer, (uint)processSize, ref sth);
return buffer;
}
Это не так просто, потому что в зависимости от типа я должен изменить длину адреса, чтобы прочитать значение, поэтому я в основном спрашиваю, есть ли способ сделать условие if if else с типом 'T', являющимся параметром условия. – AlFas
Только что обновлено с возможностью использования func ... Это лучше? – Braydie
Вы также можете использовать func для передачи того, какой метод вызывать на «BitConverter» – Braydie