Skip to content

Commit 6a148cf

Browse files
committed
initial commit
0 parents  commit 6a148cf

File tree

16 files changed

+855
-0
lines changed

16 files changed

+855
-0
lines changed

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module aether
2+
3+
go 1.22.2
4+
5+
require github.com/google/uuid v1.6.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
2+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=

main.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main
2+
3+
import (
4+
"aether/server"
5+
"net"
6+
)
7+
8+
func main() {
9+
cfg := server.ServerConfig{
10+
IP: net.IPv4(127, 0, 0, 1),
11+
Port: 25565,
12+
TPS: 20,
13+
CompressionThreshold: -1,
14+
}
15+
srv, _ := cfg.New()
16+
srv.Start()
17+
}

net/config.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net
2+
3+
import (
4+
"aether/net/packet/status"
5+
"net"
6+
)
7+
8+
type Config struct {
9+
Status func() status.StatusResponseData
10+
11+
IP net.IP
12+
Port int
13+
CompressionThreshold int32
14+
}
15+
16+
func (c Config) New() (*Listener, error) {
17+
l, err := net.ListenTCP("tcp", &net.TCPAddr{
18+
IP: c.IP, Port: c.Port,
19+
})
20+
lis := &Listener{
21+
Config: c,
22+
Listener: l,
23+
}
24+
25+
return lis, err
26+
}
27+
28+
func Status(s status.StatusResponseData) func() status.StatusResponseData {
29+
return func() status.StatusResponseData {
30+
return s
31+
}
32+
}

net/conn.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package net
2+
3+
import (
4+
"aether/net/io"
5+
"aether/net/packet"
6+
"bytes"
7+
"net"
8+
)
9+
10+
type Conn struct {
11+
net.Conn
12+
13+
listener *Listener
14+
15+
reader io.Reader
16+
writer io.Writer
17+
18+
state int
19+
}
20+
21+
func (conn *Conn) WritePacket(pk packet.Packet) error {
22+
if conn.listener.CompressionThreshold < 0 {
23+
var buf = new(bytes.Buffer)
24+
w := io.NewWriter(buf)
25+
if err := w.VarInt(pk.ID()); err != nil {
26+
return err
27+
}
28+
if err := pk.Encode(w); err != nil {
29+
return err
30+
}
31+
if err := conn.writer.VarInt(int32(buf.Len())); err != nil {
32+
return err
33+
}
34+
return conn.writer.FixedByteArray(buf.Bytes())
35+
} else {
36+
//compression
37+
}
38+
return nil
39+
}
40+
41+
func (conn *Conn) ReadPacket() (packet.Packet, error) {
42+
rd := conn.reader
43+
var (
44+
length, packetId int32
45+
data []byte
46+
)
47+
if conn.listener.CompressionThreshold < 0 {
48+
if _, err := rd.VarInt(&length); err != nil {
49+
return nil, err
50+
}
51+
vii, err := rd.VarInt(&packetId)
52+
if err != nil {
53+
return nil, err
54+
}
55+
length -= int32(vii)
56+
data = make([]byte, length)
57+
if err := rd.FixedByteArray(data); err != nil {
58+
return nil, err
59+
}
60+
61+
rd = io.NewReader(bytes.NewReader(data))
62+
} else {
63+
//compression
64+
}
65+
66+
var pk packet.Packet
67+
pc, ok := serverboundPool[conn.state][packetId]
68+
if !ok {
69+
return packet.UnknownPacket{
70+
Id: packetId,
71+
Length: length,
72+
Payload: rd,
73+
}, nil
74+
} else {
75+
pk = pc()
76+
err := pk.Decode(rd)
77+
return pk, err
78+
}
79+
}

net/io/reader.go

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package io
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"unsafe"
7+
8+
"github.com/google/uuid"
9+
)
10+
11+
type Reader struct {
12+
r io.Reader
13+
}
14+
15+
func NewReader(r io.Reader) Reader {
16+
return Reader{r}
17+
}
18+
19+
func (r Reader) readBytes(l int) ([]byte, error) {
20+
arr := make([]byte, l)
21+
_, err := r.r.Read(arr)
22+
return arr, err
23+
}
24+
25+
func (r Reader) Byte(i *int8) error {
26+
d, err := r.readBytes(1)
27+
*i = int8(d[0])
28+
return err
29+
}
30+
func (r Reader) Ubyte(i *byte) error {
31+
d, err := r.readBytes(1)
32+
*i = d[0]
33+
return err
34+
}
35+
36+
func (r Reader) Short(i *int16) error {
37+
d, err := r.readBytes(2)
38+
*i = int16(d[0])<<8 | int16(d[1])
39+
return err
40+
}
41+
func (r Reader) Ushort(i *uint16) error {
42+
d, err := r.readBytes(2)
43+
*i = uint16(d[0])<<8 | uint16(d[1])
44+
return err
45+
}
46+
47+
func (r Reader) Int(i *int32) error {
48+
d, err := r.readBytes(4)
49+
*i = int32(d[0])<<24 | int32(d[1])<<16 | int32(d[2])<<8 | int32(d[3])
50+
return err
51+
}
52+
53+
func (r Reader) Long(i *int64) error {
54+
d, err := r.readBytes(8)
55+
*i = int64(d[0])<<56 | int64(d[1])<<48 | int64(d[2])<<40 | int64(d[3])<<32 | int64(d[4])<<24 | int64(d[5])<<16 | int64(d[6])<<8 | int64(d[7])
56+
return err
57+
}
58+
59+
func (r Reader) Float(f *float32) error {
60+
return r.Int((*int32)(unsafe.Pointer(f)))
61+
}
62+
func (r Reader) Double(f *float64) error {
63+
return r.Long((*int64)(unsafe.Pointer(f)))
64+
}
65+
66+
func (r Reader) String(s *string) error {
67+
var l int32
68+
if _, err := r.VarInt(&l); err != nil {
69+
return err
70+
}
71+
d, err := r.readBytes(int(l))
72+
*s = *(*string)(unsafe.Pointer(&d))
73+
74+
return err
75+
}
76+
77+
func (r Reader) Identifier(s *string) error {
78+
return r.String(s)
79+
}
80+
81+
func (r Reader) VarInt(value *int32) (i int, err error) {
82+
var (
83+
position int32
84+
currentByte byte
85+
CONTINUE_BIT byte = 128
86+
SEGMENT_BITS byte = 127
87+
88+
size int
89+
)
90+
91+
for {
92+
if err := r.Ubyte(&currentByte); err != nil {
93+
return size, err
94+
}
95+
*value |= int32((currentByte & SEGMENT_BITS)) << position
96+
size++
97+
98+
if (currentByte & CONTINUE_BIT) == 0 {
99+
break
100+
}
101+
102+
position += 7
103+
104+
if position >= 32 {
105+
return size, fmt.Errorf("VarInt is too big")
106+
}
107+
}
108+
109+
return size, nil
110+
}
111+
112+
func (r Reader) VarLong(value *int64) error {
113+
var (
114+
position int64
115+
currentByte byte
116+
CONTINUE_BIT byte = 128
117+
SEGMENT_BITS byte = 127
118+
)
119+
120+
for {
121+
if err := r.Ubyte(&currentByte); err != nil {
122+
return err
123+
}
124+
*value |= int64((currentByte & SEGMENT_BITS)) << position
125+
126+
if (currentByte & CONTINUE_BIT) == 0 {
127+
break
128+
}
129+
130+
position += 7
131+
132+
if position >= 32 {
133+
return fmt.Errorf("VarInt is too big")
134+
}
135+
}
136+
137+
return nil
138+
}
139+
140+
func (r Reader) Position(x, y, z *int32) error {
141+
var l int64
142+
if err := r.Long(&l); err != nil {
143+
return err
144+
}
145+
146+
*x = int32(l >> 38)
147+
*y = int32(l & ((1 << 12) - 1))
148+
*z = int32((l >> 12) & ((1 << 26) - 1))
149+
150+
return nil
151+
}
152+
153+
func (r Reader) UUID(u *uuid.UUID) error {
154+
d, err := r.readBytes(16)
155+
156+
*u = uuid.UUID(d)
157+
return err
158+
}
159+
160+
func (r Reader) BitSet(data *[]int64) error {
161+
var l int32
162+
if _, err := r.VarInt(&l); err != nil {
163+
return err
164+
}
165+
*data = make([]int64, l)
166+
167+
for _, l := range *data {
168+
if err := r.Long(&l); err != nil {
169+
return err
170+
}
171+
}
172+
return nil
173+
}
174+
175+
func (r Reader) ByteArray(s *[]byte) error {
176+
var l int32
177+
if _, err := r.VarInt(&l); err != nil {
178+
return err
179+
}
180+
d, err := r.readBytes(int(l))
181+
*s = d
182+
183+
return err
184+
}
185+
186+
func (r Reader) FixedByteArray(s []byte) error {
187+
_, err := r.r.Read(s)
188+
return err
189+
}

0 commit comments

Comments
 (0)