bedrocktool/utils/resourcepack.go

82 lines
1.4 KiB
Go
Raw Normal View History

2022-09-04 14:26:32 +00:00
package utils
import (
2023-01-24 11:50:27 +00:00
"errors"
"io"
2022-09-04 14:26:32 +00:00
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/resource"
)
2023-01-24 11:50:27 +00:00
type Pack interface {
io.ReaderAt
ReadAll() ([]byte, error)
Decrypt() ([]byte, error)
Encrypted() bool
CanDecrypt() bool
2023-01-24 11:50:27 +00:00
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) CanDecrypt() bool {
return false
}
2023-01-24 11:50:27 +00:00
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.IConn) (packs []Pack, err error) {
2022-09-04 14:26:32 +00:00
for _, pack := range server.ResourcePacks() {
2023-01-24 11:50:27 +00:00
pack := PackFromBase(pack)
if pack.Encrypted() && pack.CanDecrypt() {
2023-01-24 11:50:27 +00:00
data, err := pack.Decrypt()
if err != nil {
return nil, err
}
pack2, err := resource.FromBytes(data)
if err != nil {
return nil, err
}
packs = append(packs, &Packb{pack2})
2023-01-24 11:50:27 +00:00
} else {
packs = append(packs, pack)
2023-01-24 11:50:27 +00:00
}
2022-09-04 14:26:32 +00:00
}
return
}