fix multi worlds

This commit is contained in:
olebeck 2023-04-04 03:51:13 +02:00
parent bf786b1010
commit 32bfdfa319
7 changed files with 47 additions and 48 deletions

View File

@ -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) { 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) buf := bytes.NewBuffer(nil)
header.Write(buf) header.Write(buf)
@ -63,6 +63,8 @@ func NewPacketCapturer() *utils.ProxyHandler {
AddressAndName: p.AddressAndName, AddressAndName: p.AddressAndName,
PacketFunc: p.PacketFunc, PacketFunc: p.PacketFunc,
OnEnd: func() { OnEnd: func() {
dumpLock.Lock()
defer dumpLock.Unlock()
p.fio.Close() p.fio.Close()
}, },
} }

View File

@ -1,4 +1,4 @@
package utils package handlers
import ( import (
"bufio" "bufio"
@ -11,6 +11,7 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/bedrock-tool/bedrocktool/utils"
"github.com/bedrock-tool/bedrocktool/utils/crypt" "github.com/bedrock-tool/bedrocktool/utils/crypt"
"github.com/fatih/color" "github.com/fatih/color"
"github.com/sandertv/gophertunnel/minecraft/protocol" "github.com/sandertv/gophertunnel/minecraft/protocol"
@ -181,10 +182,11 @@ func DumpStruct(data interface{}) {
FLog.Write([]byte("\n\n\n")) 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() var pool = packet.NewPool()
func NewDebugLogger(extraVerbose bool) *ProxyHandler { func NewDebugLogger(extraVerbose bool) *utils.ProxyHandler {
var logPlain, logCrypt, logCryptEnc io.WriteCloser var logPlain, logCrypt, logCryptEnc io.WriteCloser
var packetsLogF *bufio.Writer var packetsLogF *bufio.Writer
@ -209,8 +211,13 @@ func NewDebugLogger(extraVerbose bool) *ProxyHandler {
packetsLogF = bufio.NewWriter(io.MultiWriter(logPlain, logCryptEnc)) packetsLogF = bufio.NewWriter(io.MultiWriter(logPlain, logCryptEnc))
} }
return &ProxyHandler{ var proxy *utils.ProxyContext
return &utils.ProxyHandler{
Name: "Debug", Name: "Debug",
ProxyRef: func(pc *utils.ProxyContext) {
proxy = pc
},
PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) { PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) {
var pk packet.Packet var pk packet.Packet
if pkFunc, ok := pool[header.PacketID]; ok { if pkFunc, ok := pool[header.PacketID]; ok {
@ -234,21 +241,10 @@ func NewDebugLogger(extraVerbose bool) *ProxyHandler {
pkName := reflect.TypeOf(pk).String()[1:] pkName := reflect.TypeOf(pk).String()[1:]
if !slices.Contains(MutedPackets, pkName) { if !slices.Contains(MutedPackets, pkName) {
dirS2C := color.GreenString("S") + "->" + color.CyanString("C")
dirC2S := color.CyanString("C") + "->" + color.GreenString("S")
var dir string = dirS2C var dir string = dirS2C
if proxy.IsClient(src) {
if ClientAddr != nil { dir = dirC2S
if src == ClientAddr {
dir = dirC2S
}
} else {
srcAddr, _, _ := net.SplitHostPort(src.String())
if IPPrivate(net.ParseIP(srcAddr)) {
dir = dirS2C
}
} }
logrus.Debugf("%s 0x%02x, %s", dir, pk.ID(), pkName) 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
}

View File

@ -223,7 +223,7 @@ func (w *worldsHandler) CurrentName() string {
func (w *worldsHandler) Reset(newName string) { func (w *worldsHandler) Reset(newName string) {
w.worldState = worldState{ w.worldState = worldState{
dimension: nil, dimension: w.worldState.dimension,
chunks: make(map[protocol.ChunkPos]*chunk.Chunk), chunks: make(map[protocol.ChunkPos]*chunk.Chunk),
blockNBT: make(map[protocol.SubChunkPos][]map[string]any), blockNBT: make(map[protocol.SubChunkPos][]map[string]any),
entities: make(map[uint64]*entityState), entities: make(map[uint64]*entityState),

View File

@ -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} return color.RGBA{0, 0, 0, 0}
} }
rid := c.Block(x, y, z, 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} blockColor = color.RGBA{255, 0, 255, 255}
b, found := world.BlockByRuntimeID(rid) b, found := world.BlockByRuntimeID(rid)

View File

@ -78,15 +78,17 @@ type ProxyHandler struct {
} }
type ProxyContext struct { type ProxyContext struct {
Server *minecraft.Conn Server *minecraft.Conn
Client *minecraft.Conn Client *minecraft.Conn
Listener *minecraft.Listener clientAddr net.Addr
commands map[string]IngameCommand Listener *minecraft.Listener
AlwaysGetPacks bool AlwaysGetPacks bool
WithClient bool WithClient bool
IgnoreDisconnect bool IgnoreDisconnect bool
CustomClientData *login.ClientData CustomClientData *login.ClientData
commands map[string]IngameCommand
handlers []*ProxyHandler 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) { 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 { for _, handler := range p.handlers {
if handler.AddressAndName != nil { if handler.AddressAndName != nil {
handler.AddressAndName(serverAddress, name) 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!") { if strings.HasPrefix(serverAddress, "PCAP!") {
return createReplayConnection(ctx, serverAddress[5:], p) return createReplayConnection(ctx, serverAddress[5:], p)
} }

View File

@ -68,7 +68,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo
}, &net.UDPAddr{ }, &net.UDPAddr{
IP: net.IPv4(2, 2, 2, 2), IP: net.IPv4(2, 2, 2, 2),
} }
ClientAddr = client proxy.clientAddr = client
proxy.Server = minecraft.NewConn() proxy.Server = minecraft.NewConn()
@ -84,7 +84,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo
offset, _ := f.Seek(0, io.SeekCurrent) offset, _ := f.Seek(0, io.SeekCurrent)
if offset == totalSize { if offset == totalSize {
logrus.Info("Reached End") logrus.Info("Reached End")
return nil break
} }
binary.Read(f, binary.LittleEndian, &magic) binary.Read(f, binary.LittleEndian, &magic)
@ -103,7 +103,7 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo
n, err := f.Read(payload) n, err := f.Read(payload)
if err != nil { if err != nil {
logrus.Error(err) logrus.Error(err)
return nil break
} }
if n != int(packetLength) { if n != int(packetLength) {
return fmt.Errorf("truncated %d", i) return fmt.Errorf("truncated %d", i)
@ -194,11 +194,11 @@ func createReplayConnection(ctx context.Context, filename string, proxy *ProxyCo
} }
} }
} }
}
for _, handler := range proxy.handlers { for _, handler := range proxy.handlers {
if handler.OnEnd != nil { if handler.OnEnd != nil {
handler.OnEnd() handler.OnEnd()
}
} }
} }
return nil
} }

View File

@ -8,7 +8,6 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/json" "encoding/json"
"errors" "errors"
"net"
"os" "os"
"path" "path"
"regexp" "regexp"
@ -23,7 +22,6 @@ import (
//"github.com/sandertv/gophertunnel/minecraft/gatherings" //"github.com/sandertv/gophertunnel/minecraft/gatherings"
"github.com/sandertv/gophertunnel/minecraft/protocol/login" "github.com/sandertv/gophertunnel/minecraft/protocol/login"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
"github.com/sandertv/gophertunnel/minecraft/resource" "github.com/sandertv/gophertunnel/minecraft/resource"
) )
@ -65,14 +63,7 @@ func connectServer(ctx context.Context, address string, ClientData *login.Client
serverConn, err = minecraft.Dialer{ serverConn, err = minecraft.Dialer{
TokenSource: GetTokenSource(), TokenSource: GetTokenSource(),
ClientData: cd, ClientData: cd,
PacketFunc: func(header packet.Header, payload []byte, src, dst net.Addr) { PacketFunc: packetFunc,
if header.PacketID == packet.IDRequestNetworkSettings {
ClientAddr = src
}
if packetFunc != nil {
packetFunc(header, payload, src, dst)
}
},
DownloadResourcePack: func(id uuid.UUID, version string, current int, total int) bool { DownloadResourcePack: func(id uuid.UUID, version string, current int, total int) bool {
return wantPacks return wantPacks
}, },