From 4d9b800efb1aeb1dcbc966a7b5e45216d4a240fb Mon Sep 17 00:00:00 2001 From: shenlei Date: Wed, 23 Sep 2026 15:02:14 +0900 Subject: [PATCH] 2V1-b/c: PythonNetworkStream phases, AccountConnector and the net module Port PythonNetworkStream with its HandShake/Login/Select/Loading/Offline phases, AccountConnector and PythonNetworkStreamModule verbatim; the net stub goes. PythonBoot creates the network stream, account connector, player, flying manager and effect manager like CPythonApplication, and app.Create/Process drive CNetworkDevice and both connectors. Packet.h long fields become 32-bit LONG; port.packet checks 38 login/select/loading packet sizes against wire_classic.h. Unported units in the link closure live under platform/pending/ as stand-ins. The macOS gate now builds all and finds iconv. Co-Authored-By: Claude Opus 5.5 --- audit/history.jsonl | 1 + docs/PORT-PLAN.md | 6 +- .../platform/ScriptLib/GameplayModules.cpp | 264 --- .../src/platform/ScriptLib/PythonBoot.cpp | 32 + .../src/platform/UserInterface/ProcessCRC.cpp | 23 + .../UserInterface/PythonApplication.cpp | 59 +- .../platform/UserInterface/UserInterface.cpp | 3 + .../platform/UserInterface/WiseLogicXTrap.cpp | 29 + .../pending/GameLib/FlyingObjectManager.cpp | 76 + .../UserInterface/GuildMarkDownloader.cpp | 164 ++ .../UserInterface/GuildMarkUploader.cpp | 163 ++ .../pending/UserInterface/MarkManager.cpp | 158 ++ .../UserInterface/NetworkActorManager.cpp | 177 ++ .../pending/UserInterface/PythonGuild.cpp | 13 + .../PythonNetworkStreamPhaseGame.cpp | 304 +++ .../PythonNetworkStreamPhaseGameActor.cpp | 15 + .../PythonNetworkStreamPhaseGameItem.cpp | 113 + .../pending/UserInterface/PythonPlayer.cpp | 1348 ++++++++++++ extension/src/port/CMakeLists.txt | 10 +- extension/src/port/EterBase/Singleton.h | 5 +- .../port/UserInterface/AccountConnector.cpp | 745 +++++++ .../UserInterface/AffectFlagContainer.cpp | 92 + .../src/port/UserInterface/InsultChecker.cpp | 97 + .../port/UserInterface/NetworkActorManager.h | 164 ++ extension/src/port/UserInterface/Packet.h | 92 +- extension/src/port/UserInterface/ProcessCRC.h | 6 + .../UserInterface/PythonNetworkStream.cpp | 911 ++++++++ .../PythonNetworkStreamEvent.cpp | 18 + .../PythonNetworkStreamModule.cpp | 1932 +++++++++++++++++ .../PythonNetworkStreamPhaseHandShake.cpp | 331 +++ .../PythonNetworkStreamPhaseLoading.cpp | 361 +++ .../PythonNetworkStreamPhaseLogin.cpp | 416 ++++ .../PythonNetworkStreamPhaseOffline.cpp | 22 + .../PythonNetworkStreamPhaseSelect.cpp | 308 +++ .../port/UserInterface/PythonPackModule.cpp | 5 - extension/src/port/UserInterface/StdAfx.h | 1 + extension/src/port/UserInterface/Test.h | 3 + .../src/port/UserInterface/WiseLogicXTrap.h | 8 + .../port/common/shim/sdk/Python-2.7/grammar.h | 5 + .../src/port/common/shim/win32/windows.h | 3 + extension/tests/port_packet_test.cpp | 77 + extension/tests/port_packet_test_wire.cpp | 49 + project/python_host_check.gd | 4 +- script/port_gate.sh | 3 +- 44 files changed, 8292 insertions(+), 324 deletions(-) create mode 100644 extension/src/platform/UserInterface/ProcessCRC.cpp create mode 100644 extension/src/platform/UserInterface/WiseLogicXTrap.cpp create mode 100644 extension/src/platform/pending/GameLib/FlyingObjectManager.cpp create mode 100644 extension/src/platform/pending/UserInterface/GuildMarkDownloader.cpp create mode 100644 extension/src/platform/pending/UserInterface/GuildMarkUploader.cpp create mode 100644 extension/src/platform/pending/UserInterface/MarkManager.cpp create mode 100644 extension/src/platform/pending/UserInterface/NetworkActorManager.cpp create mode 100644 extension/src/platform/pending/UserInterface/PythonGuild.cpp create mode 100644 extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp create mode 100644 extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp create mode 100644 extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp create mode 100644 extension/src/platform/pending/UserInterface/PythonPlayer.cpp create mode 100644 extension/src/port/UserInterface/AccountConnector.cpp create mode 100644 extension/src/port/UserInterface/AffectFlagContainer.cpp create mode 100644 extension/src/port/UserInterface/InsultChecker.cpp create mode 100644 extension/src/port/UserInterface/NetworkActorManager.h create mode 100644 extension/src/port/UserInterface/ProcessCRC.h create mode 100644 extension/src/port/UserInterface/PythonNetworkStream.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamEvent.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamModule.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamPhaseHandShake.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamPhaseLoading.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamPhaseLogin.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamPhaseOffline.cpp create mode 100644 extension/src/port/UserInterface/PythonNetworkStreamPhaseSelect.cpp create mode 100644 extension/src/port/UserInterface/Test.h create mode 100644 extension/src/port/UserInterface/WiseLogicXTrap.h create mode 100644 extension/tests/port_packet_test.cpp create mode 100644 extension/tests/port_packet_test_wire.cpp diff --git a/audit/history.jsonl b/audit/history.jsonl index e7821d69..76464703 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -508,3 +508,4 @@ {"time": "2026-09-23T04:35:58Z", "event": "port_round", "unit": "PORT-PLAN 2V0-f: real system.py app loop in Godot (complete)", "ported": ["CGraphicExpandedImageInstance::OnRender and SetRenderingRect (40250 verbatim)", "CGraphicImageInstance::OnRender (40250 verbatim)", "CGraphicBase::GetColor / CPythonGraphic::GenerateColor"], "adapted": ["script fiber runs system.py app.Loop; UIUpdate = one CPythonApplication::Process", "image render commands carry base texture name + quad + UV (D3D -0.5 offset compensated)", "PythonBoot Stop clears the launcher before window manager teardown like 40250 Main", "MT_TEST_MODE=python_ui visible mode"], "tests": ["port.app_loop", "python_host_test.gd"], "todo": ["fnt/CGraphicText font pipeline and text alignment", "ExpandedImage blend modes"]} {"time": "2026-09-23T05:15:20Z", "event": "port_round", "unit": "PORT-PLAN 2V0-g: .fnt font pipeline (CGraphicText/CGraphicFontTexture/CGraphicDib/CGraphicTextInstance)", "ported": ["EterLib/GrpText.cpp, GrpFontTexture.cpp, GrpDIB.cpp (40250 verbatim)", "EterLib/GrpTextInstance.cpp (verbatim except D3D draw -> UI render commands)", "EterLib/TextTag, EterLocale/StringCodec, Arabic, StringCodec_Vietnamese (port_copy)", "EterLib/Util.cpp code page / font face table, SetDefaultCodePage", "UserInterface/GameType.cpp DefaultFont_* block", "CGraphicImageTexture Create/Lock/Unlock memory texture path", "GetMaxTextureWidth/Height"], "adapted": ["GDI subset (CreateFontIndirect, CreateDIBSection, TextOutW, GetTextExtentPoint32W, GetCharABCWidthsFloatW) emulated over vendored FreeType 2.13.3 with GDI cell-height/win-metric/gasp rules", "MultiByteToWideChar/WideCharToMultiByte: hand UTF-8/1252, iconv for other code pages", "glyph pages reach Godot as mem:@ memory textures; Canvas caches by id", "PythonBoot::Start calls SetDefaultCodePage(LocaleService_GetCodePage()) like 40250 Main", "CPythonResource registers fnt -> CGraphicText"], "divergent": ["Android /system/fonts has no Tahoma/Gulim: substitute faces change metrics until fonts are bundled", "no per-pixel comparison against Windows GDI output yet"], "needs_live": [], "tests": ["port.text: pass (Tahoma 12 height 12, width, PixelPositionToCharacterPosition, centre align, CP949 round trip)", "port.app_loop: pass (popup glyph quads, inked glyph page)", "ctest 31/31 pass", "godot --headless --path project --script python_host_test.gd: pass", "login screen screenshot: server list, popup and button captions rendered"], "todo": ["ExpandedImage blend modes", "Android font bundling", "2V1 login/select"]} {"time": "2026-09-23T05:25:43Z", "event": "port_round", "unit": "PORT-PLAN 2V1-a: EterLib network layer + EterBase cipher", "ported": ["EterLib/NetStream.cpp, NetAddress.cpp, NetDevice.cpp, NetPacketHeaderMap.cpp (port_copy verbatim)", "EterBase/cipher.cpp (port_copy verbatim, Crypto++ DH2 key agreement + CTR block ciphers)"], "adapted": ["shim/win32/winsock.h: Winsock names over BSD sockets; select ignores nfds and drops writable sockets without a peer (Winsock reports a failed connect only in exceptfds); EINPROGRESS -> WSAEWOULDBLOCK; ioctlsocket FIONBIO; WSAStartup ignores SIGPIPE"], "divergent": [], "needs_live": ["cipher agreement against the 40250 game server (2V1-e)"], "tests": ["port.net: pass (loopback connect, send/recv, peer close, refused-connect timeout, client/server cipher agreement)"], "todo": ["2V1-b PythonNetworkStream phases", "2V1-c net module", "2V1-d FakeServer", "2V1-e live smoke"]} +{"time": "2026-09-23T06:00:34Z", "event": "port_round", "unit": "PORT-PLAN 2V1-b/c: PythonNetworkStream phases + AccountConnector + net module", "ported": ["UserInterface/PythonNetworkStream.cpp, PythonNetworkStreamEvent.cpp, PhaseHandShake/Login/Select/Loading/Offline (port_copy verbatim)", "UserInterface/AccountConnector.cpp, InsultChecker.cpp, AffectFlagContainer.cpp (port_copy verbatim)", "UserInterface/PythonNetworkStreamModule.cpp (net module, replaces the 2V0-e stub)", "PythonPackModule.cpp login-key functions compiled again", "Locale.cpp LocaleService_Is*/security key block (platform PythonApplication.cpp, verbatim)", "WiseLogicXTrap no-XTRAP branch"], "adapted": ["Packet.h long fields -> 32-bit LONG (PORT)", "singleton pointer offset via intptr_t (PORT)", "grammar.h shim #undef BYTE (40250's bitset.h copy drops #define BYTE char)", "PythonBoot creates CPythonNetworkStream/CAccountConnector/CPythonPlayer/CFlyingManager/CEffectManager and calls initnet()", "app.Create creates CNetworkDevice; Process() runs CPythonNetworkStream then CAccountConnector", "port_gate.sh macos builds all; port-only config finds iconv"], "divergent": ["ProcessCRC stubbed (magic cube piece only feeds PhaseGame attack packets)", "unported logic units in the link closure (PythonPlayer, NetworkActorManager, FlyingObjectManager, GuildMarkDownloader/Uploader, MarkManager, PhaseGame*/PythonGuild members) are stand-ins under platform/pending/; loading-phase CharacterUpdate/PointChange/ItemSet/QuickSlotAdd stand-ins only consume the packet", "guild mark uploader/downloader Process not called yet"], "needs_live": ["login/select/loading against the 40250 server (2V1-e)"], "tests": ["port.packet: pass (38 login/select/loading packet sizes match wire_classic.h)", "ctest 33/33 pass", "script/port_gate.sh macos: PASS", "godot --headless --path project --script python_host_test.gd: pass (net is the ported module)"], "todo": ["2V1-d FakeServer HandShake->Login->Select->Loading", "2V1-e live smoke", "port the platform/pending units"]} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index d7576548..a6c7e05a 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -314,7 +314,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 `system.py` 与 `CEterPackManager` 的字节数一致,并能读 `uiscript/selectcharacterwindow.py`、 `locale/en/locale_game.txt`,非 `.py/.pyc/.txt` 和不存在的文件返回 `None`。 `UserInterface/StdAfx.h` 只镜像了当前能编的部分(原文件 include 整个客户端和 DirectShow), - `PythonPackModule.cpp` 里属于 `CAccountConnector` 的登录密钥函数原样保留但编译时排除,随 2V1 回来。 + `PythonPackModule.cpp` 里属于 `CAccountConnector` 的登录密钥函数原样保留但编译时排除,2V1-b 已恢复编译。 **已完成(3c 落盘)**:`make_stdlib_zip.py` 额外写出 `python27.zip.sha256`;构建把两个文件 `copy_if_different` 到 `project/`(目标 `mtpython_stdlib_project`,两文件 gitignore), 导出预设的 `include_filter` 列出它们,所以它们进 PCK——`--export-pack` 验证过两个条目都在。 @@ -409,8 +409,8 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | 子步骤 | 内容 | 状态 | | --- | --- | --- | | 2V1-a | `EterLib/NetStream`、`NetAddress`、`NetDevice`、`NetPacketHeaderMap`、`EterBase/cipher.cpp` | 完成:五个文件 `port_copy` 原样(含 32768 字节序列表、`_IMPROVED_PACKET_ENCRYPTION_` 的 Crypto++ DH2 + CTR 路径);`shim/win32/winsock.h` 把 Winsock 名字映射到 BSD socket,并补齐两处语义差异:`select` 忽略 nfds,connect 失败的 socket 不算可写(Winsock 只在 exceptfds 报,40250 靠超时判失败);非阻塞 connect 的 `EINPROGRESS` 报成 `WSAEWOULDBLOCK`;`WSAStartup` 忽略 SIGPIPE。`port.net` 用 loopback 覆盖连接、收发、对端断开、拒绝连接超时和双方密钥协商后的加解密 | - | 2V1-b | `PythonNetworkStream` + HandShake/Login/Select/Loading phase + `AccountConnector` | 待做 | - | 2V1-c | `net` 模块(`PythonNetworkStreamModule.cpp`)替换 2V0-e 的桩;`app.Create`/`Process` 接网络 | 待做 | + | 2V1-b | `PythonNetworkStream` + HandShake/Login/Select/Loading phase + `AccountConnector` | 完成:`PythonNetworkStream{,Event,PhaseHandShake,PhaseLogin,PhaseSelect,PhaseLoading,PhaseOffline}.cpp`、`AccountConnector.cpp`、`InsultChecker.cpp`、`AffectFlagContainer.cpp` 原样 `port_copy`;`Packet.h` 里所有 `long` 字段改为 32 位 `LONG`(PORT 标注),`port.packet` 把登录/选角/Loading 用到的 38 个包的尺寸与已在真服 1:1 验证过的 `net/classic/wire_classic.h` 比对(两头宏冲突,分两个编译单元);`PythonPackModule.cpp` 的登录密钥函数恢复编译;`Locale.cpp` 的 `LocaleService_Is*`/安全密钥部分原样放进 platform `PythonApplication.cpp`;`WiseLogicXTrap` 取 40250 无 XTRAP 分支,`ProcessCRC` 为桩(魔方只用于 PhaseGame 攻击包)。链接闭包里尚未移植的逻辑单元(`PythonPlayer`、`NetworkActorManager`、`FlyingObjectManager`、`GuildMark*`、`MarkManager`、PhaseGame*/`PythonGuild` 的部分成员)放在 `extension/src/platform/pending//` 作为替身,移植对应单元的提交里删除;Loading 阶段会收到的 CharacterUpdate/PointChange/ItemSet/QuickSlotAdd 替身只吃掉包体,保证读流不断。`port_gate.sh macos` 改为构建 `all`(此前 ctest 会跑门禁没构建的测试),port-only 配置补 `find_library(iconv)` | + | 2V1-c | `net` 模块(`PythonNetworkStreamModule.cpp`)替换 2V0-e 的桩;`app.Create`/`Process` 接网络 | 完成:`PythonNetworkStreamModule.cpp` 原样移植,`GameplayModules.cpp` 的 `net` 桩删除,`PythonBoot` 按 40250 `CPythonApplication` 成员顺序创建 `CPythonNetworkStream`/`CAccountConnector`/`CPythonPlayer`/`CFlyingManager`/`CEffectManager` 并调用 `initnet()`;`app.Create` 创建 `CNetworkDevice`,`Process()` 每帧先 `CPythonNetworkStream::Process` 再 `CAccountConnector::Process`(公会标记上传/下载的 Process 随 `GuildMark*` 移植)。`python_host_test.gd` 断言 `net` 不再是桩(`PHASE_WINDOW_SELECT == 2`、未连接) | | 2V1-d | FakeServer 离线跑完 HandShake→Login→Select→Loading | 待做 | | 2V1-e | 真服 smoke(凭据只从环境变量读) | 待做 | 3. **2V2 — GamePhase/角色显示**:加入 GamePhase 的最小分派闭包、`PythonCharacterManager`、`InstanceBase`、`ActorInstance` diff --git a/extension/src/platform/ScriptLib/GameplayModules.cpp b/extension/src/platform/ScriptLib/GameplayModules.cpp index e5663f31..dd59e211 100644 --- a/extension/src/platform/ScriptLib/GameplayModules.cpp +++ b/extension/src/platform/ScriptLib/GameplayModules.cpp @@ -869,262 +869,6 @@ PyMethodDef methods_miniMap[] = { }; const char* ints_miniMap[] = {"TYPE_OPC", "TYPE_OPCPVP", "TYPE_OPCPVPSELF", "TYPE_NPC", "TYPE_MONSTER", "TYPE_WARP", "TYPE_WAYPOINT", "TYPE_PARTY", "TYPE_EMPIRE", NULL}; const char* strings_miniMap[] = {NULL}; -// 40250 UserInterface/PythonNetworkStreamModule.cpp: net export names. -PyObject* stub_net_GetBettingGuildWarValue(PyObject*, PyObject*) { return stub_call_named("net.GetBettingGuildWarValue"); } -PyObject* stub_net_EnableChatInsultFilter(PyObject*, PyObject*) { return stub_call_named("net.EnableChatInsultFilter"); } -PyObject* stub_net_SetServerInfo(PyObject*, PyObject*) { return stub_call_named("net.SetServerInfo"); } -PyObject* stub_net_GetServerInfo(PyObject*, PyObject*) { return stub_call_named("net.GetServerInfo"); } -PyObject* stub_net_PreserveServerCommand(PyObject*, PyObject*) { return stub_call_named("net.PreserveServerCommand"); } -PyObject* stub_net_GetPreservedServerCommand(PyObject*, PyObject*) { return stub_call_named("net.GetPreservedServerCommand"); } -PyObject* stub_net_StartGame(PyObject*, PyObject*) { return stub_call_named("net.StartGame"); } -PyObject* stub_net_Warp(PyObject*, PyObject*) { return stub_call_named("net.Warp"); } -PyObject* stub_net_IsTest(PyObject*, PyObject*) { return stub_call_named("net.IsTest"); } -PyObject* stub_net_SetMarkServer(PyObject*, PyObject*) { return stub_call_named("net.SetMarkServer"); } -PyObject* stub_net_IsChatInsultIn(PyObject*, PyObject*) { return stub_call_named("net.IsChatInsultIn"); } -PyObject* stub_net_IsInsultIn(PyObject*, PyObject*) { return stub_call_named("net.IsInsultIn"); } -PyObject* stub_net_LoadInsultList(PyObject*, PyObject*) { return stub_call_named("net.LoadInsultList"); } -PyObject* stub_net_UploadMark(PyObject*, PyObject*) { return stub_call_named("net.UploadMark"); } -PyObject* stub_net_UploadSymbol(PyObject*, PyObject*) { return stub_call_named("net.UploadSymbol"); } -PyObject* stub_net_GetGuildID(PyObject*, PyObject*) { return stub_call_named("net.GetGuildID"); } -PyObject* stub_net_GetEmpireID(PyObject*, PyObject*) { return stub_call_named("net.GetEmpireID"); } -PyObject* stub_net_GetMainActorVID(PyObject*, PyObject*) { return stub_call_named("net.GetMainActorVID"); } -PyObject* stub_net_GetMainActorRace(PyObject*, PyObject*) { return stub_call_named("net.GetMainActorRace"); } -PyObject* stub_net_GetMainActorEmpire(PyObject*, PyObject*) { return stub_call_named("net.GetMainActorEmpire"); } -PyObject* stub_net_GetMainActorSkillGroup(PyObject*, PyObject*) { return stub_call_named("net.GetMainActorSkillGroup"); } -PyObject* stub_net_GetAccountCharacterSlotDataInteger(PyObject*, PyObject*) { return stub_call_named("net.GetAccountCharacterSlotDataInteger"); } -PyObject* stub_net_GetAccountCharacterSlotDataString(PyObject*, PyObject*) { return stub_call_named("net.GetAccountCharacterSlotDataString"); } -PyObject* stub_net_GetFieldMusicFileName(PyObject*, PyObject*) { return stub_call_named("net.GetFieldMusicFileName"); } -PyObject* stub_net_GetFieldMusicVolume(PyObject*, PyObject*) { return stub_call_named("net.GetFieldMusicVolume"); } -PyObject* stub_net_ToggleGameDebugInfo(PyObject*, PyObject*) { return stub_call_named("net.ToggleGameDebugInfo"); } -PyObject* stub_net_SetLoginInfo(PyObject*, PyObject*) { return stub_call_named("net.SetLoginInfo"); } -PyObject* stub_net_SetPhaseWindow(PyObject*, PyObject*) { return stub_call_named("net.SetPhaseWindow"); } -PyObject* stub_net_ClearPhaseWindow(PyObject*, PyObject*) { return stub_call_named("net.ClearPhaseWindow"); } -PyObject* stub_net_SetServerCommandParserWindow(PyObject*, PyObject*) { return stub_call_named("net.SetServerCommandParserWindow"); } -PyObject* stub_net_SetAccountConnectorHandler(PyObject*, PyObject*) { return stub_call_named("net.SetAccountConnectorHandler"); } -PyObject* stub_net_SetHandler(PyObject*, PyObject*) { return stub_call_named("net.SetHandler"); } -PyObject* stub_net_SetTCPRecvBufferSize(PyObject*, PyObject*) { return stub_call_named("net.SetTCPRecvBufferSize"); } -PyObject* stub_net_SetTCPSendBufferSize(PyObject*, PyObject*) { return stub_call_named("net.SetTCPSendBufferSize"); } -PyObject* stub_net_SetUDPRecvBufferSize(PyObject*, PyObject*) { return stub_call_named("net.SetUDPRecvBufferSize"); } -PyObject* stub_net_DirectEnter(PyObject*, PyObject*) { return stub_call_named("net.DirectEnter"); } -PyObject* stub_net_LogOutGame(PyObject*, PyObject*) { return stub_call_named("net.LogOutGame"); } -PyObject* stub_net_ExitGame(PyObject*, PyObject*) { return stub_call_named("net.ExitGame"); } -PyObject* stub_net_ExitApplication(PyObject*, PyObject*) { return stub_call_named("net.ExitApplication"); } -PyObject* stub_net_ConnectTCP(PyObject*, PyObject*) { return stub_call_named("net.ConnectTCP"); } -PyObject* stub_net_ConnectUDP(PyObject*, PyObject*) { return stub_call_named("net.ConnectUDP"); } -PyObject* stub_net_ConnectToAccountServer(PyObject*, PyObject*) { return stub_call_named("net.ConnectToAccountServer"); } -PyObject* stub_net_SendLoginPacket(PyObject*, PyObject*) { return stub_call_named("net.SendLoginPacket"); } -PyObject* stub_net_SendChinaMatrixCardPacket(PyObject*, PyObject*) { return stub_call_named("net.SendChinaMatrixCardPacket"); } -PyObject* stub_net_SendRunupMatrixCardPacket(PyObject*, PyObject*) { return stub_call_named("net.SendRunupMatrixCardPacket"); } -PyObject* stub_net_SendNEWCIBNPasspodAnswerPacket(PyObject*, PyObject*) { return stub_call_named("net.SendNEWCIBNPasspodAnswerPacket"); } -PyObject* stub_net_SendSelectEmpirePacket(PyObject*, PyObject*) { return stub_call_named("net.SendSelectEmpirePacket"); } -PyObject* stub_net_SendSelectCharacterPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSelectCharacterPacket"); } -PyObject* stub_net_SendChangeNamePacket(PyObject*, PyObject*) { return stub_call_named("net.SendChangeNamePacket"); } -PyObject* stub_net_SendCreateCharacterPacket(PyObject*, PyObject*) { return stub_call_named("net.SendCreateCharacterPacket"); } -PyObject* stub_net_SendDestroyCharacterPacket(PyObject*, PyObject*) { return stub_call_named("net.SendDestroyCharacterPacket"); } -PyObject* stub_net_SendEnterGamePacket(PyObject*, PyObject*) { return stub_call_named("net.SendEnterGamePacket"); } -PyObject* stub_net_SendItemUsePacket(PyObject*, PyObject*) { return stub_call_named("net.SendItemUsePacket"); } -PyObject* stub_net_SendItemUseToItemPacket(PyObject*, PyObject*) { return stub_call_named("net.SendItemUseToItemPacket"); } -PyObject* stub_net_SendItemDropPacket(PyObject*, PyObject*) { return stub_call_named("net.SendItemDropPacket"); } -PyObject* stub_net_SendItemDropPacketNew(PyObject*, PyObject*) { return stub_call_named("net.SendItemDropPacketNew"); } -PyObject* stub_net_SendElkDropPacket(PyObject*, PyObject*) { return stub_call_named("net.SendElkDropPacket"); } -PyObject* stub_net_SendGoldDropPacketNew(PyObject*, PyObject*) { return stub_call_named("net.SendGoldDropPacketNew"); } -PyObject* stub_net_SendItemMovePacket(PyObject*, PyObject*) { return stub_call_named("net.SendItemMovePacket"); } -PyObject* stub_net_SendItemPickUpPacket(PyObject*, PyObject*) { return stub_call_named("net.SendItemPickUpPacket"); } -PyObject* stub_net_SendGiveItemPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGiveItemPacket"); } -PyObject* stub_net_SetOfflinePhase(PyObject*, PyObject*) { return stub_call_named("net.SetOfflinePhase"); } -PyObject* stub_net_Disconnect(PyObject*, PyObject*) { return stub_call_named("net.Disconnect"); } -PyObject* stub_net_IsConnect(PyObject*, PyObject*) { return stub_call_named("net.IsConnect"); } -PyObject* stub_net_SendChatPacket(PyObject*, PyObject*) { return stub_call_named("net.SendChatPacket"); } -PyObject* stub_net_SendEmoticon(PyObject*, PyObject*) { return stub_call_named("net.SendEmoticon"); } -PyObject* stub_net_SendWhisperPacket(PyObject*, PyObject*) { return stub_call_named("net.SendWhisperPacket"); } -PyObject* stub_net_SendMobileMessagePacket(PyObject*, PyObject*) { return stub_call_named("net.SendMobileMessagePacket"); } -PyObject* stub_net_SendCharacterPositionPacket(PyObject*, PyObject*) { return stub_call_named("net.SendCharacterPositionPacket"); } -PyObject* stub_net_SendShopEndPacket(PyObject*, PyObject*) { return stub_call_named("net.SendShopEndPacket"); } -PyObject* stub_net_SendShopBuyPacket(PyObject*, PyObject*) { return stub_call_named("net.SendShopBuyPacket"); } -PyObject* stub_net_SendShopSellPacket(PyObject*, PyObject*) { return stub_call_named("net.SendShopSellPacket"); } -PyObject* stub_net_SendShopSellPacketNew(PyObject*, PyObject*) { return stub_call_named("net.SendShopSellPacketNew"); } -PyObject* stub_net_SendExchangeStartPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeStartPacket"); } -PyObject* stub_net_SendExchangeItemAddPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeItemAddPacket"); } -PyObject* stub_net_SendExchangeItemDelPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeItemDelPacket"); } -PyObject* stub_net_SendExchangeElkAddPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeElkAddPacket"); } -PyObject* stub_net_SendExchangeAcceptPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeAcceptPacket"); } -PyObject* stub_net_SendExchangeExitPacket(PyObject*, PyObject*) { return stub_call_named("net.SendExchangeExitPacket"); } -PyObject* stub_net_SendOnClickPacket(PyObject*, PyObject*) { return stub_call_named("net.SendOnClickPacket"); } -PyObject* stub_net_RegisterEmoticonString(PyObject*, PyObject*) { return stub_call_named("net.RegisterEmoticonString"); } -PyObject* stub_net_SendMessengerAddByVIDPacket(PyObject*, PyObject*) { return stub_call_named("net.SendMessengerAddByVIDPacket"); } -PyObject* stub_net_SendMessengerAddByNamePacket(PyObject*, PyObject*) { return stub_call_named("net.SendMessengerAddByNamePacket"); } -PyObject* stub_net_SendMessengerRemovePacket(PyObject*, PyObject*) { return stub_call_named("net.SendMessengerRemovePacket"); } -PyObject* stub_net_SendPartyInvitePacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyInvitePacket"); } -PyObject* stub_net_SendPartyInviteAnswerPacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyInviteAnswerPacket"); } -PyObject* stub_net_SendPartyExitPacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyExitPacket"); } -PyObject* stub_net_SendPartyRemovePacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyRemovePacket"); } -PyObject* stub_net_SendPartySetStatePacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartySetStatePacket"); } -PyObject* stub_net_SendPartyUseSkillPacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyUseSkillPacket"); } -PyObject* stub_net_SendPartyParameterPacket(PyObject*, PyObject*) { return stub_call_named("net.SendPartyParameterPacket"); } -PyObject* stub_net_SendSafeboxSaveMoneyPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSafeboxSaveMoneyPacket"); } -PyObject* stub_net_SendSafeboxWithdrawMoneyPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSafeboxWithdrawMoneyPacket"); } -PyObject* stub_net_SendSafeboxCheckinPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSafeboxCheckinPacket"); } -PyObject* stub_net_SendSafeboxCheckoutPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSafeboxCheckoutPacket"); } -PyObject* stub_net_SendSafeboxItemMovePacket(PyObject*, PyObject*) { return stub_call_named("net.SendSafeboxItemMovePacket"); } -PyObject* stub_net_SendMallCheckoutPacket(PyObject*, PyObject*) { return stub_call_named("net.SendMallCheckoutPacket"); } -PyObject* stub_net_SendAnswerMakeGuildPacket(PyObject*, PyObject*) { return stub_call_named("net.SendAnswerMakeGuildPacket"); } -PyObject* stub_net_SendQuestInputStringPacket(PyObject*, PyObject*) { return stub_call_named("net.SendQuestInputStringPacket"); } -PyObject* stub_net_SendQuestConfirmPacket(PyObject*, PyObject*) { return stub_call_named("net.SendQuestConfirmPacket"); } -PyObject* stub_net_SendGuildAddMemberPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildAddMemberPacket"); } -PyObject* stub_net_SendGuildRemoveMemberPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildRemoveMemberPacket"); } -PyObject* stub_net_SendGuildChangeGradeNamePacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildChangeGradeNamePacket"); } -PyObject* stub_net_SendGuildChangeGradeAuthorityPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildChangeGradeAuthorityPacket"); } -PyObject* stub_net_SendGuildOfferPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildOfferPacket"); } -PyObject* stub_net_SendGuildPostCommentPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildPostCommentPacket"); } -PyObject* stub_net_SendGuildDeleteCommentPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildDeleteCommentPacket"); } -PyObject* stub_net_SendGuildRefreshCommentsPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildRefreshCommentsPacket"); } -PyObject* stub_net_SendGuildChangeMemberGradePacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildChangeMemberGradePacket"); } -PyObject* stub_net_SendGuildUseSkillPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildUseSkillPacket"); } -PyObject* stub_net_SendGuildChangeMemberGeneralPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildChangeMemberGeneralPacket"); } -PyObject* stub_net_SendGuildInviteAnswerPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildInviteAnswerPacket"); } -PyObject* stub_net_SendGuildChargeGSPPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildChargeGSPPacket"); } -PyObject* stub_net_SendGuildDepositMoneyPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildDepositMoneyPacket"); } -PyObject* stub_net_SendGuildWithdrawMoneyPacket(PyObject*, PyObject*) { return stub_call_named("net.SendGuildWithdrawMoneyPacket"); } -PyObject* stub_net_SendRequestRefineInfoPacket(PyObject*, PyObject*) { return stub_call_named("net.SendRequestRefineInfoPacket"); } -PyObject* stub_net_SendRefinePacket(PyObject*, PyObject*) { return stub_call_named("net.SendRefinePacket"); } -PyObject* stub_net_SendSelectItemPacket(PyObject*, PyObject*) { return stub_call_named("net.SendSelectItemPacket"); } -PyObject* stub_net_SetPacketSequenceMode(PyObject*, PyObject*) { return stub_call_named("net.SetPacketSequenceMode"); } -PyObject* stub_net_SetEmpireLanguageMode(PyObject*, PyObject*) { return stub_call_named("net.SetEmpireLanguageMode"); } -PyObject* stub_net_SetSkillGroupFake(PyObject*, PyObject*) { return stub_call_named("net.SetSkillGroupFake"); } -PyObject* stub_net_SendGuildSymbol(PyObject*, PyObject*) { return stub_call_named("net.SendGuildSymbol"); } -PyObject* stub_net_DisconnectUploader(PyObject*, PyObject*) { return stub_call_named("net.DisconnectUploader"); } -PyObject* stub_net_RecvGuildSymbol(PyObject*, PyObject*) { return stub_call_named("net.RecvGuildSymbol"); } -PyObject* stub_net_RegisterErrorLog(PyObject*, PyObject*) { return stub_call_named("net.RegisterErrorLog"); } -PyMethodDef methods_net[] = { - { "GetBettingGuildWarValue", stub_net_GetBettingGuildWarValue, METH_VARARGS }, - { "EnableChatInsultFilter", stub_net_EnableChatInsultFilter, METH_VARARGS }, - { "SetServerInfo", stub_net_SetServerInfo, METH_VARARGS }, - { "GetServerInfo", stub_net_GetServerInfo, METH_VARARGS }, - { "PreserveServerCommand", stub_net_PreserveServerCommand, METH_VARARGS }, - { "GetPreservedServerCommand", stub_net_GetPreservedServerCommand, METH_VARARGS }, - { "StartGame", stub_net_StartGame, METH_VARARGS }, - { "Warp", stub_net_Warp, METH_VARARGS }, - { "IsTest", stub_net_IsTest, METH_VARARGS }, - { "SetMarkServer", stub_net_SetMarkServer, METH_VARARGS }, - { "IsChatInsultIn", stub_net_IsChatInsultIn, METH_VARARGS }, - { "IsInsultIn", stub_net_IsInsultIn, METH_VARARGS }, - { "LoadInsultList", stub_net_LoadInsultList, METH_VARARGS }, - { "UploadMark", stub_net_UploadMark, METH_VARARGS }, - { "UploadSymbol", stub_net_UploadSymbol, METH_VARARGS }, - { "GetGuildID", stub_net_GetGuildID, METH_VARARGS }, - { "GetEmpireID", stub_net_GetEmpireID, METH_VARARGS }, - { "GetMainActorVID", stub_net_GetMainActorVID, METH_VARARGS }, - { "GetMainActorRace", stub_net_GetMainActorRace, METH_VARARGS }, - { "GetMainActorEmpire", stub_net_GetMainActorEmpire, METH_VARARGS }, - { "GetMainActorSkillGroup", stub_net_GetMainActorSkillGroup, METH_VARARGS }, - { "GetAccountCharacterSlotDataInteger", stub_net_GetAccountCharacterSlotDataInteger, METH_VARARGS }, - { "GetAccountCharacterSlotDataString", stub_net_GetAccountCharacterSlotDataString, METH_VARARGS }, - { "GetFieldMusicFileName", stub_net_GetFieldMusicFileName, METH_VARARGS }, - { "GetFieldMusicVolume", stub_net_GetFieldMusicVolume, METH_VARARGS }, - { "ToggleGameDebugInfo", stub_net_ToggleGameDebugInfo, METH_VARARGS }, - { "SetLoginInfo", stub_net_SetLoginInfo, METH_VARARGS }, - { "SetPhaseWindow", stub_net_SetPhaseWindow, METH_VARARGS }, - { "ClearPhaseWindow", stub_net_ClearPhaseWindow, METH_VARARGS }, - { "SetServerCommandParserWindow", stub_net_SetServerCommandParserWindow, METH_VARARGS }, - { "SetAccountConnectorHandler", stub_net_SetAccountConnectorHandler, METH_VARARGS }, - { "SetHandler", stub_net_SetHandler, METH_VARARGS }, - { "SetTCPRecvBufferSize", stub_net_SetTCPRecvBufferSize, METH_VARARGS }, - { "SetTCPSendBufferSize", stub_net_SetTCPSendBufferSize, METH_VARARGS }, - { "SetUDPRecvBufferSize", stub_net_SetUDPRecvBufferSize, METH_VARARGS }, - { "DirectEnter", stub_net_DirectEnter, METH_VARARGS }, - { "LogOutGame", stub_net_LogOutGame, METH_VARARGS }, - { "ExitGame", stub_net_ExitGame, METH_VARARGS }, - { "ExitApplication", stub_net_ExitApplication, METH_VARARGS }, - { "ConnectTCP", stub_net_ConnectTCP, METH_VARARGS }, - { "ConnectUDP", stub_net_ConnectUDP, METH_VARARGS }, - { "ConnectToAccountServer", stub_net_ConnectToAccountServer, METH_VARARGS }, - { "SendLoginPacket", stub_net_SendLoginPacket, METH_VARARGS }, - { "SendChinaMatrixCardPacket", stub_net_SendChinaMatrixCardPacket, METH_VARARGS }, - { "SendRunupMatrixCardPacket", stub_net_SendRunupMatrixCardPacket, METH_VARARGS }, - { "SendNEWCIBNPasspodAnswerPacket", stub_net_SendNEWCIBNPasspodAnswerPacket, METH_VARARGS }, - { "SendSelectEmpirePacket", stub_net_SendSelectEmpirePacket, METH_VARARGS }, - { "SendSelectCharacterPacket", stub_net_SendSelectCharacterPacket, METH_VARARGS }, - { "SendChangeNamePacket", stub_net_SendChangeNamePacket, METH_VARARGS }, - { "SendCreateCharacterPacket", stub_net_SendCreateCharacterPacket, METH_VARARGS }, - { "SendDestroyCharacterPacket", stub_net_SendDestroyCharacterPacket, METH_VARARGS }, - { "SendEnterGamePacket", stub_net_SendEnterGamePacket, METH_VARARGS }, - { "SendItemUsePacket", stub_net_SendItemUsePacket, METH_VARARGS }, - { "SendItemUseToItemPacket", stub_net_SendItemUseToItemPacket, METH_VARARGS }, - { "SendItemDropPacket", stub_net_SendItemDropPacket, METH_VARARGS }, - { "SendItemDropPacketNew", stub_net_SendItemDropPacketNew, METH_VARARGS }, - { "SendElkDropPacket", stub_net_SendElkDropPacket, METH_VARARGS }, - { "SendGoldDropPacketNew", stub_net_SendGoldDropPacketNew, METH_VARARGS }, - { "SendItemMovePacket", stub_net_SendItemMovePacket, METH_VARARGS }, - { "SendItemPickUpPacket", stub_net_SendItemPickUpPacket, METH_VARARGS }, - { "SendGiveItemPacket", stub_net_SendGiveItemPacket, METH_VARARGS }, - { "SetOfflinePhase", stub_net_SetOfflinePhase, METH_VARARGS }, - { "Disconnect", stub_net_Disconnect, METH_VARARGS }, - { "IsConnect", stub_net_IsConnect, METH_VARARGS }, - { "SendChatPacket", stub_net_SendChatPacket, METH_VARARGS }, - { "SendEmoticon", stub_net_SendEmoticon, METH_VARARGS }, - { "SendWhisperPacket", stub_net_SendWhisperPacket, METH_VARARGS }, - { "SendMobileMessagePacket", stub_net_SendMobileMessagePacket, METH_VARARGS }, - { "SendCharacterPositionPacket", stub_net_SendCharacterPositionPacket, METH_VARARGS }, - { "SendShopEndPacket", stub_net_SendShopEndPacket, METH_VARARGS }, - { "SendShopBuyPacket", stub_net_SendShopBuyPacket, METH_VARARGS }, - { "SendShopSellPacket", stub_net_SendShopSellPacket, METH_VARARGS }, - { "SendShopSellPacketNew", stub_net_SendShopSellPacketNew, METH_VARARGS }, - { "SendExchangeStartPacket", stub_net_SendExchangeStartPacket, METH_VARARGS }, - { "SendExchangeItemAddPacket", stub_net_SendExchangeItemAddPacket, METH_VARARGS }, - { "SendExchangeItemDelPacket", stub_net_SendExchangeItemDelPacket, METH_VARARGS }, - { "SendExchangeElkAddPacket", stub_net_SendExchangeElkAddPacket, METH_VARARGS }, - { "SendExchangeAcceptPacket", stub_net_SendExchangeAcceptPacket, METH_VARARGS }, - { "SendExchangeExitPacket", stub_net_SendExchangeExitPacket, METH_VARARGS }, - { "SendOnClickPacket", stub_net_SendOnClickPacket, METH_VARARGS }, - { "RegisterEmoticonString", stub_net_RegisterEmoticonString, METH_VARARGS }, - { "SendMessengerAddByVIDPacket", stub_net_SendMessengerAddByVIDPacket, METH_VARARGS }, - { "SendMessengerAddByNamePacket", stub_net_SendMessengerAddByNamePacket, METH_VARARGS }, - { "SendMessengerRemovePacket", stub_net_SendMessengerRemovePacket, METH_VARARGS }, - { "SendPartyInvitePacket", stub_net_SendPartyInvitePacket, METH_VARARGS }, - { "SendPartyInviteAnswerPacket", stub_net_SendPartyInviteAnswerPacket, METH_VARARGS }, - { "SendPartyExitPacket", stub_net_SendPartyExitPacket, METH_VARARGS }, - { "SendPartyRemovePacket", stub_net_SendPartyRemovePacket, METH_VARARGS }, - { "SendPartySetStatePacket", stub_net_SendPartySetStatePacket, METH_VARARGS }, - { "SendPartyUseSkillPacket", stub_net_SendPartyUseSkillPacket, METH_VARARGS }, - { "SendPartyParameterPacket", stub_net_SendPartyParameterPacket, METH_VARARGS }, - { "SendSafeboxSaveMoneyPacket", stub_net_SendSafeboxSaveMoneyPacket, METH_VARARGS }, - { "SendSafeboxWithdrawMoneyPacket", stub_net_SendSafeboxWithdrawMoneyPacket, METH_VARARGS }, - { "SendSafeboxCheckinPacket", stub_net_SendSafeboxCheckinPacket, METH_VARARGS }, - { "SendSafeboxCheckoutPacket", stub_net_SendSafeboxCheckoutPacket, METH_VARARGS }, - { "SendSafeboxItemMovePacket", stub_net_SendSafeboxItemMovePacket, METH_VARARGS }, - { "SendMallCheckoutPacket", stub_net_SendMallCheckoutPacket, METH_VARARGS }, - { "SendAnswerMakeGuildPacket", stub_net_SendAnswerMakeGuildPacket, METH_VARARGS }, - { "SendQuestInputStringPacket", stub_net_SendQuestInputStringPacket, METH_VARARGS }, - { "SendQuestConfirmPacket", stub_net_SendQuestConfirmPacket, METH_VARARGS }, - { "SendGuildAddMemberPacket", stub_net_SendGuildAddMemberPacket, METH_VARARGS }, - { "SendGuildRemoveMemberPacket", stub_net_SendGuildRemoveMemberPacket, METH_VARARGS }, - { "SendGuildChangeGradeNamePacket", stub_net_SendGuildChangeGradeNamePacket, METH_VARARGS }, - { "SendGuildChangeGradeAuthorityPacket", stub_net_SendGuildChangeGradeAuthorityPacket, METH_VARARGS }, - { "SendGuildOfferPacket", stub_net_SendGuildOfferPacket, METH_VARARGS }, - { "SendGuildPostCommentPacket", stub_net_SendGuildPostCommentPacket, METH_VARARGS }, - { "SendGuildDeleteCommentPacket", stub_net_SendGuildDeleteCommentPacket, METH_VARARGS }, - { "SendGuildRefreshCommentsPacket", stub_net_SendGuildRefreshCommentsPacket, METH_VARARGS }, - { "SendGuildChangeMemberGradePacket", stub_net_SendGuildChangeMemberGradePacket, METH_VARARGS }, - { "SendGuildUseSkillPacket", stub_net_SendGuildUseSkillPacket, METH_VARARGS }, - { "SendGuildChangeMemberGeneralPacket", stub_net_SendGuildChangeMemberGeneralPacket, METH_VARARGS }, - { "SendGuildInviteAnswerPacket", stub_net_SendGuildInviteAnswerPacket, METH_VARARGS }, - { "SendGuildChargeGSPPacket", stub_net_SendGuildChargeGSPPacket, METH_VARARGS }, - { "SendGuildDepositMoneyPacket", stub_net_SendGuildDepositMoneyPacket, METH_VARARGS }, - { "SendGuildWithdrawMoneyPacket", stub_net_SendGuildWithdrawMoneyPacket, METH_VARARGS }, - { "SendRequestRefineInfoPacket", stub_net_SendRequestRefineInfoPacket, METH_VARARGS }, - { "SendRefinePacket", stub_net_SendRefinePacket, METH_VARARGS }, - { "SendSelectItemPacket", stub_net_SendSelectItemPacket, METH_VARARGS }, - { "SetPacketSequenceMode", stub_net_SetPacketSequenceMode, METH_VARARGS }, - { "SetEmpireLanguageMode", stub_net_SetEmpireLanguageMode, METH_VARARGS }, - { "SetSkillGroupFake", stub_net_SetSkillGroupFake, METH_VARARGS }, - { "SendGuildSymbol", stub_net_SendGuildSymbol, METH_VARARGS }, - { "DisconnectUploader", stub_net_DisconnectUploader, METH_VARARGS }, - { "RecvGuildSymbol", stub_net_RecvGuildSymbol, METH_VARARGS }, - { "RegisterErrorLog", stub_net_RegisterErrorLog, METH_VARARGS }, - { NULL, NULL } -}; -const char* ints_net[] = {"ERROR_NONE", "ERROR_CONNECT_MARK_SERVER", "ERROR_LOAD_MARK", "ERROR_MARK_WIDTH", "ERROR_MARK_HEIGHT", "ERROR_MARK_UPLOAD_NEED_RECONNECT", "ERROR_MARK_CHECK_NEED_RECONNECT", "PHASE_WINDOW_LOGIN", "PHASE_WINDOW_SELECT", "PHASE_WINDOW_CREATE", "PHASE_WINDOW_LOAD", "PHASE_WINDOW_GAME", "PHASE_WINDOW_EMPIRE", "PHASE_WINDOW_LOGO", "ACCOUNT_CHARACTER_SLOT_ID", "ACCOUNT_CHARACTER_SLOT_NAME", "ACCOUNT_CHARACTER_SLOT_RACE", "ACCOUNT_CHARACTER_SLOT_LEVEL", "ACCOUNT_CHARACTER_SLOT_STR", "ACCOUNT_CHARACTER_SLOT_DEX", "ACCOUNT_CHARACTER_SLOT_INT", "ACCOUNT_CHARACTER_SLOT_HTH", "ACCOUNT_CHARACTER_SLOT_PLAYTIME", "ACCOUNT_CHARACTER_SLOT_FORM", "ACCOUNT_CHARACTER_SLOT_ADDR", "ACCOUNT_CHARACTER_SLOT_PORT", "ACCOUNT_CHARACTER_SLOT_GUILD_ID", "ACCOUNT_CHARACTER_SLOT_GUILD_NAME", "ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG", "ACCOUNT_CHARACTER_SLOT_HAIR", "SERVER_COMMAND_LOG_OUT", "SERVER_COMMAND_RETURN_TO_SELECT_CHARACTER", "SERVER_COMMAND_QUIT", "EMPIRE_A", "EMPIRE_B", "EMPIRE_C", "DS_SUB_HEADER_REFINE_FAIL", "DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE", "DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL", "DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY", "DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL", "DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL", "DS_SUB_HEADER_REFINE_SUCCEED", NULL}; -const char* strings_net[] = {NULL}; // 40250 UserInterface/PythonNonPlayerModule.cpp: nonplayer export names. PyObject* stub_nonplayer_GetEventType(PyObject*, PyObject*) { return stub_call_named("nonplayer.GetEventType"); } PyObject* stub_nonplayer_GetEventTypeByVID(PyObject*, PyObject*) { return stub_call_named("nonplayer.GetEventTypeByVID"); } @@ -1891,14 +1635,6 @@ void init_2v0_gameplay_stubs() { for (const char** name = strings_miniMap; *name; ++name) PyModule_AddStringConstant(module, *name, ""); } - { - PyObject* module = Py_InitModule("net", methods_net); - PyModule_AddIntConstant(module, "__port_stub__", 1); - for (const char** name = ints_net; *name; ++name) - PyModule_AddIntConstant(module, *name, 0); - for (const char** name = strings_net; *name; ++name) - PyModule_AddStringConstant(module, *name, ""); - } { PyObject* module = Py_InitModule("nonplayer", methods_nonplayer); PyModule_AddIntConstant(module, "__port_stub__", 1); diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index 13cd9d37..434dd53c 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -7,6 +7,11 @@ #include "EterPythonLib/StdAfx.h" #include "EterBase/Timer.h" #include "EterLib/Util.h" +#include "UserInterface/PythonNetworkStream.h" +#include "UserInterface/AccountConnector.h" +#include "UserInterface/PythonPlayer.h" +#include "GameLib/FlyingObjectManager.h" +#include "EffectLib/EffectManager.h" #include "PythonBoot.h" #include "PythonHost.h" #include "../EterLib/UIRenderCommands.h" @@ -25,6 +30,15 @@ std::unique_ptr g_window_manager; std::unique_ptr g_resource; // 40250 CPythonApplication::m_timer; CSlotWindow's cool time and Process() read it via Instance(). std::unique_ptr g_timer; +// 40250 CPythonApplication::m_pyNetworkStream and m_kAccountConnector (CSingletons); the app loop +// processes them every frame and the net module reaches them through Instance(). +std::unique_ptr g_network_stream; +std::unique_ptr g_account_connector; +// 40250 CPythonApplication::m_pyPlayer, m_FlyingManager and m_kEftMgr: the loading phase clears them +// (CPythonNetworkStream::SetLoadingPhase). PythonPlayer and FlyingObjectManager are platform/pending stand-ins. +std::unique_ptr g_player; +std::unique_ptr g_flying_manager; +std::unique_ptr g_effect_manager; bool fail(std::string* error, const std::string& text) { @@ -206,6 +220,11 @@ bool Start(const char* stdlib_path, std::string* error) g_timer = std::make_unique(); g_resource = std::make_unique(); g_window_manager = std::make_unique(); + g_network_stream = std::make_unique(); + g_account_connector = std::make_unique(); + g_player = std::make_unique(); + g_flying_manager = std::make_unique(); + g_effect_manager = std::make_unique(); return true; } @@ -226,6 +245,7 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error) initgrpText(); initwndMgr(); initapp(); + initnet(); init_2v0_gameplay_stubs(); ClearLogBoxMessage(); @@ -391,6 +411,11 @@ void Stop() // 40250 Main(): pyLauncher.Clear() runs before app->Destroy()/delete app, so the window manager // (a CPythonApplication member) is still alive while Py_Finalize runs the windows' __del__. g_launcher->Clear(); + g_effect_manager.reset(); + g_flying_manager.reset(); + g_player.reset(); + g_account_connector.reset(); + g_network_stream.reset(); g_window_manager.reset(); g_resource.reset(); g_timer.reset(); @@ -398,3 +423,10 @@ void Stop() } } + +// winuser.h (declared in the port's windows.h shim). WM_QUIT ends 40250's CPythonApplication::Loop; +// here the script fiber's loop ends the same way. +void PostQuitMessage(int) +{ + PythonBoot::AppRequestQuit(); +} diff --git a/extension/src/platform/UserInterface/ProcessCRC.cpp b/extension/src/platform/UserInterface/ProcessCRC.cpp new file mode 100644 index 00000000..d2078c87 --- /dev/null +++ b/extension/src/platform/UserInterface/ProcessCRC.cpp @@ -0,0 +1,23 @@ +// Platform skeleton for UserInterface/ProcessCRC.h (40250 UserInterface/ProcessCRC.cpp), generated by platform_stub.py. +// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. +#include "UserInterface/StdAfx.h" +#include "UserInterface/ProcessCRC.h" + +#include "../PlatformStub.h" + +auto GetExeCRC(DWORD &, DWORD &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto BuildProcessCRC() -> void +{ + MT_PLATFORM_STUB(); +} + +auto GetProcessCRCMagicCubePiece() -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp index c931670e..e554ec04 100644 --- a/extension/src/platform/UserInterface/PythonApplication.cpp +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -5,6 +5,9 @@ #include "EterLib/Camera.h" #include "EterBase/Timer.h" #include "EterLib/ResourceManager.h" +#include "UserInterface/PythonNetworkStream.h" +#include "UserInterface/AccountConnector.h" +#include "EterLib/NetDevice.h" #include "../PlatformStub.h" #include "../EterLib/UIRenderCommands.h" #include "../ScriptLib/PythonBoot.h" @@ -63,6 +66,15 @@ bool CPythonApplication::Create(PyObject*, const char*, int, int, int) PyErr_SetString(PyExc_RuntimeError, "CREATE_DEVICE"); return false; } + + // In 40250 m_netDevice is a member created here (PythonApplication.cpp:1242). + static CNetworkDevice s_netDevice; + if (!s_netDevice.Create()) + { + TraceError("NetDevice::Create failed"); + PyErr_SetString(PyExc_RuntimeError, "CREATE_NETWORK"); + return false; + } return true; } void CPythonApplication::UpdateGame() { MT_PLATFORM_STUB(); } @@ -79,6 +91,12 @@ bool CPythonApplication::Process() CTimer& rkTimer=CTimer::Instance(); rkTimer.Advance(); + // Network I/O + CPythonNetworkStream::Instance().Process(); + // PORT: m_kGuildMarkUploader/m_kGuildMarkDownloader.Process() follow here in 40250; the guild mark + // transfer is not ported yet (GuildMarkDownloader.cpp/GuildMarkUploader.cpp). + CAccountConnector::Instance().Process(); + CResourceManager::Instance().Update(); OnUIUpdate(); @@ -137,7 +155,6 @@ void CPythonApplication::SetForceSightRange(int) { MT_PLATFORM_STUB(); } void CCamera::SetResistance(float) { MT_PLATFORM_STUB(); } void CCamera::SetCameraMaxDistance(float) { MT_PLATFORM_STUB(); } -void CGuildMarkManager::SetMarkPathPrefix(const char*) { MT_PLATFORM_STUB(); } void CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); } float GetDegreeDifference(float, float) { MT_PLATFORM_STUB(); return 0; } @@ -173,6 +190,46 @@ void LocaleService_ForceSetLocale(const char* name, const char* path) { locale_path = path ? path : ""; } +// 40250 UserInterface/Locale.cpp:9-31, 168-172 and 393-423 (the non-Japan branch), verbatim: what the network +// slice (批次 2V1) and InsultChecker call. +const char* LSS_YMIR = "YMIR"; +const char* LSS_JAPAN = "JAPAN"; +const char* LSS_ENGLISH = "ENGLISH"; +const char* LSS_HONGKONG = "HONGKONG"; +const char* LSS_TAIWAN = "TAIWAN"; +const char* LSS_NEWCIBN = "NEWCIBN"; +const char* LSS_EUROPE = "EUROPE"; +const char* LSS_GLOBAL = "GLOBAL"; + +#ifndef LSS_SECURITY_KEY +#define LSS_SECURITY_KEY "testtesttesttest" +#endif + +std::string __SECURITY_KEY_STRING__ = LSS_SECURITY_KEY; + +const char* LocaleService_GetSecurityKey() +{ + return __SECURITY_KEY_STRING__.c_str(); +} + +bool LocaleService_IsYMIR() { return (stricmp( LocaleService_GetName(), LSS_YMIR ) == 0) || (stricmp( LocaleService_GetLocaleName(), "ymir" ) == 0); } +bool LocaleService_IsJAPAN() { return (stricmp( LocaleService_GetName(), LSS_JAPAN ) == 0) || (stricmp( LocaleService_GetLocaleName(), "japan" ) == 0); } +bool LocaleService_IsENGLISH() { return (stricmp( LocaleService_GetName(), LSS_ENGLISH ) == 0); } +bool LocaleService_IsEUROPE() { return (stricmp( LocaleService_GetName(), LSS_EUROPE ) == 0); } +bool LocaleService_IsHONGKONG() { return (stricmp( LocaleService_GetName(), LSS_HONGKONG ) == 0); } +bool LocaleService_IsTAIWAN() { return (stricmp( LocaleService_GetName(), LSS_TAIWAN ) == 0); } +bool LocaleService_IsNEWCIBN() { return (stricmp( LocaleService_GetName(), LSS_NEWCIBN ) == 0); } + +BOOL LocaleService_IsLeadByte( const char chByte ) +{ + return (((unsigned char) chByte) & 0x80) != 0; +} + +int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, size_t sizeLength ) +{ + return strnicmp( szStringLeft, szStringRight, sizeLength ); +} + // 40250 UserInterface/GameType.cpp:9-73 (DEFAULT_FONT), verbatim. // PORT: the default names are CP949 literals in 40250; ui.py sets the locale font (app.SetDefaultFontName) // before anything asks for it. diff --git a/extension/src/platform/UserInterface/UserInterface.cpp b/extension/src/platform/UserInterface/UserInterface.cpp index c77c58d3..03bc36f4 100644 --- a/extension/src/platform/UserInterface/UserInterface.cpp +++ b/extension/src/platform/UserInterface/UserInterface.cpp @@ -23,6 +23,9 @@ #include #endif +// 40250 UserInterface.cpp:49. +bool __IS_TEST_SERVER_MODE__=false; + namespace { // Lowercased file name -> on-disk spelling, for the files directly in `folder`. diff --git a/extension/src/platform/UserInterface/WiseLogicXTrap.cpp b/extension/src/platform/UserInterface/WiseLogicXTrap.cpp new file mode 100644 index 00000000..ae7cee2a --- /dev/null +++ b/extension/src/platform/UserInterface/WiseLogicXTrap.cpp @@ -0,0 +1,29 @@ +// 40250 UserInterface/WiseLogicXTrap.cpp: the build without XTRAP_CLIENT_ENABLE (the XTrap anti-cheat SDK is +// Win32-only and not shipped), verbatim. +#include "UserInterface/StdAfx.h" +#include "UserInterface/Locale.h" +#include "UserInterface/WiseLogicXTrap.h" + +bool XTrap_Init() +{ + return true; +} + +bool XTrap_CheckInit() +{ + return true; +} + +void XTrap_PollEvent() +{ +} + +void XTrap_SetUserInfo(LPCSTR szUserID, LPCSTR szServerName, LPCSTR szCharacterName, LPCSTR szCharacterClass, SOCKET hSocket) +{ + +} + +void XTrap_ValidateCheckStream( LPVOID PacketBufferIn, LPVOID PacketBufferOut ) +{ + +} diff --git a/extension/src/platform/pending/GameLib/FlyingObjectManager.cpp b/extension/src/platform/pending/GameLib/FlyingObjectManager.cpp new file mode 100644 index 00000000..ebd02f29 --- /dev/null +++ b/extension/src/platform/pending/GameLib/FlyingObjectManager.cpp @@ -0,0 +1,76 @@ +// Stand-in for the 40250 logic unit GameLib/FlyingObjectManager.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "GameLib/StdAfx.h" +#include "GameLib/FlyingObjectManager.h" + +#include "../../PlatformStub.h" + +CFlyingManager::CFlyingManager() +{ + MT_PLATFORM_STUB(); +} + +CFlyingManager::~CFlyingManager() +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::DeleteAllInstances() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::RegisterFlyingData(const char *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CFlyingManager::RegisterFlyingData(const char *, DWORD &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CFlyingManager::CreateFlyingInstanceFlyTarget(const DWORD, const D3DXVECTOR3 &, const CFlyTarget &, bool) -> CFlyingInstance * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CFlyingManager::Update() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::Render() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::RegisterIndexedFlyData(DWORD, BYTE, const char *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CFlyingManager::CreateIndexedFly(DWORD, CActorInstance *, CActorInstance *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::__DestroyFlyingInstanceList() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CFlyingManager::__DestroyFlyingDataMap() -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/GuildMarkDownloader.cpp b/extension/src/platform/pending/UserInterface/GuildMarkDownloader.cpp new file mode 100644 index 00000000..9be8ac09 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/GuildMarkDownloader.cpp @@ -0,0 +1,164 @@ +// Stand-in for the 40250 logic unit UserInterface/GuildMarkDownloader.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/GuildMarkDownloader.h" + +#include "../../PlatformStub.h" + +CGuildMarkDownloader::CGuildMarkDownloader() +{ + MT_PLATFORM_STUB(); +} + +CGuildMarkDownloader::~CGuildMarkDownloader() +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::Connect(const CNetworkAddress &, DWORD, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::ConnectToRecvSymbol(const CNetworkAddress &, DWORD, DWORD, const std::vector &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::Process() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::OnConnectFailure() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::OnConnectSuccess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::OnRemoteDisconnect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::OnDisconnect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::__Initialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::__StateProcess() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__GetPacketSize(UINT) -> UINT +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__DispatchPacket(UINT) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__OfflineState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::__CompleteState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::__LoginState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkDownloader::__LoginState_Process() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvPhase() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvHandshake() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvPing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvMarkIndex() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvMarkBlock() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvSymbolData() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvKeyAgreement() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__LoginState_RecvKeyAgreementCompleted() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__SendMarkIDXList() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__SendMarkCRCList() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkDownloader::__SendSymbolCRCList() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/GuildMarkUploader.cpp b/extension/src/platform/pending/UserInterface/GuildMarkUploader.cpp new file mode 100644 index 00000000..dcb55bc1 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/GuildMarkUploader.cpp @@ -0,0 +1,163 @@ +// Stand-in for the 40250 logic unit UserInterface/GuildMarkUploader.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/GuildMarkUploader.h" + +#include "../../PlatformStub.h" + +CGuildMarkUploader::CGuildMarkUploader() +{ + MT_PLATFORM_STUB(); +} + +CGuildMarkUploader::~CGuildMarkUploader() +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::Disconnect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::Connect(const CNetworkAddress &, DWORD, DWORD, DWORD, const char *, UINT *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::ConnectToSendSymbol(const CNetworkAddress &, DWORD, DWORD, DWORD, const char *, UINT *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::IsCompleteUploading() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::Process() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::OnConnectFailure() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::OnConnectSuccess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::OnRemoteDisconnect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::OnDisconnect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::__Load(const char *, UINT *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoadSymbol(const char *, UINT *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__Save(const char *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__Inialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::__StateProcess() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__OfflineState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::__CompleteState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::__LoginState_Set() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkUploader::__LoginState_Process() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoginState_RecvPhase() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoginState_RecvHandshake() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoginState_RecvPing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoginState_RecvKeyAgreement() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__LoginState_RecvKeyAgreementCompleted() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__AnalyzePacket(UINT, UINT, bool (CGuildMarkUploader::*)()) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__SendMarkPacket() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkUploader::__SendSymbolPacket() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/MarkManager.cpp b/extension/src/platform/pending/UserInterface/MarkManager.cpp new file mode 100644 index 00000000..52b1eb1d --- /dev/null +++ b/extension/src/platform/pending/UserInterface/MarkManager.cpp @@ -0,0 +1,158 @@ +// Stand-in for the 40250 logic unit UserInterface/MarkManager.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/MarkManager.h" + +#include "../../PlatformStub.h" + +CGuildMarkManager::CGuildMarkManager() +{ + MT_PLATFORM_STUB(); +} + +CGuildMarkManager::~CGuildMarkManager() +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::GetGuildSymbol(DWORD) -> const TGuildSymbol * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::LoadSymbol(const char *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::SaveSymbol(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::UploadSymbol(DWORD, int, const BYTE *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::SetMarkPathPrefix(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::LoadMarkIndex() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::SaveMarkIndex() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::LoadMarkImages() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::SaveMarkImage(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::GetMarkImageFilename(DWORD, std::string &) const -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::AddMarkIDByGuildID(DWORD, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::GetMarkImageCount() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::GetMarkCount() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::GetMarkID(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::CopyMarkIdx(char *) const -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::SaveMark(DWORD, BYTE *) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::DeleteMark(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::GetDiffBlocks(DWORD, const DWORD *, std::map &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::SaveBlockFromCompressedData(DWORD, DWORD, const BYTE *, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::GetBlockCRCList(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::__NewImage() -> CGuildMarkImage * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::__DeleteImage(CGuildMarkImage *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CGuildMarkManager::__AllocMarkID(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::__GetImage(DWORD) -> CGuildMarkImage * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CGuildMarkManager::__GetImagePtr(DWORD) -> CGuildMarkImage * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp b/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp new file mode 100644 index 00000000..653a4158 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp @@ -0,0 +1,177 @@ +// Stand-in for the 40250 logic unit UserInterface/NetworkActorManager.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/NetworkActorManager.h" +#include "UserInterface/PythonCharacterManager.h" // the __GetCharacterManager return type + +#include "../../PlatformStub.h" + +SNetworkActorData::SNetworkActorData() +{ + MT_PLATFORM_STUB(); +} + +auto SNetworkActorData::SetDstPosition(DWORD, LONG, LONG, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto SNetworkActorData::SetPosition(LONG, LONG) -> void +{ + MT_PLATFORM_STUB(); +} + +auto SNetworkActorData::UpdatePosition() -> void +{ + MT_PLATFORM_STUB(); +} + +SNetworkActorData::SNetworkActorData(const SNetworkActorData &) +{ + MT_PLATFORM_STUB(); +} + +auto SNetworkActorData::operator=(const SNetworkActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto SNetworkActorData::__copy__(const SNetworkActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +CNetworkActorManager::CNetworkActorManager() +{ + MT_PLATFORM_STUB(); +} + +CNetworkActorManager::~CNetworkActorManager() +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::SetMainActorVID(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::RemoveActor(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::AppendActor(const SNetworkActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::MoveActor(const SNetworkMoveActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::SyncActor(DWORD, LONG, LONG) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::SetActorOwner(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::Update() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__OLD_Update() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__UpdateMainActor() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__IsVisiblePos(LONG, LONG) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__IsVisibleActor(const SNetworkActorData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__IsMainActorVID(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__RemoveAllGroundItems() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__RemoveAllActors() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__RemoveDynamicActors() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__RemoveCharacterManagerActor(SNetworkActorData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CNetworkActorManager::__FindActorData(DWORD) -> SNetworkActorData * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__AppendCharacterManagerActor(SNetworkActorData &) -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__FindActor(SNetworkActorData &) -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__FindActor(SNetworkActorData &, LONG, LONG) -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CNetworkActorManager::__GetCharacterManager() -> CPythonCharacterManager & +{ + // PORT: the 40250 body (NetworkActorManager.cpp:310-313); a stub's default reference would construct a + // character manager. + return CPythonCharacterManager::Instance(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonGuild.cpp b/extension/src/platform/pending/UserInterface/PythonGuild.cpp new file mode 100644 index 00000000..e41aaa1e --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonGuild.cpp @@ -0,0 +1,13 @@ +// Stand-in for the 40250 unit UserInterface/PythonGuild.cpp, not ported yet: the CPythonGuild member the ported +// net module (批次 2V1) references, as an MT_PLATFORM_STUB(). Delete this file in the commit that ports the unit +// into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonGuild.h" + +#include "../../PlatformStub.h" + +BOOL CPythonGuild::GetMemberDataPtrByName(const char *, TGuildMemberData **) +{ + MT_PLATFORM_STUB(); + return FALSE; +} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp new file mode 100644 index 00000000..299e8c2f --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp @@ -0,0 +1,304 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGame.cpp, not ported yet: the CPythonNetworkStream +// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this +// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonNetworkStream.h" + +#include "../../PlatformStub.h" + +BOOL gs_bEmpireLanuageEnable = TRUE; + +void CPythonNetworkStream::GamePhase() +{ + MT_PLATFORM_STUB(); +} + +// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. +bool CPythonNetworkStream::RecvPointChange() +{ + MT_PLATFORM_STUB(); + TPacketGCPointChange PointChange; + return Recv(sizeof(PointChange), &PointChange); +} + +void CPythonNetworkStream::RegisterEmoticonString(const char *) +{ + MT_PLATFORM_STUB(); +} + +bool CPythonNetworkStream::SendAnswerMakeGuildPacket(const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendCharacterPositionPacket(BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendChatPacket(const char *, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendClientVersionPacket() +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeAcceptPacket() +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeElkAddPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeExitPacket() +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeItemAddPacket(TItemPos, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeItemDelPacket(BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendExchangeStartPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGiveItemPacket(DWORD, TItemPos, int) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildAddMemberPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket(BYTE, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildChangeGradeNamePacket(BYTE, const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildChangeMemberGeneralPacket(DWORD, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildChangeMemberGradePacket(DWORD, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildChargeGSPPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildDeleteCommentPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildDepositMoneyPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildInviteAnswerPacket(DWORD, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildOfferPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildPostCommentPacket(const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildRefreshCommentsPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildRemoveMemberPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildUseSkillPacket(DWORD, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendGuildWithdrawMoneyPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendMessengerAddByVIDPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendMessengerRemovePacket(const char *, const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendMobileMessagePacket(const char *, const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendOnClickPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartyInviteAnswerPacket(DWORD, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartyInvitePacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartyParameterPacket(BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartyRemovePacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartySetStatePacket(DWORD, BYTE, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendPartyUseSkillPacket(BYTE, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendQuestConfirmPacket(BYTE, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendQuestInputStringPacket(const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendRefinePacket(BYTE, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendSelectItemPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendWhisperPacket(const char *, const char *) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +void CPythonNetworkStream::SetGamePhase() +{ + MT_PLATFORM_STUB(); +} + +void CPythonNetworkStream::ToggleGameDebugInfo() +{ + MT_PLATFORM_STUB(); +} + +void CPythonNetworkStream::Warp(LONG, LONG) +{ + MT_PLATFORM_STUB(); +} + +void CPythonNetworkStream::__InitializeGamePhase() +{ + MT_PLATFORM_STUB(); +} + +void CPythonNetworkStream::__TEST_SetSkillGroupFake(int) +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp new file mode 100644 index 00000000..7c9cbc1a --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp @@ -0,0 +1,15 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGameActor.cpp, not ported yet: the CPythonNetworkStream +// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this +// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonNetworkStream.h" + +#include "../../PlatformStub.h" + +// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. +bool CPythonNetworkStream::RecvCharacterUpdatePacket() +{ + MT_PLATFORM_STUB(); + TPacketGCCharacterUpdate chrUpdatePacket; + return Recv(sizeof(chrUpdatePacket), &chrUpdatePacket); +} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp new file mode 100644 index 00000000..454e051e --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp @@ -0,0 +1,113 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGameItem.cpp, not ported yet: the CPythonNetworkStream +// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this +// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonNetworkStream.h" + +#include "../../PlatformStub.h" + +// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. +bool CPythonNetworkStream::RecvItemSetPacket() +{ + MT_PLATFORM_STUB(); + TPacketGCItemSet packet_item_set; + return Recv(sizeof(packet_item_set), &packet_item_set); +} + +// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. +bool CPythonNetworkStream::RecvQuickSlotAddPacket() +{ + MT_PLATFORM_STUB(); + TPacketGCQuickSlotAdd packet_quick_slot_add; + return Recv(sizeof(packet_quick_slot_add), &packet_quick_slot_add); +} + +bool CPythonNetworkStream::SendItemDropPacket(TItemPos, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos, DWORD, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendItemMovePacket(TItemPos, TItemPos, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendItemPickUpPacket(DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendItemUsePacket(TItemPos) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendItemUseToItemPacket(TItemPos, TItemPos) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendMallCheckoutPacket(BYTE, TItemPos) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE, TItemPos) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE, BYTE, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendSafeBoxMoneyPacket(BYTE, DWORD) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendShopBuyPacket(BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendShopEndPacket() +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendShopSellPacket(BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +bool CPythonNetworkStream::SendShopSellPacketNew(BYTE, BYTE) +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonPlayer.cpp b/extension/src/platform/pending/UserInterface/PythonPlayer.cpp new file mode 100644 index 00000000..35e5693b --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonPlayer.cpp @@ -0,0 +1,1348 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonPlayer.cpp, not ported yet: the platform_stub.py skeleton of its +// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit +// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonPlayer.h" + +#include "../../PlatformStub.h" + +auto CPythonPlayer::SPlayerStatus::SetPoint(UINT, long) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SPlayerStatus::GetPoint(UINT) -> long +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +CPythonPlayer::CPythonPlayer() +{ + MT_PLATFORM_STUB(); +} + +CPythonPlayer::~CPythonPlayer() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::PickCloseMoney() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::PickCloseItem() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetGameWindow(PyObject *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetObserverMode(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsObserverMode() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetQuickCameraMode(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetAttackKeyState(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RegisterEffect(DWORD, const char *, bool) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_SetMouseState(int, int) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_SetMouseFunc(int, int) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_GetMouseFunc(int) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_SetMouseMiddleButtonState(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetAutoCameraRotationSpeed(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_ResetCameraRotation() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetSingleDirKeyState(int, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetSingleDIKKeyState(int, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetMultiDirKeyState(bool, bool, bool, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_Attack() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_Fishing() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_CancelFishing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_LookAtFocusActor() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_IsAttackableDistanceFocusActor() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_MoveToDestPixelPositionDirection(const TPixelPosition &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_MoveToMousePickedDirection() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_MoveToMouseScreenDirection() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_MoveToDirection(float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_Stop() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_IsEmptyReservedDelayTime(float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetDungeonDestinationPosition(int, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::AlarmHaveToGo() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_FindActorPtr(DWORD) -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NEW_GetMainActorPtr() -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::Clear() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ClearSkillDict() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_ClearSkillData(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::Update() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetPlayTime() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetPlayTime(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetMainCharacterIndex(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetMainCharacterIndex() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsMainCharacterIndex(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetGuildID() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::NotifyDeletingCharacterInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NotifyCharacterDead(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NotifyCharacterUpdate(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NotifyDeadMainCharacter() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NotifyChangePKMode() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetName() -> const char * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetName(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetRace(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetRace() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetWeaponPower(DWORD, DWORD, DWORD, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetStatus(DWORD, long) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetStatus(DWORD) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::MoveItemData(TItemPos, TItemPos) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetItemData(TItemPos, const TItemData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetItemData(TItemPos) const -> const TItemData * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetItemCount(TItemPos, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetItemMetinSocket(TItemPos, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetItemAttribute(TItemPos, DWORD, BYTE, short) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetItemIndex(TItemPos) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetItemFlags(TItemPos) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetItemCount(TItemPos) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetItemCountByVnum(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetItemMetinSocket(TItemPos, DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetItemAttribute(TItemPos, DWORD, BYTE *, short *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SendClickItemPacket(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RequestAddLocalQuickSlot(DWORD, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RequestAddToEmptyLocalQuickSlot(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RequestDeleteGlobalQuickSlot(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RequestUseLocalQuickSlot(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetGlobalQuickSlotData(DWORD, DWORD *, DWORD *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetLocalQuickSlotData(DWORD, DWORD *, DWORD *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RemoveQuickSlotByValue(int, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsItem(TItemPos) -> char +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsBeltInventorySlot(TItemPos) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsInventorySlot(TItemPos) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsEquipmentSlot(TItemPos) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsEquipItemInSlot(TItemPos) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetQuickPage() -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetQuickPage(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::AddQuickSlot(int, char, char) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::DeleteQuickSlot(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::MoveQuickSlot(int, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetSkill(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetSkillSlotIndex(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillIndex(DWORD) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillGrade(DWORD) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillLevel(DWORD) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillCurrentEfficientPercentage(DWORD) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillNextEfficientPercentage(DWORD) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetSkillLevel(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetSkillLevel_(DWORD, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsToggleSkill(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::ClickSkillSlot(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ChangeCurrentSkillNumberOnly(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::FindSkillSlotIndexBySkillIndex(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetSkillCoolTime(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::EndSkillCoolTime(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetSkillCoolTime(DWORD) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetSkillElapsedCoolTime(DWORD) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsSkillActive(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsSkillCoolTime(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::UseGuildSkill(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::AffectIndexToSkillSlotIndex(UINT, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::AffectIndexToSkillIndex(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetAffect(UINT) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ResetAffect(UINT) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ClearAffects() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetTarget(DWORD, BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::OpenCharacterMenu(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetTargetVID() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::ExitParty() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::AppendPartyMember(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::LinkPartyMember(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::UnlinkPartyMember(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::UpdatePartyMemberInfo(DWORD, BYTE, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::UpdatePartyMemberAffect(DWORD, BYTE, short) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RemovePartyMember(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsPartyMemberByVID(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsPartyMemberByName(const char *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetPartyMemberPtr(DWORD, TPartyMemberInfo **) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::PartyMemberPIDToVID(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::PartyMemberVIDToPID(DWORD, DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsSamePartyMember(DWORD, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::RememberChallengeInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RememberRevengeInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RememberCantFightInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ForgetInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsChallengeInstance(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsRevengeInstance(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::IsCantFightInstance(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::OpenPrivateShop() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ClosePrivateShop() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::IsOpenPrivateShop() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::StartStaminaConsume(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::StopStaminaConsume(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetPKMode() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetMobileFlag(BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::HasMobilePhoneNumber() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::SetComboSkillFlag(BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::SetMovableGroundDistance(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::ActEmotion(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::StartEmotionProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::EndEmotionProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ToggleCoolTime() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__ToggleLevelLimit() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__RefLocalQuickSlot(int) -> TQuickSlot & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__RefGlobalQuickSlot(int) -> TQuickSlot & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetLevelAtk() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetStatAtk() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetWeaponAtk(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetTotalAtk(DWORD, DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetRaceStat() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetHitRate() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetEvadeRate() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__UpdateBattleStatus() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__DeactivateSkillSlot(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ActivateSkillSlot(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnPressSmart(CInstanceBase &, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnClickSmart(CInstanceBase &, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnPressItem(CInstanceBase &, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnPressActor(CInstanceBase &, DWORD, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnPressGround(CInstanceBase &, const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnPressScreen(CInstanceBase &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnClickActor(CInstanceBase &, DWORD, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnClickItem(CInstanceBase &, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__OnClickGround(CInstanceBase &, const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__IsMovableGroundDistance(CInstanceBase &, const TPixelPosition &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetPickedActorPtr(CInstanceBase **) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetPickedActorID(DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetPickedItemID(DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetPickedGroundPos(TPixelPosition *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__ClearReservedAction() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ReserveClickItem(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ReserveClickActor(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ReserveClickGround(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ReserveUseSkill(DWORD, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ReserveProcess_ClickActor() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ShowPickedEffect(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__SendClickActorPacket(CInstanceBase &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__ClearAutoAttackTargetActorID() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__SetAutoAttackTargetActorID(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_ShowEffect(int, TPixelPosition) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetMouseSmartState(int, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetMouseMoveState(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_SetMouseCameraState(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_GetMouseDirRotation(float, float, float *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_GetMultiKeyDirRotation(bool, bool, bool, bool, float *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::GetDegreeFromDirection(int, int) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::GetDegreeFromPosition(int, int, int, int) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::CheckCategory(int) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::CheckAbilitySlot(int) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::RefreshKeyWalkingDirection() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::NEW_RefreshMouseWalkingDirection() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::RefreshInstances() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__CanShot(CInstanceBase &, CInstanceBase &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CanUseSkill() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CanMove() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CanAttack() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CanChangeTarget() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckSkillUsable(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__UseCurrentSkill() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__UseChargeSkill(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__UseSkill(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckSpecialSkill(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckRestSkillCoolTime(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckShortLife(TSkillInstance &, CPythonSkill::TSkillData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckShortMana(TSkillInstance &, CPythonSkill::TSkillData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckShortArrow(TSkillInstance &, CPythonSkill::TSkillData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__CheckDashAffect(CInstanceBase &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__SendUseSkill(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__RunCoolTime(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__GetSkillType(DWORD) -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsReservedUseSkill(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsMeleeSkill(CPythonSkill::TSkillData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsChargeSkill(CPythonSkill::TSkillData &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetSkillTargetRange(CPythonSkill::TSkillData &) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__SearchNearTarget() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsUsingChargeSkill() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__ProcessEnemySkillTargetRange(CInstanceBase &, CInstanceBase &, CPythonSkill::TSkillData &, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__HasEnoughArrow() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__HasItem(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetPickableDistance() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetTargetActorPtr() -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__ClearTarget() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__GetTargetVID() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__SetTargetVID(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__IsSameTargetVID(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsTarget() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__ChangeTargetToPickedInstance() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetSkillTargetInstancePtr(CPythonSkill::TSkillData &) -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetAliveTargetInstancePtr() -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__GetDeadTargetInstancePtr() -> CInstanceBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__IsRightButtonSkillMode() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonPlayer::__Update_AutoAttack() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__Update_NotifyGuildAreaEvent() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonPlayer::__IsProcessingEmotion() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/port/CMakeLists.txt b/extension/src/port/CMakeLists.txt index cb337c3f..bec5e7d2 100644 --- a/extension/src/port/CMakeLists.txt +++ b/extension/src/port/CMakeLists.txt @@ -31,7 +31,9 @@ target_include_directories(port_logic PUBLIC ${MT_PORT_SHIMS}) # Libraries 40250 links that are vendored as-is: (EterBase/lzo.h), # (EterBase/cipher.h), (ScriptLib). target_link_libraries(port_logic PUBLIC mt3p::minilzo mt3p::cryptopp) -# common/Win32Crt.cpp converts non-UTF-8 code pages with iconv (MT_ICONV_LIBRARY, extension/CMakeLists.txt). +# common/Win32Crt.cpp converts non-UTF-8 code pages with iconv. macOS ships it as a separate library; +# extension/CMakeLists.txt finds it for mtnet, but the port-only build (script/port_gate.sh) never reads that file. +find_library(MT_ICONV_LIBRARY NAMES iconv) if(MT_ICONV_LIBRARY) target_link_libraries(port_logic PUBLIC ${MT_ICONV_LIBRARY}) endif() @@ -174,6 +176,12 @@ if(BUILD_TESTING AND CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME) add_test(NAME port.text COMMAND $) set_tests_properties(port.text PROPERTIES SKIP_RETURN_CODE 77) + # 批次 2V1: Packet.h struct sizes against the classic wire layouts. + add_executable(port_packet_test ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/port_packet_test.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/port_packet_test_wire.cpp) + target_link_libraries(port_packet_test PRIVATE port_logic) + add_test(NAME port.packet COMMAND $) + add_executable(port_net_test ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/port_net_test.cpp) target_link_libraries(port_net_test PRIVATE port_platform) add_test(NAME port.net COMMAND $) diff --git a/extension/src/port/EterBase/Singleton.h b/extension/src/port/EterBase/Singleton.h index bae37bdb..fd6cc9f6 100644 --- a/extension/src/port/EterBase/Singleton.h +++ b/extension/src/port/EterBase/Singleton.h @@ -54,8 +54,9 @@ public: singleton() { assert(!ms_singleton); - int offset = (int) (T*) 1 - (int) (singleton *) (T*) 1; - ms_singleton = (T*) ((int) this + offset); + // PORT: was (int) casts (ILP32 Win32); intptr_t keeps the pointer width on 64-bit targets. + intptr_t offset = (intptr_t) (T*) 1 - (intptr_t) (singleton *) (T*) 1; + ms_singleton = (T*) ((intptr_t) this + offset); } virtual ~singleton() diff --git a/extension/src/port/UserInterface/AccountConnector.cpp b/extension/src/port/UserInterface/AccountConnector.cpp new file mode 100644 index 00000000..333ff8d9 --- /dev/null +++ b/extension/src/port/UserInterface/AccountConnector.cpp @@ -0,0 +1,745 @@ +#include "StdAfx.h" +#include "AccountConnector.h" +#include "Packet.h" +#include "PythonNetworkStream.h" +#include "../EterBase/tea.h" +#include "../EterPack/EterPackManager.h" + +#include "Hackshield.h" +#include "WiseLogicXTrap.h" + +// CHINA_CRYPT_KEY +extern DWORD g_adwEncryptKey[4]; +extern DWORD g_adwDecryptKey[4]; +// END_OF_CHINA_CRYPT_KEY + +#ifdef USE_OPENID +extern int openid_test; +#endif + +void CAccountConnector::SetHandler(PyObject* poHandler) +{ + m_poHandler = poHandler; +} + +void CAccountConnector::SetLoginInfo(const char * c_szName, const char * c_szPwd) +{ + m_strID = c_szName; + m_strPassword = c_szPwd; +} + + +void CAccountConnector::ClearLoginInfo( void ) +{ + m_strPassword = ""; +} + +bool CAccountConnector::Connect(const char * c_szAddr, int iPort, const char * c_szAccountAddr, int iAccountPort) +{ +#ifndef _IMPROVED_PACKET_ENCRYPTION_ + __BuildClientKey(); +#endif + + m_strAddr = c_szAddr; + m_iPort = iPort; + + __OfflineState_Set(); + + // CHINA_CRYPT_KEY + if (LocaleService_IsYMIR()) + { + } + else + { + __BuildClientKey_20050304Myevan(); + } + // END_OF_CHINA_CRYPT_KEY + + return CNetworkStream::Connect(c_szAccountAddr, iAccountPort); +} + +void CAccountConnector::Disconnect() +{ + CNetworkStream::Disconnect(); + __OfflineState_Set(); +} + +bool CAccountConnector::SendNEWCIBNPasspodAnswerPacket(const char * answer) +{ + TPacketCGNEWCIBNPasspodAnswer answerPacket; + answerPacket.bHeader = HEADER_CG_NEWCIBN_PASSPOD_ANSWER; + strncpy(answerPacket.szAnswer, answer, NEWCIBN_PASSPOD_ANSWER_MAX_LEN); + answerPacket.szAnswer[NEWCIBN_PASSPOD_ANSWER_MAX_LEN] = '\0'; + if (!Send(sizeof(answerPacket), &answerPacket)) + { + TraceError("SendNEWCIBNPasspodAnswerPacket"); + return false; + } + return SendSequence(); +} + +bool CAccountConnector::SendRunupMatrixCardPacket(const char * c_szMatrixCardString) +{ + TPacketCGRunupMatrixAnswer answerPacket; + answerPacket.bHeader = HEADER_CG_RUNUP_MATRIX_ANSWER; + strncpy(answerPacket.szAnswer, c_szMatrixCardString, RUNUP_MATRIX_ANSWER_MAX_LEN); + answerPacket.szAnswer[RUNUP_MATRIX_ANSWER_MAX_LEN] = '\0'; + if (!Send(sizeof(answerPacket), &answerPacket)) + { + TraceError("SendRunupMatrixCardPacketError"); + return false; + } + return SendSequence(); +} + +bool CAccountConnector::SendChinaMatrixCardPacket(const char * c_szMatrixCardString) +{ + TPacketCGChinaMatrixCard MatrixCardPacket; + MatrixCardPacket.bHeader = HEADER_CG_CHINA_MATRIX_CARD; + strncpy(MatrixCardPacket.szAnswer, c_szMatrixCardString, CHINA_MATRIX_ANSWER_MAX_LEN); + MatrixCardPacket.szAnswer[CHINA_MATRIX_ANSWER_MAX_LEN] = '\0'; + + if (!Send(sizeof(MatrixCardPacket), &MatrixCardPacket)) + { + Tracen("SendLogin Error"); + return false; + } + + CPythonNetworkStream::Instance().SetWaitFlag(); + m_isWaitKey = TRUE; + + return SendSequence(); +} + +void CAccountConnector::Process() +{ + CNetworkStream::Process(); + + if (!__StateProcess()) + { + __OfflineState_Set(); + Disconnect(); + } +} + +bool CAccountConnector::__StateProcess() +{ + switch (m_eState) + { + case STATE_HANDSHAKE: + return __HandshakeState_Process(); + break; + case STATE_AUTH: + return __AuthState_Process(); + break; + } + + return true; +} + +bool CAccountConnector::__HandshakeState_Process() +{ + if (!__AnalyzePacket(HEADER_GC_PHASE, sizeof(TPacketGCPhase), &CAccountConnector::__AuthState_RecvPhase)) + return false; + + if (!__AnalyzePacket(HEADER_GC_HANDSHAKE, sizeof(TPacketGCHandshake), &CAccountConnector::__AuthState_RecvHandshake)) + return false; + + if (!__AnalyzePacket(HEADER_GC_PING, sizeof(TPacketGCPing), &CAccountConnector::__AuthState_RecvPing)) + return false; + + // TODO : 차후 서버와 동일하게 가변길이 data serialize & deserialize 작업해야 한다. + if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys)) + return false; + + if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_SDB, &CAccountConnector::__AuthState_RecvHybridCryptSDB)) + return false; + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + if (!__AnalyzePacket(HEADER_GC_KEY_AGREEMENT, sizeof(TPacketKeyAgreement), &CAccountConnector::__AuthState_RecvKeyAgreement)) + return false; + + if (!__AnalyzePacket(HEADER_GC_KEY_AGREEMENT_COMPLETED, sizeof(TPacketKeyAgreementCompleted), &CAccountConnector::__AuthState_RecvKeyAgreementCompleted)) + return false; +#endif + + return true; +} + +bool CAccountConnector::__AuthState_Process() +{ + if (!__AnalyzePacket(0, sizeof(BYTE), &CAccountConnector::__AuthState_RecvEmpty)) + return true; + + if (!__AnalyzePacket(HEADER_GC_PHASE, sizeof(TPacketGCPhase), &CAccountConnector::__AuthState_RecvPhase)) + return false; + + if (!__AnalyzePacket(HEADER_GC_PING, sizeof(TPacketGCPing), &CAccountConnector::__AuthState_RecvPing)) + return false; + + if (!__AnalyzePacket(HEADER_GC_AUTH_SUCCESS, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthSuccess)) + return true; + +#ifdef USE_OPENID + if (!__AnalyzePacket(HEADER_GC_AUTH_SUCCESS_OPENID, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthSuccess_OpenID)) + return true; +#endif /* USE_OPENID */ + + if (!__AnalyzePacket(HEADER_GC_LOGIN_FAILURE, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthFailure)) + return true; + + if (!__AnalyzePacket(HEADER_GC_CHINA_MATRIX_CARD, sizeof(TPacketGCChinaMatrixCard), &CAccountConnector::__AuthState_RecvChinaMatrixCard)) + return true; + + if (!__AnalyzePacket(HEADER_GC_RUNUP_MATRIX_QUIZ, sizeof(TPacketGCRunupMatrixQuiz), &CAccountConnector::__AuthState_RecvRunupMatrixQuiz)) + return true; + + if (!__AnalyzePacket(HEADER_GC_NEWCIBN_PASSPOD_REQUEST, sizeof(TPacketGCNEWCIBNPasspodRequest), &CAccountConnector::__AuthState_RecvNEWCIBNPasspodRequest)) + return true; + + if (!__AnalyzePacket(HEADER_GC_HANDSHAKE, sizeof(TPacketGCHandshake), &CAccountConnector::__AuthState_RecvHandshake)) + return false; + + if (!__AnalyzePacket(HEADER_GC_PANAMA_PACK, sizeof(TPacketGCPanamaPack), &CAccountConnector::__AuthState_RecvPanamaPack)) + return false; + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + if (!__AnalyzePacket(HEADER_GC_KEY_AGREEMENT, sizeof(TPacketKeyAgreement), &CAccountConnector::__AuthState_RecvKeyAgreement)) + return false; + + if (!__AnalyzePacket(HEADER_GC_KEY_AGREEMENT_COMPLETED, sizeof(TPacketKeyAgreementCompleted), &CAccountConnector::__AuthState_RecvKeyAgreementCompleted)) + return false; +#endif + + // TODO : 차후 서버와 동일하게 가변길이 data serialize & deserialize 작업해야 한다. + if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys)) + return false; + + if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_SDB, &CAccountConnector::__AuthState_RecvHybridCryptSDB)) + return false; + + return true; +} + +bool CAccountConnector::__AuthState_RecvEmpty() +{ + BYTE byEmpty; + Recv(sizeof(BYTE), &byEmpty); + return true; +} + +bool CAccountConnector::__AuthState_RecvPhase() +{ + TPacketGCPhase kPacketPhase; + if (!Recv(sizeof(kPacketPhase), &kPacketPhase)) + return false; + + if (kPacketPhase.phase == PHASE_HANDSHAKE) + { + __HandshakeState_Set(); + } + else if (kPacketPhase.phase == PHASE_AUTH) + { +#ifndef _IMPROVED_PACKET_ENCRYPTION_ + const char* key = LocaleService_GetSecurityKey(); + SetSecurityMode(true, key); +#endif + +#ifdef USE_OPENID + if (!openid_test) + { + //2012.07.19 OpenID : 김용욱 + //Ongoing : 오픈 아이디 경우-> TPacketCGLogin5 + //클라가 가지고 있는 인증키만을 서버에 보내도록. + + //const char* tempAuthKey = "d4025bc1f752b64fe5d51ae575ec4730"; //하드코딩 길이 32 + TPacketCGLogin5 LoginPacket; + LoginPacket.header = HEADER_CG_LOGIN5_OPENID; + + strncpy(LoginPacket.authKey, LocaleService_GetOpenIDAuthKey(), OPENID_AUTHKEY_LEN); + LoginPacket.authKey[OPENID_AUTHKEY_LEN] = '\0'; + + for (DWORD i = 0; i < 4; ++i) + LoginPacket.adwClientKey[i] = g_adwEncryptKey[i]; + + if (!Send(sizeof(LoginPacket), &LoginPacket)) + { + Tracen(" CAccountConnector::__AuthState_RecvPhase - SendLogin5 Error"); + return false; + } + + if (!SendSequence()) + { + return false; + } + } + else + { + TPacketCGLogin3 LoginPacket; + LoginPacket.header = HEADER_CG_LOGIN3; + + strncpy(LoginPacket.name, m_strID.c_str(), ID_MAX_NUM); + strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM); + LoginPacket.name[ID_MAX_NUM] = '\0'; + LoginPacket.pwd[PASS_MAX_NUM] = '\0'; + + // 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경 + ClearLoginInfo(); + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ClearLoginInfo(); + + m_strPassword = ""; + + for (DWORD i = 0; i < 4; ++i) + LoginPacket.adwClientKey[i] = g_adwEncryptKey[i]; + + if (!Send(sizeof(LoginPacket), &LoginPacket)) + { + Tracen(" CAccountConnector::__AuthState_RecvPhase - SendLogin3 Error"); + return false; + } + + if (!SendSequence()) + { + return false; + } + } +#else /* USE_OPENID */ + +#ifdef USE_AHNLAB_HACKSHIELD + HackShield_SetUserInfo(m_strID.c_str()); +#endif +#ifdef XTRAP_CLIENT_ENABLE + XTrap_SetUserInfo(m_strID.c_str(), NULL, NULL, NULL, NULL); +#endif + + + TPacketCGLogin3 LoginPacket; + LoginPacket.header = HEADER_CG_LOGIN3; + + strncpy(LoginPacket.name, m_strID.c_str(), ID_MAX_NUM); + strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM); + LoginPacket.name[ID_MAX_NUM] = '\0'; + LoginPacket.pwd[PASS_MAX_NUM] = '\0'; + + // 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경 + ClearLoginInfo(); + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ClearLoginInfo(); + + m_strPassword = ""; + + for (DWORD i = 0; i < 4; ++i) + LoginPacket.adwClientKey[i] = g_adwEncryptKey[i]; + + if (!Send(sizeof(LoginPacket), &LoginPacket)) + { + Tracen(" CAccountConnector::__AuthState_RecvPhase - SendLogin3 Error"); + return false; + } + + if (!SendSequence()) + { + return false; + } +#endif /* USE_OPENID */ + + __AuthState_Set(); + } + + return true; +} + +bool CAccountConnector::__AuthState_RecvHandshake() +{ + TPacketGCHandshake kPacketHandshake; + if (!Recv(sizeof(kPacketHandshake), &kPacketHandshake)) + return false; + + // HandShake + { + Tracenf("HANDSHAKE RECV %u %d", kPacketHandshake.dwTime, kPacketHandshake.lDelta); + + ELTimer_SetServerMSec(kPacketHandshake.dwTime+ kPacketHandshake.lDelta); + + //DWORD dwBaseServerTime = kPacketHandshake.dwTime+ kPacketHandshake.lDelta; + //DWORD dwBaseClientTime = ELTimer_GetMSec(); + + kPacketHandshake.dwTime = kPacketHandshake.dwTime + kPacketHandshake.lDelta + kPacketHandshake.lDelta; + kPacketHandshake.lDelta = 0; + + Tracenf("HANDSHAKE SEND %u", kPacketHandshake.dwTime); + + if (!Send(sizeof(kPacketHandshake), &kPacketHandshake)) + { + Tracen(" CAccountConnector::__AuthState_RecvHandshake - SendHandshake Error"); + return false; + } + } + + return true; +} + +bool CAccountConnector::__AuthState_RecvPanamaPack() +{ + TPacketGCPanamaPack kPacket; + + if (!Recv(sizeof(TPacketGCPanamaPack), &kPacket)) + return false; + + CEterPackManager::instance().RegisterPack(kPacket.szPackName, "*", kPacket.abIV); + return true; +} + +bool CAccountConnector::__AuthState_RecvHybridCryptKeys(int iTotalSize) +{ + int iFixedHeaderSize = TPacketGCHybridCryptKeys::GetFixedHeaderSize(); + + TPacketGCHybridCryptKeys kPacket(iTotalSize-iFixedHeaderSize); + + if (!Recv(iFixedHeaderSize, &kPacket)) + return false; + + if (!Recv(kPacket.iKeyStreamLen, kPacket.m_pStream)) + return false; + + CEterPackManager::Instance().RetrieveHybridCryptPackKeys( kPacket.m_pStream ); + return true; +} + +bool CAccountConnector::__AuthState_RecvHybridCryptSDB(int iTotalSize) +{ + int iFixedHeaderSize = TPacketGCHybridSDB::GetFixedHeaderSize(); + + TPacketGCHybridSDB kPacket(iTotalSize-iFixedHeaderSize); + + if (!Recv(iFixedHeaderSize, &kPacket)) + return false; + + if (!Recv(kPacket.iSDBStreamLen, kPacket.m_pStream)) + return false; + + CEterPackManager::Instance().RetrieveHybridCryptPackSDB( kPacket.m_pStream ); + return true; +} + + +bool CAccountConnector::__AuthState_RecvPing() +{ + TPacketGCPing kPacketPing; + if (!Recv(sizeof(kPacketPing), &kPacketPing)) + return false; + + __AuthState_SendPong(); + + return true; +} + +bool CAccountConnector::__AuthState_SendPong() +{ + TPacketCGPong kPacketPong; + kPacketPong.bHeader = HEADER_CG_PONG; + if (!Send(sizeof(kPacketPong), &kPacketPong)) + return false; + + if (IsSecurityMode()) + return SendSequence(); + + return true; +} + +bool CAccountConnector::__AuthState_RecvAuthSuccess() +{ + TPacketGCAuthSuccess kAuthSuccessPacket; + if (!Recv(sizeof(kAuthSuccessPacket), &kAuthSuccessPacket)) + return false; + + if (!kAuthSuccessPacket.bResult) + { + if (m_poHandler) + PyCallClassMemberFunc(m_poHandler, "OnLoginFailure", Py_BuildValue("(s)", "BESAMEKEY")); + } + else + { + DWORD dwPanamaKey = kAuthSuccessPacket.dwLoginKey ^ g_adwEncryptKey[0] ^ g_adwEncryptKey[1] ^ g_adwEncryptKey[2] ^ g_adwEncryptKey[3]; + CEterPackManager::instance().DecryptPackIV(dwPanamaKey); + + CPythonNetworkStream & rkNet = CPythonNetworkStream::Instance(); + rkNet.SetLoginKey(kAuthSuccessPacket.dwLoginKey); + rkNet.Connect(m_strAddr.c_str(), m_iPort); + } + + Disconnect(); + __OfflineState_Set(); + + return true; +} + +#ifdef USE_OPENID +bool CAccountConnector::__AuthState_RecvAuthSuccess_OpenID() +{ + TPacketGCAuthSuccessOpenID kAuthSuccessOpenIDPacket; + if (!Recv(sizeof(kAuthSuccessOpenIDPacket), &kAuthSuccessOpenIDPacket)) + return false; + + if (!kAuthSuccessOpenIDPacket.bResult) + { + if (m_poHandler) + PyCallClassMemberFunc(m_poHandler, "OnLoginFailure", Py_BuildValue("(s)", "BESAMEKEY")); + } + else + { + DWORD dwPanamaKey = kAuthSuccessOpenIDPacket.dwLoginKey ^ g_adwEncryptKey[0] ^ g_adwEncryptKey[1] ^ g_adwEncryptKey[2] ^ g_adwEncryptKey[3]; + CEterPackManager::instance().DecryptPackIV(dwPanamaKey); + + CPythonNetworkStream & rkNet = CPythonNetworkStream::Instance(); + rkNet.SetLoginInfo(kAuthSuccessOpenIDPacket.login, "0000"); //OpenID 인증 과정에서 비밀번호는 사용되지 않는다. + rkNet.SetLoginKey(kAuthSuccessOpenIDPacket.dwLoginKey); + rkNet.Connect(m_strAddr.c_str(), m_iPort); + } + + Disconnect(); + __OfflineState_Set(); + + return true; +} +#endif /* USE_OPENID */ + + +bool CAccountConnector::__AuthState_RecvAuthFailure() +{ + TPacketGCLoginFailure packet_failure; + if (!Recv(sizeof(TPacketGCLoginFailure), &packet_failure)) + return false; + + if (m_poHandler) + PyCallClassMemberFunc(m_poHandler, "OnLoginFailure", Py_BuildValue("(s)", packet_failure.szStatus)); + +// __OfflineState_Set(); + + return true; +} + +bool CAccountConnector::__AuthState_RecvRunupMatrixQuiz() +{ + TPacketGCRunupMatrixQuiz kMatrixQuizPacket; + if (!Recv(sizeof(TPacketGCRunupMatrixQuiz), &kMatrixQuizPacket)) + return false; + + PyCallClassMemberFunc(m_poHandler, "BINARY_OnRunupMatrixQuiz", Py_BuildValue("(s)", kMatrixQuizPacket.szQuiz)); + return true; +} + +bool CAccountConnector::__AuthState_RecvNEWCIBNPasspodRequest() +{ + TPacketGCNEWCIBNPasspodRequest kRequestPacket; + if (!Recv(sizeof(kRequestPacket), &kRequestPacket)) + return false; + + PyCallClassMemberFunc(m_poHandler, "BINARY_OnNEWCIBNPasspodRequest", Py_BuildValue("()")); + return true; +} + +#define ROW(rows, i) ((rows >> ((4 - i - 1) * 8)) & 0x000000FF) +#define COL(cols, i) ((cols >> ((4 - i - 1) * 8)) & 0x000000FF) + +bool CAccountConnector::__AuthState_RecvChinaMatrixCard() +{ + TPacketGCChinaMatrixCard kMatrixCardPacket; + if (!Recv(sizeof(TPacketGCChinaMatrixCard), &kMatrixCardPacket)) + return false; + + if (m_poHandler) + { + PyObject * pyValue = Py_BuildValue("(iiiiiiii)", ROW(kMatrixCardPacket.dwRows, 0), + ROW(kMatrixCardPacket.dwRows, 1), + ROW(kMatrixCardPacket.dwRows, 2), + ROW(kMatrixCardPacket.dwRows, 3), + COL(kMatrixCardPacket.dwCols, 0), + COL(kMatrixCardPacket.dwCols, 1), + COL(kMatrixCardPacket.dwCols, 2), + COL(kMatrixCardPacket.dwCols, 3)); + PyCallClassMemberFunc(m_poHandler, "OnMatrixCard", pyValue); + } + + return true; +} + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ +bool CAccountConnector::__AuthState_RecvKeyAgreement() +{ + TPacketKeyAgreement packet; + if (!Recv(sizeof(packet), &packet)) + { + return false; + } + + Tracenf("KEY_AGREEMENT RECV %u", packet.wDataLength); + + TPacketKeyAgreement packetToSend; + size_t dataLength = TPacketKeyAgreement::MAX_DATA_LEN; + size_t agreedLength = Prepare(packetToSend.data, &dataLength); + if (agreedLength == 0) + { + // 초기화 실패 + Disconnect(); + return false; + } + assert(dataLength <= TPacketKeyAgreement::MAX_DATA_LEN); + + if (Activate(packet.wAgreedLength, packet.data, packet.wDataLength)) + { + // Key agreement 성공, 응답 전송 + packetToSend.bHeader = HEADER_CG_KEY_AGREEMENT; + packetToSend.wAgreedLength = (WORD)agreedLength; + packetToSend.wDataLength = (WORD)dataLength; + + if (!Send(sizeof(packetToSend), &packetToSend)) + { + Tracen(" CAccountConnector::__AuthState_RecvKeyAgreement - SendKeyAgreement Error"); + return false; + } + Tracenf("KEY_AGREEMENT SEND %u", packetToSend.wDataLength); + } + else + { + // 키 협상 실패 + Disconnect(); + return false; + } + return true; +} + +bool CAccountConnector::__AuthState_RecvKeyAgreementCompleted() +{ + TPacketKeyAgreementCompleted packet; + if (!Recv(sizeof(packet), &packet)) + { + return false; + } + + Tracenf("KEY_AGREEMENT_COMPLETED RECV"); + + ActivateCipher(); + + return true; +} +#endif // _IMPROVED_PACKET_ENCRYPTION_ + +bool CAccountConnector::__AnalyzePacket(UINT uHeader, UINT uPacketSize, bool (CAccountConnector::*pfnDispatchPacket)()) +{ + BYTE bHeader; + if (!Peek(sizeof(bHeader), &bHeader)) + return true; + + if (bHeader!=uHeader) + return true; + + if (!Peek(uPacketSize)) + return true; + + return (this->*pfnDispatchPacket)(); +} + +bool CAccountConnector::__AnalyzeVarSizePacket(UINT uHeader, bool (CAccountConnector::*pfnDispatchPacket)(int)) +{ + BYTE bHeader; + if (!Peek(sizeof(bHeader), &bHeader)) + return true; + + if (bHeader!=uHeader) + return true; + + TDynamicSizePacketHeader dynamicHeader; + + if (!Peek(sizeof(dynamicHeader), &dynamicHeader)) + return true; + + if (!Peek(dynamicHeader.size)) + return true; + + return (this->*pfnDispatchPacket)(dynamicHeader.size); +} + + +void CAccountConnector::__OfflineState_Set() +{ + __Inialize(); +} + +void CAccountConnector::__HandshakeState_Set() +{ + m_eState=STATE_HANDSHAKE; +} + +void CAccountConnector::__AuthState_Set() +{ + m_eState=STATE_AUTH; +} + +void CAccountConnector::OnConnectFailure() +{ + if (m_poHandler) + PyCallClassMemberFunc(m_poHandler, "OnConnectFailure", Py_BuildValue("()")); + + __OfflineState_Set(); +} + +void CAccountConnector::OnConnectSuccess() +{ + m_eState = STATE_HANDSHAKE; +} + +void CAccountConnector::OnRemoteDisconnect() +{ + // Matrix Card Number 를 보내 놓았는데 close 되면 프로그램을 종료 한다. + if (m_isWaitKey) + { + if (m_poHandler) + { + PyCallClassMemberFunc(m_poHandler, "OnExit", Py_BuildValue("()")); + return; + } + } + + __OfflineState_Set(); +} + +void CAccountConnector::OnDisconnect() +{ + __OfflineState_Set(); +} + +#ifndef _IMPROVED_PACKET_ENCRYPTION_ +void CAccountConnector::__BuildClientKey() +{ + for (DWORD i = 0; i < 4; ++i) + g_adwEncryptKey[i] = random(); + + const BYTE * c_pszKey = (const BYTE *) "JyTxtHljHJlVJHorRM301vf@4fvj10-v"; + tea_encrypt((DWORD *) g_adwDecryptKey, (const DWORD *) g_adwEncryptKey, (const DWORD *) c_pszKey, 16); +} +#endif + +void CAccountConnector::__Inialize() +{ + m_eState=STATE_OFFLINE; + m_isWaitKey = FALSE; +} + +CAccountConnector::CAccountConnector() +{ + m_poHandler = NULL; + m_strAddr = ""; + m_iPort = 0; + + SetLoginInfo("", ""); + SetRecvBufferSize(1024 * 128); + SetSendBufferSize(2048); + __Inialize(); +} + +CAccountConnector::~CAccountConnector() +{ + __OfflineState_Set(); +} diff --git a/extension/src/port/UserInterface/AffectFlagContainer.cpp b/extension/src/port/UserInterface/AffectFlagContainer.cpp new file mode 100644 index 00000000..2e84841c --- /dev/null +++ b/extension/src/port/UserInterface/AffectFlagContainer.cpp @@ -0,0 +1,92 @@ +#include "StdAfx.h" +#include "AffectFlagContainer.h" + +CAffectFlagContainer::CAffectFlagContainer() +{ + Clear(); +} + +CAffectFlagContainer::~CAffectFlagContainer() +{ +} + +void CAffectFlagContainer::Clear() +{ + memset(m_aElement, 0, sizeof(m_aElement)); +} + +void CAffectFlagContainer::CopyInstance(const CAffectFlagContainer& c_rkAffectContainer) +{ + memcpy(m_aElement, c_rkAffectContainer.m_aElement, sizeof(m_aElement)); +} + +void CAffectFlagContainer::CopyData(UINT uPos, UINT uByteSize, const void* c_pvData) +{ + const BYTE* c_pbData=(const BYTE*)c_pvData; + Element bMask=0x01; + + UINT uBitEnd=uPos+uByteSize*8; + for (UINT i=uPos; i=BYTE_SIZE) + { + return NULL; + } + + return (const void *)&m_aElement[uPos]; +} +*/ + +void CAffectFlagContainer::Set(UINT uPos, bool isSet) +{ + if (uPos/8>=BYTE_SIZE) + { + TraceError("CAffectFlagContainer::Set(uPos=%d>%d, isSet=%d", uPos, BYTE_SIZE*8, isSet); + return; + } + + BYTE& rElement=m_aElement[uPos/8]; + + BYTE bMask=BYTE(1<<(uPos&7)); + if (isSet) + rElement|=bMask; + else + rElement&=~bMask; +} + +bool CAffectFlagContainer::IsSet(UINT uPos) const +{ + if (uPos/8>=BYTE_SIZE) + { + TraceError("CAffectFlagContainer::IsSet(uPos=%d>%d", uPos, BYTE_SIZE*8); + return false; + } + + const BYTE& c_rElement=m_aElement[uPos/8]; + + BYTE bMask=BYTE(1<<(uPos&7)); + if (c_rElement&bMask) + return true; + + return false; +} diff --git a/extension/src/port/UserInterface/InsultChecker.cpp b/extension/src/port/UserInterface/InsultChecker.cpp new file mode 100644 index 00000000..06bcb512 --- /dev/null +++ b/extension/src/port/UserInterface/InsultChecker.cpp @@ -0,0 +1,97 @@ +#include "StdAfx.h" +#include "InsultChecker.h" + +CInsultChecker& CInsultChecker::GetSingleton() +{ + static CInsultChecker s_kInsultChecker; + return s_kInsultChecker; +} + +CInsultChecker::CInsultChecker() +{ +} + +CInsultChecker::~CInsultChecker() +{ +} + +void CInsultChecker::Clear() +{ + m_kList_stInsult.clear(); +} + +void CInsultChecker::AppendInsult(const std::string& c_rstInsult) +{ + if (c_rstInsult.length()>0) + m_kList_stInsult.push_back(c_rstInsult); +} + +bool CInsultChecker::__GetInsultLength(const char* c_szWord, UINT* puInsultLen) +{ + std::list::iterator i; + for (i=m_kList_stInsult.begin(); i!=m_kList_stInsult.end(); ++i) + { + std::string& rstInsult=*i; + + int ret=LocaleService_StringCompareCI(c_szWord, rstInsult.c_str(), rstInsult.length()); + if (0==ret) + { + *puInsultLen=rstInsult.length(); + return true; + } + } + + return false; +} + +bool CInsultChecker::__IsInsult(const char* c_szWord) +{ + UINT uInsultLen; + return __GetInsultLength(c_szWord, &uInsultLen); +} + +void CInsultChecker::FilterInsult(char* szLine, UINT uLineLen) +{ + const char INSULT_FILTER_CHAR = '*'; + for (UINT uPos=0; uPos m_kNetActorDict; +}; diff --git a/extension/src/port/UserInterface/Packet.h b/extension/src/port/UserInterface/Packet.h index 9cf6c11d..408ec672 100644 --- a/extension/src/port/UserInterface/Packet.h +++ b/extension/src/port/UserInterface/Packet.h @@ -766,8 +766,8 @@ typedef struct command_move typedef struct command_sync_position_element { DWORD dwVID; - long lX; - long lY; + LONG lX; // PORT: LONG, the 32-bit Win32 long + LONG lY; // PORT: LONG, the 32-bit Win32 long } TPacketCGSyncPositionElement; typedef struct command_sync_position @@ -780,8 +780,8 @@ typedef struct command_fly_targeting { BYTE bHeader; DWORD dwTargetVID; - long lX; - long lY; + LONG lX; // PORT: LONG, the 32-bit Win32 long + LONG lY; // PORT: LONG, the 32-bit Win32 long } TPacketCGFlyTargeting; typedef struct packet_fly_targeting @@ -789,8 +789,8 @@ typedef struct packet_fly_targeting BYTE bHeader; DWORD dwShooterVID; DWORD dwTargetVID; - long lX; - long lY; + LONG lX; // PORT: LONG, the 32-bit Win32 long + LONG lY; // PORT: LONG, the 32-bit Win32 long } TPacketGCFlyTargeting; typedef struct packet_shoot @@ -1186,7 +1186,7 @@ typedef struct SSimplePlayerInformation BYTE bChangeName; WORD wHairPart; BYTE bDummy[4]; - long x, y; + LONG x, y; // PORT: LONG, the 32-bit Win32 long LONG lAddr; WORD wPort; BYTE bySkillGroup; @@ -1312,9 +1312,9 @@ typedef struct packet_add_char //char name[CHARACTER_NAME_MAX_LEN + 1]; float angle; - long x; - long y; - long z; + LONG x; // PORT: LONG, the 32-bit Win32 long + LONG y; // PORT: LONG, the 32-bit Win32 long + LONG z; // PORT: LONG, the 32-bit Win32 long BYTE bType; WORD wRaceNum; @@ -1340,9 +1340,9 @@ typedef struct packet_add_char2 char name[CHARACTER_NAME_MAX_LEN + 1]; float angle; - long x; - long y; - long z; + LONG x; // PORT: LONG, the 32-bit Win32 long + LONG y; // PORT: LONG, the 32-bit Win32 long + LONG z; // PORT: LONG, the 32-bit Win32 long BYTE bType; WORD wRaceNum; @@ -1457,7 +1457,7 @@ typedef struct packet_main_character DWORD dwVID; WORD wRaceNum; char szName[CHARACTER_NAME_MAX_LEN + 1]; - long lX, lY, lZ; + LONG lX, lY, lZ; // PORT: LONG, the 32-bit Win32 long BYTE bySkillGroup; } TPacketGCMainCharacter; @@ -1468,7 +1468,7 @@ typedef struct packet_main_character2_empire DWORD dwVID; WORD wRaceNum; char szName[CHARACTER_NAME_MAX_LEN + 1]; - long lX, lY, lZ; + LONG lX, lY, lZ; // PORT: LONG, the 32-bit Win32 long BYTE byEmpire; BYTE bySkillGroup; } TPacketGCMainCharacter2_EMPIRE; @@ -1484,7 +1484,7 @@ typedef struct packet_main_character3_bgm WORD wRaceNum; char szUserName[CHARACTER_NAME_MAX_LEN + 1]; char szBGMName[MUSIC_NAME_MAX_LEN + 1]; - long lX, lY, lZ; + LONG lX, lY, lZ; // PORT: LONG, the 32-bit Win32 long BYTE byEmpire; BYTE bySkillGroup; } TPacketGCMainCharacter3_BGM; @@ -1501,7 +1501,7 @@ typedef struct packet_main_character4_bgm_vol char szUserName[CHARACTER_NAME_MAX_LEN + 1]; char szBGMName[MUSIC_NAME_MAX_LEN + 1]; float fBGMVol; - long lX, lY, lZ; + LONG lX, lY, lZ; // PORT: LONG, the 32-bit Win32 long BYTE byEmpire; BYTE bySkillGroup; } TPacketGCMainCharacter4_BGM_VOL; @@ -1679,7 +1679,7 @@ enum EPointTypes typedef struct packet_points { BYTE header; - long points[POINT_MAX_NUM]; + LONG points[POINT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long } TPacketGCPoints; typedef struct packet_point_change @@ -1689,8 +1689,8 @@ typedef struct packet_point_change DWORD dwVID; BYTE Type; - long amount; // 바뀐 값 - long value; // 현재 값 + LONG amount; // 바뀐 값 // PORT: LONG, the 32-bit Win32 long + LONG value; // 현재 값 // PORT: LONG, the 32-bit Win32 long } TPacketGCPointChange; typedef struct packet_motion @@ -1718,7 +1718,7 @@ struct TPacketGCItemDelDeprecate BYTE pos; DWORD vnum; BYTE count; - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; }; @@ -1729,7 +1729,7 @@ typedef struct packet_set_item DWORD vnum; BYTE count; DWORD flags; // 플래그 추가 - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TPacketGCItemSet; @@ -1745,7 +1745,7 @@ typedef struct packet_set_item TItemPos Cell; DWORD vnum; BYTE count; - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TPacketGCItemSet; @@ -1758,7 +1758,7 @@ typedef struct packet_set_item2 DWORD flags; // 플래그 추가 DWORD anti_flags; // 플래그 추가 bool highlight; - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TPacketGCItemSet2; #endif @@ -1784,16 +1784,16 @@ typedef struct packet_update_item BYTE header; TItemPos Cell; BYTE count; - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TPacketGCItemUpdate; typedef struct packet_ground_add_item { BYTE bHeader; - long lX; - long lY; - long lZ; + LONG lX; // PORT: LONG, the 32-bit Win32 long + LONG lY; // PORT: LONG, the 32-bit Win32 long + LONG lZ; // PORT: LONG, the 32-bit Win32 long DWORD dwVID; DWORD dwVnum; @@ -1892,7 +1892,7 @@ typedef struct packet_exchange DWORD arg1; TItemPos arg2; DWORD arg3; - long alValues[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alValues[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TPacketGCExchange; @@ -2000,7 +2000,7 @@ typedef struct packet_quest_confirm { BYTE header; char msg[64+1]; - long timeout; + LONG timeout; // PORT: LONG, the 32-bit Win32 long DWORD requestPID; } TPacketGCQuestConfirm; @@ -2021,8 +2021,8 @@ typedef struct packet_c2c typedef struct packetd_sync_position_element { DWORD dwVID; - long lX; - long lY; + LONG lX; // PORT: LONG, the 32-bit Win32 long + LONG lY; // PORT: LONG, the 32-bit Win32 long } TPacketGCSyncPositionElement; typedef struct packetd_sync_position @@ -2291,7 +2291,7 @@ typedef struct SPacketGuildWarPoint { DWORD dwGainGuildID; DWORD dwOpponentGuildID; - long lPoint; + LONG lPoint; // PORT: LONG, the 32-bit Win32 long } TPacketGuildWarPoint; // SubHeader - Dungeon @@ -2419,8 +2419,8 @@ struct TNPCPosition { BYTE bType; char name[CHARACTER_NAME_MAX_LEN+1]; - long x; - long y; + LONG x; // PORT: LONG, the 32-bit Win32 long + LONG y; // PORT: LONG, the 32-bit Win32 long }; typedef struct SPacketGCChangeName @@ -2495,7 +2495,7 @@ typedef struct SEquipmentItemSet { DWORD vnum; BYTE count; - long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + LONG alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; // PORT: LONG, the 32-bit Win32 long TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TEquipmentItemSet; @@ -2509,8 +2509,8 @@ typedef struct pakcet_view_equip typedef struct { DWORD dwID; - long x, y; - long width, height; + LONG x, y; // PORT: LONG, the 32-bit Win32 long + LONG width, height; // PORT: LONG, the 32-bit Win32 long DWORD dwGuildID; } TLandPacketElement; @@ -2523,7 +2523,7 @@ typedef struct packet_land_list typedef struct { BYTE bHeader; - long lID; + LONG lID; // PORT: LONG, the 32-bit Win32 long char szTargetName[32+1]; } TPacketGCTargetCreate; @@ -2537,7 +2537,7 @@ enum typedef struct { BYTE bHeader; - long lID; + LONG lID; // PORT: LONG, the 32-bit Win32 long char szTargetName[32+1]; DWORD dwVID; BYTE byType; @@ -2546,24 +2546,24 @@ typedef struct typedef struct { BYTE bHeader; - long lID; - long lX, lY; + LONG lID; // PORT: LONG, the 32-bit Win32 long + LONG lX, lY; // PORT: LONG, the 32-bit Win32 long } TPacketGCTargetUpdate; typedef struct { BYTE bHeader; - long lID; + LONG lID; // PORT: LONG, the 32-bit Win32 long } TPacketGCTargetDelete; typedef struct { DWORD dwType; BYTE bPointIdxApplyOn; - long lApplyValue; + LONG lApplyValue; // PORT: LONG, the 32-bit Win32 long DWORD dwFlag; - long lDuration; - long lSPCost; + LONG lDuration; // PORT: LONG, the 32-bit Win32 long + LONG lSPCost; // PORT: LONG, the 32-bit Win32 long } TPacketAffectElement; typedef struct diff --git a/extension/src/port/UserInterface/ProcessCRC.h b/extension/src/port/UserInterface/ProcessCRC.h new file mode 100644 index 00000000..09faeba2 --- /dev/null +++ b/extension/src/port/UserInterface/ProcessCRC.h @@ -0,0 +1,6 @@ +#pragma once + +extern bool GetExeCRC(DWORD & r_dwProcCRC, DWORD & r_dwFileCRC); + +extern void BuildProcessCRC(); +extern BYTE GetProcessCRCMagicCubePiece(); diff --git a/extension/src/port/UserInterface/PythonNetworkStream.cpp b/extension/src/port/UserInterface/PythonNetworkStream.cpp new file mode 100644 index 00000000..540408a5 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStream.cpp @@ -0,0 +1,911 @@ +#include "StdAfx.h" +#include "../EterLib/NetPacketHeaderMap.h" + +#include "PythonNetworkStream.h" +#include "Packet.h" +#include "NetworkActorManager.h" + +#include "GuildMarkDownloader.h" +#include "GuildMarkUploader.h" +#include "MarkManager.h" + +#include "ProcessCRC.h" + +// MARK_BUG_FIX +static DWORD gs_nextDownloadMarkTime = 0; +// END_OF_MARK_BUG_FIX + +// Packet --------------------------------------------------------------------------- +class CMainPacketHeaderMap : public CNetworkPacketHeaderMap +{ + public: + enum + { + STATIC_SIZE_PACKET = false, + DYNAMIC_SIZE_PACKET = true, + }; + + public: + CMainPacketHeaderMap() + { + Set(HEADER_GC_EMPIRE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCEmpire), STATIC_SIZE_PACKET)); + Set(HEADER_GC_WARP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCWarp), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SKILL_COOLTIME_END, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSkillCoolTimeEnd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_QUEST_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCQuestInfo), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_REQUEST_MAKE_GUILD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCBlank), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PVP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPVP), STATIC_SIZE_PACKET)); + Set(HEADER_GC_DUEL_START, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDuelStart), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_ADD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterAdd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHAR_ADDITIONAL_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterAdditionalInfo), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_ADD2, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterAdd2), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_UPDATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterUpdate), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_UPDATE2, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterUpdate2), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_DEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCharacterDelete), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHARACTER_MOVE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMove), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHAT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChat), DYNAMIC_SIZE_PACKET)); + + Set(HEADER_GC_SYNC_POSITION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCC2C), DYNAMIC_SIZE_PACKET)); + + Set(HEADER_GC_LOGIN_SUCCESS3, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginSuccess3), STATIC_SIZE_PACKET)); + Set(HEADER_GC_LOGIN_SUCCESS4, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginSuccess4), STATIC_SIZE_PACKET)); + Set(HEADER_GC_LOGIN_FAILURE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginFailure), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_PLAYER_CREATE_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPlayerCreateSuccess), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PLAYER_CREATE_FAILURE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCreateFailure), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PLAYER_DELETE_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCBlank), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCBlank), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_STUN, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCStun), STATIC_SIZE_PACKET)); + Set(HEADER_GC_DEAD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDead), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_MAIN_CHARACTER, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMainCharacter), STATIC_SIZE_PACKET)); + + // SUPPORT_BGM + Set(HEADER_GC_MAIN_CHARACTER2_EMPIRE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMainCharacter2_EMPIRE), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MAIN_CHARACTER3_BGM, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMainCharacter3_BGM), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MAIN_CHARACTER4_BGM_VOL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMainCharacter4_BGM_VOL), STATIC_SIZE_PACKET)); + // END_OFSUPPORT_BGM + + Set(HEADER_GC_PLAYER_POINTS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPoints), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PLAYER_POINT_CHANGE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPointChange), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_ITEM_SET, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemSet), STATIC_SIZE_PACKET)); + Set(HEADER_GC_ITEM_SET2, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemSet2), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_ITEM_USE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemUse), STATIC_SIZE_PACKET)); + Set(HEADER_GC_ITEM_UPDATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemUpdate), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_ITEM_GROUND_ADD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemGroundAdd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_ITEM_GROUND_DEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemGroundDel), STATIC_SIZE_PACKET)); + Set(HEADER_GC_ITEM_OWNERSHIP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemOwnership), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_QUICKSLOT_ADD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCQuickSlotAdd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_QUICKSLOT_DEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCQuickSlotDel), STATIC_SIZE_PACKET)); + Set(HEADER_GC_QUICKSLOT_SWAP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCQuickSlotSwap), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_WHISPER, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCWhisper), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_CHARACTER_POSITION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPosition), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MOTION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMotion), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_SHOP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCShop), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_SHOP_SIGN, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCShopSign), STATIC_SIZE_PACKET)); + Set(HEADER_GC_EXCHANGE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCExchange), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_PING, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPing), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_SCRIPT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCScript), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_QUEST_CONFIRM, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCQuestConfirm), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_TARGET, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTarget), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MOUNT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMount), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_CHANGE_SPEED, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChangeSpeed), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_HANDSHAKE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCHandshake), STATIC_SIZE_PACKET)); + Set(HEADER_GC_HANDSHAKE_OK, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCBlank), STATIC_SIZE_PACKET)); + Set(HEADER_GC_BINDUDP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCBindUDP), STATIC_SIZE_PACKET)); + Set(HEADER_GC_OWNERSHIP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCOwnership), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CREATE_FLY, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCCreateFly), STATIC_SIZE_PACKET)); +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + Set(HEADER_GC_KEY_AGREEMENT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketKeyAgreement), STATIC_SIZE_PACKET)); + Set(HEADER_GC_KEY_AGREEMENT_COMPLETED, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketKeyAgreementCompleted), STATIC_SIZE_PACKET)); +#endif + Set(HEADER_GC_ADD_FLY_TARGETING, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCFlyTargeting), STATIC_SIZE_PACKET)); + Set(HEADER_GC_FLY_TARGETING, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCFlyTargeting), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_PHASE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPhase), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SKILL_LEVEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSkillLevel), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SKILL_LEVEL_NEW, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSkillLevelNew), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_MESSENGER, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMessenger), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_GUILD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCGuild), DYNAMIC_SIZE_PACKET)); + + Set(HEADER_GC_PARTY_INVITE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyInvite), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_ADD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyAdd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_UPDATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyUpdate), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_REMOVE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyRemove), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_LINK, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyLink), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_UNLINK, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyUnlink), STATIC_SIZE_PACKET)); + Set(HEADER_GC_PARTY_PARAMETER, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyParameter), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_SAFEBOX_SET, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemSet), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SAFEBOX_DEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemDel), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SAFEBOX_WRONG_PASSWORD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSafeboxWrongPassword), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SAFEBOX_SIZE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSafeboxSize), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SAFEBOX_MONEY_CHANGE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSafeboxMoneyChange), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_FISHING, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCFishing), STATIC_SIZE_PACKET)); + Set(HEADER_GC_DUNGEON, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDungeon), DYNAMIC_SIZE_PACKET)); + //Set(HEADER_GC_SLOW_TIMER, CNetworkPacketHeaderMap::TPacketType(sizeof(BYTE), STATIC_SIZE_PACKET)); + Set(HEADER_GC_TIME, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTime), STATIC_SIZE_PACKET)); + Set(HEADER_GC_WALK_MODE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCWalkMode), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHANGE_SKILL_GROUP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChangeSkillGroup), STATIC_SIZE_PACKET)); + Set(HEADER_GC_REFINE_INFORMATION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCRefineInformation), STATIC_SIZE_PACKET)); + Set(HEADER_GC_REFINE_INFORMATION_NEW, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCRefineInformationNew), STATIC_SIZE_PACKET)); + Set(HEADER_GC_SEPCIAL_EFFECT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSpecialEffect), STATIC_SIZE_PACKET)); + Set(HEADER_GC_NPC_POSITION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCNPCPosition), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_CHANGE_NAME, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChangeName), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_CHINA_MATRIX_CARD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChinaMatrixCard), STATIC_SIZE_PACKET)); + Set(HEADER_GC_RUNUP_MATRIX_QUIZ, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCRunupMatrixQuiz), STATIC_SIZE_PACKET)); + Set(HEADER_GC_NEWCIBN_PASSPOD_REQUEST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCNEWCIBNPasspodRequest), STATIC_SIZE_PACKET)); + Set(HEADER_GC_NEWCIBN_PASSPOD_FAILURE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCNEWCIBNPasspodFailure), STATIC_SIZE_PACKET)); + Set(HEADER_GC_LOGIN_KEY, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginKey), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_AUTH_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAuthSuccess), STATIC_SIZE_PACKET)); + Set(HEADER_GC_AUTH_SUCCESS_OPENID, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAuthSuccessOpenID), STATIC_SIZE_PACKET)); + Set(HEADER_GC_CHANNEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChannel), STATIC_SIZE_PACKET)); + Set(HEADER_GC_VIEW_EQUIP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCViewEquip), STATIC_SIZE_PACKET)); + Set(HEADER_GC_LAND_LIST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLandList), DYNAMIC_SIZE_PACKET)); + + //Set(HEADER_GC_TARGET_CREATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTargetCreate), STATIC_SIZE_PACKET)); + Set(HEADER_GC_TARGET_UPDATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTargetUpdate), STATIC_SIZE_PACKET)); + Set(HEADER_GC_TARGET_DELETE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTargetDelete), STATIC_SIZE_PACKET)); + Set(HEADER_GC_TARGET_CREATE_NEW, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCTargetCreateNew), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_AFFECT_ADD, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAffectAdd), STATIC_SIZE_PACKET)); + Set(HEADER_GC_AFFECT_REMOVE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAffectRemove), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_MALL_OPEN, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMallOpen), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MALL_SET, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemSet), STATIC_SIZE_PACKET)); + Set(HEADER_GC_MALL_DEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCItemDel), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_LOVER_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoverInfo), STATIC_SIZE_PACKET)); + Set(HEADER_GC_LOVE_POINT_UPDATE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLovePointUpdate), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_DIG_MOTION, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDigMotion), STATIC_SIZE_PACKET)); + Set(HEADER_GC_DAMAGE_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDamageInfo), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_HS_REQUEST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketHSCheck), STATIC_SIZE_PACKET)); + Set(HEADER_GC_XTRAP_CS1_REQUEST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketXTrapCSVerify), STATIC_SIZE_PACKET)); + + Set(HEADER_GC_HYBRIDCRYPT_KEYS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCHybridCryptKeys), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_HYBRIDCRYPT_SDB, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCHybridSDB), DYNAMIC_SIZE_PACKET)); + Set(HEADER_GC_SPECIFIC_EFFECT, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSpecificEffect), STATIC_SIZE_PACKET)); + Set(HEADER_GC_DRAGON_SOUL_REFINE, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCDragonSoulRefine), STATIC_SIZE_PACKET)); + + } +}; + +int g_iLastPacket[2] = { 0, 0 }; + +void CPythonNetworkStream::ExitApplication() +{ + if (__IsNotPing()) + { + AbsoluteExitApplication(); + } + else + { + SendChatPacket("/quit"); + } +} + +void CPythonNetworkStream::ExitGame() +{ + if (__IsNotPing()) + { + LogOutGame(); + } + else + { + SendChatPacket("/phase_select"); + } +} + + +void CPythonNetworkStream::LogOutGame() +{ + if (__IsNotPing()) + { + AbsoluteExitGame(); + } + else + { + SendChatPacket("/logout"); + } +} + +void CPythonNetworkStream::AbsoluteExitGame() +{ + if (!IsOnline()) + return; + + OnRemoteDisconnect(); + Disconnect(); +} + +void CPythonNetworkStream::AbsoluteExitApplication() +{ + PostQuitMessage(0); +} + +bool CPythonNetworkStream::__IsNotPing() +{ + // 원래는 핑이 안올때 체크이나 서버랑 정확히 맞추어야 한다. + return false; +} + +DWORD CPythonNetworkStream::GetGuildID() +{ + return m_dwGuildID; +} + +UINT CPythonNetworkStream::UploadMark(const char * c_szImageFileName) +{ + // MARK_BUG_FIX + // 길드를 만든 직후는 길드 아이디가 0이다. + if (0 == m_dwGuildID) + return ERROR_MARK_UPLOAD_NEED_RECONNECT; + + gs_nextDownloadMarkTime = 0; + // END_OF_MARK_BUG_FIX + + UINT uError=ERROR_UNKNOWN; + CGuildMarkUploader& rkGuildMarkUploader=CGuildMarkUploader::Instance(); + if (!rkGuildMarkUploader.Connect(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey, m_dwGuildID, c_szImageFileName, &uError)) + { + switch (uError) + { + case CGuildMarkUploader::ERROR_CONNECT: + return ERROR_CONNECT_MARK_SERVER; + break; + case CGuildMarkUploader::ERROR_LOAD: + return ERROR_LOAD_MARK; + break; + case CGuildMarkUploader::ERROR_WIDTH: + return ERROR_MARK_WIDTH; + break; + case CGuildMarkUploader::ERROR_HEIGHT: + return ERROR_MARK_HEIGHT; + break; + default: + return ERROR_UNKNOWN; + } + } + + // MARK_BUG_FIX + __DownloadMark(); + // END_OF_MARK_BUG_FIX + + if (CGuildMarkManager::INVALID_MARK_ID == CGuildMarkManager::Instance().GetMarkID(m_dwGuildID)) + return ERROR_MARK_CHECK_NEED_RECONNECT; + + return ERROR_NONE; +} + +UINT CPythonNetworkStream::UploadSymbol(const char* c_szImageFileName) +{ + UINT uError=ERROR_UNKNOWN; + CGuildMarkUploader& rkGuildMarkUploader=CGuildMarkUploader::Instance(); + if (!rkGuildMarkUploader.ConnectToSendSymbol(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey, m_dwGuildID, c_szImageFileName, &uError)) + { + switch (uError) + { + case CGuildMarkUploader::ERROR_CONNECT: + return ERROR_CONNECT_MARK_SERVER; + break; + case CGuildMarkUploader::ERROR_LOAD: + return ERROR_LOAD_MARK; + break; + case CGuildMarkUploader::ERROR_WIDTH: + return ERROR_MARK_WIDTH; + break; + case CGuildMarkUploader::ERROR_HEIGHT: + return ERROR_MARK_HEIGHT; + break; + default: + return ERROR_UNKNOWN; + } + } + + return ERROR_NONE; +} + +void CPythonNetworkStream::__DownloadMark() +{ + // 3분 안에는 다시 접속하지 않는다. + DWORD curTime = ELTimer_GetMSec(); + + if (curTime < gs_nextDownloadMarkTime) + return; + + gs_nextDownloadMarkTime = curTime + 60000 * 3; // 3분 + + CGuildMarkDownloader& rkGuildMarkDownloader = CGuildMarkDownloader::Instance(); + rkGuildMarkDownloader.Connect(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey); +} + +void CPythonNetworkStream::__DownloadSymbol(const std::vector & c_rkVec_dwGuildID) +{ + CGuildMarkDownloader& rkGuildMarkDownloader=CGuildMarkDownloader::Instance(); + rkGuildMarkDownloader.ConnectToRecvSymbol(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey, c_rkVec_dwGuildID); +} + +void CPythonNetworkStream::SetPhaseWindow(UINT ePhaseWnd, PyObject* poPhaseWnd) +{ + if (ePhaseWnd>=PHASE_WINDOW_NUM) + return; + + m_apoPhaseWnd[ePhaseWnd]=poPhaseWnd; +} + +void CPythonNetworkStream::ClearPhaseWindow(UINT ePhaseWnd, PyObject* poPhaseWnd) +{ + if (ePhaseWnd>=PHASE_WINDOW_NUM) + return; + + if (poPhaseWnd != m_apoPhaseWnd[ePhaseWnd]) + return; + + m_apoPhaseWnd[ePhaseWnd]=0; +} + +void CPythonNetworkStream::SetServerCommandParserWindow(PyObject* poWnd) +{ + m_poSerCommandParserWnd = poWnd; +} + +bool CPythonNetworkStream::IsSelectedEmpire() +{ + if (m_dwEmpireID) + return true; + + return false; +} + +UINT CPythonNetworkStream::GetAccountCharacterSlotDatau(UINT iSlot, UINT eType) +{ + if (iSlot >= PLAYER_PER_ACCOUNT4) + return 0; + + TSimplePlayerInformation& rkSimplePlayerInfo=m_akSimplePlayerInfo[iSlot]; + + switch (eType) + { + case ACCOUNT_CHARACTER_SLOT_ID: + return rkSimplePlayerInfo.dwID; + case ACCOUNT_CHARACTER_SLOT_RACE: + return rkSimplePlayerInfo.byJob; + case ACCOUNT_CHARACTER_SLOT_LEVEL: + return rkSimplePlayerInfo.byLevel; + case ACCOUNT_CHARACTER_SLOT_STR: + return rkSimplePlayerInfo.byST; + case ACCOUNT_CHARACTER_SLOT_DEX: + return rkSimplePlayerInfo.byDX; + case ACCOUNT_CHARACTER_SLOT_HTH: + return rkSimplePlayerInfo.byHT; + case ACCOUNT_CHARACTER_SLOT_INT: + return rkSimplePlayerInfo.byIQ; + case ACCOUNT_CHARACTER_SLOT_PLAYTIME: + return rkSimplePlayerInfo.dwPlayMinutes; + case ACCOUNT_CHARACTER_SLOT_FORM: +// return rkSimplePlayerInfo.wParts[CRaceData::PART_MAIN]; + return rkSimplePlayerInfo.wMainPart; + case ACCOUNT_CHARACTER_SLOT_PORT: + return rkSimplePlayerInfo.wPort; + case ACCOUNT_CHARACTER_SLOT_GUILD_ID: + return m_adwGuildID[iSlot]; + break; + case ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG: + return rkSimplePlayerInfo.bChangeName; + break; + case ACCOUNT_CHARACTER_SLOT_HAIR: + return rkSimplePlayerInfo.wHairPart; + break; + } + return 0; +} + +const char* CPythonNetworkStream::GetAccountCharacterSlotDataz(UINT iSlot, UINT eType) +{ + static const char* sc_szEmpty=""; + + if (iSlot >= PLAYER_PER_ACCOUNT4) + return sc_szEmpty; + + TSimplePlayerInformation& rkSimplePlayerInfo=m_akSimplePlayerInfo[iSlot]; + + switch (eType) + { + case ACCOUNT_CHARACTER_SLOT_ADDR: + { + BYTE ip[4]; + + const int LEN = 4; + for (int i = 0; i < LEN; i++) + { + ip[i] = BYTE(rkSimplePlayerInfo.lAddr&0xff); + rkSimplePlayerInfo.lAddr>>=8; + } + + + static char s_szAddr[256]; + sprintf(s_szAddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); + return s_szAddr; + } + break; + case ACCOUNT_CHARACTER_SLOT_NAME: + return rkSimplePlayerInfo.szName; + break; + case ACCOUNT_CHARACTER_SLOT_GUILD_NAME: + return m_astrGuildName[iSlot].c_str(); + break; + } + return sc_szEmpty; +} + +void CPythonNetworkStream::ConnectLoginServer(const char* c_szAddr, UINT uPort) +{ + CNetworkStream::Connect(c_szAddr, uPort); +} + +void CPythonNetworkStream::SetMarkServer(const char* c_szAddr, UINT uPort) +{ + m_kMarkAuth.m_kNetAddr.Set(c_szAddr, uPort); +} + +void CPythonNetworkStream::ConnectGameServer(UINT iChrSlot) +{ + if (iChrSlot >= PLAYER_PER_ACCOUNT4) + return; + + m_dwSelectedCharacterIndex = iChrSlot; + + __DirectEnterMode_Set(iChrSlot); + + TSimplePlayerInformation& rkSimplePlayerInfo=m_akSimplePlayerInfo[iChrSlot]; + CNetworkStream::Connect((DWORD)rkSimplePlayerInfo.lAddr, rkSimplePlayerInfo.wPort); +} + +void CPythonNetworkStream::SetLoginInfo(const char* c_szID, const char* c_szPassword) +{ + m_stID=c_szID; + m_stPassword=c_szPassword; +} + +void CPythonNetworkStream::ClearLoginInfo( void ) +{ + m_stPassword = ""; +} + +void CPythonNetworkStream::SetLoginKey(DWORD dwLoginKey) +{ + m_dwLoginKey = dwLoginKey; +} + +bool CPythonNetworkStream::CheckPacket(TPacketHeader * pRetHeader) +{ + *pRetHeader = 0; + + static CMainPacketHeaderMap s_packetHeaderMap; + + TPacketHeader header; + + if (!Peek(sizeof(TPacketHeader), &header)) + return false; + + if (0 == header) + { + if (!Recv(sizeof(TPacketHeader), &header)) + return false; + + while (Peek(sizeof(TPacketHeader), &header)) + { + if (0 == header) + { + if (!Recv(sizeof(TPacketHeader), &header)) + return false; + } + else + { + break; + } + } + + if (0 == header) + return false; + } + + CNetworkPacketHeaderMap::TPacketType PacketType; + + if (!s_packetHeaderMap.Get(header, &PacketType)) + { + TraceError("Unknown packet header: %d, last: %d %d", header, g_iLastPacket[0], g_iLastPacket[1]); + ClearRecvBuffer(); + + PostQuitMessage(0); + return false; + } + + // Code for dynamic size packet + if (PacketType.isDynamicSizePacket) + { + TDynamicSizePacketHeader DynamicSizePacketHeader; + + if (!Peek(sizeof(TDynamicSizePacketHeader), &DynamicSizePacketHeader)) + return false; + + if (!Peek(DynamicSizePacketHeader.size)) + { + Tracef("CPythonNetworkStream::CheckPacket - Not enough dynamic packet size: header %d packet size: %d\n", + DynamicSizePacketHeader.header, + DynamicSizePacketHeader.size); + return false; + } + } + else + { + if (!Peek(PacketType.iPacketSize)) + { + //Tracef("Not enough packet size: header %d packet size: %d, recv buffer size: %d", + // header, + // PacketType.iPacketSize, + // GetRecvBufferSize()); + return false; + } + } + + if (!header) + return false; + + *pRetHeader = header; + + g_iLastPacket[0] = g_iLastPacket[1]; + g_iLastPacket[1] = header; + //Tracenf("header %d size %d", header, PacketType.iPacketSize); + //Tracenf("header %d size %d outputpos[%d] security %u", header, PacketType.iPacketSize, m_recvBufOutputPos, IsSecurityMode()); + return true; +} + +bool CPythonNetworkStream::RecvErrorPacket(int header) +{ + TraceError("Phase %s does not handle this header (header: %d, last: %d, %d)", + m_strPhase.c_str(), header, g_iLastPacket[0], g_iLastPacket[1]); + + ClearRecvBuffer(); + return true; +} + +bool CPythonNetworkStream::RecvPhasePacket() +{ + TPacketGCPhase packet_phase; + + if (!Recv(sizeof(TPacketGCPhase), &packet_phase)) + return false; + + switch (packet_phase.phase) + { + case PHASE_CLOSE: // 끊기는 상태 (또는 끊기 전 상태) + ClosePhase(); + break; + + case PHASE_HANDSHAKE: // 악수..;; + SetHandShakePhase(); + break; + + case PHASE_LOGIN: // 로그인 중 + SetLoginPhase(); + break; + + case PHASE_SELECT: // 캐릭터 선택 화면 + SetSelectPhase(); +#if defined(ENABLE_DISCORD_RPC) + Discord_Update(false); +#endif + + BuildProcessCRC(); + + // MARK_BUG_FIX + __DownloadMark(); + // END_OF_MARK_BUG_FIX + break; + + case PHASE_LOADING: // 선택 후 로딩 화면 + SetLoadingPhase(); + break; + + case PHASE_GAME: // 게임 화면 + SetGamePhase(); +#if defined(ENABLE_DISCORD_RPC) + Discord_Update(true); +#endif + break; + + case PHASE_DEAD: // 죽었을 때.. (게임 안에 있는 것일 수도..) + break; + } + + return true; +} + +bool CPythonNetworkStream::RecvPingPacket() +{ + Tracef("recv ping packet. (securitymode %u)\n", IsSecurityMode()); + + TPacketGCPing kPacketPing; + + if (!Recv(sizeof(TPacketGCPing), &kPacketPing)) + return false; + + m_dwLastGamePingTime = ELTimer_GetMSec(); + + TPacketCGPong kPacketPong; + kPacketPong.bHeader = HEADER_CG_PONG; + + if (!Send(sizeof(TPacketCGPong), &kPacketPong)) + return false; + + if (IsSecurityMode()) + return SendSequence(); + else + return true; +} + +bool CPythonNetworkStream::RecvDefaultPacket(int header) +{ + if (!header) + return true; + + TraceError("\xc3\xb3\xb8\xae\xb5\xc7\xc1\xf6 \xbe\xca\xc0\xba \xc6\xd0\xc5\xb6 \xc7\xec\xb4\xf5 %d, state %s\n", header, m_strPhase.c_str()); // PORT: CP949 bytes of "처리되지 않은 패킷 헤더 %d, state %s\n" + ClearRecvBuffer(); + return true; +} + +bool CPythonNetworkStream::OnProcess() +{ + if (m_isStartGame) + { + m_isStartGame = FALSE; + + PyCallClassMemberFunc(m_poHandler, "SetGamePhase", Py_BuildValue("()")); +// PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartGame", Py_BuildValue("()")); + } + + m_rokNetActorMgr->Update(); + + if (m_phaseProcessFunc.IsEmpty()) + return true; + + //TPacketHeader header; + //while(CheckPacket(&header)) + { + m_phaseProcessFunc.Run(); + } + + return true; +} + + +// Set +void CPythonNetworkStream::SetOffLinePhase() +{ + if ("OffLine" != m_strPhase) + m_phaseLeaveFunc.Run(); + + m_strPhase = "OffLine"; + + Tracen(""); + Tracen("## Network - OffLine Phase ##"); + Tracen(""); + +#if defined(ENABLE_DISCORD_RPC) + Discord_Update(false); +#endif + + m_dwChangingPhaseTime = ELTimer_GetMSec(); + m_phaseProcessFunc.Set(this, &CPythonNetworkStream::OffLinePhase); + m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveOfflinePhase); + + SetGameOffline(); + + m_dwSelectedCharacterIndex = 0; + + __DirectEnterMode_Initialize(); + __BettingGuildWar_Initialize(); +} + + +void CPythonNetworkStream::ClosePhase() +{ + PyCallClassMemberFunc(m_poHandler, "SetLoginPhase", Py_BuildValue("()")); +} + +// Game Online +void CPythonNetworkStream::SetGameOnline() +{ + m_isGameOnline = TRUE; +} + +void CPythonNetworkStream::SetGameOffline() +{ + m_isGameOnline = FALSE; +} + +BOOL CPythonNetworkStream::IsGameOnline() +{ + return m_isGameOnline; +} + +// Handler +void CPythonNetworkStream::SetHandler(PyObject* poHandler) +{ + m_poHandler = poHandler; +} + +// ETC +DWORD CPythonNetworkStream::GetMainActorVID() +{ + return m_dwMainActorVID; +} + +DWORD CPythonNetworkStream::GetMainActorRace() +{ + return m_dwMainActorRace; +} + +DWORD CPythonNetworkStream::GetMainActorEmpire() +{ + return m_dwMainActorEmpire; +} + +DWORD CPythonNetworkStream::GetMainActorSkillGroup() +{ + return m_dwMainActorSkillGroup; +} + +void CPythonNetworkStream::SetEmpireID(DWORD dwEmpireID) +{ + m_dwEmpireID = dwEmpireID; +} + +DWORD CPythonNetworkStream::GetEmpireID() +{ + return m_dwEmpireID; +} + +void CPythonNetworkStream::__ClearSelectCharacterData() +{ + NANOBEGIN + memset(&m_akSimplePlayerInfo, 0, sizeof(m_akSimplePlayerInfo)); + + for (int i = 0; i < PLAYER_PER_ACCOUNT4; ++i) + { + m_adwGuildID[i] = 0; + m_astrGuildName[i] = ""; + } + NANOEND +} + +void CPythonNetworkStream::__DirectEnterMode_Initialize() +{ + m_kDirectEnterMode.m_isSet=false; + m_kDirectEnterMode.m_dwChrSlotIndex=0; +} + +void CPythonNetworkStream::__DirectEnterMode_Set(UINT uChrSlotIndex) +{ + m_kDirectEnterMode.m_isSet=true; + m_kDirectEnterMode.m_dwChrSlotIndex=uChrSlotIndex; +} + +bool CPythonNetworkStream::__DirectEnterMode_IsSet() +{ + return m_kDirectEnterMode.m_isSet; +} + +void CPythonNetworkStream::__InitializeMarkAuth() +{ + m_kMarkAuth.m_dwHandle=0; + m_kMarkAuth.m_dwRandomKey=0; +} + +void CPythonNetworkStream::__BettingGuildWar_Initialize() +{ + m_kBettingGuildWar.m_dwBettingMoney=0; + m_kBettingGuildWar.m_dwObserverCount=0; +} + +void CPythonNetworkStream::__BettingGuildWar_SetObserverCount(UINT uObserverCount) +{ + m_kBettingGuildWar.m_dwObserverCount=uObserverCount; +} + +void CPythonNetworkStream::__BettingGuildWar_SetBettingMoney(UINT uBettingMoney) +{ + m_kBettingGuildWar.m_dwBettingMoney=uBettingMoney; +} + +DWORD CPythonNetworkStream::EXPORT_GetBettingGuildWarValue(const char* c_szValueName) +{ + if (stricmp(c_szValueName, "OBSERVER_COUNT") == 0) + return m_kBettingGuildWar.m_dwObserverCount; + + if (stricmp(c_szValueName, "BETTING_MONEY") == 0) + return m_kBettingGuildWar.m_dwBettingMoney; + + return 0; +} + +void CPythonNetworkStream::__ServerTimeSync_Initialize() +{ + m_kServerTimeSync.m_dwChangeClientTime=0; + m_kServerTimeSync.m_dwChangeServerTime=0; +} + +void CPythonNetworkStream::SetWaitFlag() +{ + m_isWaitLoginKey = TRUE; +} + +void CPythonNetworkStream::SendEmoticon(UINT eEmoticon) +{ + if(eEmoticon < m_EmoticonStringVector.size()) + SendChatPacket(m_EmoticonStringVector[eEmoticon].c_str()); + else + assert(false && "SendEmoticon Error"); +} + +CPythonNetworkStream::CPythonNetworkStream() +{ + m_rokNetActorMgr=new CNetworkActorManager; + + memset(m_akSimplePlayerInfo, 0, sizeof(m_akSimplePlayerInfo)); + + m_phaseProcessFunc.Clear(); + + m_dwEmpireID = 0; + m_dwGuildID = 0; + + m_dwMainActorVID = 0; + m_dwMainActorRace = 0; + m_dwMainActorEmpire = 0; + m_dwMainActorSkillGroup = 0; + m_poHandler = NULL; + + m_dwLastGamePingTime = 0; + + m_dwLoginKey = 0; + m_isWaitLoginKey = FALSE; + m_isStartGame = FALSE; + m_isEnableChatInsultFilter = FALSE; + m_bComboSkillFlag = FALSE; + m_strPhase = "OffLine"; + + __InitializeGamePhase(); + __InitializeMarkAuth(); + + __DirectEnterMode_Initialize(); + __BettingGuildWar_Initialize(); + + std::fill(m_apoPhaseWnd, m_apoPhaseWnd+PHASE_WINDOW_NUM, (PyObject*)NULL); + m_poSerCommandParserWnd = NULL; + + SetOffLinePhase(); +} + +CPythonNetworkStream::~CPythonNetworkStream() +{ + Tracen("PythonNetworkMainStream Clear"); +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamEvent.cpp b/extension/src/port/UserInterface/PythonNetworkStreamEvent.cpp new file mode 100644 index 00000000..f74cffca --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamEvent.cpp @@ -0,0 +1,18 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" + +void CPythonNetworkStream::OnRemoteDisconnect() +{ + PyCallClassMemberFunc(m_poHandler, "SetLoginPhase", Py_BuildValue("()")); +} + +void CPythonNetworkStream::OnDisconnect() +{ +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Main Game +void CPythonNetworkStream::OnScriptEventStart(int iSkin, int iIndex) +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenQuestWindow", Py_BuildValue("(ii)", iSkin, iIndex)); +} \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonNetworkStreamModule.cpp b/extension/src/port/UserInterface/PythonNetworkStreamModule.cpp new file mode 100644 index 00000000..e9b58d93 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamModule.cpp @@ -0,0 +1,1932 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +//#include "PythonNetworkDatagram.h" +#include "AccountConnector.h" +#include "PythonGuild.h" +#include "Test.h" + +#include "AbstractPlayer.h" + +static std::string gs_stServerInfo; +extern BOOL gs_bEmpireLanuageEnable; +std::list g_kList_strCommand; + +PyObject* netGetBettingGuildWarValue(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.EXPORT_GetBettingGuildWarValue(szName)); +} + +PyObject* netSetServerInfo(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + gs_stServerInfo=szFileName; + return Py_BuildNone(); +} + +PyObject* netGetServerInfo(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", gs_stServerInfo.c_str()); +} + +PyObject* netPreserveServerCommand(PyObject* poSelf, PyObject* poArgs) +{ + char* szLine; + if (!PyTuple_GetString(poArgs, 0, &szLine)) + return Py_BuildException(); + + g_kList_strCommand.push_back(szLine); + + return Py_BuildNone(); +} + +PyObject* netGetPreservedServerCommand(PyObject* poSelf, PyObject* poArgs) +{ + if (g_kList_strCommand.empty()) + return Py_BuildValue("s", ""); + + std::string strCommand = g_kList_strCommand.front(); + g_kList_strCommand.pop_front(); + + return Py_BuildValue("s", strCommand.c_str()); +} + +PyObject* netStartGame(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.StartGame(); + + return Py_BuildNone(); +} + +PyObject* netIsTest(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", __IS_TEST_SERVER_MODE__); +} + +PyObject* netWarp(PyObject* poSelf, PyObject* poArgs) +{ + int nX; + if (!PyTuple_GetInteger(poArgs, 0, &nX)) + return Py_BuildException(); + + int nY; + if (!PyTuple_GetInteger(poArgs, 1, &nY)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.Warp(nX, nY); + + return Py_BuildNone(); +} + +PyObject* netLoadInsultList(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.LoadInsultList(szFileName)); +} + +PyObject* netUploadMark(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.UploadMark(szFileName)); +} + +PyObject* netUploadSymbol(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.UploadSymbol(szFileName)); +} + +PyObject* netGetGuildID(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetGuildID()); +} + +PyObject* netGetEmpireID(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetEmpireID()); +} + +PyObject* netGetMainActorVID(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetMainActorVID()); +} + +PyObject* netGetMainActorRace(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetMainActorRace()); +} + +PyObject* netGetMainActorEmpire(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetMainActorEmpire()); +} + +PyObject* netGetMainActorSkillGroup(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.GetMainActorSkillGroup()); +} + +PyObject* netIsSelectedEmpire(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.IsSelectedEmpire()); +} + + +PyObject* netGetAccountCharacterSlotDataInteger(PyObject* poSelf, PyObject* poArgs) +{ + int nIndex; + if (!PyTuple_GetInteger(poArgs, 0, &nIndex)) + return Py_BuildException(); + + int nType; + if (!PyTuple_GetInteger(poArgs, 1, &nType)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + UINT uResult=rkNetStream.GetAccountCharacterSlotDatau(nIndex, nType); + return Py_BuildValue("i", uResult); +} + +PyObject* netGetAccountCharacterSlotDataString(PyObject* poSelf, PyObject* poArgs) +{ + int nIndex; + if (!PyTuple_GetInteger(poArgs, 0, &nIndex)) + return Py_BuildException(); + + int nType; + if (!PyTuple_GetInteger(poArgs, 1, &nType)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("s", rkNetStream.GetAccountCharacterSlotDataz(nIndex, nType)); +} + +// SUPPORT_BGM +PyObject* netGetFieldMusicFileName(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("s", rkNetStream.GetFieldMusicFileName()); +} + +PyObject* netGetFieldMusicVolume(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("f", rkNetStream.GetFieldMusicVolume()); +} +// END_OF_SUPPORT_BGM + +PyObject* netSetPhaseWindow(PyObject* poSelf, PyObject* poArgs) +{ + int ePhaseWnd; + if (!PyTuple_GetInteger(poArgs, 0, &ePhaseWnd)) + return Py_BuildException(); + + PyObject* poPhaseWnd; + if (!PyTuple_GetObject(poArgs, 1, &poPhaseWnd)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetPhaseWindow(ePhaseWnd, poPhaseWnd); + return Py_BuildNone(); +} + +PyObject* netClearPhaseWindow(PyObject* poSelf, PyObject* poArgs) +{ + int ePhaseWnd; + if (!PyTuple_GetInteger(poArgs, 0, &ePhaseWnd)) + return Py_BuildException(); + + PyObject* poPhaseWnd; + if (!PyTuple_GetObject(poArgs, 1, &poPhaseWnd)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ClearPhaseWindow(ePhaseWnd, poPhaseWnd); + return Py_BuildNone(); +} + +PyObject* netSetServerCommandParserWindow(PyObject* poSelf, PyObject* poArgs) +{ + PyObject* poPhaseWnd; + if (!PyTuple_GetObject(poArgs, 0, &poPhaseWnd)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetServerCommandParserWindow(poPhaseWnd); + return Py_BuildNone(); +} + +PyObject* netSetAccountConnectorHandler(PyObject* poSelf, PyObject* poArgs) +{ + PyObject* poPhaseWnd; + if (!PyTuple_GetObject(poArgs, 0, &poPhaseWnd)) + return Py_BuildException(); + + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.SetHandler(poPhaseWnd); + return Py_BuildNone(); +} + +PyObject* netSetHandler(PyObject* poSelf, PyObject* poArgs) +{ + PyObject* poHandler; + + if (!PyTuple_GetObject(poArgs, 0, &poHandler)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetHandler(poHandler); + return Py_BuildNone(); +} + +PyObject* netSetTCPRecvBufferSize(PyObject* poSelf, PyObject* poArgs) +{ + int bufSize; + if (!PyTuple_GetInteger(poArgs, 0, &bufSize)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetRecvBufferSize(bufSize); + return Py_BuildNone(); +} + +PyObject* netSetTCPSendBufferSize(PyObject* poSelf, PyObject* poArgs) +{ + int bufSize; + if (!PyTuple_GetInteger(poArgs, 0, &bufSize)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetSendBufferSize(bufSize); + return Py_BuildNone(); +} + +PyObject* netSetUDPRecvBufferSize(PyObject* poSelf, PyObject* poArgs) +{ + int bufSize; + if (!PyTuple_GetInteger(poArgs, 0, &bufSize)) + return Py_BuildException(); + + //CPythonNetworkDatagram::Instance().SetRecvBufferSize(bufSize); + return Py_BuildNone(); +} + +PyObject* netSetMarkServer(PyObject* poSelf, PyObject* poArgs) +{ + char* szAddr; + if (!PyTuple_GetString(poArgs, 0, &szAddr)) + return Py_BuildException(); + + int port; + if (!PyTuple_GetInteger(poArgs, 1, &port)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetMarkServer(szAddr, port); + return Py_BuildNone(); +} + +PyObject* netConnectTCP(PyObject* poSelf, PyObject* poArgs) +{ + char* szAddr; + if (!PyTuple_GetString(poArgs, 0, &szAddr)) + return Py_BuildException(); + + int port; + if (!PyTuple_GetInteger(poArgs, 1, &port)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ConnectLoginServer(szAddr, port); + return Py_BuildNone(); +} + +PyObject* netConnectUDP(PyObject* poSelf, PyObject* poArgs) +{ + char * c_szIP; + if (!PyTuple_GetString(poArgs, 0, &c_szIP)) + return Py_BuildException(); + int iPort; + if (!PyTuple_GetInteger(poArgs, 1, &iPort)) + return Py_BuildException(); + + //CPythonNetworkDatagram::Instance().SetConnection(c_szIP, iPort); + return Py_BuildNone(); +} + +PyObject* netConnectToAccountServer(PyObject* poSelf, PyObject* poArgs) +{ + char* addr; + if (!PyTuple_GetString(poArgs, 0, &addr)) + return Py_BuildException(); + + int port; + if (!PyTuple_GetInteger(poArgs, 1, &port)) + return Py_BuildException(); + + char* account_addr; + if (!PyTuple_GetString(poArgs, 2, &account_addr)) + return Py_BuildException(); + + int account_port; + if (!PyTuple_GetInteger(poArgs, 3, &account_port)) + return Py_BuildException(); + + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.Connect(addr, port, account_addr, account_port); + return Py_BuildNone(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +PyObject* netSetLoginInfo(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + char* szPwd; + if (!PyTuple_GetString(poArgs, 1, &szPwd)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkNetStream.SetLoginInfo(szName, szPwd); + rkAccountConnector.SetLoginInfo(szName, szPwd); + return Py_BuildNone(); +} + +PyObject* netSetOfflinePhase(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetOffLinePhase(); + return Py_BuildNone(); +} + +PyObject* netSendSelectEmpirePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iEmpireIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iEmpireIndex)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendSelectEmpirePacket(iEmpireIndex); + return Py_BuildNone(); +} + +PyObject* netSendLoginPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + char* szPwd; + if (!PyTuple_GetString(poArgs, 1, &szPwd)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendLoginPacket(szName, szPwd); + return Py_BuildNone(); +} + +PyObject* netSendChinaMatrixCardPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szMatrixCardString; + if (!PyTuple_GetString(poArgs, 0, &szMatrixCardString)) + return Py_BuildException(); + + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.SendChinaMatrixCardPacket(szMatrixCardString); + return Py_BuildNone(); +} + +PyObject* netSendRunupMatrixCardPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szMatrixCardString; + if (!PyTuple_GetString(poArgs, 0, &szMatrixCardString)) + return Py_BuildException(); + + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.SendRunupMatrixCardPacket(szMatrixCardString); + return Py_BuildNone(); +} + +PyObject* netSendNEWCIBNPasspodAnswerPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szMatrixCardString; + if (!PyTuple_GetString(poArgs, 0, &szMatrixCardString)) + return Py_BuildException(); + + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.SendNEWCIBNPasspodAnswerPacket(szMatrixCardString); + return Py_BuildNone(); +} + + +PyObject* netDirectEnter(PyObject* poSelf, PyObject* poArgs) +{ + int nChrSlot; + if (!PyTuple_GetInteger(poArgs, 0, &nChrSlot)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ConnectGameServer(nChrSlot); + return Py_BuildNone(); +} + +PyObject* netSendSelectCharacterPacket(PyObject* poSelf, PyObject* poArgs) +{ + int Index; + if (!PyTuple_GetInteger(poArgs, 0, &Index)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendSelectCharacterPacket((BYTE) Index); + return Py_BuildNone(); +} + +PyObject* netSendChangeNamePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BuildException(); + char* szName; + if (!PyTuple_GetString(poArgs, 1, &szName)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendChangeNamePacket((BYTE)iIndex, szName); + return Py_BuildNone(); +} + +PyObject* netEnableChatInsultFilter(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.EnableChatInsultFilter(nEnable ? true : false); + return Py_BuildNone(); +} + +PyObject* netIsChatInsultIn(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.IsChatInsultIn(szMsg)); +} + + +PyObject* netIsInsultIn(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.IsInsultIn(szMsg)); +} + +PyObject* netSendWhisperPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + char* szLine; + + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + if (!PyTuple_GetString(poArgs, 1, &szLine)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendWhisperPacket(szName, szLine); + return Py_BuildNone(); +} + +PyObject* netSendMobileMessagePacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + char* szLine; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + if (!PyTuple_GetString(poArgs, 1, &szLine)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendMobileMessagePacket(szName, szLine); + return Py_BuildNone(); +} + +PyObject* netSendCharacterPositionPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iPosition; + if (!PyTuple_GetInteger(poArgs, 0, &iPosition)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendCharacterPositionPacket((BYTE) iPosition); + return Py_BuildNone(); +} + +PyObject* netSendChatPacket(PyObject* poSelf, PyObject* poArgs) +{ + char* szLine; + if (!PyTuple_GetString(poArgs, 0, &szLine)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + { + iType = CHAT_TYPE_TALKING; + } + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendChatPacket(szLine, iType); + return Py_BuildNone(); +} + +PyObject* netSendEmoticon(PyObject* poSelf, PyObject* poArgs) +{ + int eEmoticon; + if (!PyTuple_GetInteger(poArgs, 0, &eEmoticon)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendEmoticon(eEmoticon); + return Py_BuildNone(); +} + +PyObject* netSendCreateCharacterPacket(PyObject* poSelf, PyObject* poArgs) +{ + int index; + if (!PyTuple_GetInteger(poArgs, 0, &index)) + return Py_BuildException(); + + char* name; + if (!PyTuple_GetString(poArgs, 1, &name)) + return Py_BuildException(); + + int job; + if (!PyTuple_GetInteger(poArgs, 2, &job)) + return Py_BuildException(); + + int shape; + if (!PyTuple_GetInteger(poArgs, 3, &shape)) + return Py_BuildException(); + + int stat1; + if (!PyTuple_GetInteger(poArgs, 4, &stat1)) + return Py_BuildException(); + int stat2; + if (!PyTuple_GetInteger(poArgs, 5, &stat2)) + return Py_BuildException(); + int stat3; + if (!PyTuple_GetInteger(poArgs, 6, &stat3)) + return Py_BuildException(); + int stat4; + if (!PyTuple_GetInteger(poArgs, 7, &stat4)) + return Py_BuildException(); + + if (index<0 && index>3) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendCreateCharacterPacket((BYTE) index, name, (BYTE) job, (BYTE) shape, stat1, stat2, stat3, stat4); + return Py_BuildNone(); +} + +PyObject* netSendDestroyCharacterPacket(PyObject* poSelf, PyObject* poArgs) +{ + int index; + if (!PyTuple_GetInteger(poArgs, 0, &index)) + return Py_BuildException(); + + char * szPrivateCode; + if (!PyTuple_GetString(poArgs, 1, &szPrivateCode)) + return Py_BuildException(); + + if (index<0 && index>3) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendDestroyCharacterPacket((BYTE) index, szPrivateCode); + return Py_BuildNone(); +} + +PyObject* netSendEnterGamePacket(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendEnterGame(); + return Py_BuildNone(); +} + +PyObject* netOnClickPacket(PyObject* poSelf, PyObject* poArgs) +{ + int index; + if (!PyTuple_GetInteger(poArgs, 0, &index)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendOnClickPacket(index); + + return Py_BuildNone(); +} + +PyObject* netSendItemUsePacket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemUsePacket(Cell); + return Py_BuildNone(); +} + +PyObject* netSendItemUseToItemPacket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos SourceCell; + TItemPos TargetCell; + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &SourceCell.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &TargetCell.cell)) + return Py_BuildException(); + break; + case 4: + if (!PyTuple_GetByte(poArgs, 0, &SourceCell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &SourceCell.cell)) + return Py_BuildException(); + + if (!PyTuple_GetByte(poArgs, 2, &TargetCell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 3, &TargetCell.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemUseToItemPacket(SourceCell, TargetCell); + return Py_BuildNone(); +} + +PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemDropPacket(Cell, 0); + return Py_BuildNone(); +} + +PyObject* netSendItemDropPacketNew(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + int count; + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &count)) + return Py_BuildException(); + + break; + case 3: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &count)) + return Py_BuildException(); + + break; + default: + return Py_BuildException(); + } + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemDropPacketNew(Cell, 0, count); + return Py_BuildNone(); +} + +PyObject* netSendElkDropPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iElk; + if (!PyTuple_GetInteger(poArgs, 0, &iElk)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemDropPacket(TItemPos(RESERVED_WINDOW, 0), (DWORD) iElk); + return Py_BuildNone(); +} + +PyObject* netSendGoldDropPacketNew(PyObject* poSelf, PyObject* poArgs) +{ + int iElk; + if (!PyTuple_GetInteger(poArgs, 0, &iElk)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemDropPacketNew(TItemPos (RESERVED_WINDOW, 0), (DWORD) iElk, 0); + return Py_BuildNone(); +} + +PyObject* netSendItemMovePacket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + TItemPos ChangeCell; + int num; + + switch (PyTuple_Size(poArgs)) + { + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &ChangeCell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &num)) + return Py_BuildException(); + break; + case 5: + { + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetByte(poArgs, 2, &ChangeCell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 3, &ChangeCell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 4, &num)) + return Py_BuildException(); + } + break; + default: + return Py_BuildException(); + } + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemMovePacket(Cell, ChangeCell, (BYTE) num); + return Py_BuildNone(); +} + +PyObject* netSendItemPickUpPacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemPickUpPacket(vid); + return Py_BuildNone(); +} + +PyObject* netSendGiveItemPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iTargetVID; + TItemPos Cell; + int iItemCount; + switch (PyTuple_Size(poArgs)) + { + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iTargetVID)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &iItemCount)) + return Py_BuildException(); + break; + case 4: + if (!PyTuple_GetInteger(poArgs, 0, &iTargetVID)) + return Py_BuildException(); + if (!PyTuple_GetByte(poArgs, 1, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 3, &iItemCount)) + return Py_BuildException(); + break; + default: + break; + } + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendGiveItemPacket(iTargetVID, Cell, iItemCount); + return Py_BuildNone(); +} + +PyObject* netSendShopEndPacket(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendShopEndPacket(); + return Py_BuildNone(); +} + +PyObject* netSendShopBuyPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iCount; + if (!PyTuple_GetInteger(poArgs, 0, &iCount)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendShopBuyPacket(iCount); + return Py_BuildNone(); +} + +PyObject* netSendShopSellPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotNumber)) + return Py_BuildException(); + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendShopSellPacket(iSlotNumber); + return Py_BuildNone(); +} + +PyObject* netSendShopSellPacketNew(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotNumber)) + return Py_BuildException(); + int iCount; + if (!PyTuple_GetInteger(poArgs, 1, &iCount)) + return Py_BuildException(); + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendShopSellPacketNew(iSlotNumber, iCount); + return Py_BuildNone(); +} + +PyObject* netSendExchangeStartPacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeStartPacket(vid); + return Py_BuildNone(); +} + +PyObject* netSendExchangeElkAddPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iElk; + if (!PyTuple_GetInteger(poArgs, 0, &iElk)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeElkAddPacket(iElk); + return Py_BuildNone(); +} + +PyObject* netSendExchangeItemAddPacket(PyObject* poSelf, PyObject* poArgs) +{ + BYTE bWindowType; + if (!PyTuple_GetInteger(poArgs, 0, &bWindowType)) + return Py_BuildException(); + WORD wSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &wSlotIndex)) + return Py_BuildException(); + int iDisplaySlotIndex; + if (!PyTuple_GetInteger(poArgs, 2, &iDisplaySlotIndex)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeItemAddPacket(TItemPos(bWindowType, wSlotIndex), iDisplaySlotIndex); + return Py_BuildNone(); +} + +PyObject* netSendExchangeItemDelPacket(PyObject* poSelf, PyObject* poArgs) +{ + int pos; + if (!PyTuple_GetInteger(poArgs, 0, &pos)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeItemDelPacket((BYTE) pos); + return Py_BuildNone(); +} + +PyObject* netSendExchangeAcceptPacket(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeAcceptPacket(); + return Py_BuildNone(); +} + +PyObject* netSendExchangeExitPacket(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendExchangeExitPacket(); + return Py_BuildNone(); +} + +PyObject* netExitApplication(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ExitApplication(); + return Py_BuildNone(); +} + +PyObject* netExitGame(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ExitGame(); + return Py_BuildNone(); +} + +PyObject* netLogOutGame(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.LogOutGame(); + return Py_BuildNone(); +} + +PyObject* netDisconnect(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SetOffLinePhase(); + rkNetStream.Disconnect(); + + return Py_BuildNone(); +} + +PyObject* netIsConnect(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + return Py_BuildValue("i", rkNetStream.IsOnline()); +} + +PyObject* netToggleGameDebugInfo(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.ToggleGameDebugInfo(); + return Py_BuildNone(); +} + +PyObject* netRegisterEmoticonString(PyObject* poSelf, PyObject* poArgs) +{ + char * pcEmoticonString; + if (!PyTuple_GetString(poArgs, 0, &pcEmoticonString)) + return Py_BuildException(); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.RegisterEmoticonString(pcEmoticonString); + return Py_BuildNone(); +} + +PyObject* netSendMessengerAddByVIDPacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendMessengerAddByVIDPacket(vid); + + return Py_BuildNone(); +} + +PyObject* netSendMessengerAddByNamePacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendMessengerAddByNamePacket(szName); + + return Py_BuildNone(); +} + +PyObject* netSendMessengerRemovePacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szKey; + if (!PyTuple_GetString(poArgs, 0, &szKey)) + return Py_BuildException(); + char * szName; + if (!PyTuple_GetString(poArgs, 1, &szName)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendMessengerRemovePacket(szKey, szName); + + return Py_BuildNone(); +} + +PyObject* netSendPartyInvitePacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartyInvitePacket(vid); + + return Py_BuildNone(); +} + +PyObject* netSendPartyInviteAnswerPacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + int answer; + if (!PyTuple_GetInteger(poArgs, 1, &answer)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartyInviteAnswerPacket(vid, answer); + + return Py_BuildNone(); +} + +PyObject* netSendPartyExitPacket(PyObject* poSelf, PyObject* poArgs) +{ + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + + DWORD dwVID = rPlayer.GetMainCharacterIndex(); + DWORD dwPID; + if (rPlayer.PartyMemberVIDToPID(dwVID, &dwPID)) + rns.SendPartyRemovePacket(dwPID); + + return Py_BuildNone(); +} + +PyObject* netSendPartyRemovePacket(PyObject* poSelf, PyObject* poArgs) +{ + int vid; + if (!PyTuple_GetInteger(poArgs, 0, &vid)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartyRemovePacket(vid); + + return Py_BuildNone(); +} + +PyObject* netSendPartySetStatePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + int iState; + if (!PyTuple_GetInteger(poArgs, 1, &iState)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 2, &iFlag)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartySetStatePacket(iVID, iState, iFlag); + + return Py_BuildNone(); +} + +PyObject* netSendPartyUseSkillPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSkillIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex)) + return Py_BuildException(); + int iVID; + if (!PyTuple_GetInteger(poArgs, 1, &iVID)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartyUseSkillPacket(iSkillIndex, iVID); + + return Py_BuildNone(); +} + +PyObject* netSendPartyParameterPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendPartyParameterPacket(iMode); + + return Py_BuildNone(); +} + +PyObject* netSendSafeboxSaveMoneyPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iMoney; + if (!PyTuple_GetInteger(poArgs, 0, &iMoney)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSafeBoxMoneyPacket(SAFEBOX_MONEY_STATE_SAVE, iMoney); + + return Py_BuildNone(); +} + +PyObject* netSendSafeboxWithdrawMoneyPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iMoney; + if (!PyTuple_GetInteger(poArgs, 0, &iMoney)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSafeBoxMoneyPacket(SAFEBOX_MONEY_STATE_WITHDRAW, iMoney); + + return Py_BuildNone(); +} + +PyObject* netSendSafeboxCheckinPacket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos InventoryPos; + int iSafeBoxPos; + + switch (PyTuple_Size(poArgs)) + { + case 2: + InventoryPos.window_type = INVENTORY; + if (!PyTuple_GetInteger(poArgs, 0, &InventoryPos.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &iSafeBoxPos)) + return Py_BuildException(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &InventoryPos.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &InventoryPos.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &iSafeBoxPos)) + return Py_BuildException(); + break; + + } + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSafeBoxCheckinPacket(InventoryPos, iSafeBoxPos); + + return Py_BuildNone(); +} + +PyObject* netSendSafeboxCheckoutPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSafeBoxPos; + TItemPos InventoryPos; + + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iSafeBoxPos)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &InventoryPos.cell)) + return Py_BuildException(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iSafeBoxPos)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &InventoryPos.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &InventoryPos.cell)) + return Py_BuildException(); + break; + default: + break; + } + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSafeBoxCheckoutPacket(iSafeBoxPos, InventoryPos); + + return Py_BuildNone(); +} + +PyObject* netSendSafeboxItemMovePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSourcePos; + if (!PyTuple_GetInteger(poArgs, 0, &iSourcePos)) + return Py_BuildException(); + int iTargetPos; + if (!PyTuple_GetInteger(poArgs, 1, &iTargetPos)) + return Py_BuildException(); + int iCount; + if (!PyTuple_GetInteger(poArgs, 2, &iCount)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSafeBoxItemMovePacket(iSourcePos, iTargetPos, iCount); + + return Py_BuildNone(); +} + +PyObject* netSendMallCheckoutPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iMallPos; + TItemPos InventoryPos; + + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iMallPos)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &InventoryPos.cell)) + return Py_BuildException(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iMallPos)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &InventoryPos.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &InventoryPos.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendMallCheckoutPacket(iMallPos, InventoryPos); + + return Py_BuildNone(); +} + +PyObject* netSendAnswerMakeGuildPacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendAnswerMakeGuildPacket(szName); + + return Py_BuildNone(); +} + +PyObject* netSendQuestInputStringPacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szString; + if (!PyTuple_GetString(poArgs, 0, &szString)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendQuestInputStringPacket(szString); + + return Py_BuildNone(); +} + +PyObject* netSendQuestConfirmPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iAnswer; + if (!PyTuple_GetInteger(poArgs, 0, &iAnswer)) + return Py_BuildException(); + int iPID; + if (!PyTuple_GetInteger(poArgs, 1, &iPID)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendQuestConfirmPacket(iAnswer, iPID); + + return Py_BuildNone(); +} + +PyObject* netSendGuildAddMemberPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildAddMemberPacket(iVID); + + return Py_BuildNone(); +} + +PyObject* netSendGuildRemoveMemberPacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szKey; + if (!PyTuple_GetString(poArgs, 0, &szKey)) + return Py_BuildException(); + + CPythonGuild::TGuildMemberData * pGuildMemberData; + if (!CPythonGuild::Instance().GetMemberDataPtrByName(szKey, &pGuildMemberData)) + { + TraceError("netSendGuildRemoveMemberPacket(szKey=%s) - Can't Find Guild Member\n", szKey); + return Py_BuildNone(); + } + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildRemoveMemberPacket(pGuildMemberData->dwPID); + + return Py_BuildNone(); +} + +PyObject* netSendGuildChangeGradeNamePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGradeNumber; + if (!PyTuple_GetInteger(poArgs, 0, &iGradeNumber)) + return Py_BuildException(); + char * szGradeName; + if (!PyTuple_GetString(poArgs, 1, &szGradeName)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildChangeGradeNamePacket(iGradeNumber, szGradeName); + + return Py_BuildNone(); +} + +PyObject* netSendGuildChangeGradeAuthorityPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGradeNumber; + if (!PyTuple_GetInteger(poArgs, 0, &iGradeNumber)) + return Py_BuildException(); + int iAuthority; + if (!PyTuple_GetInteger(poArgs, 1, &iAuthority)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildChangeGradeAuthorityPacket(iGradeNumber, iAuthority); + + return Py_BuildNone(); +} + +PyObject* netSendGuildOfferPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iExperience; + if (!PyTuple_GetInteger(poArgs, 0, &iExperience)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildOfferPacket(iExperience); + + return Py_BuildNone(); +} + +PyObject* netSnedGuildPostCommentPacket(PyObject* poSelf, PyObject* poArgs) +{ + char * szComment; + if (!PyTuple_GetString(poArgs, 0, &szComment)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildPostCommentPacket(szComment); + + return Py_BuildNone(); +} + +PyObject* netSnedGuildDeleteCommentPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildDeleteCommentPacket(iIndex); + + return Py_BuildNone(); +} + +PyObject* netSendGuildRefreshCommentsPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iHightestIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iHightestIndex)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildRefreshCommentsPacket(iHightestIndex); + + return Py_BuildNone(); +} + +PyObject* netSendGuildChangeMemberGradePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + int iGradeNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iGradeNumber)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildChangeMemberGradePacket(iPID, iGradeNumber); + + return Py_BuildNone(); +} + +PyObject* netSendGuildUseSkillPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSkillID; + if (!PyTuple_GetInteger(poArgs, 0, &iSkillID)) + return Py_BuildException(); + int iTargetVID; + if (!PyTuple_GetInteger(poArgs, 1, &iTargetVID)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildUseSkillPacket(iSkillID, iTargetVID); + + return Py_BuildNone(); +} + +PyObject* netSendGuildChangeMemberGeneralPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildChangeMemberGeneralPacket(iPID, iFlag); + + return Py_BuildNone(); +} + +PyObject* netSendGuildInviteAnswerPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGuildID; + if (!PyTuple_GetInteger(poArgs, 0, &iGuildID)) + return Py_BuildException(); + int iAnswer; + if (!PyTuple_GetInteger(poArgs, 1, &iAnswer)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildInviteAnswerPacket(iGuildID, iAnswer); + + return Py_BuildNone(); +} + +PyObject* netSendGuildChargeGSPPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGSP; + if (!PyTuple_GetInteger(poArgs, 0, &iGSP)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildChargeGSPPacket(iGSP); + + return Py_BuildNone(); +} + +PyObject* netSendGuildDepositMoneyPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGSP; + if (!PyTuple_GetInteger(poArgs, 0, &iGSP)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildDepositMoneyPacket(iGSP); + + return Py_BuildNone(); +} + +PyObject* netSendGuildWithdrawMoneyPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iGSP; + if (!PyTuple_GetInteger(poArgs, 0, &iGSP)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendGuildWithdrawMoneyPacket(iGSP); + + return Py_BuildNone(); +} + +PyObject* netSendRequestRefineInfoPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + +// CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); +// rns.SendRequestRefineInfoPacket(iSlotIndex); + assert(!"netSendRequestRefineInfoPacket - \xb4\xf5\xc0\xcc\xbb\xf3 \xbb\xe7\xbf\xeb\xc7\xcf\xc1\xf6 \xbe\xca\xb4\xc2 \xc7\xd4\xbc\xf6 \xc0\xd4\xb4\xcf\xb4\xd9"); // PORT: CP949 bytes of "netSendRequestRefineInfoPacket - 더이상 사용하지 않는 함수 입니다" + + return Py_BuildNone(); +} + +PyObject* netSendRefinePacket(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendRefinePacket(iSlotIndex, iType); + + return Py_BuildNone(); +} + +PyObject* netSendSelectItemPacket(PyObject* poSelf, PyObject* poArgs) +{ + int iItemPos; + if (!PyTuple_GetInteger(poArgs, 0, &iItemPos)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendSelectItemPacket(iItemPos); + + return Py_BuildNone(); +} + +PyObject* netSetPacketSequenceMode(PyObject* poSelf, PyObject* poArgs) +{ + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rns.SetPacketSequenceMode(true); + rkAccountConnector.SetPacketSequenceMode(true); + + return Py_BuildNone(); +} + +PyObject* netSetEmpireLanguageMode(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BuildException(); + + //CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + gs_bEmpireLanuageEnable = iMode; + + return Py_BuildNone(); +} + +PyObject* netSetSkillGroupFake(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BuildException(); + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.__TEST_SetSkillGroupFake(iIndex); + + return Py_BuildNone(); +} + +#include "GuildMarkUploader.h" +#include "GuildMarkDownloader.h" + +PyObject* netSendGuildSymbol(PyObject* poSelf, PyObject* poArgs) +{ + char * szIP; + if (!PyTuple_GetString(poArgs, 0, &szIP)) + return Py_BuildException(); + int iPort; + if (!PyTuple_GetInteger(poArgs, 1, &iPort)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 2, &szFileName)) + return Py_BuildException(); + int iGuildID; + if (!PyTuple_GetInteger(poArgs, 3, &iGuildID)) + return Py_BuildException(); + + CNetworkAddress kAddress; + kAddress.Set(szIP, iPort); + + UINT uiError; + + CGuildMarkUploader& rkGuildMarkUploader=CGuildMarkUploader::Instance(); + if (!rkGuildMarkUploader.ConnectToSendSymbol(kAddress, 0, 0, iGuildID, szFileName, &uiError)) + { + assert(!"Failed connecting to send symbol"); + } + + return Py_BuildNone(); +} + +PyObject* netDisconnectUploader(PyObject* poSelf, PyObject* poArgs) +{ + CGuildMarkUploader& rkGuildMarkUploader=CGuildMarkUploader::Instance(); + rkGuildMarkUploader.Disconnect(); + return Py_BuildNone(); +} + +PyObject* netRecvGuildSymbol(PyObject* poSelf, PyObject* poArgs) +{ + char * szIP; + if (!PyTuple_GetString(poArgs, 0, &szIP)) + return Py_BuildException(); + int iPort; + if (!PyTuple_GetInteger(poArgs, 1, &iPort)) + return Py_BuildException(); + int iGuildID; + if (!PyTuple_GetInteger(poArgs, 2, &iGuildID)) + return Py_BuildException(); + + CNetworkAddress kAddress; + kAddress.Set(szIP, iPort); + + std::vector kVec_dwGuildID; + kVec_dwGuildID.clear(); + kVec_dwGuildID.push_back(iGuildID); + + CGuildMarkDownloader& rkGuildMarkDownloader=CGuildMarkDownloader::Instance(); + if (!rkGuildMarkDownloader.ConnectToRecvSymbol(kAddress, 0, 0, kVec_dwGuildID)) + { + assert(!"Failed connecting to recv symbol"); + } + + return Py_BuildNone(); +} + +PyObject* netRegisterErrorLog(PyObject* poSelf, PyObject* poArgs) +{ + char * szLog; + if (!PyTuple_GetString(poArgs, 0, &szLog)) + return Py_BuildException(); + + return Py_BuildNone(); +} + +void initnet() +{ + static PyMethodDef s_methods[] = + { + { "GetBettingGuildWarValue", netGetBettingGuildWarValue, METH_VARARGS }, + { "EnableChatInsultFilter", netEnableChatInsultFilter, METH_VARARGS }, + { "SetServerInfo", netSetServerInfo, METH_VARARGS }, + { "GetServerInfo", netGetServerInfo, METH_VARARGS }, + { "PreserveServerCommand", netPreserveServerCommand, METH_VARARGS }, + { "GetPreservedServerCommand", netGetPreservedServerCommand, METH_VARARGS }, + + { "StartGame", netStartGame, METH_VARARGS }, + { "Warp", netWarp, METH_VARARGS }, + { "IsTest", netIsTest, METH_VARARGS }, + { "SetMarkServer", netSetMarkServer, METH_VARARGS }, + { "IsChatInsultIn", netIsChatInsultIn, METH_VARARGS }, + { "IsInsultIn", netIsInsultIn, METH_VARARGS }, + { "LoadInsultList", netLoadInsultList, METH_VARARGS }, + { "UploadMark", netUploadMark, METH_VARARGS }, + { "UploadSymbol", netUploadSymbol, METH_VARARGS }, + { "GetGuildID", netGetGuildID, METH_VARARGS }, + { "GetEmpireID", netGetEmpireID, METH_VARARGS }, + { "GetMainActorVID", netGetMainActorVID, METH_VARARGS }, + { "GetMainActorRace", netGetMainActorRace, METH_VARARGS }, + { "GetMainActorEmpire", netGetMainActorEmpire, METH_VARARGS }, + { "GetMainActorSkillGroup", netGetMainActorSkillGroup, METH_VARARGS }, + { "GetAccountCharacterSlotDataInteger", netGetAccountCharacterSlotDataInteger, METH_VARARGS }, + { "GetAccountCharacterSlotDataString", netGetAccountCharacterSlotDataString, METH_VARARGS }, + + // FIELD_MUSIC + { "GetFieldMusicFileName", netGetFieldMusicFileName, METH_VARARGS }, + { "GetFieldMusicVolume", netGetFieldMusicVolume, METH_VARARGS }, + // END_OF_FIELD_MUSIC + + { "ToggleGameDebugInfo", netToggleGameDebugInfo, METH_VARARGS }, + { "SetLoginInfo", netSetLoginInfo, METH_VARARGS }, + { "SetPhaseWindow", netSetPhaseWindow, METH_VARARGS }, + { "ClearPhaseWindow", netClearPhaseWindow, METH_VARARGS }, + { "SetServerCommandParserWindow", netSetServerCommandParserWindow, METH_VARARGS }, + { "SetAccountConnectorHandler", netSetAccountConnectorHandler, METH_VARARGS }, + { "SetHandler", netSetHandler, METH_VARARGS }, + { "SetTCPRecvBufferSize", netSetTCPRecvBufferSize, METH_VARARGS }, + { "SetTCPSendBufferSize", netSetTCPSendBufferSize, METH_VARARGS }, + { "SetUDPRecvBufferSize", netSetUDPRecvBufferSize, METH_VARARGS }, + { "DirectEnter", netDirectEnter, METH_VARARGS }, + + { "LogOutGame", netLogOutGame, METH_VARARGS }, + { "ExitGame", netExitGame, METH_VARARGS }, + { "ExitApplication", netExitApplication, METH_VARARGS }, + { "ConnectTCP", netConnectTCP, METH_VARARGS }, + { "ConnectUDP", netConnectUDP, METH_VARARGS }, + { "ConnectToAccountServer", netConnectToAccountServer, METH_VARARGS }, + + { "SendLoginPacket", netSendLoginPacket, METH_VARARGS }, + { "SendChinaMatrixCardPacket", netSendChinaMatrixCardPacket, METH_VARARGS }, + { "SendRunupMatrixCardPacket", netSendRunupMatrixCardPacket, METH_VARARGS }, + { "SendNEWCIBNPasspodAnswerPacket", netSendNEWCIBNPasspodAnswerPacket, METH_VARARGS }, + { "SendSelectEmpirePacket", netSendSelectEmpirePacket, METH_VARARGS }, + { "SendSelectCharacterPacket", netSendSelectCharacterPacket, METH_VARARGS }, + { "SendChangeNamePacket", netSendChangeNamePacket, METH_VARARGS }, + { "SendCreateCharacterPacket", netSendCreateCharacterPacket, METH_VARARGS }, + { "SendDestroyCharacterPacket", netSendDestroyCharacterPacket, METH_VARARGS }, + { "SendEnterGamePacket", netSendEnterGamePacket, METH_VARARGS }, + + { "SendItemUsePacket", netSendItemUsePacket, METH_VARARGS }, + { "SendItemUseToItemPacket", netSendItemUseToItemPacket, METH_VARARGS }, + { "SendItemDropPacket", netSendItemDropPacket, METH_VARARGS }, + { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, + { "SendElkDropPacket", netSendElkDropPacket, METH_VARARGS }, + { "SendGoldDropPacketNew", netSendGoldDropPacketNew, METH_VARARGS }, + { "SendItemMovePacket", netSendItemMovePacket, METH_VARARGS }, + { "SendItemPickUpPacket", netSendItemPickUpPacket, METH_VARARGS }, + { "SendGiveItemPacket", netSendGiveItemPacket, METH_VARARGS }, + + { "SetOfflinePhase", netSetOfflinePhase, METH_VARARGS }, + { "Disconnect", netDisconnect, METH_VARARGS }, + { "IsConnect", netIsConnect, METH_VARARGS }, + + { "SendChatPacket", netSendChatPacket, METH_VARARGS }, + { "SendEmoticon", netSendEmoticon, METH_VARARGS }, + { "SendWhisperPacket", netSendWhisperPacket, METH_VARARGS }, + { "SendMobileMessagePacket", netSendMobileMessagePacket, METH_VARARGS }, + + { "SendCharacterPositionPacket", netSendCharacterPositionPacket, METH_VARARGS }, + + { "SendShopEndPacket", netSendShopEndPacket, METH_VARARGS }, + { "SendShopBuyPacket", netSendShopBuyPacket, METH_VARARGS }, + { "SendShopSellPacket", netSendShopSellPacket, METH_VARARGS }, + { "SendShopSellPacketNew", netSendShopSellPacketNew, METH_VARARGS }, + + { "SendExchangeStartPacket", netSendExchangeStartPacket, METH_VARARGS }, + { "SendExchangeItemAddPacket", netSendExchangeItemAddPacket, METH_VARARGS }, + { "SendExchangeItemDelPacket", netSendExchangeItemDelPacket, METH_VARARGS }, + { "SendExchangeElkAddPacket", netSendExchangeElkAddPacket, METH_VARARGS }, + { "SendExchangeAcceptPacket", netSendExchangeAcceptPacket, METH_VARARGS }, + { "SendExchangeExitPacket", netSendExchangeExitPacket, METH_VARARGS }, + + { "SendOnClickPacket", netOnClickPacket, METH_VARARGS }, + + // Emoticon String + { "RegisterEmoticonString", netRegisterEmoticonString, METH_VARARGS }, + + // Messenger + { "SendMessengerAddByVIDPacket", netSendMessengerAddByVIDPacket, METH_VARARGS }, + { "SendMessengerAddByNamePacket", netSendMessengerAddByNamePacket, METH_VARARGS }, + { "SendMessengerRemovePacket", netSendMessengerRemovePacket, METH_VARARGS }, + + // Party + { "SendPartyInvitePacket", netSendPartyInvitePacket, METH_VARARGS }, + { "SendPartyInviteAnswerPacket", netSendPartyInviteAnswerPacket, METH_VARARGS }, + { "SendPartyExitPacket", netSendPartyExitPacket, METH_VARARGS }, + { "SendPartyRemovePacket", netSendPartyRemovePacket, METH_VARARGS }, + { "SendPartySetStatePacket", netSendPartySetStatePacket, METH_VARARGS }, + { "SendPartyUseSkillPacket", netSendPartyUseSkillPacket, METH_VARARGS }, + { "SendPartyParameterPacket", netSendPartyParameterPacket, METH_VARARGS }, + + // Safebox + { "SendSafeboxSaveMoneyPacket", netSendSafeboxSaveMoneyPacket, METH_VARARGS }, + { "SendSafeboxWithdrawMoneyPacket", netSendSafeboxWithdrawMoneyPacket, METH_VARARGS }, + { "SendSafeboxCheckinPacket", netSendSafeboxCheckinPacket, METH_VARARGS }, + { "SendSafeboxCheckoutPacket", netSendSafeboxCheckoutPacket, METH_VARARGS }, + { "SendSafeboxItemMovePacket", netSendSafeboxItemMovePacket, METH_VARARGS }, + + // Mall + { "SendMallCheckoutPacket", netSendMallCheckoutPacket, METH_VARARGS }, + + // Guild + { "SendAnswerMakeGuildPacket", netSendAnswerMakeGuildPacket, METH_VARARGS }, + { "SendQuestInputStringPacket", netSendQuestInputStringPacket, METH_VARARGS }, + { "SendQuestConfirmPacket", netSendQuestConfirmPacket, METH_VARARGS }, + { "SendGuildAddMemberPacket", netSendGuildAddMemberPacket, METH_VARARGS }, + { "SendGuildRemoveMemberPacket", netSendGuildRemoveMemberPacket, METH_VARARGS }, + { "SendGuildChangeGradeNamePacket", netSendGuildChangeGradeNamePacket, METH_VARARGS }, + { "SendGuildChangeGradeAuthorityPacket", netSendGuildChangeGradeAuthorityPacket, METH_VARARGS }, + { "SendGuildOfferPacket", netSendGuildOfferPacket, METH_VARARGS }, + { "SendGuildPostCommentPacket", netSnedGuildPostCommentPacket, METH_VARARGS }, + { "SendGuildDeleteCommentPacket", netSnedGuildDeleteCommentPacket, METH_VARARGS }, + { "SendGuildRefreshCommentsPacket", netSendGuildRefreshCommentsPacket, METH_VARARGS }, + { "SendGuildChangeMemberGradePacket", netSendGuildChangeMemberGradePacket, METH_VARARGS }, + { "SendGuildUseSkillPacket", netSendGuildUseSkillPacket, METH_VARARGS }, + { "SendGuildChangeMemberGeneralPacket", netSendGuildChangeMemberGeneralPacket, METH_VARARGS }, + { "SendGuildInviteAnswerPacket", netSendGuildInviteAnswerPacket, METH_VARARGS }, + { "SendGuildChargeGSPPacket", netSendGuildChargeGSPPacket, METH_VARARGS }, + { "SendGuildDepositMoneyPacket", netSendGuildDepositMoneyPacket, METH_VARARGS }, + { "SendGuildWithdrawMoneyPacket", netSendGuildWithdrawMoneyPacket, METH_VARARGS }, + + // Refine + { "SendRequestRefineInfoPacket", netSendRequestRefineInfoPacket, METH_VARARGS }, + { "SendRefinePacket", netSendRefinePacket, METH_VARARGS }, + { "SendSelectItemPacket", netSendSelectItemPacket, METH_VARARGS }, + + // SYSTEM + { "SetPacketSequenceMode", netSetPacketSequenceMode, METH_VARARGS }, + { "SetEmpireLanguageMode", netSetEmpireLanguageMode, METH_VARARGS }, + + // For Test + { "SetSkillGroupFake", netSetSkillGroupFake, METH_VARARGS }, + + // Guild Symbol + { "SendGuildSymbol", netSendGuildSymbol, METH_VARARGS }, + { "DisconnectUploader", netDisconnectUploader, METH_VARARGS }, + { "RecvGuildSymbol", netRecvGuildSymbol, METH_VARARGS }, + + // Log + { "RegisterErrorLog", netRegisterErrorLog, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject* poModule = Py_InitModule("net", s_methods); + + PyModule_AddIntConstant(poModule, "ERROR_NONE", CPythonNetworkStream::ERROR_NONE); + PyModule_AddIntConstant(poModule, "ERROR_CONNECT_MARK_SERVER", CPythonNetworkStream::ERROR_CONNECT_MARK_SERVER); + PyModule_AddIntConstant(poModule, "ERROR_LOAD_MARK", CPythonNetworkStream::ERROR_LOAD_MARK); + PyModule_AddIntConstant(poModule, "ERROR_MARK_WIDTH", CPythonNetworkStream::ERROR_MARK_WIDTH); + PyModule_AddIntConstant(poModule, "ERROR_MARK_HEIGHT", CPythonNetworkStream::ERROR_MARK_HEIGHT); + + // MARK_BUG_FIX + PyModule_AddIntConstant(poModule, "ERROR_MARK_UPLOAD_NEED_RECONNECT", CPythonNetworkStream::ERROR_MARK_UPLOAD_NEED_RECONNECT); + PyModule_AddIntConstant(poModule, "ERROR_MARK_CHECK_NEED_RECONNECT", CPythonNetworkStream::ERROR_MARK_CHECK_NEED_RECONNECT); + // END_OF_MARK_BUG_FIX + + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_LOGIN", CPythonNetworkStream::PHASE_WINDOW_LOGIN); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_SELECT", CPythonNetworkStream::PHASE_WINDOW_SELECT); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_CREATE", CPythonNetworkStream::PHASE_WINDOW_CREATE); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_LOAD", CPythonNetworkStream::PHASE_WINDOW_LOAD); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_GAME", CPythonNetworkStream::PHASE_WINDOW_GAME); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_EMPIRE", CPythonNetworkStream::PHASE_WINDOW_EMPIRE); + PyModule_AddIntConstant(poModule, "PHASE_WINDOW_LOGO", CPythonNetworkStream::PHASE_WINDOW_LOGO); + + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_ID", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_ID); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_NAME", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_NAME); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_RACE", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_RACE); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_LEVEL", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_LEVEL); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_STR", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_STR); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_DEX", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_DEX); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_INT", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_INT); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_HTH", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_HTH); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_PLAYTIME", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_PLAYTIME); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_FORM", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_FORM); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_ADDR", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_ADDR); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_PORT", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_PORT); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_GUILD_ID", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_GUILD_ID); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_GUILD_NAME", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_GUILD_NAME); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG); + PyModule_AddIntConstant(poModule, "ACCOUNT_CHARACTER_SLOT_HAIR", CPythonNetworkStream::ACCOUNT_CHARACTER_SLOT_HAIR); + + PyModule_AddIntConstant(poModule, "SERVER_COMMAND_LOG_OUT", CPythonNetworkStream::SERVER_COMMAND_LOG_OUT); + PyModule_AddIntConstant(poModule, "SERVER_COMMAND_RETURN_TO_SELECT_CHARACTER", CPythonNetworkStream::SERVER_COMMAND_RETURN_TO_SELECT_CHARACTER); + PyModule_AddIntConstant(poModule, "SERVER_COMMAND_QUIT", CPythonNetworkStream::SERVER_COMMAND_QUIT); + + PyModule_AddIntConstant(poModule, "EMPIRE_A", 1); + PyModule_AddIntConstant(poModule, "EMPIRE_B", 2); + PyModule_AddIntConstant(poModule, "EMPIRE_C", 3); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL", DS_SUB_HEADER_REFINE_FAIL); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE", DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL", DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY", DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL", DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL", DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL); + PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_REFINE_SUCCEED", DS_SUB_HEADER_REFINE_SUCCEED); +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseHandShake.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseHandShake.cpp new file mode 100644 index 00000000..b8d81670 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseHandShake.cpp @@ -0,0 +1,331 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "PythonApplication.h" +#include "Packet.h" +#include "../EterPack/EterPackManager.h" +#include "Hackshield.h" +#include "WiseLogicXTrap.h" + +#ifdef USE_AHNLAB_HACKSHIELD +#include METIN2HS_INCLUDE_HSHIELD +#endif + +// HandShake --------------------------------------------------------------------------- +void CPythonNetworkStream::HandShakePhase() +{ + TPacketHeader header; + + if (!CheckPacket(&header)) + return; + + switch (header) + { + case HEADER_GC_PHASE: + if (RecvPhasePacket()) + return; + break; + + case HEADER_GC_BINDUDP: + { + TPacketGCBindUDP BindUDP; + + if (!Recv(sizeof(TPacketGCBindUDP), &BindUDP)) + return; + + return; + } + break; + + case HEADER_GC_HANDSHAKE: + { + if (!Recv(sizeof(TPacketGCHandshake), &m_HandshakeData)) + return; + + Tracenf("HANDSHAKE RECV %u %d", m_HandshakeData.dwTime, m_HandshakeData.lDelta); + + ELTimer_SetServerMSec(m_HandshakeData.dwTime+ m_HandshakeData.lDelta); + + //m_dwBaseServerTime = m_HandshakeData.dwTime+ m_HandshakeData.lDelta; + //m_dwBaseClientTime = ELTimer_GetMSec(); + + m_HandshakeData.dwTime = m_HandshakeData.dwTime + m_HandshakeData.lDelta + m_HandshakeData.lDelta; + m_HandshakeData.lDelta = 0; + + Tracenf("HANDSHAKE SEND %u", m_HandshakeData.dwTime); + + if (!Send(sizeof(TPacketGCHandshake), &m_HandshakeData)) + { + assert(!"Failed Sending Handshake"); + return; + } + + CTimer::Instance().SetBaseTime(); + return; + } + break; + case HEADER_GC_PING: + RecvPingPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_KEYS: + RecvHybridCryptKeyPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_SDB: + RecvHybridCryptSDBPacket(); + return; + break; + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + case HEADER_GC_KEY_AGREEMENT: + RecvKeyAgreementPacket(); + return; + break; + + case HEADER_GC_KEY_AGREEMENT_COMPLETED: + RecvKeyAgreementCompletedPacket(); + return; + break; +#endif + } + + RecvErrorPacket(header); +} + +void CPythonNetworkStream::SetHandShakePhase() +{ + if ("HandShake"!=m_strPhase) + m_phaseLeaveFunc.Run(); + + Tracen(""); + Tracen("## Network - Hand Shake Phase ##"); + Tracen(""); + + m_strPhase = "HandShake"; + + m_dwChangingPhaseTime = ELTimer_GetMSec(); + m_phaseProcessFunc.Set(this, &CPythonNetworkStream::HandShakePhase); + m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveHandshakePhase); + + SetGameOnline(); + + if (__DirectEnterMode_IsSet()) + { + // None + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOGIN], "OnHandShake", Py_BuildValue("()")); + } +} + +bool CPythonNetworkStream::RecvHandshakePacket() +{ + TPacketGCHandshake kHandshakeData; + if (!Recv(sizeof(TPacketGCHandshake), &kHandshakeData)) + return false; + + Tracenf("HANDSHAKE RECV %u %d", kHandshakeData.dwTime, kHandshakeData.lDelta); + + m_kServerTimeSync.m_dwChangeServerTime = kHandshakeData.dwTime + kHandshakeData.lDelta; + m_kServerTimeSync.m_dwChangeClientTime = ELTimer_GetMSec(); + + kHandshakeData.dwTime = kHandshakeData.dwTime + kHandshakeData.lDelta + kHandshakeData.lDelta; + kHandshakeData.lDelta = 0; + + Tracenf("HANDSHAKE SEND %u", kHandshakeData.dwTime); + + kHandshakeData.header = HEADER_CG_TIME_SYNC; + if (!Send(sizeof(TPacketGCHandshake), &kHandshakeData)) + { + assert(!"Failed Sending Handshake"); + return false; + } + + SendSequence(); + + return true; +} + +bool CPythonNetworkStream::RecvHandshakeOKPacket() +{ + TPacketGCBlank kBlankPacket; + if (!Recv(sizeof(TPacketGCBlank), &kBlankPacket)) + return false; + + DWORD dwDelta=ELTimer_GetMSec()-m_kServerTimeSync.m_dwChangeClientTime; + ELTimer_SetServerMSec(m_kServerTimeSync.m_dwChangeServerTime+dwDelta); + + Tracenf("HANDSHAKE OK RECV %u %u", m_kServerTimeSync.m_dwChangeServerTime, dwDelta); + + return true; +} + +bool CPythonNetworkStream::RecvHybridCryptKeyPacket() +{ + int iFixedHeaderSize = TPacketGCHybridCryptKeys::GetFixedHeaderSize(); + + TDynamicSizePacketHeader header; + if( !Peek( sizeof(header), &header) ) + return false; + + TPacketGCHybridCryptKeys kPacket(header.size-iFixedHeaderSize); + + if (!Recv(iFixedHeaderSize, &kPacket)) + return false; + + if (!Recv(kPacket.iKeyStreamLen, kPacket.m_pStream)) + return false; + + CEterPackManager::Instance().RetrieveHybridCryptPackKeys( kPacket.m_pStream ); + return true; +} + +bool CPythonNetworkStream::RecvHybridCryptSDBPacket() +{ + int iFixedHeaderSize = TPacketGCHybridSDB::GetFixedHeaderSize(); + + TDynamicSizePacketHeader header; + if( !Peek( sizeof(header), &header) ) + return false; + + TPacketGCHybridSDB kPacket(header.size-iFixedHeaderSize); + + if (!Recv(iFixedHeaderSize, &kPacket)) + return false; + + if (!Recv(kPacket.iSDBStreamLen, kPacket.m_pStream)) + return false; + + CEterPackManager::Instance().RetrieveHybridCryptPackSDB( kPacket.m_pStream ); + return true; +} + + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ +bool CPythonNetworkStream::RecvKeyAgreementPacket() +{ + TPacketKeyAgreement packet; + if (!Recv(sizeof(packet), &packet)) + { + return false; + } + + Tracenf("KEY_AGREEMENT RECV %u", packet.wDataLength); + + TPacketKeyAgreement packetToSend; + size_t dataLength = TPacketKeyAgreement::MAX_DATA_LEN; + size_t agreedLength = Prepare(packetToSend.data, &dataLength); + if (agreedLength == 0) + { + // 초기화 실패 + Disconnect(); + return false; + } + assert(dataLength <= TPacketKeyAgreement::MAX_DATA_LEN); + + if (Activate(packet.wAgreedLength, packet.data, packet.wDataLength)) + { + // Key agreement 성공, 응답 전송 + packetToSend.bHeader = HEADER_CG_KEY_AGREEMENT; + packetToSend.wAgreedLength = (WORD)agreedLength; + packetToSend.wDataLength = (WORD)dataLength; + + if (!Send(sizeof(packetToSend), &packetToSend)) + { + assert(!"Failed Sending KeyAgreement"); + return false; + } + Tracenf("KEY_AGREEMENT SEND %u", packetToSend.wDataLength); + } + else + { + // 키 협상 실패 + Disconnect(); + return false; + } + return true; +} + +bool CPythonNetworkStream::RecvKeyAgreementCompletedPacket() +{ + TPacketKeyAgreementCompleted packet; + if (!Recv(sizeof(packet), &packet)) + { + return false; + } + + Tracenf("KEY_AGREEMENT_COMPLETED RECV"); + + ActivateCipher(); + + return true; +} +#endif // _IMPROVED_PACKET_ENCRYPTION_ + +bool CPythonNetworkStream::RecvHSCheckRequest() +{ + TPacketHSCheck packet; + + if (!Recv(sizeof(packet), &packet)) + { + TraceError("HShield: Recv failed"); + + return false; + } + +#if defined(USE_AHNLAB_HACKSHIELD) || defined(LOCALE_SERVICE_GLOBAL) + TPacketHSCheck pack_ret; + memset(&pack_ret, 0, sizeof(pack_ret)); + pack_ret.bHeader = HEADER_CG_HS_ACK; + +#if defined(USE_AHNLAB_HACKSHIELD) + unsigned long ret = _AhnHS_MakeResponse( packet.Req.byBuffer, packet.Req.nLength, &pack_ret.Req ); + + if (ERROR_SUCCESS != ret) + { + TraceError("HShield: _AhnHS_MakeResponse return error(%u)", ret); + + return false; + } +#endif + + if (!Send(sizeof(pack_ret), &pack_ret)) + { + TraceError("HShield: Send failed"); + + return false; + } + + return true; +#else + return false; +#endif +} + +bool CPythonNetworkStream::RecvXTrapVerifyRequest() +{ + TPacketXTrapCSVerify packet; + + if (!Recv(sizeof(packet), &packet)) + { + TraceError("XTrap: Recv failed"); + + return false; + } + + TPacketXTrapCSVerify packet_res; + packet_res.bHeader = HEADER_CG_XTRAP_ACK; + + XTrap_ValidateCheckStream( packet.bPacketData, packet_res.bPacketData ); + + if (!Send(sizeof(packet_res), &packet_res)) + { + TraceError("XTrap: Send failed"); + return false; + } + + return true; +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseLoading.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseLoading.cpp new file mode 100644 index 00000000..4a4082e8 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseLoading.cpp @@ -0,0 +1,361 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "Packet.h" +#include "PythonApplication.h" +#include "NetworkActorManager.h" + +#include "AbstractPlayer.h" + +#include "../EterPack/EterPackManager.h" + +void CPythonNetworkStream::EnableChatInsultFilter(bool isEnable) +{ + m_isEnableChatInsultFilter=isEnable; +} + +void CPythonNetworkStream::__FilterInsult(char* szLine, UINT uLineLen) +{ + m_kInsultChecker.FilterInsult(szLine, uLineLen); +} + +bool CPythonNetworkStream::IsChatInsultIn(const char* c_szMsg) +{ + if (m_isEnableChatInsultFilter) + return false; + + return IsInsultIn(c_szMsg); +} + +bool CPythonNetworkStream::IsInsultIn(const char* c_szMsg) +{ + return m_kInsultChecker.IsInsultIn(c_szMsg, strlen(c_szMsg)); +} + +bool CPythonNetworkStream::LoadInsultList(const char* c_szInsultListFileName) +{ + CMappedFile file; + const VOID* pvData; + if (!CEterPackManager::Instance().Get(file, c_szInsultListFileName, &pvData)) + return false; + + CMemoryTextFileLoader kMemTextFileLoader; + kMemTextFileLoader.Bind(file.Size(), pvData); + + m_kInsultChecker.Clear(); + for (DWORD dwLineIndex=0; dwLineIndex=4) + return false; + + CMappedFile file; + const VOID* pvData; + if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData)) + return false; + + DWORD dwEngCount=26; + DWORD dwHanCount=(0xc8-0xb0+1)*(0xfe - 0xa1+1); // PORT: `0xfe-0xa1` lexes as one pp-number (the `e-` exponent) outside MSVC + DWORD dwHanSize=dwHanCount*2; + DWORD dwFileSize=dwEngCount*2+dwHanSize; + + if (file.Size()SetMainActorVID(m_dwMainActorVID); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.SetName(MainChrPacket.szName); + rkPlayer.SetMainCharacterIndex(GetMainActorVID()); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOAD], "LoadData", Py_BuildValue("(ii)", MainChrPacket.lX, MainChrPacket.lY)); + + //Tracef(" >> RecvMainCharacter\n"); + + SendClientVersionPacket(); + return true; +} + +// SUPPORT_BGM +bool CPythonNetworkStream::RecvMainCharacter2_EMPIRE() +{ + TPacketGCMainCharacter2_EMPIRE mainChrPacket; + if (!Recv(sizeof(mainChrPacket), &mainChrPacket)) + return false; + + m_dwMainActorVID = mainChrPacket.dwVID; + m_dwMainActorRace = mainChrPacket.wRaceNum; + m_dwMainActorEmpire = mainChrPacket.byEmpire; + m_dwMainActorSkillGroup = mainChrPacket.bySkillGroup; + + m_rokNetActorMgr->SetMainActorVID(m_dwMainActorVID); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.SetName(mainChrPacket.szName); + rkPlayer.SetMainCharacterIndex(GetMainActorVID()); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOAD], "LoadData", Py_BuildValue("(ii)", mainChrPacket.lX, mainChrPacket.lY)); + + //Tracef(" >> RecvMainCharacterNew : %d\n", m_dwMainActorEmpire); + + SendClientVersionPacket(); + return true; +} + +bool CPythonNetworkStream::RecvMainCharacter3_BGM() +{ + TPacketGCMainCharacter3_BGM mainChrPacket; + if (!Recv(sizeof(mainChrPacket), &mainChrPacket)) + return false; + + m_dwMainActorVID = mainChrPacket.dwVID; + m_dwMainActorRace = mainChrPacket.wRaceNum; + m_dwMainActorEmpire = mainChrPacket.byEmpire; + m_dwMainActorSkillGroup = mainChrPacket.bySkillGroup; + + m_rokNetActorMgr->SetMainActorVID(m_dwMainActorVID); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.SetName(mainChrPacket.szUserName); + rkPlayer.SetMainCharacterIndex(GetMainActorVID()); + + __SetFieldMusicFileName(mainChrPacket.szBGMName); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOAD], "LoadData", Py_BuildValue("(ii)", mainChrPacket.lX, mainChrPacket.lY)); + + //Tracef(" >> RecvMainCharacterNew : %d\n", m_dwMainActorEmpire); + + SendClientVersionPacket(); + return true; +} + +bool CPythonNetworkStream::RecvMainCharacter4_BGM_VOL() +{ + TPacketGCMainCharacter4_BGM_VOL mainChrPacket; + if (!Recv(sizeof(mainChrPacket), &mainChrPacket)) + return false; + + m_dwMainActorVID = mainChrPacket.dwVID; + m_dwMainActorRace = mainChrPacket.wRaceNum; + m_dwMainActorEmpire = mainChrPacket.byEmpire; + m_dwMainActorSkillGroup = mainChrPacket.bySkillGroup; + + m_rokNetActorMgr->SetMainActorVID(m_dwMainActorVID); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.SetName(mainChrPacket.szUserName); + rkPlayer.SetMainCharacterIndex(GetMainActorVID()); + + __SetFieldMusicFileInfo(mainChrPacket.szBGMName, mainChrPacket.fBGMVol); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOAD], "LoadData", Py_BuildValue("(ii)", mainChrPacket.lX, mainChrPacket.lY)); + + //Tracef(" >> RecvMainCharacterNew : %d\n", m_dwMainActorEmpire); + + SendClientVersionPacket(); + return true; +} + + +static std::string gs_fieldMusic_fileName; +static float gs_fieldMusic_volume = 1.0f / 5.0f * 0.1f; + +void CPythonNetworkStream::__SetFieldMusicFileName(const char* musicName) +{ + gs_fieldMusic_fileName = musicName; +} + +void CPythonNetworkStream::__SetFieldMusicFileInfo(const char* musicName, float vol) +{ + gs_fieldMusic_fileName = musicName; + gs_fieldMusic_volume = vol; +} + +const char* CPythonNetworkStream::GetFieldMusicFileName() +{ + return gs_fieldMusic_fileName.c_str(); +} + +float CPythonNetworkStream::GetFieldMusicVolume() +{ + return gs_fieldMusic_volume; +} +// END_OF_SUPPORT_BGM + + +bool CPythonNetworkStream::__RecvPlayerPoints() +{ + TPacketGCPoints PointsPacket; + + if (!Recv(sizeof(TPacketGCPoints), &PointsPacket)) + return false; + + for (DWORD i = 0; i < POINT_MAX_NUM; ++i) + CPythonPlayer::Instance().SetStatus(i, PointsPacket.points[i]); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshStatus", Py_BuildValue("()")); + return true; +} + +void CPythonNetworkStream::StartGame() +{ + m_isStartGame=TRUE; +} + +bool CPythonNetworkStream::SendEnterGame() +{ + TPacketCGEnterFrontGame EnterFrontGamePacket; + + EnterFrontGamePacket.header = HEADER_CG_ENTERGAME; + + if (!Send(sizeof(EnterFrontGamePacket), &EnterFrontGamePacket)) + { + Tracen("Send EnterFrontGamePacket"); + return false; + } + + if (!SendSequence()) + return false; + + __SendInternalBuffer(); + return true; +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseLogin.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseLogin.cpp new file mode 100644 index 00000000..cb60288a --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseLogin.cpp @@ -0,0 +1,416 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "Packet.h" +#include "Test.h" +#include "AccountConnector.h" + +#include "Hackshield.h" +#include "WiseLogicXTrap.h" + +// Login --------------------------------------------------------------------------- +void CPythonNetworkStream::LoginPhase() +{ + TPacketHeader header; + if (!CheckPacket(&header)) + return; + + switch (header) + { + case HEADER_GC_PHASE: + if (RecvPhasePacket()) + return; + break; + + case HEADER_GC_LOGIN_SUCCESS3: + if (__RecvLoginSuccessPacket3()) + return; + break; + case HEADER_GC_LOGIN_SUCCESS4: + if (__RecvLoginSuccessPacket4()) + return; + break; + + + case HEADER_GC_LOGIN_FAILURE: + if (__RecvLoginFailurePacket()) + return; + break; + + case HEADER_GC_EMPIRE: + if (__RecvEmpirePacket()) + return; + break; + + case HEADER_GC_CHINA_MATRIX_CARD: + if (__RecvChinaMatrixCardPacket()) + return; + break; + + case HEADER_GC_RUNUP_MATRIX_QUIZ: + if (__RecvRunupMatrixQuizPacket()) + return; + break; + + case HEADER_GC_NEWCIBN_PASSPOD_REQUEST: + if (__RecvNEWCIBNPasspodRequestPacket()) + return; + break; + case HEADER_GC_NEWCIBN_PASSPOD_FAILURE: + if (__RecvNEWCIBNPasspodFailurePacket()) + return; + break; + + + case HEADER_GC_LOGIN_KEY: + if (__RecvLoginKeyPacket()) + return; + break; + + case HEADER_GC_PING: + if (RecvPingPacket()) + return; + break; + + case HEADER_GC_HYBRIDCRYPT_KEYS: + RecvHybridCryptKeyPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_SDB: + RecvHybridCryptSDBPacket(); + return; + break; + + default: + if (RecvDefaultPacket(header)) + return; + break; + } + + RecvErrorPacket(header); +} + +void CPythonNetworkStream::SetLoginPhase() +{ + const char* key = LocaleService_GetSecurityKey(); +#ifndef _IMPROVED_PACKET_ENCRYPTION_ + SetSecurityMode(true, key); +#endif + + if ("Login" != m_strPhase) + m_phaseLeaveFunc.Run(); + + Tracen(""); + Tracen("## Network - Login Phase ##"); + Tracen(""); + + m_strPhase = "Login"; + + m_phaseProcessFunc.Set(this, &CPythonNetworkStream::LoginPhase); + m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveLoginPhase); + + m_dwChangingPhaseTime = ELTimer_GetMSec(); + + if (__DirectEnterMode_IsSet()) + { + if (0 != m_dwLoginKey) + SendLoginPacketNew(m_stID.c_str(), m_stPassword.c_str()); + else + SendLoginPacket(m_stID.c_str(), m_stPassword.c_str()); + + // 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경 + ClearLoginInfo(); + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.ClearLoginInfo(); + } + else + { + if (0 != m_dwLoginKey) + SendLoginPacketNew(m_stID.c_str(), m_stPassword.c_str()); + else + SendLoginPacket(m_stID.c_str(), m_stPassword.c_str()); + + // 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경 + ClearLoginInfo(); + CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); + rkAccountConnector.ClearLoginInfo(); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOGIN], "OnLoginStart", Py_BuildValue("()")); + + __ClearSelectCharacterData(); + } +} + +bool CPythonNetworkStream::__RecvEmpirePacket() +{ + TPacketGCEmpire kPacketEmpire; + if (!Recv(sizeof(kPacketEmpire), &kPacketEmpire)) + return false; + + m_dwEmpireID=kPacketEmpire.bEmpire; + return true; +} + +bool CPythonNetworkStream::__RecvLoginSuccessPacket3() +{ + TPacketGCLoginSuccess3 kPacketLoginSuccess; + + if (!Recv(sizeof(kPacketLoginSuccess), &kPacketLoginSuccess)) + return false; + + for (int i = 0; i> ((4 - i - 1) * 8)) & 0x000000FF) +#define COL(cols, i) ((cols >> ((4 - i - 1) * 8)) & 0x000000FF) + +bool CPythonNetworkStream::__RecvChinaMatrixCardPacket() +{ + TPacketGCChinaMatrixCard kMatrixCardPacket; + if (!Recv(sizeof(TPacketGCChinaMatrixCard), &kMatrixCardPacket)) + return false; + + PyObject * pyValue = Py_BuildValue("(iiiiiiii)", ROW(kMatrixCardPacket.dwRows, 0), + ROW(kMatrixCardPacket.dwRows, 1), + ROW(kMatrixCardPacket.dwRows, 2), + ROW(kMatrixCardPacket.dwRows, 3), + COL(kMatrixCardPacket.dwCols, 0), + COL(kMatrixCardPacket.dwCols, 1), + COL(kMatrixCardPacket.dwCols, 2), + COL(kMatrixCardPacket.dwCols, 3)); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_LOGIN], "OnMatrixCard", pyValue); + return true; +} + +bool CPythonNetworkStream::__RecvLoginKeyPacket() +{ + TPacketGCLoginKey kLoginKeyPacket; + if (!Recv(sizeof(TPacketGCLoginKey), &kLoginKeyPacket)) + return false; + + m_dwLoginKey = kLoginKeyPacket.dwLoginKey; + m_isWaitLoginKey = FALSE; + + return true; +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseOffline.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseOffline.cpp new file mode 100644 index 00000000..754fce8d --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseOffline.cpp @@ -0,0 +1,22 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "PythonApplication.h" +#include "Packet.h" + +void CPythonNetworkStream::OffLinePhase() +{ + TPacketHeader header; + + if (!CheckPacket(&header)) + return; + + switch (header) + { + case HEADER_GC_PHASE: + if (RecvPhasePacket()) + return; + break; + } + + RecvErrorPacket(header); +} \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseSelect.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseSelect.cpp new file mode 100644 index 00000000..157466dc --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseSelect.cpp @@ -0,0 +1,308 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "Packet.h" + +extern DWORD g_adwEncryptKey[4]; +extern DWORD g_adwDecryptKey[4]; + +// Select Character --------------------------------------------------------------------------- +void CPythonNetworkStream::SetSelectPhase() +{ + if ("Select" != m_strPhase) + m_phaseLeaveFunc.Run(); + + Tracen(""); + Tracen("## Network - Select Phase ##"); + Tracen(""); + + m_strPhase = "Select"; + +#ifndef _IMPROVED_PACKET_ENCRYPTION_ + SetSecurityMode(true, (const char *) g_adwEncryptKey, (const char *) g_adwDecryptKey); +#endif + + m_dwChangingPhaseTime = ELTimer_GetMSec(); + m_phaseProcessFunc.Set(this, &CPythonNetworkStream::SelectPhase); + m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveSelectPhase); + + if (__DirectEnterMode_IsSet()) + { + PyCallClassMemberFunc(m_poHandler, "SetLoadingPhase", Py_BuildValue("()")); + } + else + { + if (IsSelectedEmpire()) + PyCallClassMemberFunc(m_poHandler, "SetSelectCharacterPhase", Py_BuildValue("()")); + else + PyCallClassMemberFunc(m_poHandler, "SetSelectEmpirePhase", Py_BuildValue("()")); + } +} + +void CPythonNetworkStream::SelectPhase() +{ + TPacketHeader header; + + if (!CheckPacket(&header)) + return; + + switch (header) + { + case HEADER_GC_PHASE: + if (RecvPhasePacket()) + return; + break; + + case HEADER_GC_EMPIRE: + if (__RecvEmpirePacket()) + return; + break; + + case HEADER_GC_LOGIN_SUCCESS3: + if (__RecvLoginSuccessPacket3()) + return; + break; + + case HEADER_GC_LOGIN_SUCCESS4: + if (__RecvLoginSuccessPacket4()) + return; + break; + + + case HEADER_GC_PLAYER_CREATE_SUCCESS: + if (__RecvPlayerCreateSuccessPacket()) + return; + break; + + case HEADER_GC_PLAYER_CREATE_FAILURE: + if (__RecvPlayerCreateFailurePacket()) + return; + break; + + case HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID: + if (__RecvPlayerDestroyFailurePacket()) + return; + break; + + case HEADER_GC_PLAYER_DELETE_SUCCESS: + if (__RecvPlayerDestroySuccessPacket()) + return; + break; + + case HEADER_GC_CHANGE_NAME: + if (__RecvChangeName()) + return; + break; + + case HEADER_GC_HANDSHAKE: + RecvHandshakePacket(); + return; + break; + + case HEADER_GC_HANDSHAKE_OK: + RecvHandshakeOKPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_KEYS: + RecvHybridCryptKeyPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_SDB: + RecvHybridCryptSDBPacket(); + return; + break; + + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + case HEADER_GC_KEY_AGREEMENT: + RecvKeyAgreementPacket(); + return; + break; + + case HEADER_GC_KEY_AGREEMENT_COMPLETED: + RecvKeyAgreementCompletedPacket(); + return; + break; +#endif + + case HEADER_GC_PLAYER_POINT_CHANGE: + TPacketGCPointChange PointChange; + Recv(sizeof(TPacketGCPointChange), &PointChange); + return; + break; + + /////////////////////////////////////////////////////////////////////////////////////////// + case HEADER_GC_PING: + if (RecvPingPacket()) + return; + break; + } + + RecvErrorPacket(header); +} + +bool CPythonNetworkStream::SendSelectEmpirePacket(DWORD dwEmpireID) +{ + TPacketCGEmpire kPacketEmpire; + kPacketEmpire.bHeader=HEADER_CG_EMPIRE; + kPacketEmpire.bEmpire=dwEmpireID; + + if (!Send(sizeof(kPacketEmpire), &kPacketEmpire)) + { + Tracen("SendSelectEmpirePacket - Error"); + return false; + } + + SetEmpireID(dwEmpireID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendSelectCharacterPacket(BYTE Index) +{ + TPacketCGSelectCharacter SelectCharacterPacket; + + SelectCharacterPacket.header = HEADER_CG_PLAYER_SELECT; + SelectCharacterPacket.player_index = Index; + + if (!Send(sizeof(TPacketCGSelectCharacter), &SelectCharacterPacket)) + { + Tracen("SendSelectCharacterPacket - Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendDestroyCharacterPacket(BYTE index, const char * szPrivateCode) +{ + TPacketCGDestroyCharacter DestroyCharacterPacket; + + DestroyCharacterPacket.header = HEADER_CG_PLAYER_DESTROY; + DestroyCharacterPacket.index = index; + strncpy(DestroyCharacterPacket.szPrivateCode, szPrivateCode, PRIVATE_CODE_LENGTH-1); + + if (!Send(sizeof(TPacketCGDestroyCharacter), &DestroyCharacterPacket)) + { + Tracen("SendDestroyCharacterPacket"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape, BYTE byCON, BYTE byINT, BYTE bySTR, BYTE byDEX) +{ + TPacketCGCreateCharacter createCharacterPacket; + + createCharacterPacket.header = HEADER_CG_PLAYER_CREATE; + createCharacterPacket.index = index; + strncpy(createCharacterPacket.name, name, CHARACTER_NAME_MAX_LEN); + createCharacterPacket.job = job; + createCharacterPacket.shape = shape; + createCharacterPacket.CON = byCON; + createCharacterPacket.INT = byINT; + createCharacterPacket.STR = bySTR; + createCharacterPacket.DEX = byDEX; + + if (!Send(sizeof(TPacketCGCreateCharacter), &createCharacterPacket)) + { + Tracen("Failed to SendCreateCharacterPacket"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendChangeNamePacket(BYTE index, const char *name) +{ + TPacketCGChangeName ChangeNamePacket; + ChangeNamePacket.header = HEADER_CG_CHANGE_NAME; + ChangeNamePacket.index = index; + strncpy(ChangeNamePacket.name, name, CHARACTER_NAME_MAX_LEN); + + if (!Send(sizeof(TPacketCGChangeName), &ChangeNamePacket)) + { + Tracen("Failed to SendChangeNamePacket"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::__RecvPlayerCreateSuccessPacket() +{ + TPacketGCPlayerCreateSuccess kCreateSuccessPacket; + + if (!Recv(sizeof(kCreateSuccessPacket), &kCreateSuccessPacket)) + return false; + + if (kCreateSuccessPacket.bAccountCharacterSlot>=PLAYER_PER_ACCOUNT4) + { + TraceError("CPythonNetworkStream::RecvPlayerCreateSuccessPacket - OUT OF RANGE SLOT(%d) > PLATER_PER_ACCOUNT(%d)", + kCreateSuccessPacket.bAccountCharacterSlot, PLAYER_PER_ACCOUNT4); + return true; + } + + m_akSimplePlayerInfo[kCreateSuccessPacket.bAccountCharacterSlot]=kCreateSuccessPacket.kSimplePlayerInfomation; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_CREATE], "OnCreateSuccess", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::__RecvPlayerCreateFailurePacket() +{ + TPacketGCCreateFailure packet; + + if (!Recv(sizeof(TPacketGCCreateFailure), &packet)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_CREATE], "OnCreateFailure", Py_BuildValue("(i)", packet.bType)); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnCreateFailure", Py_BuildValue("(i)", packet.bType)); + return true; +} + +bool CPythonNetworkStream::__RecvPlayerDestroySuccessPacket() +{ + TPacketGCDestroyCharacterSuccess packet; + if (!Recv(sizeof(TPacketGCDestroyCharacterSuccess), &packet)) + return false; + + memset(&m_akSimplePlayerInfo[packet.account_index], 0, sizeof(m_akSimplePlayerInfo[packet.account_index])); + m_adwGuildID[packet.account_index] = 0; + m_astrGuildName[packet.account_index] = ""; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnDeleteSuccess", Py_BuildValue("(i)", packet.account_index)); + return true; +} + +bool CPythonNetworkStream::__RecvPlayerDestroyFailurePacket() +{ + TPacketGCBlank packet_blank; + if (!Recv(sizeof(TPacketGCBlank), &packet_blank)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnDeleteFailure", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::__RecvChangeName() +{ + TPacketGCChangeName ChangeNamePacket; + if (!Recv(sizeof(TPacketGCChangeName), &ChangeNamePacket)) + return false; + + for (int i = 0; i < PLAYER_PER_ACCOUNT4; ++i) + { + if (ChangeNamePacket.pid == m_akSimplePlayerInfo[i].dwID) + { + m_akSimplePlayerInfo[i].bChangeName = FALSE; + strncpy(m_akSimplePlayerInfo[i].szName, ChangeNamePacket.name, CHARACTER_NAME_MAX_LEN); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnChangeName", Py_BuildValue("(is)", i, ChangeNamePacket.name)); + return true; + } + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnCreateFailure", Py_BuildValue("(i)", 100)); + return true; +} diff --git a/extension/src/port/UserInterface/PythonPackModule.cpp b/extension/src/port/UserInterface/PythonPackModule.cpp index 6e98f309..19f6c1f2 100644 --- a/extension/src/port/UserInterface/PythonPackModule.cpp +++ b/extension/src/port/UserInterface/PythonPackModule.cpp @@ -6,10 +6,6 @@ DWORD g_adwEncryptKey[4]; DWORD g_adwDecryptKey[4]; -// PORT: the login cipher's key builder happens to live in this unit, but it is CAccountConnector's — -// AccountConnector.h and the class come with the login slice (docs/PORT-PLAN.md 批次 2V1). Kept verbatim -// and compiled out until then; the two keys above stay, they are what the network stream reads. -#if 0 #include "AccountConnector.h" inline const BYTE* GetKey_20050304Myevan() @@ -40,7 +36,6 @@ void CAccountConnector::__BuildClientKey_20050304Myevan() tea_encrypt((DWORD *) g_adwDecryptKey, (const DWORD *) g_adwEncryptKey, (const DWORD *) (c_pszKey+37), 16); // TEA_Encrypt((DWORD *) g_adwDecryptKey, (const DWORD *) g_adwEncryptKey, (const DWORD *) (c_pszKey+37), 16); } -#endif // END_OF_CHINA_CRYPT_KEY PyObject * packExist(PyObject * poSelf, PyObject * poArgs) diff --git a/extension/src/port/UserInterface/StdAfx.h b/extension/src/port/UserInterface/StdAfx.h index 42c33686..8d0707d6 100644 --- a/extension/src/port/UserInterface/StdAfx.h +++ b/extension/src/port/UserInterface/StdAfx.h @@ -44,3 +44,4 @@ enum // Listed here as 40250 lists them; only the ported ones are defined. void initpack(); void initapp(); +void initnet(); diff --git a/extension/src/port/UserInterface/Test.h b/extension/src/port/UserInterface/Test.h new file mode 100644 index 00000000..ab6c8c40 --- /dev/null +++ b/extension/src/port/UserInterface/Test.h @@ -0,0 +1,3 @@ +#pragma once + +extern bool __IS_TEST_SERVER_MODE__; diff --git a/extension/src/port/UserInterface/WiseLogicXTrap.h b/extension/src/port/UserInterface/WiseLogicXTrap.h new file mode 100644 index 00000000..e699f232 --- /dev/null +++ b/extension/src/port/UserInterface/WiseLogicXTrap.h @@ -0,0 +1,8 @@ +#pragma once + +bool XTrap_Init(); +bool XTrap_CheckInit(); +void XTrap_PollEvent(); +void XTrap_ValidateCheckStream( LPVOID PacketBufferIn, LPVOID PacketBufferOut ); +void XTrap_SetUserInfo(LPCSTR szUserID, LPCSTR szServerName, LPCSTR szCharacterName, LPCSTR szCharacterClass, SOCKET hSocket); + diff --git a/extension/src/port/common/shim/sdk/Python-2.7/grammar.h b/extension/src/port/common/shim/sdk/Python-2.7/grammar.h index 6e1da91c..f42a0f99 100644 --- a/extension/src/port/common/shim/sdk/Python-2.7/grammar.h +++ b/extension/src/port/common/shim/sdk/Python-2.7/grammar.h @@ -7,3 +7,8 @@ // alone under the port header gate. #include #include +// CPython's bitset.h (pulled in by grammar.h) does `#define BYTE char`; the copy under 40250's +// extern/include/Python-2.7 has that line removed, so BYTE stays the Win32 unsigned char in every +// file that includes ScriptLib/StdAfx.h. bitset.h's own macros only use sizeof(BYTE), which is 1 +// either way. +#undef BYTE diff --git a/extension/src/port/common/shim/win32/windows.h b/extension/src/port/common/shim/win32/windows.h index 3371e7ff..8db64a15 100644 --- a/extension/src/port/common/shim/win32/windows.h +++ b/extension/src/port/common/shim/win32/windows.h @@ -28,3 +28,6 @@ #define VK_HOME 0x24 #define VK_END 0x23 #define VK_DELETE 0x2E + +// winuser.h functions the platform layer implements (platform/ScriptLib/PythonBoot.cpp). +void PostQuitMessage(int nExitCode); diff --git a/extension/tests/port_packet_test.cpp b/extension/tests/port_packet_test.cpp new file mode 100644 index 00000000..96bce9bc --- /dev/null +++ b/extension/tests/port_packet_test.cpp @@ -0,0 +1,77 @@ +// 批次 2V1: the ported 40250 UserInterface/Packet.h against the classic wire layouts in net/classic/wire_classic.h, +// which the mtnet backend checked 1:1 against the 40250 server on 192.168.21.203. Win32 `long` is 32 bits and +// Packet.h now says LONG; a 64-bit long, or a missing #pragma pack(1), shows up here as a size mismatch. +// Covers the packets the login/select/loading phases send and read. The two headers cannot share a translation unit +// (Packet.h's macros such as SKILL_MAX_NUM collide with wire_classic.h's constants), so the wire sizes come from +// port_packet_test_wire.cpp. +#include "UserInterface/StdAfx.h" +#include "UserInterface/Packet.h" + +#include +#include + +struct WireSize { const char* name; std::size_t size; }; +extern const WireSize kWireSizes[]; + +static const WireSize kPortSizes[] = { + // HandShake phase + {"TPacketGCHandshake", sizeof(TPacketGCHandshake)}, + {"TPacketGCPhase", sizeof(TPacketGCPhase)}, + {"TPacketGCBindUDP", sizeof(TPacketGCBindUDP)}, + {"TPacketKeyAgreement", sizeof(TPacketKeyAgreement)}, + {"TPacketKeyAgreementCompleted", sizeof(TPacketKeyAgreementCompleted)}, + {"TPacketGCPing", sizeof(TPacketGCPing)}, + {"TPacketCGPong", sizeof(TPacketCGPong)}, + // Login phase (and the auth server, CAccountConnector) + {"TPacketCGLogin", sizeof(TPacketCGLogin)}, + {"TPacketCGLogin2", sizeof(TPacketCGLogin2)}, + {"TPacketCGLogin3", sizeof(TPacketCGLogin3)}, + {"TPacketGCLoginKey", sizeof(TPacketGCLoginKey)}, + {"TPacketGCAuthSuccess", sizeof(TPacketGCAuthSuccess)}, + {"TSimplePlayerInformation", sizeof(TSimplePlayerInformation)}, + {"TPacketGCLoginSuccess3", sizeof(TPacketGCLoginSuccess3)}, + {"TPacketGCLoginSuccess4", sizeof(TPacketGCLoginSuccess4)}, + {"TPacketGCLoginFailure", sizeof(TPacketGCLoginFailure)}, + {"TPacketGCEmpire", sizeof(TPacketGCEmpire)}, + {"TPacketCGEmpire", sizeof(TPacketCGEmpire)}, + // Select phase + {"TPacketCGSelectCharacter", sizeof(TPacketCGSelectCharacter)}, + {"TPacketCGCreateCharacter", sizeof(TPacketCGCreateCharacter)}, + {"TPacketCGDestroyCharacter", sizeof(TPacketCGDestroyCharacter)}, + {"TPacketCGChangeName", sizeof(TPacketCGChangeName)}, + {"TPacketGCPlayerCreateSuccess", sizeof(TPacketGCPlayerCreateSuccess)}, + {"TPacketGCCreateFailure", sizeof(TPacketGCCreateFailure)}, + {"TPacketGCDestroyCharacterSuccess", sizeof(TPacketGCDestroyCharacterSuccess)}, + {"TPacketGCChangeName", sizeof(TPacketGCChangeName)}, + // Loading phase + {"TPacketGCMainCharacter", sizeof(TPacketGCMainCharacter)}, + {"TPacketGCMainCharacter2_EMPIRE", sizeof(TPacketGCMainCharacter2_EMPIRE)}, + {"TPacketGCMainCharacter3_BGM", sizeof(TPacketGCMainCharacter3_BGM)}, + {"TPacketGCMainCharacter4_BGM_VOL", sizeof(TPacketGCMainCharacter4_BGM_VOL)}, + {"TPacketGCPoints", sizeof(TPacketGCPoints)}, + {"TPacketGCPointChange", sizeof(TPacketGCPointChange)}, + {"TPacketGCItemSet2", sizeof(TPacketGCItemSet2)}, + {"TPacketGCQuickSlotAdd", sizeof(TPacketGCQuickSlotAdd)}, + {"TPacketGCCharacterUpdate", sizeof(TPacketGCCharacterUpdate)}, + {"TPacketCGClientVersion2", sizeof(TPacketCGClientVersion2)}, + {"TPacketCGEnterFrontGame", sizeof(TPacketCGEnterFrontGame)}, + {nullptr, 0}, +}; + +int main() +{ + int failures = 0; + for (int i = 0; kPortSizes[i].name; ++i) + { + if (kPortSizes[i].size != kWireSizes[i].size) + { + std::fprintf(stderr, "%s is %zu bytes, %s is %zu\n", kPortSizes[i].name, kPortSizes[i].size, + kWireSizes[i].name, kWireSizes[i].size); + ++failures; + } + } + if (failures) + return 1; + std::printf("port_packet_test: ok\n"); + return 0; +} diff --git a/extension/tests/port_packet_test_wire.cpp b/extension/tests/port_packet_test_wire.cpp new file mode 100644 index 00000000..2e1d7c63 --- /dev/null +++ b/extension/tests/port_packet_test_wire.cpp @@ -0,0 +1,49 @@ +// The classic wire sizes for port_packet_test.cpp, in the same order as its kPortSizes. +#include "../src/net/classic/wire_classic.h" + +#include + +struct WireSize { const char* name; std::size_t size; }; + +namespace w = mtnet::classic; + +extern const WireSize kWireSizes[] = { + {"Handshake", sizeof(w::Handshake)}, + {"Phase_", sizeof(w::Phase_)}, + {"BindUDP", sizeof(w::BindUDP)}, + {"KeyAgreement", sizeof(w::KeyAgreement)}, + {"KeyAgreementCompleted", sizeof(w::KeyAgreementCompleted)}, + {"Blank", sizeof(w::Blank)}, + {"Blank", sizeof(w::Blank)}, + {"CGLogin", sizeof(w::CGLogin)}, + {"CGLogin2", sizeof(w::CGLogin2)}, + {"CGLogin3", sizeof(w::CGLogin3)}, + {"GCLoginKey", sizeof(w::GCLoginKey)}, + {"GCAuthSuccess", sizeof(w::GCAuthSuccess)}, + {"SimplePlayer", sizeof(w::SimplePlayer)}, + {"GCLoginSuccess3", sizeof(w::GCLoginSuccess3)}, + {"GCLoginSuccess", sizeof(w::GCLoginSuccess)}, + {"GCLoginFailure", sizeof(w::GCLoginFailure)}, + {"GCEmpire", sizeof(w::GCEmpire)}, + {"CGEmpire", sizeof(w::CGEmpire)}, + {"CGPlayerSelect", sizeof(w::CGPlayerSelect)}, + {"CGPlayerCreate", sizeof(w::CGPlayerCreate)}, + {"CGPlayerDelete", sizeof(w::CGPlayerDelete)}, + {"CGChangeName", sizeof(w::CGChangeName)}, + {"GCPlayerCreateSuccess", sizeof(w::GCPlayerCreateSuccess)}, + {"GCPlayerCreateFailure", sizeof(w::GCPlayerCreateFailure)}, + {"GCPlayerDeleteSuccess", sizeof(w::GCPlayerDeleteSuccess)}, + {"GCChangeName", sizeof(w::GCChangeName)}, + {"GCMainCharacterOld", sizeof(w::GCMainCharacterOld)}, + {"GCMainCharacter", sizeof(w::GCMainCharacter)}, + {"GCMainCharacter3BGM", sizeof(w::GCMainCharacter3BGM)}, + {"GCMainCharacter4BGM", sizeof(w::GCMainCharacter4BGM)}, + {"GCPoints", sizeof(w::GCPoints)}, + {"GCPointChange", sizeof(w::GCPointChange)}, + {"GCItemSet", sizeof(w::GCItemSet)}, + {"GCQuickSlotAdd", sizeof(w::GCQuickSlotAdd)}, + {"GCCharacterUpdate", sizeof(w::GCCharacterUpdate)}, + {"CGClientVersion2", sizeof(w::CGClientVersion2)}, + {"CGEnterGame", sizeof(w::CGEnterGame)}, + {nullptr, 0}, +}; diff --git a/project/python_host_check.gd b/project/python_host_check.gd index 33f76501..19a886d7 100644 --- a/project/python_host_check.gd +++ b/project/python_host_check.gd @@ -55,8 +55,10 @@ func run() -> int: print("system.py -> %s" % err) _ck(err.contains(EXPECTED_STOP), "system.py 进入 prototype.RunApp(),Create() 报告待实现的图形设备") - _ck(Metin2PythonHost.run_line("import net, player, item; assert net.__port_stub__ == 1 and player.__port_stub__ == 1 and item.__port_stub__ == 1") == "", + _ck(Metin2PythonHost.run_line("import player, item; assert player.__port_stub__ == 1 and item.__port_stub__ == 1") == "", "2V0 玩法模块桩已注册,调用会记录到 stderr") + _ck(Metin2PythonHost.run_line("import net; assert not hasattr(net, '__port_stub__') and net.PHASE_WINDOW_SELECT == 2 and not net.IsConnect()") == "", + "net 是移植的 40250 PythonNetworkStreamModule(2V1)") # 真正从 Godot 入口转发事件给 40250 的 CWindowManager,再由窗口树回调 Python。 Metin2PythonHost.set_ui_size(800, 600) var probe_source := """ diff --git a/script/port_gate.sh b/script/port_gate.sh index 36fa52e4..7ac26005 100755 --- a/script/port_gate.sh +++ b/script/port_gate.sh @@ -33,7 +33,8 @@ for p in "${PLATFORMS[@]}"; do BUILD_EXTRA=() case "$p" in macos) - BUILD_EXTRA=(--target port_common_test --target port_eterpack_test) + # Every port test target, so the ctest run below never meets a test the gate did not build. + BUILD_EXTRA=(--target all) run macos "$OUT/macos" "${PORT_ONLY[@]}" -DBUILD_TESTING=ON last=$((${#RESULTS[@]} - 1)) if [[ "${RESULTS[$last]}" == *PASS ]] && ! ctest --test-dir "$OUT/macos" -R '^port\.' --output-on-failure >>"$OUT/macos.log" 2>&1; then