From 32bfdfa3193aa1fbe1a5222268190c238abebcbb Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Tue, 4 Apr 2023 03:51:13 +0200 Subject: [PATCH] fix multi worlds --- handlers/capture.go | 4 +++- {utils => handlers}/packet_logger.go | 35 ++++++++++++++-------------- handlers/worlds/world.go | 2 +- utils/chunk_render.go | 3 --- utils/proxy.go | 24 ++++++++++++------- utils/replay.go | 16 ++++++------- utils/utils.go | 11 +-------- 7 files changed, 47 insertions(+), 48 deletions(-) rename {utils => handlers}/packet_logger.go (91%) diff --git a/handlers/capture.go b/handlers/capture.go index c02e7b0..a74ea6f 100644 --- a/handlers/capture.go +++ b/handlers/capture.go @@ -45,7 +45,7 @@ func (p *packetCapturer) AddressAndName(address, hostname string) error { } func (p *packetCapturer) PacketFunc(header packet.Header, payload []byte, src, dst net.Addr) { - IsfromClient := utils.ClientAddr.String() == src.String() + IsfromClient := p.proxy.IsClient(src) buf := bytes.NewBuffer(nil) header.Write(buf) @@ -63,6 +63,8 @@ func NewPacketCapturer() *utils.ProxyHandler { AddressAndName: p.AddressAndName, PacketFunc: p.PacketFunc, OnEnd: func() { + dumpLock.Lock() + defer dumpLock.Unlock() p.fio.Close() }, } diff --git a/utils/packet_logger.go b/handlers/packet_logger.go similarity index 91% rename from utils/packet_logger.go rename to handlers/packet_logger.go index a56ce4f..fb480ec 100644 --- a/utils/packet_logger.go +++ b/handlers/packet_logger.go @@ -1,4 +1,4 @@ -package utils +package handlers import ( "bufio" @@ -11,6 +11,7 @@ import ( "strings" "sync" + "github.com/bedrock-tool/bedrocktool/utils" "github.com/bedrock-tool/bedrocktool/utils/crypt" "github.com/fatih/color" "github.com/sandertv/gophertunnel/minecraft/protocol" @@ -181,10 +182,11 @@ func DumpStruct(data interface{}) { FLog.Write([]byte("\n\n\n")) } -var ClientAddr net.Addr +var dirS2C = color.GreenString("S") + "->" + color.CyanString("C") +var dirC2S = color.CyanString("C") + "->" + color.GreenString("S") var pool = packet.NewPool() -func NewDebugLogger(extraVerbose bool) *ProxyHandler { +func NewDebugLogger(extraVerbose bool) *utils.ProxyHandler { var logPlain, logCrypt, logCryptEnc io.WriteCloser var packetsLogF *bufio.Writer @@ -209,8 +211,13 @@ func NewDebugLogger(extraVerbose bool) *ProxyHandler { packetsLogF = bufio.NewWriter(io.MultiWriter(logPlain, logCryptEnc)) } - return &ProxyHandler{ + var proxy *utils.ProxyContext + + return &utils.ProxyHandler{ Name: "Debug", + ProxyRef: func(pc *utils.ProxyContext) { + proxy = pc + }, PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) { var pk packet.Packet if pkFunc, ok := pool[header.PacketID]; ok { @@ -234,21 +241,10 @@ func NewDebugLogger(extraVerbose bool) *ProxyHandler { pkName := reflect.TypeOf(pk).String()[1:] if !slices.Contains(MutedPackets, pkName) { - dirS2C := color.GreenString("S") + "->" + color.CyanString("C") - dirC2S := color.CyanString("C") + "->" + color.GreenString("S") var dir string = dirS2C - - if ClientAddr != nil { - if src == ClientAddr { - dir = dirC2S - } - } else { - srcAddr, _, _ := net.SplitHostPort(src.String()) - if IPPrivate(net.ParseIP(srcAddr)) { - dir = dirS2C - } + if proxy.IsClient(src) { + dir = dirC2S } - logrus.Debugf("%s 0x%02x, %s", dir, pk.ID(), pkName) } }, @@ -268,3 +264,8 @@ func NewDebugLogger(extraVerbose bool) *ProxyHandler { }, } } + +func init() { + // hacky solution to allow proxy to add this + utils.NewDebugLogger = NewDebugLogger +} diff --git a/handlers/worlds/world.go b/handlers/worlds/world.go index a34b623..8e98089 100644 --- a/handlers/worlds/world.go +++ b/handlers/worlds/world.go @@ -223,7 +223,7 @@ func (w *worldsHandler) CurrentName() string { func (w *worldsHandler) Reset(newName string) { w.worldState = worldState{ - dimension: nil, + dimension: w.worldState.dimension, chunks: make(map[protocol.ChunkPos]*chunk.Chunk), blockNBT: make(map[protocol.SubChunkPos][]map[string]any), entities: make(map[uint64]*entityState), diff --git a/utils/chunk_render.go b/utils/chunk_render.go index a085d31..48a2bb1 100644 --- a/utils/chunk_render.go +++ b/utils/chunk_render.go @@ -21,9 +21,6 @@ func blockColorAt(c *chunk.Chunk, x uint8, y int16, z uint8) (blockColor color.R return color.RGBA{0, 0, 0, 0} } rid := c.Block(x, y, z, 0) - if rid == 0 && y == int16(c.Range().Min()) { // void - return color.RGBA{0, 0, 0, 255} - } blockColor = color.RGBA{255, 0, 255, 255} b, found := world.BlockByRuntimeID(rid) diff --git a/utils/proxy.go b/utils/proxy.go index 771fadc..ddc0ac6 100644 --- a/utils/proxy.go +++ b/utils/proxy.go @@ -78,15 +78,17 @@ type ProxyHandler struct { } type ProxyContext struct { - Server *minecraft.Conn - Client *minecraft.Conn - Listener *minecraft.Listener - commands map[string]IngameCommand + Server *minecraft.Conn + Client *minecraft.Conn + clientAddr net.Addr + Listener *minecraft.Listener + AlwaysGetPacks bool WithClient bool IgnoreDisconnect bool CustomClientData *login.ClientData + commands map[string]IngameCommand handlers []*ProxyHandler } @@ -274,7 +276,17 @@ func (p *ProxyContext) proxyLoop(ctx context.Context, toServer bool) error { } } +func (p *ProxyContext) IsClient(addr net.Addr) bool { + return p.clientAddr.String() == addr.String() +} + +var NewDebugLogger func(bool) *ProxyHandler + func (p *ProxyContext) Run(ctx context.Context, serverAddress, name string) (err error) { + if Options.Debug || Options.ExtraDebug { + p.AddHandler(NewDebugLogger(Options.ExtraDebug)) + } + for _, handler := range p.handlers { if handler.AddressAndName != nil { handler.AddressAndName(serverAddress, name) @@ -284,10 +296,6 @@ func (p *ProxyContext) Run(ctx context.Context, serverAddress, name string) (err } } - if Options.Debug || Options.ExtraDebug { - p.AddHandler(NewDebugLogger(Options.ExtraDebug)) - } - if strings.HasPrefix(serverAddress, "PCAP!") { return createReplayConnection(ctx, serverAddress[5:], p) } diff --git a/utils/replay.go b/utils/replay.go index 71f2192..2050d06 100644 --- a/utils/replay.go +++ b/utils/replay.go @@ -68,7 +68,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo }, &net.UDPAddr{ IP: net.IPv4(2, 2, 2, 2), } - ClientAddr = client + proxy.clientAddr = client proxy.Server = minecraft.NewConn() @@ -84,7 +84,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo offset, _ := f.Seek(0, io.SeekCurrent) if offset == totalSize { logrus.Info("Reached End") - return nil + break } binary.Read(f, binary.LittleEndian, &magic) @@ -103,7 +103,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo n, err := f.Read(payload) if err != nil { logrus.Error(err) - return nil + break } if n != int(packetLength) { return fmt.Errorf("truncated %d", i) @@ -194,11 +194,11 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo } } } - - for _, handler := range proxy.handlers { - if handler.OnEnd != nil { - handler.OnEnd() - } + } + for _, handler := range proxy.handlers { + if handler.OnEnd != nil { + handler.OnEnd() } } + return nil } diff --git a/utils/utils.go b/utils/utils.go index f14aaed..b1a27dc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -8,7 +8,6 @@ import ( "crypto/sha256" "encoding/json" "errors" - "net" "os" "path" "regexp" @@ -23,7 +22,6 @@ import ( //"github.com/sandertv/gophertunnel/minecraft/gatherings" "github.com/sandertv/gophertunnel/minecraft/protocol/login" - "github.com/sandertv/gophertunnel/minecraft/protocol/packet" "github.com/sandertv/gophertunnel/minecraft/resource" ) @@ -65,14 +63,7 @@ func connectServer(ctx context.Context, address string, ClientData *login.Client serverConn, err = minecraft.Dialer{ TokenSource: GetTokenSource(), ClientData: cd, - PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) { - if header.PacketID == packet.IDRequestNetworkSettings { - ClientAddr = src - } - if packetFunc != nil { - packetFunc(header, payload, src, dst) - } - }, + PacketFunc: packetFunc, DownloadResourcePack: func(id uuid.UUID, version string, current int, total int) bool { return wantPacks },