mirror of
https://github.com/CosmicStar98/bedrocktool.git
synced 2024-06-16 12:29:46 +00:00
fixing behavior pack textures
This commit is contained in:
parent
3dba4525b5
commit
56ac765b1d
2
.gitattributes
vendored
2
.gitattributes
vendored
|
@ -1 +1 @@
|
||||||
utils/resourcepack-ace.go.ignore filter=git-crypt diff=git-crypt
|
utils/resourcepack-ace.go filter=git-crypt diff=git-crypt
|
5
Makefile
5
Makefile
|
@ -8,12 +8,12 @@ GC = go build -ldflags "-s -w -X github.com/bedrock-tool/bedrocktool/utils.Versi
|
||||||
|
|
||||||
# check if packs are supported
|
# check if packs are supported
|
||||||
HAVE_PACKS = false
|
HAVE_PACKS = false
|
||||||
ifeq ($(shell head -c 7 ./utils/resourcepack-ace.go.ignore),package)
|
ifeq ($(shell head -c 7 ./utils/resourcepack-ace.go),package)
|
||||||
HAVE_PACKS = true
|
HAVE_PACKS = true
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(info pack support: ${HAVE_PACKS})
|
$(info pack support: ${HAVE_PACKS})
|
||||||
ifeq ($(HAVE_PACKS),true)
|
ifneq ($(HAVE_PACKS),true)
|
||||||
GC += -overlay overlay.json
|
GC += -overlay overlay.json
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ $(DISTS): dist builds $(SRCS)
|
||||||
GOOS=$(OS) GOARCH=$(ARCH) $(GC) -o $(BUILD) ./cmd/bedrocktool
|
GOOS=$(OS) GOARCH=$(ARCH) $(GC) -o $(BUILD) ./cmd/bedrocktool
|
||||||
cp $(BUILD) $@
|
cp $(BUILD) $@
|
||||||
|
|
||||||
|
|
||||||
UPDATES=$(BUILDS)
|
UPDATES=$(BUILDS)
|
||||||
$(UPDATES): OS = $(word 1,$(subst _, ,$@))
|
$(UPDATES): OS = $(word 1,$(subst _, ,$@))
|
||||||
$(UPDATES): ARCH = $(word 1,$(subst ., ,$(word 2,$(subst _, ,$@))))
|
$(UPDATES): ARCH = $(word 1,$(subst ., ,$(word 2,$(subst _, ,$@))))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"Replace": {
|
"Replace": {
|
||||||
"utils/resourcepack.go": "utils/resourcepack-ace.go.ignore"
|
"utils/resourcepack-ace.go": "utils/dummy"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -161,6 +161,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{
|
||||||
w.ctx = ctx
|
w.ctx = ctx
|
||||||
|
|
||||||
proxy := utils.NewProxy()
|
proxy := utils.NewProxy()
|
||||||
|
proxy.AlwaysGetPacks = true
|
||||||
proxy.ConnectCB = w.OnConnect
|
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) (packet.Packet, error) {
|
||||||
var forward bool
|
var forward bool
|
||||||
|
@ -442,38 +443,55 @@ func (w *WorldState) SaveAndReset() {
|
||||||
provider.Close()
|
provider.Close()
|
||||||
w.worldCounter += 1
|
w.worldCounter += 1
|
||||||
|
|
||||||
for k, p := range w.packs {
|
type dep struct {
|
||||||
logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k}))
|
PackId string `json:"pack_id"`
|
||||||
pack_folder := path.Join(folder, "resource_packs", k)
|
Version [3]int `json:"version"`
|
||||||
os.MkdirAll(pack_folder, 0o755)
|
}
|
||||||
data := make([]byte, p.Len())
|
add_packs_json := func(name string, deps []dep) {
|
||||||
p.ReadAt(data, 0)
|
f, err := os.Create(path.Join(folder, name))
|
||||||
utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder)
|
if err != nil {
|
||||||
|
logrus.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if err := json.NewEncoder(f).Encode(deps); err != nil {
|
||||||
|
logrus.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var rdeps []dep
|
||||||
|
for k, p := range w.packs {
|
||||||
|
logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k}))
|
||||||
|
pack_folder := path.Join(folder, "resource_packs", k)
|
||||||
|
os.MkdirAll(pack_folder, 0o755)
|
||||||
|
data := make([]byte, p.Len())
|
||||||
|
p.ReadAt(data, 0)
|
||||||
|
utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder)
|
||||||
|
rdeps = append(rdeps, dep{
|
||||||
|
PackId: p.Manifest().Header.Name,
|
||||||
|
Version: p.Manifest().Header.Version,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
add_packs_json("world_resource_packs.json", rdeps)
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.bp != nil {
|
if w.bp != nil {
|
||||||
name := w.ServerName + "_blocks"
|
name := w.ServerName + "_blocks"
|
||||||
pack_folder := path.Join(folder, "behavior_packs", name)
|
pack_folder := path.Join(folder, "behavior_packs", name)
|
||||||
os.MkdirAll(pack_folder, 0o755)
|
os.MkdirAll(pack_folder, 0o755)
|
||||||
w.bp.Save(pack_folder)
|
|
||||||
{ // save file saying to load the behavior pack
|
for _, p := range w.proxy.Server.ResourcePacks() {
|
||||||
f, err := os.Create(path.Join(folder, "world_behavior_packs.json"))
|
p := utils.PackFromBase(p)
|
||||||
if err != nil {
|
w.bp.CheckAddLink(p)
|
||||||
logrus.Error(err)
|
|
||||||
} else {
|
|
||||||
defer f.Close()
|
|
||||||
type dep struct {
|
|
||||||
PackId string `json:"pack_id"`
|
|
||||||
Version [3]int `json:"version"`
|
|
||||||
}
|
|
||||||
if err := json.NewEncoder(f).Encode([]dep{{
|
|
||||||
PackId: w.bp.Manifest.Header.UUID,
|
|
||||||
Version: w.bp.Manifest.Header.Version,
|
|
||||||
}}); err != nil {
|
|
||||||
logrus.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
w.bp.Save(pack_folder)
|
||||||
|
add_packs_json("world_behavior_packs.json", []dep{{
|
||||||
|
PackId: w.bp.Manifest.Header.UUID,
|
||||||
|
Version: w.bp.Manifest.Header.Version,
|
||||||
|
}})
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.saveImage {
|
if w.saveImage {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package behaviourpack
|
package behaviourpack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"archive/zip"
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
@ -8,6 +9,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/bedrock-tool/bedrocktool/utils"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/sandertv/gophertunnel/minecraft/protocol"
|
"github.com/sandertv/gophertunnel/minecraft/protocol"
|
||||||
"github.com/sandertv/gophertunnel/minecraft/resource"
|
"github.com/sandertv/gophertunnel/minecraft/resource"
|
||||||
|
@ -157,11 +159,7 @@ func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) {
|
||||||
}
|
}
|
||||||
// fix missing * instance
|
// fix missing * instance
|
||||||
if k == "minecraft:material_instances" {
|
if k == "minecraft:material_instances" {
|
||||||
if mats, ok := v["materials"].(map[string]any); ok {
|
comps[k] = v["materials"].(map[string]any)
|
||||||
if _, has_star := mats["*"]; !has_star {
|
|
||||||
mats["*"] = mats["east"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,6 +182,19 @@ func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) {
|
||||||
bp.blocks = append(bp.blocks, entry)
|
bp.blocks = append(bp.blocks, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bp *BehaviourPack) CheckAddLink(pack utils.Pack) {
|
||||||
|
z, err := zip.NewReader(pack, int64(pack.Len()))
|
||||||
|
if err != nil {
|
||||||
|
logrus.Error(err)
|
||||||
|
}
|
||||||
|
_, err = z.Open("blocks.json")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
h := pack.Manifest().Header
|
||||||
|
bp.AddDependency(h.UUID, h.Version)
|
||||||
|
}
|
||||||
|
|
||||||
func (bp *BehaviourPack) Save(fpath string) error {
|
func (bp *BehaviourPack) Save(fpath string) error {
|
||||||
{ // write manifest
|
{ // write manifest
|
||||||
w, err := os.Create(path.Join(fpath, "manifest.json"))
|
w, err := os.Create(path.Join(fpath, "manifest.json"))
|
||||||
|
|
1
utils/dummy
Normal file
1
utils/dummy
Normal file
|
@ -0,0 +1 @@
|
||||||
|
package utils
|
|
@ -35,10 +35,11 @@ func (p dummyProto) ConvertFromLatest(pk packet.Packet, _ *minecraft.Conn) []pac
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProxyContext struct {
|
type ProxyContext struct {
|
||||||
Server *minecraft.Conn
|
Server *minecraft.Conn
|
||||||
Client *minecraft.Conn
|
Client *minecraft.Conn
|
||||||
Listener *minecraft.Listener
|
Listener *minecraft.Listener
|
||||||
commands map[string]IngameCommand
|
commands map[string]IngameCommand
|
||||||
|
AlwaysGetPacks bool
|
||||||
|
|
||||||
// called for every packet
|
// called for every packet
|
||||||
PacketFunc PacketFunc
|
PacketFunc PacketFunc
|
||||||
|
@ -197,7 +198,7 @@ func (p *ProxyContext) Run(ctx context.Context, server_address string) (err erro
|
||||||
p.Client = c.(*minecraft.Conn)
|
p.Client = c.(*minecraft.Conn)
|
||||||
|
|
||||||
cd := p.Client.ClientData()
|
cd := p.Client.ClientData()
|
||||||
p.Server, err = ConnectServer(ctx, server_address, &cd, false, p.PacketFunc)
|
p.Server, err = ConnectServer(ctx, server_address, &cd, p.AlwaysGetPacks, p.PacketFunc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf(locale.Loc("failed_to_connect", locale.Strmap{"Address": server_address, "Err": err}))
|
err = fmt.Errorf(locale.Loc("failed_to_connect", locale.Strmap{"Address": server_address, "Err": err}))
|
||||||
return
|
return
|
||||||
|
|
BIN
utils/resourcepack-ace.go
Normal file
BIN
utils/resourcepack-ace.go
Normal file
Binary file not shown.
Binary file not shown.
|
@ -1,14 +1,77 @@
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
|
||||||
"github.com/sandertv/gophertunnel/minecraft"
|
"github.com/sandertv/gophertunnel/minecraft"
|
||||||
"github.com/sandertv/gophertunnel/minecraft/resource"
|
"github.com/sandertv/gophertunnel/minecraft/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Pack interface {
|
||||||
|
io.ReaderAt
|
||||||
|
ReadAll() ([]byte, error)
|
||||||
|
Decrypt() ([]byte, error)
|
||||||
|
Encrypted() bool
|
||||||
|
UUID() string
|
||||||
|
Name() string
|
||||||
|
Version() string
|
||||||
|
ContentKey() string
|
||||||
|
Len() int
|
||||||
|
Manifest() resource.Manifest
|
||||||
|
Base() *resource.Pack
|
||||||
|
}
|
||||||
|
|
||||||
|
type Packb struct {
|
||||||
|
*resource.Pack
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Packb) ReadAll() ([]byte, error) {
|
||||||
|
buf := make([]byte, p.Len())
|
||||||
|
off := 0
|
||||||
|
for {
|
||||||
|
n, err := p.ReadAt(buf[off:], int64(off))
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
off += n
|
||||||
|
}
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Packb) Decrypt() ([]byte, error) {
|
||||||
|
return nil, errors.New("no_decrypt")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Packb) Base() *resource.Pack {
|
||||||
|
return p.Pack
|
||||||
|
}
|
||||||
|
|
||||||
|
var PackFromBase = func(pack *resource.Pack) Pack {
|
||||||
|
b := &Packb{pack}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
func GetPacks(server *minecraft.Conn) (packs map[string]*resource.Pack, err error) {
|
func GetPacks(server *minecraft.Conn) (packs map[string]*resource.Pack, err error) {
|
||||||
packs = make(map[string]*resource.Pack)
|
packs = make(map[string]*resource.Pack)
|
||||||
for _, pack := range server.ResourcePacks() {
|
for _, pack := range server.ResourcePacks() {
|
||||||
packs[pack.Name()] = pack
|
pack := PackFromBase(pack)
|
||||||
|
if pack.Encrypted() {
|
||||||
|
data, err := pack.Decrypt()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pack2, err := resource.FromBytes(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
packs[pack.Name()] = pack2
|
||||||
|
} else {
|
||||||
|
packs[pack.Name()] = pack.Base()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user