<?php // Set error reporting to only show errors and parse errors error_reporting(E_ERROR | E_PARSE); // Set the time limit for script execution to unlimited set_time_limit(-1); // Set the maximum input time to unlimited ini_set('max_input_time', '-1'); // Set the maximum execution time to unlimited ini_set('max_execution_time', '0'); // Start the session session_start(); // Start output buffering ob_start(); // Define the constant 'DB_FILE' with the value of 'modname' session variable followed by ".db" define('DB_FILE', $_SESSION['modname'] . ".db"); // Include the configuration file require_once './config.php'; // Include the PDO wrapper file require_once './_pdo.php'; // Include the required class files require_once "./src/D2Functions.php"; require_once "./src/D2Database.php"; require_once './src/D2Files.php'; require_once './src/D2TxtParser.php'; require_once './src/D2ItemDesc.php'; require_once './src/D2Char.php'; require_once './src/D2CharStructureData.php'; require_once './src/D2ByteReader.php'; // Create an instance of D2CharStructureData class $csData = new D2CharStructureData(); $g = $_GET; $cmd = $g['cmd']; // Get the file path from the POST data and replace backslashes / $filePath = $g['filePath']; $filePath = str_replace("\\", "\\\\", $filePath); // Handle the WP check/uncheck if ($cmd == "wp") { $diff = $g['diff']; if ($diff == "Norm") { $offset = 643; } if ($diff == "NM") { $offset = 667; } if ($diff == "Hell") { $offset = 691; } /* array (size=5) 'cmd' => string 'wp' (length=2) 'name' => string '1' (length=1) 'value' => string '1' (length=1) 'filePath' => string 'D:\\Diablo II\\MODS\\ironman-dev\\save\\Sorc.d2s' (length=48) 'diff' => string 'Norm' (length=4) */ $fileContents = file_get_contents($filePath); // Read the contents of the file $ByteReader = new D2ByteReader($fileContents); // Create a new instance of D2ByteReader with the file data $fileData = $ByteReader->getData(); // Get the data from the ByteReader instance $wpBytes = $ByteReader->read($offset, 5, 1); $wpBytesToBits = $ByteReader->toBits($wpBytes); $BitReader = new D2BitReader($wpBytesToBits); $BitReader->setBit($g['name'], $g['value']); $newBits = $BitReader->getBits(); $newBitsToBytes = $ByteReader->bitsToHexString($newBits); $ByteReader->writeBytes($offset, $newBitsToBytes); $newFileData = $ByteReader->getData(); $fileSaved = file_put_contents($filePath, $newFileData); $checksum = (shell_exec("bin\d2scs.exe \"$filePath\"")); if ($fileSaved) { echo "Success"; } else { echo "Fail"; } } die(); // Get the POST data $p = $_GET; // Loop through each 'quest' element in the POST data and assign the corresponding value from 'dStruct->_qNorm' to 'q' foreach ($p['quest'] as $k => $v) { $q[$k] = $dStruct->_qNorm[$k]; } $wpNames_flipped = array_values($dStruct->wpNames_flipped); // Loop through each 'wp' element in the POST data and assign the corresponding value from 'dStruct->_qNorm' to 'w' foreach ($p['wp'] as $k => $v) { $w[$k] = $dStruct->_qNorm[$k]; } // Get the file path from the POST data and replace backslashes / $filePath = $p['filePath']; $filePath = str_replace("\\", "\\\\", $filePath); // Open the file in binary mode for both reading and writing $fp = fopen($filePath, "rb+"); // Edit quests which are checked to set them as 'Just finished' (FE FF) foreach ($q as $k => $v) { // Set the file pointer position to the quest offset fseek($fp, $v); // Write the byte value 0xFE at the current position fwrite($fp, pack('C', 0xFE)); // Move the file pointer to the next position fseek($fp, $v + 1); // Write the byte value 0xFF at the current position fwrite($fp, pack('C', 0xFF)); } // Array containing the fseek wp offsets // 5 acts per difficulty // starts at 641, but we skip two bytes, go to 643, then read next 5 bytes, each byte is a bitfield per act. $offsets = [ 643, 644, 645, 646, 647, // First set of offsets Norm 667, 668, 669, 670, 671, // Second set of offsets NM 691, 692, 693, 694, 695 // Third set of offsets Hell ]; // Determine the value to write based on the condition $p['wp_all'] == "1" $valueToWrite = ($p['wp_all'] == "1") ? 0xFF : 0x00; // Loop over each offset in the $offsets array foreach ($offsets as $offset) { // Set the file pointer position to the current offset fseek($fp, $offset); // Write the value specified by pack('C', $valueToWrite) fwrite($fp, pack('C', $valueToWrite)); } $checksum = (shell_exec("bin\d2scs.exe \"$filePath\"")); fclose($fp); header('Location: /');