Add BlockEntity support

This commit is contained in:
Tnze
2022-12-18 18:28:08 +08:00
parent 27b1347e74
commit c1a6528a05
10 changed files with 712 additions and 153 deletions

View File

@ -0,0 +1,31 @@
// Code generated by {{Generator}}; DO NOT EDIT.
package block
{{/* type (
{{- range .}}
{{.Name | ToGoTypeName}}Entity struct {}
{{- end}}
) */}}
var EntityList = [...]Entity{
{{- range .}}
{{.Name | ToGoTypeName}}Entity{},
{{- end}}
}
{{- range .}}
func ({{.Name | ToGoTypeName}}Entity) ID() string { return {{.Name | printf "%q"}} }
{{- end}}
{{range .}}
func ({{.Name | ToFuncReceiverName}} {{.Name | ToGoTypeName}}Entity) IsValidBlock(block Block) bool {
{{if eq 1 (len .ValidBlocks)}}return block.ID() == {{index .ValidBlocks 0 | printf "%q"}}{{else}}switch block.ID() {
case {{index .ValidBlocks 0 | printf "%q"}}{{range slice .ValidBlocks 1}},
{{. | printf "%q"}}{{end}}:
return true
default:
return false
}{{end}}
}
{{end}}

View File

@ -0,0 +1,77 @@
package main
import (
"bytes"
"compress/gzip"
_ "embed"
"go/format"
"log"
"os"
"text/template"
"github.com/Tnze/go-mc/internal/generateutils"
"github.com/Tnze/go-mc/nbt"
)
//go:embed blockentities.go.tmpl
var tempSource string
var temp = template.Must(template.
New("block_template").
Funcs(template.FuncMap{
"UpperTheFirst": generateutils.UpperTheFirst,
"ToGoTypeName": generateutils.ToGoTypeName,
"ToFuncReceiverName": generateutils.ToFuncReceiverName,
"Generator": func() string { return "generator/blockentities/main.go" },
}).
Parse(tempSource),
)
type BlockEntity struct {
Name string
ValidBlocks []string
}
func main() {
var states []BlockEntity
readBlockEntities(&states)
// generate go source file
genSourceFile(states)
}
func readBlockEntities(states *[]BlockEntity) {
f, err := os.Open("block_entities.nbt")
if err != nil {
log.Panic(err)
}
defer f.Close()
r, err := gzip.NewReader(f)
if err != nil {
log.Panic(err)
}
// parse the nbt format
if _, err := nbt.NewDecoder(r).Decode(states); err != nil {
log.Panic(err)
}
}
func genSourceFile(states []BlockEntity) {
var source bytes.Buffer
if err := temp.Execute(&source, states); err != nil {
log.Panic(err)
}
formattedSource, err := format.Source(source.Bytes())
if err != nil {
panic(err)
}
err = os.WriteFile("blockentities.go", formattedSource, 0o666)
if err != nil {
panic(err)
}
log.Print("Generated blockentities.go")
}