Skip to content

Commit

Permalink
refactor: Move login packet to separate file (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
meyfa authored Apr 7, 2024
1 parent 584f31e commit dfeac8d
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 80 deletions.
118 changes: 118 additions & 0 deletions src/packets/login-play.cob
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SendPacket-LoginPlay.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 PACKET-ID BINARY-LONG VALUE 41.
*> temporary data used during encoding
01 INT32 BINARY-LONG.
01 BUFFER PIC X(64).
01 BUFFERLEN BINARY-LONG UNSIGNED.
*> buffer used to store the packet data
01 PAYLOAD PIC X(64000).
01 PAYLOADLEN BINARY-LONG UNSIGNED.
LINKAGE SECTION.
01 LK-HNDL PIC X(4).
01 LK-ERRNO PIC 9(3).

PROCEDURE DIVISION USING BY REFERENCE LK-HNDL LK-ERRNO.
MOVE 0 TO PAYLOADLEN

*> entity ID=0x00000001 (suffix of UUID)
PERFORM 4 TIMES
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)
END-PERFORM
MOVE FUNCTION CHAR(2) TO PAYLOAD(PAYLOADLEN:1)

*> is hardcore=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> dimension count=1
MOVE 1 TO INT32
CALL "Encode-VarInt" USING INT32 BUFFER BUFFERLEN
MOVE BUFFER(1:BUFFERLEN) TO PAYLOAD(PAYLOADLEN + 1:BUFFERLEN)
ADD BUFFERLEN TO PAYLOADLEN

*> dimension name array=["minecraft:overworld"]
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(19 + 1) TO PAYLOAD(PAYLOADLEN:1)
MOVE "minecraft:overworld" TO PAYLOAD(PAYLOADLEN + 1:19)
ADD 19 TO PAYLOADLEN

*> max players=1
MOVE 10 TO INT32
CALL "Encode-VarInt" USING INT32 BUFFER BUFFERLEN
MOVE BUFFER(1:BUFFERLEN) TO PAYLOAD(PAYLOADLEN + 1:BUFFERLEN)
ADD BUFFERLEN TO PAYLOADLEN

*> view distance=10
MOVE 10 TO INT32
CALL "Encode-VarInt" USING INT32 BUFFER BUFFERLEN
MOVE BUFFER(1:BUFFERLEN) TO PAYLOAD(PAYLOADLEN + 1:BUFFERLEN)
ADD BUFFERLEN TO PAYLOADLEN

*> simulation distance=10
MOVE 10 TO INT32
CALL "Encode-VarInt" USING INT32 BUFFER BUFFERLEN
MOVE BUFFER(1:BUFFERLEN) TO PAYLOAD(PAYLOADLEN + 1:BUFFERLEN)
ADD BUFFERLEN TO PAYLOADLEN

*> reduced debug info=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> enable respawn screen=true
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> do limited crafting=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> dimension type="minecraft:overworld"
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(19 + 1) TO PAYLOAD(PAYLOADLEN:1)
MOVE "minecraft:overworld" TO PAYLOAD(PAYLOADLEN + 1:19)
ADD 19 TO PAYLOADLEN

*> dimension name="minecraft:overworld"
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(19 + 1) TO PAYLOAD(PAYLOADLEN:1)
MOVE "minecraft:overworld" TO PAYLOAD(PAYLOADLEN + 1:19)
ADD 19 TO PAYLOADLEN

*> hashed seed=0 (8-byte long)
MOVE X"0000000000000000" TO PAYLOAD(PAYLOADLEN + 1:8)
ADD 8 TO PAYLOADLEN

*> gamemode=1 (creative)
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(2) TO PAYLOAD(PAYLOADLEN:1)

*> previous gamemode=-1
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(255 + 1) TO PAYLOAD(PAYLOADLEN:1)

*> is debug=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> is flat=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> has death location=false
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> portal cooldown=0
ADD 1 TO PAYLOADLEN
MOVE FUNCTION CHAR(1) TO PAYLOAD(PAYLOADLEN:1)

*> Send the packet
CALL "SendPacket" USING LK-HNDL PACKET-ID PAYLOAD PAYLOADLEN LK-ERRNO
GOBACK.

END PROGRAM SendPacket-LoginPlay.
81 changes: 1 addition & 80 deletions src/server.cob
Original file line number Diff line number Diff line change
Expand Up @@ -533,86 +533,7 @@ HandleConfiguration SECTION.
ADD 1 TO CLIENT-STATE(CLIENT-ID)

*> send "Login (play)"
MOVE 0 TO BYTE-COUNT
*> entity ID=0x00000001 (suffix of UUID)
PERFORM 4 TIMES
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
END-PERFORM
MOVE FUNCTION CHAR(2) TO BUFFER(BYTE-COUNT:1)
*> is hardcore=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> dimension count=1
MOVE 1 TO TEMP-INT32
CALL "Encode-VarInt" USING TEMP-INT32 TEMP-BUFFER TEMP-BYTE-COUNT
MOVE TEMP-BUFFER TO BUFFER(BYTE-COUNT + 1:TEMP-BYTE-COUNT)
ADD TEMP-BYTE-COUNT TO BYTE-COUNT
*> dimension name array=["minecraft:overworld"]
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(19 + 1) TO BUFFER(BYTE-COUNT:1)
MOVE "minecraft:overworld" TO BUFFER(BYTE-COUNT + 1:19)
ADD 19 TO BYTE-COUNT
*> max players=1
MOVE 10 TO TEMP-INT32
CALL "Encode-VarInt" USING TEMP-INT32 TEMP-BUFFER TEMP-BYTE-COUNT
MOVE TEMP-BUFFER TO BUFFER(BYTE-COUNT + 1:TEMP-BYTE-COUNT)
ADD TEMP-BYTE-COUNT TO BYTE-COUNT
*> view distance=10
MOVE 10 TO TEMP-INT32
CALL "Encode-VarInt" USING TEMP-INT32 TEMP-BUFFER TEMP-BYTE-COUNT
MOVE TEMP-BUFFER TO BUFFER(BYTE-COUNT + 1:TEMP-BYTE-COUNT)
ADD TEMP-BYTE-COUNT TO BYTE-COUNT
*> simulation distance=10
MOVE 10 TO TEMP-INT32
CALL "Encode-VarInt" USING TEMP-INT32 TEMP-BUFFER TEMP-BYTE-COUNT
MOVE TEMP-BUFFER TO BUFFER(BYTE-COUNT + 1:TEMP-BYTE-COUNT)
ADD TEMP-BYTE-COUNT TO BYTE-COUNT
*> reduced debug info=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> enable respawn screen=true
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> do limited crafting=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> dimension type="minecraft:overworld"
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(19 + 1) TO BUFFER(BYTE-COUNT:1)
MOVE "minecraft:overworld" TO BUFFER(BYTE-COUNT + 1:19)
ADD 19 TO BYTE-COUNT
*> dimension name="minecraft:overworld"
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(19 + 1) TO BUFFER(BYTE-COUNT:1)
MOVE "minecraft:overworld" TO BUFFER(BYTE-COUNT + 1:19)
ADD 19 TO BYTE-COUNT
*> hashed seed=0 (8-byte long)
PERFORM 8 TIMES
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
END-PERFORM
*> gamemode=1 (creative)
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(2) TO BUFFER(BYTE-COUNT:1)
*> previous gamemode=-1
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(255 + 1) TO BUFFER(BYTE-COUNT:1)
*> is debug=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> is flat=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> has death location=false
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> portal cooldown=0
ADD 1 TO BYTE-COUNT
MOVE FUNCTION CHAR(1) TO BUFFER(BYTE-COUNT:1)
*> send packet
MOVE 41 TO PACKET-ID
CALL "SendPacket" USING BY REFERENCE CLIENT-HNDL(CLIENT-ID) PACKET-ID BUFFER BYTE-COUNT ERRNO
CALL "SendPacket-LoginPlay" USING CLIENT-HNDL(CLIENT-ID) ERRNO
PERFORM HandleClientError

*> send game event "start waiting for level chunks"
Expand Down

0 comments on commit dfeac8d

Please sign in to comment.