From af36074fede3c6ebaa43f540d7078f7f2c30f765 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Thu, 15 Oct 2026 09:02:53 -0400 Subject: [PATCH 1/2] update docs and add details on proudnet version --- decomp/DBCServer_Release_x64/evidence.md | 2 +- decomp/INVENTORY.md | 2 +- decomp/scripts/gen_dbc_tables.py | 81 ++++++++++++++++++++++++ docs/DATABASE.md | 2 +- third-party/README.md | 31 +++++++++ 5 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 decomp/scripts/gen_dbc_tables.py diff --git a/decomp/DBCServer_Release_x64/evidence.md b/decomp/DBCServer_Release_x64/evidence.md index 6132f8e7..97cd723c 100644 --- a/decomp/DBCServer_Release_x64/evidence.md +++ b/decomp/DBCServer_Release_x64/evidence.md @@ -31,7 +31,7 @@ holds the binary-specific evidence. | 3 | The worker dispatches commands 1001–1317 through a jump table to `DBReq*` methods | O (disassembly) | `0x1400a8190`, `cmd_dispatch.tsv` | | 4 | Each `DBReq*` runs one stored procedure through `ADODB.Command` with named parameters, and maps recordset fields by name | O | `0x1400acbb0` (`up_create_character`) | | 5 | Four connection types: 1 WEB(`db_web`), 2 AUTH(`db_account`), 3 GAME(`db_game`), 4 GAME LOG(`db_game_log`). AUTH uses the WEB timeout (bug). Timeout 0 → 500. String length ≤255 | O | `0x1400a7aa0` (REA `ev_00545a3e…`) | -| 6 | Startup opens AUTH and GAME connections, allocates 125-slot write-queue arrays, and logs connect failures to `Error_ADO DB Connect.Log` | O | `0x140042cf0`, `0x1400a80c0` | +| 6 | Startup opens AUTH and GAME connections, allocates 1000-slot write-queue arrays (125 iterations × 8 pointers), and logs connect failures to `Error_ADO DB Connect.Log` | O | `0x140042cf0`, `0x1400a80c0` | | 7 | 210 of 262 RMIs map to a procedure. 7 of those procedures are missing from the shipped schema | O + D | `rmi_to_proc.tsv` | | 8 | Original source layout: `DBLobbyWriteQuery.cpp` ×28 plus `DBWriteQueryServerOption.cpp` | O (`__FILE__` strings) | `dbreq_methods.tsv` | | 9 | The option-loader layout equals MessageServer's (same offsets for every element) | O | `0x140156650`, `0x140155420` | diff --git a/decomp/INVENTORY.md b/decomp/INVENTORY.md index 90e307c6..68f0dc4c 100644 --- a/decomp/INVENTORY.md +++ b/decomp/INVENTORY.md @@ -26,7 +26,7 @@ hypotheses to confirm or revise during analysis. | `ManagerServer_Release_USA_x64.exe` | 6666752 | 6510.5 | c239477294c199f8df4ef70138cc1583c87838dd5e8cebed2ff0fae2bc6c5be2 | management/admin | pending | | `AuctionServer_Release_USA_x64.exe` | 6477824 | 6326.0 | ebca9cc047aeca125ac0621e3652339096c74862746157adc6c72057422f6dcf | auction house | pending | | `MatchServer_Release_USA_x64.exe` | 6134784 | 5991.0 | 341dd4a38c9e1abb590f60325ef52bf24b60a48a70e36e2f1651bbf00591fcf2 | matchmaking | pending | -| `DBCServer_Release_x64.exe` | 3542016 | 3459.0 | d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c | DB access server (observed: SERVERS2DBC RMI → write queues → ADO stored procs; 4 connection types) | open | +| `DBCServer_Release_x64.exe` | 3542016 | 3459.0 | d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c | DB access server (observed: SERVERS2DBC RMI → write queues → ADO stored procs; 4 connection types; Linux port `src/dbc_server/`) | open | | `DBCServer_LOG_Release_x64.exe` | 3394560 | 3315.0 | 2636d51679abb7703a6386a398f2afb985704aa0ce00d53e75d0ff3b093f5836 | logging DB variant | pending | | `GameGatewayServer_Release_x64.exe` | 3330560 | 3252.5 | 4cbec55dc3dfe5a0eeba3170722e6f1d33e55d6a0d007774266fe9db96f25d1a | gateway/proxy | pending | | `GMServer_Release_x64.exe` | 2004480 | 1957.5 | 8fba9dbb8809419d6e2edaee31d9ad60501341d97dca0fc82a1c1e7cc32199d1 | game-master tools | pending | diff --git a/decomp/scripts/gen_dbc_tables.py b/decomp/scripts/gen_dbc_tables.py new file mode 100644 index 00000000..b97e92e2 --- /dev/null +++ b/decomp/scripts/gen_dbc_tables.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +"""Generate the DBCServer port's static tables from decomp evidence. + +Inputs (all derived, regenerable): + decomp/DBCServer_Release_x64/rmi_to_proc.tsv RMI -> cmd -> procedures + decomp/schema//routines.tsv procedure parameters +Output: + src/dbc_server/generated/tables.inc + +Run from the repo root: python3 decomp/scripts/gen_dbc_tables.py +""" +import csv, os + +ROOT = os.getcwd() +OUT = os.path.join(ROOT, 'src/dbc_server/generated/tables.inc') +# Database -> DBC connection type (DBC:0x1400a7aa0). The DB for a procedure is +# where it lives in the schema dump (inference, see docs/DATABASE.md). +DBTYPE = {'RustyHearts_Account': 'Web', 'RustyHearts_Auth': 'Auth', + 'RustyHearts': 'Game', 'RustyHearts_Log': 'GameLog'} +SQLTYPE = {'int': 'Int', 'smallint': 'SmallInt', 'tinyint': 'TinyInt', 'bigint': 'BigInt', + 'bit': 'Bit', 'float': 'Float', 'uniqueidentifier': 'Guid', 'nvarchar': 'NVarChar', + 'nchar': 'NVarChar', 'varchar': 'VarChar', 'char': 'VarChar', 'datetime': 'DateTime'} + +def rows(path): + with open(path, newline='') as f: + return list(csv.reader(f, delimiter='\t')) + +procs = {} # lower name -> (name, db, [(param, type, maxlen, out)]) +for db in DBTYPE: + for r in rows(f'{ROOT}/decomp/schema/{db}/routines.tsv')[1:]: + if len(r) < 7 or r[0] != 'SQL_STORED_PROCEDURE': + continue + p = procs.setdefault(r[1].lower(), (r[1], db, [])) + if r[2] != 'NULL': + p[2].append((r[3], SQLTYPE.get(r[4], 'VarChar'), int(r[5]), r[6] == '1')) + +rmi = rows(f'{ROOT}/decomp/DBCServer_Release_x64/rmi_to_proc.tsv') +hdr = rmi[0]; rmi = [dict(zip(hdr, r)) for r in rmi[1:]] + +used = [] +for r in rmi: + for p in filter(None, r['procs'].split(',')): + if p.lower() not in procs: + # Called by DBCServer but absent from the shipped schema: keep it so + # the port fails like the original would (ADO error). DB guessed from name. + procs[p.lower()] = (p, 'RustyHearts_Log' if '_log_' in p else 'RustyHearts', None) + if p.lower() not in used: + used.append(p.lower()) + +def cstr(s): + return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"' + +out = ['// GENERATED by decomp/scripts/gen_dbc_tables.py - do not edit.', + '// Sources: decomp/DBCServer_Release_x64/rmi_to_proc.tsv, decomp/schema/*/routines.tsv', ''] +for i, key in enumerate(used): + name, db, ps = procs[key] + ps = ps or [] + out.append(f'static const ProcParam kParams{i}[] = {{' + + ''.join(f'{{{cstr(n)}, SqlType::{t}, {m}, {str(o).lower()}}},' for n, t, m, o in ps) + + ('{nullptr, SqlType::Int, 0, false}' if not ps else '') + '};') +out.append('') +out.append('static const ProcDef kProcs[] = {') +for i, key in enumerate(used): + name, db, ps = procs[key] + known = ps is not None + out.append(f' {{{cstr(name)}, DbType::{DBTYPE[db]}, kParams{i}, {len(ps or [])}, {str(known).lower()}}},') +out.append('};') +out.append('') +out.append('// rmi_id, name, cmd_id (0 = not queued / unknown), proc indexes (-1 = none)') +out.append('static const RmiDef kRmis[] = {') +for r in rmi: + idx = [used.index(p.lower()) for p in filter(None, r['procs'].split(',')) if p.lower() in used] + idx = (idx + [-1, -1, -1])[:3] + missing = [p for p in filter(None, r['procs'].split(',')) if procs[p.lower()][2] is None] + note = f' // missing in schema: {",".join(missing)}' if missing else '' + out.append(f' {{{r["rmi_id"]}, {cstr(r["rmi_name"])}, {r["cmd_id"] or 0}, ' + f'{{{idx[0]}, {idx[1]}, {idx[2]}}}}},{note}') +out.append('};') +os.makedirs(os.path.dirname(OUT), exist_ok=True) +open(OUT, 'w').write('\n'.join(out) + '\n') +print(f'{len(used)} procedures, {len(rmi)} RMIs -> {OUT}') diff --git a/docs/DATABASE.md b/docs/DATABASE.md index 4d3a001e..2b84d122 100644 --- a/docs/DATABASE.md +++ b/docs/DATABASE.md @@ -114,7 +114,7 @@ Further details: `Error_ADO DB Connect.Log` (`DBC:0x1400a80c0`). - Startup (`DBC:0x140042cf0`) opens a type-2 (AUTH) and a type-3 (GAME) connection for the server itself. It also allocates write-queue arrays of - 125 slots. + 1000 slots (a 0x1f48-byte block: 125 loop iterations × 8 pointers). **Which connection each procedure uses?** The connection object passed to each `DBReq` method hasn't been traced yet. The **I** answer is: the database that diff --git a/third-party/README.md b/third-party/README.md index ca89f396..466e234a 100644 --- a/third-party/README.md +++ b/third-party/README.md @@ -95,6 +95,37 @@ ProudNet is not a separate DLL; it is linked into the server EXEs. - To re-fetch: `git archive ProudNetLibSetup-1.8.00001 ProudNet/include ProudNet-License-En.txt` from that repo into `_local/proudnet-1.8.00001/`. +- **`github.com/Nettention/ProudChatSDK` (checked 2026-10-15, `main` = tag + `1.1.0001`, commit `e0d9d6b8`).** + - **Contents:** bundles ProudNet **1.8.58849**: 185 headers, plus prebuilt + libraries for Windows (v110/v120/v140, dll), Android, iOS and + **x86_64 Linux** (`libProudNetServer.so/.a`, `libProudNetClient.so/.a`; + `__xstat` → old glibc). + - **Licence:** the repo's `LICENSE` (MIT) covers the chat SDK only; + `ProudNet/` keeps the same proprietary EULA (§1.2b). Nothing from it is + stored in this repo. + - **Headers:** identical to 1.8.00001 apart from the version banner and + translated doc comments in `ErrorType.h`. They add one error code and give + no new information beyond `_local/proudnet-1.8.00001`. + - **Compatibility with the 2013 ProudNet linked into DBCServer:** + + | Aspect | Result | Type | + |---|---|---| + | PIDL proxy ABI | Matches: `IRmiProxy` keeps `m_signature` at +0x14, which the generated constructor checks against 1 (`MS:0x140008e20`). `RmiID` is still `uint16_t`. The `PIDL compiler is incompatible` and `CStartServerParameter::m_(fast)encryptedMessageKeyLength` strings appear in both | O | + | Internal implementation | 29 of DBCServer's 63 `Proud::` RTTI classes are absent from the 1.8.58849 Linux libraries' symbols, e.g. `CTcpLayer_C`, `CUdpSocket_S`, `CUpnp`, `ICompletionPortEventSink` | O | + | Internal net version | **2013 build: 196978 (0x30172)**, the global at `DBC:0x140344d40`. It is copied into the server object at +0x220 (`DBC:0x14018fa70`, instruction at `0x14019018d`) and into the client objects (`0x1401dd3e0`, `0x1401df000`). In the connect handshake (`DBC:0x1401a8110`, `NotifyServerConnectionRequestData`) the server reads a credential byte array, a 16-byte protocol GUID and a 4-byte int, and accepts only if the GUID **and** the int equal its own. The same value appears exactly once in `.data` of all 16 EXEs (O). **1.8.58849: 197144 (0x30218)** (`CNetConfig::InternalNetVersion`, rejected via `NotifyProtocolVersionMismatch`). The values differ by 166 | O | + | Licensing | 1.8 also contains license and activation checks (`CPNLic`, `NotifyLicenseMismatch`) | S | + + - **Conclusion (I):** + - **Source-level:** usable as a header/ABI reference for PIDL-generated + stubs and proxies. + - **Wire-level:** **not** compatible with the original 2013 peers. The + internal net versions differ (196978 vs 197144), and the 2013 handshake + requires an exact match. This is O for the 2013 server side; I for the + 1.8 side, which was not traced beyond the symbol name. + - **Linking:** linking `libProudNetServer.so` into `src/dbc_server` + would require accepting the EULA and a licence, and would give a + ProudNet 1.8 server that the original binaries likely cannot talk to. Vendor attributions for XTrap (WiseLogic) and Apex are inferred from DLL names, not corroborated by decompilation. From 31ff800b2afcaf5884d463430f02108ae649ed9b Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Thu, 15 Oct 2026 09:08:48 -0400 Subject: [PATCH 2/2] remove src recomp --- .gitignore | 2 - AGENTS.md | 1 - decomp/Agent_Release_x64/evidence.md | 2 + decomp/Agent_Release_x64/porting.md | 55 + decomp/DBCServer_Release_x64/evidence.md | 2 + decomp/DBCServer_Release_x64/porting.md | 91 ++ decomp/DBCServer_Release_x64/procs_used.tsv | 1215 +++++++++++++++++++ decomp/INVENTORY.md | 2 +- decomp/scripts/gen_dbc_tables.py | 78 +- docs/WORKFLOW.md | 22 +- src/README.md | 52 - src/agent_release/README.md | 65 - src/agent_release/agent.cpp | 125 -- src/agent_release/agent.hpp | 82 -- src/agent_release/main.cpp | 70 -- src/agent_release/meson.build | 6 - src/agent_release/platform.cpp | 126 -- src/agent_release/platform.hpp | 39 - src/meson.build | 7 - 19 files changed, 1398 insertions(+), 644 deletions(-) create mode 100644 decomp/Agent_Release_x64/porting.md create mode 100644 decomp/DBCServer_Release_x64/porting.md create mode 100644 decomp/DBCServer_Release_x64/procs_used.tsv delete mode 100644 src/README.md delete mode 100644 src/agent_release/README.md delete mode 100644 src/agent_release/agent.cpp delete mode 100644 src/agent_release/agent.hpp delete mode 100644 src/agent_release/main.cpp delete mode 100644 src/agent_release/meson.build delete mode 100644 src/agent_release/platform.cpp delete mode 100644 src/agent_release/platform.hpp delete mode 100644 src/meson.build diff --git a/.gitignore b/.gitignore index e31c7977..9e56d797 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,3 @@ ghidra # Licence-restricted vendor material, local reference only (see third-party/README.md) third-party/_local/ -# Meson build output -src/build/ diff --git a/AGENTS.md b/AGENTS.md index 7583082a..4d46c224 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,7 +45,6 @@ code. | `schema/` | SQL Server database schema/log files (`.mdf` / `.ldf`) for `RustyHearts`, `RustyHearts_Account`, `RustyHearts_Auth`, `RustyHearts_Log`, `GMRustyHearts` | **Read-only.** Never modify. Gitignored. | | `decomp/` | Raw decompilation objects exported from Ghidra/REA (pseudocode, listings, function metadata) | Derived output. Regenerable; created on demand. | | `.agents/skills/` | Installed agent skills, notably `reverse-engineer-anything` (REA) | Agent configuration. | -| `src/` | Linux C++ reconstructions of analysed binaries (Meson; one sub-folder per binary, e.g. `agent_release/`). Build: `cd src && meson setup build && ninja -C build` | Hand-written; cite decomp addresses; `src/build/` is gitignored. | | `docs/` | Project documentation, e.g. `ARCHITECTURE.md` (language/toolchain, libraries, code conventions) | Hand-maintained; update as findings are confirmed. | | `third-party/` | Upstream sources/headers matched to the shipped support DLLs (OpenSSL 1.0.0d, curl 7.21.4, BugTrap ~1.3, mingw-w64 `dbghelp.h`, TinyXML 2.5.x) | Reference only, not build inputs. Do not edit upstream files; record provenance changes in the doc below. | diff --git a/decomp/Agent_Release_x64/evidence.md b/decomp/Agent_Release_x64/evidence.md index 58cbfaf3..f01e5f5d 100644 --- a/decomp/Agent_Release_x64/evidence.md +++ b/decomp/Agent_Release_x64/evidence.md @@ -16,6 +16,8 @@ per class (e.g. `MagiAgentNetwork`, `MGAgentManagerSession`) indicate multiple inheritance. Statically linked C++ libraries: ProudNet, TinyXML (`TiXml*`), ATL. ## Outputs + +Porting spec (Win32 → Linux substitutions, behaviour to reproduce, original bugs): `porting.md`. | Path | Content | |---|---| | `full/functions/.c` | Ghidra pseudocode for all 6,423 non-thunk functions (1 failed; see `full/index.tsv`). Includes library code (ProudNet, TinyXML, CRT) — not yet labelled. | diff --git a/decomp/Agent_Release_x64/porting.md b/decomp/Agent_Release_x64/porting.md new file mode 100644 index 00000000..f3f96b03 --- /dev/null +++ b/decomp/Agent_Release_x64/porting.md @@ -0,0 +1,55 @@ +# Agent_Release_x64.exe — porting spec (Win32 → Linux) + +This was kept from the removed Linux reconstruction `src/agent_release/` +(removed 2026-10-15). It records the facts about the original binary that a +re-implementation needs, and the nearest Linux equivalent for each Win32 call. + +Sources: `evidence.md`, `cpp/AgentProcessControl.cpp`. Names are inferred; +the behaviour is static-analysis evidence only. + +## Behaviour to reproduce + +The servers being managed are read from config (`option\*.xml`, mapping not +yet recovered). + +| Item | Behaviour | +|---|---| +| Single instance (`0x1400100b0`) | Named mutex `Global\RustyHearts_Agent` | +| Launch (`0x1400094e0`) | `CreateProcessW(NULL, " ", …, CREATE_NEW_CONSOLE, …, workDir)`, console 700×110, fill attribute 0x17. Command line is limited to 260 characters (`MAX_PATH`). Returns the pid, or 0 on failure (logs `=======Server Fail=======`) | +| After each launch attempt | `Sleep(1000)` | +| Command line (`0x140008ea0`) | ` `. An alternative argument builder `FUN_140027540` exists, but its output is unknown | +| Watcher (`0x140008c90`) | Polls `GetExitCodeProcess` every 10 ms. On exit it sends two RMIs to AgentManager, then relaunches if the per-server revive flag (+0xd5) or the global flag (+0x171) is set | +| Kill (`0x140009780`) | Toolhelp32 snapshot, case-insensitive image-name match, terminates the **first** match only (`TerminateProcess(h,0)`) | +| Main loop (`0x1400037a0`) | 100 ms tick, 1 s FPS counter. Optionally auto-starts servers after a configured delay (+0x178). At startup it kills a stale process of type 0x18 (identity unknown) | + +## Win32 → Linux substitutions + +| Original (address) | Win32 | Linux replacement | Behaviour difference | +|---|---|---|---| +| Single instance (`0x1400100b0`) | `CreateMutexW("Global\\RustyHearts_Agent")` | `flock(LOCK_EX\|LOCK_NB)` on `/tmp/RustyHearts_Agent.lock` | Lock file instead of a kernel object; still released on exit or crash | +| Launch (`0x1400094e0`) | `CreateProcessW(…, CREATE_NEW_CONSOLE, …, workDir)` + `STARTUPINFOW` console geometry | `posix_spawnp` + `POSIX_SPAWN_SETSID` + `posix_spawn_file_actions_addchdir_np` (glibc ≥ 2.29) | No console window; the command line is split on whitespace (no Windows quoting rules) | +| Watcher (`0x140008c90`) | `GetExitCodeProcess` polled every 10 ms | blocking `waitpid` on a detached thread | No polling. Reaping fixes the original handle leak; passing the pid by value fixes the original stack-pointer race | +| Kill (`0x140009780`) | Toolhelp32 + `OpenProcess` + `TerminateProcess(h,0)` | scan `/proc/*/cmdline` for the argv[0] basename with `strcasecmp`, then `kill(SIGKILL)` | Same rule: first match only, case-insensitive | +| Main-loop timer | `QueryPerformanceCounter` (`TimeSourceHRWin32`) | `std::chrono::steady_clock` | — | +| Thread start | `_beginthreadex` | `std::thread` | — | +| `Sleep` | `Sleep` | `std::this_thread::sleep_for` | — | +| Shutdown | console menu (`FUN_140001dc0`, not analysed) | `SIGINT` / `SIGTERM` | Different trigger | + +## Original bugs (O) + +- **Process handle leak:** the watcher never closes the process handle. +- **Stack-pointer race:** `LaunchProcess` hands the watcher a pointer to a + stack `PROCESS_INFORMATION`. It is only safe because of the + `Sleep(1000)` that follows. +- **Snapshot handle leak:** `KillProcessByName` leaks the snapshot handle on + the success path. + +## Unknown / not recovered + +- **ProudNet RMI to AgentManager and the game servers:** proprietary + transport. Wire-incompatible with ProudNet 1.8 (see the ProudNet section of + `third-party/README.md`). The proxy vtable slots used are `+0x40` and `+0x50`. +- **XML config field mapping** for the Agent. +- **`FUN_140027540` argument builder; the `type == 1` exit follow-up + (`FUN_140009f20`); the type 0x18 process killed at startup.** +- **Locking around the server table:** not visible in the analysed code. diff --git a/decomp/DBCServer_Release_x64/evidence.md b/decomp/DBCServer_Release_x64/evidence.md index 97cd723c..9257f9b7 100644 --- a/decomp/DBCServer_Release_x64/evidence.md +++ b/decomp/DBCServer_Release_x64/evidence.md @@ -13,6 +13,8 @@ Shared conclusions are in `docs/DATABASE.md` and `docs/CONFIG.md`. This ledger holds the binary-specific evidence. ## Outputs + +Porting spec (Win32 → Linux substitutions, behaviour to reproduce, original bugs): `porting.md`. | Path | Content | |---|---| | `full/functions/*.c`, `full/index.tsv` | 20,334 functions. 2 failed: `0x14000e4d0` (SERVERS2DBC stub dispatcher, timeout) and `0x1400a8190` (worker command dispatcher, flow limit) | diff --git a/decomp/DBCServer_Release_x64/porting.md b/decomp/DBCServer_Release_x64/porting.md new file mode 100644 index 00000000..0f6eb562 --- /dev/null +++ b/decomp/DBCServer_Release_x64/porting.md @@ -0,0 +1,91 @@ +# DBCServer_Release_x64.exe — porting spec (Win32 → Linux) + +This was kept from the removed Linux reconstruction `src/dbc_server/` +(removed 2026-10-15). It records the facts about the original binary that a +re-implementation needs, and the nearest Linux equivalent for each Win32 call. + +Sources: `evidence.md`, `docs/DATABASE.md`, `docs/CONFIG.md`. Static analysis +only. + +## Structure to reproduce + +``` +peer ──SERVERS2DBC RMI {rmi_id, …}──▶ stub handler (e.g. 0x140050d20: ++per-RMI counter) + │ push {size, cmd 1001–1317, args} + ▼ + write queue [idx < 1000] (0x140144730; else "Invalid Queue Index") + │ critical section + semaphore, 1 worker per queue + ▼ + worker switch (cmd - 1001) (0x1400a8190, jump table 0x1400a9dd4) + ▼ + CDBLobbyWriteQuery::DBReq* (e.g. 0x1400acbb0) — ADODB.Command "dbo.up_xxx" + ▼ + reply via DBC2SERVERS proxy (76 RMIs, 0x2af9–0x2b46) +``` + +- **Data tables:** + - The RMI → command → procedure mapping is in `rmi_to_proc.tsv`, and the + command dispatch in `cmd_dispatch.tsv`. + - Procedure parameters (names, SQL types, OUTPUT flags) are in + `decomp/schema//routines.tsv`. + - `decomp/scripts/gen_dbc_tables.py` joins them into `procs_used.tsv`. +- **Queue array:** a 0x1f48-byte block holding 1000 pointers. How queue slots + are created has not been decoded. +- **Connections (`0x1400a7aa0`):** + - Type 1 WEB = `db_web`, 2 AUTH = `db_account`, 3 GAME = `db_game`, + 4 GAME LOG = `db_game_log`. + - A timeout of 0 becomes 500. + - A string longer than 255 characters gives `Error … String Max.!`. + - **AUTH uses the WEB timeout** (+0x134); this is an original bug. +- **Startup (`0x140042cf0`):** opens AUTH and GAME connections, then + `up_read_world_server` reads the world list. +- **Connect failure (`0x1400a80c0`):** + `DB Connect failed\n Connection String = %s` is appended to + `Error_ADO DB Connect.Log`. The original writes the password verbatim. +- **Procedure error:** `ADO_ON_ERROR : [ %s ] Proc [ %s ]` with source file + and line (catch funclets, `dbreq_methods.tsv`). +- **Single instance:** mutex `Global\RustyHearts_DBC`. +- **Startup modes:** a numeric `argv[1]` selects agent mode (`total_option.xml` + ``); otherwise `argv[1]` is the path of the per-server XML + (`docs/CONFIG.md`). + +## Win32 → Linux substitutions + +| Original (address) | Win32 / library | Nearest Linux equivalent | Notes | +|---|---|---|---| +| Single instance | `CreateMutexW("Global\\RustyHearts_DBC")` | `flock(LOCK_EX\|LOCK_NB)` on `$TMPDIR/RustyHearts_DBC.lock` | Lock file instead of a kernel object | +| DB access (`0x1400a7aa0`, `0x1400a80c0`, `DBReq*`) | ADO `_Connection` / `ADODB.Command` over `SQLOLEDB`, `CoInitialize`, `_com_issue_errorex` | ODBC: unixODBC + Microsoft ODBC Driver 18, or FreeTDS `libtdsodbc` | Call as `{? = call dbo.proc(?,…)}` with positional parameters (ADO uses named ones); GUIDs in SQL Server byte order. ODBC 18 needs `TrustServerCertificate=yes`, because SQLOLEDB never validated TLS. FreeTDS needs `Port=` (not `host,port`) and `TDS_Version=7.4` | +| ADO connection string | `Provider=SQLOLEDB;Data Source;Initial Catalog;User ID;Password` | `Driver={…};Server;Database;UID;PWD` | Keys map 1:1. Treating the XML `timeout` as milliseconds (rounded to seconds) is an inference | +| Transport | ProudNet `CNetServer` over Winsock2/MSWSOCK/IOCP | BSD sockets / epoll | ProudNet internal net version is **196978**; 1.8 is 197144, so the protocols are incompatible. Interop would need a reimplementation of the 2013 protocol (`third-party/README.md`) | +| Write queue (`0x140144730`) | `CRITICAL_SECTION` + semaphore (`ReleaseSemaphore`) | `std::mutex` + `std::condition_variable` | — | +| Threads | `_beginthreadex` | `std::thread` | — | +| XML (`MagiServerOption`, `MagiCustomOption`) | TinyXML 2.5.x | pugixml with `parse_fragment` (the files have several top-level elements) | — | +| Console / stop | `wprintf`, console menu | stdout, `SIGINT`/`SIGTERM`; ignore `SIGPIPE` | — | +| `timeGetTime` | WINMM | `std::chrono::steady_clock` | — | +| Crash reporting | BugTrap, `MiniDumpWriteDump` | core dumps | — | + +## Prior validation of the DB mapping (2026-10-14) + +Run with the removed port against copies of the shipped `.mdf` files, on +SQL Server 2022 through FreeTDS 1.5.19: +- `up_read_world_server` returned 1 row. +- `REQ_READ_ALL_GUILD(10101)` returned the guild row. +- `REQ_UPDATE_CHARACTER_HEARTS(guid, n)` updated + `CharacterTable.Hearts` (then reverted). +- `REQ_INVEN_SLOT` failed with "Could not find stored procedure", confirming + that procedure is missing from the shipped schema. + +This validates the mapping and the parameter types against the schema. It +says nothing about the original binary's runtime behaviour. + +## Unknown / not recovered + +- **RMI argument marshalling** (ProudNet) and the per-`DBReq` post-processing + of recordsets (e.g. `FIRST_CHARACTER` in `0x1400acbb0`). +- **52 RMIs without a procedure mapping**, mostly log, logout and auth. +- **Some mappings may be wrong:** those found two call levels deep, e.g. + `REQ_CHARACTER_READ_ALL_DATA` → `up_read_Inquiry_character`. +- **Which connection each queue/`DBReq` uses:** inferred from the database + that holds the procedure. +- **Queue-slot creation; agent-mode address/port** (pushed by the Agent over + RMI); the `guildlobby`, `channel` and `Option` elements. diff --git a/decomp/DBCServer_Release_x64/procs_used.tsv b/decomp/DBCServer_Release_x64/procs_used.tsv new file mode 100644 index 00000000..443732a5 --- /dev/null +++ b/decomp/DBCServer_Release_x64/procs_used.tsv @@ -0,0 +1,1215 @@ +proc db rmis param_no param sql_type max_length is_output +up_add_ban RustyHearts REQ_ADD_BAN 1 @character_id uniqueidentifier 16 0 +up_add_ban RustyHearts REQ_ADD_BAN 2 @ban_name nvarchar 32 0 +up_add_ban RustyHearts REQ_ADD_BAN 3 @ban_memo nvarchar 64 0 +up_add_character_title RustyHearts REQ_ADD_CHARACTER_TITLE 1 @character_id uniqueidentifier 16 0 +up_add_character_title RustyHearts REQ_ADD_CHARACTER_TITLE 2 @new_id uniqueidentifier 16 0 +up_add_character_title RustyHearts REQ_ADD_CHARACTER_TITLE 3 @title_code int 4 0 +up_add_character_title RustyHearts REQ_ADD_CHARACTER_TITLE 4 @remain_time int 4 0 +up_add_character_title RustyHearts REQ_ADD_CHARACTER_TITLE 5 @expire_time int 4 0 +up_add_friend RustyHearts REQ_ADD_FRIEND 1 @character_id uniqueidentifier 16 0 +up_add_friend RustyHearts REQ_ADD_FRIEND 2 @friend_name nvarchar 32 0 +up_add_inquiry_count RustyHearts_Auth REQ_ADD_INQUIRY_COUNT 1 @auth_id uniqueidentifier 16 0 +up_add_inquiry_count RustyHearts_Auth REQ_ADD_INQUIRY_COUNT 2 @auth_id uniqueidentifier 16 0 +up_all_delete_quest RustyHearts REQ_ALL_DELETE_QUEST 1 @character_id uniqueidentifier 16 0 +up_auth_agentaccount RustyHearts_Auth REQ_GM_AUTH 1 @Account nvarchar 32 0 +up_auth_agentaccount RustyHearts_Auth REQ_GM_AUTH 2 @Password nvarchar 64 0 +up_character_rob RustyHearts REQ_CHARACTER_ROB 1 @bcust_id nvarchar 100 0 +up_character_rob RustyHearts REQ_CHARACTER_ROB 2 @auth_id uniqueidentifier 16 0 +up_character_rob RustyHearts REQ_CHARACTER_ROB 3 @name nvarchar 32 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 1 @auth_id uniqueidentifier 16 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 2 @page_index int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 3 @slot_index int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 4 @item_id uniqueidentifier 16 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 5 @code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 6 @use_cnt int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 7 @remain_time int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 8 @gcode int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 9 @durability int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 10 @enhance_level int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 11 @option_1_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 12 @option_1_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 13 @option_2_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 14 @option_2_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 15 @option_3_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 16 @option_3_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 17 @OptionGroup int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 18 @ReconNum int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 19 @ReconState int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 20 @Socket_count int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 21 @Socket_1_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 22 @Socket_1_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 23 @Socket_2_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 24 @Socket_2_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 25 @Socket_3_code int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 26 @Socket_3_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 27 @expire_time int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 28 @activity_value int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 29 @socket_1_color tinyint 1 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 30 @socket_2_color tinyint 1 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 31 @socket_3_color tinyint 1 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 32 @rank tinyint 1 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 33 @acquireroute tinyint 1 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 34 @physical int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 35 @magical int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 36 @durabilitymax int 4 0 +up_create_account_storage_item RustyHearts REQ_CREATE_ACCOUNT_STORAGE_ITEM 37 @weight int 4 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 1 @bcust_id nvarchar 100 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 2 @auth_id uniqueidentifier 16 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 3 @char_id uniqueidentifier 16 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 4 @name nvarchar 32 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 5 @class int 4 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 6 @server smallint 2 0 +up_create_character RustyHearts REQ_CHARACTER_CREATE 7 @lobby_id int 4 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 1 @guild_name nvarchar 40 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 2 @character_id uniqueidentifier 16 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 3 @guild_id uniqueidentifier 16 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 4 @master_name nvarchar 32 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 5 @cost_money int 4 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 6 @server smallint 2 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 7 @max_member int 4 0 +up_create_guild RustyHearts REQ_CREATE_GUILD 8 @group_id smallint 2 0 +up_create_guild_storage RustyHearts REQ_CREATE_GUILD_STORAGE 1 @guild_id uniqueidentifier 16 0 +up_create_guild_storage RustyHearts REQ_CREATE_GUILD_STORAGE 2 @character_id uniqueidentifier 16 0 +up_create_guild_storage RustyHearts REQ_CREATE_GUILD_STORAGE 3 @slot_count int 4 0 +up_create_guild_storage RustyHearts REQ_CREATE_GUILD_STORAGE 4 @cost_money int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 1 @character_id uniqueidentifier 16 0 +up_create_item RustyHearts REQ_INSERT_ITEM 2 @auth_id uniqueidentifier 16 0 +up_create_item RustyHearts REQ_INSERT_ITEM 3 @page_index int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 4 @slot_index int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 5 @item_id uniqueidentifier 16 0 +up_create_item RustyHearts REQ_INSERT_ITEM 6 @code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 7 @use_cnt int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 8 @remain_time int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 9 @gcode int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 10 @durability int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 11 @enhance_level int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 12 @option_1_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 13 @option_1_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 14 @option_2_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 15 @option_2_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 16 @option_3_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 17 @option_3_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 18 @OptionGroup int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 19 @ReconNum int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 20 @ReconState int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 21 @Socket_count int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 22 @Socket_1_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 23 @Socket_1_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 24 @Socket_2_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 25 @Socket_2_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 26 @Socket_3_code int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 27 @Socket_3_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 28 @expire_time int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 29 @activity_value int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 30 @link_id uniqueidentifier 16 0 +up_create_item RustyHearts REQ_INSERT_ITEM 31 @socket_1_color tinyint 1 0 +up_create_item RustyHearts REQ_INSERT_ITEM 32 @socket_2_color tinyint 1 0 +up_create_item RustyHearts REQ_INSERT_ITEM 33 @socket_3_color tinyint 1 0 +up_create_item RustyHearts REQ_INSERT_ITEM 34 @deferment_time int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 35 @rank tinyint 1 0 +up_create_item RustyHearts REQ_INSERT_ITEM 36 @acquireroute tinyint 1 0 +up_create_item RustyHearts REQ_INSERT_ITEM 37 @physical int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 38 @magical int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 39 @durabilitymax int 4 0 +up_create_item RustyHearts REQ_INSERT_ITEM 40 @weight int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 1 @pet_id uniqueidentifier 16 0 +up_create_pet RustyHearts REQ_PET_CREATE 2 @character_id uniqueidentifier 16 0 +up_create_pet RustyHearts REQ_PET_CREATE 3 @AuthID uniqueidentifier 16 0 +up_create_pet RustyHearts REQ_PET_CREATE 4 @server smallint 2 0 +up_create_pet RustyHearts REQ_PET_CREATE 5 @Name nvarchar 32 0 +up_create_pet RustyHearts REQ_PET_CREATE 6 @Job int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 7 @inventory_count tinyint 1 0 +up_create_pet RustyHearts REQ_PET_CREATE 8 @Expire_Time int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 9 @Vital int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 10 @Intelligence int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 11 @Strength int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 12 @Resilient int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 13 @Eloquence int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 14 @Charm int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 15 @Temper int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 16 @fHeight float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 17 @fWeight float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 18 @hp int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 19 @mp int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 20 @physical_attack float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 21 @physical_defence float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 22 @magical_attack float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 23 @magical_defence float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 24 @loyalty float 8 0 +up_create_pet RustyHearts REQ_PET_CREATE 25 @Level int 4 0 +up_create_pet RustyHearts REQ_PET_CREATE 26 @exp int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 1 @pet_id uniqueidentifier 16 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 2 @auth_id uniqueidentifier 16 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 3 @page_index int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 4 @slot_index int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 5 @item_id uniqueidentifier 16 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 6 @code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 7 @use_cnt int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 8 @remain_time int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 9 @gcode int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 10 @durability int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 11 @enhance_level int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 12 @option_1_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 13 @option_1_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 14 @option_2_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 15 @option_2_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 16 @option_3_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 17 @option_3_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 18 @OptionGroup int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 19 @ReconNum int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 20 @ReconState int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 21 @Socket_count int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 22 @Socket_1_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 23 @Socket_1_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 24 @Socket_2_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 25 @Socket_2_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 26 @Socket_3_code int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 27 @Socket_3_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 28 @expire_time int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 29 @activity_value int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 30 @socket_1_color tinyint 1 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 31 @socket_2_color tinyint 1 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 32 @socket_3_color tinyint 1 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 33 @rank tinyint 1 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 34 @acquireroute tinyint 1 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 35 @physical int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 36 @magical int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 37 @durabilitymax int 4 0 +up_create_pet_inventory_item RustyHearts REQ_ADD_PET_INVENTORY_ITEM 38 @weight int 4 0 +up_del_ban RustyHearts REQ_DEL_BAN 1 @character_id uniqueidentifier 16 0 +up_del_ban RustyHearts REQ_DEL_BAN 2 @ban_id uniqueidentifier 16 0 +up_del_friend RustyHearts REQ_DEL_FRIEND 1 @character_id uniqueidentifier 16 0 +up_del_friend RustyHearts REQ_DEL_FRIEND 2 @friend_id uniqueidentifier 16 0 +up_delet_guild_storage RustyHearts REQ_GUILD_STORAGE_POP_ITEM 1 @guild_id uniqueidentifier 16 0 +up_delet_guild_storage RustyHearts REQ_GUILD_STORAGE_POP_ITEM 2 @item_id uniqueidentifier 16 0 +up_delete_account_storage_item RustyHearts REQ_DELETE_ACCOUNT_STORAGE_ITEM 1 @auth_id uniqueidentifier 16 0 +up_delete_account_storage_item RustyHearts REQ_DELETE_ACCOUNT_STORAGE_ITEM 2 @item_id uniqueidentifier 16 0 +up_delete_auctionarticle RustyHearts REQ_DELETE_AUCTIONITEM 1 @item_uid uniqueidentifier 16 0 +up_delete_buff RustyHearts REQ_DELETE_BUFF 1 @character_id uniqueidentifier 16 0 +up_delete_buff RustyHearts REQ_DELETE_BUFF 2 @buff_type int 4 0 +up_delete_buff RustyHearts REQ_DELETE_BUFF 3 @buff_id int 4 0 +up_delete_cash_effectinfo RustyHearts REQ_DELETE_CASH_EFFECTINFO 1 @item_uid uniqueidentifier 16 0 +up_delete_character RustyHearts REQ_CHARACTER_DELETE 1 @auth_id uniqueidentifier 16 0 +up_delete_character RustyHearts REQ_CHARACTER_DELETE 2 @character_id uniqueidentifier 16 0 +up_delete_character_title RustyHearts REQ_DEL_CHARACTER_TITLE 1 @character_id uniqueidentifier 16 0 +up_delete_character_title RustyHearts REQ_DEL_CHARACTER_TITLE 2 @del_title_id uniqueidentifier 16 0 +up_delete_inquiry RustyHearts_Auth REQ_DELETE_INQUIRY 1 @character_id uniqueidentifier 16 0 +up_delete_inquiry RustyHearts_Auth REQ_DELETE_INQUIRY 2 @character_id uniqueidentifier 16 0 +up_delete_mail RustyHearts REQ_MAIL_DEL 1 @mail_id uniqueidentifier 16 0 +up_delete_pet RustyHearts REQ_PET_DELETE 1 @pet_id uniqueidentifier 16 0 +up_delete_pet_inventory RustyHearts REQ_DELETE_PET_INVENTORY_ITEM 1 @pet_id uniqueidentifier 16 0 +up_delete_pet_inventory RustyHearts REQ_DELETE_PET_INVENTORY_ITEM 2 @item_id uniqueidentifier 16 0 +up_delete_quest RustyHearts REQ_DELETE_QUEST 1 @quest_uid uniqueidentifier 16 0 +up_delete_quest RustyHearts REQ_DELETE_QUEST 2 @character_id uniqueidentifier 16 0 +up_delete_rearing_info RustyHearts REQ_DELETE_REARING_INFO 1 @rearing_id uniqueidentifier 16 0 +up_equip_character_title RustyHearts REQ_EQUIP_CHARACTER_TITLE 1 @title_id uniqueidentifier 16 0 +up_equip_character_title RustyHearts REQ_EQUIP_CHARACTER_TITLE 2 @character_id uniqueidentifier 16 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 1 @bcust_id nvarchar 100 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 2 @UUID uniqueidentifier 16 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 3 @channelling int 4 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 4 @mac_addr char 17 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 5 @mac_addr02 char 17 0 +up_get_auth_id RustyHearts_Auth REQ_AUTH 6 @mac_addr03 char 17 0 +up_get_character RustyHearts REQ_CHARACTER_GET 1 @character_id uniqueidentifier 16 0 +up_get_character RustyHearts REQ_CHARACTER_GET 2 @server smallint 2 0 +up_get_character_by_name RustyHearts REQ_CHARACTER_GET_BY_NAME 1 @name nvarchar 32 0 +up_get_character_by_name RustyHearts REQ_CHARACTER_GET_BY_NAME 2 @server smallint 2 0 +up_get_character_simpleinfo RustyHearts REQ_CHARACTER_GET_SIMPLE 1 @name nvarchar 32 0 +up_get_character_simpleinfo RustyHearts REQ_CHARACTER_GET_SIMPLE 2 @server smallint 2 0 +up_get_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP_LOG 1 @guild_id uniqueidentifier 16 0 +up_get_guild_load_info RustyHearts REQ_GUILD_LOAD_INFO 1 @server smallint 2 0 +up_get_guild_skill RustyHearts REQ_GUILD_SKILL_LIST 1 @guild_id uniqueidentifier 16 0 +up_get_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO 1 @guild_id uniqueidentifier 16 0 +up_get_guild_storage_item_list RustyHearts REQ_GUILD_STORAGE_ITEM_LIST 1 @guild_id uniqueidentifier 16 0 +up_get_guild_storage_use_list RustyHearts REQ_GUILD_USE_LOG 1 @guild_id uniqueidentifier 16 0 +up_get_guild_total_count RustyHearts REQ_GUILD_TOTAL_CNT 1 @server smallint 2 0 +up_get_other_character RustyHearts REQ_OTHER_CHARACTER_INFO 1 @character_id uniqueidentifier 16 0 +up_get_other_character RustyHearts REQ_OTHER_CHARACTER_INFO 2 @server smallint 2 0 +up_get_pcroominfo RustyHearts_Auth REQ_AUTH 1 @szIP nvarchar 48 0 +up_get_second_pass RustyHearts_Auth REQ_SECOND_PASS 1 @bcust_id nvarchar 100 0 +up_guild_disband RustyHearts REQ_DISBAND_GUILD 1 @guild_id uniqueidentifier 16 0 +up_guild_disband RustyHearts REQ_DISBAND_GUILD 2 @character_id uniqueidentifier 16 0 +up_guild_leader_change RustyHearts REQ_UPDATE_GUILD_LEADER 1 @guild_id uniqueidentifier 16 0 +up_guild_leader_change RustyHearts REQ_UPDATE_GUILD_LEADER 2 @character_id uniqueidentifier 16 0 +up_guild_member_remove RustyHearts REQ_GUILD_MEMBER_REMOVE 1 @guild_id uniqueidentifier 16 0 +up_guild_member_remove RustyHearts REQ_GUILD_MEMBER_REMOVE 2 @character_id uniqueidentifier 16 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 1 @guild_id uniqueidentifier 16 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 2 @character_id uniqueidentifier 16 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 3 @slot_count int 4 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 4 @cost_money int 4 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 5 @page_count tinyint 1 0 +up_guild_storage_extension RustyHearts REQ_GUILD_STORAGE_EXTENSION 6 @level int 4 0 +up_insert_blacklist RustyHearts_Auth REQ_INSERT_BLACKIP 1 @IP nvarchar 30 0 +up_insert_blacklist RustyHearts_Auth REQ_INSERT_BLACKIP 2 @State int 4 0 +up_insert_blacklist RustyHearts_Auth REQ_INSERT_BLACKIP 3 @Cause nvarchar 100 0 +up_insert_blacklist RustyHearts_Auth REQ_INSERT_BLACKIP 4 @GmID nvarchar 30 0 +up_insert_buff RustyHearts REQ_INSERT_BUFF 1 @character_id uniqueidentifier 16 0 +up_insert_buff RustyHearts REQ_INSERT_BUFF 2 @type int 4 0 +up_insert_buff RustyHearts REQ_INSERT_BUFF 3 @id int 4 0 +up_insert_buff RustyHearts REQ_INSERT_BUFF 4 @time int 4 0 +up_insert_cash_effectinfo RustyHearts REQ_INSERT_CASH_EFFECTINFO 1 @item_id uniqueidentifier 16 0 +up_insert_cash_effectinfo RustyHearts REQ_INSERT_CASH_EFFECTINFO 2 @character_id uniqueidentifier 16 0 +up_insert_cash_effectinfo RustyHearts REQ_INSERT_CASH_EFFECTINFO 3 @package_code int 4 0 +up_insert_cash_effectinfo RustyHearts REQ_INSERT_CASH_EFFECTINFO 4 @expire_time int 4 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 1 @GiveCharName varchar 19 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 2 @ProductID uniqueidentifier 16 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 3 @AuthID uniqueidentifier 16 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 4 @CashCode int 4 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 5 @GiftRecvName nvarchar 32 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 6 @AddOpt1 int 4 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 7 @AddOpt2 int 4 0 +up_insert_cash_product_list RustyHearts REQ_INSERT_CASH_PRODUCT 8 @AddOpt3 int 4 0 +up_insert_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP 1 @guild_id uniqueidentifier 16 0 +up_insert_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP 2 @character_id uniqueidentifier 16 0 +up_insert_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP 3 @exp int 4 0 +up_insert_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP 4 @time nvarchar 40 0 +up_insert_guild_increase_exp RustyHearts REQ_GUILD_INCREASE_EXP 5 @character_name nvarchar 32 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 1 @guild_id uniqueidentifier 16 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 2 @character_id uniqueidentifier 16 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 3 @name nvarchar 32 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 4 @alias_name nvarchar 32 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 5 @grade int 4 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 6 @class int 4 0 +up_insert_guild_member RustyHearts REQ_INSERT_GUILD_MEMBER 7 @level int 4 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 1 @guild_id uniqueidentifier 16 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 2 @learn_user_id uniqueidentifier 16 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 3 @skill_table_id int 4 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 4 @skill_id int 4 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 5 @skill_level tinyint 1 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 6 @learn_cost int 4 0 +up_insert_guild_skill RustyHearts REQ_GUILD_SKILL_LEARN 7 @is_update tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 1 @item_uid uniqueidentifier 16 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 2 @character_id uniqueidentifier 16 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 3 @auth_id uniqueidentifier 16 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 4 @page_index int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 5 @slot_index int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 6 @code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 7 @use_cnt int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 8 @remain_time int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 9 @gcode int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 10 @durability int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 11 @enhance_level int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 12 @option_1_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 13 @option_1_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 14 @option_2_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 15 @option_2_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 16 @option_3_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 17 @option_3_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 18 @option_group int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 19 @ReconNum int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 20 @ReconState tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 21 @socket_count int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 22 @socket_1_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 23 @socket_1_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 24 @socket_2_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 25 @socket_2_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 26 @socket_3_code int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 27 @socket_3_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 28 @expire_time int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 29 @guild_id uniqueidentifier 16 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 30 @activity_value int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 31 @link_id uniqueidentifier 16 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 32 @socket_1_color tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 33 @socket_2_color tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 34 @socket_3_color tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 35 @rank tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 36 @acquireroute tinyint 1 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 37 @physical int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 38 @magical int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 39 @durabilitymax int 4 0 +up_insert_guild_storage RustyHearts REQ_GUILD_STORAGE_PUSH_ITEM 40 @weight int 4 0 +up_insert_guild_storage_use_log RustyHearts REQ_GUILD_STORAGE_USE_LOG 1 @guild_id uniqueidentifier 16 0 +up_insert_guild_storage_use_log RustyHearts REQ_GUILD_STORAGE_USE_LOG 2 @use_type tinyint 1 0 +up_insert_guild_storage_use_log RustyHearts REQ_GUILD_STORAGE_USE_LOG 3 @use_time nvarchar 40 0 +up_insert_guild_storage_use_log RustyHearts REQ_GUILD_STORAGE_USE_LOG 4 @character_name nvarchar 32 0 +up_insert_guild_storage_use_log RustyHearts REQ_GUILD_STORAGE_USE_LOG 5 @description nvarchar 60 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 1 @auth_id uniqueidentifier 16 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 2 @character_id uniqueidentifier 16 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 3 @type tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 4 @character_name nvarchar 32 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 5 @bcust_id nvarchar 100 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 6 @count tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 7 @memo nvarchar 510 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 8 @compulsion tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 9 @registertime datetime 8 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 10 @auth_id uniqueidentifier 16 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 11 @character_id uniqueidentifier 16 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 12 @type tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 13 @character_name nvarchar 32 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 14 @bcust_id nvarchar 100 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 15 @count tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 16 @memo nvarchar 510 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 17 @compulsion tinyint 1 0 +up_insert_inquiry RustyHearts_Auth REQ_INSERT_INQUIRY 18 @registertime datetime 8 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 1 @type tinyint 1 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 2 @character_name nvarchar 32 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 3 @memo nvarchar 510 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 4 @compulsion tinyint 1 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 5 @type tinyint 1 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 6 @character_name nvarchar 32 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 7 @memo nvarchar 510 0 +up_insert_inquiry_by_gm RustyHearts_Auth REQ_INSERT_INQUIRY_BY_GM 8 @compulsion tinyint 1 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 1 @C1 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 2 @C2 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 3 @C3 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 4 @AuthID uniqueidentifier 16 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 5 @nam1 nvarchar 32 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 6 @CharID uniqueidentifier 16 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 7 @name nvarchar 32 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 8 @S1 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 9 @S2 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 10 @S3 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 11 @S4 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 12 @S5 int 4 0 +up_insert_log_Account RustyHearts_Log REQ_LOG_ACCOUNT 13 @S6 int 4 0 +up_insert_log_auth_login NOT_IN_SCHEMA REQ_LOG_AUTH_LOGIN +up_insert_log_cash_info NOT_IN_SCHEMA REQ_LOG_CASH +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 1 @log_type int 4 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 2 @auth_id uniqueidentifier 16 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 3 @product_id uniqueidentifier 16 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 4 @productcode int 4 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 5 @productcount int 4 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 6 @bcust_id nvarchar 48 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 7 @character_name nvarchar 32 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 8 @gift_recvname nvarchar 32 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 9 @addopt1 int 4 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 10 @addopt2 int 4 0 +up_insert_log_cashbuy RustyHearts_Log REQ_CASHBUY_LOG 11 @addopt3 int 4 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 1 @log_type int 4 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 2 @intance_id uniqueidentifier 16 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 3 @world_id int 4 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 4 @dungeonid int 4 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 5 @difficulty tinyint 1 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 6 @membercountstart tinyint 1 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 7 @death tinyint 1 0 +up_insert_log_dungeon RustyHearts_Log REQ_LOG_DUNGEON 8 @rebirth tinyint 1 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 1 @log_id int 4 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 2 @log_type int 4 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 3 @world_id int 4 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 4 @end_status tinyint 1 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 5 @start_status tinyint 1 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 6 @target_bcustno nvarchar 32 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 7 @target_character nvarchar 32 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 8 @GM nvarchar 32 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 9 @former_GM nvarchar 32 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 10 @remain_number tinyint 1 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 11 @inquery_use nvarchar 2 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 12 @group_processing nvarchar 2 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 13 @post_time datetime 8 0 +up_insert_log_inquiry_complete RustyHearts_Log REQ_LOG_INQUIRY_COMPLETE 14 @start_time datetime 8 0 +up_insert_log_learnguildskill NOT_IN_SCHEMA REQ_GUILD_SKILL_LOG +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 1 @log_type int 4 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 2 @character_id uniqueidentifier 16 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 3 @skill_table_id int 4 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 4 @skill_level tinyint 1 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 5 @character_class int 4 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 6 @character_level tinyint 1 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 7 @skillpoint_use int 4 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 8 @bcustid nvarchar 32 0 +up_insert_log_learnskill RustyHearts_Log REQ_LEARNSKILL_LOG 9 @character_name nvarchar 32 0 +up_insert_log_mcu RustyHearts_Log REQ_SERVER_MCU 1 @world_id int 4 0 +up_insert_log_mcu RustyHearts_Log REQ_SERVER_MCU 2 @MCU int 4 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 1 @log_type int 4 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 2 @world_id int 4 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 3 @server_type int 4 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 4 @gm_id nvarchar 32 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 5 @command int 4 0 +up_insert_log_monitor_command RustyHearts_Log REQ_LOG_MONITOR_COMMAND 6 @server_code int 4 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 1 @log_type int 4 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 2 @world_id int 4 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 3 @target int 4 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 4 @notice_type tinyint 1 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 5 @notice_cycle tinyint 1 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 6 @notice nvarchar 510 0 +up_insert_log_monitor_notice RustyHearts_Log REQ_LOG_MONITOR_NOTICE 7 @gm_ID nvarchar 32 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 1 @log_type int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 2 @world_id int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 3 @gate int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 4 @lobby int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 5 @dungeon int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 6 @pvp int 4 0 +up_insert_log_monitor_user RustyHearts_Log REQ_LOG_MONITOR_USER 7 @total int 4 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 1 @aa int 4 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 2 @server int 4 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 3 @bb int 4 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 4 @AuthID uniqueidentifier 16 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 5 @nam1 nvarchar 32 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 6 @CharID uniqueidentifier 16 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 7 @nam nvarchar 32 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 8 @class int 4 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 9 @level smallint 2 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 10 @StartTime datetime 8 0 +up_insert_log_play_time RustyHearts_Log REQ_LOG_PLAY_TIME 11 @EndTime datetime 8 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 1 @log_type smallint 2 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 2 @room_id uniqueidentifier 16 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 3 @character_id uniqueidentifier 16 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 4 @character_name nvarchar 32 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 5 @character_class int 4 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 6 @character_job tinyint 1 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 7 @character_level int 4 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 8 @kill_id uniqueidentifier 16 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 9 @kill_name nvarchar 32 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 10 @kill_class int 4 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 11 @kill_job tinyint 1 0 +up_insert_log_pvp_death RustyHearts_Log REQ_LOG_PVP_DEATH 12 @kill_level int 4 0 +up_insert_log_pvp_ladder RustyHearts_Log REQ_LOG_PVP_LADDER +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 1 @log_type smallint 2 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 2 @auth_id uniqueidentifier 16 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 3 @character_id uniqueidentifier 16 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 4 @character_name nvarchar 32 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 5 @channel_type int 4 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 6 @room_id uniqueidentifier 16 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 7 @room_world int 4 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 8 @room_number int 4 0 +up_insert_log_pvp_room RustyHearts_Log REQ_LOG_PVP_ROOM 9 @room_name nvarchar 100 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 1 @log_type int 4 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 2 @world_id int 4 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 3 @auth_id uniqueidentifier 16 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 4 @channel_id smallint 2 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 5 @bcust_id nvarchar 48 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 6 @character_id uniqueidentifier 16 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 7 @character_name nvarchar 32 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 8 @character_class int 4 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 9 @character_job tinyint 1 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 10 @character_level tinyint 1 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 11 @quest_id int 4 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 12 @quest_type int 4 0 +up_insert_log_quest RustyHearts_Log REQ_QUEST_LOG 13 @quest_exp int 4 0 +up_insert_quest RustyHearts REQ_INSERT_QUEST 1 @quest_uid uniqueidentifier 16 0 +up_insert_quest RustyHearts REQ_INSERT_QUEST 2 @character_id uniqueidentifier 16 0 +up_insert_quest RustyHearts REQ_INSERT_QUEST 3 @instance_npc_id int 4 0 +up_insert_quest RustyHearts REQ_INSERT_QUEST 4 @quest_code int 4 0 +up_insert_quest RustyHearts REQ_INSERT_QUEST 5 @quest_state int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 1 @table_id tinyint 1 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 2 @group_id tinyint 1 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 3 @reating_id uniqueidentifier 16 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 4 @char_id uniqueidentifier 16 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 5 @type tinyint 1 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 6 @name nvarchar 32 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 7 @job tinyint 1 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 8 @level int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 9 @index tinyint 1 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 10 @actionpoint int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 11 @usedturn int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 12 @endingid int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 13 @rewarditem int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 14 @createtime bigint 8 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 15 @vital int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 16 @intelligence int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 17 @strength int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 18 @temper int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 19 @charm int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 20 @exhaust int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 21 @angry int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 22 @normal int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 23 @good int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 24 @sadness int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 25 @height int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 26 @weight int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 27 @resilent int 4 0 +up_insert_rearing_info RustyHearts REQ_INSERT_REARING_INFO 28 @eloquence int 4 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 1 @NewSkillID uniqueidentifier 16 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 2 @character_id uniqueidentifier 16 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 3 @group int 4 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 4 @slot_index int 4 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 5 @skill_table_id int 4 0 +up_insert_skill RustyHearts REQ_INSERT_SKILL 6 @skill_level int 4 0 +up_item_durability_update RustyHearts REQ_ITEM_DURABILITY_UPDATE 1 @item_id uniqueidentifier 16 0 +up_item_durability_update RustyHearts REQ_ITEM_DURABILITY_UPDATE 2 @durability int 4 0 +up_item_move_cash_to_equip RustyHearts REQ_MOVE_CASH_TO_EQUIP 1 @character_id uniqueidentifier 16 0 +up_item_move_cash_to_equip RustyHearts REQ_MOVE_CASH_TO_EQUIP 2 @auth_id uniqueidentifier 16 0 +up_item_move_cash_to_equip RustyHearts REQ_MOVE_CASH_TO_EQUIP 3 @item_id uniqueidentifier 16 0 +up_item_move_cash_to_equip RustyHearts REQ_MOVE_CASH_TO_EQUIP 4 @page_index int 4 0 +up_item_move_cash_to_equip RustyHearts REQ_MOVE_CASH_TO_EQUIP 5 @slot_index int 4 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 1 @character_id uniqueidentifier 16 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 2 @auth_id uniqueidentifier 16 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 3 @item_id uniqueidentifier 16 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 4 @page_index int 4 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 5 @slot_index int 4 0 +up_item_move_cash_to_equip_costumepack RustyHearts REQ_MOVE_CASH_TO_EQUIP_COSTUMEPACK 6 @itemCode int 4 0 +up_item_move_equip_to_cash RustyHearts REQ_MOVE_EQUIP_TO_CASH 1 @character_id uniqueidentifier 16 0 +up_item_move_equip_to_cash RustyHearts REQ_MOVE_EQUIP_TO_CASH 2 @auth_id uniqueidentifier 16 0 +up_item_move_equip_to_cash RustyHearts REQ_MOVE_EQUIP_TO_CASH 3 @item_id uniqueidentifier 16 0 +up_item_move_equip_to_cash RustyHearts REQ_MOVE_EQUIP_TO_CASH 4 @page_index int 4 0 +up_item_move_equip_to_cash RustyHearts REQ_MOVE_EQUIP_TO_CASH 5 @slot_index int 4 0 +up_item_move_equip_to_inventory RustyHearts REQ_MOVE_EQUIP_TO_INVENTORY 1 @character_id uniqueidentifier 16 0 +up_item_move_equip_to_inventory RustyHearts REQ_MOVE_EQUIP_TO_INVENTORY 2 @auth_id uniqueidentifier 16 0 +up_item_move_equip_to_inventory RustyHearts REQ_MOVE_EQUIP_TO_INVENTORY 3 @item_id uniqueidentifier 16 0 +up_item_move_equip_to_inventory RustyHearts REQ_MOVE_EQUIP_TO_INVENTORY 4 @page_index int 4 0 +up_item_move_equip_to_inventory RustyHearts REQ_MOVE_EQUIP_TO_INVENTORY 5 @slot_index int 4 0 +up_item_move_inventory_to_equip RustyHearts REQ_MOVE_INVENTORY_TO_EQUIP 1 @character_id uniqueidentifier 16 0 +up_item_move_inventory_to_equip RustyHearts REQ_MOVE_INVENTORY_TO_EQUIP 2 @auth_id uniqueidentifier 16 0 +up_item_move_inventory_to_equip RustyHearts REQ_MOVE_INVENTORY_TO_EQUIP 3 @item_id uniqueidentifier 16 0 +up_item_move_inventory_to_equip RustyHearts REQ_MOVE_INVENTORY_TO_EQUIP 4 @page_index int 4 0 +up_item_move_inventory_to_equip RustyHearts REQ_MOVE_INVENTORY_TO_EQUIP 5 @slot_index int 4 0 +up_item_move_pet_inventory_to_inventory NOT_IN_SCHEMA REQ_MOVE_PET_INVEN_TO_INVEN +up_item_owner_update RustyHearts REQ_ITEM_OWNER_UPDATE 1 @character_id uniqueidentifier 16 0 +up_item_owner_update RustyHearts REQ_ITEM_OWNER_UPDATE 2 @auth_id uniqueidentifier 16 0 +up_item_owner_update RustyHearts REQ_ITEM_OWNER_UPDATE 3 @item_id uniqueidentifier 16 0 +up_item_page_owner_update RustyHearts REQ_ITEM_PAGE_OWNER_UPDATE 1 @character_id uniqueidentifier 16 0 +up_item_page_owner_update RustyHearts REQ_ITEM_PAGE_OWNER_UPDATE 2 @auth_id uniqueidentifier 16 0 +up_item_page_owner_update RustyHearts REQ_ITEM_PAGE_OWNER_UPDATE 3 @item_id uniqueidentifier 16 0 +up_item_page_owner_update RustyHearts REQ_ITEM_PAGE_OWNER_UPDATE 4 @page_index int 4 0 +up_item_page_owner_update RustyHearts REQ_ITEM_PAGE_OWNER_UPDATE 5 @slot_index int 4 0 +up_item_page_slot_update RustyHearts REQ_ITEM_PAGE_SLOT_UPDATE 1 @character_id uniqueidentifier 16 0 +up_item_page_slot_update RustyHearts REQ_ITEM_PAGE_SLOT_UPDATE 2 @auth_id uniqueidentifier 16 0 +up_item_page_slot_update RustyHearts REQ_ITEM_PAGE_SLOT_UPDATE 3 @item_id uniqueidentifier 16 0 +up_item_page_slot_update RustyHearts REQ_ITEM_PAGE_SLOT_UPDATE 4 @page_index int 4 0 +up_item_page_slot_update RustyHearts REQ_ITEM_PAGE_SLOT_UPDATE 5 @slot_index int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 1 @character_id uniqueidentifier 16 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 2 @auth_id uniqueidentifier 16 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 3 @item_id uniqueidentifier 16 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 4 @use_cnt int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 5 @remain_time int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 6 @enhance_level int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 7 @durability int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 8 @sock_optcode01 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 9 @sock_value01 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 10 @sock_optcode02 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 11 @sock_value02 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 12 @sock_optcode03 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 13 @sock_value03 int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 14 @expiretime int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 15 @activity_value int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 16 @socket_1_color tinyint 1 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 17 @socket_2_color tinyint 1 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 18 @socket_3_color tinyint 1 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 19 @deferment_time int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 20 @rank tinyint 1 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 21 @acquireroute tinyint 1 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 22 @physical int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 23 @magical int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 24 @durabilitymax int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 25 @weight int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 26 @socket_count int 4 0 +up_item_update RustyHearts REQ_ITEM_UPDATE 27 @option_group int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 1 @item_id uniqueidentifier 16 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 2 @item_code int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 3 @opt_code01 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 4 @opt_code02 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 5 @opt_code03 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 6 @opt_value01 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 7 @opt_value02 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 8 @opt_value03 int 4 0 +up_item_update_itemcode_option RustyHearts REQ_ITEM_UPDATE_CODE_OPTION 9 @unknonw_param int 4 0 +up_mail_gold_payment RustyHearts REQ_MAIL_GOLD_PAYMAENT 1 @mail_id uniqueidentifier 16 0 +up_mail_gold_payment RustyHearts REQ_MAIL_GOLD_PAYMAENT 2 @msg nvarchar 700 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 1 @mail_id uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 2 @item_id01 uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 3 @page_01 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 4 @slot_01 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 5 @over_item_id01 uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 6 @item_id02 uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 7 @page_02 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 8 @slot_02 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 9 @over_item_id02 uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 10 @item_id03 uniqueidentifier 16 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 11 @page_03 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 12 @slot_03 int 4 0 +up_mail_item_move RustyHearts REQ_MAIL_ITEM_MOVE 13 @over_item_id03 uniqueidentifier 16 0 +up_mail_return RustyHearts REQ_MAIL_RETURN 1 @mail_id uniqueidentifier 16 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 1 @pet_id uniqueidentifier 16 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 2 @auth_id uniqueidentifier 16 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 3 @item_id uniqueidentifier 16 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 4 @use_cnt int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 5 @remain_time int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 6 @enhance_level int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 7 @durability int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 8 @sock_optcode01 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 9 @sock_value01 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 10 @sock_optcode02 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 11 @sock_value02 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 12 @sock_optcode03 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 13 @sock_value03 int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 14 @expiretime int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 15 @activity_value int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 16 @socket_1_color tinyint 1 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 17 @socket_2_color tinyint 1 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 18 @socket_3_color tinyint 1 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 19 @rank tinyint 1 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 20 @acquireroute tinyint 1 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 21 @physical int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 22 @magical int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 23 @durabilitymax int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 24 @weight int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 25 @page_index int 4 0 +up_pet_item_update RustyHearts REQ_PET_ITEM_UPDATE 26 @slot_index int 4 0 +up_read_account_storage RustyHearts REQ_READ_ACCOUNT_STORAGE_ITEM 1 @auth_id uniqueidentifier 16 0 +up_read_all_auctionlist RustyHearts REQ_READ_ALL_AUCTIONLIST +up_read_all_guild RustyHearts REQ_READ_ALL_GUILD 1 @server int 4 0 +up_read_all_item_dropgroup RustyHearts REQ_READ_ALL_ITEM_DROPGROUP +up_read_auth_blacklist RustyHearts_Auth REQ_READ_AUTH_BLACKLISTIP +up_read_auth_pcroom RustyHearts_Auth REQ_READ_AUTH_PCROOMIP +up_read_buff RustyHearts REQ_READ_BUFF 1 @character_id uniqueidentifier 16 0 +up_read_cash_product_list RustyHearts REQ_READ_CASH_PRODUCT_LIST 1 @auth_id uniqueidentifier 16 0 +up_read_extern_cash NOT_IN_SCHEMA REQ_EXTERN_CASH_BALANCE +up_read_friend_list RustyHearts REQ_FRIEND_LIST 1 @character_id uniqueidentifier 16 0 +up_read_guild RustyHearts REQ_READ_GUILD 1 @guild_id uniqueidentifier 16 0 +up_read_guild_member RustyHearts REQ_READ_GUILD_MEMBER 1 @guild_id uniqueidentifier 16 0 +up_read_guild_server RustyHearts REQ_READ_GUILD_SERVER 1 @group_id smallint 2 0 +up_read_guild_server RustyHearts REQ_READ_GUILD_SERVER 2 @server smallint 2 0 +up_read_inquiry RustyHearts_Auth REQ_READ_INQUIRY +up_read_inquiry_character RustyHearts_Auth REQ_CHARACTER_READ_ALL_DATA 1 @character_id uniqueidentifier 16 0 +up_read_inquiry_character RustyHearts_Auth REQ_CHARACTER_READ_ALL_DATA 2 @character_id uniqueidentifier 16 0 +up_read_item_equip_simple RustyHearts REQ_CHARACTER_EQUIP_ITEM 1 @character_id uniqueidentifier 16 0 +up_read_item_inventory_slot NOT_IN_SCHEMA REQ_INVEN_SLOT +up_read_mail RustyHearts REQ_MAIL_LIST 1 @character_id uniqueidentifier 16 0 +up_read_new_mail RustyHearts REQ_MAIL_NEW_LIST 1 @character_id uniqueidentifier 16 0 +up_read_new_mail_exist RustyHearts REQ_MAIL_NEW_EXIST 1 @character_id uniqueidentifier 16 0 +up_read_pc_room_point RustyHearts_Auth REQ_PC_ROOM_POINT 1 @AuthID uniqueidentifier 16 0 +up_read_pet RustyHearts REQ_PET_READLIST 1 @character_id uniqueidentifier 16 0 +up_read_pet_inventory RustyHearts REQ_READ_PET_INVENTORY_ITEM 1 @pet_id uniqueidentifier 16 0 +up_read_realtimeevent RustyHearts_Auth REQ_REAL_TIME_EVENT +up_read_rearing_listinfo RustyHearts REQ_READ_REARING_LISTINFO 1 @cha_uid uniqueidentifier 16 0 +up_read_reward RustyHearts REQ_READ_REWARD 1 @type tinyint 1 0 +up_read_reward RustyHearts REQ_READ_REWARD 2 @grade int 4 0 +up_read_skill RustyHearts REQ_READ_SKILL 1 @character_id uniqueidentifier 16 0 +up_read_uni_account_info RustyHearts REQ_CHARACTER_LIST 1 @auth_id uniqueidentifier 16 0 +up_read_world_server RustyHearts_Auth REQ_READ_WORLD_SERVER +up_save_inventory_storage_money RustyHearts REQ_SAVE_INVENTORY_STORAGE_MONEY 1 @character_id uniqueidentifier 16 0 +up_save_inventory_storage_money RustyHearts REQ_SAVE_INVENTORY_STORAGE_MONEY 2 @inven_gold int 4 0 +up_save_inventory_storage_money RustyHearts REQ_SAVE_INVENTORY_STORAGE_MONEY 3 @storage_gold int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 1 @character_id uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 2 @type_01 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 3 @item_id_01 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 4 @type_02 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 5 @item_id_02 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 6 @type_03 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 7 @item_id_03 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 8 @type_04 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 9 @item_id_04 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 10 @type_05 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 11 @item_id_05 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 12 @type_06 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 13 @item_id_06 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 14 @type_07 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 15 @item_id_07 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 16 @type_08 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 17 @item_id_08 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 18 @type_09 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 19 @item_id_09 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 20 @type_10 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 21 @item_id_10 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 22 @type_11 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 23 @item_id_11 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 24 @type_12 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 25 @item_id_12 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 26 @type_13 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 27 @item_id_13 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 28 @type_14 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 29 @item_id_14 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 30 @type_15 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 31 @item_id_15 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 32 @type_16 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 33 @item_id_16 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 34 @type_17 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 35 @item_id_17 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 36 @type_18 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 37 @item_id_18 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 38 @type_19 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 39 @item_id_19 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 40 @type_20 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 41 @item_id_20 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 42 @type_21 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 43 @item_id_21 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 44 @type_22 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 45 @item_id_22 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 46 @type_23 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 47 @item_id_23 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 48 @type_24 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 49 @item_id_24 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 50 @type_25 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 51 @item_id_25 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 52 @type_26 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 53 @item_id_26 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 54 @type_27 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 55 @item_id_27 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 56 @type_28 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 57 @item_id_28 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 58 @type_29 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 59 @item_id_29 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 60 @type_30 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 61 @item_id_30 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 62 @type_31 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 63 @item_id_31 uniqueidentifier 16 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 64 @type_32 int 4 0 +up_save_item_quickslot RustyHearts REQ_SAVE_ITEM_QUICKSLOT 65 @item_id_32 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 1 @character_id uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 2 @type_01 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 3 @item_id_01 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 4 @type_02 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 5 @item_id_02 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 6 @type_03 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 7 @item_id_03 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 8 @type_04 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 9 @item_id_04 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 10 @type_05 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 11 @item_id_05 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 12 @type_06 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 13 @item_id_06 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 14 @type_07 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 15 @item_id_07 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 16 @type_08 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 17 @item_id_08 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 18 @type_09 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 19 @item_id_09 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 20 @type_10 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 21 @item_id_10 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 22 @type_11 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 23 @item_id_11 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 24 @type_12 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 25 @item_id_12 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 26 @type_13 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 27 @item_id_13 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 28 @type_14 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 29 @item_id_14 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 30 @type_15 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 31 @item_id_15 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 32 @type_16 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 33 @item_id_16 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 34 @type_17 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 35 @item_id_17 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 36 @type_18 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 37 @item_id_18 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 38 @type_19 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 39 @item_id_19 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 40 @type_20 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 41 @item_id_20 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 42 @type_21 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 43 @item_id_21 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 44 @type_22 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 45 @item_id_22 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 46 @type_23 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 47 @item_id_23 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 48 @type_24 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 49 @item_id_24 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 50 @type_25 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 51 @item_id_25 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 52 @type_26 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 53 @item_id_26 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 54 @type_27 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 55 @item_id_27 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 56 @type_28 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 57 @item_id_28 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 58 @type_29 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 59 @item_id_29 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 60 @type_30 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 61 @item_id_30 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 62 @type_31 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 63 @item_id_31 uniqueidentifier 16 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 64 @type_32 int 4 0 +up_save_item_quickslot_02 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 65 @item_id_32 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 1 @character_id uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 2 @type_01 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 3 @item_id_01 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 4 @type_02 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 5 @item_id_02 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 6 @type_03 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 7 @item_id_03 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 8 @type_04 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 9 @item_id_04 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 10 @type_05 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 11 @item_id_05 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 12 @type_06 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 13 @item_id_06 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 14 @type_07 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 15 @item_id_07 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 16 @type_08 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 17 @item_id_08 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 18 @type_09 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 19 @item_id_09 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 20 @type_10 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 21 @item_id_10 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 22 @type_11 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 23 @item_id_11 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 24 @type_12 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 25 @item_id_12 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 26 @type_13 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 27 @item_id_13 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 28 @type_14 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 29 @item_id_14 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 30 @type_15 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 31 @item_id_15 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 32 @type_16 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 33 @item_id_16 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 34 @type_17 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 35 @item_id_17 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 36 @type_18 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 37 @item_id_18 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 38 @type_19 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 39 @item_id_19 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 40 @type_20 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 41 @item_id_20 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 42 @type_21 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 43 @item_id_21 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 44 @type_22 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 45 @item_id_22 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 46 @type_23 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 47 @item_id_23 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 48 @type_24 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 49 @item_id_24 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 50 @type_25 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 51 @item_id_25 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 52 @type_26 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 53 @item_id_26 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 54 @type_27 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 55 @item_id_27 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 56 @type_28 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 57 @item_id_28 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 58 @type_29 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 59 @item_id_29 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 60 @type_30 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 61 @item_id_30 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 62 @type_31 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 63 @item_id_31 uniqueidentifier 16 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 64 @type_32 int 4 0 +up_save_item_quickslot_03 RustyHearts REQ_SAVE_ITEM_QUICKSLOT 65 @item_id_32 uniqueidentifier 16 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 1 @auth_id uniqueidentifier 16 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 2 @auth_id uniqueidentifier 16 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 3 @CharID uniqueidentifier 16 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 4 @server int 4 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 5 @channelID int 4 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 6 @name nvarchar 32 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 7 @real_ip varchar 16 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 8 @inven_gold int 4 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 9 @storage_gold int 4 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 10 @character_level int 4 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 11 @character_exp bigint 8 0 +up_save_logout RustyHearts_Auth REQ_LOGINOUT_LOG 12 @log_type smallint 2 0 +up_save_money RustyHearts REQ_SAVE_MONEY 1 @character_id uniqueidentifier 16 0 +up_save_money RustyHearts REQ_SAVE_MONEY 2 @gold int 4 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 1 @auth_id uniqueidentifier 16 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 2 @real_ip varchar 16 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 3 @server_ip varchar 16 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 4 @host_id int 4 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 5 @ServerType char 2 0 +up_save_server_info RustyHearts_Auth REQ_SAVE_SERVER_INFO 6 @ServerID int 4 0 +up_select_battle_rank RustyHearts REQ_SELECT_BATTLE_RANK_LIST 1 @rank_type int 4 0 +up_select_cash_effectinfo RustyHearts REQ_READ_CASH_EFFECTINFO 1 @cha_uid uniqueidentifier 16 0 +up_set_timeskillreset RustyHearts REQ_SET_TIME_SKILLRESET 1 @char_id uniqueidentifier 16 0 +up_set_timeskillreset RustyHearts REQ_SET_TIME_SKILLRESET 2 @flag int 4 0 +up_skill_delete_all NOT_IN_SCHEMA REQ_DELETE_SKILL_ALL +up_skill_reset RustyHearts REQ_SAVE_SKILL_RESET 1 @character_id uniqueidentifier 16 0 +up_unequip_character_title RustyHearts REQ_UNEQUIP_CHARACTER_TITLE 1 @title_id uniqueidentifier 16 0 +up_upate_item_binds RustyHearts REQ_UPDATE_ITEM_BINDS 1 @character_id uniqueidentifier 16 0 +up_upate_item_binds RustyHearts REQ_UPDATE_ITEM_BINDS 2 @item_id uniqueidentifier 16 0 +up_upate_item_binds RustyHearts REQ_UPDATE_ITEM_BINDS 3 @binds int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 1 @auth_id uniqueidentifier 16 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 2 @item_id uniqueidentifier 16 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 3 @use_cnt int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 4 @remain_time int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 5 @enhance_level int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 6 @durability int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 7 @sock_optcode01 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 8 @sock_value01 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 9 @sock_optcode02 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 10 @sock_value02 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 11 @sock_optcode03 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 12 @sock_value03 int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 13 @expiretime int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 14 @activity_value int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 15 @socket_1_color tinyint 1 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 16 @socket_2_color tinyint 1 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 17 @socket_3_color tinyint 1 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 18 @rank tinyint 1 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 19 @acquireroute tinyint 1 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 20 @physical int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 21 @magical int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 22 @durabilitymax int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 23 @weight int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 24 @page_index int 4 0 +up_update_account_storage_item RustyHearts REQ_UPDATE_ACCOUNT_STORAGE_ITEM 25 @slot_index int 4 0 +up_update_auctionarticle RustyHearts REQ_UPDATE_AUCTIONITEM 1 @item_uid uniqueidentifier 16 0 +up_update_auctionarticle RustyHearts REQ_UPDATE_AUCTIONITEM 2 @bid_auth_uid uniqueidentifier 16 0 +up_update_auctionarticle RustyHearts REQ_UPDATE_AUCTIONITEM 3 @bid_uid uniqueidentifier 16 0 +up_update_auctionarticle RustyHearts REQ_UPDATE_AUCTIONITEM 4 @bidder nvarchar 30 0 +up_update_auctionarticle RustyHearts REQ_UPDATE_AUCTIONITEM 5 @bid_price int 4 0 +up_update_ban_memo RustyHearts REQ_UPDATE_MEMO_BAN 1 @character_id uniqueidentifier 16 0 +up_update_ban_memo RustyHearts REQ_UPDATE_MEMO_BAN 2 @ban_id uniqueidentifier 16 0 +up_update_ban_memo RustyHearts REQ_UPDATE_MEMO_BAN 3 @ban_memo nvarchar 64 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 1 @character_id uniqueidentifier 16 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 2 @total_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 3 @total_lose int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 4 @team_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 5 @team_lose int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 6 @leader_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 7 @leader_lose int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 8 @tag_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 9 @tag_lose int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 10 @death_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 11 @death_lose int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 12 @individual_win int 4 0 +up_update_battleinfo RustyHearts REQ_RESET_BATTLE_INFO 13 @individual_lose int 4 0 +up_update_buff RustyHearts REQ_UPDATE_BUFF 1 @character_id uniqueidentifier 16 0 +up_update_buff RustyHearts REQ_UPDATE_BUFF 2 @type int 4 0 +up_update_buff RustyHearts REQ_UPDATE_BUFF 3 @id int 4 0 +up_update_buff RustyHearts REQ_UPDATE_BUFF 4 @time int 4 0 +up_update_cash_effectinfo RustyHearts REQ_UPDATE_CASH_EFFECTINFO 1 @item_uid uniqueidentifier 16 0 +up_update_cash_effectinfo RustyHearts REQ_UPDATE_CASH_EFFECTINFO 2 @expire_time int 4 0 +up_update_cash_mileage RustyHearts_Auth REQ_UPDATE_CASH_MILEAGE 1 @auth_id uniqueidentifier 16 0 +up_update_cash_mileage RustyHearts_Auth REQ_UPDATE_CASH_MILEAGE 2 @mileage int 4 0 +up_update_cash_mileage RustyHearts_Auth REQ_UPDATE_CASH_MILEAGE 3 @auth_id uniqueidentifier 16 0 +up_update_cash_mileage RustyHearts_Auth REQ_UPDATE_CASH_MILEAGE 4 @mileage int 4 0 +up_update_cash_product_list RustyHearts REQ_UPDATE_CASH_PRODUCT 1 @ProductID uniqueidentifier 16 0 +up_update_character_addition_status_hp RustyHearts REQ_STATUS_ADDITION_HP 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_hp RustyHearts REQ_STATUS_ADDITION_HP 2 @addition_hp int 4 0 +up_update_character_addition_status_magicattack RustyHearts REQ_STATUS_ADDITION_MAGICATTACK 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_magicattack RustyHearts REQ_STATUS_ADDITION_MAGICATTACK 2 @addition_magicattack int 4 0 +up_update_character_addition_status_magicdefense RustyHearts REQ_STATUS_ADDITION_MAGICDEFENSE 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_magicdefense RustyHearts REQ_STATUS_ADDITION_MAGICDEFENSE 2 @addition_magicdefense int 4 0 +up_update_character_addition_status_mp RustyHearts REQ_STATUS_ADDITION_MP 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_mp RustyHearts REQ_STATUS_ADDITION_MP 2 @addition_mp int 4 0 +up_update_character_addition_status_physicattack RustyHearts REQ_STATUS_ADDITION_PHYSICATTACK 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_physicattack RustyHearts REQ_STATUS_ADDITION_PHYSICATTACK 2 @addition_physicattack int 4 0 +up_update_character_addition_status_physicdefense RustyHearts REQ_STATUS_ADDITION_PHYSICDEFENSE 1 @character_id uniqueidentifier 16 0 +up_update_character_addition_status_physicdefense RustyHearts REQ_STATUS_ADDITION_PHYSICDEFENSE 2 @addition_physicdefense int 4 0 +up_update_character_block RustyHearts REQ_UPDATE_CHARACTER_BLOCK 1 @character_id uniqueidentifier 16 0 +up_update_character_block_by_name RustyHearts REQ_UPDATE_CHARACTER_BLOCK_BY_NAME 1 @character_name nvarchar 32 0 +up_update_character_dice_point RustyHearts REQ_UPDATE_CHARACTER_DICE_POINT 1 @character_id uniqueidentifier 16 0 +up_update_character_dice_point RustyHearts REQ_UPDATE_CHARACTER_DICE_POINT 2 @dice_point int 4 0 +up_update_character_duel_Experience RustyHearts REQ_UPDATE_CHARACTER_BATTLE_EXP 1 @character_id uniqueidentifier 16 0 +up_update_character_duel_Experience RustyHearts REQ_UPDATE_CHARACTER_BATTLE_EXP 2 @duel_experience bigint 8 0 +up_update_character_duel_ladder RustyHearts REQ_UPDATE_CHARACTER_BATTLE_LADDER 1 @character_id uniqueidentifier 16 0 +up_update_character_duel_ladder RustyHearts REQ_UPDATE_CHARACTER_BATTLE_LADDER 2 @duel_ladder_exp int 4 0 +up_update_character_duel_ladder RustyHearts REQ_UPDATE_CHARACTER_BATTLE_LADDER 3 @duel_ladder_point int 4 0 +up_update_character_duel_point RustyHearts REQ_UPDATE_CHARACTER_BATTLE_POINT 1 @character_id uniqueidentifier 16 0 +up_update_character_duel_point RustyHearts REQ_UPDATE_CHARACTER_BATTLE_POINT 2 @duel_point int 4 0 +up_update_character_experience RustyHearts REQ_UPDATE_CHARACTER_EXP 1 @character_id uniqueidentifier 16 0 +up_update_character_experience RustyHearts REQ_UPDATE_CHARACTER_EXP 2 @experience bigint 8 0 +up_update_character_fatigue RustyHearts REQ_UPDATE_CHARACTER_FATIGUE 1 @character_id uniqueidentifier 16 0 +up_update_character_fatigue RustyHearts REQ_UPDATE_CHARACTER_FATIGUE 2 @fatigue int 4 0 +up_update_character_fatigue RustyHearts REQ_UPDATE_CHARACTER_FATIGUE 3 @cash tinyint 1 0 +up_update_character_fatiguestorage RustyHearts REQ_UPDATE_CHARACTER_FATIGUE_STORAGE 1 @character_id uniqueidentifier 16 0 +up_update_character_fatiguestorage RustyHearts REQ_UPDATE_CHARACTER_FATIGUE_STORAGE 2 @fatigue int 4 0 +up_update_character_first_login RustyHearts REQ_UPDATE_CHARACTER_FIRST_LOGIN 1 @character_id uniqueidentifier 16 0 +up_update_character_first_login RustyHearts REQ_UPDATE_CHARACTER_FIRST_LOGIN 2 @class int 4 0 +up_update_character_first_login RustyHearts REQ_UPDATE_CHARACTER_FIRST_LOGIN 3 @lobby_id int 4 0 +up_update_character_give_up RustyHearts REQ_UPDATE_CHARACTER_GIVE_UP 1 @character_id uniqueidentifier 16 0 +up_update_character_give_up RustyHearts REQ_UPDATE_CHARACTER_GIVE_UP 2 @give_up int 4 0 +up_update_character_guild_point RustyHearts REQ_UPDATE_CHARACTER_GUILD_POINT 1 @character_id uniqueidentifier 16 0 +up_update_character_guild_point RustyHearts REQ_UPDATE_CHARACTER_GUILD_POINT 2 @guildpoint int 4 0 +up_update_character_hearts RustyHearts REQ_UPDATE_CHARACTER_HEARTS 1 @character_id uniqueidentifier 16 0 +up_update_character_hearts RustyHearts REQ_UPDATE_CHARACTER_HEARTS 2 @hearts int 4 0 +up_update_character_job RustyHearts REQ_UPDATE_CHARACTER_JOB 1 @character_id uniqueidentifier 16 0 +up_update_character_job RustyHearts REQ_UPDATE_CHARACTER_JOB 2 @job int 4 0 +up_update_character_level RustyHearts REQ_UPDATE_CHARACTER_LEVEL_AND_SP 1 @character_id uniqueidentifier 16 0 +up_update_character_level RustyHearts REQ_UPDATE_CHARACTER_LEVEL_AND_SP 2 @level int 4 0 +up_update_character_level RustyHearts REQ_UPDATE_CHARACTER_LEVEL_AND_SP 3 @experience bigint 8 0 +up_update_character_lobby RustyHearts REQ_UPDATE_CHARACTER_LOBBY 1 @character_id uniqueidentifier 16 0 +up_update_character_lobby RustyHearts REQ_UPDATE_CHARACTER_LOBBY 2 @lobby int 4 0 +up_update_character_name RustyHearts REQ_UPDATE_CHARACTER_NAME 1 @character_id uniqueidentifier 16 0 +up_update_character_name RustyHearts REQ_UPDATE_CHARACTER_NAME 2 @character_name nvarchar 32 0 +up_update_character_sp RustyHearts REQ_UPDATE_CHARACTER_SP 1 @character_id uniqueidentifier 16 0 +up_update_character_sp RustyHearts REQ_UPDATE_CHARACTER_SP 2 @sp int 4 0 +up_update_character_sp RustyHearts REQ_UPDATE_CHARACTER_SP 3 @total_sp int 4 0 +up_update_character_tutorial RustyHearts REQ_UPDATE_CHARACTER_TUTORIAL 1 @character_id uniqueidentifier 16 0 +up_update_character_tutorial_step RustyHearts REQ_UPDATE_CHARACTER_TUTORIAL_STEP 1 @character_id uniqueidentifier 16 0 +up_update_character_tutorial_step RustyHearts REQ_UPDATE_CHARACTER_TUTORIAL_STEP 2 @tutorial_step int 4 0 +up_update_dayattach RustyHearts REQ_UPDATE_DAY_ATTACH 1 @character_id uniqueidentifier 16 0 +up_update_dayattach RustyHearts REQ_UPDATE_DAY_ATTACH 2 @attach_item int 4 0 +up_update_dayattach RustyHearts REQ_UPDATE_DAY_ATTACH 3 @attach_gold int 4 0 +up_update_daypartymission RustyHearts REQ_UPDATE_DAY_PARTY_MISSION 1 @character_id uniqueidentifier 16 0 +up_update_daypartymission RustyHearts REQ_UPDATE_DAY_PARTY_MISSION 2 @daymissionstate int 4 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 1 @character_id uniqueidentifier 16 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 2 @game_type int 4 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 3 @add_point int 4 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 4 @add_exp bigint 8 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 5 @add_disconnect int 4 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 6 @add_win int 4 0 +up_update_duel_info RustyHearts REQ_UPDATE_DUEL_INFO 7 @add_lose int 4 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 1 @character_id uniqueidentifier 16 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 2 @world_id int 4 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 3 @difficulty tinyint 1 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 4 @rank_normal tinyint 1 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 5 @rank_hard tinyint 1 0 +up_update_dungeon_rank RustyHearts REQ_UPDATE_DUNGEON_RANK 6 @rank_veryhard tinyint 1 0 +up_update_event_fatigue RustyHearts REQ_UPDATE_EVENT_FATIGUE 1 @character_id uniqueidentifier 16 0 +up_update_event_fatigue RustyHearts REQ_UPDATE_EVENT_FATIGUE 2 @fatigue tinyint 1 0 +up_update_event_fortune RustyHearts REQ_UPDATE_EVENT_FORTUNE,REQ_UPDATE_EVENT_DAY_PARTY_MISSION 1 @character_id uniqueidentifier 16 0 +up_update_event_fortune RustyHearts REQ_UPDATE_EVENT_FORTUNE,REQ_UPDATE_EVENT_DAY_PARTY_MISSION 2 @fortune tinyint 1 0 +up_update_event_hearts RustyHearts REQ_UPDATE_EVENT_HEARTS 1 @character_id uniqueidentifier 16 0 +up_update_event_hearts RustyHearts REQ_UPDATE_EVENT_HEARTS 2 @hearts tinyint 1 0 +up_update_event_inquiry RustyHearts_Auth REQ_UPDATE_EVENT_INQUIRY 1 @auth_id uniqueidentifier 16 0 +up_update_event_inquiry RustyHearts_Auth REQ_UPDATE_EVENT_INQUIRY 2 @inquiry tinyint 1 0 +up_update_event_inquiry RustyHearts_Auth REQ_UPDATE_EVENT_INQUIRY 3 @auth_id uniqueidentifier 16 0 +up_update_event_inquiry RustyHearts_Auth REQ_UPDATE_EVENT_INQUIRY 4 @inquiry tinyint 1 0 +up_update_event_mailattach RustyHearts REQ_UPDATE_EVENT_MAILATTACH 1 @character_id uniqueidentifier 16 0 +up_update_event_mailattach RustyHearts REQ_UPDATE_EVENT_MAILATTACH 2 @mailattach tinyint 1 0 +up_update_event_pvpladder RustyHearts REQ_UPDATE_PVP_LADDER 1 @character_id uniqueidentifier 16 0 +up_update_event_pvpladder RustyHearts REQ_UPDATE_PVP_LADDER 2 @pvpladder tinyint 1 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 1 @character_id uniqueidentifier 16 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 2 @fortune int 4 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 3 @type_1 int 4 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 4 @type_2 int 4 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 5 @type_3 int 4 0 +up_update_fortune RustyHearts REQ_UPDATE_FORTUNE 6 @count int 4 0 +up_update_friend_name RustyHearts REQ_UPDATE_CHARACTER_NAME 1 @character_id uniqueidentifier 16 0 +up_update_friend_name RustyHearts REQ_UPDATE_CHARACTER_NAME 2 @character_name nvarchar 32 0 +up_update_guild_level RustyHearts REQ_GUILD_LEVEL_UP 1 @guild_id uniqueidentifier 16 0 +up_update_guild_level RustyHearts REQ_GUILD_LEVEL_UP 2 @character_id uniqueidentifier 16 0 +up_update_guild_level RustyHearts REQ_GUILD_LEVEL_UP 3 @need_exp bigint 8 0 +up_update_guild_level RustyHearts REQ_GUILD_LEVEL_UP 4 @need_gold int 4 0 +up_update_guild_level RustyHearts REQ_GUILD_LEVEL_UP 5 @max_member int 4 0 +up_update_guild_member_aliase RustyHearts REQ_UPDATE_GUILD_MEMBER_ALIASE 1 @guild_id uniqueidentifier 16 0 +up_update_guild_member_aliase RustyHearts REQ_UPDATE_GUILD_MEMBER_ALIASE 2 @character_id uniqueidentifier 16 0 +up_update_guild_member_aliase RustyHearts REQ_UPDATE_GUILD_MEMBER_ALIASE 3 @alias_name nvarchar 32 0 +up_update_guild_member_logout_time RustyHearts REQ_GUILD_MEMBER_LOGOUT_TIME 1 @guild_id uniqueidentifier 16 0 +up_update_guild_member_logout_time RustyHearts REQ_GUILD_MEMBER_LOGOUT_TIME 2 @character_id uniqueidentifier 16 0 +up_update_guild_member_name RustyHearts REQ_UPDATE_CHARACTER_NAME 1 @character_id uniqueidentifier 16 0 +up_update_guild_member_name RustyHearts REQ_UPDATE_CHARACTER_NAME 2 @character_name nvarchar 32 0 +up_update_guild_member_permission RustyHearts REQ_UPDATE_GUILD_MEMBER_GRADE 1 @guild_id uniqueidentifier 16 0 +up_update_guild_member_permission RustyHearts REQ_UPDATE_GUILD_MEMBER_GRADE 2 @character_id uniqueidentifier 16 0 +up_update_guild_member_permission RustyHearts REQ_UPDATE_GUILD_MEMBER_GRADE 3 @permission int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 1 @guild_id uniqueidentifier 16 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 2 @permission00 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 3 @permission01 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 4 @permission02 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 5 @permission03 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 6 @permission04 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 7 @permission05 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 8 @permission06 int 4 0 +up_update_guild_permission RustyHearts REQ_UPDATE_GUILD_PERMISSION 9 @permission07 int 4 0 +up_update_guild_storage_deposit RustyHearts REQ_GUILD_DEPOSIT 1 @guild_id uniqueidentifier 16 0 +up_update_guild_storage_deposit RustyHearts REQ_GUILD_DEPOSIT 2 @character_id uniqueidentifier 16 0 +up_update_guild_storage_deposit RustyHearts REQ_GUILD_DEPOSIT 3 @deposit_gold int 4 0 +up_update_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO_CHANGE 1 @guild_id uniqueidentifier 16 0 +up_update_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO_CHANGE 2 @page_count tinyint 1 0 +up_update_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO_CHANGE 3 @gold bigint 8 0 +up_update_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO_CHANGE 4 @slot_count int 4 0 +up_update_guild_storage_info RustyHearts REQ_GUILD_STORAGE_INFO_CHANGE 5 @level tinyint 1 0 +up_update_guild_storage_item RustyHearts REQ_GUILD_STORAGE_ITEM_UPDATE 1 @guild_id uniqueidentifier 16 0 +up_update_guild_storage_item RustyHearts REQ_GUILD_STORAGE_ITEM_UPDATE 2 @item_id uniqueidentifier 16 0 +up_update_guild_storage_item RustyHearts REQ_GUILD_STORAGE_ITEM_UPDATE 3 @page_index int 4 0 +up_update_guild_storage_item RustyHearts REQ_GUILD_STORAGE_ITEM_UPDATE 4 @slot_index int 4 0 +up_update_guild_storage_item RustyHearts REQ_GUILD_STORAGE_ITEM_UPDATE 5 @Count int 4 0 +up_update_guild_storage_item_change_count RustyHearts REQ_GUILD_STORAGE_ITEM_CHANGE_COUNT 1 @guild_id uniqueidentifier 16 0 +up_update_guild_storage_item_change_count RustyHearts REQ_GUILD_STORAGE_ITEM_CHANGE_COUNT 2 @character_id uniqueidentifier 16 0 +up_update_guild_storage_item_change_count RustyHearts REQ_GUILD_STORAGE_ITEM_CHANGE_COUNT 3 @item_id uniqueidentifier 16 0 +up_update_guild_storage_item_change_count RustyHearts REQ_GUILD_STORAGE_ITEM_CHANGE_COUNT 4 @count int 4 0 +up_update_guild_storage_payment RustyHearts REQ_GUILD_PAYMENT 1 @guild_id uniqueidentifier 16 0 +up_update_guild_storage_payment RustyHearts REQ_GUILD_PAYMENT 2 @character_id uniqueidentifier 16 0 +up_update_guild_storage_payment RustyHearts REQ_GUILD_PAYMENT 3 @payment_gold int 4 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 1 @character_id uniqueidentifier 16 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 2 @type tinyint 1 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 3 @memo nvarchar 510 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 4 @character_id uniqueidentifier 16 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 5 @type tinyint 1 0 +up_update_inquiry RustyHearts_Auth REQ_UPDATE_INQUIRY 6 @memo nvarchar 510 0 +up_update_inquiry_count RustyHearts_Auth REQ_UPDATE_INQUIRY_COUNT 1 @auth_id uniqueidentifier 16 0 +up_update_inquiry_count RustyHearts_Auth REQ_UPDATE_INQUIRY_COUNT 2 @count tinyint 1 0 +up_update_inquiry_count RustyHearts_Auth REQ_UPDATE_INQUIRY_COUNT 3 @auth_id uniqueidentifier 16 0 +up_update_inquiry_count RustyHearts_Auth REQ_UPDATE_INQUIRY_COUNT 4 @count tinyint 1 0 +up_update_inquiry_type RustyHearts_Auth REQ_UPDATE_INQUIRY_TYPE 1 @character_id uniqueidentifier 16 0 +up_update_inquiry_type RustyHearts_Auth REQ_UPDATE_INQUIRY_TYPE 2 @type tinyint 1 0 +up_update_inquiry_type RustyHearts_Auth REQ_UPDATE_INQUIRY_TYPE 3 @character_id uniqueidentifier 16 0 +up_update_inquiry_type RustyHearts_Auth REQ_UPDATE_INQUIRY_TYPE 4 @type tinyint 1 0 +up_update_mail_open RustyHearts REQ_MAIL_OPEN 1 @mail_id uniqueidentifier 16 0 +up_update_mail_open RustyHearts REQ_MAIL_OPEN 2 @is_open tinyint 1 0 +up_update_pet RustyHearts REQ_PET_UPDATE 1 @pet_id uniqueidentifier 16 0 +up_update_pet RustyHearts REQ_PET_UPDATE 2 @character_id uniqueidentifier 16 0 +up_update_pet RustyHearts REQ_PET_UPDATE 3 @Level int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 4 @Experience bigint 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 5 @inventory_count tinyint 1 0 +up_update_pet RustyHearts REQ_PET_UPDATE 6 @CreateTime datetime 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 7 @Expire_Time int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 8 @Class int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 9 @Vital int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 10 @Intelligence int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 11 @Strength int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 12 @Resilient int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 13 @Eloquence int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 14 @Charm int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 15 @Temper int 4 0 +up_update_pet RustyHearts REQ_PET_UPDATE 16 @fHeight float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 17 @fWeight float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 18 @pet_type tinyint 1 0 +up_update_pet RustyHearts REQ_PET_UPDATE 19 @hp float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 20 @mp float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 21 @physical_attack float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 22 @physical_defence float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 23 @magical_attack float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 24 @magical_defence float 8 0 +up_update_pet RustyHearts REQ_PET_UPDATE 25 @loyalty float 8 0 +up_update_pet_exp RustyHearts REQ_PET_EXP_UPDATE 1 @pet_id uniqueidentifier 16 0 +up_update_pet_exp RustyHearts REQ_PET_EXP_UPDATE 2 @character_id uniqueidentifier 16 0 +up_update_pet_exp RustyHearts REQ_PET_EXP_UPDATE 3 @Experience bigint 8 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 1 @pet_id uniqueidentifier 16 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 2 @character_id uniqueidentifier 16 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 3 @Level int 4 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 4 @Experience bigint 8 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 5 @inventory_count tinyint 1 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 6 @chat uniqueidentifier 16 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 7 @auid uniqueidentifier 16 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 8 @aa int 4 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 9 @nn int 4 0 +up_update_pet_level RustyHearts REQ_PET_LEVEL_UPDATE 10 @cc int 4 0 +up_update_pet_name RustyHearts REQ_PET_NAME_UPDATE 1 @pet_id uniqueidentifier 16 0 +up_update_pet_name RustyHearts REQ_PET_NAME_UPDATE 2 @character_id uniqueidentifier 16 0 +up_update_pet_name RustyHearts REQ_PET_NAME_UPDATE 3 @Name nvarchar 32 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 1 @pet_id uniqueidentifier 16 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 2 @character_id uniqueidentifier 16 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 3 @hp int 4 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 4 @mp int 4 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 5 @physical_attack float 8 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 6 @physical_defence float 8 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 7 @magical_attack float 8 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 8 @magical_defence float 8 0 +up_update_pet_status RustyHearts REQ_PET_EAT_STATUS 9 @loyalty float 8 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 1 @pet_id uniqueidentifier 16 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 2 @Vital int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 3 @Intelligence int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 4 @Strength int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 5 @Resilient int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 6 @Eloquence int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 7 @Charm int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 8 @Temper int 4 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 9 @fHeight float 8 0 +up_update_pet_stet RustyHearts REQ_UPDATE_PET_STET 10 @fWeight float 8 0 +up_update_pet_type RustyHearts REQ_UPDATE_PET_TYPE 1 @pet_id uniqueidentifier 16 0 +up_update_pet_type RustyHearts REQ_UPDATE_PET_TYPE 2 @pet_type tinyint 1 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 1 @quest_uid uniqueidentifier 16 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 2 @character_id uniqueidentifier 16 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 3 @quest_state tinyint 1 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 4 @quest_status1 smallint 2 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 5 @quest_status2 smallint 2 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 6 @quest_status3 smallint 2 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 7 @quest_status4 smallint 2 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 8 @quest_status5 smallint 2 0 +up_update_quest RustyHearts REQ_UPDATE_QUEST 9 @finsh_date nvarchar 40 0 +up_update_quest_show RustyHearts REQ_UPDATE_QUEST_SHOW 1 @quest_uid uniqueidentifier 16 0 +up_update_quest_show RustyHearts REQ_UPDATE_QUEST_SHOW 2 @quest_show int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 1 @rearing_id uniqueidentifier 16 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 2 @table_id int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 3 @job tinyint 1 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 4 @level int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 5 @actionpoint int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 6 @usedturn int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 7 @endingid int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 8 @rewarditem int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 9 @vital int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 10 @intelligence int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 11 @strength int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 12 @temper int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 13 @charm int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 14 @resilent int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 15 @eloquence int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 16 @exhaust int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 17 @angry int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 18 @normal int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 19 @good int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 20 @sadness int 4 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 21 @height float 8 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 22 @weight float 8 0 +up_update_rearing_info RustyHearts REQ_UPDATE_REARING_INFO 23 @index int 4 0 +up_update_rearing_turn RustyHearts REQ_UPDATE_REARING_TURN 1 @rearing_id uniqueidentifier 16 0 +up_update_rearing_turn RustyHearts REQ_UPDATE_REARING_TURN 2 @usedturn int 4 0 +up_update_remaintime_item RustyHearts REQ_UPDATE_REMAINTIME_ITEM 1 @character_id uniqueidentifier 16 0 +up_update_skill_level RustyHearts REQ_UPDATE_SKILL_LEVEL 1 @skill_id uniqueidentifier 16 0 +up_update_skill_level RustyHearts REQ_UPDATE_SKILL_LEVEL 2 @skill_level int 4 0 +up_update_storage_useable_count RustyHearts REQ_UPDATE_STORAGE_USEABLE_COUNT 1 @character_id uniqueidentifier 16 0 +up_update_storage_useable_count RustyHearts REQ_UPDATE_STORAGE_USEABLE_COUNT 2 @useable_count int 4 0 +up_update_uni_account_info RustyHearts REQ_UPDATE_UNI_ACCOUNT_INFO 1 @auth_id uniqueidentifier 16 0 +up_update_uni_account_info RustyHearts REQ_UPDATE_UNI_ACCOUNT_INFO 2 @AccountStorage_Count int 4 0 +up_update_uni_account_info RustyHearts REQ_UPDATE_UNI_ACCOUNT_INFO 3 @AccountStorage_Gold int 4 0 +up_update_uni_account_info RustyHearts REQ_UPDATE_UNI_ACCOUNT_INFO 4 @Use_CharacterSlot int 4 0 diff --git a/decomp/INVENTORY.md b/decomp/INVENTORY.md index 68f0dc4c..90e307c6 100644 --- a/decomp/INVENTORY.md +++ b/decomp/INVENTORY.md @@ -26,7 +26,7 @@ hypotheses to confirm or revise during analysis. | `ManagerServer_Release_USA_x64.exe` | 6666752 | 6510.5 | c239477294c199f8df4ef70138cc1583c87838dd5e8cebed2ff0fae2bc6c5be2 | management/admin | pending | | `AuctionServer_Release_USA_x64.exe` | 6477824 | 6326.0 | ebca9cc047aeca125ac0621e3652339096c74862746157adc6c72057422f6dcf | auction house | pending | | `MatchServer_Release_USA_x64.exe` | 6134784 | 5991.0 | 341dd4a38c9e1abb590f60325ef52bf24b60a48a70e36e2f1651bbf00591fcf2 | matchmaking | pending | -| `DBCServer_Release_x64.exe` | 3542016 | 3459.0 | d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c | DB access server (observed: SERVERS2DBC RMI → write queues → ADO stored procs; 4 connection types; Linux port `src/dbc_server/`) | open | +| `DBCServer_Release_x64.exe` | 3542016 | 3459.0 | d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c | DB access server (observed: SERVERS2DBC RMI → write queues → ADO stored procs; 4 connection types) | open | | `DBCServer_LOG_Release_x64.exe` | 3394560 | 3315.0 | 2636d51679abb7703a6386a398f2afb985704aa0ce00d53e75d0ff3b093f5836 | logging DB variant | pending | | `GameGatewayServer_Release_x64.exe` | 3330560 | 3252.5 | 4cbec55dc3dfe5a0eeba3170722e6f1d33e55d6a0d007774266fe9db96f25d1a | gateway/proxy | pending | | `GMServer_Release_x64.exe` | 2004480 | 1957.5 | 8fba9dbb8809419d6e2edaee31d9ad60501341d97dca0fc82a1c1e7cc32199d1 | game-master tools | pending | diff --git a/decomp/scripts/gen_dbc_tables.py b/decomp/scripts/gen_dbc_tables.py index b97e92e2..f52c5406 100644 --- a/decomp/scripts/gen_dbc_tables.py +++ b/decomp/scripts/gen_dbc_tables.py @@ -1,81 +1,49 @@ #!/usr/bin/env python3 -"""Generate the DBCServer port's static tables from decomp evidence. +"""Join the DBCServer RMI -> procedure map with procedure parameters. -Inputs (all derived, regenerable): +Inputs (derived, regenerable): decomp/DBCServer_Release_x64/rmi_to_proc.tsv RMI -> cmd -> procedures decomp/schema//routines.tsv procedure parameters Output: - src/dbc_server/generated/tables.inc + decomp/DBCServer_Release_x64/procs_used.tsv + one row per (procedure, parameter) for every procedure reachable from an RMI; + db = database that holds it (NOT_IN_SCHEMA if called but absent). Run from the repo root: python3 decomp/scripts/gen_dbc_tables.py """ import csv, os ROOT = os.getcwd() -OUT = os.path.join(ROOT, 'src/dbc_server/generated/tables.inc') -# Database -> DBC connection type (DBC:0x1400a7aa0). The DB for a procedure is -# where it lives in the schema dump (inference, see docs/DATABASE.md). -DBTYPE = {'RustyHearts_Account': 'Web', 'RustyHearts_Auth': 'Auth', - 'RustyHearts': 'Game', 'RustyHearts_Log': 'GameLog'} -SQLTYPE = {'int': 'Int', 'smallint': 'SmallInt', 'tinyint': 'TinyInt', 'bigint': 'BigInt', - 'bit': 'Bit', 'float': 'Float', 'uniqueidentifier': 'Guid', 'nvarchar': 'NVarChar', - 'nchar': 'NVarChar', 'varchar': 'VarChar', 'char': 'VarChar', 'datetime': 'DateTime'} +OUT = os.path.join(ROOT, 'decomp/DBCServer_Release_x64/procs_used.tsv') +DBS = ['RustyHearts_Account', 'RustyHearts_Auth', 'RustyHearts', 'RustyHearts_Log'] def rows(path): with open(path, newline='') as f: return list(csv.reader(f, delimiter='\t')) procs = {} # lower name -> (name, db, [(param, type, maxlen, out)]) -for db in DBTYPE: +for db in DBS: for r in rows(f'{ROOT}/decomp/schema/{db}/routines.tsv')[1:]: if len(r) < 7 or r[0] != 'SQL_STORED_PROCEDURE': continue p = procs.setdefault(r[1].lower(), (r[1], db, [])) if r[2] != 'NULL': - p[2].append((r[3], SQLTYPE.get(r[4], 'VarChar'), int(r[5]), r[6] == '1')) + p[2].append((r[3], r[4], r[5], r[6])) rmi = rows(f'{ROOT}/decomp/DBCServer_Release_x64/rmi_to_proc.tsv') -hdr = rmi[0]; rmi = [dict(zip(hdr, r)) for r in rmi[1:]] - -used = [] -for r in rmi: +hdr = rmi[0] +callers = {} +for r in (dict(zip(hdr, x)) for x in rmi[1:]): for p in filter(None, r['procs'].split(',')): - if p.lower() not in procs: - # Called by DBCServer but absent from the shipped schema: keep it so - # the port fails like the original would (ADO error). DB guessed from name. - procs[p.lower()] = (p, 'RustyHearts_Log' if '_log_' in p else 'RustyHearts', None) - if p.lower() not in used: - used.append(p.lower()) + callers.setdefault(p.lower(), (p, []))[1].append(r['rmi_name']) -def cstr(s): - return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"' - -out = ['// GENERATED by decomp/scripts/gen_dbc_tables.py - do not edit.', - '// Sources: decomp/DBCServer_Release_x64/rmi_to_proc.tsv, decomp/schema/*/routines.tsv', ''] -for i, key in enumerate(used): - name, db, ps = procs[key] - ps = ps or [] - out.append(f'static const ProcParam kParams{i}[] = {{' + - ''.join(f'{{{cstr(n)}, SqlType::{t}, {m}, {str(o).lower()}}},' for n, t, m, o in ps) + - ('{nullptr, SqlType::Int, 0, false}' if not ps else '') + '};') -out.append('') -out.append('static const ProcDef kProcs[] = {') -for i, key in enumerate(used): - name, db, ps = procs[key] - known = ps is not None - out.append(f' {{{cstr(name)}, DbType::{DBTYPE[db]}, kParams{i}, {len(ps or [])}, {str(known).lower()}}},') -out.append('};') -out.append('') -out.append('// rmi_id, name, cmd_id (0 = not queued / unknown), proc indexes (-1 = none)') -out.append('static const RmiDef kRmis[] = {') -for r in rmi: - idx = [used.index(p.lower()) for p in filter(None, r['procs'].split(',')) if p.lower() in used] - idx = (idx + [-1, -1, -1])[:3] - missing = [p for p in filter(None, r['procs'].split(',')) if procs[p.lower()][2] is None] - note = f' // missing in schema: {",".join(missing)}' if missing else '' - out.append(f' {{{r["rmi_id"]}, {cstr(r["rmi_name"])}, {r["cmd_id"] or 0}, ' - f'{{{idx[0]}, {idx[1]}, {idx[2]}}}}},{note}') -out.append('};') -os.makedirs(os.path.dirname(OUT), exist_ok=True) -open(OUT, 'w').write('\n'.join(out) + '\n') -print(f'{len(used)} procedures, {len(rmi)} RMIs -> {OUT}') +out = [['proc', 'db', 'rmis', 'param_no', 'param', 'sql_type', 'max_length', 'is_output']] +for key, (name, rmis) in sorted(callers.items()): + pname, db, params = procs.get(key, (name, 'NOT_IN_SCHEMA', [])) + if not params: + out.append([pname, db, ','.join(rmis), '', '', '', '', '']) + for i, (n, t, m, o) in enumerate(params, 1): + out.append([pname, db, ','.join(rmis), str(i), n, t, m, o]) +with open(OUT, 'w', newline='') as f: + csv.writer(f, delimiter='\t', lineterminator='\n').writerows(out) +print(f'{len(callers)} procedures -> {OUT}') diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md index 1e9816b1..108af8fa 100644 --- a/docs/WORKFLOW.md +++ b/docs/WORKFLOW.md @@ -169,19 +169,15 @@ In `decomp//`: - Mark every name as inferred. - Record the original bugs you notice (leaks, races). -## 7. Port to Linux +## 7. Porting spec -`src//` builds the lifted code with Meson (see `src/README.md`). Keep a -`platform.{hpp,cpp}` layer that maps each Win32 call to its nearest POSIX -equivalent. - -The per-binary `README.md` must contain: -- a substitution table: original address → Win32 API → Linux replacement → - behaviour difference; -- what is stubbed or not ported, and why. - -Build with `ninja -C build` and smoke-test it. A passing test proves only that -the port works, not how the original behaves. +There is no source tree in this repo. The earlier `src/` reconstructions were +removed on 2026-10-15. Instead, record the facts a re-implementation needs in +`decomp//porting.md`: +- the behaviour to reproduce, with decomp addresses; +- a substitution table: original address → Win32 API → nearest Linux + equivalent → behaviour difference; +- the original bugs, and what is unknown or unrecovered. ## 8. Close @@ -199,5 +195,5 @@ the Evidence bundle, because session annotations are temporary. `third-party/README.md`** - [ ] Key functions decompiled; `full/` export done - [ ] `evidence.md`, `INVENTORY.md`, `docs/ARCHITECTURE.md` updated -- [ ] Lift and Linux port updated, if in scope +- [ ] `cpp/` lift and `porting.md` updated, if in scope - [ ] Evidence bundle exported; REA session closed diff --git a/src/README.md b/src/README.md deleted file mode 100644 index 19fd4c27..00000000 --- a/src/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# src — Linux reconstructions - -Buildable Linux C++ ports of analysed Rusty Hearts server binaries. Each -sub-folder ports one binary and has its own README. That README covers -provenance, the Win32 → Linux substitutions, and what is not yet ported. - -| Folder | Original binary | Output | -|---|---|---| -| `agent_release/` | `Agent_Release_x64.exe` | `build/agent_release/agent_release` | - -These are reconstructions from decompiled code, not original source. - -## Requirements - -- Linux with glibc ≥ 2.29 (for `posix_spawn_file_actions_addchdir_np`) -- A C++17 compiler (tested with GCC 16.2) -- Meson ≥ 1.0 and Ninja. Run both from this repo's `mise` environment or the - system packages. - -## Build - -From this directory: - -```sh -meson setup build # first time only -ninja -C build -``` - -## Common tasks - -- **Rebuild after changes:** `ninja -C build`. -- **Release build:** `meson setup build-release --buildtype=release && ninja -C build-release`. -- **Clean rebuild:** `rm -rf build && meson setup build && ninja -C build`. - -## Run - -```sh -./build/agent_release/agent_release --help -./build/agent_release/agent_release --auto-on 1 \ - --type 1:/path/to/server:/path/to/workdir --server 1:1:1 -``` - -Stop it with Ctrl-C or SIGTERM. See `agent_release/README.md` for every -option. - -`build/` is gitignored. - -## Adding another binary - -1. Create `/` with its sources, a `meson.build` and a `README.md`. The - README must cite decomp addresses and list substitutions and gaps. -2. Add `subdir('')` to `meson.build` in this directory. diff --git a/src/agent_release/README.md b/src/agent_release/README.md deleted file mode 100644 index 8b1b2e30..00000000 --- a/src/agent_release/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# agent_release — Linux port of `Agent_Release_x64.exe` (process-supervisor core) - -A buildable Linux reconstruction of the parts of the Agent that have been -decompiled. It is **not** the original program: names are inferred (there is no -PDB), and only the analysed functions are ported. - -Source analysis: -- `decomp/Agent_Release_x64/evidence.md` -- `decomp/Agent_Release_x64/cpp/AgentProcessControl.cpp` - -## Build and run - -```sh -cd src -meson setup build -ninja -C build -./build/agent_release/agent_release --auto-on 1 \ - --type 1:/path/to/server:/path/to/workdir --server 1:1:1 -``` - -`--type TYPE:EXE[:WORKDIR]` maps a server type to its executable. -`--server CODE:TYPE:REVIVE` registers one managed server. By default the -server's code is passed as its argument, so the command line is `EXE CODE`. - -## Win32 → Linux substitutions - -| Original (address) | Win32 | Linux replacement | Behaviour difference | -|---|---|---|---| -| Single instance (`0x1400100b0`) | `CreateMutexW("Global\\RustyHearts_Agent")` | `flock(LOCK_EX\|LOCK_NB)` on `/tmp/RustyHearts_Agent.lock` | Lock file instead of a kernel object; still released on exit/crash | -| Launch (`0x1400094e0`) | `CreateProcessW(…, CREATE_NEW_CONSOLE, …, workDir)` + `STARTUPINFOW` console geometry | `posix_spawnp` + `POSIX_SPAWN_SETSID` + `addchdir_np` | No console window; command line split on whitespace (no Windows quoting rules) | -| Watcher (`0x140008c90`) | `GetExitCodeProcess` polled every 10 ms | blocking `waitpid` on a detached `std::thread` | No polling; child reaped (fixes original handle leak); PID passed by value (fixes original stack-pointer race) | -| Kill (`0x140009780`) | Toolhelp32 snapshot + `OpenProcess` + `TerminateProcess(h,0)` | `/proc/*/cmdline` argv[0] basename, `strcasecmp`, `kill(SIGKILL)` | Same: first match only, case-insensitive; no snapshot leak | -| Main loop timer (`0x1400037a0`) | `QueryPerformanceCounter` (`TimeSourceHRWin32`) | `std::chrono::steady_clock` | — | -| Thread start | `_beginthreadex` | `std::thread` | — | -| `Sleep` | `Sleep` | `std::this_thread::sleep_for` | — | -| Shutdown flag | console menu (`FUN_140001dc0`, not analysed) | `SIGINT` / `SIGTERM` | Different trigger | - -Kept from the original: -- the 1-second sleep after each launch attempt; -- the 260-character (`MAX_PATH`) command-line limit; -- the log strings. - -## Not ported (unknown or proprietary) - -- **ProudNet networking / RMI to AgentManager and game servers.** ProudNet is - proprietary and the protocol is undecoded. `IManagerSession` is a logging - stub at the points where the original sends RMI messages (proxy vtable - slots `+0x40` and `+0x50`). -- **XML config (`option\*.xml`, TinyXML).** Field mapping is not yet recovered, - so command-line flags stand in for it. -- **Launch-argument builder `FUN_140027540`.** Its output is unknown, so only - the "server code as argument" mode is implemented. -- **Exit follow-ups.** - - The `type == 1` exit follow-up (`FUN_140009f20`) is not ported. - - The identity of the type `0x18` process killed at startup is unknown. - `--kill-on-start` stands in for it. -- **Locking.** The original's locking around the server table is not visible - in the analysed code. This port uses a recursive mutex. - -## Verified (2026-10-14, Linux) - -Smoke test, using `sleep` as the managed server: auto-start after the delay, -revive on exit, second-instance refusal, case-insensitive kill by name, -clean SIGTERM shutdown. This tests the port only. It says nothing about the -original binary's runtime behaviour. diff --git a/src/agent_release/agent.cpp b/src/agent_release/agent.cpp deleted file mode 100644 index 8a394863..00000000 --- a/src/agent_release/agent.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// agent.cpp — logic follows the Ghidra pseudocode cited per function. -#include "agent.hpp" -#include "platform.hpp" - -#include -#include - -namespace agent { - -void LoggingManagerSession::NotifyServerState(const ServerEntry& e) -{ - std::printf("[RMI->AgentManager] ServerState code=%d pid=%d running=%d\n", - e.code, static_cast(e.pid), e.running ? 1 : 0); -} - -void LoggingManagerSession::NotifyServerStopped(const ServerEntry& e) -{ - std::printf("[RMI->AgentManager] ServerStopped code=%d\n", e.code); -} - -void LoggingManagerSession::SendLog(const std::string& text) -{ - std::printf("[RMI->AgentManager] Log: %s\n", text.c_str()); -} - -Agent::Agent(Options opts, std::map types, - std::unique_ptr session) - : opts_(std::move(opts)), types_(std::move(types)), session_(std::move(session)) {} - -void Agent::AddServer(const ServerEntry& e) -{ - std::lock_guard g(mu_); - servers_[e.code] = e; -} - -std::string Agent::BuildCommandLine(const ServerEntry& e) const -{ - auto t = types_.find(e.type); - std::string cmd = (t == types_.end() ? std::string() : t->second.exePath) + " "; - if (opts_.useCodeAsArgument) - cmd += std::to_string(e.code); - // else: original appends FUN_140027540's output — contents UNKNOWN, not ported. - return cmd; -} - -// 0x140008ea0 -void Agent::ServerOn(int32_t code) -{ - std::lock_guard g(mu_); - auto it = servers_.find(code); - if (it == servers_.end()) { - std::printf("Error - NOT EXIST SERVER : %d \n", code); - return; - } - ServerEntry& e = it->second; - if (e.running) return; - e.running = true; - - std::string cmd = BuildCommandLine(e); - auto t = types_.find(e.type); - std::string workDir = t == types_.end() ? std::string() : t->second.workDir; - - pid_t pid = 0; - if (cmd.size() < 260 && (pid = platform::LaunchProcess(cmd, workDir)) > 0) { // MAX_PATH check kept - e.pid = pid; - e.running = true; - session_->NotifyServerState(e); - platform::WatchProcess(pid, [this](pid_t p) { OnProcessExit(p); }); - } else { - e.running = false; - session_->SendLog("FAILED SERVER ON " + opts_.agentName + " "); - } -} - -void Agent::AllServerOn() -{ - std::lock_guard g(mu_); - std::printf("All Server On. \n"); - for (auto& kv : servers_) ServerOn(kv.first); -} - -// 0x140008c90 (after the wait loop) -void Agent::OnProcessExit(pid_t pid) -{ - std::lock_guard g(mu_); - ServerEntry* e = nullptr; - for (auto& kv : servers_) - if (kv.second.pid == pid) { e = &kv.second; break; } - if (!e) { std::printf("NOT FIND PROCESS ID \n"); return; } - - e->running = false; - session_->NotifyServerState(*e); - session_->NotifyServerStopped(*e); - if (running_ && (e->revive || opts_.reviveAll)) - ServerOn(e->code); - // type==1 follow-up (FUN_140009f20) — purpose UNKNOWN, not ported. -} - -// 0x1400037a0 MagiAgentServer::Run — network setup omitted (ProudNet). -int Agent::Run() -{ - using clock = std::chrono::steady_clock; - std::printf("# Agent Startup #\n\n+ Prepare Startup\n"); - std::printf("\n # Agent Running... #\n"); - if (!opts_.killOnStart.empty()) platform::KillProcessByName(opts_.killOnStart); - - const auto t0 = clock::now(); - auto seconds = [&] { return std::chrono::duration(clock::now() - t0).count(); }; - bool autoOnPending = true; - double lastTick = 0; - while (running_) { - double now = seconds(); - if (opts_.autoServerOnDelay > 0 && now > opts_.autoServerOnDelay && autoOnPending) { - autoOnPending = false; - std::printf("Start Auto Server On. \n"); - AllServerOn(); - } - if (now - lastTick >= 0.1) lastTick = now; // 10 Hz tick: network update (not ported) - platform::SleepMs(1); - } - std::printf("+ Prepare Stop\n# Agent Stoped... #\n"); - return 0; -} - -} // namespace agent diff --git a/src/agent_release/agent.hpp b/src/agent_release/agent.hpp deleted file mode 100644 index d359b7b5..00000000 --- a/src/agent_release/agent.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// agent.hpp — Linux port of the process-supervisor core of Agent_Release_x64.exe. -// Reconstructed from decomp/Agent_Release_x64/cpp/AgentProcessControl.cpp. -// Names are inferred (no PDB). See README.md for what is and is not ported. -#pragma once -#include -#include -#include -#include -#include -#include -#include - -namespace agent { - -// Per-server record (original: hash map at 0x140162d60, ServerEntry offsets -// +0x04 code, +0x0c type, +0xa4 pid, +0xc4 running, +0xd5 revive). -struct ServerEntry { - int32_t code = 0; - uint8_t type = 0; - pid_t pid = 0; - bool running = false; - bool revive = false; -}; - -// Server-type table (original: vector at 0x140162d58, type -> exe path). -struct ServerTypeInfo { - std::string exePath; // may include fixed arguments - std::string workDir; // original derives it from the exe path (FUN_14002fe90) -}; - -// Agent options (original: singleton at 0x140162d68). -struct Options { - std::string agentName = "AGENT"; // +0x030 - bool useCodeAsArgument = true; // +0x152 - bool reviveAll = false; // +0x171 - double autoServerOnDelay = 0.0; // +0x178, seconds; <= 0 disables - std::string killOnStart; // exe of server type 0x18 (identity UNKNOWN) -}; - -// Stand-in for the ProudNet RMI proxy to AgentManager -// (AGENT2AGENTMANAGER_PROTOCOL::Proxy, vtable slots +0x40 / +0x50). -// ProudNet is proprietary and the wire protocol is not yet decoded, so this -// interface only logs. Replace with a real transport once the protocol is known. -class IManagerSession { -public: - virtual ~IManagerSession() = default; - virtual void NotifyServerState(const ServerEntry& e) = 0; // slot +0x40 - virtual void NotifyServerStopped(const ServerEntry& e) = 0; // slot +0x50 - virtual void SendLog(const std::string& text) = 0; -}; - -class LoggingManagerSession : public IManagerSession { -public: - void NotifyServerState(const ServerEntry& e) override; - void NotifyServerStopped(const ServerEntry& e) override; - void SendLog(const std::string& text) override; -}; - -class Agent { -public: - Agent(Options opts, std::map types, - std::unique_ptr session); - - void AddServer(const ServerEntry& e); - void ServerOn(int32_t code); // 0x140008ea0 - void AllServerOn(); // 0x140009bd0 (inferred: ServerOn for every entry) - int Run(); // 0x1400037a0 MagiAgentServer::Run - void Stop() { running_ = false; } - -private: - void OnProcessExit(pid_t pid); // body of watcher thread 0x140008c90 - std::string BuildCommandLine(const ServerEntry& e) const; - - Options opts_; - std::map types_; - std::unique_ptr session_; - std::map servers_; - std::recursive_mutex mu_; // original has no visible lock here (UNKNOWN) - std::atomic running_{true}; -}; - -} // namespace agent diff --git a/src/agent_release/main.cpp b/src/agent_release/main.cpp deleted file mode 100644 index b7797d89..00000000 --- a/src/agent_release/main.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// main.cpp — entry point. The original reads option\*.xml (format not yet -// recovered); this port takes the equivalent settings on the command line. -#include "agent.hpp" -#include "platform.hpp" - -#include -#include -#include -#include - -static agent::Agent* g_agent = nullptr; -static void OnSignal(int) { if (g_agent) g_agent->Stop(); } - -static void Usage() -{ - std::printf( - "usage: agent_release [options] --server CODE:TYPE:REVIVE --type TYPE:EXE[:WORKDIR] ...\n" - " --auto-on SEC start all servers SEC seconds after startup\n" - " --revive-all relaunch any server that exits\n" - " --no-code-arg do not pass the server code as argv[1]\n" - " --kill-on-start EXE kill the first process named EXE before running\n" - " --name NAME agent name used in log messages\n"); -} - -int main(int argc, char** argv) -{ - agent::Options opts; - std::map types; - std::vector servers; - - for (int i = 1; i < argc; ++i) { - std::string a = argv[i]; - auto next = [&]() -> std::string { - if (i + 1 >= argc) { Usage(); std::exit(2); } - return argv[++i]; - }; - if (a == "--auto-on") opts.autoServerOnDelay = std::stod(next()); - else if (a == "--revive-all") opts.reviveAll = true; - else if (a == "--no-code-arg") opts.useCodeAsArgument = false; - else if (a == "--kill-on-start") opts.killOnStart = next(); - else if (a == "--name") opts.agentName = next(); - else if (a == "--type") { - std::string v = next(); - auto p1 = v.find(':'); - if (p1 == std::string::npos) { Usage(); return 2; } - auto p2 = v.find(':', p1 + 1); - agent::ServerTypeInfo t; - t.exePath = v.substr(p1 + 1, p2 == std::string::npos ? std::string::npos : p2 - p1 - 1); - if (p2 != std::string::npos) t.workDir = v.substr(p2 + 1); - types[static_cast(std::stoi(v.substr(0, p1)))] = t; - } else if (a == "--server") { - std::string v = next(); - agent::ServerEntry e; - int code = 0, type = 0, revive = 0; - if (std::sscanf(v.c_str(), "%d:%d:%d", &code, &type, &revive) < 2) { Usage(); return 2; } - e.code = code; e.type = static_cast(type); e.revive = revive != 0; - servers.push_back(e); - } else { Usage(); return a == "-h" || a == "--help" ? 0 : 2; } - } - - platform::SingleInstanceLock lock("RustyHearts_Agent"); // Global\RustyHearts_Agent - if (!lock.acquired()) return 1; - - agent::Agent ag(opts, types, std::make_unique()); - for (auto& e : servers) ag.AddServer(e); - g_agent = &ag; - std::signal(SIGINT, OnSignal); - std::signal(SIGTERM, OnSignal); - return ag.Run(); -} diff --git a/src/agent_release/meson.build b/src/agent_release/meson.build deleted file mode 100644 index 11ec7d75..00000000 --- a/src/agent_release/meson.build +++ /dev/null @@ -1,6 +0,0 @@ -threads = dependency('threads') - -executable('agent_release', - ['main.cpp', 'agent.cpp', 'platform.cpp'], - dependencies : threads, - install : false) diff --git a/src/agent_release/platform.cpp b/src/agent_release/platform.cpp deleted file mode 100644 index f34e71b3..00000000 --- a/src/agent_release/platform.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// platform.cpp — Linux implementations; Win32 originals cited per function. -#include "platform.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -extern char** environ; - -namespace platform { - -SingleInstanceLock::SingleInstanceLock(const std::string& name) -{ - // "Global\\" kernel-object namespace -> machine-wide lock file in /tmp. - std::string path = "/tmp/" + name + ".lock"; - fd_ = ::open(path.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0644); - if (fd_ < 0) { - std::printf("ERROR_ACCESS_DENIED!!! %s \n", path.c_str()); - } else if (::flock(fd_, LOCK_EX | LOCK_NB) != 0) { - std::printf("ERROR_ALREADY_EXISTS!!! %s \n", path.c_str()); - ::close(fd_); - fd_ = -1; - } - if (fd_ < 0) SleepMs(3000); // original sleeps 3 s before failing -} - -SingleInstanceLock::~SingleInstanceLock() -{ - if (fd_ >= 0) ::close(fd_); -} - -pid_t LaunchProcess(const std::string& commandLine, const std::string& workDir) -{ - std::istringstream in(commandLine); - std::vector args; - for (std::string a; in >> a;) args.push_back(a); - if (args.empty()) return 0; - std::vector argv; - for (auto& a : args) argv.push_back(a.data()); - argv.push_back(nullptr); - - posix_spawn_file_actions_t fa; - posix_spawn_file_actions_init(&fa); - if (!workDir.empty()) posix_spawn_file_actions_addchdir_np(&fa, workDir.c_str()); - posix_spawnattr_t attr; - posix_spawnattr_init(&attr); - posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSID); // ~ CREATE_NEW_CONSOLE - - pid_t pid = 0; - int rc = posix_spawnp(&pid, argv[0], &fa, &attr, argv.data(), environ); - posix_spawnattr_destroy(&attr); - posix_spawn_file_actions_destroy(&fa); - - if (rc != 0) { - std::printf("=======Server Fail=======\n"); - std::printf("Path\t: [%s] \n", workDir.c_str()); - std::printf("File\t: [%s] (%s)\n", commandLine.c_str(), std::strerror(rc)); - pid = 0; - } else { - std::printf("=======ServerOn=======\n"); - } - std::printf("//////////////////////////////////////////////////////////////////////////\n"); - SleepMs(1000); // kept: original sleeps 1 s after every launch attempt - return pid; -} - -void WatchProcess(pid_t pid, std::function onExit) -{ - // pid passed by value: avoids the original's stack-pointer race. - std::thread([pid, onExit = std::move(onExit)] { - int status = 0; - while (::waitpid(pid, &status, 0) < 0 && errno == EINTR) {} - onExit(pid); // waitpid reaps the child: no handle/zombie leak - }).detach(); -} - -static std::string ProcArgv0Basename(const char* pidDir) -{ - std::ifstream f(std::string("/proc/") + pidDir + "/cmdline", std::ios::binary); - std::string argv0; - std::getline(f, argv0, '\0'); - auto slash = argv0.find_last_of('/'); - return slash == std::string::npos ? argv0 : argv0.substr(slash + 1); -} - -bool KillProcessByName(const std::string& exeName) -{ - if (exeName.empty()) return false; - DIR* d = ::opendir("/proc"); - if (!d) return false; - bool killed = false; - while (dirent* e = ::readdir(d)) { - char* end = nullptr; - long pid = std::strtol(e->d_name, &end, 10); - if (*end != '\0' || pid <= 0 || pid == ::getpid()) continue; - if (::strcasecmp(ProcArgv0Basename(e->d_name).c_str(), exeName.c_str()) != 0) continue; - if (::kill(static_cast(pid), SIGKILL) == 0) { - std::printf("Process Kill.!!! [%s] \n", exeName.c_str()); - killed = true; - break; // original stops at the first match - } - } - ::closedir(d); - return killed; -} - -void SleepMs(unsigned ms) -{ - std::this_thread::sleep_for(std::chrono::milliseconds(ms)); -} - -} // namespace platform diff --git a/src/agent_release/platform.hpp b/src/agent_release/platform.hpp deleted file mode 100644 index 891a8718..00000000 --- a/src/agent_release/platform.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// platform.hpp — Linux substitutes for the Win32 calls used by -// Agent_Release_x64.exe (see decomp/Agent_Release_x64/cpp/AgentProcessControl.cpp). -#pragma once -#include -#include -#include - -namespace platform { - -// Replaces CreateMutexW(L"Global\\RustyHearts_Agent") (0x1400100b0). -// Uses an exclusive flock() on a lock file; released automatically on exit. -class SingleInstanceLock { -public: - explicit SingleInstanceLock(const std::string& name); - ~SingleInstanceLock(); - bool acquired() const { return fd_ >= 0; } -private: - int fd_ = -1; -}; - -// Replaces CreateProcessW(..., CREATE_NEW_CONSOLE, ..., workDir) (0x1400094e0). -// commandLine is split on whitespace (the original passes one string to Windows). -// The child gets its own session (setsid) as the nearest analogue of a new console. -// Returns pid > 0, or 0 on failure (same contract as the original). -pid_t LaunchProcess(const std::string& commandLine, const std::string& workDir); - -// Replaces the watcher's GetExitCodeProcess polling loop (0x140008c90) with a -// blocking waitpid(). Calls onExit(pid) on a detached thread once the child exits. -void WatchProcess(pid_t pid, std::function onExit); - -// Replaces Toolhelp32 + OpenProcess + TerminateProcess (0x140009780). -// Scans /proc, matches basename of argv[0] case-insensitively, kills the FIRST -// match with SIGKILL (TerminateProcess is unconditional), returns true if killed. -bool KillProcessByName(const std::string& exeName); - -// Replaces Sleep(ms). -void SleepMs(unsigned ms); - -} // namespace platform diff --git a/src/meson.build b/src/meson.build deleted file mode 100644 index bced57da..00000000 --- a/src/meson.build +++ /dev/null @@ -1,7 +0,0 @@ -# Linux reconstructions of the Rusty Hearts server binaries. -# Each sub-folder ports one binary; see its README.md for provenance and gaps. -project('rusty-hearts-recon', 'cpp', - version : '0.1.0', - default_options : ['cpp_std=c++17', 'warning_level=3', 'buildtype=debugoptimized']) - -subdir('agent_release')