From 4b3dcbb6f487dd0c2ce6c0f9edb2fbd3d5f72496 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 7 Dec 2024 17:29:10 -0800 Subject: [PATCH] add item pickup patch --- README.md | 6 +- src/AddressTranslator.cc | 19 ++-- src/ChatCommands.cc | 94 ++++++++++++++++++ src/FunctionCompiler.cc | 2 +- src/ReceiveCommands.cc | 8 +- src/WordSelectTable.cc | 8 +- .../ItemPickup/ItemPickup.3OE0.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OE1.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OE2.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OJ2.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OJ3.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OJ4.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OJ5.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.3OP0.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OED.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OEU.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OJB.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OJD.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OJU.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OPD.patch.s | 29 ++++++ .../ItemPickup/ItemPickup.4OPU.patch.s | 29 ++++++ .../System/ReadMemoryWordDC.sh4.s | 13 +++ ...emoryWord.ppc.s => ReadMemoryWordGC.ppc.s} | 0 .../System/ReadMemoryWordX86.x86.s | 13 +++ .../System/WriteMemoryDC.sh4.s | 33 ++++++ ...{WriteMemory.ppc.s => WriteMemoryGC.ppc.s} | 8 +- .../System/WriteMemoryX86.x86.s | 37 +++++++ system/text-sets/gc-v3/ws_data.bin | Bin 25136 -> 24650 bytes 28 files changed, 656 insertions(+), 20 deletions(-) create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OE0.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OE1.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OE2.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OJ2.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OJ3.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OJ4.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OJ5.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.3OP0.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OED.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OEU.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OJB.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OJD.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OJU.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OPD.patch.s create mode 100644 system/client-functions/ItemPickup/ItemPickup.4OPU.patch.s create mode 100644 system/client-functions/System/ReadMemoryWordDC.sh4.s rename system/client-functions/System/{ReadMemoryWord.ppc.s => ReadMemoryWordGC.ppc.s} (100%) create mode 100644 system/client-functions/System/ReadMemoryWordX86.x86.s create mode 100644 system/client-functions/System/WriteMemoryDC.sh4.s rename system/client-functions/System/{WriteMemory.ppc.s => WriteMemoryGC.ppc.s} (96%) create mode 100644 system/client-functions/System/WriteMemoryX86.x86.s mode change 100644 => 100755 system/text-sets/gc-v3/ws_data.bin diff --git a/README.md b/README.md index e9249d0e..4600b471 100644 --- a/README.md +++ b/README.md @@ -430,7 +430,7 @@ Like quests, Episode 3 card definitions, maps, and quests are cached in memory. *Everything in this section requires resource_dasm to be installed, so newserv can use the assemblers and disassemblers from its libresource_file library. If resource_dasm is not installed, newserv will still build and run, but these features will not be available.* -You can put assembly files in the system/client-functions directory with filenames like PatchName.VERS.patch.s and they will appear in the Patches menu for clients that support client functions. Client functions are written in SH-4, PowerPC, or x86 assembly and are compiled when newserv is started. The assembly system's features are documented in the comments in system/client-functions/System/WriteMemory.ppc.s. +You can put assembly files in the system/client-functions directory with filenames like PatchName.VERS.patch.s and they will appear in the Patches menu for clients that support client functions. Client functions are written in SH-4, PowerPC, or x86 assembly and are compiled when newserv is started. The assembly system's features are documented in the comments in system/client-functions/System/WriteMemoryGC.ppc.s. The VERS token in client function filenames refers to the specific version of the game that the client function applies to. Some versions do not support receiving client functions at all. *Note: newserv uses the shorter GameCube versioning convention, where discs labeled DOL-XXXX-0-0Y are version 1.Y. The PSO community seems to use the convention 1.0Y in some places instead, but these are the same version. For example, the version that newserv calls v1.4 is the same as v1.04, and is labeled DOL-GPOJ-0-04 on the underside of the disc.* @@ -478,7 +478,7 @@ The specific versions are: newserv comes with a set of patches for many of the above versions, based on AR codes originally made by Ralf at GC-Forever and Aleron Ives. Many of them were originally posted in [this thread](https://www.gc-forever.com/forums/viewtopic.php?f=38&t=2050). -You can also put DOL files in the system/dol directory, and they will appear in the Programs menu for GC clients. Selecting a DOL file there will load the file into the GameCube's memory and run it, just like the old homebrew loaders (PSUL and PSOload) did. For this to work, ReadMemoryWord.ppc.s, WriteMemory.ppc.s, and RunDOL.ppc.s must be present in the system/client-functions/System directory. This has been tested on Dolphin but not on a real GameCube, so results may vary. +You can also put DOL files in the system/dol directory, and they will appear in the Programs menu for GC clients. Selecting a DOL file there will load the file into the GameCube's memory and run it, just like the old homebrew loaders (PSUL and PSOload) did. For this to work, ReadMemoryWordGC.ppc.s, WriteMemoryGC.ppc.s, and RunDOL.ppc.s must be present in the system/client-functions/System directory. This has been tested on Dolphin but not on a real GameCube, so results may vary. Like other kinds of data, functions and DOL files are cached in memory. If you've changed any of these files, you can run `reload functions` or `reload dol-files` in the interactive shell to make the changes take effect without restarting the server. @@ -548,6 +548,8 @@ Some commands only work on the game server and not on the proxy server. The chat * You'll be placed into the last available slot in lobbies and games instead of the first, unless you're joining a BB solo-mode game. * You'll be able to join games with any PSO version, not only those for which crossplay is normally supported. Be prepared for client crashes and other client-side brokenness if you do this. Do not submit any issues for broken behaviors in crossplay, unless the situation is explicitly supported (see the "Cross-version play" section above). * The rest of the commands in this section are enabled on the game server. (They are always enabled on the proxy server.) + * `$readmem
` (game server only): Reads 4 bytes from the given address and shows you the values. + * `$writemem
` (game server only): Writes data to the given address. Data is not required to be any specific size. * `$quest ` (game server only): Load a quest by quest number. Can be used to load battle or challenge quests with only one player present. Debug is not required to be enabled if the specified quest has the AllowStartFromChatCommand field set in its metadata file. * `$qcall `: Call a quest function on your client. * `$qcheck ` (game server only): Show the value of a quest flag. This command can be used without debug mode enabled. If you're in a game, show the value of the flag in that game; if you're in the lobby, show the saved value of that quest flag for your character (BB only). diff --git a/src/AddressTranslator.cc b/src/AddressTranslator.cc index b2d1cca0..7aec23f4 100644 --- a/src/AddressTranslator.cc +++ b/src/AddressTranslator.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include using namespace std; @@ -112,9 +113,13 @@ class AddressTranslator { this->directory.pop_back(); } for (const auto& filename : phosg::list_directory(this->directory)) { + if (filename.size() < 4) { + continue; + } + string name = filename.substr(0, filename.size() - 4); + string path = directory + "/" + filename; + if (phosg::ends_with(filename, ".dol")) { - string name = filename.substr(0, filename.size() - 4); - string path = directory + "/" + filename; ResourceDASM::DOLFile dol(path.c_str()); auto mem = make_shared(); dol.load_into(mem); @@ -122,16 +127,18 @@ class AddressTranslator { this->enable_ppc = true; this->log.info("Loaded %s", name.c_str()); } else if (phosg::ends_with(filename, ".xbe")) { - string name = filename.substr(0, filename.size() - 4); - string path = directory + "/" + filename; ResourceDASM::XBEFile xbe(path.c_str()); auto mem = make_shared(); xbe.load_into(mem); this->mems.emplace(name, mem); this->log.info("Loaded %s", name.c_str()); + } else if (phosg::ends_with(filename, ".exe")) { + ResourceDASM::PEFile pe(path.c_str()); + auto mem = make_shared(); + pe.load_into(mem); + this->mems.emplace(name, mem); + this->log.info("Loaded %s", name.c_str()); } else if (phosg::ends_with(filename, ".bin")) { - string name = filename.substr(0, filename.size() - 4); - string path = directory + "/" + filename; string data = phosg::load_file(path); auto mem = make_shared(); mem->allocate_at(0x8C010000, data.size()); diff --git a/src/ChatCommands.cc b/src/ChatCommands.cc index 7419b293..064f5c26 100644 --- a/src/ChatCommands.cc +++ b/src/ChatCommands.cc @@ -891,6 +891,98 @@ static void proxy_command_patch(shared_ptr ses, cons } } +static bool console_address_in_range(Version version, uint32_t addr) { + if (is_dc(version)) { + return ((addr > 0x8C000000) && (addr <= 0x8CFFFFFC)); + } else if (is_gc(version)) { + return ((addr > 0x80000000) && (addr <= 0x817FFFFC)); + } else { + return true; + } +} + +static void server_command_readmem(shared_ptr c, const std::string& args) { + check_debug_enabled(c); + + uint32_t addr = stoul(args, nullptr, 16); + if (!console_address_in_range(c->version(), addr)) { + send_text_message(c, "$C4Address out of\nrange"); + return; + } + + prepare_client_for_patches(c, [wc = weak_ptr(c), addr]() { + auto c = wc.lock(); + if (!c) { + return; + } + try { + auto s = c->require_server_state(); + const char* function_name = is_dc(c->version()) + ? "ReadMemoryWordDC" + : is_gc(c->version()) + ? "ReadMemoryWordGC" + : "ReadMemoryWordX86"; + auto fn = s->function_code_index->name_to_function.at(function_name); + send_function_call(c, fn, {{"address", addr}}); + c->function_call_response_queue.emplace_back([wc = weak_ptr(c), addr](uint32_t ret, uint32_t) { + auto c = wc.lock(); + if (c) { + string data_str; + if (is_big_endian(c->version())) { + be_uint32_t v = ret; + data_str = phosg::format_data_string(&v, sizeof(v)); + } else { + le_uint32_t v = ret; + data_str = phosg::format_data_string(&v, sizeof(v)); + } + send_text_message_printf(c, "Bytes at %08" PRIX32 ":\n$C6%s", addr, data_str.c_str()); + } + }); + } catch (const out_of_range&) { + send_text_message(c, "Invalid patch name"); + } + }); +} + +static void server_command_writemem(shared_ptr c, const std::string& args) { + check_debug_enabled(c); + + auto tokens = phosg::split(args, ' '); + if (tokens.size() < 2) { + send_text_message(c, "Incorrect arguments"); + return; + } + + uint32_t addr = stoul(tokens[0], nullptr, 16); + if (!console_address_in_range(c->version(), addr)) { + send_text_message(c, "$C4Address out of\nrange"); + return; + } + + tokens.erase(tokens.begin()); + std::string data = phosg::parse_data_string(phosg::join(tokens, " ")); + + prepare_client_for_patches(c, [wc = weak_ptr(c), addr, data]() { + auto c = wc.lock(); + if (!c) { + return; + } + try { + auto s = c->require_server_state(); + const char* function_name = is_dc(c->version()) + ? "WriteMemoryDC" + : is_gc(c->version()) + ? "WriteMemoryGC" + : "WriteMemoryX86"; + auto fn = s->function_code_index->name_to_function.at(function_name); + send_function_call(c, fn, {{"dest_addr", addr}, {"size", data.size()}}, data.data(), data.size()); + c->function_call_response_queue.emplace_back(empty_function_call_response_handler); + } catch (const out_of_range&) { + send_text_message(c, "Invalid patch name"); + } + }); +} + static void server_command_persist(shared_ptr c, const std::string&) { auto l = c->require_lobby(); if (l->check_flag(Lobby::Flag::DEFAULT)) { @@ -2703,6 +2795,7 @@ static const unordered_map chat_commands({ {"$qsyncall", {server_command_qsyncall, proxy_command_qsyncall}}, {"$quest", {server_command_quest, nullptr}}, {"$rand", {server_command_rand, proxy_command_rand}}, + {"$readmem", {server_command_readmem, nullptr}}, {"$save", {server_command_save, nullptr}}, {"$savechar", {server_command_savechar, nullptr}}, {"$saverec", {server_command_saverec, nullptr}}, @@ -2728,6 +2821,7 @@ static const unordered_map chat_commands({ {"$warpall", {server_command_warpall, proxy_command_warpall}}, {"$what", {server_command_what, nullptr}}, {"$where", {server_command_where, nullptr}}, + {"$writemem", {server_command_writemem, nullptr}}, }); struct SplitCommand { diff --git a/src/FunctionCompiler.cc b/src/FunctionCompiler.cc index 651401d4..a7d5e273 100644 --- a/src/FunctionCompiler.cc +++ b/src/FunctionCompiler.cc @@ -67,7 +67,7 @@ string CompiledFunctionCode::generate_client_command_t( if (offset > modified_code.size() - 4) { throw runtime_error("label out of range"); } - *reinterpret_cast(modified_code.data() + offset) = it.second; + *reinterpret_cast*>(modified_code.data() + offset) = it.second; } w.write(modified_code); } else { diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index dbf8de9b..7703dbef 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -2745,7 +2745,7 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { // base address for loading the file. send_function_call( c, - s->function_code_index->name_to_function.at("ReadMemoryWord"), + s->function_code_index->name_to_function.at("ReadMemoryWordGC"), {{"address", 0x80000034}}); // ArenaHigh from GC globals } break; @@ -2927,7 +2927,7 @@ static void send_dol_file_chunk(shared_ptr c, uint32_t start_addr) { string data_to_send = c->loading_dol_file->data.substr(offset, bytes_to_send); auto s = c->require_server_state(); - auto fn = s->function_code_index->name_to_function.at("WriteMemory"); + auto fn = s->function_code_index->name_to_function.at("WriteMemoryGC"); unordered_map label_writes( {{"dest_addr", start_addr}, {"size", bytes_to_send}}); send_function_call(c, fn, label_writes, data_to_send.data(), data_to_send.size()); @@ -2946,10 +2946,10 @@ static void on_B3(shared_ptr c, uint16_t, uint32_t flag, string& data) { c->function_call_response_queue.pop_front(); } else if (c->loading_dol_file.get()) { auto called_fn = s->function_code_index->index_to_function.at(flag); - if (called_fn->short_name == "ReadMemoryWord") { + if (called_fn->short_name == "ReadMemoryWordGC") { c->dol_base_addr = (cmd.return_value - c->loading_dol_file->data.size()) & (~3); send_dol_file_chunk(c, c->dol_base_addr); - } else if (called_fn->short_name == "WriteMemory") { + } else if (called_fn->short_name == "WriteMemoryGC") { if (cmd.return_value >= c->dol_base_addr + c->loading_dol_file->data.size()) { auto fn = s->function_code_index->name_to_function.at("RunDOL"); unordered_map label_writes({{"dol_base_ptr", c->dol_base_addr}}); diff --git a/src/WordSelectTable.cc b/src/WordSelectTable.cc index 462724cf..03864272 100644 --- a/src/WordSelectTable.cc +++ b/src/WordSelectTable.cc @@ -135,9 +135,9 @@ WordSelectSet::WordSelectSet(const string& data, Version version, const vectorparse_non_windows_t(decrypt_and_decompress_pr2_data(data), use_sjis); break; case Version::GC_EP3_NTE: + case Version::GC_V3: this->parse_non_windows_t(decrypt_and_decompress_pr2_data(data), use_sjis); break; - case Version::GC_V3: case Version::GC_EP3: this->parse_non_windows_t(decrypt_and_decompress_pr2_data(data), use_sjis); break; @@ -159,11 +159,13 @@ const string& WordSelectSet::string_for_token(uint16_t token_id) const { void WordSelectSet::print(FILE* stream) const { fprintf(stream, "strings:\n"); for (size_t z = 0; z < this->strings.size(); z++) { - fprintf(stream, " [%04zX] \"%s\"\n", z, this->strings[z].c_str()); + auto escaped = phosg::escape_controls_utf8(this->strings[z]); + fprintf(stream, " [%04zX] \"%s\"\n", z, escaped.c_str()); } fprintf(stream, "token_id_to_string_id:\n"); for (size_t z = 0; z < this->token_id_to_string_id.size(); z++) { - fprintf(stream, " [%04zX] %04zX \"%s\"\n", z, this->token_id_to_string_id[z], this->string_for_token(z).c_str()); + auto escaped = phosg::escape_controls_utf8(this->string_for_token(z)); + fprintf(stream, " [%04zX] %04zX \"%s\"\n", z, this->token_id_to_string_id[z], escaped.c_str()); } } diff --git a/system/client-functions/ItemPickup/ItemPickup.3OE0.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OE0.patch.s new file mode 100644 index 00000000..c93aae89 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OE0.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x4834428D + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA150 + .data 0x481AA15C + .data 0x801B5A9C + .data 0x00000004 + .data 0x4BE55E9C + .data 0x8024CC0C + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OE1.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OE1.patch.s new file mode 100644 index 00000000..7c79dffa --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OE1.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x483442D1 + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA150 + .data 0x481AA15C + .data 0x801B5A9C + .data 0x00000004 + .data 0x4BE55E9C + .data 0x8024CC0C + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OE2.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OE2.patch.s new file mode 100644 index 00000000..a8b0e9f0 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OE2.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x48345EB9 + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA2E8 + .data 0x481AA2F4 + .data 0x801B5C34 + .data 0x00000004 + .data 0x4BE55D04 + .data 0x8024DD88 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OJ2.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OJ2.patch.s new file mode 100644 index 00000000..ff1105f7 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OJ2.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x483433D9 + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481A9D64 + .data 0x481A9D70 + .data 0x801B56B0 + .data 0x00000004 + .data 0x4BE56288 + .data 0x8024C384 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OJ3.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OJ3.patch.s new file mode 100644 index 00000000..14f42734 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OJ3.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x483447DD + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA1B8 + .data 0x481AA1C4 + .data 0x801B5B04 + .data 0x00000004 + .data 0x4BE55E34 + .data 0x8024CDD0 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OJ4.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OJ4.patch.s new file mode 100644 index 00000000..6dfd48a5 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OJ4.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x48345D45 + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AC370 + .data 0x481AC37C + .data 0x801B7CBC + .data 0x00000004 + .data 0x4BE53C7C + .data 0x8024DD28 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OJ5.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OJ5.patch.s new file mode 100644 index 00000000..1a7e080f --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OJ5.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x48345AED + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA284 + .data 0x481AA290 + .data 0x801B5BD0 + .data 0x00000004 + .data 0x4BE55D68 + .data 0x8024DAC4 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.3OP0.patch.s b/system/client-functions/ItemPickup/ItemPickup.3OP0.patch.s new file mode 100644 index 00000000..a77bdb46 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.3OP0.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the Z button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksGC + .data 0x8000B938 + .data 0x00000020 + .data 0x387C0550 + .data 0x38800100 + .data 0x483452AD + .data 0x2C030000 + .data 0x4182000C + .data 0x7F83E378 + .data 0x481AA7A4 + .data 0x481AA7B0 + .data 0x801B60F0 + .data 0x00000004 + .data 0x4BE55848 + .data 0x8024D5D0 + .data 0x00000004 + .data 0x38800008 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OED.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OED.patch.s new file mode 100644 index 00000000..85a97e53 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OED.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDC99 + .data 0x07 + .binary E8880100009090 + .data 0x001FDE26 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDE76 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDEC5 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025ADAD + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OEU.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OEU.patch.s new file mode 100644 index 00000000..107b261b --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OEU.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDC99 + .data 0x07 + .binary E8880100009090 + .data 0x001FDE26 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDE76 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDEC5 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025AEED + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OJB.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OJB.patch.s new file mode 100644 index 00000000..e991aaf2 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OJB.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDA89 + .data 0x07 + .binary E8880100009090 + .data 0x001FDC16 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDC66 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDCB5 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025A94D + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OJD.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OJD.patch.s new file mode 100644 index 00000000..fd86c8b5 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OJD.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDBE9 + .data 0x07 + .binary E8880100009090 + .data 0x001FDD76 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDDC6 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDE15 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025ACCD + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OJU.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OJU.patch.s new file mode 100644 index 00000000..8542b8c2 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OJU.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDE69 + .data 0x07 + .binary E8880100009090 + .data 0x001FDFF6 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FE046 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FE095 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025B07D + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OPD.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OPD.patch.s new file mode 100644 index 00000000..f4bc0155 --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OPD.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDCB9 + .data 0x07 + .binary E8880100009090 + .data 0x001FDE46 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDE96 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDEE5 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025ADCD + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/ItemPickup/ItemPickup.4OPU.patch.s b/system/client-functions/ItemPickup/ItemPickup.4OPU.patch.s new file mode 100644 index 00000000..06781d2c --- /dev/null +++ b/system/client-functions/ItemPickup/ItemPickup.4OPU.patch.s @@ -0,0 +1,29 @@ +.meta name="Item pickup" +.meta description="Prevents picking\nup items unless you\nhold the white or\nblack button" +# Original code by Ralf @ GC-Forever +# https://www.gc-forever.com/forums/viewtopic.php?t=2050 +# https://www.gc-forever.com/forums/viewtopic.php?t=2049 +# Xbox port by fuzziqersoftware + +entry_ptr: +reloc0: + .offsetof start +start: + .include WriteCodeBlocksXB + .data 0x001FDD29 + .data 0x07 + .binary E8880100009090 + .data 0x001FDEB6 + .data 0x0A + .binary 8B866C05000085C0EB46 + .data 0x001FDF06 + .data 0x09 + .binary 74038A40013408EB46 + .data 0x001FDF55 + .data 0x0A + .binary 7507F68624030000E0C3 + .data 0x0025AF1D + .data 0x01 + .binary 00 + .data 0x00000000 + .data 0x00000000 diff --git a/system/client-functions/System/ReadMemoryWordDC.sh4.s b/system/client-functions/System/ReadMemoryWordDC.sh4.s new file mode 100644 index 00000000..30b034f2 --- /dev/null +++ b/system/client-functions/System/ReadMemoryWordDC.sh4.s @@ -0,0 +1,13 @@ +entry_ptr: +reloc0: + .offsetof start + +start: + mova r0, [address] + mov.l r0, [r0] + rets + mov.l r0, [r0] + + .align 4 +address: + .data 0 diff --git a/system/client-functions/System/ReadMemoryWord.ppc.s b/system/client-functions/System/ReadMemoryWordGC.ppc.s similarity index 100% rename from system/client-functions/System/ReadMemoryWord.ppc.s rename to system/client-functions/System/ReadMemoryWordGC.ppc.s diff --git a/system/client-functions/System/ReadMemoryWordX86.x86.s b/system/client-functions/System/ReadMemoryWordX86.x86.s new file mode 100644 index 00000000..e61fe905 --- /dev/null +++ b/system/client-functions/System/ReadMemoryWordX86.x86.s @@ -0,0 +1,13 @@ +entry_ptr: +reloc0: + .offsetof start + +start: + call resume +address: + .data 0 +resume: + pop eax + mov eax, [eax] + mov eax, [eax] + ret diff --git a/system/client-functions/System/WriteMemoryDC.sh4.s b/system/client-functions/System/WriteMemoryDC.sh4.s new file mode 100644 index 00000000..6c46dd2f --- /dev/null +++ b/system/client-functions/System/WriteMemoryDC.sh4.s @@ -0,0 +1,33 @@ +.meta name="Write memory" +.meta description="Writes data to any location in memory" + +entry_ptr: +reloc0: + .offsetof start + +start: + mova r0, [dest_addr] + mov r4, r0 + mov.l r0, [r4] + mov.l r5, [r4 + 4] + add r4, 8 +again: + test r5, r5 + bt done + mov.b r6, [r4] + mov.b [r0], r6 + add r4, 1 + add r0, 1 + bs again + add r5, -1 +done: + rets + nop + + .align 4 +dest_addr: + .data 0 +size: + .data 0 + +data_to_write: diff --git a/system/client-functions/System/WriteMemory.ppc.s b/system/client-functions/System/WriteMemoryGC.ppc.s similarity index 96% rename from system/client-functions/System/WriteMemory.ppc.s rename to system/client-functions/System/WriteMemoryGC.ppc.s index 5dedc318..f2a40149 100644 --- a/system/client-functions/System/WriteMemory.ppc.s +++ b/system/client-functions/System/WriteMemoryGC.ppc.s @@ -3,7 +3,7 @@ # This is also the file I've chosen to document how to write code for newserv's # functions subsystem. There are three kinds of functions: includes, patches, -# and general functions. This file, WriteMemory, is a general function. It +# and general functions. This file, WriteMemoryGC, is a general function. It # writes a variable-length block of data to a specified address in the client's # memory. @@ -28,7 +28,7 @@ # For example, to use this function to write the bytes 38 00 00 05 to the # address 8010521C, send_function_call could be called like this: -# auto fn = s->function_code_index->name_to_function.at("WriteMemory"); +# auto fn = s->function_code_index->name_to_function.at("WriteMemoryGC"); # unordered_map label_writes( # {{"dest_addr", 0x8010521C}, {"size", 4}}); # string suffix("\x38\x00\x00\x05", 4); @@ -52,8 +52,8 @@ # when sending the B2 command. This is needed if the server needs to do # something when the B3 response is received. If specified, the index must be in # the range 01-FF. The DOL loading functionality, which this function is a part -# of, uses indexes E0, E1, and E2, but the WriteMemory function can also be used -# for other purposes. +# of, uses indexes E0, E1, and E2, but the WriteMemoryGC function can also be +# used for other purposes. .meta index=E1 # To hide a patch from the Patches menu (so it can only be used with the $patch diff --git a/system/client-functions/System/WriteMemoryX86.x86.s b/system/client-functions/System/WriteMemoryX86.x86.s new file mode 100644 index 00000000..f1ace410 --- /dev/null +++ b/system/client-functions/System/WriteMemoryX86.x86.s @@ -0,0 +1,37 @@ +.meta name="Write memory" +.meta description="Writes data to any location in memory" + +entry_ptr: +reloc0: + .offsetof start + +start: + jmp get_block_ptr +get_block_ptr_ret: + xchg ebx, [esp] + mov eax, [ebx] + mov ecx, [ebx + 4] + add ebx, 8 + +again: + test ecx, ecx + jz done + mov dl, [ebx] + mov [eax], dl + inc ebx + inc eax + dec ecx + jmp again + +done: + pop ebx + ret + +get_block_ptr: + call get_block_ptr_ret +dest_addr: + .data 0 +size: + .data 0 + +data_to_write: diff --git a/system/text-sets/gc-v3/ws_data.bin b/system/text-sets/gc-v3/ws_data.bin old mode 100644 new mode 100755 index 635bc2fe66800e1e49b19689d897a524592e9218..7d44ee7d7d6b42770c06d905a42e4f8c2a9280a3 GIT binary patch literal 24650 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

% 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