From d7b559a7a889e018c2d80a59743f43529cb02f02 Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Thu, 23 Mar 2023 20:39:47 +0100 Subject: [PATCH] 1.19.70 --- go.mod | 6 +- go.sum | 12 +++ subcommands/chat_log.go | 4 +- subcommands/realms-list.go | 30 ++++++ subcommands/resourcepack-d/resourcepack-d.go | Bin 5423 -> 5400 bytes subcommands/skins/skins.go | 6 +- subcommands/world/chunk.go | 39 ++++---- subcommands/world/chunk_render.go | 91 ++++++++++--------- subcommands/world/map_item.go | 57 ++++++------ subcommands/world/world.go | 25 +++-- ui/gui/pages/settings/settings.go | 1 - ui/gui/pages/skins/skins.go | 10 +- ui/gui/pages/worlds/worlds.go | 18 ++-- utils/packet_logger.go | 6 +- utils/proxy.go | 47 +++++----- utils/realms.go | 23 ----- utils/replay.go | 11 +-- 17 files changed, 199 insertions(+), 187 deletions(-) create mode 100644 subcommands/realms-list.go diff --git a/go.mod b/go.mod index c6dbcc3..dff90f5 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/bedrock-tool/bedrocktool go 1.20 //replace github.com/sandertv/gophertunnel => ./gophertunnel -replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.27.4-4 +replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.28.1-1 //replace github.com/df-mc/dragonfly => ./dragonfly -replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.3-6 +replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.3-8 replace gioui.org => github.com/olebeck/gio v0.0.0-20230321105529-d424f1a59af9 @@ -26,7 +26,7 @@ require ( github.com/nicksnyder/go-i18n/v2 v2.2.1 github.com/sanbornm/go-selfupdate v0.0.0-20210106163404-c9b625feac49 github.com/sandertv/go-raknet v1.12.0 - github.com/sandertv/gophertunnel v1.27.4 + github.com/sandertv/gophertunnel v1.28.1 github.com/sirupsen/logrus v1.9.0 golang.design/x/lockfree v0.0.1 golang.org/x/crypto v0.7.0 diff --git a/go.sum b/go.sum index 0aa34a0..3ff1862 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0 h1:bGG/g4ypjrCJoSvFrP5hafr git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE= github.com/benoitkugler/textlayout v0.3.0 h1:2ehWXEkgb6RUokTjXh1LzdGwG4dRP6X3dqhYYDYhUVk= github.com/benoitkugler/textlayout v0.3.0/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w= @@ -19,6 +20,8 @@ github.com/benoitkugler/textlayout-testdata v0.1.1 h1:AvFxBxpfrQd8v55qH59mZOJOQj github.com/benoitkugler/textlayout-testdata v0.1.1/go.mod h1:i/qZl09BbUOtd7Bu/W1CAubRwTWrEXWq6JwMkw8wYxo= github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 h1:/G0ghZwrhou0Wq21qc1vXXMm/t/aKWkALWwITptKbE0= github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9/go.mod h1:TOk10ahXejq9wkEaym3KPRNeuR/h5Jx+s8QRWIa2oTM= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/changkun/lockfree v0.0.1 h1:5WefVJLglY4IHRqOQmh6Ao6wkJYaJkarshKU8VUtId4= github.com/changkun/lockfree v0.0.1/go.mod h1:3bKiaXn/iNzIPlSvSOMSVbRQUQtAp8qUAyBUtzU11s4= github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 h1:Yg2hDs4b13Evkpj42FU2idX2cVXVFqQSheXYKM86Qsk= @@ -81,10 +84,18 @@ github.com/olebeck/dragonfly v0.9.3-5 h1:8MUpzKz1UZ0K+DJrywBV6C/ydGMggTxGg1n9VFA github.com/olebeck/dragonfly v0.9.3-5/go.mod h1:ODAzVcmM7KvKgPB89hoYndQiVVgTm9FlDXUko1H3YVs= github.com/olebeck/dragonfly v0.9.3-6 h1:ots1osXxuP6fQg4C8tt3y8xfpc+JNqOarI5zufisKFs= github.com/olebeck/dragonfly v0.9.3-6/go.mod h1:ODAzVcmM7KvKgPB89hoYndQiVVgTm9FlDXUko1H3YVs= +github.com/olebeck/dragonfly v0.9.3-7 h1:zIMWsox18efEe7R+VmJOTJRePU9x2YN3CE1uzfse1AM= +github.com/olebeck/dragonfly v0.9.3-7/go.mod h1:nnnmYWgSTNQb9x33nBthqN/2vyHlUaijfo+e2y3W5j4= +github.com/olebeck/dragonfly v0.9.3-8 h1:w514gGVTK2iv3TDI8EuzSCDHrF2Hv2f+/lIicW0J6Bg= +github.com/olebeck/dragonfly v0.9.3-8/go.mod h1:nnnmYWgSTNQb9x33nBthqN/2vyHlUaijfo+e2y3W5j4= github.com/olebeck/gio v0.0.0-20230321105529-d424f1a59af9 h1:TqDsMHwjW5ZYfh+RE8ussT62m0qXqo+QjzSXb7BCVA4= github.com/olebeck/gio v0.0.0-20230321105529-d424f1a59af9/go.mod h1:+W1Kpf96YcfissZocFqIp6O42FDTuphkObbEybp+Ffc= +github.com/olebeck/gophertunnel v1.27.4-3 h1:RktAdTNTvCFn6PQou0H3RyqrTo3/xH0bqODrHb/oXAs= +github.com/olebeck/gophertunnel v1.27.4-3/go.mod h1:ekREo7U9TPHh86kbuPMaWA93NMyWsfVvP/iNT3XhAb8= github.com/olebeck/gophertunnel v1.27.4-4 h1:ZzmZquRW0WdoH/smsOk91O+40dotn7574bID+BkHbuk= github.com/olebeck/gophertunnel v1.27.4-4/go.mod h1:ekREo7U9TPHh86kbuPMaWA93NMyWsfVvP/iNT3XhAb8= +github.com/olebeck/gophertunnel v1.28.1-1 h1:bw2jeMz94YHF5qQYhq1Yq/6fALkklGu7k26YbPI4DSs= +github.com/olebeck/gophertunnel v1.28.1-1/go.mod h1:ekREo7U9TPHh86kbuPMaWA93NMyWsfVvP/iNT3XhAb8= 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= @@ -98,6 +109,7 @@ github.com/sandertv/go-raknet v1.12.0 h1:olUzZlIJyX/pgj/mrsLCZYjKLNDsYiWdvQ4NIm3 github.com/sandertv/go-raknet v1.12.0/go.mod h1:Gx+WgZBMQ0V2UoouGoJ8Wj6CDrMBQ4SB2F/ggpl5/+Y= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/subcommands/chat_log.go b/subcommands/chat_log.go index 5a234f1..f05fcf6 100644 --- a/subcommands/chat_log.go +++ b/subcommands/chat_log.go @@ -43,13 +43,13 @@ func (c *ChatLogCMD) Execute(ctx context.Context, ui utils.UI) error { if err != nil { return err } - proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) { + proxy.PacketCB = func(pk packet.Packet, toServer bool, t time.Time) (packet.Packet, error) { if text, ok := pk.(*packet.Text); ok { logLine := text.Message if c.Verbose { logLine += fmt.Sprintf(" (TextType: %d | XUID: %s | PlatformChatID: %s)", text.TextType, text.XUID, text.PlatformChatID) } - f.WriteString(fmt.Sprintf("[%s] ", time.Now().Format(time.RFC3339))) + f.WriteString(fmt.Sprintf("[%s] ", t.Format(time.RFC3339))) logrus.Info(logLine) if toServer { f.WriteString("SENT: ") diff --git a/subcommands/realms-list.go b/subcommands/realms-list.go new file mode 100644 index 0000000..2bd5398 --- /dev/null +++ b/subcommands/realms-list.go @@ -0,0 +1,30 @@ +package subcommands + +import ( + "context" + "flag" + "fmt" + + "github.com/bedrock-tool/bedrocktool/locale" + "github.com/bedrock-tool/bedrocktool/utils" +) + +type RealmListCMD struct{} + +func (*RealmListCMD) Name() string { return "list-realms" } +func (*RealmListCMD) Synopsis() string { return locale.Loc("list_realms_synopsis", nil) } +func (c *RealmListCMD) SetFlags(f *flag.FlagSet) {} +func (c *RealmListCMD) Execute(ctx context.Context, ui utils.UI) error { + realms, err := utils.GetRealmsAPI().Realms(ctx) + if err != nil { + return err + } + for _, realm := range realms { + fmt.Println(locale.Loc("realm_list_line", locale.Strmap{"Name": realm.Name, "Id": realm.ID})) + } + return nil +} + +func init() { + utils.RegisterCommand(&RealmListCMD{}) +} diff --git a/subcommands/resourcepack-d/resourcepack-d.go b/subcommands/resourcepack-d/resourcepack-d.go index f7d3b065bf3a640a8882466b64a88a6296dfdd9d..ca60d6d68feea54ba0555f72ff82515ebd50f27f 100644 GIT binary patch literal 5400 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 C)Pw2( literal 5423 zcmV+~70~JcM@dveQdv+`061!&dx1|5Tc;lYW>M#V|rB0u?IZ$ykw1xg|gi4g(y2?rrR4E&h{#gD(F*BpKzL5N(#4I(BWk3G-i;t=X9 z78%7Zfe2>Sk)MKh+FuV%{-8aubn{2%f0;h_9NbF!T_q%G++tMf5c;8ApkL`I-1Sug zYP)hpZ`?N**5`M=pOUhLn0U?I;k{m&J)5bNrBWrB@G!n7NB=*IYnR=|G0WVF z32&!_QDzfh!J>(LG1w&)1FsHs2=qU`S&tUez z>QEIl3Y{-iW;{o4b%)%^o&-)y^_j_(-{2DD~9g% z=a)_Y`|cHr>Zud?kiHF#GyfuFoeaBJ+fnlV?OAE>Dtn-^z7KeX+&C+i=wWVm>pj=} zB`nx6q{^^7qb*NWl@M>AFJPsqDb?zBrp6;|%1q)2`Hn6PG5_f;CWl1ORfbT0>ieI~ z{D~g5h$|qOImkAnu>*kENbEnCwAZ{ZsmYrq2LnRncNw3HQp;Grs74oRElI0jzqnH1 zeieNfUtR196UVjKFi3W@HF_tu;?F#?z?G%pLwR}*EyHn<*y!Gmix&bs(+7GJ7VMNf zOCS(lHAN4A0J1LXRvo}uHC{`OOihj!9mjoyRYt2-N`JnaS!YBOmuuZ_zQm>nG8LbB zk+KiSRSD~I6Z0U4)EA^9d6ZmCAfK@q0Q<7a6cV1@iEH(^bn2`Dr_D)q^AdNHb&0id z-MXksit))|ZIZj@vzW`FDwZ8vM^y!LLKoyv66ap35CG3hev`xQGGSO+4WPhfBJTI2 zf{Cr6VR)_pH|Bte^81FhHF_oFJ4;AC@GADozTf^~2^mLf_OSy}D7$v>u+=W8-42m# zf_jij6E}dUdRqvB*+BR|Ox9#iV zrnah85;Z2G4RMc>a0K(}YcUtwjGh!TB^F-wbK`cQ)b8xkmfu#r0VAFu&+G$HkDiX4Fx(&jZqla70sM^jnk z$7n~KJO?{U$sUfdE}Mg64gXwZIhAcN2M@n%ncijfCeZ8fiU#6TpAE0R9?#PBBbEn< zKJ^aZ#iy8Q0MOb!USYAralq^{#Hg1Rsjw#s~)p|97Ob2hGTJ z$^boWfH+kjZ_OiZOybsbvISriR19a@O>Yf?HP^{&fLXP%aVJax-fuIS<;Bw~?_XPmJhea}0nxP@WsDt(v4+jVLN<>KFIg9I5L()^MEHTNQx{l<1Bj z-xQPWioRke2F}6;&&x0y$|ZbO3+rzix1!t_D;7kz%8yakz?qud7~Pim=tYNal|F1w zi#-?jTp$q0iQJI6>7IG~MlPe-O7&*(JZ)T4C|0Vk?AUd`^rBB?81ri@lippyq>orG ze$^5Wb@G*@dNpy z5+EYdfOw{6h}X<+s>C*qY`FLfx#V;CpV(scfsSq;1K%`+Cp`Fd3t5L@G?dzl?@AKr ziqv4r&c8}58m#{y=Ml^noJv2HEw^|hIJ3kcTz_<|wo^xoG~h(9_0n@sA?L-KN%<$#^5RqUYziFuYkLz%YQ?ZR(?xWYh9y+AyMxp zI)tQ~cNg~*VY|A&4phx+@qZTc9I4=}M}UN1?dc_v%9ju}WT43%lAI$fK}TU8fu=~l zI7mNHp~uMXcD^mMkx@&1i`*c z3|bP%G?jlrmA{vzNF0-0-j2)qJ@aByg1=_g-g6ze7l6ImwqsaLjgn<~mSXGK3i%`+ z3e6&jYRYc$#OQsb8XRvvfBGlc8@Acr0B+?_-NecE1)c9}LpW zst^u4My-DA^~1$C%$7f!65+emRPMXhOLVROh`PEdb3l2aA{vvgi4LVZlX5MXNu=Yg zw%x9uW`MC0JKnL4;b92qPgp4lV*90=vfcU&x;OEl5B180QkceqkfO;(+>u}%4p6{=h;mfrd>d3O2M!Y_)ilvB3B1XJ*NqL_>BJI=MaY)l4_Mi zP#*0#N*&Mx0-A}hJ{A0&+uSM-;5QnR=tv29p|;-?`_+BbZGAXO8P zi%x(}?~SHMQQ5X&X=F|IQ8essI~p8&@46;~)GY)ma}M>mfbQ@YE8)X0$7YvV@b0|u zcPr%+L4}p!z+^}$V1Nl)oF=mrqA)9dnFAKnc?dH0ubFLPZD*tT4--4b3-Vwm+gm4D zlU1+MVb*B8rVd5wIiRX+1RfuQ7dKO8!JBrr%A?EY7*>|i;KCs(#0{%vFlpPeRZ9YY zolp7`Bf@?(=dcA?nw)NEMI`# zKxc5@rGVxd12x&Hm7xZ_Ihc60KCfG{w<-<&5&^0SQN~Uc4cyRtr>k8o*;mn}JEwuT zF5CwI>KE^%FE#HRO1IAsqAGIke0{(W7AZ&Ir&9-aOQ1pjfb4x|hUr{4Yomdl0KDAR{W z?{j}Aek#H&0Yqj}=5}fAk~lrXX$;)o%_E9<0OOk*hfp%aK)m=#P6IWefF5=^QSIqqMPN&nbo)}e!w;O_ zv@)DytD7zpCi5-MsW?Ne~ET&DiO zNeM>GMJphGWkw6(c6pNq6S!%?)0glnn1SxIiVBBS3SLJ`Yl?1G5?|sH-m!MRdY(HNtJn7eINg#1y@%Mrsr3|$~_iY>70=LAmie^PS4$BUwSfM5&R0_~- z2ZL&(sBCw{2EE^AKa>5qP|@1q@~~pg26&vXpK__FBzm7a0y^cevPNk!LFR;w|iB^e&#U%CGTT@aDQH#aFMVj!-iCax?QjS`y0TuNqbGQsmbrvap*04kTMUm-J z9%o8Pg#5tBs-@TI-2jyaqV4Y0P2-uHgpD9xW#(vxH0^>>3MX9CtzhN6k#C4RdUv~G zv(DNDynvVqvD?zUm@v@YmO{`um^Xp}L5u#>s0~g_M`q(LT+tI=9BCUM%0@g5X1zoO z!u!@RLR$5{dVm}-S_LmY4ykCmVUJanMZ*;sJ1Td-Jekb(mm{-1CN@$OevOHIb^wSI z%}qxG3N>-iRMJ}~?&?edvvN74Gg z4f<>nb;NCG1i7WI)kr>z0x{-vaEc^n8jip90C`uv#+X-rR=@(Mv?tXWdwTXYVgE(y zC!?L!MkoHs8R?-O%pHBN;StPcAgKK1 zi;(FH=J&CI#rV!DGmkVq|9@;KMb#LLt4~n+AI2$MBTMa%|1Bzwu%iO4V<}8>xR@^H z=YEUc#v@tW$Mtd+B5`8Y&l-0xh$wji0T}*EpSI$;|& z{@pieaw{V*0x%>6;q$vGhDm-X7;QjE4rHoG@-tJY`28=eGViM$!}fuCM1@;0zM=7A zz{Am@|KHU4#ItS84OPk`Gm}~lL}z6=W_(43A*@uXoVEpqJQVC2^zaCxyFNYRRd4>& zbT`)khD+;FK{PiK^Fs6tvLm8b3V6ItlTL>OjE}n05noGQuD$DbIr914|L(o$^ENik?DIxLldp z_apHIIzGzl4oa?_Zf;rMHl?Y*ut&;@&Co++ZcLf~Ch|<9X(T*d6=Me=8q>( zLUCNeh&1CT!%3CzpiNKDu(yK1KG$)FMk|8ZMS}Jh?;Sh%5^B&uQ@e$2C2?<_1urm= zA`(2r{DIA+Zm3vKV~H8I-9PzquRp8!HP2FF7${iy9^xPZBPvkj3X3tsFdq?g_QagT z47nRF!5Rf~8og})4NP`@;?Kl!XT(3-QH1*0G$502G@|Wz68UWFkR=U9prP&`sA!UK zuDG4}`=T^eLJe0dn>$54t1uZOJ&nK=6=6yh#M|>g;s*|w+dv?w#4eSea#ZM3jmRM? zYc-!drK}+H%h-kH8>Mc!c55aF=5#)M2#UHFYR@AVYD(GS0M2d0gRA5O^!@&0v!O@? z;!(XJt!jS^Bq6)5h7?e5Y|Vd1 z30;2|&|lI^b$-?)WqH&aue6HWxhMC;+_qqXbeLxlU<@gG`!g+#I$jBUQGc94OKsWl zOcIOe#D&)nGVb=Z)Y!gE-arDoq`Cc}x25-#yv3lDb(Z9b>;Z`x+*xzYrIsJp+`$Bw z@HIq%c6qU%e=AAF=+5PCKASix<~eFQ zZkNT~tJc6MM38g1a+EDnMk+lsjb-Pfh0zQ{ONzw5p@+k>E>^jR79-?qEv}^@2V=q( zkSj`g$;l@cP#%SzL*W6*q87A?SJpPM!eZ=DjMIDR4RxM~13AAVu6AU+w^5O!ypH|9 zD|C4#vS8S}lMI2xKBm8(b+*-OuaNo+wDWau>yfv?%$o97i7K-*;#-kIY|Q~Q@+@@W5t1+L ZulW8`eh4MC%-Gu%jgsh2JI&B8! 0 { + blockColor = blockColorAt(c, x, heightBlock, z) } - if _, ok := b.(block.Water); ok { - y2 := c.HeightMap().At(x, z) - depth := y - y2 - if depth > 0 { - blockColor = blockColorAt(c, x, y2, z) - } - bw := (&block.Water{}).Color() - bw.A = uint8(utils.Clamp(int(150+depth*7), 255)) - blockColor = utils.BlendColors(blockColor, bw) - blockColor.R -= uint8(depth * 2) - blockColor.G -= uint8(depth * 2) - blockColor.B -= uint8(depth * 2) - } else { - blockColor = b.Color() - } + // blend that blocks color with water depending on depth + waterColor := (&block.Water{}).Color() + waterColor.A = uint8(utils.Clamp(int(150+depth*7), 255)) + blockColor = utils.BlendColors(blockColor, waterColor) + blockColor.R -= uint8(depth * 2) + blockColor.G -= uint8(depth * 2) + blockColor.B -= uint8(depth * 2) } /* if blockColor.R == 0 || blockColor.R == 255 && blockColor.B == 255 { @@ -58,39 +64,37 @@ func blockColorAt(c *chunk.Chunk, x uint8, y int16, z uint8) (blockColor color.R } func chunkGetColorAt(c *chunk.Chunk, x uint8, y int16, z uint8) color.RGBA { - p := cube.Pos{int(x), int(y), int(z)} haveUp := false - p.Side(cube.FaceUp).Neighbours(func(neighbour cube.Pos) { - if neighbour.X() < 0 || neighbour.X() >= 16 || neighbour.Z() < 0 || neighbour.Z() >= 16 || neighbour.Y() > c.Range().Max() { - return - } - if !haveUp { + cube.Pos{int(x), int(y), int(z)}. + Side(cube.FaceUp). + Neighbours(func(neighbour cube.Pos) { + if neighbour.X() < 0 || neighbour.X() >= 16 || neighbour.Z() < 0 || neighbour.Z() >= 16 || neighbour.Y() > c.Range().Max() || haveUp { + return + } blockRid := c.Block(uint8(neighbour[0]), int16(neighbour[1]), uint8(neighbour[2]), 0) if blockRid > 0 { b, found := world.BlockByRuntimeID(blockRid) if found { - if _, ok := b.(block.Air); !ok { + if isBlockLightblocking(b) { haveUp = true } } } - } - }, cube.Range{int(y + 1), int(y + 1)}) - - col := blockColorAt(c, x, y, z) + }, cube.Range{int(y + 1), int(y + 1)}) + blockColor := blockColorAt(c, x, y, z) if haveUp { - if col.R > 10 { - col.R -= 10 + if blockColor.R > 10 { + blockColor.R -= 10 } - if col.G > 10 { - col.G -= 10 + if blockColor.G > 10 { + blockColor.G -= 10 } - if col.B > 10 { - col.B -= 10 + if blockColor.B > 10 { + blockColor.B -= 10 } } - return col + return blockColor } func Chunk2Img(c *chunk.Chunk) *image.RGBA { @@ -99,9 +103,10 @@ func Chunk2Img(c *chunk.Chunk) *image.RGBA { for x := uint8(0); x < 16; x++ { for z := uint8(0); z < 16; z++ { - height := hm.At(x, z) - col := chunkGetColorAt(c, x, height, z) - img.SetRGBA(int(x), int(z), col) + img.SetRGBA( + int(x), int(z), + chunkGetColorAt(c, x, hm.At(x, z), z), + ) } } return img diff --git a/subcommands/world/map_item.go b/subcommands/world/map_item.go index f17bff6..3c7c13a 100644 --- a/subcommands/world/map_item.go +++ b/subcommands/world/map_item.go @@ -100,19 +100,18 @@ func (m *MapUI) Start() { } // init map - 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 - } + err := m.w.proxy.ClientWritePacket(&packet.ClientBoundMapItemData{ + MapID: ViewMapID, + Scale: 4, + MapsIncludedIn: []int64{ViewMapID}, + Width: 0, + Height: 0, + Pixels: nil, + UpdateFlags: packet.MapUpdateFlagInitialisation, + }) + if err != nil { + logrus.Error(err) + return } m.ticker = time.NewTicker(33 * time.Millisecond) @@ -122,18 +121,16 @@ func (m *MapUI) Start() { m.needRedraw = false m.Redraw() - if m.w.proxy.Client != nil { - if err := m.w.proxy.Client.WritePacket(&packet.ClientBoundMapItemData{ - MapID: ViewMapID, - Scale: 4, - Width: 128, - Height: 128, - Pixels: utils.Img2rgba(m.img), - UpdateFlags: packet.MapUpdateFlagTexture, - }); err != nil { - logrus.Error(err) - return - } + if err := m.w.proxy.ClientWritePacket(&packet.ClientBoundMapItemData{ + MapID: ViewMapID, + Scale: 4, + Width: 128, + Height: 128, + Pixels: utils.Img2rgba(m.img), + UpdateFlags: packet.MapUpdateFlagTexture, + }); err != nil { + logrus.Error(err) + return } } } @@ -144,12 +141,10 @@ func (m *MapUI) Start() { if m.w.ctx.Err() != nil { return } - if m.w.proxy.Client != nil { - err := m.w.proxy.Client.WritePacket(&MapItemPacket) - if err != nil { - logrus.Error(err) - return - } + err := m.w.proxy.ClientWritePacket(&MapItemPacket) + if err != nil { + logrus.Error(err) + return } } }() diff --git a/subcommands/world/world.go b/subcommands/world/world.go index 89c9bb3..7e84932 100644 --- a/subcommands/world/world.go +++ b/subcommands/world/world.go @@ -156,10 +156,10 @@ func (c *WorldCMD) Execute(ctx context.Context, ui utils.UI) error { proxy.AlwaysGetPacks = true proxy.ConnectCB = w.OnConnect - proxy.OnClientConnect = func(proxy *utils.ProxyContext, hasClient bool) { + proxy.OnClientConnect = func(hasClient bool) { w.gui.Message(messages.SetUIState, messages.UIStateConnecting) } - proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) { + proxy.PacketCB = func(pk packet.Packet, toServer bool, _ time.Time) (packet.Packet, error) { forward := true if toServer { @@ -263,11 +263,12 @@ func (w *WorldState) Reset() { // SaveAndReset writes the world to a folder, resets all the chunks func (w *WorldState) SaveAndReset() { + + // cull empty chunks keys := make([]protocol.ChunkPos, 0, len(w.chunks)) for cp := range w.chunks { keys = append(keys, cp) } - for _, cp := range keys { has_any := false for _, sc := range w.chunks[cp].Sub() { @@ -280,7 +281,6 @@ func (w *WorldState) SaveAndReset() { delete(w.chunks, cp) } } - if len(w.chunks) == 0 { w.Reset() return @@ -316,6 +316,7 @@ func (w *WorldState) SaveAndReset() { } } + // save entities chunkEntities := make(map[world.ChunkPos][]world.Entity) for _, es := range w.entities { cp := world.ChunkPos{int32(es.Position.X()) >> 4, int32(es.Position.Z()) >> 4} @@ -517,13 +518,12 @@ func (w *WorldState) SaveAndReset() { w.Reset() } -func (w *WorldState) OnConnect(proxy *utils.ProxyContext, err error) bool { +func (w *WorldState) OnConnect(err error) bool { w.gui.Message(messages.SetUIState, messages.UIStateMain) if err != nil { return false } - w.proxy = proxy gd := w.proxy.Server.GameData() w.ChunkRadius = int(gd.ChunkRadius) @@ -570,9 +570,7 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext, err error) bool { w.proxy.SendMessage(locale.Loc("use_setname", nil)) - w.mapUI.Start() - - proxy.AddCommand(utils.IngameCommand{ + w.proxy.AddCommand(utils.IngameCommand{ Exec: func(cmdline []string) bool { return w.setWorldName(strings.Join(cmdline, " "), false) }, @@ -593,7 +591,7 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext, err error) bool { }, }) - proxy.AddCommand(utils.IngameCommand{ + w.proxy.AddCommand(utils.IngameCommand{ Exec: func(cmdline []string) bool { return w.setVoidGen(!w.voidGen, false) }, @@ -603,9 +601,10 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext, err error) bool { }, }) - if w.proxy.Client != nil { - w.proxy.Client.WritePacket(&packet.ChunkRadiusUpdated{ChunkRadius: 80}) - } + w.mapUI.Start() + w.proxy.ClientWritePacket(&packet.ChunkRadiusUpdated{ + ChunkRadius: 80, + }) return true } diff --git a/ui/gui/pages/settings/settings.go b/ui/gui/pages/settings/settings.go index d7b182e..1c1c17f 100644 --- a/ui/gui/pages/settings/settings.go +++ b/ui/gui/pages/settings/settings.go @@ -59,7 +59,6 @@ func New(router *pages.Router) *Page { OptionList: layout.List{}, Options: options, } - //p.cmdMenu.selected = "worlds" for _, su := range settings.Settings { su.Init() diff --git a/ui/gui/pages/skins/skins.go b/ui/gui/pages/skins/skins.go index f972808..41e34a4 100644 --- a/ui/gui/pages/skins/skins.go +++ b/ui/gui/pages/skins/skins.go @@ -77,15 +77,13 @@ func (p *Page) Layout(gtx C, th *material.Theme) D { Axis: layout.Vertical, }.Layout(gtx, layout.Rigid(material.Label(th, 20, "Skin Basic UI").Layout), - layout.Flexed(1, func(gtx layout.Context) layout.Dimensions { + layout.Flexed(1, func(gtx C) D { p.l.Lock() defer p.l.Unlock() - return material.List(th, &p.SkinsList).Layout(gtx, len(p.Skins), func(gtx layout.Context, index int) layout.Dimensions { + return material.List(th, &p.SkinsList).Layout(gtx, len(p.Skins), func(gtx C, index int) D { entry := p.Skins[len(p.Skins)-index-1] - return layout.UniformInset(25).Layout(gtx, func(gtx layout.Context) layout.Dimensions { - return layout.Flex{ - Axis: layout.Horizontal, - }.Layout(gtx, + return layout.UniformInset(25).Layout(gtx, func(gtx C) D { + return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, layout.Rigid(material.Label(th, th.TextSize, entry.PlayerName).Layout), ) }) diff --git a/ui/gui/pages/worlds/worlds.go b/ui/gui/pages/worlds/worlds.go index 271563d..9be2e57 100644 --- a/ui/gui/pages/worlds/worlds.go +++ b/ui/gui/pages/worlds/worlds.go @@ -66,16 +66,14 @@ func (p *Page) Layout(gtx C, th *material.Theme) D { return margin.Layout(gtx, material.Label(th, 100, "Connecting").Layout) case messages.UIStateMain: // show the main ui - return margin.Layout(gtx, func(gtx C) D { - return layout.Flex{ - Axis: layout.Vertical, - }.Layout(gtx, - layout.Rigid(material.Label(th, 20, "World Downloader Basic UI").Layout), - layout.Flexed(1, func(gtx C) D { - return layout.Center.Layout(gtx, p.worldMap.Layout) - }), - ) - }) + return layout.Flex{ + Axis: layout.Vertical, + }.Layout(gtx, + layout.Rigid(material.Label(th, 20, "World Downloader Basic UI").Layout), + layout.Flexed(1, func(gtx C) D { + return layout.Center.Layout(gtx, p.worldMap.Layout) + }), + ) } return layout.Flex{}.Layout(gtx) diff --git a/utils/packet_logger.go b/utils/packet_logger.go index b271731..9ce63f0 100644 --- a/utils/packet_logger.go +++ b/utils/packet_logger.go @@ -162,6 +162,8 @@ func DumpStruct(data interface{}) { FLog.Write([]byte("\n\n\n")) } +var ClientAddr net.Addr + func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) { var pk packet.Packet if pkFunc, ok := pool[header.PacketID]; ok { @@ -176,11 +178,11 @@ func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) { defer func() { if recoveredErr := recover(); recoveredErr != nil { - logrus.Errorf("%T: %w", pk, recoveredErr) + logrus.Errorf("%T: %s", pk, recoveredErr.(error)) } }() - pk.Unmarshal(protocol.NewReader(bytes.NewBuffer(payload), 0)) + pk.Marshal(protocol.NewReader(bytes.NewBuffer(payload), 0)) if FLog != nil { dmpLock.Lock() diff --git a/utils/proxy.go b/utils/proxy.go index 9d679dc..743bcb6 100644 --- a/utils/proxy.go +++ b/utils/proxy.go @@ -41,9 +41,9 @@ func (p dummyProto) ConvertFromLatest(pk packet.Packet, _ *minecraft.Conn) []pac type ( PacketFunc func(header packet.Header, payload []byte, src, dst net.Addr) - PacketCallback func(pk packet.Packet, proxy *ProxyContext, toServer bool, timeReceived time.Time) (packet.Packet, error) - ClientConnectCallback func(proxy *ProxyContext, hasClient bool) - ConnectCallback func(proxy *ProxyContext, err error) bool + PacketCallback func(pk packet.Packet, toServer bool, timeReceived time.Time) (packet.Packet, error) + ClientConnectCallback func(hasClient bool) + ConnectCallback func(err error) bool IngameCommand struct { Exec func(cmdline []string) bool Cmd protocol.Command @@ -161,25 +161,28 @@ func (p *ProxyContext) LoadCustomUserData(path string) error { return nil } -func (p *ProxyContext) SendMessage(text string) { - if p.Client != nil { - p.Client.WritePacket(&packet.Text{ - TextType: packet.TextTypeSystem, - Message: "§8[§bBedrocktool§8]§r " + text, - }) +func (p *ProxyContext) ClientWritePacket(pk packet.Packet) error { + if p.Client == nil { + return nil } + return p.Client.WritePacket(pk) +} + +func (p *ProxyContext) SendMessage(text string) { + p.ClientWritePacket(&packet.Text{ + TextType: packet.TextTypeSystem, + Message: "§8[§bBedrocktool§8]§r " + text, + }) } func (p *ProxyContext) SendPopup(text string) { - if p.Client != nil { - p.Client.WritePacket(&packet.Text{ - TextType: packet.TextTypePopup, - Message: text, - }) - } + p.ClientWritePacket(&packet.Text{ + TextType: packet.TextTypePopup, + Message: text, + }) } -func (p *ProxyContext) CommandHandlerPacketCB(pk packet.Packet, proxy *ProxyContext, toServer bool, _ time.Time) (packet.Packet, error) { +func (p *ProxyContext) CommandHandlerPacketCB(pk packet.Packet, toServer bool, _ time.Time) (packet.Packet, error) { switch _pk := pk.(type) { case *packet.CommandRequest: cmd := strings.Split(_pk.CommandLine, " ") @@ -223,7 +226,7 @@ func (p *ProxyContext) proxyLoop(ctx context.Context, toServer bool, packetCBs [ } for _, packetCB := range packetCBs { - pk, err = packetCB(pk, p, toServer, time.Now()) + pk, err = packetCB(pk, toServer, time.Now()) if err != nil { return err } @@ -240,11 +243,9 @@ func (p *ProxyContext) proxyLoop(ctx context.Context, toServer bool, packetCBs [ } } -var ClientAddr net.Addr - func (p *ProxyContext) Run(ctx context.Context, serverAddress string) (err error) { if strings.HasPrefix(serverAddress, "PCAP!") { - return createReplayConnection(ctx, serverAddress[5:], p.ConnectCB, p.PacketCB) + return createReplayConnection(ctx, serverAddress[5:], p) } GetTokenSource() // ask for login before listening @@ -298,7 +299,7 @@ func (p *ProxyContext) Run(ctx context.Context, serverAddress string) (err error } if p.OnClientConnect != nil { - p.OnClientConnect(p, p.WithClient) + p.OnClientConnect(p.WithClient) } if p.CustomClientData != nil { @@ -308,7 +309,7 @@ func (p *ProxyContext) Run(ctx context.Context, serverAddress string) (err error p.Server, err = connectServer(ctx, serverAddress, cdp, p.AlwaysGetPacks, p.PacketFunc) if err != nil { if p.ConnectCB != nil { - if p.ConnectCB(p, err) { + if p.ConnectCB(err) { err = nil } } @@ -324,7 +325,7 @@ func (p *ProxyContext) Run(ctx context.Context, serverAddress string) (err error } if p.ConnectCB != nil { - if !p.ConnectCB(p, nil) { + if !p.ConnectCB(nil) { return errors.New("Cancelled") } } diff --git a/utils/realms.go b/utils/realms.go index 12230ab..d2a7991 100644 --- a/utils/realms.go +++ b/utils/realms.go @@ -2,11 +2,8 @@ package utils import ( "context" - "flag" "fmt" "strings" - - "github.com/bedrock-tool/bedrocktool/locale" ) func getRealm(ctx context.Context, realmName, id string) (name string, address string, err error) { @@ -29,23 +26,3 @@ func getRealm(ctx context.Context, realmName, id string) (name string, address s } return "", "", fmt.Errorf("realm not found") } - -type RealmListCMD struct{} - -func (*RealmListCMD) Name() string { return "list-realms" } -func (*RealmListCMD) Synopsis() string { return locale.Loc("list_realms_synopsis", nil) } -func (c *RealmListCMD) SetFlags(f *flag.FlagSet) {} -func (c *RealmListCMD) Execute(ctx context.Context, ui UI) error { - realms, err := GetRealmsAPI().Realms(ctx) - if err != nil { - return err - } - for _, realm := range realms { - fmt.Println(locale.Loc("realm_list_line", locale.Strmap{"Name": realm.Name, "Id": realm.ID})) - } - return nil -} - -func init() { - RegisterCommand(&RealmListCMD{}) -} diff --git a/utils/replay.go b/utils/replay.go index 525fdd5..1d270b7 100644 --- a/utils/replay.go +++ b/utils/replay.go @@ -34,7 +34,7 @@ func WriteReplayHeader(f io.Writer) { binary.Write(f, binary.LittleEndian, &header) } -func createReplayConnection(ctx context.Context, filename string, onConnect ConnectCallback, packetCB PacketCallback) error { +func createReplayConnection(ctx context.Context, filename string, proxy *ProxyContext) error { logrus.Infof("Reading replay %s", filename) f, err := os.Open(filename) @@ -63,7 +63,6 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn f.Seek(-4, io.SeekCurrent) } - proxy, _ := NewProxy() proxy.Server = minecraft.NewConn() gameStarted := false @@ -129,8 +128,8 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn } if gameStarted { - if packetCB != nil { - packetCB(pk, proxy, toServer, timeReceived) + if proxy.PacketCB != nil { + proxy.PacketCB(pk, toServer, timeReceived) } } else { switch pk := pk.(type) { @@ -165,8 +164,8 @@ func createReplayConnection(ctx context.Context, filename string, onConnect Conn DisablePlayerInteractions: pk.DisablePlayerInteractions, }) gameStarted = true - if onConnect != nil { - onConnect(proxy, nil) + if proxy.ConnectCB != nil { + proxy.ConnectCB(nil) } } }