Skip to content

Commit 809ff69

Browse files
committed
Support 1.20.3 disconnect, enable 1.20.3/4 support
1 parent 174c968 commit 809ff69

7 files changed

Lines changed: 34 additions & 28 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Disclaimer: This app is NOT an official Minecraft product. It is not associated
99
## Features (still being worked on)
1010

1111
- Fully open-source with no ads! Easily report issues through GitHub and get a direct response.
12-
- Supports connecting to Minecraft 1.16.4 through Minecraft 1.20.2 servers. (Older versions planned.)
12+
- Supports connecting to Minecraft 1.16.4 through Minecraft 1.20.4 servers. (Older versions planned.)
1313
- Supports all Minecraft chat features, which sometimes trip up other chat apps.
1414
- Send join messages and commands on connecting to a server.
1515
- Health change indicator and respawn on death support.

src/components/servers/EditServerDialog.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ const EditServerDialog = ({
106106
dropdownIconColor={darkMode ? '#ffffff' : '#000000'}
107107
>
108108
<Picker.Item label='Auto' value='auto' />
109-
{/* FIXME: Update README after enablement. */}
110-
<Picker.Item label='1.20.3/1.20.4 (DOES NOT WORK!)' value='1.20.3' />
109+
<Picker.Item label='1.20.3/1.20.4 (WIP)' value='1.20.3' />
111110
<Picker.Item label='1.20.2 (WIP)' value='1.20.2' />
112111
<Picker.Item label='1.20/1.20.1 (WIP)' value='1.20' />
113112
<Picker.Item label='1.19.4 (WIP)' value='1.19.4' />

src/minecraft/connection/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { type Packet } from '../packet'
33
import { type Certificate } from '../api/mojang'
44
import initiateJavaScriptConnection from './javascript'
55
import initiateNativeConnection, { isNativeConnectionAvailable } from './native'
6+
import { type MinecraftChat } from '../chatToJsx'
67

78
export interface ConnectionOptions {
89
serverName: string
@@ -26,7 +27,7 @@ export interface ServerConnection extends events.EventEmitter {
2627
state: ConnectionState
2728
closed: boolean
2829
msgSalt?: Buffer
29-
disconnectReason?: string // FIXME: This is no longer just a string, it may be NBT too...
30+
disconnectReason?: MinecraftChat
3031

3132
writePacket: (packetId: number, data: Buffer) => Promise<boolean>
3233

src/minecraft/connection/javascript.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,15 @@ import {
2121
type ConnectionOptions,
2222
ConnectionState
2323
} from '.'
24+
import { type MinecraftChat } from '../chatToJsx'
2425
import { getLoginPacket, handleEncryptionRequest } from './shared'
25-
import { readVarInt, writeVarInt, resolveHostname, protocolMap } from '../utils'
26+
import {
27+
readVarInt,
28+
writeVarInt,
29+
resolveHostname,
30+
protocolMap,
31+
parseChat
32+
} from '../utils'
2633
import packetIds from '../packets/ids'
2734

2835
export declare interface JavaScriptServerConnection {
@@ -45,7 +52,7 @@ export class JavaScriptServerConnection
4552
socket: net.Socket
4653
options: ConnectionOptions
4754
disconnectTimer?: NodeJS.Timeout
48-
disconnectReason?: string
55+
disconnectReason?: MinecraftChat
4956
aesDecipher?: Decipher
5057
aesCipher?: Cipher
5158

@@ -199,10 +206,10 @@ const initiateJavaScriptConnection = async (
199206
(packet.id === packetIds.CLIENTBOUND_DISCONNECT_PLAY(version) &&
200207
conn.state === ConnectionState.PLAY)
201208
) {
202-
const [chatLength, chatVarIntLength] = readVarInt(packet.data)
203-
conn.disconnectReason = packet.data
204-
.slice(chatVarIntLength, chatVarIntLength + chatLength)
205-
.toString('utf8')
209+
conn.disconnectReason = parseChat(
210+
packet.data, // The Disconnect (login) packet always returns JSON.
211+
conn.state === ConnectionState.LOGIN ? undefined : version
212+
)[0]
206213
} else if (
207214
packet.id === 0x04 &&
208215
conn.state === ConnectionState.LOGIN

src/minecraft/connection/native.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,16 @@ import {
99
type ConnectionOptions,
1010
ConnectionState
1111
} from '.'
12+
import { type MinecraftChat } from '../chatToJsx'
1213
import { concatPacketData, type Packet } from '../packet'
1314
import { getLoginPacket, handleEncryptionRequest } from './shared'
14-
import { readVarInt, writeVarInt, resolveHostname, protocolMap } from '../utils'
15+
import {
16+
readVarInt,
17+
writeVarInt,
18+
resolveHostname,
19+
protocolMap,
20+
parseChat
21+
} from '../utils'
1522
import packetIds from '../packets/ids'
1623

1724
const { ConnectionModule } = NativeModules
@@ -50,7 +57,7 @@ export class NativeServerConnection
5057
id: string
5158
options: ConnectionOptions
5259
disconnectTimer?: NodeJS.Timeout
53-
disconnectReason?: string
60+
disconnectReason?: MinecraftChat
5461
msgSalt?: Buffer
5562

5663
constructor(id: string, options: ConnectionOptions) {
@@ -118,10 +125,10 @@ export class NativeServerConnection
118125
(packet.id === packetIds.CLIENTBOUND_DISCONNECT_PLAY(version) &&
119126
this.state === ConnectionState.PLAY)
120127
) {
121-
const [chatLength, chatVarIntLength] = readVarInt(packet.data)
122-
this.disconnectReason = packet.data
123-
.slice(chatVarIntLength, chatVarIntLength + chatLength)
124-
.toString('utf8')
128+
this.disconnectReason = parseChat(
129+
packet.data, // The Disconnect (login) packet always returns JSON.
130+
this.state === ConnectionState.LOGIN ? undefined : version
131+
)[0]
125132
} else if (packet.id === 0x04 && this.state === ConnectionState.LOGIN) {
126133
/* Login Plugin Request */
127134
const [msgId] = readVarInt(packet.data)

src/minecraft/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const protocolMap = {
2222
'1.20.2': 764,
2323
'1.20.3': 765,
2424
'1.20.4': 765,
25-
latest: 764, // FIXME: Set to 765 when 1.20.4 is supported.
25+
latest: 765,
2626
auto: -1
2727
}
2828

src/utilities/connection/connectionBuilder.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,7 @@ import { refresh } from '../../minecraft/api/yggdrasil'
1818
import initiateConnection, {
1919
type ServerConnection
2020
} from '../../minecraft/connection'
21-
import {
22-
parseIp,
23-
parseJsonChat,
24-
protocolMap,
25-
resolveHostname
26-
} from '../../minecraft/utils'
21+
import { parseIp, protocolMap, resolveHostname } from '../../minecraft/utils'
2722
import config from '../../../config.json'
2823

2924
export const getSession = async (
@@ -133,11 +128,8 @@ export const createConnection = async (
133128
certificate: settings.enableChatSigning ? session?.certificate : undefined
134129
})
135130
const onCloseOrError = (): void => {
136-
closeChatScreen(
137-
newConn.disconnectReason
138-
? { server, reason: parseJsonChat(newConn.disconnectReason) }
139-
: undefined
140-
)
131+
const reason = newConn.disconnectReason
132+
closeChatScreen(reason ? { server, reason } : undefined)
141133
setConnection(undefined)
142134
}
143135
newConn.on('close', onCloseOrError)

0 commit comments

Comments
 (0)