private static void WriteMemoryPARAM(PARAM param, int paramOffset, SoulsMemoryHandler memoryHandler) { var BasePtr = memoryHandler.GetParamPtrDS3(paramOffset); var BaseDataPtr = memoryHandler.GetToRowPtrDS3(paramOffset); var RowCount = memoryHandler.GetRowCountDS3(paramOffset); IntPtr DataSectionPtr; int RowId = 0; int rowPtr = 0; for (int i = 0; i < RowCount; i++) { memoryHandler.ReadProcessMemory(BaseDataPtr, ref RowId); memoryHandler.ReadProcessMemory(BaseDataPtr + 0x8, ref rowPtr); DataSectionPtr = IntPtr.Add(BasePtr, rowPtr); BaseDataPtr += 0x18; PARAM.Row row = param[RowId]; if (row != null) { WriteMemoryRow(row, DataSectionPtr, memoryHandler); } } }
public static void ReloadMemoryParamsDS3() { var processArray = Process.GetProcessesByName("DarkSoulsIII"); if (processArray.Any()) { SoulsMemoryHandler memoryHandler = new SoulsMemoryHandler(processArray.First()); List <Thread> threads = new List <Thread>(); foreach (var(paramFileName, param) in ParamBank.Params) { if (SoulsMemoryHandler.paramOffsetsDS3.ContainsKey(paramFileName)) { threads.Add(new Thread(() => WriteMemoryPARAM(param, SoulsMemoryHandler.paramOffsetsDS3[paramFileName], memoryHandler))); } } foreach (var thread in threads) { thread.Start(); } foreach (var thread in threads) { thread.Join(); } memoryHandler.Terminate(); } }
private static void WriteMemoryRow(PARAM.Row row, IntPtr RowDataSectionPtr, SoulsMemoryHandler memoryHandler) { int offset = 0; int bitFieldPos = 0; BitArray bits = null; foreach (var cell in row.Cells) { offset += WriteMemoryCell(cell, RowDataSectionPtr + offset, ref bitFieldPos, ref bits, memoryHandler); } }
public static void GiveItemDS3(List <PARAM.Row> rowsToGib, string studioParamType, int itemQuantityReceived, int upgradeLevelItemToGive = 0) { if (rowsToGib.Any()) { var processArray = Process.GetProcessesByName("DarkSoulsIII"); if (processArray.Any()) { SoulsMemoryHandler memoryHandler = new SoulsMemoryHandler(processArray.First()); memoryHandler.PlayerItemGiveDS3(rowsToGib, studioParamType, itemQuantityReceived, -1, upgradeLevelItemToGive); memoryHandler.Terminate(); } } }
private static int WriteMemoryCell(PARAM.Cell cell, IntPtr CellDataPtr, ref int bitFieldPos, ref BitArray bits, SoulsMemoryHandler memoryHandler) { PARAMDEF.DefType displayType = cell.Def.DisplayType; // If this can be simplified, that would be ideal. Currently we have to reconcile DefType, a numerical size in bits, and the Type used for the bitField array if (cell.Def.BitSize != -1) { if (displayType == SoulsFormats.PARAMDEF.DefType.u8) { if (bitFieldPos == 0) { bits = new BitArray(8); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 8) { byte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); byte[] bitField = new byte[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; byte bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(byte)); } return(0); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u16) { if (bitFieldPos == 0) { bits = new BitArray(16); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 16) { ushort valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); ushort[] bitField = new ushort[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; ushort bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(UInt16)); } return(0); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u32) { if (bitFieldPos == 0) { bits = new BitArray(32); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 32) { uint valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); uint[] bitField = new uint[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; uint bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(UInt32)); } return(0); } } if (displayType == SoulsFormats.PARAMDEF.DefType.f32) { float valueRead = 0f; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); float value = Convert.ToSingle(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(float)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s32) { int valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); int value = Convert.ToInt32(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(Int32)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s16) { short valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); short value = Convert.ToInt16(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(Int16)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s8) { sbyte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); sbyte value = Convert.ToSByte(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(sbyte)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u32) { uint valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); uint value = Convert.ToUInt32(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(UInt32)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u16) { ushort valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); ushort value = Convert.ToUInt16(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(UInt16)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u8) { byte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); byte value = Convert.ToByte(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(byte)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.dummy8 || displayType == SoulsFormats.PARAMDEF.DefType.fixstr || displayType == SoulsFormats.PARAMDEF.DefType.fixstrW) { return(cell.Def.ArrayLength); } else { throw new Exception("Unexpected Field Type"); } }