у меня есть вот такой вот node.js код: function StartVirtualServer(ip, port, ver, client2, proxyClient2, proxyServer2) { const msg = { translate: 'chat.type.announcement', "with": ['§cCreating virtual server...'] }; client2.write("chat", { message: JSON.stringify(msg), position: 0, sender: '0' }); const proxyServer = createServer({ host: "127.0.0.1", port: 25566, version: ver, "online-mode": false, keepAlive: false, }) const msg2 = { translate: 'chat.type.announcement', "with": ['§cSucessfuly created virtual server at localhost:25566'] }; client2.write("chat", { message: JSON.stringify(msg2), position: 0, sender: '0' }); proxyServer.on("login", (client) => { const proxyClient = createClient({ username: client2.username, auth: "offline", host: ip, port: port, keepAlive: true, version: ver, hideErrors: true, }); nickname = client2.username const packets = []; let userClient; client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; proxyClient.write(meta.name, data); }); // Добавляем обработку пакетов "player_position" и "player_position_and_look" и передаем их на proxyClient client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; }); client2.on('position_look', (data, meta) => { client.write("position_look", data) }); client2.on('position', (data, meta) => { client.write("position", data) }); client2.on('look', (data, meta) => { client.write("look", data) }); proxyClient2.on("packet", (data, meta) => { const packetName = meta.name; if (packetName === "keep_alive") { return; } const excludedPackets = ["keep_alive", "success", "custom_payload", "encryption_begin", "compress", "open_window", "close_window", "player_chat", "profileless_chat"]; if (!excludedPackets.includes(packetName)) { packets.push([meta, data]); } if (!userClient || meta.state !== states.PLAY || userClient.state !== states.PLAY) { return; } userClient.write(packetName, data); if (packetName === "set_compression") { userClient.compressionThreshold = data.threshold; } }); proxyClient2.on("end", () => { if (userClient) { redirectpacket(ip, port, ver, client, proxyClient, proxyServer); } }); proxyClient2.on("error", (error) => { if (userClient) { console.error("Client error:", error); userClient.end(error); } }); userClient = client; packets.forEach((p) => { const meta = p[0]; const data = p[1]; proxyClient.write(meta.name, data); }); // Добавляем обработку пакета "Look" и передаем его на proxyClient client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; proxyClient.write(meta.name, data); }); client.on("error", (error) => { if (client) { console.error(error); } }); }); } JS function StartVirtualServer(ip, port, ver, client2, proxyClient2, proxyServer2) { const msg = { translate: 'chat.type.announcement', "with": ['§cCreating virtual server...'] }; client2.write("chat", { message: JSON.stringify(msg), position: 0, sender: '0' }); const proxyServer = createServer({ host: "127.0.0.1", port: 25566, version: ver, "online-mode": false, keepAlive: false, }) const msg2 = { translate: 'chat.type.announcement', "with": ['§cSucessfuly created virtual server at localhost:25566'] }; client2.write("chat", { message: JSON.stringify(msg2), position: 0, sender: '0' }); proxyServer.on("login", (client) => { const proxyClient = createClient({ username: client2.username, auth: "offline", host: ip, port: port, keepAlive: true, version: ver, hideErrors: true, }); nickname = client2.username const packets = []; let userClient; client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; proxyClient.write(meta.name, data); }); // Добавляем обработку пакетов "player_position" и "player_position_and_look" и передаем их на proxyClient client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; }); client2.on('position_look', (data, meta) => { client.write("position_look", data) }); client2.on('position', (data, meta) => { client.write("position", data) }); client2.on('look', (data, meta) => { client.write("look", data) }); proxyClient2.on("packet", (data, meta) => { const packetName = meta.name; if (packetName === "keep_alive") { return; } const excludedPackets = ["keep_alive", "success", "custom_payload", "encryption_begin", "compress", "open_window", "close_window", "player_chat", "profileless_chat"]; if (!excludedPackets.includes(packetName)) { packets.push([meta, data]); } if (!userClient || meta.state !== states.PLAY || userClient.state !== states.PLAY) { return; } userClient.write(packetName, data); if (packetName === "set_compression") { userClient.compressionThreshold = data.threshold; } }); proxyClient2.on("end", () => { if (userClient) { redirectpacket(ip, port, ver, client, proxyClient, proxyServer); } }); proxyClient2.on("error", (error) => { if (userClient) { console.error("Client error:", error); userClient.end(error); } }); userClient = client; packets.forEach((p) => { const meta = p[0]; const data = p[1]; proxyClient.write(meta.name, data); }); // Добавляем обработку пакета "Look" и передаем его на proxyClient client2.on("packet", (data, meta) => { if (meta.name === "keep_alive") return; if (!client || meta.state !== states.PLAY || client.state !== states.PLAY) return; proxyClient.write(meta.name, data); }); client.on("error", (error) => { if (client) { console.error(error); } }); }); } в нем у меня когда я запускаю эту функцию указывая ip,port,ver,client2,proxyclient2,proxyServer2 у меня запускается майнкрафт сервер при заходе на который у меня создается клиент который перенаправляет меня на ip:port в нем я отслеживаю все position, position_look, look с client2 и передаю их в client но почему то при любом движение на client2 меня автоматический кикает в майнкрафте по причине Internal Exception: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(1) + lenght(1) exceeds writerEndex(1): PooledUnsafeDirectByteBuf(ridx: 1, widx: 1, cap: 1) и в консоль выдает ошибку Disconnecting client because error Error: write ECONNABORTED at afterWriteDispatched (node:internal/stream_base_commons:160:15) at writeGeneric (node:internal/stream_base_commons:151:3) at Socket._writeGeneric (node:net:962:11) at Socket._write (node:net:974:8) at writeOrBuffer (node:internal/streams/writable:392:12) at _write (node:internal/streams/writable:333:10) at Writable.write (node:internal/streams/writable:337:10) at Framer.ondata (C:\Users\User\Desktop\UNCHEATPROKJECT\node_modules\readable-stream\lib\internal\streams\readable.js:662:22) at Framer.emit (node:events:517:28) at addChunk (C:\Users\User\Desktop\UNCHEATPROKJECT\node_modules\readable-stream\lib\internal\streams\readable.js:278:12) { errno: -4079, code: 'ECONNABORTED', syscall: 'write' } Error: write ECONNABORTED at afterWriteDispatched (node:internal/stream_base_commons:160:15) at writeGeneric (node:internal/stream_base_commons:151:3) at Socket._writeGeneric (node:net:962:11) at Socket._write (node:net:974:8) at writeOrBuffer (node:internal/streams/writable:392:12) at _write (node:internal/streams/writable:333:10) at Writable.write (node:internal/streams/writable:337:10) at Framer.ondata (C:\Users\User\Desktop\UNCHEATPROKJECT\node_modules\readable-stream\lib\internal\streams\readable.js:662:22) at Framer.emit (node:events:517:28) at addChunk (C:\Users\User\Desktop\UNCHEATPROKJECT\node_modules\readable-stream\lib\internal\streams\readable.js:278:12) { errno: -4079, code: 'ECONNABORTED', syscall: 'write' }