13 Commits
Author SHA1 Message Date
adman 84b28d4c12 enforce MaxPacketSize constraint for raw and compressed packets 2026-07-28 16:37:45 +02:00
adman 30cfc507ba less pollution 2026-07-27 15:05:50 +02:00
adman d84618c116 update minecraft data to fix bundle delimiter 2026-07-23 22:32:59 +02:00
adman 5a55520126 migrate proto_generated to be runable from repo root 2026-07-23 22:26:23 +02:00
adman 8ac5e00c8e regenerate protocol 2026-07-23 22:23:22 +02:00
adman d46c678b89 make mincraft data sync scripts executable from anywhere 2026-07-23 22:20:53 +02:00
adman 0b714edcf5 Sync minecraft-data 2026-07-23 22:14:19 +02:00
adman 45151add64 Remove proto_base.Void 2026-07-23 22:11:29 +02:00
adman b90830881f Fix 26.2 login_success protocol handling and add convertibility tests
- Server sends v26_2 login_success with SessionId for protocol >= 776

- Client adds v26_2 login_success handler and scopes v1_21_8 handler to <= 26.1

- Fix WithOtherAccount guard in login server

- Add smart-convert assumption tests for login server/client

- Improve translatePacketVersion error messages
2026-07-23 17:00:13 +02:00
adman 94301a4a50 Add 26.2 protocol support to strom 2026-07-23 15:06:49 +02:00
adman aa5d15a4dc Regenerate 26.1 protocol with corrected play packet IDs (clientbound + serverbound) 2026-07-23 00:09:43 +02:00
adman d388e2c350 add 26.1 support, raw-capture subcommand, and local minecraft-data copy script 2026-07-22 23:22:14 +02:00
adman 126ff5bca0 improve packet replay things 2026-07-20 12:56:19 +02:00
71 changed files with 597925 additions and 339 deletions
+2
View File
@@ -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,
+1 -1
View File
@@ -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
+62 -25
View File
@@ -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, &timestamp) err = binary.Read(r, binary.BigEndian, &timestamp)
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++
+253
View File
@@ -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
}
+11 -1
View File
@@ -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,6 +122,14 @@ 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
} }
@@ -135,7 +144,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 {
+55
View File
@@ -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)
}
+27
View File
@@ -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
+2
View File
@@ -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
+122 -22
View File
@@ -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",
+7 -4
View File
@@ -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"
} }
] ]
], ],
+6 -3
View File
@@ -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
}
]
+652
View File
@@ -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
+242
View File
@@ -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
+442
View File
@@ -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
+465
View File
@@ -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
}
]
+652
View File
@@ -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
+242
View File
@@ -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
+442
View File
@@ -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
+465
View File
@@ -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"
] ]
+1 -1
View File
@@ -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")
} }
+4 -3
View File
@@ -166,13 +166,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
+19 -1
View File
@@ -20,6 +20,11 @@ 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
} }
func (c *RawConn) SetCompressionThreshold(threshold int32) { func (c *RawConn) SetCompressionThreshold(threshold int32) {
@@ -35,6 +40,10 @@ func (c *RawConn) GetCompressionThreshold() int32 {
} }
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 +54,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
@@ -86,6 +95,11 @@ func (c *RawConn) ReceiveRaw() (packetBytes []byte, err error) {
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 +115,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 {
+13
View File
@@ -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")
}
}
-9
View File
@@ -240,15 +240,6 @@ type EncodeDecodeAble interface {
Decode(r io.ReadSeeker) (err error) Decode(r io.ReadSeeker) (err error)
} }
type Void struct{}
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
File diff suppressed because one or more lines are too long
+21 -5
View File
@@ -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
} }
+26 -10
View File
@@ -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
} }
+25 -9
View File
@@ -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
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -33,7 +33,7 @@ func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err er
typeName := p.TName typeName := p.TName
var typeExpr ast.Expr var typeExpr ast.Expr
if p.PacketDef == "void" { if p.PacketDef == "void" {
typeExpr = Selector("proto_base", "Void") typeExpr = NewStruct()
} else { } else {
typeExpr = Selector(vUnderscore, typeName) typeExpr = Selector(vUnderscore, typeName)
} }
@@ -57,7 +57,7 @@ func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err er
} }
AppendDecl(f, VarValues("SupportedVersions", CompLit(Slice(Ident("string")), supportedVersionsExprs))) AppendDecl(f, VarValues("SupportedVersions", CompLit(Slice(Ident("string")), supportedVersionsExprs)))
AppendDecl(f, VarValues("Packets", CompLit(Slice(Selector("proto_base", "PacketInfo")), packetInfoExprs))) AppendDecl(f, VarValues("Packets", CompLit(Slice(Selector("proto_base", "PacketInfo")), packetInfoExprs)))
out, err := os.Create("proto_generated/packet_info.go") out, err := os.Create("mc/proto_generated/packet_info.go")
if err != nil { if err != nil {
return return
} }
+5 -5
View File
@@ -383,11 +383,11 @@ func Generate(version string, w io.Writer, sourceHash string) (packetInfos []Pac
func generateVersion(v string) (packetInfos []PacketInfo, err error) { func generateVersion(v string) (packetInfos []PacketInfo, err error) {
vUnderscore := strings.ReplaceAll(v, ".", "_") vUnderscore := strings.ReplaceAll(v, ".", "_")
err = os.MkdirAll("proto_generated/v"+vUnderscore, 0755) err = os.MkdirAll("mc/proto_generated/v"+vUnderscore, 0755)
if err != nil { if err != nil {
return return
} }
f, err := os.Create("proto_generated/v" + vUnderscore + "/proto.go") f, err := os.Create("mc/proto_generated/v" + vUnderscore + "/proto.go")
if err != nil { if err != nil {
return return
} }
@@ -408,11 +408,11 @@ func generateVersion(v string) (packetInfos []PacketInfo, err error) {
} }
func GenerateVersions(versions []string) (err error) { func GenerateVersions(versions []string) (err error) {
err = os.RemoveAll("proto_generated/") err = os.RemoveAll("mc/proto_generated/")
if err != nil { if err != nil {
return return
} }
err = os.MkdirAll("proto_generated/", 0755) err = os.MkdirAll("mc/proto_generated/", 0755)
if err != nil { if err != nil {
return return
} }
@@ -429,7 +429,7 @@ func GenerateVersions(versions []string) (err error) {
} }
func main() { func main() {
err := GenerateVersions([]string{"1.21.8", "1.21.9", "1.21.11"}) err := GenerateVersions([]string{"1.21.8", "1.21.9", "1.21.11", "26.1", "26.2"})
if err != nil { if err != nil {
panic(err) panic(err)
} }
+11 -3
View File
@@ -12,10 +12,12 @@ import (
api2 "github.com/admin-else/strom/mc/api" api2 "github.com/admin-else/strom/mc/api"
"github.com/admin-else/strom/mc/crypto" "github.com/admin-else/strom/mc/crypto"
"github.com/admin-else/strom/mc/data"
"github.com/admin-else/strom/mc/event" "github.com/admin-else/strom/mc/event"
"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/google/uuid" "github.com/google/uuid"
) )
@@ -183,11 +185,20 @@ func (l *LoginServer) FinishLogin() (err error) {
if l.Given == nil { if l.Given == nil {
l.Given = &l.Requested l.Given = &l.Requested
} }
if l.ProtocolVersion >= data.MustLookupProtocolVersion("26.2") {
err = l.Send(&v26_2.LoginToClientPacketSuccess{
Uuid: l.Given.UUID,
Username: l.Given.Name,
Properties: nil,
SessionId: uuid.New(),
})
} else {
err = l.Send(&v1_21_8.LoginToClientPacketSuccess{ err = l.Send(&v1_21_8.LoginToClientPacketSuccess{
Uuid: l.Given.UUID, Uuid: l.Given.UUID,
Username: l.Given.Name, Username: l.Given.Name,
Properties: nil, Properties: nil,
}) })
}
return return
} }
@@ -195,9 +206,6 @@ type LoginServerSetting func(*LoginServer)
func WithOtherAccount(a *api2.Account) LoginServerSetting { func WithOtherAccount(a *api2.Account) LoginServerSetting {
return func(s *LoginServer) { return func(s *LoginServer) {
if s.Given == nil {
return
}
s.Given = &NameAndUUID{ s.Given = &NameAndUUID{
Name: a.Name, Name: a.Name,
UUID: a.Uuid, UUID: a.Uuid,
+60
View File
@@ -0,0 +1,60 @@
package server_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 assertSendConvertible(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 assertReceiveConvertible(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 TestLoginServerSendAssumptions(t *testing.T) {
v26_1Version := data.MustLookupProtocolVersion("26.1")
// Packets sent by LoginServer as v1_21_8 must be convertible to every version
// they are actually sent to. login_success is excluded because it is not
// convertible across the 26.2 boundary; it has dedicated version-gated send code.
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.StatusToClientPacketServerInfo](), "server_info", proto_base.Status, proto_base.ToClient, v26_1Version)
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.StatusToClientPacketPing](), "ping", proto_base.Status, proto_base.ToClient, v26_1Version)
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketCompress](), "compress", proto_base.Login, proto_base.ToClient, v26_1Version)
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToClient, v26_1Version)
}
func TestLoginServerReceiveAssumptions(t *testing.T) {
v26_1Version := data.MustLookupProtocolVersion("26.1")
// Packets received by LoginServer via RegisterCriticalUntilLatest must be
// convertible from each later version back to v1_21_8.
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.HandshakingToServerPacketSetProtocol](), "set_protocol", proto_base.Handshaking, proto_base.ToServer, v26_1Version)
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.StatusToServerPacketPingStart](), "ping_start", proto_base.Status, proto_base.ToServer, v26_1Version)
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.StatusToServerPacketPing](), "ping", proto_base.Status, proto_base.ToServer, v26_1Version)
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginStart](), "login_start", proto_base.Login, proto_base.ToServer, v26_1Version)
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToServer, v26_1Version)
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginAcknowledged](), "login_acknowledged", proto_base.Login, proto_base.ToServer, v26_1Version)
}