This commit is contained in:
adman
2026-03-02 00:14:57 +01:00
parent f7d7a72b7c
commit d8cc9cab48
32 changed files with 79606 additions and 20424 deletions
@@ -1,4 +1,4 @@
package modules package client
import ( import (
"errors" "errors"
+2 -3
View File
@@ -1,4 +1,4 @@
package modules package client
import ( import (
"crypto/rand" "crypto/rand"
@@ -11,7 +11,6 @@ import (
"strconv" "strconv"
"github.com/admin-else/strom/api" "github.com/admin-else/strom/api"
"github.com/admin-else/strom/client"
"github.com/admin-else/strom/crypto" "github.com/admin-else/strom/crypto"
"github.com/admin-else/strom/event" "github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto"
@@ -157,7 +156,7 @@ func Login(c *proto.Conn, account *api.Account) (err error) {
} }
func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err error) { func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err error) {
c, err = client.Connect(connectTo) c, err = Connect(connectTo)
if err != nil { if err != nil {
return return
} }
@@ -1,4 +1,4 @@
package modules package client
import ( import (
"fmt" "fmt"
+7 -7
View File
@@ -1,6 +1,9 @@
package modules package client
import "time" import (
"slices"
"time"
)
type IntervalTask struct { type IntervalTask struct {
F func() error F func() error
@@ -33,18 +36,15 @@ func (t *Timer) Tick() (err error) {
} }
t.Interval[i] = task t.Interval[i] = task
} }
var triggerLater []OnceTask for i, task := range t.Once {
for _, task := range t.Once {
if task.Trigger.After(time.Now()) { if task.Trigger.After(time.Now()) {
err = task.F() err = task.F()
if err != nil { if err != nil {
return return
} }
} else { slices.Delete(t.Once, i, i)
triggerLater = append(triggerLater, task)
} }
} }
t.Once = triggerLater
return return
} }
+20
View File
@@ -0,0 +1,20 @@
package data
import (
"embed"
"github.com/admin-else/strom/nbt"
)
//go:embed registry/*
var Registry embed.FS
func LoadRegistry(name string) (n *nbt.Tag, err error) {
r, err := Registry.Open("registry/" + name + ".nbt")
if err != nil {
return
}
defer r.Close()
n, err = nbt.ReadFile(r)
return
}
Binary file not shown.
+1 -1
View File
@@ -60,7 +60,7 @@ func UnpackSingleValuePalette(r io.Reader, numberOfEntries int) (data []int32, e
} }
data = make([]int32, numberOfEntries) data = make([]int32, numberOfEntries)
for i := range data { for i := range data {
data[i] = int32(entry) data[i] = entry
} }
return return
} }
+3 -6
View File
@@ -7,21 +7,18 @@ import (
func WriteFile(file io.Writer, n Tag) (err error) { func WriteFile(file io.Writer, n Tag) (err error) {
gzw := gzip.NewWriter(file) gzw := gzip.NewWriter(file)
if err != nil {
return
}
defer gzw.Close() defer gzw.Close()
err = n.Encode(gzw) err = n.Encode(gzw)
return return
} }
func ReadFile(file io.Reader) (err error, n Tag) { func ReadFile(file io.Reader) (n *Tag, err error) {
r, err := gzip.NewReader(file) r, err := gzip.NewReader(file)
if err != nil { if err != nil {
return return
} }
defer r.Close() defer r.Close()
t := &Tag{} n = &Tag{}
err = t.Decode(r) err = n.Decode(r)
return return
} }
+2 -2
View File
@@ -67,7 +67,7 @@ func (c *Conn) SetVersion(version string) (err error) {
} }
func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) { func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) {
//fmt.Println("send:", packet) slog.Debug("send", "actor", c.Actor, "packet", fmt.Sprintf("%#v", packet))
switch packet := packet.(type) { switch packet := packet.(type) {
case *UnCodablePacket: case *UnCodablePacket:
err = c.SendRaw(packet.Data) err = c.SendRaw(packet.Data)
@@ -124,7 +124,7 @@ func (c *Conn) OnTick(_ event.Tick) (err error) {
if err != nil { if err != nil {
return return
} }
slog.Debug("packet", "actor", c.Actor, "packet", fmt.Sprintf("%#v", packet)) slog.Debug("receive", "actor", c.Actor, "packet", fmt.Sprintf("%#v", packet))
err = c.Loop.Fire(packet) err = c.Loop.Fire(packet)
return return
} }
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("\x05\x000000")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("0")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("00")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("\x040000")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("\x0400000")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("\x86\x00000000")
+2
View File
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("80\x00\x01\x05\x01\x010\x01\x00")
+27
View File
@@ -6,6 +6,10 @@ import (
"io" "io"
) )
var (
UnimplementedErr = errors.New("unimplemented")
)
type Direction int type Direction int
const ( const (
@@ -218,6 +222,29 @@ type EncodeDecodeAble interface {
Decode(r io.Reader) (err error) Decode(r io.Reader) (err error)
} }
type LpVec3d struct {
X, Y, Z float64
}
func (v LpVec3d) Encode(w io.Writer) (err error) {
err = UnimplementedErr
return
}
func (v LpVec3d) Decode(r io.Reader) (err error) {
err = UnimplementedErr
return
}
type Void struct{}
func (v Void) Encode(w io.Writer) (err error) {
return
}
func (v Void) Decode(r io.Reader) (err error) {
return
}
type PacketInfo struct { type PacketInfo struct {
Type EncodeDecodeAble Type EncodeDecodeAble
Name string Name string
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+20240 -20382
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+4 -5
View File
@@ -15,6 +15,7 @@ type TypesInfo struct {
type PacketInfo struct { type PacketInfo struct {
TName, Name, Direction, State, PacketId, ProtocolVersion, MinecraftVersion string TName, Name, Direction, State, PacketId, ProtocolVersion, MinecraftVersion string
PacketDef any
} }
func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err error) { func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err error) {
@@ -31,10 +32,8 @@ func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err er
vUnderscore := "v" + strings.ReplaceAll(p.MinecraftVersion, ".", "_") vUnderscore := "v" + strings.ReplaceAll(p.MinecraftVersion, ".", "_")
typeName := p.TName typeName := p.TName
var typeExpr ast.Expr var typeExpr ast.Expr
if typeName == "struct{}" { if p.PacketDef == "void" {
typeExpr = &ast.StructType{Fields: &ast.FieldList{}} typeExpr = Selector("proto_base", "Void")
} else if strings.HasPrefix(typeName, "proto_base.") {
typeExpr = Selector("proto_base", strings.TrimPrefix(typeName, "proto_base."))
} else { } else {
typeExpr = Selector(vUnderscore, typeName) typeExpr = Selector(vUnderscore, typeName)
} }
@@ -46,7 +45,7 @@ func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err er
KeyValueExpr(Ident("Type"), AddrOf(CompLit(typeExpr, nil))), KeyValueExpr(Ident("Type"), AddrOf(CompLit(typeExpr, nil))),
KeyValueExpr(Ident("Name"), StrLit(p.Name)), KeyValueExpr(Ident("Name"), StrLit(p.Name)),
KeyValueExpr(Ident("Direction"), Selector("proto_base", p.Direction)), KeyValueExpr(Ident("Direction"), Selector("proto_base", p.Direction)),
KeyValueExpr(Ident("state"), Selector("proto_base", p.State)), KeyValueExpr(Ident("State"), Selector("proto_base", p.State)),
KeyValueExpr(Ident("PacketId"), NumLit(int(packetId))), KeyValueExpr(Ident("PacketId"), NumLit(int(packetId))),
KeyValueExpr(Ident("ProtocolVersion"), NumLit(protocolVersion)), KeyValueExpr(Ident("ProtocolVersion"), NumLit(protocolVersion)),
})) }))
+2 -1
View File
@@ -293,6 +293,7 @@ func (g *Generator) GenerateProtocol(protocol Protocol, version string) (err err
v2 := v2.(string) v2 := v2.(string)
typeName := prefix + CamelCase(v2) typeName := prefix + CamelCase(v2)
g.packetInfos = append(g.packetInfos, PacketInfo{ g.packetInfos = append(g.packetInfos, PacketInfo{
PacketDef: v2,
TName: typeName, TName: typeName,
Name: k2, Name: k2,
Direction: types.Direction, Direction: types.Direction,
@@ -378,7 +379,7 @@ func GenerateVersions(versions []string) (err error) {
} }
func main() { func main() {
err := GenerateVersions([]string{"1.21.8"}) err := GenerateVersions([]string{"1.21.8", "1.21.9", "1.21.11"})
if err != nil { if err != nil {
panic(err) panic(err)
} }
+1
View File
@@ -532,6 +532,7 @@ func (g *Generator) RegisterDecoderNatives() {
"varlong": VarLongDecoder, "varlong": VarLongDecoder,
"anonymousNbt": DefaultDecoder, "anonymousNbt": DefaultDecoder,
"anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two
"lpVec3": DefaultDecoder,
"UUID": UUIDDecoder, "UUID": UUIDDecoder,
"restBuffer": DefaultDecoder, "restBuffer": DefaultDecoder,
+1
View File
@@ -359,6 +359,7 @@ func (g *Generator) RegisterEncoderNatives() {
"anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two
"UUID": UUIDEncoder, "UUID": UUIDEncoder,
"restBuffer": DefaultEncoder, "restBuffer": DefaultEncoder,
"lpVec3": DefaultEncoder,
"string": StringEncoder, "string": StringEncoder,
"f32": SimpleTypeEncoder, "f32": SimpleTypeEncoder,
+1
View File
@@ -194,5 +194,6 @@ func (g *Generator) RegisterNatives() {
"bitflags": VisitBitFlagsType, "bitflags": VisitBitFlagsType,
"topBitSetTerminatedArray": VisitToDoType, "topBitSetTerminatedArray": VisitToDoType,
"todo": VisitToDoType, "todo": VisitToDoType,
"lpVec3": MakeSelectorVisitor("proto_base", "LpVec3d"),
} }
} }
+80
View File
@@ -0,0 +1,80 @@
package server
import (
"fmt"
"log/slog"
"github.com/admin-else/strom/data"
"github.com/admin-else/strom/event"
"github.com/admin-else/strom/nbt"
"github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/proto_generated/v1_21_8"
)
type ConfigServer struct {
*proto.Conn
}
func (c *ConfigServer) Default(event event.Anything) (err error) {
slog.Debug("Config server", "packet", fmt.Sprintf("%#v", event.Val))
return
}
func (c *ConfigServer) OnStart(_ event.OnStart) (err error) {
n, err := data.LoadRegistry(c.Version)
if err != nil {
return
}
for _, p := range n.Value.(map[string]any)["Registries"].([]any) {
packet := &v1_21_8.ConfigurationToClientPacketRegistryData{Id: p.(map[string]any)["Id"].(string)}
for _, entry := range p.(map[string]any)["Entries"].([]any) {
entryTyped := entry.(map[string]any)
packet.Entries = append(packet.Entries, struct {
Key string
Value *nbt.Anon
}{entryTyped["TagType"].(string), &nbt.Anon{Value: entryTyped["Value"]}})
}
err = c.Send(packet)
if err != nil {
return
}
}
tagsPacket := &v1_21_8.ConfigurationToClientPacketTags{}
for _, p := range n.Value.(map[string]any)["Tags"].([]any) {
p := p.(map[string]any)
tags := v1_21_8.Tags{}
for _, entry := range p["Entries"].([]any) {
entry := entry.(map[string]any)
tags.Val = append(tags.Val, struct {
TagName string
Entries []int32
}{
TagName: entry["TagName"].(string),
Entries: entry["Entries"].([]int32),
})
}
tagsPacket.Tags = append(tagsPacket.Tags, struct {
TagType string
Tags v1_21_8.Tags
}{TagType: p["TagType"].(string), Tags: tags})
}
err = c.Send(tagsPacket)
if err != nil {
return
}
err = c.Send(&v1_21_8.ConfigurationToClientPacketFinishConfiguration{})
return
}
func (c *ConfigServer) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) {
c.SetState(proto_base.Play)
err = event.HandlerDoneErr{}
return
}
func ServeConfig(c *proto.Conn) (err error) {
cs := &ConfigServer{c}
err = cs.Start(cs)
return
}
+39
View File
@@ -0,0 +1,39 @@
package main
import (
"encoding/json"
"flag"
"os"
"github.com/admin-else/strom/nbt"
)
var (
FileFlag = flag.String("file", "", "The NBT file to print")
)
func mainE() (err error) {
flag.Parse()
f, err := os.Open(*FileFlag)
if err != nil {
return
}
defer f.Close()
n, err := nbt.ReadFile(f)
if err != nil {
return
}
b, err := json.MarshalIndent(n, "", " ")
if err != nil {
return
}
_, err = os.Stdout.Write(b)
return
}
func main() {
err := mainE()
if err != nil {
panic(err)
}
}
+38 -6
View File
@@ -3,14 +3,14 @@ package main
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"log/slog" "log/slog"
"os"
"github.com/admin-else/strom/api" "github.com/admin-else/strom/api"
"github.com/admin-else/strom/client" "github.com/admin-else/strom/client"
"github.com/admin-else/strom/client/modules"
"github.com/admin-else/strom/data" "github.com/admin-else/strom/data"
"github.com/admin-else/strom/event" "github.com/admin-else/strom/event"
"github.com/admin-else/strom/nbt"
"github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/proto_generated/v1_21_8" "github.com/admin-else/strom/proto_generated/v1_21_8"
@@ -26,7 +26,12 @@ func wontFail[T any](v T, err error) T {
} }
var ( var (
CompatibleProtocolVersion = wontFail(data.LookUpVersionByName("1.21.8")).Version // Edit these two
SaveAs = "1.21.8"
Version = "1.21.8"
CompatibleProtocolVersion = wontFail(data.LookUpVersionByName(Version)).Version
FinishedConfigErr = errors.New("finished configuration") FinishedConfigErr = errors.New("finished configuration")
) )
@@ -40,6 +45,7 @@ var Status = wontFail(json.Marshal(server.StatusResponse{
type Proxy struct { type Proxy struct {
Client, Servee *proto.Conn Client, Servee *proto.Conn
Data nbt.Tag
} }
func (p *Proxy) OnAnything(e event.Anything) (err error) { func (p *Proxy) OnAnything(e event.Anything) (err error) {
@@ -51,7 +57,6 @@ func (p *Proxy) OnAnything(e event.Anything) (err error) {
if !ok { if !ok {
return return
} }
slog.Debug("packet", "type", packetInfo.Name, "packet", fmt.Sprintf("%#v", packet))
switch packetInfo.Direction { switch packetInfo.Direction {
case proto_base.ToServer: case proto_base.ToServer:
err = p.Client.Send(packet) err = p.Client.Send(packet)
@@ -61,12 +66,32 @@ func (p *Proxy) OnAnything(e event.Anything) (err error) {
return return
} }
func (p *Proxy) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) { func (p *Proxy) OnFinishConfiguration(_ *v1_21_8.ConfigurationToClientPacketFinishConfiguration) (err error) {
err = FinishedConfigErr err = FinishedConfigErr
return return
} }
func (p *Proxy) OnData(data *v1_21_8.ConfigurationToClientPacketRegistryData) (err error) { func (p *Proxy) OnData(data *v1_21_8.ConfigurationToClientPacketRegistryData) (err error) {
d := p.Data.Value.(map[string]any)["Registries"].([]any)
var entries []any
for _, entry := range data.Entries {
entries = append(entries, map[string]any{"TagType": entry.Key, "Value": entry.Value.Value})
}
d = append(d, map[string]any{"Id": data.Id, "Entries": entries})
p.Data.Value.(map[string]any)["Registries"] = d
return
}
func (p *Proxy) OnTags(data *v1_21_8.ConfigurationToClientPacketTags) (err error) {
var tags []any
for _, tag := range data.Tags {
var entries []any
for _, entry := range tag.Tags.Val {
entries = append(entries, map[string]any{"TagName": entry.TagName, "Entries": entry.Entries})
}
tags = append(tags, map[string]any{"TagType": tag.TagType, "Entries": entries})
}
p.Data.Value.(map[string]any)["Tags"] = tags
return return
} }
@@ -83,7 +108,7 @@ func handleClient(c *proto.Conn) (err error) {
return return
} }
defer sockPuppet.Close() defer sockPuppet.Close()
err = sockPuppet.Start(&modules.LoginClient{ err = sockPuppet.Start(&client.LoginClient{
Conn: sockPuppet, Conn: sockPuppet,
Account: acc, Account: acc,
}) })
@@ -92,6 +117,7 @@ func handleClient(c *proto.Conn) (err error) {
} }
errChan := make(chan error) errChan := make(chan error)
p := &Proxy{Client: sockPuppet, Servee: c} p := &Proxy{Client: sockPuppet, Servee: c}
p.Data.Value = map[string]any{"Registries": []any{}}
go func() { go func() {
errChan <- p.Client.Start(p) errChan <- p.Client.Start(p)
}() }()
@@ -99,6 +125,12 @@ func handleClient(c *proto.Conn) (err error) {
errChan <- p.Servee.Start(p) errChan <- p.Servee.Start(p)
}() }()
err = <-errChan err = <-errChan
f, err := os.Create("data/registry/" + SaveAs + ".nbt")
if err != nil {
return
}
defer f.Close()
err = nbt.WriteFile(f, p.Data)
return return
} }
File diff suppressed because one or more lines are too long
+5 -6
View File
@@ -1,4 +1,3 @@
// THIS THING IS BROKEN
package main package main
import ( import (
@@ -8,7 +7,7 @@ import (
"os" "os"
"github.com/admin-else/strom/api" "github.com/admin-else/strom/api"
"github.com/admin-else/strom/client/modules" "github.com/admin-else/strom/client"
"github.com/admin-else/strom/event" "github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
@@ -39,7 +38,7 @@ func (p *ProxyClient) OnStart(_ event.OnStart) (err error) {
return return
} }
func (p *ProxyClient) OnUnCodeAble(packet proto.UnCodablePacket) (err error) { func (p *ProxyClient) OnUnCodeAble(packet *proto.UnCodablePacket) (err error) {
err = p.OnDefault(event.Unhandled{Val: packet}) err = p.OnDefault(event.Unhandled{Val: packet})
if err != nil { if err != nil {
return return
@@ -80,7 +79,7 @@ func (p *Proxy) OnFinishConfiguration(packet *v1_21_8.ConfigurationToServerPacke
return return
} }
func (p *Proxy) OnUnCodeAble(packet proto.UnCodablePacket) (err error) { func (p *Proxy) OnUnCodeAble(packet *proto.UnCodablePacket) (err error) {
err = p.OnDefault(event.Unhandled{Val: packet}) err = p.OnDefault(event.Unhandled{Val: packet})
if err != nil { if err != nil {
return return
@@ -109,7 +108,7 @@ func TestFailedPacket%10X(t *testing.T) {
} }
` `
func SaveUnCodeAbleAsTest(d proto_base.Direction, packet proto.UnCodablePacket) { func SaveUnCodeAbleAsTest(d proto_base.Direction, packet *proto.UnCodablePacket) {
hUntrimmed := sha256.Sum256(packet.Data) hUntrimmed := sha256.Sum256(packet.Data)
h := hUntrimmed[:8] h := hUntrimmed[:8]
f, err := os.Create(fmt.Sprintf(".failed_packets/%v_%10x_test.go", len(packet.Data), h)) f, err := os.Create(fmt.Sprintf(".failed_packets/%v_%10x_test.go", len(packet.Data), h))
@@ -145,7 +144,7 @@ func main() {
if err != nil { if err != nil {
return return
} }
c, err := modules.ConnectAndLogin("127.0.0.1:25566", acc) c, err := client.ConnectAndLogin("127.0.0.1:25566", acc)
if err != nil { if err != nil {
return return
} }