跳到正文
本頁目錄

工作原理

部分機制
傳輸基於 Winsock 的 RFC 6455,SHA-1 來自 CNG;文本 = JSON,二進制 = tap;每條連接一個線程(協議)
按鍵、文字、指針入隊 + PostMessage(hwnd, WM_LHI);子類化的 WndProc(遊戲線程)設置虛擬狀態,用 WM_KEYDOWN/WM_KEYUP、WM_CHAR、WM_MOUSEMOVE + 虛擬光標(鉤住的 GetCursorPos)調用遊戲的 WndProc,按真實輸入處理(MainGameCore::WndProc_PC::onKeyboardAction → HIDControllerGameCoreDesktop::onKeyDown)。派發後回覆
按鈕、滾輪、視角GameInput v2(GameInputRedist.dll)忽略窗口消息:鉤住 IGameInputReading::GetMouseState、GetKeyCount、GetKeyState;GetCurrentReading 在設備上報前取得虛擬讀數
不搶前臺launch:CreateProcessW + SW_SHOWNOACTIVATE;鉤住 ShowWindow、SetWindowPos、SetActiveWindow、BringWindowToTop、SetForegroundWindow;Z 序最底;吞掉 WM_ACTIVATEAPP(0)/WM_KILLFOCUS/WM_ACTIVATE(inactive)(不暫停)。鉤子在 load() 中安裝(窗口在 enable() 之前已存在)。偽造的“獲得焦點”跳過默認的 WM_ACTIVATE(鉤住的 DefWindowProcW)。BEDD_RETURN_FOCUS:遊戲啟動時若被激活,要重新聚焦的窗口
屏蔽真實輸入吞掉 WM_KEY*/WM_MOUSE*/WM_INPUT/WM_POINTER*;虛擬化 ClipCursor(空操作)、SetCursorPos、GetCursorPos、GetPhysicalCursorPos、GetAsyncKeyState、GetKeyState、GetKeyboardState、GetForegroundWindow/GetActiveWindow/GetFocus(遊戲窗口)、GetRawInputData/GetRawInputBuffer(丟棄)
截圖PrintWindow(PW_RENDERFULLCONTENT)(被遮擋/在屏幕外也可),WIC
克隆從不寫入原實例(LeviLauncher.exe instance list --json)。%LOCALAPPDATA%\BeDD\instances\<gameVersion>-<slot>:硬鏈接(跨卷時複製),獨立的 mods\、世界、選項;改動的文件整體替換,不原地編輯。加載器從 exe 所在文件夾解析(保持 exe 名):數據在其 Minecraft Bedrock 中
管理器BeDD.exe,每個登錄會話一個:DWM 縮略圖;launch 在調用方進程樹之外啟動它;通過發現文件附加(manager);關閉它會發送 close。遊戲窗口:從創建起就是屏幕外的工具窗口(鉤住 CreateWindowExW:enable() 前無消息泵),丟棄 SetWindowPos 移動,由監視器復位

遊戲內的 bedboo 操作

操作實現
world界面字段每幀更新(ClientInstance::$update 後置鉤子:暫停的世界不 tick),玩家每 tick 更新
look每 tick 調用 LocalPlayer::localPlayerTurn;按 1:1 度轉動,軸交換({-dPitch, dYaw});下一 tick 到位
input後置鉤子 ClientInputUpdateSystem::extractRawHIDInput(RawMoveInputComponent::mRawInput/mRawMove)和 inputHandlerUpdatePlayerState(前後兩次寫 MoveInputComponent::mInputState/mRawInputState;MoveInputState SneakDown=0、JumpDown=7、SprintDown=8、Up..Right=13..16、邊沿 21..26;mAnalogMoveVector)。覆蓋結束後清一次標誌(鍵盤只在事件時寫入)。tick = inputHandlerUpdatePlayerState 調用次數
slot、action、button客戶端 tick 監聽器;perspective:ClientInputCallbacks::handleTogglePerspectiveButtonPress(自 1.26.60 起唯一導出的 handle*ButtonPress)
send、stack客戶端線程:MinecraftPackets::createPacket + Packet::read(客戶端 NetworkSystem 的 ReflectionCtx),sendNetworkPacket
stack繞過 ItemStackNetManagerClient(全為 MCNAPI;依據界面控制器預測)。在鉤住的 ClientNetworkHandler::handle(ItemStackResponsePacket) 上重新同步
joinClientInstance::connectToThirdPartyServer
timescale服務端經 ServerInstance::queueForServerThread,客戶端在 ClientInstance::update 之後;寫 Timer::mTimeScale(setSimTimeScale 會相乘,上限 10);暫停用 Minecraft::setSimTimePause。服務端速度:鉤住 ClientNetworkHandler::handle(LevelEventPacket),在遊戲處理之後,僅當尚未達到時
ui、oreuiUI 樹