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) {
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()
},
}

View File

@ -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
}

View File

@ -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),

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}
}
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)

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
},