Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d6b6e1ab9 | ||
|
|
56c97a2b3f | ||
|
|
9063a0328d | ||
|
|
84b28d4c12 | ||
|
|
30cfc507ba | ||
|
|
d84618c116 | ||
|
|
5a55520126 | ||
|
|
8ac5e00c8e | ||
|
|
d46c678b89 | ||
|
|
0b714edcf5 | ||
|
|
45151add64 | ||
|
|
b90830881f | ||
|
|
94301a4a50 | ||
|
|
aa5d15a4dc | ||
|
|
d388e2c350 | ||
|
|
126ff5bca0 |
@@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/admin-else/strom/cmd/strom/packet_inspector"
|
"github.com/admin-else/strom/cmd/strom/packet_inspector"
|
||||||
"github.com/admin-else/strom/cmd/strom/print_nbt"
|
"github.com/admin-else/strom/cmd/strom/print_nbt"
|
||||||
"github.com/admin-else/strom/cmd/strom/print_replay"
|
"github.com/admin-else/strom/cmd/strom/print_replay"
|
||||||
|
"github.com/admin-else/strom/cmd/strom/raw_capture"
|
||||||
"github.com/admin-else/strom/cmd/strom/registry_data_hunter"
|
"github.com/admin-else/strom/cmd/strom/registry_data_hunter"
|
||||||
"github.com/admin-else/strom/cmd/strom/serve_tmcpr"
|
"github.com/admin-else/strom/cmd/strom/serve_tmcpr"
|
||||||
"github.com/admin-else/strom/cmd/strom/serve_world"
|
"github.com/admin-else/strom/cmd/strom/serve_world"
|
||||||
@@ -60,6 +61,7 @@ var subcommands = map[string]func(args []string) error{
|
|||||||
"extract-mca": extract_mca.Run,
|
"extract-mca": extract_mca.Run,
|
||||||
"data": data.Run,
|
"data": data.Run,
|
||||||
"print-replay": print_replay.Run,
|
"print-replay": print_replay.Run,
|
||||||
|
"raw-capture": raw_capture.Run,
|
||||||
"registry-data-hunter": registry_data_hunter.Run,
|
"registry-data-hunter": registry_data_hunter.Run,
|
||||||
"serve-world": serve_world.Run,
|
"serve-world": serve_world.Run,
|
||||||
"mca-to-tmcpr": mca_to_tmcpr.Run,
|
"mca-to-tmcpr": mca_to_tmcpr.Run,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
generated "github.com/admin-else/strom/proto_generated/%v"
|
generated "github.com/admin-else/strom/mc/proto_generated/%v"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Error: %v
|
// Error: %v
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go/format"
|
||||||
"io"
|
"io"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
@@ -25,6 +26,7 @@ var (
|
|||||||
ProtocolVersion = cmd.Int("protocol", -1, "The protocol version")
|
ProtocolVersion = cmd.Int("protocol", -1, "The protocol version")
|
||||||
CreateTestsPath = cmd.String("create-tests", "", "")
|
CreateTestsPath = cmd.String("create-tests", "", "")
|
||||||
StateFlag = cmd.String("state", "login", "Initial state: login, config, play")
|
StateFlag = cmd.String("state", "login", "Initial state: login, config, play")
|
||||||
|
DirectionFlag = cmd.String("direction", "clientbound", "Packet direction: clientbound (ToClient) or serverbound (ToServer)")
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: maybe use the proto replay api
|
// TODO: maybe use the proto replay api
|
||||||
@@ -32,32 +34,43 @@ var (
|
|||||||
//go:embed failed_packet.go.tmpl
|
//go:embed failed_packet.go.tmpl
|
||||||
var TestSrcF string
|
var TestSrcF string
|
||||||
|
|
||||||
func SaveUnCodeAbleAsTest(packet *proto.UnCodablePacket) {
|
func SaveUnCodeAbleAsTest(packet *proto.UnCodablePacket) (err error) {
|
||||||
|
if packet.Info.Type == nil {
|
||||||
|
slog.Warn("skipping test for unknown packet id", "packet_id", packet.Info.PacketId, "state", packet.Info.State, "error", packet.Err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
hUntrimmed := sha256.Sum256(packet.Data)
|
hUntrimmed := sha256.Sum256(packet.Data)
|
||||||
h := hUntrimmed[:8]
|
h := hUntrimmed[:8]
|
||||||
f, err := os.Create(fmt.Sprintf(*CreateTestsPath+"/%v_%10x_test.go", len(packet.Data), h))
|
if err = os.MkdirAll(*CreateTestsPath, 0755); err != nil {
|
||||||
if err != nil {
|
return
|
||||||
panic(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret, err := data.LookUpVersionByProtocolVersion(packet.Info.ProtocolVersion)
|
ret, err := data.LookUpVersionByProtocolVersion(packet.Info.ProtocolVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return
|
||||||
}
|
}
|
||||||
goPackage := "v" + strings.ReplaceAll(ret.MinecraftVersion, ".", "_")
|
goPackage := "v" + strings.ReplaceAll(ret.MinecraftVersion, ".", "_")
|
||||||
|
typeName := reflect.TypeOf(packet.Info.Type).Elem().Name()
|
||||||
|
|
||||||
//goland:noinspection GoUnhandledErrorResult
|
src := fmt.Sprintf(TestSrcF, goPackage, packet.Err, h, typeName, packet.Data)
|
||||||
defer f.Close()
|
formatted, formatErr := format.Source([]byte(src))
|
||||||
_, err = fmt.Fprintf(f, TestSrcF, goPackage, packet.Err, h, reflect.TypeOf(packet.Info.Type).Elem().Name(), packet.Data)
|
if formatErr != nil {
|
||||||
if err != nil {
|
formatted = []byte(src)
|
||||||
panic(err)
|
|
||||||
}
|
}
|
||||||
slog.Info("Packet failed to parse", "error", packet.Err, "saved", f.Name(), "data", fmt.Sprintf("%q", packet.Data))
|
|
||||||
|
filePath := fmt.Sprintf(*CreateTestsPath+"/%v_%10x_test.go", len(packet.Data), h)
|
||||||
|
if err = os.WriteFile(filePath, formatted, 0644); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
slog.Info("Packet failed to parse", "error", packet.Err, "saved", filePath, "data", fmt.Sprintf("%q", packet.Data))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var state = proto_base.Login
|
var state = proto_base.Login
|
||||||
|
var direction = proto_base.ToClient
|
||||||
|
|
||||||
func UnpackPacket(r io.Reader) (packet proto_base.EncodeDecodeAble, err error) {
|
func UnpackPacket(r io.Reader) (packet proto_base.EncodeDecodeAble, i proto_base.PacketInfo, err error) {
|
||||||
var timestamp, length uint32
|
var timestamp, length uint32
|
||||||
err = binary.Read(r, binary.BigEndian, ×tamp)
|
err = binary.Read(r, binary.BigEndian, ×tamp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -87,22 +100,37 @@ func UnpackPacket(r io.Reader) (packet proto_base.EncodeDecodeAble, err error) {
|
|||||||
// indexafterid represents how many bytes we've read so far
|
// indexafterid represents how many bytes we've read so far
|
||||||
indexafterid := int(b.Size()) - b.Len()
|
indexafterid := int(b.Size()) - b.Len()
|
||||||
|
|
||||||
i, ok := proto.LookUpTypeByPacketInfo(proto_base.ToClient, state, packetId, int32(*ProtocolVersion))
|
var ok bool
|
||||||
|
i, ok = proto.LookUpTypeByPacketInfo(direction, state, packetId, int32(*ProtocolVersion))
|
||||||
if !ok {
|
if !ok {
|
||||||
packet = &proto.UnCodablePacket{Err: proto.BadPacketIdErr, Data: packetData, Info: i}
|
packet = &proto.UnCodablePacket{Err: proto.BadPacketIdErr, Data: packetData, Info: i}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
switch direction {
|
||||||
|
case proto_base.ToClient:
|
||||||
|
switch i.Name {
|
||||||
|
case "success":
|
||||||
|
state = proto_base.Configuration
|
||||||
|
case "finish_configuration":
|
||||||
|
state = proto_base.Play
|
||||||
|
}
|
||||||
|
case proto_base.ToServer:
|
||||||
|
switch i.Name {
|
||||||
|
case "login_acknowledged":
|
||||||
|
state = proto_base.Configuration
|
||||||
|
case "finish_configuration":
|
||||||
|
state = proto_base.Play
|
||||||
|
}
|
||||||
|
}
|
||||||
packet = reflect.New(reflect.TypeOf(i.Type).Elem()).Interface().(proto_base.EncodeDecodeAble)
|
packet = reflect.New(reflect.TypeOf(i.Type).Elem()).Interface().(proto_base.EncodeDecodeAble)
|
||||||
err = packet.Decode(b)
|
err = packet.Decode(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
packet = &proto.UnCodablePacket{Err: err, Data: packetData[indexafterid:], Info: i}
|
packet = &proto.UnCodablePacket{Err: err, Data: packetData[indexafterid:], Info: i}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch i.Name {
|
if b.Len() != 0 {
|
||||||
case "success":
|
packet = &proto.UnCodablePacket{Err: proto.PacketNotFullyDecodedErr, Data: packetData[indexafterid:], Info: i}
|
||||||
state = proto_base.Configuration
|
return
|
||||||
case "finish_configuration":
|
|
||||||
state = proto_base.Play
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -128,6 +156,14 @@ func Run(args []string) (err error) {
|
|||||||
default:
|
default:
|
||||||
return fmt.Errorf("unknown state: %s", *StateFlag)
|
return fmt.Errorf("unknown state: %s", *StateFlag)
|
||||||
}
|
}
|
||||||
|
switch *DirectionFlag {
|
||||||
|
case "clientbound", "to-client":
|
||||||
|
direction = proto_base.ToClient
|
||||||
|
case "serverbound", "to-server":
|
||||||
|
direction = proto_base.ToServer
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unknown direction: %s", *DirectionFlag)
|
||||||
|
}
|
||||||
f, err := os.Open(*FileFlag)
|
f, err := os.Open(*FileFlag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -137,21 +173,22 @@ func Run(args []string) (err error) {
|
|||||||
var totalPackets, failedPackets int
|
var totalPackets, failedPackets int
|
||||||
for {
|
for {
|
||||||
var packet proto_base.EncodeDecodeAble
|
var packet proto_base.EncodeDecodeAble
|
||||||
packet, err = UnpackPacket(f)
|
var info proto_base.PacketInfo
|
||||||
|
packet, info, err = UnpackPacket(f)
|
||||||
unCodablePacket, ok := packet.(*proto.UnCodablePacket)
|
unCodablePacket, ok := packet.(*proto.UnCodablePacket)
|
||||||
if ok {
|
if ok {
|
||||||
|
slog.Error("failed to decode packet", "error", err, "packet_name", info.Name)
|
||||||
if *CreateTestsPath != "" {
|
if *CreateTestsPath != "" {
|
||||||
SaveUnCodeAbleAsTest(unCodablePacket)
|
err = SaveUnCodeAbleAsTest(unCodablePacket)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("failed to save uncodable packet as test", "error", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
failedPackets++
|
failedPackets++
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Packet: %#v\n", packet)
|
fmt.Printf("Packet: %#v\n", packet)
|
||||||
}
|
if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) {
|
||||||
if errors.Is(err, io.EOF) {
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
totalPackets++
|
totalPackets++
|
||||||
|
|||||||
@@ -0,0 +1,253 @@
|
|||||||
|
package raw_capture
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/mc/api"
|
||||||
|
"github.com/admin-else/strom/mc/client"
|
||||||
|
"github.com/admin-else/strom/mc/data"
|
||||||
|
"github.com/admin-else/strom/mc/event"
|
||||||
|
"github.com/admin-else/strom/mc/proto"
|
||||||
|
"github.com/admin-else/strom/mc/proto/replay"
|
||||||
|
"github.com/admin-else/strom/mc/proto_base"
|
||||||
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_11"
|
||||||
|
"github.com/admin-else/strom/mc/server"
|
||||||
|
"github.com/admin-else/strom/mc/text"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Cmd = flag.NewFlagSet("raw-capture", flag.ContinueOnError)
|
||||||
|
|
||||||
|
var OfflineNameFlag = Cmd.String("name", "raw_capture", "offline player name")
|
||||||
|
var Token = Cmd.String("token", "", "token to use")
|
||||||
|
|
||||||
|
var TargetAddr = Cmd.String("addr", "127.0.0.1:25565", "address to connect to")
|
||||||
|
var ListenAddr = Cmd.String("listen", "127.0.0.1:25566", "address to listen on")
|
||||||
|
var ClientboundFile = Cmd.String("clientbound-file", "clientbound.tmcpr", "file to write clientbound packets to")
|
||||||
|
var ServerboundFile = Cmd.String("serverbound-file", "serverbound.tmcpr", "file to write serverbound packets to")
|
||||||
|
var Version = Cmd.String("version", "", "client protocol version (e.g. 26.1); if empty, detect from server status")
|
||||||
|
|
||||||
|
var StatusResponse = server.StatusResponse{
|
||||||
|
Version: server.StatusResponseVersion{
|
||||||
|
Name: text.Pretty("STROM raw-capture"),
|
||||||
|
Protocol: 0,
|
||||||
|
},
|
||||||
|
Players: server.StatusResponsePlayers{},
|
||||||
|
Description: text.Pretty("STROM raw-capture proxy"),
|
||||||
|
Favicon: "",
|
||||||
|
EnforcesSecureChat: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Proxy struct {
|
||||||
|
Client, Servee *proto.Conn
|
||||||
|
|
||||||
|
clientboundFile *os.File
|
||||||
|
serverboundFile *os.File
|
||||||
|
|
||||||
|
clientboundWriter *replay.Writer
|
||||||
|
serverboundWriter *replay.Writer
|
||||||
|
|
||||||
|
startTime time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) Start() (err error) {
|
||||||
|
p.startTime = time.Now()
|
||||||
|
|
||||||
|
p.Client.RegisterCritical(p.OnAnything)
|
||||||
|
p.Servee.RegisterCritical(p.OnAnything)
|
||||||
|
|
||||||
|
p.Client.RegisterCriticalUntilLatest(p.OnCompress)
|
||||||
|
p.Servee.RegisterCriticalUntilLatest(p.OnHandshake)
|
||||||
|
p.Servee.RegisterCriticalUntilLatest(p.OnLoginAcknowledged)
|
||||||
|
p.Servee.RegisterCriticalUntilLatest(p.OnFinishConfiguration)
|
||||||
|
|
||||||
|
errChan := make(chan error)
|
||||||
|
go func() {
|
||||||
|
errChan <- p.Client.StartConn()
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
errChan <- p.Servee.StartConn()
|
||||||
|
}()
|
||||||
|
err = <-errChan
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) timestamp() uint32 {
|
||||||
|
return uint32(time.Since(p.startTime).Milliseconds())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnAnything(e event.Anything) (err error) {
|
||||||
|
packet, ok := e.Val.(proto_base.EncodeDecodeAble)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
packetInfo, ok := proto.LookupPacketInfoByType(packet)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if packetInfo.Name == "encryption_begin" {
|
||||||
|
return fmt.Errorf("encryption requested by remote server; raw capture cannot continue")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch packetInfo.Direction {
|
||||||
|
case proto_base.ToServer:
|
||||||
|
err = p.serverboundWriter.WritePacket(packet, p.timestamp())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = p.Client.Send(packet)
|
||||||
|
case proto_base.ToClient:
|
||||||
|
err = p.clientboundWriter.WritePacket(packet, p.timestamp())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = p.Servee.Send(packet)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnCompress(packet *v1_21_11.LoginToClientPacketCompress) (err error) {
|
||||||
|
err = p.clientboundWriter.WritePacket(packet, p.timestamp())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = p.Servee.Send(packet)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Servee.SetCompressionThreshold(packet.Threshold)
|
||||||
|
p.Client.SetCompressionThreshold(packet.Threshold)
|
||||||
|
return event.DontForwardErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnHandshake(packet *v1_21_11.HandshakingToServerPacketSetProtocol) (err error) {
|
||||||
|
state := proto_base.State(packet.NextState)
|
||||||
|
p.Servee.SetState(state)
|
||||||
|
return event.DontForwardErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnLoginAcknowledged(packet *v1_21_11.LoginToServerPacketLoginAcknowledged) (err error) {
|
||||||
|
err = p.serverboundWriter.WritePacket(packet, p.timestamp())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = p.Client.Send(packet)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Servee.SetState(proto_base.Configuration)
|
||||||
|
p.Client.SetState(proto_base.Configuration)
|
||||||
|
return event.DontForwardErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnFinishConfiguration(packet *v1_21_11.ConfigurationToServerPacketFinishConfiguration) (err error) {
|
||||||
|
err = p.serverboundWriter.WritePacket(packet, p.timestamp())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = p.Client.Send(packet)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Servee.SetState(proto_base.Play)
|
||||||
|
p.Client.SetState(proto_base.Play)
|
||||||
|
return event.DontForwardErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = Cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clientboundFile, err := os.Create(*ClientboundFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("create clientbound file: %w", err)
|
||||||
|
}
|
||||||
|
defer clientboundFile.Close()
|
||||||
|
|
||||||
|
serverboundFile, err := os.Create(*ServerboundFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("create serverbound file: %w", err)
|
||||||
|
}
|
||||||
|
defer serverboundFile.Close()
|
||||||
|
|
||||||
|
resolvedAddr, _, _, err := client.DoDNSChecked(nil, *TargetAddr, nil)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetVersion string
|
||||||
|
var targetProtocol int32
|
||||||
|
if *Version == "" {
|
||||||
|
status, err := client.Status(nil, resolvedAddr)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to detect server version: %w", err)
|
||||||
|
}
|
||||||
|
targetProtocol = status.Version.Protocol
|
||||||
|
versionInfo, err := data.LookUpVersionByProtocolVersion(targetProtocol)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unknown protocol version %d: %w", targetProtocol, err)
|
||||||
|
}
|
||||||
|
targetVersion = versionInfo.MinecraftVersion
|
||||||
|
} else {
|
||||||
|
versionInfo, err := data.LookUpVersionByName(*Version)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unknown version %s: %w", *Version, err)
|
||||||
|
}
|
||||||
|
targetVersion = versionInfo.MinecraftVersion
|
||||||
|
targetProtocol = versionInfo.Version
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusResponse.Version.Name = text.Pretty("STROM raw-capture " + targetVersion)
|
||||||
|
StatusResponse.Version.Protocol = targetProtocol
|
||||||
|
StatusResponse.Description = text.Pretty(fmt.Sprintf("Raw capture proxy forwards to %s (%s)", resolvedAddr, targetVersion))
|
||||||
|
|
||||||
|
slog.Info("Starting raw capture", "listen", *ListenAddr, "target", resolvedAddr, "version", targetVersion, "protocol", targetProtocol, "clientbound", *ClientboundFile, "serverbound", *ServerboundFile)
|
||||||
|
|
||||||
|
err = server.StartServerWithOnConn(*ListenAddr, func(serveeConn *proto.Conn) (err error) {
|
||||||
|
proxy := &Proxy{
|
||||||
|
Servee: serveeConn,
|
||||||
|
clientboundFile: clientboundFile,
|
||||||
|
serverboundFile: serverboundFile,
|
||||||
|
clientboundWriter: replay.NewWriter(clientboundFile),
|
||||||
|
serverboundWriter: replay.NewWriter(serverboundFile),
|
||||||
|
}
|
||||||
|
|
||||||
|
acc := api.NewOfflineAccount(*OfflineNameFlag)
|
||||||
|
if *Token != "" {
|
||||||
|
acc, err = api.NewAccountFromYGG(*Token)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = server.ServeLogin(serveeConn, server.WithOtherAccount(acc), server.WithStatus(StatusResponse), server.WithoutOnlineMode(), server.WithoutEncryption())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := client.Connect(nil, resolvedAddr, targetVersion)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
err = client.LoginRaw(c, acc)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy.Client = c
|
||||||
|
proxy.Client.AlwaysDecode = true
|
||||||
|
proxy.Servee.AlwaysDecode = true
|
||||||
|
|
||||||
|
return proxy.Start()
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -289,6 +289,9 @@ func (a *Account) CheckGiftCodeValidity(giftCode string) (valid bool, err error)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewAccountFromYGG creates an Account by authenticating the YGG token against
|
||||||
|
// Mojang's API. It makes an HTTP call to fetch the player profile and returns
|
||||||
|
// an Account with name and UUID populated, or an error if authentication fails.
|
||||||
func NewAccountFromYGG(ygg string) (a *Account, err error) {
|
func NewAccountFromYGG(ygg string) (a *Account, err error) {
|
||||||
a = &Account{
|
a = &Account{
|
||||||
Ygg: ygg,
|
Ygg: ygg,
|
||||||
@@ -303,6 +306,8 @@ func NewAccountFromYGG(ygg string) (a *Account, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewAccount creates an Account from explicit name, UUID, and YGG token without
|
||||||
|
// making any HTTP calls. The account uses Mojang's default API servers.
|
||||||
func NewAccount(name string, uuid uuid.UUID, ygg string) (a *Account) {
|
func NewAccount(name string, uuid uuid.UUID, ygg string) (a *Account) {
|
||||||
return &Account{
|
return &Account{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"github.com/admin-else/strom/mc/crypto"
|
"github.com/admin-else/strom/mc/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewOfflineAccount creates an offline-mode Account with a UUID derived from the
|
||||||
|
// player name. No HTTP calls are made; the UUID is computed locally.
|
||||||
func NewOfflineAccount(name string) *Account {
|
func NewOfflineAccount(name string) *Account {
|
||||||
return &Account{
|
return &Account{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// BlockedServers fetches the list of SHA-1 hashes of blocked server IPs from
|
||||||
|
// Mojang's session server. The returned strings are hex-encoded hashes.
|
||||||
func BlockedServers() (s []string, err error) {
|
func BlockedServers() (s []string, err error) {
|
||||||
resp, err := http.Get("https://sessionserver.mojang.com/blockedservers")
|
resp, err := http.Get("https://sessionserver.mojang.com/blockedservers")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -36,6 +38,9 @@ type ProfileResp struct {
|
|||||||
Properties []ProfileProperty `json:"properties"`
|
Properties []ProfileProperty `json:"properties"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasJoined checks with Mojang's session server whether a player has joined a
|
||||||
|
// given server. name is the player name, server is the server hash, and ip is
|
||||||
|
// the optional player IP address. Returns the player's profile on success.
|
||||||
func HasJoined(name, server, ip string) (p ProfileResp, err error) {
|
func HasJoined(name, server, ip string) (p ProfileResp, err error) {
|
||||||
url := "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + server
|
url := "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + server
|
||||||
if ip != "" {
|
if ip != "" {
|
||||||
@@ -62,6 +67,8 @@ type MojangPublicKeysResp struct {
|
|||||||
AuthenticationKeys []string `json:"authenticationKeys"`
|
AuthenticationKeys []string `json:"authenticationKeys"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MojangPublicKeys fetches Mojang's public keys for profile property signing and
|
||||||
|
// player certificate verification from the session server.
|
||||||
func MojangPublicKeys() (keys MojangPublicKeysResp, err error) {
|
func MojangPublicKeys() (keys MojangPublicKeysResp, err error) {
|
||||||
resp, err := http.Get("https://sessionserver.mojang.com/session/minecraft/profile/public_key_by_token")
|
resp, err := http.Get("https://sessionserver.mojang.com/session/minecraft/profile/public_key_by_token")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -72,6 +79,8 @@ func MojangPublicKeys() (keys MojangPublicKeysResp, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Profile fetches a player's profile by UUID from Mojang's session server.
|
||||||
|
// If unsigned is false, signed profile properties are included in the response.
|
||||||
func Profile(id string, unsinged bool) (p ProfileResp, err error) {
|
func Profile(id string, unsinged bool) (p ProfileResp, err error) {
|
||||||
url := "https://sessionserver.mojang.com/session/minecraft/profile/" + id
|
url := "https://sessionserver.mojang.com/session/minecraft/profile/" + id
|
||||||
if !unsinged {
|
if !unsinged {
|
||||||
@@ -91,6 +100,8 @@ type IdName struct {
|
|||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NameToId resolves a Minecraft player name to a UUID and canonical name by
|
||||||
|
// making an HTTP GET to Mojang's API.
|
||||||
func NameToId(name string) (idName IdName, err error) {
|
func NameToId(name string) (idName IdName, err error) {
|
||||||
// may also use these:
|
// may also use these:
|
||||||
//https://api.mojang.com/users/profiles/minecraft/<player name>
|
//https://api.mojang.com/users/profiles/minecraft/<player name>
|
||||||
@@ -105,6 +116,8 @@ func NameToId(name string) (idName IdName, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NameToIdBulk resolves multiple Minecraft player names to UUIDs and canonical
|
||||||
|
// names in a single HTTP POST to Mojang's API.
|
||||||
func NameToIdBulk(names []string) (idNames []IdName, err error) {
|
func NameToIdBulk(names []string) (idNames []IdName, err error) {
|
||||||
b := bytes.NewBuffer(nil)
|
b := bytes.NewBuffer(nil)
|
||||||
err = json.NewEncoder(b).Encode(names)
|
err = json.NewEncoder(b).Encode(names)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ func (m *mod) onKeepAlive(p *v1_21_8.PlayToClientPacketKeepAlive) (err error) {
|
|||||||
return m.Send(&v1_21_8.PlayToServerPacketKeepAlive{KeepAliveId: p.KeepAliveId})
|
return m.Send(&v1_21_8.PlayToServerPacketKeepAlive{KeepAliveId: p.KeepAliveId})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start begins responding to keep-alive packets on the connection.
|
||||||
func Start(c *proto.Conn) {
|
func Start(c *proto.Conn) {
|
||||||
m := &mod{Conn: c}
|
m := &mod{Conn: c}
|
||||||
m.RegisterUntilLatest(m.onKeepAlive)
|
m.RegisterUntilLatest(m.onKeepAlive)
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ func (c *ConfigIgnorer) OnKeepAlive(packet *v1_21_8.ConfigurationToClientPacketK
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IgnoreConfig acknowledges configuration packets on the connection and transitions it to the Play state once configuration is complete.
|
||||||
func IgnoreConfig(c *proto.Conn) (err error) {
|
func IgnoreConfig(c *proto.Conn) (err error) {
|
||||||
ci := &ConfigIgnorer{c}
|
ci := &ConfigIgnorer{c}
|
||||||
ci.RegisterCritical(ci.Default)
|
ci.RegisterCritical(ci.Default)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MakeHandshakePacket creates a handshake packet using the connection's remote address as the server host.
|
||||||
func MakeHandshakePacket(c *proto.Conn, nextState proto_base.State) (p *v1_21_8.HandshakingToServerPacketSetProtocol, err error) {
|
func MakeHandshakePacket(c *proto.Conn, nextState proto_base.State) (p *v1_21_8.HandshakingToServerPacketSetProtocol, err error) {
|
||||||
return MakeHandshakePacketAddr(c, nextState, c.RemoteAddr().String())
|
return MakeHandshakePacketAddr(c, nextState, c.RemoteAddr().String())
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-1
@@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/admin-else/strom/mc/proto"
|
"github.com/admin-else/strom/mc/proto"
|
||||||
"github.com/admin-else/strom/mc/proto_base"
|
"github.com/admin-else/strom/mc/proto_base"
|
||||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||||
|
"github.com/admin-else/strom/mc/proto_generated/v26_2"
|
||||||
"github.com/admin-else/strom/mc/text"
|
"github.com/admin-else/strom/mc/text"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -121,10 +122,19 @@ func (s *LoginClient) OnSuccess(success *v1_21_8.LoginToClientPacketSuccess) (er
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *LoginClient) OnSuccess26_2(success *v26_2.LoginToClientPacketSuccess) (err error) {
|
||||||
|
return s.OnSuccess(&v1_21_8.LoginToClientPacketSuccess{
|
||||||
|
Uuid: success.Uuid,
|
||||||
|
Username: success.Username,
|
||||||
|
Properties: success.Properties,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (s *LoginClient) OnStart() (err error) {
|
func (s *LoginClient) OnStart() (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoginRaw performs the login handshake on an already-established connection without DNS resolution or configuration handling.
|
||||||
func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
|
func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
|
||||||
lc := &LoginClient{
|
lc := &LoginClient{
|
||||||
Conn: c,
|
Conn: c,
|
||||||
@@ -135,7 +145,8 @@ func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
|
|||||||
lc.RegisterCriticalUntilLatest(lc.OnCompress)
|
lc.RegisterCriticalUntilLatest(lc.OnCompress)
|
||||||
lc.RegisterCriticalUntilLatest(lc.OnEncrypt)
|
lc.RegisterCriticalUntilLatest(lc.OnEncrypt)
|
||||||
lc.RegisterCriticalUntilLatest(lc.OnDisconnect)
|
lc.RegisterCriticalUntilLatest(lc.OnDisconnect)
|
||||||
lc.RegisterCriticalUntilLatest(lc.OnSuccess)
|
lc.RegisterCriticalUntil("26.1", lc.OnSuccess)
|
||||||
|
lc.RegisterCriticalUntilLatest(lc.OnSuccess26_2)
|
||||||
|
|
||||||
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
|
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -156,18 +167,21 @@ func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithoutDns returns a login setting that disables SRV DNS resolution during login.
|
||||||
func WithoutDns() func(ls *loginSettings) {
|
func WithoutDns() func(ls *loginSettings) {
|
||||||
return func(ls *loginSettings) {
|
return func(ls *loginSettings) {
|
||||||
ls.NoDns = true
|
ls.NoDns = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithContext returns a login setting that sets the context used for the connection dial and DNS resolution.
|
||||||
func WithContext(ctx context.Context) func(ls *loginSettings) {
|
func WithContext(ctx context.Context) func(ls *loginSettings) {
|
||||||
return func(ls *loginSettings) {
|
return func(ls *loginSettings) {
|
||||||
ls.Ctx = ctx
|
ls.Ctx = ctx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithVersion returns a login setting that forces a specific Minecraft version string for the connection.
|
||||||
func WithVersion(version string) func(ls *loginSettings) {
|
func WithVersion(version string) func(ls *loginSettings) {
|
||||||
return func(ls *loginSettings) {
|
return func(ls *loginSettings) {
|
||||||
ls.Version = version
|
ls.Version = version
|
||||||
@@ -181,6 +195,7 @@ type loginSettings struct {
|
|||||||
IgnoreConfig bool
|
IgnoreConfig bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Login resolves the address with SRV DNS, connects, performs the login handshake, and handles the configuration phase, returning an authenticated connection ready for play.
|
||||||
func Login(connectTo string, account *api.Account, settings ...func(ls *loginSettings)) (c *proto.Conn, err error) {
|
func Login(connectTo string, account *api.Account, settings ...func(ls *loginSettings)) (c *proto.Conn, err error) {
|
||||||
ls := &loginSettings{}
|
ls := &loginSettings{}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package client_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/mc/data"
|
||||||
|
"github.com/admin-else/strom/mc/proto"
|
||||||
|
"github.com/admin-else/strom/mc/proto_base"
|
||||||
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertClientSendConvertible(t *testing.T, srcType reflect.Type, name string, state proto_base.State, direction proto_base.Direction, targetVersion int32) {
|
||||||
|
t.Helper()
|
||||||
|
targetInfo, ok := proto.LookupPacketInfoByNameProtocolVersionStateAndDirection(name, targetVersion, state, direction)
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("packet %s not found for version %d", name, targetVersion)
|
||||||
|
}
|
||||||
|
targetType := reflect.TypeOf(targetInfo.Type)
|
||||||
|
if !proto.SmartConvertibleTo(srcType, targetType) {
|
||||||
|
t.Fatalf("%s is not smart-convertible from v1_21_8 to version %d", name, targetVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func assertClientReceiveConvertible(t *testing.T, dstType reflect.Type, name string, state proto_base.State, direction proto_base.Direction, targetVersion int32) {
|
||||||
|
t.Helper()
|
||||||
|
targetInfo, ok := proto.LookupPacketInfoByNameProtocolVersionStateAndDirection(name, targetVersion, state, direction)
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("packet %s not found for version %d", name, targetVersion)
|
||||||
|
}
|
||||||
|
targetType := reflect.TypeOf(targetInfo.Type)
|
||||||
|
if !proto.SmartConvertibleTo(targetType, dstType) {
|
||||||
|
t.Fatalf("%s is not smart-convertible from version %d to v1_21_8", name, targetVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoginClientSendAssumptions(t *testing.T) {
|
||||||
|
v26_1Version := data.MustLookupProtocolVersion("26.1")
|
||||||
|
|
||||||
|
// Packets sent by LoginClient as v1_21_8.
|
||||||
|
assertClientSendConvertible(t, reflect.TypeFor[*v1_21_8.HandshakingToServerPacketSetProtocol](), "set_protocol", proto_base.Handshaking, proto_base.ToServer, v26_1Version)
|
||||||
|
assertClientSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginStart](), "login_start", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||||
|
assertClientSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginAcknowledged](), "login_acknowledged", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||||
|
assertClientSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoginClientReceiveAssumptions(t *testing.T) {
|
||||||
|
v26_1Version := data.MustLookupProtocolVersion("26.1")
|
||||||
|
|
||||||
|
// Packets received by LoginClient via RegisterCriticalUntilLatest.
|
||||||
|
// login_success is excluded because 26.2 is not convertible.
|
||||||
|
assertClientReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketCompress](), "compress", proto_base.Login, proto_base.ToClient, v26_1Version)
|
||||||
|
assertClientReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToClient, v26_1Version)
|
||||||
|
assertClientReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketDisconnect](), "disconnect", proto_base.Login, proto_base.ToClient, v26_1Version)
|
||||||
|
}
|
||||||
@@ -41,10 +41,12 @@ type CFB8 struct {
|
|||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCFB8Decrypt creates a new CFB8 stream cipher in decrypt mode.
|
||||||
func NewCFB8Decrypt(c cipher.Block, iv []byte) *CFB8 {
|
func NewCFB8Decrypt(c cipher.Block, iv []byte) *CFB8 {
|
||||||
return newCFB8(c, iv, true)
|
return newCFB8(c, iv, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCFB8Encrypt creates a new CFB8 stream cipher in encrypt mode.
|
||||||
func NewCFB8Encrypt(c cipher.Block, iv []byte) *CFB8 {
|
func NewCFB8Encrypt(c cipher.Block, iv []byte) *CFB8 {
|
||||||
return newCFB8(c, iv, false)
|
return newCFB8(c, iv, false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ func uuidV3(space []byte, data []byte) uuid.UUID {
|
|||||||
return u
|
return u
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FromOfflinePlayer generates a UUID for an offline-mode (cracked) player from their display name.
|
||||||
func FromOfflinePlayer(displayName string) uuid.UUID {
|
func FromOfflinePlayer(displayName string) uuid.UUID {
|
||||||
return uuidV3([]byte("OfflinePlayer:"), []byte(displayName))
|
return uuidV3([]byte("OfflinePlayer:"), []byte(displayName))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ type Biome struct {
|
|||||||
|
|
||||||
var BiomesCache = make(map[string][]*Biome)
|
var BiomesCache = make(map[string][]*Biome)
|
||||||
|
|
||||||
|
// BiomesForVersion returns the biome definitions for the given Minecraft version, caching them after the first load.
|
||||||
func BiomesForVersion(v string) (ret []*Biome) {
|
func BiomesForVersion(v string) (ret []*Biome) {
|
||||||
var ok bool
|
var ok bool
|
||||||
if ret, ok = BiomesCache[v]; ok {
|
if ret, ok = BiomesCache[v]; ok {
|
||||||
@@ -39,6 +40,7 @@ func BiomesForVersion(v string) (ret []*Biome) {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupBiomeById returns the biome with the given numeric ID in the given version.
|
||||||
func LookupBiomeById(version string, id int32) (biome *Biome, ok bool) {
|
func LookupBiomeById(version string, id int32) (biome *Biome, ok bool) {
|
||||||
for _, b := range BiomesForVersion(version) {
|
for _, b := range BiomesForVersion(version) {
|
||||||
if b.Id == id {
|
if b.Id == id {
|
||||||
@@ -52,6 +54,7 @@ func LookupBiomeById(version string, id int32) (biome *Biome, ok bool) {
|
|||||||
|
|
||||||
var UnknownBiomeNameErr = errors.New("unknown biome Name")
|
var UnknownBiomeNameErr = errors.New("unknown biome Name")
|
||||||
|
|
||||||
|
// LookupBiomeByName returns the biome with the given name in the given version.
|
||||||
func LookupBiomeByName(version string, name string) (biome *Biome, ok bool) {
|
func LookupBiomeByName(version string, name string) (biome *Biome, ok bool) {
|
||||||
for _, b := range BiomesForVersion(version) {
|
for _, b := range BiomesForVersion(version) {
|
||||||
if b.Name == name {
|
if b.Name == name {
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ type BlockState struct {
|
|||||||
var BlocksCache = make(map[string][]*Block)
|
var BlocksCache = make(map[string][]*Block)
|
||||||
var BlocksCacheIdMap = make(map[string]map[int32]*Block)
|
var BlocksCacheIdMap = make(map[string]map[int32]*Block)
|
||||||
|
|
||||||
|
// BlocksForVersion returns the block definitions for the given Minecraft version, caching them after the first load.
|
||||||
func BlocksForVersion(v string) (ret []*Block) {
|
func BlocksForVersion(v string) (ret []*Block) {
|
||||||
var ok bool
|
var ok bool
|
||||||
if ret, ok = BlocksCache[v]; ok {
|
if ret, ok = BlocksCache[v]; ok {
|
||||||
@@ -84,6 +85,7 @@ func BlocksForVersion(v string) (ret []*Block) {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupBlockByStateId returns the block for the given global palette state ID in the given version.
|
||||||
func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool) {
|
func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool) {
|
||||||
idmap, found := BlocksCacheIdMap[version]
|
idmap, found := BlocksCacheIdMap[version]
|
||||||
if !found {
|
if !found {
|
||||||
@@ -101,6 +103,7 @@ func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool)
|
|||||||
|
|
||||||
var UnknownBlockNameErr = errors.New("unknown block Name")
|
var UnknownBlockNameErr = errors.New("unknown block Name")
|
||||||
|
|
||||||
|
// LookupBlockByName returns the block with the given name in the given version.
|
||||||
func LookupBlockByName(version string, name string) (block *Block, ok bool) {
|
func LookupBlockByName(version string, name string) (block *Block, ok bool) {
|
||||||
for _, b := range BlocksForVersion(version) {
|
for _, b := range BlocksForVersion(version) {
|
||||||
if b.Name == name {
|
if b.Name == name {
|
||||||
@@ -111,6 +114,7 @@ func LookupBlockByName(version string, name string) (block *Block, ok bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateIdFromBlocKAndStateMap returns the global palette state ID for the given block name and state property map in the given version.
|
||||||
func StateIdFromBlocKAndStateMap(version string, name string, stateMap map[string]string) (stateId int32, err error) {
|
func StateIdFromBlocKAndStateMap(version string, name string, stateMap map[string]string) (stateId int32, err error) {
|
||||||
b, ok := LookupBlockByName(version, name)
|
b, ok := LookupBlockByName(version, name)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -135,6 +139,7 @@ var BadBlockStateTypeErr = errors.New("bad block state type")
|
|||||||
var BadEnumErr = errors.New("bad enum")
|
var BadEnumErr = errors.New("bad enum")
|
||||||
var SupplyAllStatesErr = errors.New("supply all states")
|
var SupplyAllStatesErr = errors.New("supply all states")
|
||||||
|
|
||||||
|
// FromBlockState converts a global palette state ID back into a block definition and a map of state properties.
|
||||||
func FromBlockState(version string, stateId int32) (b *Block, stateData map[string]string, err error) {
|
func FromBlockState(version string, stateId int32) (b *Block, stateData map[string]string, err error) {
|
||||||
b, ok := LookupBlockByStateId(version, stateId)
|
b, ok := LookupBlockByStateId(version, stateId)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|||||||
Executable
+27
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/sh
|
||||||
|
set -xeuo pipefail
|
||||||
|
|
||||||
|
# Copy minecraft-data from the local AnyGate checkout instead of cloning upstream.
|
||||||
|
# This is used when upstream does not yet have the target version or when we want
|
||||||
|
# to test local changes before pushing.
|
||||||
|
|
||||||
|
LOCAL_MINECRAFT_DATA="${LOCAL_MINECRAFT_DATA:-$HOME/src/anygate/minecraft-data}"
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
rm -rf minecraft-data/
|
||||||
|
mkdir -p minecraft-data/pc
|
||||||
|
|
||||||
|
cp "$LOCAL_MINECRAFT_DATA/data/dataPaths.json" minecraft-data/
|
||||||
|
|
||||||
|
copy-mc() {
|
||||||
|
cp -r "$LOCAL_MINECRAFT_DATA/data/pc/$1" minecraft-data/pc
|
||||||
|
}
|
||||||
|
|
||||||
|
copy-mc common
|
||||||
|
|
||||||
|
copy-mc 1.21.8
|
||||||
|
copy-mc 1.21.9
|
||||||
|
copy-mc 1.21.11
|
||||||
|
copy-mc 26.1
|
||||||
|
copy-mc 26.2
|
||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
//go:embed minecraft-data/pc minecraft-data/dataPaths.json
|
//go:embed minecraft-data/pc minecraft-data/dataPaths.json
|
||||||
var MinecraftData embed.FS
|
var MinecraftData embed.FS
|
||||||
|
|
||||||
|
// LoadJson reads a JSON file from the embedded minecraft-data FS and unmarshals it into data.
|
||||||
func LoadJson(path string, data any) (err error) {
|
func LoadJson(path string, data any) (err error) {
|
||||||
b, err := MinecraftData.ReadFile(path)
|
b, err := MinecraftData.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -21,6 +22,7 @@ func LoadJson(path string, data any) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadVersionedJson loads a version-specific JSON data file from the embedded minecraft-data FS and unmarshals it into data.
|
||||||
func LoadVersionedJson(version, dataName string, data any) (err error) {
|
func LoadVersionedJson(version, dataName string, data any) (err error) {
|
||||||
b, err := MinecraftData.ReadFile("minecraft-data/" + Paths.Data[version][dataName] + "/" + dataName + ".json")
|
b, err := MinecraftData.ReadFile("minecraft-data/" + Paths.Data[version][dataName] + "/" + dataName + ".json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ set -xeuo pipefail
|
|||||||
|
|
||||||
# Go get / install does not clone git submodules so we have to do it like this
|
# Go get / install does not clone git submodules so we have to do it like this
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
rm -rf minecraft-data/
|
rm -rf minecraft-data/
|
||||||
git clone --depth 1 git@github.com:PrismarineJS/minecraft-data.git
|
git clone --depth 1 git@github.com:PrismarineJS/minecraft-data.git
|
||||||
mv minecraft-data minecraft-data-untrimmed
|
mv minecraft-data minecraft-data-untrimmed
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ type Item struct {
|
|||||||
var ItemsCache = make(map[string][]*Item)
|
var ItemsCache = make(map[string][]*Item)
|
||||||
var ItemsCacheMutex = &sync.RWMutex{}
|
var ItemsCacheMutex = &sync.RWMutex{}
|
||||||
|
|
||||||
|
// ItemsForVersion returns the item definitions for the given Minecraft version, caching them after the first load.
|
||||||
func ItemsForVersion(v string) (ret []*Item) {
|
func ItemsForVersion(v string) (ret []*Item) {
|
||||||
var ok bool
|
var ok bool
|
||||||
ItemsCacheMutex.RLock()
|
ItemsCacheMutex.RLock()
|
||||||
@@ -35,6 +36,7 @@ func ItemsForVersion(v string) (ret []*Item) {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupItemById returns the item with the given numeric ID in the given version.
|
||||||
func LookupItemById(version string, id int32) (item *Item, ok bool) {
|
func LookupItemById(version string, id int32) (item *Item, ok bool) {
|
||||||
for _, i := range ItemsForVersion(version) {
|
for _, i := range ItemsForVersion(version) {
|
||||||
if i.Id == id {
|
if i.Id == id {
|
||||||
@@ -46,6 +48,7 @@ func LookupItemById(version string, id int32) (item *Item, ok bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupItemByName returns the item with the given name in the given version.
|
||||||
func LookupItemByName(version string, name string) (item *Item, ok bool) {
|
func LookupItemByName(version string, name string) (item *Item, ok bool) {
|
||||||
for _, i := range ItemsForVersion(version) {
|
for _, i := range ItemsForVersion(version) {
|
||||||
if i.Name == name {
|
if i.Name == name {
|
||||||
|
|||||||
@@ -1583,7 +1583,8 @@
|
|||||||
"tints": "pc/1.21.5",
|
"tints": "pc/1.21.5",
|
||||||
"version": "pc/1.21.5",
|
"version": "pc/1.21.5",
|
||||||
"windows": "pc/1.16.1",
|
"windows": "pc/1.16.1",
|
||||||
"proto": "pc/1.21.5"
|
"proto": "pc/1.21.5",
|
||||||
|
"multi_noise_biome_source_parameter_list": "pc/1.21.5"
|
||||||
},
|
},
|
||||||
"1.21.6": {
|
"1.21.6": {
|
||||||
"attributes": "pc/1.21.6",
|
"attributes": "pc/1.21.6",
|
||||||
@@ -1610,7 +1611,8 @@
|
|||||||
"tints": "pc/1.21.6",
|
"tints": "pc/1.21.6",
|
||||||
"version": "pc/1.21.6",
|
"version": "pc/1.21.6",
|
||||||
"windows": "pc/1.16.1",
|
"windows": "pc/1.16.1",
|
||||||
"proto": "pc/1.21.6"
|
"proto": "pc/1.21.6",
|
||||||
|
"multi_noise_biome_source_parameter_list": "pc/1.21.6"
|
||||||
},
|
},
|
||||||
"1.21.8": {
|
"1.21.8": {
|
||||||
"attributes": "pc/1.21.8",
|
"attributes": "pc/1.21.8",
|
||||||
@@ -1630,7 +1632,6 @@
|
|||||||
"loginPacket": "pc/1.21.3",
|
"loginPacket": "pc/1.21.3",
|
||||||
"mapIcons": "pc/1.20.2",
|
"mapIcons": "pc/1.20.2",
|
||||||
"materials": "pc/1.21.8",
|
"materials": "pc/1.21.8",
|
||||||
"multi_noise_biome_source_parameter_list": "pc/1.21.8",
|
|
||||||
"particles": "pc/1.21.8",
|
"particles": "pc/1.21.8",
|
||||||
"protocol": "pc/1.21.8",
|
"protocol": "pc/1.21.8",
|
||||||
"recipes": "pc/1.21.8",
|
"recipes": "pc/1.21.8",
|
||||||
@@ -1638,7 +1639,8 @@
|
|||||||
"tints": "pc/1.21.8",
|
"tints": "pc/1.21.8",
|
||||||
"version": "pc/1.21.8",
|
"version": "pc/1.21.8",
|
||||||
"windows": "pc/1.16.1",
|
"windows": "pc/1.16.1",
|
||||||
"proto": "pc/1.21.8"
|
"proto": "pc/1.21.8",
|
||||||
|
"multi_noise_biome_source_parameter_list": "pc/1.21.8"
|
||||||
},
|
},
|
||||||
"1.21.9": {
|
"1.21.9": {
|
||||||
"attributes": "pc/1.21.9",
|
"attributes": "pc/1.21.9",
|
||||||
@@ -1658,7 +1660,6 @@
|
|||||||
"loginPacket": "pc/1.21.9",
|
"loginPacket": "pc/1.21.9",
|
||||||
"mapIcons": "pc/1.20.2",
|
"mapIcons": "pc/1.20.2",
|
||||||
"materials": "pc/1.21.9",
|
"materials": "pc/1.21.9",
|
||||||
"multi_noise_biome_source_parameter_list": "pc/1.21.9",
|
|
||||||
"particles": "pc/1.21.9",
|
"particles": "pc/1.21.9",
|
||||||
"protocol": "pc/1.21.9",
|
"protocol": "pc/1.21.9",
|
||||||
"recipes": "pc/1.21.9",
|
"recipes": "pc/1.21.9",
|
||||||
@@ -1666,7 +1667,8 @@
|
|||||||
"tints": "pc/1.21.9",
|
"tints": "pc/1.21.9",
|
||||||
"version": "pc/1.21.9",
|
"version": "pc/1.21.9",
|
||||||
"windows": "pc/1.16.1",
|
"windows": "pc/1.16.1",
|
||||||
"proto": "pc/1.21.9"
|
"proto": "pc/1.21.9",
|
||||||
|
"multi_noise_biome_source_parameter_list": "pc/1.21.9"
|
||||||
},
|
},
|
||||||
"1.21.10": {
|
"1.21.10": {
|
||||||
"attributes": "pc/1.21.9",
|
"attributes": "pc/1.21.9",
|
||||||
@@ -1713,7 +1715,6 @@
|
|||||||
"loginPacket": "pc/1.21.11",
|
"loginPacket": "pc/1.21.11",
|
||||||
"mapIcons": "pc/1.20.2",
|
"mapIcons": "pc/1.20.2",
|
||||||
"materials": "pc/1.21.11",
|
"materials": "pc/1.21.11",
|
||||||
"multi_noise_biome_source_parameter_list": "pc/1.21.11",
|
|
||||||
"particles": "pc/1.21.11",
|
"particles": "pc/1.21.11",
|
||||||
"protocol": "pc/1.21.11",
|
"protocol": "pc/1.21.11",
|
||||||
"recipes": "pc/1.21.11",
|
"recipes": "pc/1.21.11",
|
||||||
@@ -1721,7 +1722,62 @@
|
|||||||
"tints": "pc/1.21.11",
|
"tints": "pc/1.21.11",
|
||||||
"version": "pc/1.21.11",
|
"version": "pc/1.21.11",
|
||||||
"windows": "pc/1.16.1",
|
"windows": "pc/1.16.1",
|
||||||
|
"proto": "pc/1.21.11",
|
||||||
|
"multi_noise_biome_source_parameter_list": "pc/1.21.11"
|
||||||
|
},
|
||||||
|
"26.1": {
|
||||||
|
"attributes": "pc/26.1",
|
||||||
|
"blockCollisionShapes": "pc/26.1",
|
||||||
|
"blocks": "pc/26.1",
|
||||||
|
"blockLoot": "pc/1.20",
|
||||||
|
"biomes": "pc/26.1",
|
||||||
|
"commands": "pc/1.20.3",
|
||||||
|
"effects": "pc/26.1",
|
||||||
|
"enchantments": "pc/26.1",
|
||||||
|
"entities": "pc/26.1",
|
||||||
|
"entityLoot": "pc/1.20",
|
||||||
|
"foods": "pc/26.1",
|
||||||
|
"instruments": "pc/26.1",
|
||||||
|
"items": "pc/26.1",
|
||||||
|
"language": "pc/26.1",
|
||||||
|
"loginPacket": "pc/1.21.11",
|
||||||
|
"mapIcons": "pc/1.20.2",
|
||||||
|
"materials": "pc/26.1",
|
||||||
|
"particles": "pc/26.1",
|
||||||
|
"protocol": "pc/26.1",
|
||||||
|
"recipes": "pc/26.1",
|
||||||
|
"sounds": "pc/26.1",
|
||||||
|
"tints": "pc/26.1",
|
||||||
|
"version": "pc/26.1",
|
||||||
|
"windows": "pc/1.16.1",
|
||||||
"proto": "pc/latest"
|
"proto": "pc/latest"
|
||||||
|
},
|
||||||
|
"26.2": {
|
||||||
|
"attributes": "pc/26.2",
|
||||||
|
"blockCollisionShapes": "pc/26.2",
|
||||||
|
"blocks": "pc/26.2",
|
||||||
|
"blockLoot": "pc/1.20",
|
||||||
|
"biomes": "pc/26.2",
|
||||||
|
"commands": "pc/1.20.3",
|
||||||
|
"effects": "pc/26.2",
|
||||||
|
"enchantments": "pc/26.2",
|
||||||
|
"entities": "pc/26.2",
|
||||||
|
"entityLoot": "pc/1.20",
|
||||||
|
"foods": "pc/26.2",
|
||||||
|
"instruments": "pc/26.2",
|
||||||
|
"items": "pc/26.2",
|
||||||
|
"language": "pc/26.2",
|
||||||
|
"loginPacket": "pc/1.21.11",
|
||||||
|
"mapIcons": "pc/1.20.2",
|
||||||
|
"materials": "pc/26.2",
|
||||||
|
"particles": "pc/26.2",
|
||||||
|
"protocol": "pc/26.2",
|
||||||
|
"recipes": "pc/26.2",
|
||||||
|
"sounds": "pc/26.2",
|
||||||
|
"tints": "pc/26.2",
|
||||||
|
"version": "pc/26.2",
|
||||||
|
"windows": "pc/1.16.1",
|
||||||
|
"proto": "pc/26.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bedrock": {
|
"bedrock": {
|
||||||
@@ -2767,12 +2823,12 @@
|
|||||||
"language": "bedrock/1.21.70"
|
"language": "bedrock/1.21.70"
|
||||||
},
|
},
|
||||||
"1.26.0": {
|
"1.26.0": {
|
||||||
"blocks": "bedrock/1.21.111",
|
"blocks": "bedrock/1.26.0",
|
||||||
"blockStates": "bedrock/1.21.111",
|
"blockStates": "bedrock/1.26.0",
|
||||||
"blockCollisionShapes": "bedrock/1.21.111",
|
"blockCollisionShapes": "bedrock/1.26.0",
|
||||||
"biomes": "bedrock/1.21.60",
|
"biomes": "bedrock/1.21.60",
|
||||||
"entities": "bedrock/1.21.80",
|
"entities": "bedrock/1.21.80",
|
||||||
"items": "bedrock/1.21.111",
|
"items": "bedrock/1.26.0",
|
||||||
"recipes": "bedrock/1.19.10",
|
"recipes": "bedrock/1.19.10",
|
||||||
"instruments": "bedrock/1.17.0",
|
"instruments": "bedrock/1.17.0",
|
||||||
"materials": "pc/1.17",
|
"materials": "pc/1.17",
|
||||||
@@ -2781,33 +2837,77 @@
|
|||||||
"protocol": "bedrock/1.26.0",
|
"protocol": "bedrock/1.26.0",
|
||||||
"windows": "bedrock/1.16.201",
|
"windows": "bedrock/1.16.201",
|
||||||
"steve": "bedrock/1.21.70",
|
"steve": "bedrock/1.21.70",
|
||||||
"blocksB2J": "bedrock/1.21.111",
|
"blocksB2J": "bedrock/1.26.0",
|
||||||
"blocksJ2B": "bedrock/1.21.111",
|
"blocksJ2B": "bedrock/1.26.0",
|
||||||
"proto": "bedrock/1.26.0",
|
"proto": "bedrock/1.26.0",
|
||||||
"types": "bedrock/latest",
|
"types": "bedrock/latest",
|
||||||
"version": "bedrock/1.26.0",
|
"version": "bedrock/1.26.0",
|
||||||
"language": "bedrock/1.21.70"
|
"language": "bedrock/1.21.70"
|
||||||
},
|
},
|
||||||
"26.10": {
|
"1.26.10": {
|
||||||
"blocks": "bedrock/1.21.111",
|
"blocks": "bedrock/1.26.10",
|
||||||
"blockStates": "bedrock/1.21.111",
|
"blockStates": "bedrock/1.26.10",
|
||||||
"blockCollisionShapes": "bedrock/1.21.111",
|
"blockCollisionShapes": "bedrock/1.26.10",
|
||||||
"biomes": "bedrock/1.21.60",
|
"biomes": "bedrock/1.21.60",
|
||||||
"entities": "bedrock/1.21.80",
|
"entities": "bedrock/1.21.80",
|
||||||
"items": "bedrock/1.21.111",
|
"items": "bedrock/1.26.10",
|
||||||
"recipes": "bedrock/1.19.10",
|
"recipes": "bedrock/1.19.10",
|
||||||
"instruments": "bedrock/1.17.0",
|
"instruments": "bedrock/1.17.0",
|
||||||
"materials": "pc/1.17",
|
"materials": "pc/1.17",
|
||||||
"enchantments": "bedrock/1.19.1",
|
"enchantments": "bedrock/1.19.1",
|
||||||
"effects": "pc/1.17",
|
"effects": "pc/1.17",
|
||||||
"protocol": "bedrock/26.10",
|
"protocol": "bedrock/1.26.10",
|
||||||
"windows": "bedrock/1.16.201",
|
"windows": "bedrock/1.16.201",
|
||||||
"steve": "bedrock/1.21.70",
|
"steve": "bedrock/1.21.70",
|
||||||
"blocksB2J": "bedrock/1.21.111",
|
"blocksB2J": "bedrock/1.26.0",
|
||||||
"blocksJ2B": "bedrock/1.21.111",
|
"blocksJ2B": "bedrock/1.26.0",
|
||||||
|
"proto": "bedrock/1.26.10",
|
||||||
|
"types": "bedrock/latest",
|
||||||
|
"version": "bedrock/1.26.10",
|
||||||
|
"language": "bedrock/1.21.70"
|
||||||
|
},
|
||||||
|
"1.26.20": {
|
||||||
|
"blocks": "bedrock/1.26.20",
|
||||||
|
"blockStates": "bedrock/1.26.20",
|
||||||
|
"blockCollisionShapes": "bedrock/1.26.20",
|
||||||
|
"biomes": "bedrock/1.21.60",
|
||||||
|
"entities": "bedrock/1.21.80",
|
||||||
|
"items": "bedrock/1.26.20",
|
||||||
|
"recipes": "bedrock/1.19.10",
|
||||||
|
"instruments": "bedrock/1.17.0",
|
||||||
|
"materials": "pc/1.17",
|
||||||
|
"enchantments": "bedrock/1.19.1",
|
||||||
|
"effects": "pc/1.17",
|
||||||
|
"protocol": "bedrock/1.26.20",
|
||||||
|
"windows": "bedrock/1.16.201",
|
||||||
|
"steve": "bedrock/1.21.70",
|
||||||
|
"blocksB2J": "bedrock/1.26.20",
|
||||||
|
"blocksJ2B": "bedrock/1.26.20",
|
||||||
|
"proto": "bedrock/1.26.20",
|
||||||
|
"types": "bedrock/latest",
|
||||||
|
"version": "bedrock/1.26.20",
|
||||||
|
"language": "bedrock/1.21.70"
|
||||||
|
},
|
||||||
|
"1.26.30": {
|
||||||
|
"blocks": "bedrock/1.26.30",
|
||||||
|
"blockStates": "bedrock/1.26.30",
|
||||||
|
"blockCollisionShapes": "bedrock/1.26.30",
|
||||||
|
"biomes": "bedrock/1.21.60",
|
||||||
|
"entities": "bedrock/1.21.80",
|
||||||
|
"items": "bedrock/1.26.30",
|
||||||
|
"recipes": "bedrock/1.19.10",
|
||||||
|
"instruments": "bedrock/1.17.0",
|
||||||
|
"materials": "pc/1.17",
|
||||||
|
"enchantments": "bedrock/1.19.1",
|
||||||
|
"effects": "pc/1.17",
|
||||||
|
"protocol": "bedrock/1.26.30",
|
||||||
|
"windows": "bedrock/1.16.201",
|
||||||
|
"steve": "bedrock/1.21.70",
|
||||||
|
"blocksB2J": "bedrock/1.26.30",
|
||||||
|
"blocksJ2B": "bedrock/1.26.30",
|
||||||
"proto": "bedrock/latest",
|
"proto": "bedrock/latest",
|
||||||
"types": "bedrock/latest",
|
"types": "bedrock/latest",
|
||||||
"version": "bedrock/26.10",
|
"version": "bedrock/1.26.30",
|
||||||
"language": "bedrock/1.21.70"
|
"language": "bedrock/1.21.70"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,156 +1,4 @@
|
|||||||
{
|
{
|
||||||
"minecraft:nether": [
|
|
||||||
{
|
|
||||||
"biome": "minecraft:nether_wastes",
|
|
||||||
"parameters": {
|
|
||||||
"temperature": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"humidity": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"continentalness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"erosion": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"depth": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"weirdness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"offset": 0.0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"biome": "minecraft:soul_sand_valley",
|
|
||||||
"parameters": {
|
|
||||||
"temperature": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"humidity": [
|
|
||||||
-5000,
|
|
||||||
-5000
|
|
||||||
],
|
|
||||||
"continentalness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"erosion": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"depth": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"weirdness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"offset": 0.0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"biome": "minecraft:crimson_forest",
|
|
||||||
"parameters": {
|
|
||||||
"temperature": [
|
|
||||||
4000,
|
|
||||||
4000
|
|
||||||
],
|
|
||||||
"humidity": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"continentalness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"erosion": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"depth": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"weirdness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"offset": 0.0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"biome": "minecraft:warped_forest",
|
|
||||||
"parameters": {
|
|
||||||
"temperature": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"humidity": [
|
|
||||||
5000,
|
|
||||||
5000
|
|
||||||
],
|
|
||||||
"continentalness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"erosion": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"depth": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"weirdness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"offset": 0.375
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"biome": "minecraft:basalt_deltas",
|
|
||||||
"parameters": {
|
|
||||||
"temperature": [
|
|
||||||
-5000,
|
|
||||||
-5000
|
|
||||||
],
|
|
||||||
"humidity": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"continentalness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"erosion": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"depth": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"weirdness": [
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"offset": 0.175
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"minecraft:overworld": [
|
"minecraft:overworld": [
|
||||||
{
|
{
|
||||||
"biome": "minecraft:mushroom_fields",
|
"biome": "minecraft:mushroom_fields",
|
||||||
@@ -227942,5 +227790,157 @@
|
|||||||
"offset": 0.0
|
"offset": 0.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"minecraft:nether": [
|
||||||
|
{
|
||||||
|
"biome": "minecraft:nether_wastes",
|
||||||
|
"parameters": {
|
||||||
|
"temperature": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"humidity": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"continentalness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"erosion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"depth": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"weirdness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"offset": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"biome": "minecraft:soul_sand_valley",
|
||||||
|
"parameters": {
|
||||||
|
"temperature": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"humidity": [
|
||||||
|
-5000,
|
||||||
|
-5000
|
||||||
|
],
|
||||||
|
"continentalness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"erosion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"depth": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"weirdness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"offset": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"biome": "minecraft:crimson_forest",
|
||||||
|
"parameters": {
|
||||||
|
"temperature": [
|
||||||
|
4000,
|
||||||
|
4000
|
||||||
|
],
|
||||||
|
"humidity": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"continentalness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"erosion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"depth": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"weirdness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"offset": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"biome": "minecraft:warped_forest",
|
||||||
|
"parameters": {
|
||||||
|
"temperature": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"humidity": [
|
||||||
|
5000,
|
||||||
|
5000
|
||||||
|
],
|
||||||
|
"continentalness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"erosion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"depth": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"weirdness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"offset": 0.375
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"biome": "minecraft:basalt_deltas",
|
||||||
|
"parameters": {
|
||||||
|
"temperature": [
|
||||||
|
-5000,
|
||||||
|
-5000
|
||||||
|
],
|
||||||
|
"humidity": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"continentalness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"erosion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"depth": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"weirdness": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"offset": 0.175
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -447,6 +447,11 @@
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
"attribute_modifiers": [
|
"attribute_modifiers": [
|
||||||
|
"container",
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "attributes",
|
||||||
|
"type": [
|
||||||
"array",
|
"array",
|
||||||
{
|
{
|
||||||
"countType": "varint",
|
"countType": "varint",
|
||||||
@@ -500,6 +505,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "display",
|
"name": "display",
|
||||||
@@ -536,8 +546,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"custom_model_data": [
|
"custom_model_data": [
|
||||||
"container",
|
"container",
|
||||||
@@ -5706,6 +5714,10 @@
|
|||||||
"play": {
|
"play": {
|
||||||
"toClient": {
|
"toClient": {
|
||||||
"types": {
|
"types": {
|
||||||
|
"packet_bundle_delimiter": [
|
||||||
|
"container",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"SlotDisplay": [
|
"SlotDisplay": [
|
||||||
"container",
|
"container",
|
||||||
[
|
[
|
||||||
@@ -10121,7 +10133,7 @@
|
|||||||
{
|
{
|
||||||
"compareTo": "name",
|
"compareTo": "name",
|
||||||
"fields": {
|
"fields": {
|
||||||
"bundle_delimiter": "void",
|
"bundle_delimiter": "packet_bundle_delimiter",
|
||||||
"spawn_entity": "packet_spawn_entity",
|
"spawn_entity": "packet_spawn_entity",
|
||||||
"animation": "packet_animation",
|
"animation": "packet_animation",
|
||||||
"statistics": "packet_statistics",
|
"statistics": "packet_statistics",
|
||||||
|
|||||||
@@ -1595,6 +1595,9 @@
|
|||||||
if select_known_packs: packet_common_select_known_packs
|
if select_known_packs: packet_common_select_known_packs
|
||||||
if custom_click_action: packet_common_custom_click_action
|
if custom_click_action: packet_common_custom_click_action
|
||||||
^play.toClient.types:
|
^play.toClient.types:
|
||||||
|
# MC: ClientboundBundleDelimiterPacket
|
||||||
|
packet_bundle_delimiter:
|
||||||
|
# empty
|
||||||
SlotDisplay:
|
SlotDisplay:
|
||||||
type: varint =>
|
type: varint =>
|
||||||
- empty
|
- empty
|
||||||
@@ -2844,7 +2847,7 @@
|
|||||||
- clear_dialog
|
- clear_dialog
|
||||||
- show_dialog
|
- show_dialog
|
||||||
params: name ?
|
params: name ?
|
||||||
if bundle_delimiter: void
|
if bundle_delimiter: packet_bundle_delimiter
|
||||||
if spawn_entity: packet_spawn_entity
|
if spawn_entity: packet_spawn_entity
|
||||||
if animation: packet_animation
|
if animation: packet_animation
|
||||||
if statistics: packet_statistics
|
if statistics: packet_statistics
|
||||||
@@ -3031,7 +3034,7 @@
|
|||||||
"count": 3
|
"count": 3
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
checksum: i8
|
checksum: u8
|
||||||
# MC: ServerboundChatPacket
|
# MC: ServerboundChatPacket
|
||||||
packet_chat_message:
|
packet_chat_message:
|
||||||
message: string
|
message: string
|
||||||
@@ -3050,7 +3053,7 @@
|
|||||||
"count": 3
|
"count": 3
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
checksum: i8
|
checksum: u8
|
||||||
# MC: ServerboundChatSessionUpdatePacket
|
# MC: ServerboundChatSessionUpdatePacket
|
||||||
packet_chat_session_update:
|
packet_chat_session_update:
|
||||||
sessionUUID: UUID
|
sessionUUID: UUID
|
||||||
@@ -3076,7 +3079,7 @@
|
|||||||
# MC: ServerboundContainerButtonClickPacket
|
# MC: ServerboundContainerButtonClickPacket
|
||||||
packet_enchant_item:
|
packet_enchant_item:
|
||||||
windowId: ContainerID
|
windowId: ContainerID
|
||||||
enchantment: i8
|
enchantment: varint
|
||||||
# MC: ServerboundContainerClickPacket
|
# MC: ServerboundContainerClickPacket
|
||||||
packet_window_click:
|
packet_window_click:
|
||||||
windowId: ContainerID
|
windowId: ContainerID
|
||||||
|
|||||||
@@ -4377,6 +4377,10 @@
|
|||||||
"play": {
|
"play": {
|
||||||
"toClient": {
|
"toClient": {
|
||||||
"types": {
|
"types": {
|
||||||
|
"packet_bundle_delimiter": [
|
||||||
|
"container",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"SlotDisplay": [
|
"SlotDisplay": [
|
||||||
"container",
|
"container",
|
||||||
[
|
[
|
||||||
@@ -8702,7 +8706,7 @@
|
|||||||
{
|
{
|
||||||
"compareTo": "name",
|
"compareTo": "name",
|
||||||
"fields": {
|
"fields": {
|
||||||
"bundle_delimiter": "void",
|
"bundle_delimiter": "packet_bundle_delimiter",
|
||||||
"spawn_entity": "packet_spawn_entity",
|
"spawn_entity": "packet_spawn_entity",
|
||||||
"animation": "packet_animation",
|
"animation": "packet_animation",
|
||||||
"statistics": "packet_statistics",
|
"statistics": "packet_statistics",
|
||||||
@@ -8996,7 +9000,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "checksum",
|
"name": "checksum",
|
||||||
"type": "i8"
|
"type": "u8"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -9042,7 +9046,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "checksum",
|
"name": "checksum",
|
||||||
"type": "i8"
|
"type": "u8"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -9115,7 +9119,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "enchantment",
|
"name": "enchantment",
|
||||||
"type": "i8"
|
"type": "varint"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1835,6 +1835,9 @@
|
|||||||
if custom_click_action: packet_common_custom_click_action
|
if custom_click_action: packet_common_custom_click_action
|
||||||
if accept_code_of_conduct: packet_accept_code_of_conduct
|
if accept_code_of_conduct: packet_accept_code_of_conduct
|
||||||
^play.toClient.types:
|
^play.toClient.types:
|
||||||
|
# MC: ClientboundBundleDelimiterPacket
|
||||||
|
packet_bundle_delimiter:
|
||||||
|
# empty
|
||||||
SlotDisplay:
|
SlotDisplay:
|
||||||
type: varint =>
|
type: varint =>
|
||||||
- empty
|
- empty
|
||||||
@@ -3114,7 +3117,7 @@
|
|||||||
- clear_dialog
|
- clear_dialog
|
||||||
- show_dialog
|
- show_dialog
|
||||||
params: name ?
|
params: name ?
|
||||||
if bundle_delimiter: void
|
if bundle_delimiter: packet_bundle_delimiter
|
||||||
if spawn_entity: packet_spawn_entity
|
if spawn_entity: packet_spawn_entity
|
||||||
if animation: packet_animation
|
if animation: packet_animation
|
||||||
if statistics: packet_statistics
|
if statistics: packet_statistics
|
||||||
@@ -3305,7 +3308,7 @@
|
|||||||
"count": 3
|
"count": 3
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
checksum: i8
|
checksum: u8
|
||||||
# MC: ServerboundChatPacket
|
# MC: ServerboundChatPacket
|
||||||
packet_chat_message:
|
packet_chat_message:
|
||||||
message: string
|
message: string
|
||||||
@@ -3350,7 +3353,7 @@
|
|||||||
# MC: ServerboundContainerButtonClickPacket
|
# MC: ServerboundContainerButtonClickPacket
|
||||||
packet_enchant_item:
|
packet_enchant_item:
|
||||||
windowId: ContainerID
|
windowId: ContainerID
|
||||||
enchantment: i8
|
enchantment: varint
|
||||||
# MC: ServerboundContainerClickPacket
|
# MC: ServerboundContainerClickPacket
|
||||||
packet_window_click:
|
packet_window_click:
|
||||||
windowId: ContainerID
|
windowId: ContainerID
|
||||||
|
|||||||
@@ -5416,6 +5416,10 @@
|
|||||||
"play": {
|
"play": {
|
||||||
"toClient": {
|
"toClient": {
|
||||||
"types": {
|
"types": {
|
||||||
|
"packet_bundle_delimiter": [
|
||||||
|
"container",
|
||||||
|
[]
|
||||||
|
],
|
||||||
"SlotDisplay": [
|
"SlotDisplay": [
|
||||||
"container",
|
"container",
|
||||||
[
|
[
|
||||||
@@ -9831,7 +9835,7 @@
|
|||||||
{
|
{
|
||||||
"compareTo": "name",
|
"compareTo": "name",
|
||||||
"fields": {
|
"fields": {
|
||||||
"bundle_delimiter": "void",
|
"bundle_delimiter": "packet_bundle_delimiter",
|
||||||
"spawn_entity": "packet_spawn_entity",
|
"spawn_entity": "packet_spawn_entity",
|
||||||
"animation": "packet_animation",
|
"animation": "packet_animation",
|
||||||
"statistics": "packet_statistics",
|
"statistics": "packet_statistics",
|
||||||
@@ -10130,7 +10134,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "checksum",
|
"name": "checksum",
|
||||||
"type": "i8"
|
"type": "u8"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -10249,7 +10253,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "enchantment",
|
"name": "enchantment",
|
||||||
"type": "i8"
|
"type": "varint"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -0,0 +1,247 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "armor",
|
||||||
|
"resource": "minecraft:armor",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 30.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armorToughness",
|
||||||
|
"resource": "minecraft:armor_toughness",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackDamage",
|
||||||
|
"resource": "minecraft:attack_damage",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackKnockback",
|
||||||
|
"resource": "minecraft:attack_knockback",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 5.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackSpeed",
|
||||||
|
"resource": "minecraft:attack_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockBreakSpeed",
|
||||||
|
"resource": "minecraft:block_break_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockInteractionRange",
|
||||||
|
"resource": "minecraft:block_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "burningTime",
|
||||||
|
"resource": "minecraft:burning_time",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cameraDistance",
|
||||||
|
"resource": "minecraft:camera_distance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explosionKnockbackResistance",
|
||||||
|
"resource": "minecraft:explosion_knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityInteractionRange",
|
||||||
|
"resource": "minecraft:entity_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fallDamageMultiplier",
|
||||||
|
"resource": "minecraft:fall_damage_multiplier",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 100.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "flyingSpeed",
|
||||||
|
"resource": "minecraft:flying_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "followRange",
|
||||||
|
"resource": "minecraft:follow_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 32.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gravity",
|
||||||
|
"resource": "minecraft:gravity",
|
||||||
|
"min": -1.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jumpStrength",
|
||||||
|
"resource": "minecraft:jump_strength",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 0.41999998688697815
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "knockbackResistance",
|
||||||
|
"resource": "minecraft:knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "luck",
|
||||||
|
"resource": "minecraft:luck",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxAbsorption",
|
||||||
|
"resource": "minecraft:max_absorption",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxHealth",
|
||||||
|
"resource": "minecraft:max_health",
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 20.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "miningEfficiency",
|
||||||
|
"resource": "minecraft:mining_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementEfficiency",
|
||||||
|
"resource": "minecraft:movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementSpeed",
|
||||||
|
"resource": "minecraft:movement_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oxygenBonus",
|
||||||
|
"resource": "minecraft:oxygen_bonus",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "safeFallDistance",
|
||||||
|
"resource": "minecraft:safe_fall_distance",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scale",
|
||||||
|
"resource": "minecraft:scale",
|
||||||
|
"min": 0.0625,
|
||||||
|
"max": 16.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sneakingSpeed",
|
||||||
|
"resource": "minecraft:sneaking_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnReinforcements",
|
||||||
|
"resource": "minecraft:spawn_reinforcements",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stepHeight",
|
||||||
|
"resource": "minecraft:step_height",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 10.0,
|
||||||
|
"default": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "submergedMiningSpeed",
|
||||||
|
"resource": "minecraft:submerged_mining_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sweepingDamageRatio",
|
||||||
|
"resource": "minecraft:sweeping_damage_ratio",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temptRange",
|
||||||
|
"resource": "minecraft:tempt_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waterMovementEfficiency",
|
||||||
|
"resource": "minecraft:water_movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointTransmitRange",
|
||||||
|
"resource": "minecraft:waypoint_transmit_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointReceiveRange",
|
||||||
|
"resource": "minecraft:waypoint_receive_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,652 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bamboo_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Bamboo Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "basalt_deltas",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Basalt Deltas",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Beach",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "cherry_grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cherry Grove",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "crimson_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Crimson Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dark_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dark Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "deep_cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "deep_dark",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Dark",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "deep_frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Frozen Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "deep_lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "deep_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "desert",
|
||||||
|
"category": "desert",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Desert",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "dripstone_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dripstone Caves",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "end_barrens",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Barrens",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "end_highlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Highlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "end_midlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Midlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "eroded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Eroded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "flower_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Flower Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Ocean",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "frozen_peaks",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "frozen_river",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen River",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": -0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Grove",
|
||||||
|
"color": 8495359
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "ice_spikes",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ice Spikes",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "jagged_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jagged Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "lush_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lush Caves",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "mangrove_swamp",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mangrove Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "meadow",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Meadow",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "mushroom_fields",
|
||||||
|
"category": "mushroom",
|
||||||
|
"temperature": 0.9,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mushroom Fields",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "nether_wastes",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Nether Wastes",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "old_growth_birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "old_growth_pine_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Pine Taiga",
|
||||||
|
"color": 8168447
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "old_growth_spruce_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Spruce Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "pale_garden",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Pale Garden",
|
||||||
|
"color": 12171705
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "river",
|
||||||
|
"category": "river",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "River",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "savanna_plateau",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna Plateau",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "small_end_islands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "Small End Islands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "snowy_beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.05,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Beach",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "snowy_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Plains",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "snowy_slopes",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Slopes",
|
||||||
|
"color": 8560639
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "snowy_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": -0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Taiga",
|
||||||
|
"color": 8625919
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "soul_sand_valley",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Soul Sand Valley",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "sparse_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sparse Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "stony_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 1.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Peaks",
|
||||||
|
"color": 7776511
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "stony_shore",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Shore",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "sunflower_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sunflower Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "swamp",
|
||||||
|
"category": "swamp",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "the_end",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "The End",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "the_void",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "The Void",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "warm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Warm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "warped_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Warped Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "windswept_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Forest",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "windswept_gravelly_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Gravelly Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "windswept_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "windswept_savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "wooded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Wooded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,242 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "Speed",
|
||||||
|
"displayName": "Speed",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Slowness",
|
||||||
|
"displayName": "Slowness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "Haste",
|
||||||
|
"displayName": "Haste",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "MiningFatigue",
|
||||||
|
"displayName": "Mining Fatigue",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "Strength",
|
||||||
|
"displayName": "Strength",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "InstantHealth",
|
||||||
|
"displayName": "Instant Health",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "InstantDamage",
|
||||||
|
"displayName": "Instant Damage",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "JumpBoost",
|
||||||
|
"displayName": "Jump Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "Nausea",
|
||||||
|
"displayName": "Nausea",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "Regeneration",
|
||||||
|
"displayName": "Regeneration",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "Resistance",
|
||||||
|
"displayName": "Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "FireResistance",
|
||||||
|
"displayName": "Fire Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "WaterBreathing",
|
||||||
|
"displayName": "Water Breathing",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "Invisibility",
|
||||||
|
"displayName": "Invisibility",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "Blindness",
|
||||||
|
"displayName": "Blindness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "NightVision",
|
||||||
|
"displayName": "Night Vision",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "Hunger",
|
||||||
|
"displayName": "Hunger",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "Weakness",
|
||||||
|
"displayName": "Weakness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "Poison",
|
||||||
|
"displayName": "Poison",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "Wither",
|
||||||
|
"displayName": "Wither",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "HealthBoost",
|
||||||
|
"displayName": "Health Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "Absorption",
|
||||||
|
"displayName": "Absorption",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "Saturation",
|
||||||
|
"displayName": "Saturation",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "Glowing",
|
||||||
|
"displayName": "Glowing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "Levitation",
|
||||||
|
"displayName": "Levitation",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "Luck",
|
||||||
|
"displayName": "Luck",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "BadLuck",
|
||||||
|
"displayName": "Bad Luck",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "SlowFalling",
|
||||||
|
"displayName": "Slow Falling",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "ConduitPower",
|
||||||
|
"displayName": "Conduit Power",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "DolphinsGrace",
|
||||||
|
"displayName": "Dolphin's Grace",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "BadOmen",
|
||||||
|
"displayName": "Bad Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "HeroOfTheVillage",
|
||||||
|
"displayName": "Hero of the Village",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "Darkness",
|
||||||
|
"displayName": "Darkness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "TrialOmen",
|
||||||
|
"displayName": "Trial Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "RaidOmen",
|
||||||
|
"displayName": "Raid Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "WindCharged",
|
||||||
|
"displayName": "Wind Charged",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "Weaving",
|
||||||
|
"displayName": "Weaving",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "Oozing",
|
||||||
|
"displayName": "Oozing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "Infested",
|
||||||
|
"displayName": "Infested",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "BreathOfTheNautilus",
|
||||||
|
"displayName": "Breath of the Nautilus",
|
||||||
|
"type": "good"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,980 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "aqua_affinity",
|
||||||
|
"displayName": "Aqua Affinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bane_of_arthropods",
|
||||||
|
"displayName": "Bane of Arthropods",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "binding_curse",
|
||||||
|
"displayName": "Curse of Binding",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "equippable",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "blast_protection",
|
||||||
|
"displayName": "Blast Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "breach",
|
||||||
|
"displayName": "Breach",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "channeling",
|
||||||
|
"displayName": "Channeling",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "density",
|
||||||
|
"displayName": "Density",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "depth_strider",
|
||||||
|
"displayName": "Depth Strider",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"frost_walker"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "efficiency",
|
||||||
|
"displayName": "Efficiency",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mining",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "feather_falling",
|
||||||
|
"displayName": "Feather Falling",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "fire_aspect",
|
||||||
|
"displayName": "Fire Aspect",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fire_aspect",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "fire_protection",
|
||||||
|
"displayName": "Fire Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "flame",
|
||||||
|
"displayName": "Flame",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "fortune",
|
||||||
|
"displayName": "Fortune",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"silk_touch"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "frost_walker",
|
||||||
|
"displayName": "Frost Walker",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"depth_strider"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "impaling",
|
||||||
|
"displayName": "Impaling",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "infinity",
|
||||||
|
"displayName": "Infinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"mending"
|
||||||
|
],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "knockback",
|
||||||
|
"displayName": "Knockback",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "looting",
|
||||||
|
"displayName": "Looting",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "loyalty",
|
||||||
|
"displayName": "Loyalty",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "luck_of_the_sea",
|
||||||
|
"displayName": "Luck of the Sea",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "lunge",
|
||||||
|
"displayName": "Lunge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "lunge",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "lure",
|
||||||
|
"displayName": "Lure",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "mending",
|
||||||
|
"displayName": "Mending",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"infinity"
|
||||||
|
],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "multishot",
|
||||||
|
"displayName": "Multishot",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"piercing"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "piercing",
|
||||||
|
"displayName": "Piercing",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"multishot"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "power",
|
||||||
|
"displayName": "Power",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "projectile_protection",
|
||||||
|
"displayName": "Projectile Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "protection",
|
||||||
|
"displayName": "Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "punch",
|
||||||
|
"displayName": "Punch",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "quick_charge",
|
||||||
|
"displayName": "Quick Charge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "respiration",
|
||||||
|
"displayName": "Respiration",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "riptide",
|
||||||
|
"displayName": "Riptide",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"channeling",
|
||||||
|
"loyalty"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "sharpness",
|
||||||
|
"displayName": "Sharpness",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "sharp_weapon",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "silk_touch",
|
||||||
|
"displayName": "Silk Touch",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fortune"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "smite",
|
||||||
|
"displayName": "Smite",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "soul_speed",
|
||||||
|
"displayName": "Soul Speed",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sweeping_edge",
|
||||||
|
"displayName": "Sweeping Edge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "sweeping",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "swift_sneak",
|
||||||
|
"displayName": "Swift Sneak",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "leg_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "thorns",
|
||||||
|
"displayName": "Thorns",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "unbreaking",
|
||||||
|
"displayName": "Unbreaking",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "vanishing_curse",
|
||||||
|
"displayName": "Curse of Vanishing",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "vanishing",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "wind_burst",
|
||||||
|
"displayName": "Wind Burst",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,442 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 894,
|
||||||
|
"name": "apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 6.4,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 948,
|
||||||
|
"name": "mushroom_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Mushroom Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 954,
|
||||||
|
"name": "bread",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Bread",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 984,
|
||||||
|
"name": "porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Porkchop",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 985,
|
||||||
|
"name": "cooked_porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Porkchop",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 20.8,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 987,
|
||||||
|
"name": "golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 13.6,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 988,
|
||||||
|
"name": "enchanted_golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Enchanted Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 13.6,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1020,
|
||||||
|
"name": "pufferfish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1021,
|
||||||
|
"name": "salmon_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1022,
|
||||||
|
"name": "cod_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1023,
|
||||||
|
"name": "tropical_fish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1058,
|
||||||
|
"name": "cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1059,
|
||||||
|
"name": "salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1060,
|
||||||
|
"name": "tropical_fish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1061,
|
||||||
|
"name": "pufferfish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1062,
|
||||||
|
"name": "cooked_cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Cod",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1063,
|
||||||
|
"name": "cooked_salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Salmon",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 15.6,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1103,
|
||||||
|
"name": "cookie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cookie",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1107,
|
||||||
|
"name": "melon_slice",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Melon Slice",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1108,
|
||||||
|
"name": "dried_kelp",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Dried Kelp",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.6,
|
||||||
|
"effectiveQuality": 1.6,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1111,
|
||||||
|
"name": "beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Beef",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1112,
|
||||||
|
"name": "cooked_beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Steak",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 20.8,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1113,
|
||||||
|
"name": "chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Chicken",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1114,
|
||||||
|
"name": "cooked_chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Chicken",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1115,
|
||||||
|
"name": "rotten_flesh",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Rotten Flesh",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 0.8,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1123,
|
||||||
|
"name": "spider_eye",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Spider Eye",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 3.2,
|
||||||
|
"effectiveQuality": 5.2,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1228,
|
||||||
|
"name": "carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Carrot",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 3.6000001,
|
||||||
|
"effectiveQuality": 6.6000004,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1229,
|
||||||
|
"name": "potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Potato",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.6,
|
||||||
|
"effectiveQuality": 1.6,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1230,
|
||||||
|
"name": "baked_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Baked Potato",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1231,
|
||||||
|
"name": "poisonous_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Poisonous Potato",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1233,
|
||||||
|
"name": "golden_carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Carrot",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 14.400001,
|
||||||
|
"effectiveQuality": 20.400002,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1242,
|
||||||
|
"name": "pumpkin_pie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pumpkin Pie",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 12.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1250,
|
||||||
|
"name": "rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Rabbit",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1251,
|
||||||
|
"name": "cooked_rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Rabbit",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1252,
|
||||||
|
"name": "rabbit_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Rabbit Stew",
|
||||||
|
"foodPoints": 10.0,
|
||||||
|
"saturation": 12.0,
|
||||||
|
"effectiveQuality": 22.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1265,
|
||||||
|
"name": "mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Mutton",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1266,
|
||||||
|
"name": "cooked_mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Mutton",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 15.6,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1284,
|
||||||
|
"name": "chorus_fruit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Chorus Fruit",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 6.4,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1288,
|
||||||
|
"name": "beetroot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Beetroot",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1290,
|
||||||
|
"name": "beetroot_soup",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Beetroot Soup",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1341,
|
||||||
|
"name": "suspicious_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Suspicious Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1374,
|
||||||
|
"name": "sweet_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Sweet Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1375,
|
||||||
|
"name": "glow_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Glow Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1382,
|
||||||
|
"name": "honey_bottle",
|
||||||
|
"stackSize": 16,
|
||||||
|
"displayName": "Honey Bottle",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 7.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "harp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "basedrum"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "snare"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "hat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "bass"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "flute"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "bell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "guitar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "chime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "xylophone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "iron_xylophone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "cow_bell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "didgeridoo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "bit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "banjo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "pling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "trumpet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "trumpet_exposed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "trumpet_oxidized"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "trumpet_weathered"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "zombie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "creeper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "dragon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "wither_skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "piglin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "custom_head"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
|||||||
|
{
|
||||||
|
"default": {},
|
||||||
|
"leaves": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"coweb": {
|
||||||
|
"1106": 15.0,
|
||||||
|
"912": 15.0,
|
||||||
|
"917": 15.0,
|
||||||
|
"922": 15.0,
|
||||||
|
"927": 15.0,
|
||||||
|
"932": 15.0,
|
||||||
|
"937": 15.0,
|
||||||
|
"942": 15.0
|
||||||
|
},
|
||||||
|
"plant": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"gourd": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen": {
|
||||||
|
"1106": 2.0
|
||||||
|
},
|
||||||
|
"wool": {
|
||||||
|
"1106": 1.0
|
||||||
|
},
|
||||||
|
"sword_instantly_mines": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"sword_efficient": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_wooden_tool": {
|
||||||
|
"913": 2.0,
|
||||||
|
"914": 2.0,
|
||||||
|
"915": 2.0,
|
||||||
|
"916": 2.0
|
||||||
|
},
|
||||||
|
"mineable/shovel": {
|
||||||
|
"913": 2.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"943": 9.0
|
||||||
|
},
|
||||||
|
"mineable/pickaxe": {
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"mineable/axe": {
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"mineable/hoe": {
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_copper_tool": {
|
||||||
|
"918": 1.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"921": 1.0
|
||||||
|
},
|
||||||
|
"incorrect_for_stone_tool": {
|
||||||
|
"923": 4.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"926": 4.0
|
||||||
|
},
|
||||||
|
"incorrect_for_gold_tool": {
|
||||||
|
"928": 12.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"931": 12.0
|
||||||
|
},
|
||||||
|
"incorrect_for_iron_tool": {
|
||||||
|
"933": 6.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"936": 6.0
|
||||||
|
},
|
||||||
|
"incorrect_for_diamond_tool": {
|
||||||
|
"938": 8.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"941": 8.0
|
||||||
|
},
|
||||||
|
"incorrect_for_netherite_tool": {
|
||||||
|
"943": 9.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"945": 9.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"plant;mineable/axe": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"gourd;mineable/axe": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/hoe": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/axe;mineable/hoe": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0,
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen;plant;mineable/axe": {
|
||||||
|
"1106": 2.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,470 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "angry_villager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "block_marker"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "bubble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "cloud"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "copper_fire_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "crit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "damage_indicator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dragon_breath"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "dripping_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "falling_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "landing_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "dripping_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "falling_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "dust_color_transition"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "elder_guardian"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "enchanted_hit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "enchant"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "end_rod"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "entity_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "explosion_emitter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "explosion"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "small_gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "gust_emitter_large"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "gust_emitter_small"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "sonic_boom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "falling_dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "firework"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "fishing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "infested"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "cherry_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "pale_oak_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "tinted_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sculk_soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "sculk_charge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "sculk_charge_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "soul_fire_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "flash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "happy_villager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "composter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "heart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "instant_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "vibration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "trail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "pause_mob_growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "reset_mob_growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "item_slime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "item_cobweb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "item_snowball"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "large_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "mycelium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "note"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "poof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "rain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "white_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "sneeze"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 65,
|
||||||
|
"name": "spit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 66,
|
||||||
|
"name": "squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 67,
|
||||||
|
"name": "sweep_attack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 68,
|
||||||
|
"name": "totem_of_undying"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 69,
|
||||||
|
"name": "underwater"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 70,
|
||||||
|
"name": "splash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 71,
|
||||||
|
"name": "witch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 72,
|
||||||
|
"name": "bubble_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 73,
|
||||||
|
"name": "current_down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 74,
|
||||||
|
"name": "bubble_column_up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 75,
|
||||||
|
"name": "nautilus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76,
|
||||||
|
"name": "dolphin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 77,
|
||||||
|
"name": "campfire_cosy_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 78,
|
||||||
|
"name": "campfire_signal_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 79,
|
||||||
|
"name": "dripping_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 80,
|
||||||
|
"name": "falling_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 81,
|
||||||
|
"name": "landing_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 82,
|
||||||
|
"name": "falling_nectar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 83,
|
||||||
|
"name": "falling_spore_blossom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 84,
|
||||||
|
"name": "ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"name": "crimson_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 86,
|
||||||
|
"name": "warped_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 87,
|
||||||
|
"name": "spore_blossom_air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 88,
|
||||||
|
"name": "dripping_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 89,
|
||||||
|
"name": "falling_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"name": "landing_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"name": "reverse_portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"name": "white_ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"name": "small_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"name": "snowflake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"name": "dripping_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"name": "falling_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"name": "dripping_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"name": "falling_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 99,
|
||||||
|
"name": "glow_squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 100,
|
||||||
|
"name": "glow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "wax_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 102,
|
||||||
|
"name": "wax_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 103,
|
||||||
|
"name": "electric_spark"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 104,
|
||||||
|
"name": "scrape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 105,
|
||||||
|
"name": "shriek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 106,
|
||||||
|
"name": "egg_crack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 107,
|
||||||
|
"name": "dust_plume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 108,
|
||||||
|
"name": "trial_spawner_detection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 109,
|
||||||
|
"name": "trial_spawner_detection_ominous"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 110,
|
||||||
|
"name": "vault_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 111,
|
||||||
|
"name": "dust_pillar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 112,
|
||||||
|
"name": "ominous_spawning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 113,
|
||||||
|
"name": "raid_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 114,
|
||||||
|
"name": "trial_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 115,
|
||||||
|
"name": "block_crumble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 116,
|
||||||
|
"name": "firefly"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,465 @@
|
|||||||
|
{
|
||||||
|
"grass": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -7306931
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"cold_ocean",
|
||||||
|
"crimson_forest",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_peaks",
|
||||||
|
"frozen_river",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lukewarm_ocean",
|
||||||
|
"lush_caves",
|
||||||
|
"meadow",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"snowy_taiga",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warm_ocean",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna"
|
||||||
|
],
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -4793503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"dark_forest"
|
||||||
|
],
|
||||||
|
"color": -15459835
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp",
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -9801671
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -8945038
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"foliage": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -6389427
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"cold_ocean",
|
||||||
|
"crimson_forest",
|
||||||
|
"dark_forest",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_peaks",
|
||||||
|
"frozen_river",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lukewarm_ocean",
|
||||||
|
"lush_caves",
|
||||||
|
"meadow",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"snowy_taiga",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warm_ocean",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna"
|
||||||
|
],
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -4793503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": -7491289
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -7893642
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -9801671
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"water": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"crimson_forest",
|
||||||
|
"dark_forest",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_peaks",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lush_caves",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -12618012
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -10635281
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cold_ocean",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_taiga"
|
||||||
|
],
|
||||||
|
"color": -12757034
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_river"
|
||||||
|
],
|
||||||
|
"color": -13027127
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"lukewarm_ocean"
|
||||||
|
],
|
||||||
|
"color": -12210702
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": -12944790
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"meadow"
|
||||||
|
],
|
||||||
|
"color": -15839537
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -9008995
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -10388636
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"warm_ocean"
|
||||||
|
],
|
||||||
|
"color": -12331538
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"redstone": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"color": 4980736
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"color": 7340032
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"color": 7995392
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"color": 8650752
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"color": 9306112
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"color": 10027008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"color": 10682368
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"color": 11337728
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"color": 11993088
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"color": 12648448
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"color": 13369344
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
11
|
||||||
|
],
|
||||||
|
"color": 14024704
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"color": 14680064
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"color": 15336960
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
14
|
||||||
|
],
|
||||||
|
"color": 15997696
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"color": 16724480
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"birch_leaves"
|
||||||
|
],
|
||||||
|
"color": -8345771
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"spruce_leaves"
|
||||||
|
],
|
||||||
|
"color": -10380959
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"lily_pad"
|
||||||
|
],
|
||||||
|
"color": -14647248
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"attached_melon_stem"
|
||||||
|
],
|
||||||
|
"color": -2046180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"attached_pumpkin_stem"
|
||||||
|
],
|
||||||
|
"color": -2046180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"melon_stem"
|
||||||
|
],
|
||||||
|
"color": -16711936
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pumpkin_stem"
|
||||||
|
],
|
||||||
|
"color": -16711936
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"version": 775,
|
||||||
|
"minecraftVersion": "26.1",
|
||||||
|
"majorVersion": "26.1",
|
||||||
|
"releaseType": "release"
|
||||||
|
}
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "armor",
|
||||||
|
"resource": "minecraft:armor",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 30.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armorToughness",
|
||||||
|
"resource": "minecraft:armor_toughness",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackDamage",
|
||||||
|
"resource": "minecraft:attack_damage",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackKnockback",
|
||||||
|
"resource": "minecraft:attack_knockback",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 5.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackSpeed",
|
||||||
|
"resource": "minecraft:attack_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockBreakSpeed",
|
||||||
|
"resource": "minecraft:block_break_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockInteractionRange",
|
||||||
|
"resource": "minecraft:block_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "burningTime",
|
||||||
|
"resource": "minecraft:burning_time",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cameraDistance",
|
||||||
|
"resource": "minecraft:camera_distance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explosionKnockbackResistance",
|
||||||
|
"resource": "minecraft:explosion_knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityInteractionRange",
|
||||||
|
"resource": "minecraft:entity_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fallDamageMultiplier",
|
||||||
|
"resource": "minecraft:fall_damage_multiplier",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 100.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "flyingSpeed",
|
||||||
|
"resource": "minecraft:flying_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "followRange",
|
||||||
|
"resource": "minecraft:follow_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 32.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gravity",
|
||||||
|
"resource": "minecraft:gravity",
|
||||||
|
"min": -1.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jumpStrength",
|
||||||
|
"resource": "minecraft:jump_strength",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 0.41999998688697815
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "knockbackResistance",
|
||||||
|
"resource": "minecraft:knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "luck",
|
||||||
|
"resource": "minecraft:luck",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxAbsorption",
|
||||||
|
"resource": "minecraft:max_absorption",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxHealth",
|
||||||
|
"resource": "minecraft:max_health",
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 20.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "miningEfficiency",
|
||||||
|
"resource": "minecraft:mining_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementEfficiency",
|
||||||
|
"resource": "minecraft:movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementSpeed",
|
||||||
|
"resource": "minecraft:movement_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oxygenBonus",
|
||||||
|
"resource": "minecraft:oxygen_bonus",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "safeFallDistance",
|
||||||
|
"resource": "minecraft:safe_fall_distance",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scale",
|
||||||
|
"resource": "minecraft:scale",
|
||||||
|
"min": 0.0625,
|
||||||
|
"max": 16.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sneakingSpeed",
|
||||||
|
"resource": "minecraft:sneaking_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnReinforcements",
|
||||||
|
"resource": "minecraft:spawn_reinforcements",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stepHeight",
|
||||||
|
"resource": "minecraft:step_height",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 10.0,
|
||||||
|
"default": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "submergedMiningSpeed",
|
||||||
|
"resource": "minecraft:submerged_mining_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sweepingDamageRatio",
|
||||||
|
"resource": "minecraft:sweeping_damage_ratio",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temptRange",
|
||||||
|
"resource": "minecraft:tempt_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waterMovementEfficiency",
|
||||||
|
"resource": "minecraft:water_movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointTransmitRange",
|
||||||
|
"resource": "minecraft:waypoint_transmit_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointReceiveRange",
|
||||||
|
"resource": "minecraft:waypoint_receive_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,652 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bamboo_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Bamboo Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "basalt_deltas",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Basalt Deltas",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Beach",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "cherry_grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cherry Grove",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "crimson_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Crimson Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dark_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dark Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "deep_cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "deep_dark",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Dark",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "deep_frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Frozen Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "deep_lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "deep_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "desert",
|
||||||
|
"category": "desert",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Desert",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "dripstone_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dripstone Caves",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "end_barrens",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Barrens",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "end_highlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Highlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "end_midlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Midlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "eroded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Eroded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "flower_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Flower Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Ocean",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "frozen_peaks",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "frozen_river",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen River",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": -0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Grove",
|
||||||
|
"color": 8495359
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "ice_spikes",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ice Spikes",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "jagged_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jagged Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "lush_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lush Caves",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "mangrove_swamp",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mangrove Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "meadow",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Meadow",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "mushroom_fields",
|
||||||
|
"category": "mushroom",
|
||||||
|
"temperature": 0.9,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mushroom Fields",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "nether_wastes",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Nether Wastes",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "old_growth_birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "old_growth_pine_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Pine Taiga",
|
||||||
|
"color": 8168447
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "old_growth_spruce_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Spruce Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "pale_garden",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Pale Garden",
|
||||||
|
"color": 12171705
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "river",
|
||||||
|
"category": "river",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "River",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "savanna_plateau",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna Plateau",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "small_end_islands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "Small End Islands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "snowy_beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.05,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Beach",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "snowy_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Plains",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "snowy_slopes",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Slopes",
|
||||||
|
"color": 8560639
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "snowy_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": -0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Taiga",
|
||||||
|
"color": 8625919
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "soul_sand_valley",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Soul Sand Valley",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "sparse_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sparse Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "stony_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 1.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Peaks",
|
||||||
|
"color": 7776511
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "stony_shore",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Shore",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "sunflower_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sunflower Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "swamp",
|
||||||
|
"category": "swamp",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "the_end",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "The End",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "the_void",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "The Void",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "warm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Warm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "warped_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Warped Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "windswept_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Forest",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "windswept_gravelly_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Gravelly Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "windswept_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "windswept_savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "wooded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Wooded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,242 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "Speed",
|
||||||
|
"displayName": "Speed",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Slowness",
|
||||||
|
"displayName": "Slowness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "Haste",
|
||||||
|
"displayName": "Haste",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "MiningFatigue",
|
||||||
|
"displayName": "Mining Fatigue",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "Strength",
|
||||||
|
"displayName": "Strength",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "InstantHealth",
|
||||||
|
"displayName": "Instant Health",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "InstantDamage",
|
||||||
|
"displayName": "Instant Damage",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "JumpBoost",
|
||||||
|
"displayName": "Jump Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "Nausea",
|
||||||
|
"displayName": "Nausea",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "Regeneration",
|
||||||
|
"displayName": "Regeneration",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "Resistance",
|
||||||
|
"displayName": "Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "FireResistance",
|
||||||
|
"displayName": "Fire Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "WaterBreathing",
|
||||||
|
"displayName": "Water Breathing",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "Invisibility",
|
||||||
|
"displayName": "Invisibility",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "Blindness",
|
||||||
|
"displayName": "Blindness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "NightVision",
|
||||||
|
"displayName": "Night Vision",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "Hunger",
|
||||||
|
"displayName": "Hunger",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "Weakness",
|
||||||
|
"displayName": "Weakness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "Poison",
|
||||||
|
"displayName": "Poison",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "Wither",
|
||||||
|
"displayName": "Wither",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "HealthBoost",
|
||||||
|
"displayName": "Health Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "Absorption",
|
||||||
|
"displayName": "Absorption",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "Saturation",
|
||||||
|
"displayName": "Saturation",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "Glowing",
|
||||||
|
"displayName": "Glowing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "Levitation",
|
||||||
|
"displayName": "Levitation",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "Luck",
|
||||||
|
"displayName": "Luck",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "BadLuck",
|
||||||
|
"displayName": "Bad Luck",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "SlowFalling",
|
||||||
|
"displayName": "Slow Falling",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "ConduitPower",
|
||||||
|
"displayName": "Conduit Power",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "DolphinsGrace",
|
||||||
|
"displayName": "Dolphin's Grace",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "BadOmen",
|
||||||
|
"displayName": "Bad Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "HeroOfTheVillage",
|
||||||
|
"displayName": "Hero of the Village",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "Darkness",
|
||||||
|
"displayName": "Darkness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "TrialOmen",
|
||||||
|
"displayName": "Trial Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "RaidOmen",
|
||||||
|
"displayName": "Raid Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "WindCharged",
|
||||||
|
"displayName": "Wind Charged",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "Weaving",
|
||||||
|
"displayName": "Weaving",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "Oozing",
|
||||||
|
"displayName": "Oozing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "Infested",
|
||||||
|
"displayName": "Infested",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "BreathOfTheNautilus",
|
||||||
|
"displayName": "Breath of the Nautilus",
|
||||||
|
"type": "good"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,980 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "aqua_affinity",
|
||||||
|
"displayName": "Aqua Affinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bane_of_arthropods",
|
||||||
|
"displayName": "Bane of Arthropods",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "binding_curse",
|
||||||
|
"displayName": "Curse of Binding",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "equippable",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "blast_protection",
|
||||||
|
"displayName": "Blast Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "breach",
|
||||||
|
"displayName": "Breach",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "channeling",
|
||||||
|
"displayName": "Channeling",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "density",
|
||||||
|
"displayName": "Density",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "depth_strider",
|
||||||
|
"displayName": "Depth Strider",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"frost_walker"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "efficiency",
|
||||||
|
"displayName": "Efficiency",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mining",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "feather_falling",
|
||||||
|
"displayName": "Feather Falling",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "fire_aspect",
|
||||||
|
"displayName": "Fire Aspect",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fire_aspect",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "fire_protection",
|
||||||
|
"displayName": "Fire Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "flame",
|
||||||
|
"displayName": "Flame",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "fortune",
|
||||||
|
"displayName": "Fortune",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"silk_touch"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "frost_walker",
|
||||||
|
"displayName": "Frost Walker",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"depth_strider"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "impaling",
|
||||||
|
"displayName": "Impaling",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "infinity",
|
||||||
|
"displayName": "Infinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"mending"
|
||||||
|
],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "knockback",
|
||||||
|
"displayName": "Knockback",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "looting",
|
||||||
|
"displayName": "Looting",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "loyalty",
|
||||||
|
"displayName": "Loyalty",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "luck_of_the_sea",
|
||||||
|
"displayName": "Luck of the Sea",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "lunge",
|
||||||
|
"displayName": "Lunge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "lunge",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "lure",
|
||||||
|
"displayName": "Lure",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "mending",
|
||||||
|
"displayName": "Mending",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"infinity"
|
||||||
|
],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "multishot",
|
||||||
|
"displayName": "Multishot",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"piercing"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "piercing",
|
||||||
|
"displayName": "Piercing",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"multishot"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "power",
|
||||||
|
"displayName": "Power",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "projectile_protection",
|
||||||
|
"displayName": "Projectile Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "protection",
|
||||||
|
"displayName": "Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "punch",
|
||||||
|
"displayName": "Punch",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "quick_charge",
|
||||||
|
"displayName": "Quick Charge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "respiration",
|
||||||
|
"displayName": "Respiration",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "riptide",
|
||||||
|
"displayName": "Riptide",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"channeling",
|
||||||
|
"loyalty"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "sharpness",
|
||||||
|
"displayName": "Sharpness",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "sharp_weapon",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "silk_touch",
|
||||||
|
"displayName": "Silk Touch",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fortune"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "smite",
|
||||||
|
"displayName": "Smite",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "soul_speed",
|
||||||
|
"displayName": "Soul Speed",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sweeping_edge",
|
||||||
|
"displayName": "Sweeping Edge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "sweeping",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "swift_sneak",
|
||||||
|
"displayName": "Swift Sneak",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "leg_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "thorns",
|
||||||
|
"displayName": "Thorns",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "unbreaking",
|
||||||
|
"displayName": "Unbreaking",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "vanishing_curse",
|
||||||
|
"displayName": "Curse of Vanishing",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "vanishing",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "wind_burst",
|
||||||
|
"displayName": "Wind Burst",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,442 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 894,
|
||||||
|
"name": "apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 6.4,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 948,
|
||||||
|
"name": "mushroom_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Mushroom Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 954,
|
||||||
|
"name": "bread",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Bread",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 984,
|
||||||
|
"name": "porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Porkchop",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 985,
|
||||||
|
"name": "cooked_porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Porkchop",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 20.8,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 987,
|
||||||
|
"name": "golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 13.6,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 988,
|
||||||
|
"name": "enchanted_golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Enchanted Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 13.6,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1020,
|
||||||
|
"name": "pufferfish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1021,
|
||||||
|
"name": "salmon_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1022,
|
||||||
|
"name": "cod_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1023,
|
||||||
|
"name": "tropical_fish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1058,
|
||||||
|
"name": "cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1059,
|
||||||
|
"name": "salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1060,
|
||||||
|
"name": "tropical_fish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1061,
|
||||||
|
"name": "pufferfish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.2,
|
||||||
|
"effectiveQuality": 1.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1062,
|
||||||
|
"name": "cooked_cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Cod",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1063,
|
||||||
|
"name": "cooked_salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Salmon",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 15.6,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1103,
|
||||||
|
"name": "cookie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cookie",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1107,
|
||||||
|
"name": "melon_slice",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Melon Slice",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1108,
|
||||||
|
"name": "dried_kelp",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Dried Kelp",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.6,
|
||||||
|
"effectiveQuality": 1.6,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1111,
|
||||||
|
"name": "beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Beef",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1112,
|
||||||
|
"name": "cooked_beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Steak",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 20.8,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1113,
|
||||||
|
"name": "chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Chicken",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1114,
|
||||||
|
"name": "cooked_chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Chicken",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1115,
|
||||||
|
"name": "rotten_flesh",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Rotten Flesh",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 0.8,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1123,
|
||||||
|
"name": "spider_eye",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Spider Eye",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 3.2,
|
||||||
|
"effectiveQuality": 5.2,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1228,
|
||||||
|
"name": "carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Carrot",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 3.6000001,
|
||||||
|
"effectiveQuality": 6.6000004,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1229,
|
||||||
|
"name": "potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Potato",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.6,
|
||||||
|
"effectiveQuality": 1.6,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1230,
|
||||||
|
"name": "baked_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Baked Potato",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1231,
|
||||||
|
"name": "poisonous_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Poisonous Potato",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1233,
|
||||||
|
"name": "golden_carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Carrot",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 14.400001,
|
||||||
|
"effectiveQuality": 20.400002,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1242,
|
||||||
|
"name": "pumpkin_pie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pumpkin Pie",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 12.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1250,
|
||||||
|
"name": "rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Rabbit",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 1.8000001,
|
||||||
|
"effectiveQuality": 4.8,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1251,
|
||||||
|
"name": "cooked_rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Rabbit",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 6.0,
|
||||||
|
"effectiveQuality": 11.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1252,
|
||||||
|
"name": "rabbit_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Rabbit Stew",
|
||||||
|
"foodPoints": 10.0,
|
||||||
|
"saturation": 12.0,
|
||||||
|
"effectiveQuality": 22.0,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1265,
|
||||||
|
"name": "mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Mutton",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 3.2,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1266,
|
||||||
|
"name": "cooked_mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Mutton",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 9.6,
|
||||||
|
"effectiveQuality": 15.6,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1284,
|
||||||
|
"name": "chorus_fruit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Chorus Fruit",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 6.4,
|
||||||
|
"saturationRatio": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1288,
|
||||||
|
"name": "beetroot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Beetroot",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1290,
|
||||||
|
"name": "beetroot_soup",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Beetroot Soup",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1341,
|
||||||
|
"name": "suspicious_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Suspicious Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 7.2000003,
|
||||||
|
"effectiveQuality": 13.200001,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1374,
|
||||||
|
"name": "sweet_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Sweet Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1375,
|
||||||
|
"name": "glow_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Glow Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 2.4,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1382,
|
||||||
|
"name": "honey_bottle",
|
||||||
|
"stackSize": 16,
|
||||||
|
"displayName": "Honey Bottle",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 7.2,
|
||||||
|
"saturationRatio": 0.2
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "harp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "basedrum"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "snare"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "hat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "bass"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "flute"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "bell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "guitar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "chime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "xylophone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "iron_xylophone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "cow_bell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "didgeridoo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "bit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "banjo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "pling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "trumpet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "trumpet_exposed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "trumpet_oxidized"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "trumpet_weathered"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "zombie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "creeper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "dragon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "wither_skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "piglin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "custom_head"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
|||||||
|
{
|
||||||
|
"default": {},
|
||||||
|
"leaves": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"coweb": {
|
||||||
|
"1106": 15.0,
|
||||||
|
"912": 15.0,
|
||||||
|
"917": 15.0,
|
||||||
|
"922": 15.0,
|
||||||
|
"927": 15.0,
|
||||||
|
"932": 15.0,
|
||||||
|
"937": 15.0,
|
||||||
|
"942": 15.0
|
||||||
|
},
|
||||||
|
"plant": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"gourd": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen": {
|
||||||
|
"1106": 2.0
|
||||||
|
},
|
||||||
|
"wool": {
|
||||||
|
"1106": 1.0
|
||||||
|
},
|
||||||
|
"sword_instantly_mines": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"sword_efficient": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_wooden_tool": {
|
||||||
|
"913": 2.0,
|
||||||
|
"914": 2.0,
|
||||||
|
"915": 2.0,
|
||||||
|
"916": 2.0
|
||||||
|
},
|
||||||
|
"mineable/shovel": {
|
||||||
|
"913": 2.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"943": 9.0
|
||||||
|
},
|
||||||
|
"mineable/pickaxe": {
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"mineable/axe": {
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"mineable/hoe": {
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_copper_tool": {
|
||||||
|
"918": 1.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"921": 1.0
|
||||||
|
},
|
||||||
|
"incorrect_for_stone_tool": {
|
||||||
|
"923": 4.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"926": 4.0
|
||||||
|
},
|
||||||
|
"incorrect_for_gold_tool": {
|
||||||
|
"928": 12.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"931": 12.0
|
||||||
|
},
|
||||||
|
"incorrect_for_iron_tool": {
|
||||||
|
"933": 6.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"936": 6.0
|
||||||
|
},
|
||||||
|
"incorrect_for_diamond_tool": {
|
||||||
|
"938": 8.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"941": 8.0
|
||||||
|
},
|
||||||
|
"incorrect_for_netherite_tool": {
|
||||||
|
"943": 9.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"945": 9.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"plant;mineable/axe": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"gourd;mineable/axe": {
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/hoe": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/axe;mineable/hoe": {
|
||||||
|
"1106": 1.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0,
|
||||||
|
"916": 2.0,
|
||||||
|
"921": 1.0,
|
||||||
|
"926": 4.0,
|
||||||
|
"931": 12.0,
|
||||||
|
"936": 6.0,
|
||||||
|
"941": 8.0,
|
||||||
|
"946": 9.0
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen;plant;mineable/axe": {
|
||||||
|
"1106": 2.0,
|
||||||
|
"912": 1.5,
|
||||||
|
"917": 1.5,
|
||||||
|
"922": 1.5,
|
||||||
|
"927": 1.5,
|
||||||
|
"932": 1.5,
|
||||||
|
"937": 1.5,
|
||||||
|
"942": 1.5,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,470 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "angry_villager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "block_marker"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "bubble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "cloud"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "copper_fire_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "crit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "damage_indicator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dragon_breath"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "dripping_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "falling_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "landing_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "dripping_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "falling_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "dust_color_transition"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "elder_guardian"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "enchanted_hit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "enchant"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "end_rod"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "entity_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "explosion_emitter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "explosion"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "small_gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "gust_emitter_large"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "gust_emitter_small"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "sonic_boom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "falling_dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "firework"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "fishing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "infested"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "cherry_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "pale_oak_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "tinted_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sculk_soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "sculk_charge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "sculk_charge_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "soul_fire_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "flash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "happy_villager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "composter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "heart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "instant_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "vibration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "trail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "pause_mob_growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "reset_mob_growth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "item_slime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "item_cobweb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "item_snowball"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "large_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "mycelium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "note"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "poof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "rain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "white_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "sneeze"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 65,
|
||||||
|
"name": "spit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 66,
|
||||||
|
"name": "squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 67,
|
||||||
|
"name": "sweep_attack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 68,
|
||||||
|
"name": "totem_of_undying"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 69,
|
||||||
|
"name": "underwater"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 70,
|
||||||
|
"name": "splash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 71,
|
||||||
|
"name": "witch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 72,
|
||||||
|
"name": "bubble_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 73,
|
||||||
|
"name": "current_down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 74,
|
||||||
|
"name": "bubble_column_up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 75,
|
||||||
|
"name": "nautilus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76,
|
||||||
|
"name": "dolphin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 77,
|
||||||
|
"name": "campfire_cosy_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 78,
|
||||||
|
"name": "campfire_signal_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 79,
|
||||||
|
"name": "dripping_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 80,
|
||||||
|
"name": "falling_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 81,
|
||||||
|
"name": "landing_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 82,
|
||||||
|
"name": "falling_nectar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 83,
|
||||||
|
"name": "falling_spore_blossom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 84,
|
||||||
|
"name": "ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"name": "crimson_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 86,
|
||||||
|
"name": "warped_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 87,
|
||||||
|
"name": "spore_blossom_air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 88,
|
||||||
|
"name": "dripping_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 89,
|
||||||
|
"name": "falling_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"name": "landing_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"name": "reverse_portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"name": "white_ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"name": "small_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"name": "snowflake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"name": "dripping_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"name": "falling_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"name": "dripping_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"name": "falling_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 99,
|
||||||
|
"name": "glow_squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 100,
|
||||||
|
"name": "glow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "wax_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 102,
|
||||||
|
"name": "wax_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 103,
|
||||||
|
"name": "electric_spark"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 104,
|
||||||
|
"name": "scrape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 105,
|
||||||
|
"name": "shriek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 106,
|
||||||
|
"name": "egg_crack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 107,
|
||||||
|
"name": "dust_plume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 108,
|
||||||
|
"name": "trial_spawner_detection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 109,
|
||||||
|
"name": "trial_spawner_detection_ominous"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 110,
|
||||||
|
"name": "vault_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 111,
|
||||||
|
"name": "dust_pillar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 112,
|
||||||
|
"name": "ominous_spawning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 113,
|
||||||
|
"name": "raid_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 114,
|
||||||
|
"name": "trial_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 115,
|
||||||
|
"name": "block_crumble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 116,
|
||||||
|
"name": "firefly"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,465 @@
|
|||||||
|
{
|
||||||
|
"grass": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -7306931
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"cold_ocean",
|
||||||
|
"crimson_forest",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_peaks",
|
||||||
|
"frozen_river",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lukewarm_ocean",
|
||||||
|
"lush_caves",
|
||||||
|
"meadow",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"snowy_taiga",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warm_ocean",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna"
|
||||||
|
],
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -4793503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"dark_forest"
|
||||||
|
],
|
||||||
|
"color": -15459835
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp",
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -9801671
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -8945038
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"foliage": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -6389427
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"cold_ocean",
|
||||||
|
"crimson_forest",
|
||||||
|
"dark_forest",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_peaks",
|
||||||
|
"frozen_river",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lukewarm_ocean",
|
||||||
|
"lush_caves",
|
||||||
|
"meadow",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"snowy_taiga",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warm_ocean",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna"
|
||||||
|
],
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -4793503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": -7491289
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -7893642
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -9801671
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"water": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"crimson_forest",
|
||||||
|
"dark_forest",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_peaks",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lush_caves",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -12618012
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -10635281
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cold_ocean",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_taiga"
|
||||||
|
],
|
||||||
|
"color": -12757034
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_river"
|
||||||
|
],
|
||||||
|
"color": -13027127
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"lukewarm_ocean"
|
||||||
|
],
|
||||||
|
"color": -12210702
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": -12944790
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"meadow"
|
||||||
|
],
|
||||||
|
"color": -15839537
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": -9008995
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": -10388636
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"warm_ocean"
|
||||||
|
],
|
||||||
|
"color": -12331538
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"redstone": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"color": 4980736
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"color": 7340032
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"color": 7995392
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"color": 8650752
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"color": 9306112
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"color": 10027008
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"color": 10682368
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"color": 11337728
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"color": 11993088
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"color": 12648448
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"color": 13369344
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
11
|
||||||
|
],
|
||||||
|
"color": 14024704
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"color": 14680064
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"color": 15336960
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
14
|
||||||
|
],
|
||||||
|
"color": 15997696
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"color": 16724480
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"constant": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"birch_leaves"
|
||||||
|
],
|
||||||
|
"color": -8345771
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"spruce_leaves"
|
||||||
|
],
|
||||||
|
"color": -10380959
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"lily_pad"
|
||||||
|
],
|
||||||
|
"color": -14647248
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"attached_melon_stem"
|
||||||
|
],
|
||||||
|
"color": -2046180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"attached_pumpkin_stem"
|
||||||
|
],
|
||||||
|
"color": -2046180
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"melon_stem"
|
||||||
|
],
|
||||||
|
"color": -16711936
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pumpkin_stem"
|
||||||
|
],
|
||||||
|
"color": -16711936
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"version": 776,
|
||||||
|
"minecraftVersion": "26.2",
|
||||||
|
"majorVersion": "26.2",
|
||||||
|
"releaseType": "release"
|
||||||
|
}
|
||||||
@@ -906,6 +906,11 @@
|
|||||||
"description": "spawn position includes a dimension component",
|
"description": "spawn position includes a dimension component",
|
||||||
"versions": ["1.21.9", "latest"]
|
"versions": ["1.21.9", "latest"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "entityVelocityIsLpVec3",
|
||||||
|
"description": "entity velocity packets use length-prefixed vectors in blocks per tick",
|
||||||
|
"versions": ["1.21.9", "latest"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "gameRuleUsesResourceLocation",
|
"name": "gameRuleUsesResourceLocation",
|
||||||
"description": "gamerule names use resource location syntax",
|
"description": "gamerule names use resource location syntax",
|
||||||
|
|||||||
@@ -1,4 +1,140 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.3-snapshot-5",
|
||||||
|
"version": 1073742151,
|
||||||
|
"dataVersion": 5004,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.3-snapshot-5",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.3-snapshot-4",
|
||||||
|
"version": 1073742150,
|
||||||
|
"dataVersion": 5003,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.3-snapshot-4",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.3-snapshot-3",
|
||||||
|
"version": 1073742149,
|
||||||
|
"dataVersion": 5001,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.3-snapshot-3",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.3-snapshot-2",
|
||||||
|
"version": 1073742148,
|
||||||
|
"dataVersion": 4999,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.3-snapshot-2",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.3-snapshot-1",
|
||||||
|
"version": 1073742147,
|
||||||
|
"dataVersion": 4998,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.3-snapshot-1",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2",
|
||||||
|
"version": 776,
|
||||||
|
"dataVersion": 4903,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2",
|
||||||
|
"releaseType": "release"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-rc-2",
|
||||||
|
"version": 1073742146,
|
||||||
|
"dataVersion": 4902,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-rc-2",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-rc-1",
|
||||||
|
"version": 1073742145,
|
||||||
|
"dataVersion": 4901,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-rc-1",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-6",
|
||||||
|
"version": 1073742144,
|
||||||
|
"dataVersion": 4900,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-6",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-5",
|
||||||
|
"version": 1073742143,
|
||||||
|
"dataVersion": 4898,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-5",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-4",
|
||||||
|
"version": 1073742142,
|
||||||
|
"dataVersion": 4897,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-4",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-3",
|
||||||
|
"version": 1073742141,
|
||||||
|
"dataVersion": 4896,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-3",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-2",
|
||||||
|
"version": 1073742140,
|
||||||
|
"dataVersion": 4895,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-2",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-pre-1",
|
||||||
|
"version": 1073742139,
|
||||||
|
"dataVersion": 4894,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-pre-1",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-snapshot-8",
|
||||||
|
"version": 1073742138,
|
||||||
|
"dataVersion": 4893,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-snapshot-8",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-snapshot-7",
|
||||||
|
"version": 1073742137,
|
||||||
|
"dataVersion": 4891,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-snapshot-7",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minecraftVersion": "26.2-snapshot-6",
|
||||||
|
"version": 1073742136,
|
||||||
|
"dataVersion": 4890,
|
||||||
|
"usesNetty": true,
|
||||||
|
"majorVersion": "26.2-snapshot-6",
|
||||||
|
"releaseType": "snapshot"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"minecraftVersion": "26.2-snapshot-5",
|
"minecraftVersion": "26.2-snapshot-5",
|
||||||
"version": 1073742135,
|
"version": 1073742135,
|
||||||
|
|||||||
@@ -69,5 +69,7 @@
|
|||||||
"1.21.8",
|
"1.21.8",
|
||||||
"1.21.9",
|
"1.21.9",
|
||||||
"1.21.10",
|
"1.21.10",
|
||||||
"1.21.11"
|
"1.21.11",
|
||||||
|
"26.1",
|
||||||
|
"26.2"
|
||||||
]
|
]
|
||||||
@@ -20,6 +20,7 @@ type VersionInfo struct {
|
|||||||
|
|
||||||
var ProtocolVersions []VersionInfo
|
var ProtocolVersions []VersionInfo
|
||||||
|
|
||||||
|
// LookUpVersionByName returns the VersionInfo for the given Minecraft version name (e.g. "1.21.11").
|
||||||
func LookUpVersionByName(name string) (ret VersionInfo, err error) {
|
func LookUpVersionByName(name string) (ret VersionInfo, err error) {
|
||||||
for _, v := range ProtocolVersions {
|
for _, v := range ProtocolVersions {
|
||||||
if v.MinecraftVersion == name {
|
if v.MinecraftVersion == name {
|
||||||
@@ -31,6 +32,7 @@ func LookUpVersionByName(name string) (ret VersionInfo, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookUpVersionByProtocolVersion returns the VersionInfo for the given protocol version number.
|
||||||
func LookUpVersionByProtocolVersion(version int32) (ret VersionInfo, err error) {
|
func LookUpVersionByProtocolVersion(version int32) (ret VersionInfo, err error) {
|
||||||
for _, v := range ProtocolVersions {
|
for _, v := range ProtocolVersions {
|
||||||
if v.Version == version {
|
if v.Version == version {
|
||||||
@@ -42,6 +44,7 @@ func LookUpVersionByProtocolVersion(version int32) (ret VersionInfo, err error)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookUpVersionByDataVersion returns the VersionInfo for the given Minecraft data version number.
|
||||||
func LookUpVersionByDataVersion(version int32) (ret VersionInfo, err error) {
|
func LookUpVersionByDataVersion(version int32) (ret VersionInfo, err error) {
|
||||||
for _, v := range ProtocolVersions {
|
for _, v := range ProtocolVersions {
|
||||||
if v.DataVersion == version {
|
if v.DataVersion == version {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
//go:embed registry/*
|
//go:embed registry/*
|
||||||
var Registry embed.FS
|
var Registry embed.FS
|
||||||
|
|
||||||
|
// LoadRegistry loads a registry NBT file by name from the embedded registry data.
|
||||||
func LoadRegistry(name string) (n *nbt2.Tag, err error) {
|
func LoadRegistry(name string) (n *nbt2.Tag, err error) {
|
||||||
r, err := Registry.Open("registry/" + name + ".nbt")
|
r, err := Registry.Open("registry/" + name + ".nbt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ var WhileClosingErr = errors.New("error while closing")
|
|||||||
var ContextDoneErr = errors.New("context done")
|
var ContextDoneErr = errors.New("context done")
|
||||||
var RecvNotOkErr = errors.New("recv not ok")
|
var RecvNotOkErr = errors.New("recv not ok")
|
||||||
|
|
||||||
|
// ValidateHandler validates that h is a function taking a single argument and returning an error.
|
||||||
|
// It panics if the handler does not match the expected signature.
|
||||||
func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
|
func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
|
||||||
hv = reflect.ValueOf(h)
|
hv = reflect.ValueOf(h)
|
||||||
if hv.Kind() != reflect.Func {
|
if hv.Kind() != reflect.Func {
|
||||||
@@ -139,9 +141,11 @@ func (l *Loop) RegisterLow(eventType reflect.Type, hv reflect.Value, critical bo
|
|||||||
|
|
||||||
// RegisterCritical registers a handler that will close the loop if it returns an error.
|
// RegisterCritical registers a handler that will close the loop if it returns an error.
|
||||||
// Warning: If a bad handler is passed in the program will panic.
|
// Warning: If a bad handler is passed in the program will panic.
|
||||||
func (l *Loop) RegisterCritical(h any) {
|
func (l *Loop) RegisterCritical(hs ...any) {
|
||||||
|
for _, h := range hs {
|
||||||
eventType, hv := ValidateHandler(h)
|
eventType, hv := ValidateHandler(h)
|
||||||
l.HandlerFunctions[eventType] = append(l.HandlerFunctions[eventType], hv)
|
l.HandlerFunctions[eventType] = append(l.HandlerFunctions[eventType], hv)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
|
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
|
||||||
@@ -233,6 +237,7 @@ func (l *Loop) StartLoop() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewLoop creates a new Loop with a background context.
|
||||||
func NewLoop() (l *Loop) {
|
func NewLoop() (l *Loop) {
|
||||||
return NewLoopCtx(context.Background())
|
return NewLoopCtx(context.Background())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ type BiomeNoise struct {
|
|||||||
Temperature, Humidity, ContinentalNess, Erosion, Shift, Weirdness DoublePerlin
|
Temperature, Humidity, ContinentalNess, Erosion, Shift, Weirdness DoublePerlin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BiomeNoiseFromXoroshiro creates a BiomeNoise from the given Xoroshiro source.
|
||||||
func BiomeNoiseFromXoroshiro(x Xoroshiro, large bool) (v BiomeNoise) {
|
func BiomeNoiseFromXoroshiro(x Xoroshiro, large bool) (v BiomeNoise) {
|
||||||
x = x.Split()
|
x = x.Split()
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ type DoublePerlin struct {
|
|||||||
B Octave
|
B Octave
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DoublePerlinFromXoroshiro creates a DoublePerlin from the given Xoroshiro source.
|
||||||
func DoublePerlinFromXoroshiro(x *Xoroshiro, amplitudes []float64, omin int, lenn int, nmax int) (d DoublePerlin) {
|
func DoublePerlinFromXoroshiro(x *Xoroshiro, amplitudes []float64, omin int, lenn int, nmax int) (d DoublePerlin) {
|
||||||
na := -1
|
na := -1
|
||||||
nb := -1
|
nb := -1
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ func (n PerlinNoise) Sample(x, y, z float64, yamp, ymin float64) (v float64) {
|
|||||||
return lerp(t3, l1, l5)
|
return lerp(t3, l1, l5)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PerlinNoiseFromXoroshiro initializes a PerlinNoise from the given Xoroshiro source.
|
||||||
func PerlinNoiseFromXoroshiro(x Xoroshiro) (p PerlinNoise) {
|
func PerlinNoiseFromXoroshiro(x Xoroshiro) (p PerlinNoise) {
|
||||||
p.xoffset = x.NextFloat64() * 256.0
|
p.xoffset = x.NextFloat64() * 256.0
|
||||||
p.yoffset = x.NextFloat64() * 256.0
|
p.yoffset = x.NextFloat64() * 256.0
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ var octaveLacunaInits = []float64{1, .5, .25, 1. / 8, 1. / 16, 1. / 32, 1. / 64,
|
|||||||
var octavePersistInits = []float64{0, 1, 2. / 3, 4. / 7, 8. / 15, 16. / 31, 32. / 63, 64. / 127, 128. / 255, 256. / 511, 512. / 1023,
|
var octavePersistInits = []float64{0, 1, 2. / 3, 4. / 7, 8. / 15, 16. / 31, 32. / 63, 64. / 127, 128. / 255, 256. / 511, 512. / 1023,
|
||||||
1024. / 2047, 2048. / 4095, 4096. / 8191, 8192. / 16383, 16384. / 32767, 32768. / 65535}
|
1024. / 2047, 2048. / 4095, 4096. / 8191, 8192. / 16383, 16384. / 32767, 32768. / 65535}
|
||||||
|
|
||||||
|
// OctaveFromXoroshiro creates an Octave (multi-octave Perlin noise) from the given Xoroshiro source.
|
||||||
func OctaveFromXoroshiro(x *Xoroshiro, amplitudes []float64, omin int, lenn int, nmax int) (o Octave) {
|
func OctaveFromXoroshiro(x *Xoroshiro, amplitudes []float64, omin int, lenn int, nmax int) (o Octave) {
|
||||||
if (-omin < 0 || -omin >= len(octaveLacunaInits)) || (lenn < 0 || lenn >= len(octavePersistInits)) {
|
if (-omin < 0 || -omin >= len(octaveLacunaInits)) || (lenn < 0 || lenn >= len(octavePersistInits)) {
|
||||||
panic("octave initialization out of range")
|
panic("octave initialization out of range")
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ func landSpline(f, g, h, i, j, k float32, bl bool) Spline {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateBiomeDepthSpline builds the Minecraft biome depth spline used for terrain generation.
|
||||||
func CreateBiomeDepthSpline() Spline {
|
func CreateBiomeDepthSpline() Spline {
|
||||||
sp1 := landSpline(-0.15, 0.00, 0.0, 0.1, 0.00, -0.03, false)
|
sp1 := landSpline(-0.15, 0.00, 0.0, 0.1, 0.00, -0.03, false)
|
||||||
sp2 := landSpline(-0.10, 0.03, 0.1, 0.1, 0.01, -0.03, false)
|
sp2 := landSpline(-0.10, 0.03, 0.1, 0.1, 0.01, -0.03, false)
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ func (x *Xoroshiro) NextFloat64() float64 {
|
|||||||
return float64(x.Next()>>(64-53)) * 1.1102230246251565e-16
|
return float64(x.Next()>>(64-53)) * 1.1102230246251565e-16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XoroshiroFromString creates an Xoroshiro from an MD5 hash of the given string.
|
||||||
func XoroshiroFromString(s string) (x Xoroshiro) {
|
func XoroshiroFromString(s string) (x Xoroshiro) {
|
||||||
sum := md5.Sum([]byte(s))
|
sum := md5.Sum([]byte(s))
|
||||||
x.L = binary.BigEndian.Uint64(sum[:8])
|
x.L = binary.BigEndian.Uint64(sum[:8])
|
||||||
@@ -49,6 +50,7 @@ func XoroshiroFromString(s string) (x Xoroshiro) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XoroshiroFromSeed creates an Xoroshiro from an int64 seed.
|
||||||
func XoroshiroFromSeed(seed int64) (x Xoroshiro) {
|
func XoroshiroFromSeed(seed int64) (x Xoroshiro) {
|
||||||
x.L = uint64(seed) ^ 0x6a09e667f3bcc909
|
x.L = uint64(seed) ^ 0x6a09e667f3bcc909
|
||||||
x.H = x.L + 0x9e3779b97f4a7c15
|
x.H = x.L + 0x9e3779b97f4a7c15
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ type Attribute struct {
|
|||||||
Base float64
|
Base float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadLevelData reads and decodes the level.dat NBT file from a reader.
|
||||||
func ReadLevelData(r io.Reader) (l Level, err error) {
|
func ReadLevelData(r io.Reader) (l Level, err error) {
|
||||||
var lDataWrapped struct{ Data Level }
|
var lDataWrapped struct{ Data Level }
|
||||||
err = nbt.ReadFile(r, &lDataWrapped)
|
err = nbt.ReadFile(r, &lDataWrapped)
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func TestRegionFile(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println(string(util.MustT(json.MarshalIndent(n, "", " "))))
|
fmt.Println(string(util.MustT(json.MarshalIndent(n, "", " ")))[100:])
|
||||||
fmt.Println("Chunk loaded successfully")
|
fmt.Println("Chunk loaded successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ type ChunkHeader struct {
|
|||||||
Chunk, Time [ChunksRegionFile]int32
|
Chunk, Time [ChunksRegionFile]int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadChunkHeader reads the chunk header from an MCA region file.
|
||||||
func ReadChunkHeader(r *os.File) (ch *ChunkHeader, err error) {
|
func ReadChunkHeader(r *os.File) (ch *ChunkHeader, err error) {
|
||||||
var h ChunkHeader
|
var h ChunkHeader
|
||||||
err = binary.Read(r, binary.BigEndian, &h)
|
err = binary.Read(r, binary.BigEndian, &h)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ type Chunk struct {
|
|||||||
Version string
|
Version string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadChunkFromChunkPacketData decodes chunk packet data from a reader into a Chunk.
|
||||||
func ReadChunkFromChunkPacketData(r io.Reader, version string, worldHeight int) (c *Chunk, err error) {
|
func ReadChunkFromChunkPacketData(r io.Reader, version string, worldHeight int) (c *Chunk, err error) {
|
||||||
c = &Chunk{}
|
c = &Chunk{}
|
||||||
c.Version = version
|
c.Version = version
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ type Structure struct {
|
|||||||
Version string
|
Version string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadFromPath loads a litematic file from disk.
|
||||||
func LoadFromPath(path string) (s *Structure, err error) {
|
func LoadFromPath(path string) (s *Structure, err error) {
|
||||||
f, err := os.Open(path)
|
f, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -104,6 +105,7 @@ func LoadFromPath(path string) (s *Structure, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadFromFile reads and parses a litematic file from a reader.
|
||||||
func LoadFromFile(r io.Reader) (s *Structure, err error) {
|
func LoadFromFile(r io.Reader) (s *Structure, err error) {
|
||||||
n, err := nbt.ReadUnstructuredFile(r)
|
n, err := nbt.ReadUnstructuredFile(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -112,6 +114,7 @@ func LoadFromFile(r io.Reader) (s *Structure, err error) {
|
|||||||
return Load(n.Value)
|
return Load(n.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load decodes raw NBT data into a litematic Structure.
|
||||||
func Load(v any) (s *Structure, err error) {
|
func Load(v any) (s *Structure, err error) {
|
||||||
s = &Structure{}
|
s = &Structure{}
|
||||||
err = mapstructure.Decode(v, &s.File)
|
err = mapstructure.Decode(v, &s.File)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ type Section struct {
|
|||||||
Blocks, Biomes *Storage
|
Blocks, Biomes *Storage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MakeBiomeFormat returns the StorageFormat for biome data at the given version.
|
||||||
func MakeBiomeFormat(version string) StorageFormat {
|
func MakeBiomeFormat(version string) StorageFormat {
|
||||||
directBpe := uint8(math.Ceil(math.Log2(float64(len(data2.BiomesForVersion(version))))))
|
directBpe := uint8(math.Ceil(math.Log2(float64(len(data2.BiomesForVersion(version))))))
|
||||||
return StorageFormat{
|
return StorageFormat{
|
||||||
@@ -39,6 +40,7 @@ func MakeBiomeFormat(version string) StorageFormat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MakeBlockFormat returns the StorageFormat for block data at the given version.
|
||||||
func MakeBlockFormat(version string) StorageFormat {
|
func MakeBlockFormat(version string) StorageFormat {
|
||||||
directBpe := uint8(math.Ceil(math.Log2(float64(len(data2.BlocksForVersion(version))))))
|
directBpe := uint8(math.Ceil(math.Log2(float64(len(data2.BlocksForVersion(version))))))
|
||||||
return StorageFormat{
|
return StorageFormat{
|
||||||
@@ -51,6 +53,7 @@ func MakeBlockFormat(version string) StorageFormat {
|
|||||||
|
|
||||||
var BadPaletteLenErr = errors.New("bad palette length")
|
var BadPaletteLenErr = errors.New("bad palette length")
|
||||||
|
|
||||||
|
// ReadSectionStorage reads a packed section storage from a reader.
|
||||||
func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err error) {
|
func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err error) {
|
||||||
var bpe uint8
|
var bpe uint8
|
||||||
err = binary.Read(r, binary.BigEndian, &bpe)
|
err = binary.Read(r, binary.BigEndian, &bpe)
|
||||||
@@ -97,6 +100,7 @@ func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err erro
|
|||||||
return format.ImportFromReader(r, bpe, pallette)
|
return format.ImportFromReader(r, bpe, pallette)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteSectionStorage writes a packed section storage to a writer.
|
||||||
func WriteSectionStorage(w io.Writer, s *Storage) (err error) {
|
func WriteSectionStorage(w io.Writer, s *Storage) (err error) {
|
||||||
err = binary.Write(w, binary.BigEndian, s.bpe)
|
err = binary.Write(w, binary.BigEndian, s.bpe)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -122,6 +126,7 @@ func WriteSectionStorage(w io.Writer, s *Storage) (err error) {
|
|||||||
return binary.Write(w, binary.BigEndian, s.data)
|
return binary.Write(w, binary.BigEndian, s.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SectionDecodePacket decodes a chunk section from the Minecraft packet wire format.
|
||||||
func SectionDecodePacket(r io.Reader, version string) (s Section, err error) {
|
func SectionDecodePacket(r io.Reader, version string) (s Section, err error) {
|
||||||
s = Section{}
|
s = Section{}
|
||||||
err = binary.Read(r, binary.BigEndian, &s.BlockCount)
|
err = binary.Read(r, binary.BigEndian, &s.BlockCount)
|
||||||
@@ -136,6 +141,7 @@ func SectionDecodePacket(r io.Reader, version string) (s Section, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SectionEncodePacket encodes a chunk section to the Minecraft packet wire format.
|
||||||
func SectionEncodePacket(w io.Writer, s Section) (err error) {
|
func SectionEncodePacket(w io.Writer, s Section) (err error) {
|
||||||
err = binary.Write(w, binary.BigEndian, s.BlockCount)
|
err = binary.Write(w, binary.BigEndian, s.BlockCount)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -149,6 +155,7 @@ func SectionEncodePacket(w io.Writer, s Section) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SectionEquals returns whether two sections are equal.
|
||||||
func SectionEquals(a, b Section) bool {
|
func SectionEquals(a, b Section) bool {
|
||||||
if a.BlockCount != b.BlockCount {
|
if a.BlockCount != b.BlockCount {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ func (r *Storage) Equals(other *Storage) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CountStorage counts the number of elements in the storage that match the given value.
|
||||||
func CountStorage(s *Storage, v int32) (a int) {
|
func CountStorage(s *Storage, v int32) (a int) {
|
||||||
for i := range s.format.Len {
|
for i := range s.format.Len {
|
||||||
if w, _ := s.Get(i); w == v {
|
if w, _ := s.Get(i); w == v {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/go-viper/mapstructure/v2"
|
"github.com/go-viper/mapstructure/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Load reads a structure NBT file and returns the decoded Structure.
|
||||||
func Load(fileName string) (s *Structure, err error) {
|
func Load(fileName string) (s *Structure, err error) {
|
||||||
n, err := nbt.ReadUnstructuredFilePath(fileName)
|
n, err := nbt.ReadUnstructuredFilePath(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mapstructure
|
|||||||
|
|
||||||
var DefaultFormat = NewFormat("mapstructure", WithRequireAll(), WithTrySnakeCase(), WithTryLowCase())
|
var DefaultFormat = NewFormat("mapstructure", WithRequireAll(), WithTrySnakeCase(), WithTryLowCase())
|
||||||
|
|
||||||
|
// Decode is a stub placeholder. Use Format.Decode instead.
|
||||||
func Decode(data any, v any) error {
|
func Decode(data any, v any) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ type Format struct {
|
|||||||
encoders map[reflect.Type]func(any, string) (any, error)
|
encoders map[reflect.Type]func(any, string) (any, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewFormat creates a new Format with the given name and options.
|
||||||
func NewFormat(name string, opts ...Option) *Format {
|
func NewFormat(name string, opts ...Option) *Format {
|
||||||
f := &Format{
|
f := &Format{
|
||||||
Name: name,
|
Name: name,
|
||||||
@@ -39,30 +40,35 @@ func NewFormat(name string, opts ...Option) *Format {
|
|||||||
|
|
||||||
type Option func(*Format)
|
type Option func(*Format)
|
||||||
|
|
||||||
|
// WithRequireAll returns an Option that requires all struct fields to be present in the map.
|
||||||
func WithRequireAll() Option {
|
func WithRequireAll() Option {
|
||||||
return func(f *Format) {
|
return func(f *Format) {
|
||||||
f.requireAll = true
|
f.requireAll = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithErrorOnExtra returns an Option that causes an error when the map contains unmatched keys.
|
||||||
func WithErrorOnExtra() Option {
|
func WithErrorOnExtra() Option {
|
||||||
return func(f *Format) {
|
return func(f *Format) {
|
||||||
f.errorOnExtra = true
|
f.errorOnExtra = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTrySnakeCase returns an Option that tries to match struct fields using snake_case names.
|
||||||
func WithTrySnakeCase() Option {
|
func WithTrySnakeCase() Option {
|
||||||
return func(f *Format) {
|
return func(f *Format) {
|
||||||
f.trySnakeCase = true
|
f.trySnakeCase = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTryLowCase returns an Option that tries to match struct fields using lowercase names.
|
||||||
func WithTryLowCase() Option {
|
func WithTryLowCase() Option {
|
||||||
return func(f *Format) {
|
return func(f *Format) {
|
||||||
f.tryLowCase = true
|
f.tryLowCase = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTypeCodec returns an Option that registers custom decode/encode functions for a type.
|
||||||
func WithTypeCodec(decodeFn, encodeFn any) Option {
|
func WithTypeCodec(decodeFn, encodeFn any) Option {
|
||||||
dt := reflect.TypeOf(decodeFn)
|
dt := reflect.TypeOf(decodeFn)
|
||||||
et := reflect.TypeOf(encodeFn)
|
et := reflect.TypeOf(encodeFn)
|
||||||
@@ -94,6 +100,7 @@ func WithTypeCodec(decodeFn, encodeFn any) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decode populates target (a pointer to a struct) from data (a map[string]any).
|
||||||
func (f *Format) Decode(data any, target any) error {
|
func (f *Format) Decode(data any, target any) error {
|
||||||
v := reflect.ValueOf(target)
|
v := reflect.ValueOf(target)
|
||||||
if v.Kind() != reflect.Pointer || v.IsNil() {
|
if v.Kind() != reflect.Pointer || v.IsNil() {
|
||||||
@@ -110,6 +117,7 @@ func (f *Format) Decode(data any, target any) error {
|
|||||||
return f.decode(m, v)
|
return f.decode(m, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encode converts source (a struct or pointer to a struct) into a map[string]any.
|
||||||
func (f *Format) Encode(source any) (map[string]any, error) {
|
func (f *Format) Encode(source any) (map[string]any, error) {
|
||||||
v := reflect.ValueOf(source)
|
v := reflect.ValueOf(source)
|
||||||
if v.Kind() == reflect.Pointer {
|
if v.Kind() == reflect.Pointer {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
var Format = mapstructure.NewFormat("nbt", mapstructure.WithRequireAll(), mapstructure.WithTrySnakeCase(), mapstructure.WithTryLowCase())
|
var Format = mapstructure.NewFormat("nbt", mapstructure.WithRequireAll(), mapstructure.WithTrySnakeCase(), mapstructure.WithTryLowCase())
|
||||||
|
|
||||||
|
// ReadFile reads a gzipped NBT file from r and decodes it into data using the package-level Format.
|
||||||
func ReadFile(file io.Reader, data any) (err error) {
|
func ReadFile(file io.Reader, data any) (err error) {
|
||||||
n, err := ReadUnstructuredFile(file)
|
n, err := ReadUnstructuredFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -18,6 +19,7 @@ func ReadFile(file io.Reader, data any) (err error) {
|
|||||||
return Format.Decode(n.Value, data)
|
return Format.Decode(n.Value, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteUnstructuredFilePath writes an NBT tag as a gzipped file to the given filesystem path.
|
||||||
func WriteUnstructuredFilePath(path string, n *Tag) (err error) {
|
func WriteUnstructuredFilePath(path string, n *Tag) (err error) {
|
||||||
f, err := os.Create(path)
|
f, err := os.Create(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -27,6 +29,7 @@ func WriteUnstructuredFilePath(path string, n *Tag) (err error) {
|
|||||||
return WriteUnstructuredFile(f, n)
|
return WriteUnstructuredFile(f, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteUnstructuredFile writes an NBT tag as a gzipped file to w.
|
||||||
func WriteUnstructuredFile(file io.Writer, n *Tag) (err error) {
|
func WriteUnstructuredFile(file io.Writer, n *Tag) (err error) {
|
||||||
gzw := gzip.NewWriter(file)
|
gzw := gzip.NewWriter(file)
|
||||||
defer gzw.Close()
|
defer gzw.Close()
|
||||||
@@ -34,6 +37,7 @@ func WriteUnstructuredFile(file io.Writer, n *Tag) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadUnstructuredFile reads a gzipped NBT file from r and returns the root Tag.
|
||||||
func ReadUnstructuredFile(file io.Reader) (n *Tag, err error) {
|
func ReadUnstructuredFile(file io.Reader) (n *Tag, err error) {
|
||||||
r, err := gzip.NewReader(file)
|
r, err := gzip.NewReader(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -45,6 +49,7 @@ func ReadUnstructuredFile(file io.Reader) (n *Tag, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadUnstructuredFilePath reads a gzipped NBT file from the given filesystem path and returns the root Tag.
|
||||||
func ReadUnstructuredFilePath(path string) (n *Tag, err error) {
|
func ReadUnstructuredFilePath(path string) (n *Tag, err error) {
|
||||||
f, err := os.Open(path)
|
f, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+17
-3
@@ -73,6 +73,7 @@ type Conn struct {
|
|||||||
Log *slog.Logger
|
Log *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StartConn starts the connection event loop, registering the receive routine and login tick handler.
|
||||||
func (c *Conn) StartConn() (err error) {
|
func (c *Conn) StartConn() (err error) {
|
||||||
c.RegisterEventSource(c.ActivateReceiveRoutine())
|
c.RegisterEventSource(c.ActivateReceiveRoutine())
|
||||||
c.RegisterCritical(c.OnLoginTick)
|
c.RegisterCritical(c.OnLoginTick)
|
||||||
@@ -81,6 +82,7 @@ func (c *Conn) StartConn() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnLoginTick handles a login tick by receiving a packet and firing it as an event.
|
||||||
func (c *Conn) OnLoginTick(_ LoginTick) (err error) {
|
func (c *Conn) OnLoginTick(_ LoginTick) (err error) {
|
||||||
packet, err := c.Receive()
|
packet, err := c.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -90,30 +92,35 @@ func (c *Conn) OnLoginTick(_ LoginTick) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetState sets the connection's protocol state.
|
||||||
func (c *Conn) SetState(state proto_base.State) {
|
func (c *Conn) SetState(state proto_base.State) {
|
||||||
c.stateMutex.Lock()
|
c.stateMutex.Lock()
|
||||||
defer c.stateMutex.Unlock()
|
defer c.stateMutex.Unlock()
|
||||||
c.state = state
|
c.state = state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// State returns the current connection protocol state.
|
||||||
func (c *Conn) State() proto_base.State {
|
func (c *Conn) State() proto_base.State {
|
||||||
c.stateMutex.RLock()
|
c.stateMutex.RLock()
|
||||||
defer c.stateMutex.RUnlock()
|
defer c.stateMutex.RUnlock()
|
||||||
return c.state
|
return c.state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetAsyncPackets enables or disables asynchronous packet handling in the receive routine.
|
||||||
func (c *Conn) SetAsyncPackets(asyncPackets bool) {
|
func (c *Conn) SetAsyncPackets(asyncPackets bool) {
|
||||||
c.asyncPacketsMutex.Lock()
|
c.asyncPacketsMutex.Lock()
|
||||||
defer c.asyncPacketsMutex.Unlock()
|
defer c.asyncPacketsMutex.Unlock()
|
||||||
c.asyncPackets = asyncPackets
|
c.asyncPackets = asyncPackets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAsyncPackets returns whether asynchronous packet handling is enabled.
|
||||||
func (c *Conn) GetAsyncPackets() bool {
|
func (c *Conn) GetAsyncPackets() bool {
|
||||||
c.asyncPacketsMutex.RLock()
|
c.asyncPacketsMutex.RLock()
|
||||||
defer c.asyncPacketsMutex.RUnlock()
|
defer c.asyncPacketsMutex.RUnlock()
|
||||||
return c.asyncPackets
|
return c.asyncPackets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetVersion sets the connection's Minecraft version by version name and looks up the corresponding protocol version.
|
||||||
func (c *Conn) SetVersion(version string) (err error) {
|
func (c *Conn) SetVersion(version string) (err error) {
|
||||||
versionData, err := data.LookUpVersionByName(version)
|
versionData, err := data.LookUpVersionByName(version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -124,6 +131,7 @@ func (c *Conn) SetVersion(version string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetProtocolVersion sets the connection's version by protocol version number and looks up the corresponding version name.
|
||||||
func (c *Conn) SetProtocolVersion(version int32) (err error) {
|
func (c *Conn) SetProtocolVersion(version int32) (err error) {
|
||||||
versionData, err := data.LookUpVersionByProtocolVersion(version)
|
versionData, err := data.LookUpVersionByProtocolVersion(version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -166,13 +174,14 @@ func (c *Conn) ActivateReceiveRoutine() (chSending <-chan any) {
|
|||||||
func (c *Conn) translatePacketVersion(packet proto_base.EncodeDecodeAble, packetInfo proto_base.PacketInfo) (convertedPacket proto_base.EncodeDecodeAble, packetInfoReal proto_base.PacketInfo, err error) {
|
func (c *Conn) translatePacketVersion(packet proto_base.EncodeDecodeAble, packetInfo proto_base.PacketInfo) (convertedPacket proto_base.EncodeDecodeAble, packetInfoReal proto_base.PacketInfo, err error) {
|
||||||
packetInfoReal, found := LookupPacketInfoByNameProtocolVersionStateAndDirection(packetInfo.Name, c.ProtocolVersion, c.State(), packetInfo.Direction)
|
packetInfoReal, found := LookupPacketInfoByNameProtocolVersionStateAndDirection(packetInfo.Name, c.ProtocolVersion, c.State(), packetInfo.Direction)
|
||||||
if !found {
|
if !found {
|
||||||
err = PacketDoesntExistInFutureVersionErr
|
err = fmt.Errorf("%w: %s from pv%d to pv%d in %s/%s not found", PacketDoesntExistInFutureVersionErr, packetInfo.Name, packetInfo.ProtocolVersion, c.ProtocolVersion, packetInfo.State, packetInfo.Direction)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dstType := reflect.TypeOf(packetInfoReal.Type)
|
dstType := reflect.TypeOf(packetInfoReal.Type)
|
||||||
if !SmartConvertibleTo(reflect.TypeOf(packetInfo.Type), dstType) {
|
srcType := reflect.TypeOf(packetInfo.Type)
|
||||||
err = CantTranslateErr
|
if !SmartConvertibleTo(srcType, dstType) {
|
||||||
|
err = fmt.Errorf("%w: %s from pv%d to pv%d in %s/%s (src=%s dst=%s)", CantTranslateErr, packetInfo.Name, packetInfo.ProtocolVersion, c.ProtocolVersion, packetInfo.State, packetInfo.Direction, srcType, dstType)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// can't fail cause pacetinfo.type is proto_base.EncodeDecodeAble
|
// can't fail cause pacetinfo.type is proto_base.EncodeDecodeAble
|
||||||
@@ -201,6 +210,7 @@ func SimplePacketToBytes(packet proto_base.EncodeDecodeAble) (b []byte, err erro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SimplePacketToBytesLenPrefix is like SimplePacketToBytes but also prepends the length-prefix framing.
|
||||||
func SimplePacketToBytesLenPrefix(packet proto_base.EncodeDecodeAble) (b []byte, err error) {
|
func SimplePacketToBytesLenPrefix(packet proto_base.EncodeDecodeAble) (b []byte, err error) {
|
||||||
b, err = SimplePacketToBytes(packet)
|
b, err = SimplePacketToBytes(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -281,6 +291,7 @@ func (c *Conn) sendRegisteredPacket(packet proto_base.EncodeDecodeAble) (err err
|
|||||||
return c.SendRaw(packetBuff.Bytes())
|
return c.SendRaw(packetBuff.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send encodes and sends a packet to the remote peer, translating protocol versions if needed.
|
||||||
func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) {
|
func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) {
|
||||||
switch packet := packet.(type) {
|
switch packet := packet.(type) {
|
||||||
case *UnCodablePacket:
|
case *UnCodablePacket:
|
||||||
@@ -291,6 +302,7 @@ func (c *Conn) Send(packet proto_base.EncodeDecodeAble) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Receive reads and decodes a raw packet from the remote peer.
|
||||||
func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) {
|
func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) {
|
||||||
if c.R == nil {
|
if c.R == nil {
|
||||||
return
|
return
|
||||||
@@ -334,10 +346,12 @@ func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// NewConn creates a new Conn with default settings and a background context.
|
||||||
func NewConn() (ret *Conn) {
|
func NewConn() (ret *Conn) {
|
||||||
return NewConnCtx(context.Background())
|
return NewConnCtx(context.Background())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewConnCtx creates a new Conn with the given context, setting the handshaking state and latest version.
|
||||||
func NewConnCtx(ctx context.Context) (ret *Conn) {
|
func NewConnCtx(ctx context.Context) (ret *Conn) {
|
||||||
ret = &Conn{}
|
ret = &Conn{}
|
||||||
ret.SetState(proto_base.Handshaking)
|
ret.SetState(proto_base.Handshaking)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookUpTypeByPacketInfo looks up a packet's type information by direction, state, packet id, and protocol version.
|
||||||
func LookUpTypeByPacketInfo(direction proto_base.Direction, state proto_base.State, pid, version int32) (p proto_base.PacketInfo, ok bool) {
|
func LookUpTypeByPacketInfo(direction proto_base.Direction, state proto_base.State, pid, version int32) (p proto_base.PacketInfo, ok bool) {
|
||||||
pP, ok := pidMap[PidEtc{direction, state, pid, version}]
|
pP, ok := pidMap[PidEtc{direction, state, pid, version}]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -39,6 +40,7 @@ func LookUpTypeByPacketInfo(direction proto_base.Direction, state proto_base.Sta
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookUpTypeByPacketInfoAndCopyType looks up a packet and returns a newly allocated instance of its type.
|
||||||
func LookUpTypeByPacketInfoAndCopyType(direction proto_base.Direction, state proto_base.State, pid, version int32) (p proto_base.EncodeDecodeAble, ok bool) {
|
func LookUpTypeByPacketInfoAndCopyType(direction proto_base.Direction, state proto_base.State, pid, version int32) (p proto_base.EncodeDecodeAble, ok bool) {
|
||||||
i, ok := LookUpTypeByPacketInfo(direction, state, pid, version)
|
i, ok := LookUpTypeByPacketInfo(direction, state, pid, version)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -48,6 +50,7 @@ func LookUpTypeByPacketInfoAndCopyType(direction proto_base.Direction, state pro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupPacketInfoByType looks up a packet's type information by matching against the type of the given packet value.
|
||||||
func LookupPacketInfoByType(packet proto_base.EncodeDecodeAble) (p proto_base.PacketInfo, ok bool) {
|
func LookupPacketInfoByType(packet proto_base.EncodeDecodeAble) (p proto_base.PacketInfo, ok bool) {
|
||||||
undecodedPacket, isUndecoable := packet.(*UnCodablePacket)
|
undecodedPacket, isUndecoable := packet.(*UnCodablePacket)
|
||||||
if isUndecoable {
|
if isUndecoable {
|
||||||
@@ -64,6 +67,7 @@ func LookupPacketInfoByType(packet proto_base.EncodeDecodeAble) (p proto_base.Pa
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupPacketInfoByTypeAndState looks up a packet's type information by type and state.
|
||||||
func LookupPacketInfoByTypeAndState(packet proto_base.EncodeDecodeAble, state proto_base.State) (p proto_base.PacketInfo, ok bool) {
|
func LookupPacketInfoByTypeAndState(packet proto_base.EncodeDecodeAble, state proto_base.State) (p proto_base.PacketInfo, ok bool) {
|
||||||
for _, p := range proto_generated.Packets {
|
for _, p := range proto_generated.Packets {
|
||||||
if state == p.State && reflect.TypeOf(p.Type) == reflect.TypeOf(packet) {
|
if state == p.State && reflect.TypeOf(p.Type) == reflect.TypeOf(packet) {
|
||||||
@@ -73,6 +77,7 @@ func LookupPacketInfoByTypeAndState(packet proto_base.EncodeDecodeAble, state pr
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupPacketInfoByNameProtocolVersionAndState looks up a packet's type information by name, protocol version, and state.
|
||||||
func LookupPacketInfoByNameProtocolVersionAndState(name string, version int32, state proto_base.State) (p proto_base.PacketInfo, ok bool) {
|
func LookupPacketInfoByNameProtocolVersionAndState(name string, version int32, state proto_base.State) (p proto_base.PacketInfo, ok bool) {
|
||||||
for _, p := range proto_generated.Packets {
|
for _, p := range proto_generated.Packets {
|
||||||
if state == p.State && p.Name == name && p.ProtocolVersion == version {
|
if state == p.State && p.Name == name && p.ProtocolVersion == version {
|
||||||
@@ -82,6 +87,7 @@ func LookupPacketInfoByNameProtocolVersionAndState(name string, version int32, s
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupPacketInfoByNameProtocolVersionStateAndDirection looks up a packet's type information by name, protocol version, state, and direction.
|
||||||
func LookupPacketInfoByNameProtocolVersionStateAndDirection(name string, version int32, state proto_base.State, direction proto_base.Direction) (p proto_base.PacketInfo, ok bool) {
|
func LookupPacketInfoByNameProtocolVersionStateAndDirection(name string, version int32, state proto_base.State, direction proto_base.Direction) (p proto_base.PacketInfo, ok bool) {
|
||||||
for _, p := range proto_generated.Packets {
|
for _, p := range proto_generated.Packets {
|
||||||
if state == p.State && p.Name == name && p.ProtocolVersion == version && p.Direction == direction {
|
if state == p.State && p.Name == name && p.ProtocolVersion == version && p.Direction == direction {
|
||||||
|
|||||||
+24
-1
@@ -20,21 +20,33 @@ type RawConn struct {
|
|||||||
W io.Writer
|
W io.Writer
|
||||||
compressionThreshold int32
|
compressionThreshold int32
|
||||||
CompressionThresholdMut sync.RWMutex
|
CompressionThresholdMut sync.RWMutex
|
||||||
|
|
||||||
|
// MaxPacketSize is the maximum size of a packet that can be sent or received.
|
||||||
|
// Applies to both raw and compressed packets.
|
||||||
|
// Should be set while the connection is not in use. Or in sync mode.
|
||||||
|
MaxPacketSize int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetCompressionThreshold sets the packet compression threshold. Values below 0 disable compression.
|
||||||
func (c *RawConn) SetCompressionThreshold(threshold int32) {
|
func (c *RawConn) SetCompressionThreshold(threshold int32) {
|
||||||
c.CompressionThresholdMut.Lock()
|
c.CompressionThresholdMut.Lock()
|
||||||
defer c.CompressionThresholdMut.Unlock()
|
defer c.CompressionThresholdMut.Unlock()
|
||||||
c.compressionThreshold = threshold
|
c.compressionThreshold = threshold
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetCompressionThreshold returns the current compression threshold.
|
||||||
func (c *RawConn) GetCompressionThreshold() int32 {
|
func (c *RawConn) GetCompressionThreshold() int32 {
|
||||||
c.CompressionThresholdMut.RLock()
|
c.CompressionThresholdMut.RLock()
|
||||||
defer c.CompressionThresholdMut.RUnlock()
|
defer c.CompressionThresholdMut.RUnlock()
|
||||||
return c.compressionThreshold
|
return c.compressionThreshold
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendRaw sends raw packet bytes over the connection, applying compression if the threshold is met.
|
||||||
func (c *RawConn) SendRaw(rawPacketBytes []byte) (err error) {
|
func (c *RawConn) SendRaw(rawPacketBytes []byte) (err error) {
|
||||||
|
if c.MaxPacketSize > 0 && int32(len(rawPacketBytes)) > c.MaxPacketSize {
|
||||||
|
err = errors.New("packet too large")
|
||||||
|
return
|
||||||
|
}
|
||||||
//fmt.Println("send:", rawPacketBytes)
|
//fmt.Println("send:", rawPacketBytes)
|
||||||
var packetBytes []byte
|
var packetBytes []byte
|
||||||
threshold := c.GetCompressionThreshold()
|
threshold := c.GetCompressionThreshold()
|
||||||
@@ -45,7 +57,7 @@ func (c *RawConn) SendRaw(rawPacketBytes []byte) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
zW := zlib.NewWriter(packetBuffer) // ignore we don't care about the result if it errors
|
zW := zlib.NewWriter(packetBuffer)
|
||||||
_, err = zW.Write(rawPacketBytes)
|
_, err = zW.Write(rawPacketBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -81,11 +93,17 @@ func (c *RawConn) SendRaw(rawPacketBytes []byte) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReceiveRaw reads and decompresses (if needed) a raw packet from the connection.
|
||||||
func (c *RawConn) ReceiveRaw() (packetBytes []byte, err error) {
|
func (c *RawConn) ReceiveRaw() (packetBytes []byte, err error) {
|
||||||
rawPacketLen, err := proto_base.DecodeVarInt(c.R)
|
rawPacketLen, err := proto_base.DecodeVarInt(c.R)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if c.MaxPacketSize > 0 && rawPacketLen > c.MaxPacketSize {
|
||||||
|
err = errors.New("packet too large")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
rawPacketBytes, err := io.ReadAll(io.LimitReader(c.R, int64(rawPacketLen)))
|
rawPacketBytes, err := io.ReadAll(io.LimitReader(c.R, int64(rawPacketLen)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -101,6 +119,10 @@ func (c *RawConn) ReceiveRaw() (packetBytes []byte, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if c.MaxPacketSize > 0 && packetLen > c.MaxPacketSize {
|
||||||
|
err = errors.New("deflated packet too large")
|
||||||
|
return
|
||||||
|
}
|
||||||
if packetLen == 0 {
|
if packetLen == 0 {
|
||||||
packetBytes, err = io.ReadAll(rawPacketBuffer)
|
packetBytes, err = io.ReadAll(rawPacketBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -124,6 +146,7 @@ func (c *RawConn) ReceiveRaw() (packetBytes []byte, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetSecret enables AES/CFB8 encryption on the connection using the shared secret.
|
||||||
func (c *RawConn) SetSecret(sharedSecret []byte) (err error) {
|
func (c *RawConn) SetSecret(sharedSecret []byte) (err error) {
|
||||||
var b cipher.Block
|
var b cipher.Block
|
||||||
b, err = aes.NewCipher(sharedSecret)
|
b, err = aes.NewCipher(sharedSecret)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ type Reader struct {
|
|||||||
Version int32
|
Version int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewReader creates a new replay Reader from an io.Reader.
|
||||||
func NewReader(r io.Reader) *Reader {
|
func NewReader(r io.Reader) *Reader {
|
||||||
return &Reader{r: r}
|
return &Reader{r: r}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ type Writer struct {
|
|||||||
w io.Writer
|
w io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewWriter creates a new replay Writer from an io.Writer.
|
||||||
func NewWriter(w io.Writer) *Writer {
|
func NewWriter(w io.Writer) *Writer {
|
||||||
return &Writer{w: w}
|
return &Writer{w: w}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/admin-else/strom/mc/proto_generated"
|
"github.com/admin-else/strom/mc/proto_generated"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// SmartConvertibleTo reports whether a value of type from can be recursively converted to type to.
|
||||||
func SmartConvertibleTo(from, to reflect.Type) bool {
|
func SmartConvertibleTo(from, to reflect.Type) bool {
|
||||||
switch from.Kind() {
|
switch from.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
@@ -36,6 +37,7 @@ func SmartConvertibleTo(from, to reflect.Type) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SmartConvert recursively converts a reflect.Value from one type to another compatible type.
|
||||||
func SmartConvert(from reflect.Value, to reflect.Type) (ret reflect.Value) {
|
func SmartConvert(from reflect.Value, to reflect.Type) (ret reflect.Value) {
|
||||||
switch from.Kind() {
|
switch from.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_11"
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_11"
|
||||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_9"
|
"github.com/admin-else/strom/mc/proto_generated/v1_21_9"
|
||||||
|
"github.com/admin-else/strom/mc/proto_generated/v26_2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCanSmartConvert(t *testing.T) {
|
func TestCanSmartConvert(t *testing.T) {
|
||||||
@@ -66,3 +67,15 @@ func TestSmartConvert(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoginSuccessNotConvertibleAcross26_2(t *testing.T) {
|
||||||
|
// login_success gained an extra SessionId field in 26.2, so it is not
|
||||||
|
// smart-convertible in either direction. This is why the login server has
|
||||||
|
// version-gated send code and the login client has a dedicated 26.2 handler.
|
||||||
|
if proto2.SmartConvertibleTo(reflect.TypeFor[*v1_21_8.LoginToClientPacketSuccess](), reflect.TypeFor[*v26_2.LoginToClientPacketSuccess]()) {
|
||||||
|
t.Fatal("expected v1_21_8 login_success NOT to be convertible to v26_2")
|
||||||
|
}
|
||||||
|
if proto2.SmartConvertibleTo(reflect.TypeFor[*v26_2.LoginToClientPacketSuccess](), reflect.TypeFor[*v1_21_8.LoginToClientPacketSuccess]()) {
|
||||||
|
t.Fatal("expected v26_2 login_success NOT to be convertible to v1_21_8")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+39
-10
@@ -7,10 +7,12 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// UnimplementedErr is returned when a code path is not yet implemented.
|
||||||
var (
|
var (
|
||||||
UnimplementedErr = errors.New("unimplemented")
|
UnimplementedErr = errors.New("unimplemented")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Direction indicates whether a packet is sent to the server or to the client.
|
||||||
type Direction int
|
type Direction int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -18,6 +20,7 @@ const (
|
|||||||
ToClient
|
ToClient
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// String returns a human-readable representation of the Direction.
|
||||||
func (d Direction) String() string {
|
func (d Direction) String() string {
|
||||||
switch d {
|
switch d {
|
||||||
case ToServer:
|
case ToServer:
|
||||||
@@ -29,10 +32,12 @@ func (d Direction) String() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Opposite returns the reverse Direction.
|
||||||
func (d Direction) Opposite() Direction {
|
func (d Direction) Opposite() Direction {
|
||||||
return d ^ 1
|
return d ^ 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// State represents the Minecraft connection state.
|
||||||
type State int32
|
type State int32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -43,6 +48,7 @@ const (
|
|||||||
Play
|
Play
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// String returns a human-readable representation of the State.
|
||||||
func (s State) String() string {
|
func (s State) String() string {
|
||||||
switch s {
|
switch s {
|
||||||
case Handshaking:
|
case Handshaking:
|
||||||
@@ -60,13 +66,16 @@ func (s State) String() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Actor represents a participant in a Minecraft connection.
|
||||||
type Actor int
|
type Actor int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Servee Actor = iota // Servee is the one being served
|
// Servee is the one being served (e.g. the backend server in a proxy).
|
||||||
|
Servee Actor = iota
|
||||||
Client
|
Client
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// String returns a human-readable representation of the Actor.
|
||||||
func (a Actor) String() string {
|
func (a Actor) String() string {
|
||||||
switch a {
|
switch a {
|
||||||
case Servee:
|
case Servee:
|
||||||
@@ -78,6 +87,7 @@ func (a Actor) String() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendDirection returns the Direction in which this Actor sends packets.
|
||||||
func (a Actor) SendDirection() Direction {
|
func (a Actor) SendDirection() Direction {
|
||||||
switch a {
|
switch a {
|
||||||
case Servee:
|
case Servee:
|
||||||
@@ -89,6 +99,7 @@ func (a Actor) SendDirection() Direction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReceiveDirection returns the Direction from which this Actor receives packets.
|
||||||
func (a Actor) ReceiveDirection() Direction {
|
func (a Actor) ReceiveDirection() Direction {
|
||||||
switch a {
|
switch a {
|
||||||
case Servee:
|
case Servee:
|
||||||
@@ -101,13 +112,19 @@ func (a Actor) ReceiveDirection() Direction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
// ToDo is a placeholder type for unimplemented packet fields.
|
||||||
ToDo struct{}
|
ToDo struct{}
|
||||||
|
// RestBuffer represents the remaining unread bytes in a packet buffer.
|
||||||
RestBuffer []byte
|
RestBuffer []byte
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ToDoError is returned when a ToDo placeholder is used.
|
||||||
var ToDoError = errors.New("to do")
|
var ToDoError = errors.New("to do")
|
||||||
|
|
||||||
|
// BadTypeError is returned when an unexpected type is encountered.
|
||||||
var BadTypeError = errors.New("bad type")
|
var BadTypeError = errors.New("bad type")
|
||||||
|
|
||||||
|
// Encode writes the RestBuffer to w.
|
||||||
func (b *RestBuffer) Encode(w io.Writer) (err error) {
|
func (b *RestBuffer) Encode(w io.Writer) (err error) {
|
||||||
n, err := w.Write(*b)
|
n, err := w.Write(*b)
|
||||||
if n != len(*b) {
|
if n != len(*b) {
|
||||||
@@ -116,11 +133,13 @@ func (b *RestBuffer) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decode reads all remaining bytes from r into the RestBuffer.
|
||||||
func (b *RestBuffer) Decode(r io.Reader) (err error) {
|
func (b *RestBuffer) Decode(r io.Reader) (err error) {
|
||||||
*b, err = io.ReadAll(r)
|
*b, err = io.ReadAll(r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EncodeString encodes a length-prefixed UTF-8 string in Minecraft varint format.
|
||||||
func EncodeString(w io.Writer, s string) (err error) {
|
func EncodeString(w io.Writer, s string) (err error) {
|
||||||
err = EncodeVarInt(w, int32(len(s)))
|
err = EncodeVarInt(w, int32(len(s)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -130,6 +149,7 @@ func EncodeString(w io.Writer, s string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecodeString decodes a length-prefixed UTF-8 string in Minecraft varint format.
|
||||||
func DecodeString(r io.Reader) (ret string, err error) {
|
func DecodeString(r io.Reader) (ret string, err error) {
|
||||||
l, err := DecodeVarInt(r)
|
l, err := DecodeVarInt(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -146,16 +166,19 @@ func DecodeString(r io.Reader) (ret string, err error) {
|
|||||||
return string(rawString), nil
|
return string(rawString), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encode is a no-op stub that always returns ToDoError.
|
||||||
func (t ToDo) Encode(_ io.Writer) (err error) {
|
func (t ToDo) Encode(_ io.Writer) (err error) {
|
||||||
err = ToDoError
|
err = ToDoError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decode is a no-op stub that always returns ToDoError.
|
||||||
func (t ToDo) Decode(_ io.Reader) (ret ToDo, err error) {
|
func (t ToDo) Decode(_ io.Reader) (ret ToDo, err error) {
|
||||||
err = ToDoError
|
err = ToDoError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EncodeVarInt encodes a signed 32-bit integer in Minecraft varint format.
|
||||||
func EncodeVarInt(w io.Writer, v int32) (err error) {
|
func EncodeVarInt(w io.Writer, v int32) (err error) {
|
||||||
uv := uint32(v)
|
uv := uint32(v)
|
||||||
for {
|
for {
|
||||||
@@ -175,6 +198,7 @@ func EncodeVarInt(w io.Writer, v int32) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecodeVarInt decodes a signed 32-bit integer in Minecraft varint format.
|
||||||
func DecodeVarInt(r io.Reader) (ret int32, err error) {
|
func DecodeVarInt(r io.Reader) (ret int32, err error) {
|
||||||
for i := range 5 { // 32/7
|
for i := range 5 { // 32/7
|
||||||
var b uint8 = 0
|
var b uint8 = 0
|
||||||
@@ -191,6 +215,7 @@ func DecodeVarInt(r io.Reader) (ret int32, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EncodeVarLong encodes a signed 64-bit integer in Minecraft varlong format.
|
||||||
func EncodeVarLong(w io.Writer, v int64) (err error) {
|
func EncodeVarLong(w io.Writer, v int64) (err error) {
|
||||||
uv := uint64(v)
|
uv := uint64(v)
|
||||||
for {
|
for {
|
||||||
@@ -210,6 +235,7 @@ func EncodeVarLong(w io.Writer, v int64) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DecodeVarLong decodes a signed 64-bit integer in Minecraft varlong format.
|
||||||
func DecodeVarLong(r io.Reader) (ret int64, err error) {
|
func DecodeVarLong(r io.Reader) (ret int64, err error) {
|
||||||
for i := range 10 { // ceil(64/7)
|
for i := range 10 { // ceil(64/7)
|
||||||
var b uint8
|
var b uint8
|
||||||
@@ -226,6 +252,7 @@ func DecodeVarLong(r io.Reader) (ret int64, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErroringIndex looks up key k in map m and returns an error if the key is not found.
|
||||||
func ErroringIndex[K comparable, V any, M map[K]V](m M, i K) (v V, err error) {
|
func ErroringIndex[K comparable, V any, M map[K]V](m M, i K) (v V, err error) {
|
||||||
var ok bool
|
var ok bool
|
||||||
v, ok = m[i]
|
v, ok = m[i]
|
||||||
@@ -235,20 +262,14 @@ func ErroringIndex[K comparable, V any, M map[K]V](m M, i K) (v V, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EncodeDecodeAble is implemented by types that can be encoded and decoded for
|
||||||
|
// Minecraft protocol packets.
|
||||||
type EncodeDecodeAble interface {
|
type EncodeDecodeAble interface {
|
||||||
Encode(w io.Writer) (err error)
|
Encode(w io.Writer) (err error)
|
||||||
Decode(r io.ReadSeeker) (err error)
|
Decode(r io.ReadSeeker) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Void struct{}
|
// PacketInfo holds metadata about a Minecraft protocol packet.
|
||||||
|
|
||||||
func (v Void) Encode(w io.Writer) (err error) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
func (v Void) Decode(r io.ReadSeeker) (err error) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
type PacketInfo struct {
|
type PacketInfo struct {
|
||||||
Type EncodeDecodeAble
|
Type EncodeDecodeAble
|
||||||
Name string
|
Name string
|
||||||
@@ -258,6 +279,7 @@ type PacketInfo struct {
|
|||||||
ProtocolVersion int32
|
ProtocolVersion int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bool2uint8 converts a bool to a uint8 (1 for true, 0 for false).
|
||||||
func Bool2uint8(b bool) uint8 {
|
func Bool2uint8(b bool) uint8 {
|
||||||
if b {
|
if b {
|
||||||
return 1
|
return 1
|
||||||
@@ -265,6 +287,7 @@ func Bool2uint8(b bool) uint8 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bool2uint16 converts a bool to a uint16 (1 for true, 0 for false).
|
||||||
func Bool2uint16(b bool) uint16 {
|
func Bool2uint16(b bool) uint16 {
|
||||||
if b {
|
if b {
|
||||||
return 1
|
return 1
|
||||||
@@ -272,6 +295,7 @@ func Bool2uint16(b bool) uint16 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bool2uint32 converts a bool to a uint32 (1 for true, 0 for false).
|
||||||
func Bool2uint32(b bool) uint32 {
|
func Bool2uint32(b bool) uint32 {
|
||||||
if b {
|
if b {
|
||||||
return 1
|
return 1
|
||||||
@@ -279,6 +303,7 @@ func Bool2uint32(b bool) uint32 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bool2uint64 converts a bool to a uint64 (1 for true, 0 for false).
|
||||||
func Bool2uint64(b bool) uint64 {
|
func Bool2uint64(b bool) uint64 {
|
||||||
if b {
|
if b {
|
||||||
return 1
|
return 1
|
||||||
@@ -286,13 +311,17 @@ func Bool2uint64(b bool) uint64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LpVec3d is a compressed 3D velocity vector used in Minecraft packets.
|
||||||
type LpVec3d struct {
|
type LpVec3d struct {
|
||||||
X, Y, Z float64
|
X, Y, Z float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encode encodes the LpVec3d as a compressed velocity triple into w.
|
||||||
func (v *LpVec3d) Encode(w io.Writer) error {
|
func (v *LpVec3d) Encode(w io.Writer) error {
|
||||||
return writeVelocity(w, *v)
|
return writeVelocity(w, *v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decode decodes a compressed velocity triple from r into the LpVec3d.
|
||||||
func (v *LpVec3d) Decode(r io.ReadSeeker) error {
|
func (v *LpVec3d) Decode(r io.ReadSeeker) error {
|
||||||
v3, err := readVelocity(r)
|
v3, err := readVelocity(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
// Code generated by strom. DO NOT EDIT.
|
// Code generated by strom. DO NOT EDIT.
|
||||||
// source: minecraft-data/pc/1.21.11/protocol.json (sha256:5d0fffae79fe3d99919d16f79ed22d4c76d80fcddf92868b93abda1f55867dd8)
|
// source: minecraft-data/pc/1.21.11/protocol.json (sha256:97d2726cce3a39cc967a954f27f4ebf029ec3f0f655bb21942aab8745d13cdab)
|
||||||
// version: (devel) (go1.26.4-X:nodwarf5)
|
// version: v0.6.3-0.20260723203259-d84618c116b8+dirty (go1.26.5-X:nodwarf5)
|
||||||
package v1_21_11
|
package v1_21_11
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -11447,7 +11447,10 @@ func (ret *PlayToClientPacket) Decode(r io.ReadSeeker) (err error) {
|
|||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBossBarTmp
|
ret.Params = PlayToClientPacketParamsBossBarTmp
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
var PlayToClientPacketParamsBundleDelimiterTmp struct {
|
var PlayToClientPacketParamsBundleDelimiterTmp PlayToClientPacketBundleDelimiter
|
||||||
|
err = PlayToClientPacketParamsBundleDelimiterTmp.Decode(r)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
||||||
case "camera":
|
case "camera":
|
||||||
@@ -12467,12 +12470,15 @@ func (ret *PlayToClientPacket) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
_, ok := ret.Params.(struct {
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketBundleDelimiter)
|
||||||
})
|
|
||||||
if !ok {
|
if !ok {
|
||||||
err = proto_base.BadTypeError
|
err = proto_base.BadTypeError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err = PlayToClientPacketParams.Encode(w)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
case "camera":
|
case "camera":
|
||||||
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -14705,6 +14711,16 @@ func (ret *PlayToClientPacketBossBar) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PlayToClientPacketBundleDelimiter struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Decode(r io.ReadSeeker) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Encode(w io.Writer) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type PlayToClientPacketCamera struct {
|
type PlayToClientPacketCamera struct {
|
||||||
CameraId int32
|
CameraId int32
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Code generated by strom. DO NOT EDIT.
|
// Code generated by strom. DO NOT EDIT.
|
||||||
// source: minecraft-data/pc/1.21.8/protocol.json (sha256:627f4138d1a6e4a6fff1cde6008c95a72cd580728aafca8ba62ad0ef21c88f61)
|
// source: minecraft-data/pc/1.21.8/protocol.json (sha256:930fbb4c69fd2ecadddcee3c38d3f02908adc23b54b707cb21112e7ab1e9dba1)
|
||||||
// version: (devel) (go1.26.4-X:nodwarf5)
|
// version: v0.6.3-0.20260723203259-d84618c116b8+dirty (go1.26.5-X:nodwarf5)
|
||||||
package v1_21_8
|
package v1_21_8
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -10166,7 +10166,10 @@ func (ret *PlayToClientPacket) Decode(r io.ReadSeeker) (err error) {
|
|||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBossBarTmp
|
ret.Params = PlayToClientPacketParamsBossBarTmp
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
var PlayToClientPacketParamsBundleDelimiterTmp struct {
|
var PlayToClientPacketParamsBundleDelimiterTmp PlayToClientPacketBundleDelimiter
|
||||||
|
err = PlayToClientPacketParamsBundleDelimiterTmp.Decode(r)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
||||||
case "camera":
|
case "camera":
|
||||||
@@ -11151,12 +11154,15 @@ func (ret *PlayToClientPacket) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
_, ok := ret.Params.(struct {
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketBundleDelimiter)
|
||||||
})
|
|
||||||
if !ok {
|
if !ok {
|
||||||
err = proto_base.BadTypeError
|
err = proto_base.BadTypeError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err = PlayToClientPacketParams.Encode(w)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
case "camera":
|
case "camera":
|
||||||
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -13339,6 +13345,16 @@ func (ret *PlayToClientPacketBossBar) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PlayToClientPacketBundleDelimiter struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Decode(r io.ReadSeeker) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Encode(w io.Writer) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type PlayToClientPacketCamera struct {
|
type PlayToClientPacketCamera struct {
|
||||||
CameraId int32
|
CameraId int32
|
||||||
}
|
}
|
||||||
@@ -22720,7 +22736,7 @@ type PlayToServerPacketChatCommandSigned struct {
|
|||||||
}
|
}
|
||||||
MessageCount int32
|
MessageCount int32
|
||||||
Acknowledged [3]byte
|
Acknowledged [3]byte
|
||||||
Checksum int8
|
Checksum uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ret *PlayToServerPacketChatCommandSigned) Decode(r io.ReadSeeker) (err error) {
|
func (ret *PlayToServerPacketChatCommandSigned) Decode(r io.ReadSeeker) (err error) {
|
||||||
@@ -22825,7 +22841,7 @@ type PlayToServerPacketChatMessage struct {
|
|||||||
Signature *[256]byte
|
Signature *[256]byte
|
||||||
Offset int32
|
Offset int32
|
||||||
Acknowledged [3]byte
|
Acknowledged [3]byte
|
||||||
Checksum int8
|
Checksum uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ret *PlayToServerPacketChatMessage) Decode(r io.ReadSeeker) (err error) {
|
func (ret *PlayToServerPacketChatMessage) Decode(r io.ReadSeeker) (err error) {
|
||||||
@@ -23775,7 +23791,7 @@ func (ret *PlayToServerPacketEditBook) Encode(w io.Writer) (err error) {
|
|||||||
|
|
||||||
type PlayToServerPacketEnchantItem struct {
|
type PlayToServerPacketEnchantItem struct {
|
||||||
WindowId ContainerID
|
WindowId ContainerID
|
||||||
Enchantment int8
|
Enchantment int32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
||||||
@@ -23783,7 +23799,7 @@ func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = binary.Read(r, binary.BigEndian, &ret.Enchantment)
|
ret.Enchantment, err = proto_base.DecodeVarInt(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -23794,7 +23810,7 @@ func (ret *PlayToServerPacketEnchantItem) Encode(w io.Writer) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = binary.Write(w, binary.BigEndian, ret.Enchantment)
|
err = proto_base.EncodeVarInt(w, ret.Enchantment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Code generated by strom. DO NOT EDIT.
|
// Code generated by strom. DO NOT EDIT.
|
||||||
// source: minecraft-data/pc/1.21.9/protocol.json (sha256:5c5c5947ac583745cb1ea9a8b2fa654f0356349f37fa0248ba2e44baf4e5c485)
|
// source: minecraft-data/pc/1.21.9/protocol.json (sha256:9861cee397931c678c3b1837dcdf82e3fc885442c6bd0e4a60522fbf26653e59)
|
||||||
// version: (devel) (go1.26.4-X:nodwarf5)
|
// version: v0.6.3-0.20260723203259-d84618c116b8+dirty (go1.26.5-X:nodwarf5)
|
||||||
package v1_21_9
|
package v1_21_9
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -11270,7 +11270,10 @@ func (ret *PlayToClientPacket) Decode(r io.ReadSeeker) (err error) {
|
|||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBossBarTmp
|
ret.Params = PlayToClientPacketParamsBossBarTmp
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
var PlayToClientPacketParamsBundleDelimiterTmp struct {
|
var PlayToClientPacketParamsBundleDelimiterTmp PlayToClientPacketBundleDelimiter
|
||||||
|
err = PlayToClientPacketParamsBundleDelimiterTmp.Decode(r)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
ret.Params = PlayToClientPacketParamsBundleDelimiterTmp
|
||||||
case "camera":
|
case "camera":
|
||||||
@@ -12290,12 +12293,15 @@ func (ret *PlayToClientPacket) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
case "bundle_delimiter":
|
case "bundle_delimiter":
|
||||||
_, ok := ret.Params.(struct {
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketBundleDelimiter)
|
||||||
})
|
|
||||||
if !ok {
|
if !ok {
|
||||||
err = proto_base.BadTypeError
|
err = proto_base.BadTypeError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err = PlayToClientPacketParams.Encode(w)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
case "camera":
|
case "camera":
|
||||||
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
PlayToClientPacketParams, ok := ret.Params.(PlayToClientPacketCamera)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -14528,6 +14534,16 @@ func (ret *PlayToClientPacketBossBar) Encode(w io.Writer) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PlayToClientPacketBundleDelimiter struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Decode(r io.ReadSeeker) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
func (ret *PlayToClientPacketBundleDelimiter) Encode(w io.Writer) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type PlayToClientPacketCamera struct {
|
type PlayToClientPacketCamera struct {
|
||||||
CameraId int32
|
CameraId int32
|
||||||
}
|
}
|
||||||
@@ -24089,7 +24105,7 @@ type PlayToServerPacketChatCommandSigned struct {
|
|||||||
}
|
}
|
||||||
MessageCount int32
|
MessageCount int32
|
||||||
Acknowledged [3]byte
|
Acknowledged [3]byte
|
||||||
Checksum int8
|
Checksum uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ret *PlayToServerPacketChatCommandSigned) Decode(r io.ReadSeeker) (err error) {
|
func (ret *PlayToServerPacketChatCommandSigned) Decode(r io.ReadSeeker) (err error) {
|
||||||
@@ -25175,7 +25191,7 @@ func (ret *PlayToServerPacketEditBook) Encode(w io.Writer) (err error) {
|
|||||||
|
|
||||||
type PlayToServerPacketEnchantItem struct {
|
type PlayToServerPacketEnchantItem struct {
|
||||||
WindowId ContainerID
|
WindowId ContainerID
|
||||||
Enchantment int8
|
Enchantment int32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
||||||
@@ -25183,7 +25199,7 @@ func (ret *PlayToServerPacketEnchantItem) Decode(r io.ReadSeeker) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = binary.Read(r, binary.BigEndian, &ret.Enchantment)
|
ret.Enchantment, err = proto_base.DecodeVarInt(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -25194,7 +25210,7 @@ func (ret *PlayToServerPacketEnchantItem) Encode(w io.Writer) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = binary.Write(w, binary.BigEndian, ret.Enchantment)
|
err = proto_base.EncodeVarInt(w, ret.Enchantment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user