fix multi worlds
This commit is contained in:
parent
bf786b1010
commit
32bfdfa319
|
@ -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()
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue