diff options
author | robinsch <hello@robinsch.com> | 2023-11-30 11:47:18 +0100 |
---|---|---|
committer | robinsch <hello@robinsch.com> | 2023-11-30 11:47:18 +0100 |
commit | 1894103b5ebbf37944ca3dded61816b9eced5e96 (patch) | |
tree | 4a89be94bf4bfc06c0f2ef54a8f403e42377ed64 | |
parent | bf7622ec61b7c772b7e7ab9bd730807658e7fb80 (diff) |
Cleanup
-rw-r--r-- | Patcher.cpp | 114 |
1 files changed, 44 insertions, 70 deletions
diff --git a/Patcher.cpp b/Patcher.cpp index cead52e..d8ad155 100644 --- a/Patcher.cpp +++ b/Patcher.cpp @@ -7,6 +7,34 @@ // wow base = 50 0C00 +static std::fstream wow_exe; + +void write_pos(std::streampos pos, uint8_t value) +{ + wow_exe.clear(); + wow_exe.seekg(0); + wow_exe.seekp(pos); + wow_exe << value; +} + +void write_pos(std::streampos pos, std::vector<uint8_t> values) +{ + wow_exe.clear(); + wow_exe.seekg(0); + wow_exe.seekp(pos); + for (uint8_t v : values) + wow_exe << v; +} + +void write_pos_n(std::streampos pos, uint8_t value, size_t n) +{ + wow_exe.clear(); + wow_exe.seekg(0); + wow_exe.seekp(pos); + for (size_t i = 0; i < n; ++i) + wow_exe << value; +} + int main(int argc, char** argv) { std::string wow; @@ -16,9 +44,10 @@ int main(int argc, char** argv) return 1; } + wow_exe = std::fstream(wow, std::ios::in | std::ios::out | std::ios::binary); + wow = argv[1]; - std::fstream wow_exe(wow, std::ios::in | std::ios::out | std::ios::binary); if (!wow_exe) { std::cout << "World of Warcraft exe not found!\n"; @@ -26,92 +55,37 @@ int main(int argc, char** argv) } // windowed mode to full screen - wow_exe.seekp(0xE94); - wow_exe << static_cast<char>(0xEB); + write_pos(0xE94, 0xEB); // melee swing on right-click - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x2E1C67); - for (size_t i = 0; i < 11; ++i) - wow_exe << static_cast<char>(0x90); + write_pos_n(0x2E1C67, 0x90, 11); // NPC attack animation when turning - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x33D7C9); - wow_exe << static_cast<char>(0xEB); + write_pos(0x33D7C9, 0xEB); // "ghost" attack when NPC evades from combat - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x355BF); - wow_exe << static_cast<char>(0xEB); + write_pos(0x355BF, 0xEB); // missing pre cast animation when canceling channeled spells - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x33E0D6); - for (size_t i = 0; i < 22; ++i) - wow_exe << static_cast<char>(0x90); + write_pos_n(0x33E0D6, 0x90, 22); // mouse flickering and camera snapping issue when mouse has high report rate // credits to bonbigz { - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x369A2F); - for (char b : { 0x8B, 0x15, 0xF8, 0x13, 0xD4, 0x00, 0x8B, 0x1D, 0xFC, 0x13, 0xD4, 0x00 }) - wow_exe << b; - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x369A2C); - for (char b : { 0xE9, 0x71, 0xF0, 0x0B, 0x00 }) - wow_exe << b; - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x428AA2); - for (char b : { 0x8D, 0x4D, 0xF0, 0x51, 0x57, 0xFF, 0x15, 0xDC, 0xF5, 0x9D, 0x00, 0x8B, 0x45, 0xF0, 0x8B, 0x15, 0xF8, 0x13, 0xD4, 0x00, 0xE9, 0x7A, 0x0F, 0xF4, 0xFF }) - wow_exe << b; - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x3691B0); - for (char b : { 0x55, 0x89, 0xE5, 0x8B, 0x05, 0xFC, 0x13, 0xD4, 0x00, 0x8B, 0x0D, 0xF8, 0x13, 0xD4, 0x00, 0xEB, 0xC2, 0x7D, 0x03, 0x83, 0xC1, 0x01, 0x83, 0xC0, 0x32, 0x83, 0xC1, 0x32, 0x3B, 0x0D, 0xEC, 0xBC, 0xCA, 0x00, 0x7E, 0x03, 0x83, 0xE9, 0x01, 0x3B, 0x05, 0xF0, 0xBC, 0xCA, 0x00, 0x7E, 0x03, 0x83, 0xE8, 0x01, 0x83, 0xE9, 0x32, 0x83, 0xE8, 0x32, 0x89, 0x0D, 0xF8, 0x13, 0xD4, 0x00, 0x89, 0x05, 0xFC, 0x13, 0xD4, 0x00, 0x89, 0xEC, 0x5D, 0xE9, 0xB4, 0xF7, 0xFF, 0xFF }) - wow_exe << b; - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x369183); - for (char b : { 0x83, 0xF8, 0x32, 0x7D, 0x03, 0x83, 0xC0, 0x01, 0x83, 0xF9, 0x32, 0xEB, 0x31 }) - wow_exe << b; + write_pos(0x369A2F, { 0x8B, 0x15, 0xF8, 0x13, 0xD4, 0x00, 0x8B, 0x1D, 0xFC, 0x13, 0xD4, 0x00 }); + write_pos(0x369A2C, { 0xE9, 0x71, 0xF0, 0x0B, 0x00 }); + write_pos(0x428AA2, { 0x8D, 0x4D, 0xF0, 0x51, 0x57, 0xFF, 0x15, 0xDC, 0xF5, 0x9D, 0x00, 0x8B, 0x45, 0xF0, 0x8B, 0x15, 0xF8, 0x13, 0xD4, 0x00, 0xE9, 0x7A, 0x0F, 0xF4, 0xFF }); + write_pos(0x3691B0, { 0x55, 0x89, 0xE5, 0x8B, 0x05, 0xFC, 0x13, 0xD4, 0x00, 0x8B, 0x0D, 0xF8, 0x13, 0xD4, 0x00, 0xEB, 0xC2, 0x7D, 0x03, 0x83, 0xC1, 0x01, 0x83, 0xC0, 0x32, 0x83, 0xC1, 0x32, 0x3B, 0x0D, 0xEC, 0xBC, 0xCA, 0x00, 0x7E, 0x03, 0x83, 0xE9, 0x01, 0x3B, 0x05, 0xF0, 0xBC, 0xCA, 0x00, 0x7E, 0x03, 0x83, 0xE8, 0x01, 0x83, 0xE9, 0x32, 0x83, 0xE8, 0x32, 0x89, 0x0D, 0xF8, 0x13, 0xD4, 0x00, 0x89, 0x05, 0xFC, 0x13, 0xD4, 0x00, 0x89, 0xEC, 0x5D, 0xE9, 0xB4, 0xF7, 0xFF, 0xFF }); + write_pos(0x369183, { 0x83, 0xF8, 0x32, 0x7D, 0x03, 0x83, 0xC0, 0x01, 0x83, 0xF9, 0x32, 0xEB, 0x31 }); } // naked character issue - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x1DDC5D); - wow_exe << static_cast<char>(0xEB); + write_pos(0x1DDC5D, 0xEB); // patches missiles impacting with terrain - { - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x1FC99E); - wow_exe << static_cast<char>(0x00); - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x1FC8C7); - wow_exe << static_cast<char>(0x00); - - wow_exe.clear(); - wow_exe.seekg(0); - wow_exe.seekp(0x01FC735); - wow_exe << static_cast<char>(0x00); - } + write_pos(0x1FC99E, 0x00); + write_pos(0x1FC8C7, 0x00); + write_pos(0x01FC735, 0x00); std::cout << "World of Warcraft exe has been patched!\n"; return 0; |