This commit is contained in:
olebeck 2023-02-08 12:00:36 +01:00
parent a306a6e77f
commit 2251d7096d
15 changed files with 154 additions and 100 deletions

View File

@ -176,11 +176,11 @@ func (c *TransCMD) Usage() string {
func (c *TransCMD) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
const (
BlackFg = "\033[30m"
Bold = "\033[1m"
Blue = "\033[46m"
Pink = "\033[45m"
White = "\033[47m"
Reset = "\033[0m"
Bold = "\033[1m"
Blue = "\033[46m"
Pink = "\033[45m"
White = "\033[47m"
Reset = "\033[0m"
)
if c.auth {
utils.GetTokenSource()

12
go.mod
View File

@ -3,10 +3,10 @@ module github.com/bedrock-tool/bedrocktool
go 1.19
//replace github.com/sandertv/gophertunnel => ./gophertunnel
replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.2
replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.27.2-1
//replace github.com/df-mc/dragonfly => ./dragonfly
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-11
replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.2-1
require (
github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21
@ -21,11 +21,11 @@ require (
github.com/miekg/dns v1.1.50
github.com/nicksnyder/go-i18n/v2 v2.2.1
github.com/sanbornm/go-selfupdate v0.0.0-20210106163404-c9b625feac49
github.com/sandertv/gophertunnel v1.26.1
github.com/sandertv/gophertunnel v1.27.2
github.com/sirupsen/logrus v1.9.0
golang.design/x/lockfree v0.0.1
golang.org/x/crypto v0.5.0
golang.org/x/exp v0.0.0-20230125214544-b3c2aaf6208d
golang.org/x/exp v0.0.0-20230206171751-46f607a40771
golang.org/x/image v0.3.0
golang.org/x/oauth2 v0.4.0
golang.org/x/text v0.6.0
@ -34,6 +34,8 @@ require (
require (
github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 // indirect
github.com/changkun/lockfree v0.0.1 // indirect
github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 // indirect
github.com/df-mc/atomic v1.10.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
@ -47,7 +49,7 @@ require (
go.uber.org/atomic v1.10.0 // indirect
golang.org/x/mod v0.7.0 // indirect
golang.org/x/net v0.5.0 // indirect
golang.org/x/sys v0.4.0 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/tools v0.5.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect

39
go.sum
View File

@ -15,8 +15,6 @@ github.com/df-mc/atomic v1.10.0 h1:0ZuxBKwR/hxcFGorKiHIp+hY7hgY+XBTzhCYD2NqSEg=
github.com/df-mc/atomic v1.10.0/go.mod h1:Gw9rf+rPIbydMjA329Jn4yjd/O2c/qusw3iNp4tFGSc=
github.com/df-mc/goleveldb v1.1.9 h1:ihdosZyy5jkQKrxucTQmN90jq/2lUwQnJZjIYIC/9YU=
github.com/df-mc/goleveldb v1.1.9/go.mod h1:+NHCup03Sci5q84APIA21z3iPZCuk6m6ABtg4nANCSk=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/flytam/filenamify v1.1.2 h1:dGlfWU4zrhDlsmvob4IFcfgjG5vIjfo4UwLyec6Wx94=
@ -45,22 +43,12 @@ github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UHp+gOc=
github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo=
github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
@ -70,16 +58,12 @@ github.com/muhammadmuzzammil1998/jsonc v1.0.0 h1:8o5gBQn4ZA3NBA9DlTujCj2a4w0tqWr
github.com/muhammadmuzzammil1998/jsonc v1.0.0/go.mod h1:saF2fIVw4banK0H4+/EuqfFLpRnoy5S+ECwTOCcRcSU=
github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYojM/PaA=
github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0=
github.com/olebeck/dragonfly v0.9.1-7 h1:2YECeaLboPrlC5mh8l6/W4tKhHPePmfOjjEUEXFXbxo=
github.com/olebeck/dragonfly v0.9.1-7/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/dragonfly v0.9.1-8 h1:93wppl6j81r6DF60IdbDn+SjdIkjeWI70SAOfjAs+L0=
github.com/olebeck/dragonfly v0.9.1-8/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/dragonfly v0.9.1-9 h1:hTzWQ+TzZQOtWI1DmYHOzUvA97lppctKUqEMobuur4Y=
github.com/olebeck/dragonfly v0.9.1-9/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/dragonfly v0.9.1-10 h1:mAVAdnxtDhZwY1YudQ0g0qpqZJTyE1eapI3uKkBhe3Y=
github.com/olebeck/dragonfly v0.9.1-10/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/gophertunnel v1.26.2 h1:AbiZcmeR5LenSJ5NX/2BPxLC3ddlvgWjrjouPmOB6BA=
github.com/olebeck/gophertunnel v1.26.2/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o=
github.com/olebeck/dragonfly v0.9.1-11 h1:vqcOKA7kp6qpOrRSg3chircACY6SBZGpAEyRs8oaS3o=
github.com/olebeck/dragonfly v0.9.1-11/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0=
github.com/olebeck/dragonfly v0.9.2-1 h1:/bYHMZ2yvwrLp2SQvsupbRimqDPGJ5utA2Oq8575IEk=
github.com/olebeck/dragonfly v0.9.2-1/go.mod h1:hGGjGbLxpcn7nVTZOrk8kPfeGGntaMOqqcbuugZauyI=
github.com/olebeck/gophertunnel v1.27.2-1 h1:p+q8XubWgnk37uhjO2e06+A4g7S91jyXbvkQlVL4Xb4=
github.com/olebeck/gophertunnel v1.27.2-1/go.mod h1:hgVpDdaLDP/39Z/YqEU0WFi/DHRDHqvBs3XGqkB4tnU=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@ -107,10 +91,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
golang.org/x/exp v0.0.0-20230113213754-f9f960f08ad4 h1:CNkDRtCj8otM5CFz5jYvbr8ioXX8flVsLfDWEj0M5kk=
golang.org/x/exp v0.0.0-20230113213754-f9f960f08ad4/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20230125214544-b3c2aaf6208d h1:9Bio0JlZpJ1P4NXsK5i8Rf2MclrRzMGzJWOIkhZ5Um8=
golang.org/x/exp v0.0.0-20230125214544-b3c2aaf6208d/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg=
golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
@ -138,8 +122,6 @@ golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -152,6 +134,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -178,9 +162,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa h1:drvf2JoUL1fz3ttkGNkw+rf3kZa2//7XkYGpSO4NHNA=

View File

@ -32,6 +32,7 @@ func dumpPacket(f io.WriteCloser, toServer bool, payload []byte) {
packetSize := uint32(len(payload))
binary.Write(f, binary.LittleEndian, packetSize)
binary.Write(f, binary.LittleEndian, toServer)
binary.Write(f, binary.LittleEndian, time.Now().UnixMilli())
n, err := f.Write(payload)
if err != nil {
logrus.Error(err)
@ -72,6 +73,7 @@ func (c *CaptureCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interfac
return 1
}
defer fio.Close()
utils.WriteReplayHeader(fio)
proxy := utils.NewProxy()
proxy.PacketFunc = func(header packet.Header, payload []byte, src, dst net.Addr) {

View File

@ -47,7 +47,7 @@ func (c *ChatLogCMD) Execute(ctx context.Context, flags *flag.FlagSet, _ ...inte
defer f.Close()
proxy := utils.NewProxy()
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
if text, ok := pk.(*packet.Text); ok {
logLine := text.Message
if c.verbose {

View File

@ -5,6 +5,7 @@ import (
"flag"
"fmt"
"os"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
@ -43,7 +44,7 @@ func (c *SkinProxyCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interf
os.MkdirAll(out_path, 0o755)
proxy := utils.NewProxy()
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
if !toServer {
process_packet_skins(proxy.Client, out_path, pk, c.filter, c.only_with_geometry)
}

View File

@ -13,6 +13,7 @@ import (
"os"
"path"
"strings"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
@ -287,7 +288,7 @@ func (c *SkinCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}
os.MkdirAll(out_path, 0o755)
}
p.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
p.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
if !toServer {
process_packet_skins(nil, out_path, pk, c.filter, false)
}

View File

@ -34,7 +34,7 @@ func (w *WorldState) processLevelChunk(pk *packet.LevelChunk) {
logrus.Info(locale.Loc("empty_chunk", nil))
return
}
ch, blockNBTs, err := chunk.NetworkDecode(world.AirRID(), pk.RawPayload, int(pk.SubChunkCount), w.Dim.Range(), w.ispre118, w.bp != nil)
ch, blockNBTs, err := chunk.NetworkDecode(world.AirRID(), pk.RawPayload, int(pk.SubChunkCount), w.Dim.Range(), w.ispre118, w.bp.HasBlocks())
if err != nil {
logrus.Error(err)
return

View File

@ -91,17 +91,19 @@ func NewMapUI(w *WorldState) *MapUI {
func (m *MapUI) Start() {
// init map
if err := m.w.proxy.Client.WritePacket(&packet.ClientBoundMapItemData{
MapID: ViewMapID,
Scale: 4,
MapsIncludedIn: []int64{ViewMapID},
Width: 0,
Height: 0,
Pixels: nil,
UpdateFlags: packet.MapUpdateFlagInitialisation,
}); err != nil {
logrus.Error(err)
return
if m.w.proxy.Client != nil {
if err := m.w.proxy.Client.WritePacket(&packet.ClientBoundMapItemData{
MapID: ViewMapID,
Scale: 4,
MapsIncludedIn: []int64{ViewMapID},
Width: 0,
Height: 0,
Pixels: nil,
UpdateFlags: packet.MapUpdateFlagInitialisation,
}); err != nil {
logrus.Error(err)
return
}
}
m.ticker = time.NewTicker(33 * time.Millisecond)

View File

@ -14,6 +14,7 @@ import (
"path"
"strconv"
"strings"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/bedrock-tool/bedrocktool/utils"
@ -146,7 +147,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
proxy := utils.NewProxy()
proxy.AlwaysGetPacks = true
proxy.ConnectCB = w.OnConnect
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) {
proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
forward := true
if toServer {

View File

@ -71,8 +71,16 @@ func (bp *BehaviourPack) CheckAddLink(pack utils.Pack) {
bp.AddDependency(h.UUID, h.Version)
}
func (bp *BehaviourPack) HasBlocks() bool {
return len(bp.blocks) > 0
}
func (bp *BehaviourPack) HasItems() bool {
return len(bp.items) > 0
}
func (bp *BehaviourPack) HasContent() bool {
return len(bp.blocks) > 0 || len(bp.items) > 0
return bp.HasBlocks() || bp.HasItems()
}
func ns_name_split(identifier string) (ns, name string) {

View File

@ -44,8 +44,7 @@ func DrawImgScaledPos(dst *image.RGBA, src *image.RGBA, bottomLeft image.Point,
for yOut := bottomLeft.Y; yOut < bottomLeft.Y+sizeScaled; yOut++ {
xIn := (xOut - bottomLeft.X) * ratio
yIn := (yOut - bottomLeft.Y) * ratio
c := src.At(xIn, yIn)
dst.Set(xOut, yOut, c)
dst.Set(xOut, yOut, src.At(xIn, yIn))
}
}
}

View File

@ -32,7 +32,7 @@ func UserInput(ctx context.Context, q string) (string, bool) {
}
}
func serverURLToName(server string) string {
func serverGetHostname(server string) string {
host, _, err := net.SplitHostPort(server)
if err != nil {
logrus.Fatalf(locale.Loc("invalid_server", locale.Strmap{"Err": err.Error()}))
@ -40,8 +40,25 @@ func serverURLToName(server string) string {
return host
}
func ServerInput(ctx context.Context, server string) (address, name string, err error) {
if server == "" { // no arg provided, interactive input
var (
realmRegex = regexp.MustCompile("realm:(?P<Name>.*)(?::(?P<ID>.*))?")
pcapRegex = regexp.MustCompile(`(?P<Filename>(?P<Name>.*)\.pcap2)(?:\?(?P<Args>.*))?`)
)
func regexGetParams(r *regexp.Regexp, s string) (params map[string]string) {
match := r.FindStringSubmatch(s)
params = make(map[string]string)
for i, name := range r.SubexpNames() {
if i > 0 && i <= len(match) {
params[name] = match[i]
}
}
return params
}
func ServerInput(ctx context.Context, server string) (string, string, error) {
// no arg provided, interactive input
if server == "" {
var cancelled bool
server, cancelled = UserInput(ctx, locale.Loc("enter_server", nil))
if cancelled {
@ -49,30 +66,31 @@ func ServerInput(ctx context.Context, server string) (address, name string, err
}
}
if strings.HasPrefix(server, "realm:") { // for realms use api to get ip address
realmInfo := strings.Split(server, ":")
id := ""
if len(realmInfo) == 3 {
id = realmInfo[2]
}
name, address, err = getRealm(ctx, realmInfo[1], id)
// realm
if realmRegex.MatchString(server) {
p := regexGetParams(realmRegex, server)
name, address, err := getRealm(ctx, p["Name"], p["ID"])
if err != nil {
return "", "", err
}
name = CleanupName(name)
} else if strings.HasSuffix(server, ".pcap") || strings.HasSuffix(server, ".pcap2") {
s := strings.Split(server, ".")
name = strings.Join(s[:len(s)-1], ".")
address = server
} else {
// if an actual server address if given
// add port if necessary
address = server
if len(strings.Split(address, ":")) == 1 {
address += ":19132"
}
name = serverURLToName(address)
return address, CleanupName(name), nil
}
return address, name, nil
// old pcap format
if match, _ := regexp.MatchString(`.*\.pcap$`, server); match {
return "", "", fmt.Errorf(locale.Loc("not_supported_anymore", nil))
}
// new pcap format
if pcapRegex.MatchString(server) {
p := regexGetParams(pcapRegex, server)
return "PCAP!" + p["Filename"], p["Name"], nil
}
// normal server dns or ip
if len(strings.Split(server, ":")) == 1 {
server += ":19132"
}
return server, serverGetHostname(server), nil
}

View File

@ -7,6 +7,7 @@ import (
"net"
"strings"
"sync"
"time"
"github.com/bedrock-tool/bedrocktool/locale"
"github.com/sandertv/gophertunnel/minecraft"
@ -53,7 +54,7 @@ type ProxyContext struct {
type (
PacketFunc func(header packet.Header, payload []byte, src, dst net.Addr)
PacketCallback func(pk packet.Packet, proxy *ProxyContext, toServer bool) (packet.Packet, error)
PacketCallback func(pk packet.Packet, proxy *ProxyContext, toServer bool, timeReceived time.Time) (packet.Packet, error)
ConnectCallback func(proxy *ProxyContext)
)
@ -84,7 +85,7 @@ func (p *ProxyContext) AddCommand(cmd IngameCommand) {
p.commands[cmd.Cmd.Name] = cmd
}
func (p *ProxyContext) CommandHandlerPacketCB(pk packet.Packet, proxy *ProxyContext, toServer bool) (packet.Packet, error) {
func (p *ProxyContext) CommandHandlerPacketCB(pk packet.Packet, proxy *ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) {
switch _pk := pk.(type) {
case *packet.CommandRequest:
cmd := strings.Split(_pk.CommandLine, " ")
@ -128,7 +129,7 @@ func (p *ProxyContext) proxyLoop(ctx context.Context, toServer bool, packetCBs [
}
for _, packetCB := range packetCBs {
pk, err = packetCB(pk, p, toServer)
pk, err = packetCB(pk, p, toServer, time.Now())
if err != nil {
return err
}
@ -155,11 +156,8 @@ func NewProxy() *ProxyContext {
var ClientAddr net.Addr
func (p *ProxyContext) Run(ctx context.Context, serverAddress string) (err error) {
if strings.HasSuffix(serverAddress, ".pcap") {
return fmt.Errorf(locale.Loc("not_supported_anymore", nil))
}
if strings.HasSuffix(serverAddress, ".pcap2") {
return createReplayConnection(ctx, serverAddress, p.ConnectCB, p.PacketCB)
if strings.HasPrefix(serverAddress, "PCAP!") {
return createReplayConnection(ctx, serverAddress[5:], p.ConnectCB, p.PacketCB)
}
GetTokenSource() // ask for login before listening

View File

@ -4,9 +4,11 @@ import (
"bytes"
"context"
"encoding/binary"
"fmt"
"io"
"net"
"os"
"time"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol"
@ -14,6 +16,24 @@ import (
"github.com/sirupsen/logrus"
)
type replayHeader struct {
Version int32
}
var replayMagic = []byte("BTCP")
const (
currentReplayVersion = 2
)
func WriteReplayHeader(f io.Writer) {
f.Write(replayMagic)
header := replayHeader{
Version: currentReplayVersion,
}
binary.Write(f, binary.LittleEndian, &header)
}
func createReplayConnection(ctx context.Context, filename string, onConnect ConnectCallback, packetCB PacketCallback) error {
logrus.Infof("Reading replay %s", filename)
@ -21,13 +41,26 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn
if err != nil {
return err
}
var size int64
{
stat, err := f.Stat()
if err != nil {
stat, err := f.Stat()
if err != nil {
return err
}
totalSize := stat.Size()
// default version is version 1, since that didnt have a header
ver := 1
magic := make([]byte, 4)
io.ReadAtLeast(f, magic, 4)
if bytes.Equal(magic, replayMagic) {
var header replayHeader
if err := binary.Read(f, binary.LittleEndian, &header); err != nil {
return err
}
size = stat.Size()
ver = int(header.Version)
} else {
logrus.Info("Version 1 capture assumed.")
f.Seek(-4, io.SeekCurrent)
}
proxy := NewProxy()
@ -40,19 +73,26 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn
var magic uint32 = 0
var packetLength uint32 = 0
var toServer bool = false
timeReceived := time.Now()
offset, _ := f.Seek(0, io.SeekCurrent)
if offset == size {
if offset == totalSize {
logrus.Info("Reached End")
return nil
}
binary.Read(f, binary.LittleEndian, &magic)
if magic != 0xAAAAAAAA {
logrus.Fatal("Wrong Magic")
return fmt.Errorf("wrong Magic")
}
binary.Read(f, binary.LittleEndian, &packetLength)
binary.Read(f, binary.LittleEndian, &toServer)
if ver >= 2 {
var timeMs int64
binary.Read(f, binary.LittleEndian, &timeMs)
timeReceived = time.UnixMilli(timeMs)
}
payload := make([]byte, packetLength)
n, err := f.Read(payload)
if err != nil {
@ -60,14 +100,13 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn
return nil
}
if n != int(packetLength) {
logrus.Errorf("Truncated %d", i)
return nil
return fmt.Errorf("truncated %d", i)
}
var magic2 uint32
binary.Read(f, binary.LittleEndian, &magic2)
if magic2 != 0xBBBBBBBB {
logrus.Fatal("Wrong Magic2")
return fmt.Errorf("wrong Magic2")
}
pkData, err := minecraft.ParseData(payload, proxy.Server)
@ -91,7 +130,7 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn
if gameStarted {
if packetCB != nil {
packetCB(pk, proxy, toServer)
packetCB(pk, proxy, toServer, timeReceived)
}
} else {
switch pk := pk.(type) {