26ed99fda6
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
package packbuilder
|
|
|
|
import (
|
|
_ "embed"
|
|
"os"
|
|
|
|
"github.com/df-mc/dragonfly/server/world"
|
|
"github.com/sandertv/gophertunnel/minecraft/resource"
|
|
"golang.org/x/mod/sumdb/dirhash"
|
|
)
|
|
|
|
//go:embed pack_icon.png
|
|
var packIcon []byte
|
|
|
|
// BuildResourcePack builds a resource pack based on custom features that have been registered to the server.
|
|
// It creates a UUID based on the hash of the directory so the client will only be prompted to download it
|
|
// once it is changed.
|
|
func BuildResourcePack(reg world.BlockRegistry) (*resource.Pack, bool) {
|
|
dir, err := os.MkdirTemp("", "dragonfly_resource_pack-")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer os.RemoveAll(dir)
|
|
|
|
var assets int
|
|
var lang []string
|
|
|
|
itemCount, itemLang := buildItems(dir)
|
|
assets += itemCount
|
|
lang = append(lang, itemLang...)
|
|
|
|
blockCount, blockLang := buildBlocks(reg, dir)
|
|
assets += blockCount
|
|
lang = append(lang, blockLang...)
|
|
|
|
if assets > 0 {
|
|
buildLanguageFile(dir, lang)
|
|
if err := os.WriteFile(dir+"/pack_icon.png", packIcon, 0666); err != nil {
|
|
panic(err)
|
|
}
|
|
hash, err := dirhash.HashDir(dir, "", dirhash.Hash1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var header, module [16]byte
|
|
copy(header[:], hash)
|
|
copy(module[:], hash[16:])
|
|
buildManifest(dir, header, module)
|
|
return resource.MustReadPath(dir), true
|
|
}
|
|
return nil, false
|
|
}
|