From 1160e025ec2103d1d483be0087c595dee07c1df9 Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Mon, 23 Jan 2023 19:18:01 +0100 Subject: [PATCH] fix translations --- cmd/bedrocktool/main.go | 1 + go.mod | 2 +- go.sum | 2 + locale/i18n.go | 43 ++++++++++----- subcommands/world/world.go | 28 +++++++--- utils/behaviourpack/bp.go | 105 +++++++++++++++++++++++++++++++++++++ 6 files changed, 159 insertions(+), 22 deletions(-) create mode 100644 utils/behaviourpack/bp.go diff --git a/cmd/bedrocktool/main.go b/cmd/bedrocktool/main.go index a46ee52..97e3889 100644 --- a/cmd/bedrocktool/main.go +++ b/cmd/bedrocktool/main.go @@ -61,6 +61,7 @@ func main() { flag.BoolVar(&utils.G_debug, "debug", false, locale.Loc("debug_mode", nil)) flag.BoolVar(&utils.G_preload_packs, "preload", false, locale.Loc("preload_packs", nil)) + flag.String("lang", "", "lang") enable_dns := flag.Bool("dns", false, locale.Loc("enable_dns", nil)) subcommands.Register(subcommands.HelpCommand(), "") diff --git a/go.mod b/go.mod index f867b24..92e7058 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ go 1.19 replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.2 //replace github.com/df-mc/dragonfly => ./dragonfly -replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-1 +replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-2 require ( github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 diff --git a/go.sum b/go.sum index d432c96..06e4c10 100644 --- a/go.sum +++ b/go.sum @@ -68,6 +68,8 @@ github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYo github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0= github.com/olebeck/dragonfly v0.9.1-1 h1:b5CIocRvmxdesW6N6V87xTDH4fFLVthb1GRptbbqDuc= github.com/olebeck/dragonfly v0.9.1-1/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0= +github.com/olebeck/dragonfly v0.9.1-2 h1:Rry/efQl4ORUakJNTnHCY0vB6AUmZuUpy+PsLSbWoRY= +github.com/olebeck/dragonfly v0.9.1-2/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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= diff --git a/locale/i18n.go b/locale/i18n.go index 4971faa..8618193 100644 --- a/locale/i18n.go +++ b/locale/i18n.go @@ -2,7 +2,10 @@ package locale import ( "embed" + "flag" "fmt" + "io" + "os" "github.com/cloudfoundry-attic/jibber_jabber" "github.com/nicksnyder/go-i18n/v2/i18n" @@ -18,7 +21,6 @@ var localesFS embed.FS var lang *i18n.Localizer func load_language(bundle *i18n.Bundle, tag language.Tag) error { - logrus.Infof("Using Language %s", tag.String()) _, err := bundle.LoadMessageFileFS(localesFS, fmt.Sprintf("%s.yaml", tag.String())) return err } @@ -27,14 +29,19 @@ func init() { var defaultTag language.Tag = language.English var err error - // get default language var languageName string - languageName, err = jibber_jabber.DetectLanguage() - if err == nil { - defaultTag, err = language.Parse(languageName) - if err != nil { - logrus.Warn("failed to parse language name") - } + f := flag.NewFlagSet("bedrocktool", flag.ContinueOnError) + f.SetOutput(io.Discard) + f.StringVar(&languageName, "lang", "", "") + f.Parse(os.Args[1:]) + + // get default language + if languageName == "" { + languageName, _ = jibber_jabber.DetectLanguage() + } + defaultTag, err = language.Parse(languageName) + if err != nil { + logrus.Warn("failed to parse language name") } bundle := i18n.NewBundle(defaultTag) @@ -43,7 +50,7 @@ func init() { if defaultTag != language.English { err = load_language(bundle, language.English) if err != nil { - panic("failed to load english language") + logrus.Error("failed to load english language") } } @@ -52,11 +59,7 @@ func init() { logrus.Warnf("Couldnt load Language %s", languageName) } - lang = i18n.NewLocalizer(bundle) -} - -func Locm(id string, tmpl Strmap, count int) string { - return Loc(id, tmpl) + lang = i18n.NewLocalizer(bundle, defaultTag.String(), "en") } func Loc(id string, tmpl Strmap) string { @@ -69,3 +72,15 @@ func Loc(id string, tmpl Strmap) string { } return s } + +func Locm(id string, tmpl Strmap, count int) string { + s, err := lang.Localize(&i18n.LocalizeConfig{ + MessageID: id, + TemplateData: tmpl, + PluralCount: count, + }) + if err != nil { + return fmt.Sprintf("failed to translate! %s", id) + } + return s +} diff --git a/subcommands/world/world.go b/subcommands/world/world.go index 51c5312..7b2d6b0 100644 --- a/subcommands/world/world.go +++ b/subcommands/world/world.go @@ -16,6 +16,7 @@ import ( "github.com/bedrock-tool/bedrocktool/locale" "github.com/bedrock-tool/bedrocktool/utils" + "github.com/bedrock-tool/bedrocktool/utils/behaviourpack" "github.com/bedrock-tool/bedrocktool/utils/nbtconv" "github.com/df-mc/dragonfly/server/block" @@ -64,6 +65,7 @@ type WorldState struct { ServerName string worldCounter int packs map[string]*resource.Pack + bp *behaviourpack.BehaviourPack withPacks bool saveImage bool @@ -175,8 +177,9 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{ err = proxy.Run(ctx, server_address) if err != nil { logrus.Error(err) + } else { + w.SaveAndReset() } - w.SaveAndReset() return 0 } @@ -447,6 +450,16 @@ func (w *WorldState) SaveAndReset() { utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder) } + if w.bp != nil { + f, err := os.Create(path.Join(folder, "bp.mcpack")) + if err != nil { + logrus.Error(err) + } else { + w.bp.Save(f) + f.Close() + } + } + if w.saveImage { f, _ := os.Create(folder + ".png") png.Encode(f, w.ui.ToImage()) @@ -470,12 +483,13 @@ func (w *WorldState) OnConnect(proxy *utils.ProxyContext) { if len(gd.CustomBlocks) > 0 { logrus.Info(locale.Loc("using_customblocks", nil)) - /* - for _, be := range gd.CustomBlocks { - b := block.ServerCustomBlock(be) - world.RegisterBlock(b) - } - */ + + w.bp = behaviourpack.New(w.ServerName + " Custom Blocks") + for _, be := range gd.CustomBlocks { + w.bp.AddBlock(be) + } + // telling the chunk code what custom blocks there are so it can generate offsets + world.InsertCustomBlocks(gd.CustomBlocks) } if w.withPacks { diff --git a/utils/behaviourpack/bp.go b/utils/behaviourpack/bp.go new file mode 100644 index 0000000..a50a15c --- /dev/null +++ b/utils/behaviourpack/bp.go @@ -0,0 +1,105 @@ +package behaviourpack + +import ( + "archive/zip" + "bytes" + "encoding/json" + "fmt" + "io" + "strings" + + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/resource" + "github.com/sirupsen/logrus" +) + +type BehaviourPack struct { + manifest *resource.Manifest + blocks []blockBehaviour +} + +type description struct { + Identifier string `json:"identifier"` + IsExperimental bool `json:"is_experimental"` + RegisterToCreativeMenu bool `json:"register_to_creative_menu"` +} + +type minecraftBlock struct { + Description description `json:"description"` + Components map[string]interface{} `json:"components"` +} + +type blockBehaviour struct { + FormatVersion string `json:"format_version"` + MinecraftBlock minecraftBlock `json:"minecraft:block"` +} + +func check(err error) { + if err != nil { + logrus.Fatal(err) + } +} + +func rand_seeded_uuid(str string) string { + id, _ := uuid.NewRandomFromReader(bytes.NewBufferString(str)) + return id.String() +} + +func New(name string) *BehaviourPack { + return &BehaviourPack{ + manifest: &resource.Manifest{ + FormatVersion: 2, + Header: resource.Header{ + Name: "pack.name", + Description: "pack.description", + UUID: rand_seeded_uuid(name + "_datapack"), + Version: [3]int{1, 0, 0}, + MinimumGameVersion: [3]int{1, 16, 0}, + }, + Modules: []resource.Module{ + { + Type: "data", + UUID: rand_seeded_uuid(name + "_data_module"), + Version: [3]int{1, 0, 0}, + }, + }, + Dependencies: []resource.Dependency{}, + Capabilities: []resource.Capability{}, + }, + } +} + +func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) { + entry := blockBehaviour{ + FormatVersion: "1.12.0", + MinecraftBlock: minecraftBlock{ + Description: description{ + Identifier: block.Name, + IsExperimental: false, + RegisterToCreativeMenu: true, + }, + Components: block.Properties, + }, + } + bp.blocks = append(bp.blocks, entry) +} + +func (bp *BehaviourPack) Save(w io.Writer) { + z := zip.NewWriter(w) + defer z.Close() + { // write manifest + w, err := z.Create("manifest.json") + check(err) + check(json.NewEncoder(w).Encode(bp.manifest)) + } + { // blocks + for _, be := range bp.blocks { + ns := strings.Split(be.MinecraftBlock.Description.Identifier, ":") + name := ns[len(ns)-1] + w, err := z.Create(fmt.Sprintf("blocks/%s.json", name)) + check(err) + check(json.NewEncoder(w).Encode(be)) + } + } +}