From 10ee4c00aefaff663b534239ea839378b1378d6a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 18 Dec 2024 12:53:27 +0300 Subject: [PATCH] feat: initial support for websocket (direct connection) servers. mcraft-fun-mineflayer plugin --- src/connect.ts | 1 + src/index.ts | 27 ++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/connect.ts b/src/connect.ts index 09ee15426..b7023880f 100644 --- a/src/connect.ts +++ b/src/connect.ts @@ -21,6 +21,7 @@ export type ConnectOptions = { /** If true, will show a UI to authenticate with a new account */ authenticatedAccount?: AuthenticatedAccount | true peerOptions?: any + viewerWsConnect?: string } export const downloadNeededDataOnConnect = async (version: string) => { diff --git a/src/index.ts b/src/index.ts index a1fa8e3b0..0e481cd8b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -103,6 +103,7 @@ import { mainMenuState } from './react/MainMenuRenderApp' import { ItemsRenderer } from 'mc-assets/dist/itemsRenderer' import './mobileShim' import { parseFormattedMessagePacket } from './botUtils' +import { getWsProtocolStream } from './viewerConnector' window.debug = debug window.THREE = THREE @@ -471,12 +472,20 @@ async function connect (connectOptions: ConnectOptions) { connectingServer: server.host }) : undefined + let clientDataStream + if (p2pMultiplayer) { + clientDataStream = await connectToPeer(connectOptions.peerId!, connectOptions.peerOptions) + } + if (connectOptions.viewerWsConnect) { + clientDataStream = await getWsProtocolStream(connectOptions.viewerWsConnect) + } + bot = mineflayer.createBot({ host: server.host, port: server.port ? +server.port : undefined, version: connectOptions.botVersion || false, - ...p2pMultiplayer ? { - stream: await connectToPeer(connectOptions.peerId!, connectOptions.peerOptions), + ...clientDataStream ? { + stream: clientDataStream, } : {}, ...singleplayer || p2pMultiplayer ? { keepAlive: false, @@ -559,12 +568,15 @@ async function connect (connectOptions: ConnectOptions) { return _supportFeature(feature) }) as typeof bot.supportFeature + bot.emit('inject_allowed') + bot._client.emit('connect') + } else if (connectOptions.viewerWsConnect) { bot.emit('inject_allowed') bot._client.emit('connect') } else { const setupConnectHandlers = () => { bot._client.socket.on('connect', () => { - console.log('WebSocket connection established') + console.log('Proxy WebSocket connection established') //@ts-expect-error bot._client.socket._ws.addEventListener('close', () => { console.log('WebSocket connection closed') @@ -1039,6 +1051,15 @@ downloadAndOpenFile().then((downloadAction) => { if (qs.get('serversList')) { showModal({ reactType: 'serversList' }) } + + const viewerWsConnect = qs.get('viewerConnect') + if (viewerWsConnect) { + void connect({ + username: `viewer-${Math.random().toString(36).slice(2, 10)}`, + botVersion: '1.21.1', + viewerWsConnect, + }) + } }, (err) => { console.error(err) alert(`Failed to download file: ${err}`)