Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab03b36b4f | ||
|
|
da0c3c6f14 | ||
|
|
b01e482bc5 | ||
|
|
c560966177 | ||
|
|
66f86c5599 | ||
|
|
5a2bfcb1c1 | ||
|
|
b34f8d68ff | ||
|
|
c98472165b | ||
|
|
4888a07ebb | ||
|
|
a9bf30a609 | ||
|
|
35030601e1 | ||
|
|
66f32b4cd2 | ||
|
|
e6d08dccbb | ||
|
|
8a4f203621 | ||
|
|
69e230a79c | ||
|
|
1a5f4f4f8e | ||
|
|
d0844dd6b5 | ||
|
|
d8e36aa6fa | ||
|
|
6781e4c16d | ||
|
|
fccba0248a | ||
|
|
52b3c1ce17 | ||
|
|
3511cd2699 | ||
|
|
6dddccab7f | ||
|
|
9109d77f98 | ||
|
|
9eec1e8370 | ||
|
|
96481da0a4 | ||
|
|
159437c1ca | ||
|
|
3d34ad59e9 | ||
|
|
4878c6cc7b | ||
|
|
719a3bacd8 | ||
|
|
ce0c58e7c5 | ||
|
|
8a4e44760e | ||
|
|
e810a60848 | ||
|
|
0981339028 | ||
|
|
7746dd8ee9 | ||
|
|
378b78312e | ||
|
|
bd3139754d | ||
|
|
841d91b91d | ||
|
|
895ec53698 | ||
|
|
f6001c8b22 | ||
|
|
d87c362270 | ||
|
|
236e414242 | ||
|
|
5222390b65 | ||
|
|
dc04fdc7d0 | ||
|
|
8de34dfda1 | ||
|
|
997594d7c3 | ||
|
|
c83a777eac | ||
|
|
65fea61667 | ||
|
|
c2777f2ca9 | ||
|
|
dcb42f1970 | ||
|
|
7a2081f0a0 | ||
|
|
acc583f694 | ||
|
|
76409d07a3 | ||
|
|
bb89730781 | ||
|
|
9f6b1f6bcf | ||
|
|
1b8a9677c6 | ||
|
|
79ab13ca4b | ||
|
|
3cc414185a | ||
|
|
fe4a17dce2 | ||
|
|
891551f9dd | ||
|
|
8fb48c6ea9 | ||
|
|
ec25c28061 | ||
|
|
45287f47d2 | ||
|
|
4cc4b6af5b | ||
|
|
09e6760d61 | ||
|
|
ca74a3c3d4 | ||
|
|
fbc3693219 | ||
|
|
fb69fd93ec | ||
|
|
a3a3c3714e | ||
|
|
9294631c6c | ||
|
|
293f0b1eed | ||
|
|
272dcb4d36 | ||
|
|
abb0fa4d37 | ||
|
|
e5212624af | ||
|
|
35772aca03 | ||
|
|
819d89b26e | ||
|
|
958102e43c | ||
|
|
f749d3bfc5 | ||
|
|
d207cf52cf | ||
|
|
420ec5611c | ||
|
|
4bfaf9b7c5 | ||
|
|
48beb861e8 | ||
|
|
9fd2f517d9 | ||
|
|
1b5af63b75 | ||
|
|
dfb847eb3e | ||
|
|
322bd77f7f | ||
|
|
aefe850281 | ||
|
|
57f88f2176 | ||
|
|
8dd566c0da | ||
|
|
e386a45d96 | ||
|
|
8f771166a6 | ||
|
|
5d6a1a25ea | ||
|
|
ca33185f20 | ||
|
|
e921e9e9d2 | ||
|
|
7337068d86 | ||
|
|
9983062522 | ||
|
|
4fd5324064 | ||
|
|
df0e5e354b | ||
|
|
23b5a5d9b7 | ||
|
|
46770ed980 | ||
|
|
6179c5f6b6 | ||
|
|
f758a10575 | ||
|
|
41d1ab4c45 | ||
|
|
032fa26927 | ||
|
|
f7401a287e | ||
|
|
2d1e8ef4f6 | ||
|
|
2802cc36ce | ||
|
|
ea024fe808 |
@@ -0,0 +1,2 @@
|
|||||||
|
**/*_test.go export-ignore
|
||||||
|
**/testdata export-ignore
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# This workflow will build a golang project
|
||||||
|
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
|
||||||
|
|
||||||
|
name: Go
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "master" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "master" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '1.25'
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: go build -v ./...
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: go test -v ./...
|
||||||
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
.devres/
|
.devres/
|
||||||
.idea/
|
.idea/
|
||||||
.failed_packets/
|
.failed_packets/
|
||||||
tools/.*/
|
tools/.*/
|
||||||
|
.vscode/
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[submodule "data/minecraft-data"]
|
|
||||||
path = data/minecraft-data
|
|
||||||
url = git@github.com:PrismarineJS/minecraft-data.git
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# STROM
|
||||||
|
|
||||||
|
# THIS IS WORK IN PROGRESS AND THE API WILL BREAK AS LONG AS THE THE PACKAGE VERSION IS v0.x.x
|
||||||
|
|
||||||
|
feel free to contact me on [discord](https://discord.gg/n2Vjc2vcMf)
|
||||||
+64
-37
@@ -9,32 +9,40 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/admin-else/strom/crypto"
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Servers struct {
|
||||||
|
ServicesHost string
|
||||||
|
SessionHost string
|
||||||
|
ProfilesHost string
|
||||||
|
}
|
||||||
|
|
||||||
|
var DefaultServers = &Servers{
|
||||||
|
ServicesHost: "https://api.minecraftservices.com",
|
||||||
|
SessionHost: "https://sessionserver.mojang.com",
|
||||||
|
ProfilesHost: "https://api.mojang.com",
|
||||||
|
}
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
|
*Servers
|
||||||
Name string
|
Name string
|
||||||
Uuid uuid.UUID
|
Uuid uuid.UUID
|
||||||
Ygg string
|
Ygg string
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
BaseUrlApi = "https://api.minecraftservices.com"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *Account) doMcApiRequest(method string, url string, from any, to any) (err error) {
|
func (a *Account) doMcApiRequest(method string, url string, from any, to any) (err error) {
|
||||||
var b []byte
|
var b []byte
|
||||||
if method != "GET" {
|
if method != "GET" {
|
||||||
b, err = json.Marshal(from)
|
b, err = json.Marshal(from)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := http.NewRequest(method, url, bytes.NewReader(b))
|
r, err := http.NewRequest(method, url, bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("Content-Type", "application/json")
|
r.Header.Set("Content-Type", "application/json")
|
||||||
@@ -44,21 +52,22 @@ func (a *Account) doMcApiRequest(method string, url string, from any, to any) (e
|
|||||||
|
|
||||||
resp, err := http.DefaultClient.Do(r)
|
resp, err := http.DefaultClient.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
if !(resp.StatusCode >= 200 && resp.StatusCode <= 299) {
|
if !(resp.StatusCode >= 200 && resp.StatusCode <= 299) {
|
||||||
return fmt.Errorf("bad status code %v", resp.StatusCode)
|
return fmt.Errorf("bad status code %v", resp.StatusCode)
|
||||||
}
|
}
|
||||||
b, err = io.ReadAll(resp.Body)
|
b, err = io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, to)
|
err = json.Unmarshal(b, to)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type PlayerKeys struct {
|
type PlayerKeys struct {
|
||||||
@@ -73,7 +82,7 @@ type PlayerKeys struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *Account) FetchKeys() (keys PlayerKeys, err error) {
|
func (a *Account) FetchKeys() (keys PlayerKeys, err error) {
|
||||||
err = a.doMcApiRequest("POST", BaseUrlApi+"/player/certificates", nil, &keys)
|
err = a.doMcApiRequest("POST", a.ServicesHost+"/player/certificates", nil, &keys)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,10 +99,12 @@ func (a *Account) JoinServer(serverId string) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
resp, err := http.Post("https://sessionserver.mojang.com/session/minecraft/join", "application/json", bytes.NewReader(body))
|
resp, err := http.Post(a.SessionHost+"/session/minecraft/join", "application/json", bytes.NewReader(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
if resp.StatusCode != 204 {
|
if resp.StatusCode != 204 {
|
||||||
body, err = io.ReadAll(resp.Body)
|
body, err = io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -112,17 +123,10 @@ type NameChangResp struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *Account) NameChangeInfo() (r NameChangResp, err error) {
|
func (a *Account) NameChangeInfo() (r NameChangResp, err error) {
|
||||||
err = a.doMcApiRequest("GET", "https://api.minecraftservices.com/minecraft/profile/namechange", nil, &r)
|
err = a.doMcApiRequest("GET", a.ServicesHost+"/minecraft/profile/namechange", nil, &r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOfflineAccount(name string) *Account {
|
|
||||||
return &Account{
|
|
||||||
Name: name,
|
|
||||||
Uuid: crypto.FromOfflinePlayer(name),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PlayerProfile represents the player's profile information
|
// PlayerProfile represents the player's profile information
|
||||||
type PlayerProfile struct {
|
type PlayerProfile struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
@@ -143,7 +147,7 @@ type PlayerProfile struct {
|
|||||||
|
|
||||||
// QueryProfile queries the player's profile
|
// QueryProfile queries the player's profile
|
||||||
func (a *Account) QueryProfile() (profile PlayerProfile, err error) {
|
func (a *Account) QueryProfile() (profile PlayerProfile, err error) {
|
||||||
err = a.doMcApiRequest("GET", BaseUrlApi+"/minecraft/profile", nil, &profile)
|
err = a.doMcApiRequest("GET", a.ServicesHost+"/minecraft/profile", nil, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +185,7 @@ type PlayerAttributes struct {
|
|||||||
|
|
||||||
// QueryAttributes queries the player's attributes
|
// QueryAttributes queries the player's attributes
|
||||||
func (a *Account) QueryAttributes() (attrs PlayerAttributes, err error) {
|
func (a *Account) QueryAttributes() (attrs PlayerAttributes, err error) {
|
||||||
err = a.doMcApiRequest("GET", BaseUrlApi+"/player/attributes", nil, &attrs)
|
err = a.doMcApiRequest("GET", a.ServicesHost+"/player/attributes", nil, &attrs)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +198,7 @@ type ModifyAttributesRequest struct {
|
|||||||
|
|
||||||
// ModifyAttributes modifies the player's attributes
|
// ModifyAttributes modifies the player's attributes
|
||||||
func (a *Account) ModifyAttributes(req ModifyAttributesRequest) (attrs PlayerAttributes, err error) {
|
func (a *Account) ModifyAttributes(req ModifyAttributesRequest) (attrs PlayerAttributes, err error) {
|
||||||
err = a.doMcApiRequest("POST", BaseUrlApi+"/player/attributes", req, &attrs)
|
err = a.doMcApiRequest("POST", a.ServicesHost+"/player/attributes", req, &attrs)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,24 +209,23 @@ type BlockedUsers struct {
|
|||||||
|
|
||||||
// GetBlocklist gets the list of blocked users
|
// GetBlocklist gets the list of blocked users
|
||||||
func (a *Account) GetBlocklist() (blocklist BlockedUsers, err error) {
|
func (a *Account) GetBlocklist() (blocklist BlockedUsers, err error) {
|
||||||
err = a.doMcApiRequest("GET", BaseUrlApi+"/privacy/blocklist", nil, &blocklist)
|
err = a.doMcApiRequest("GET", a.ServicesHost+"/privacy/blocklist", nil, &blocklist)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckNameAvailability checks if a name is available
|
|
||||||
type NameAvailability struct {
|
type NameAvailability struct {
|
||||||
Status string `json:"status"` // DUPLICATE, AVAILABLE, NOT_ALLOWED
|
Status string `json:"status"` // DUPLICATE, AVAILABLE, NOT_ALLOWED
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckNameAvailability checks if a name is available
|
// CheckNameAvailability checks if a name is available
|
||||||
func (a *Account) CheckNameAvailability(name string) (avail NameAvailability, err error) {
|
func (a *Account) CheckNameAvailability(name string) (avail NameAvailability, err error) {
|
||||||
err = a.doMcApiRequest("GET", BaseUrlApi+"/minecraft/profile/name/"+name+"/available", nil, &avail)
|
err = a.doMcApiRequest("GET", a.ServicesHost+"/minecraft/profile/name/"+name+"/available", nil, &avail)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ChangeName changes the player's name
|
// ChangeName changes the player's name
|
||||||
func (a *Account) ChangeName(newName string) (profile PlayerProfile, err error) {
|
func (a *Account) ChangeName(newName string) (profile PlayerProfile, err error) {
|
||||||
err = a.doMcApiRequest("PUT", BaseUrlApi+"/minecraft/profile/name/"+newName, nil, &profile)
|
err = a.doMcApiRequest("PUT", a.ServicesHost+"/minecraft/profile/name/"+newName, nil, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,19 +237,19 @@ type ChangeSkinRequest struct {
|
|||||||
|
|
||||||
// ChangeSkin changes the player's skin
|
// ChangeSkin changes the player's skin
|
||||||
func (a *Account) ChangeSkin(req ChangeSkinRequest) (profile PlayerProfile, err error) {
|
func (a *Account) ChangeSkin(req ChangeSkinRequest) (profile PlayerProfile, err error) {
|
||||||
err = a.doMcApiRequest("POST", BaseUrlApi+"/minecraft/profile/skins", req, &profile)
|
err = a.doMcApiRequest("POST", a.ServicesHost+"/minecraft/profile/skins", req, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetSkin resets the player's skin to default
|
// ResetSkin resets the player's skin to default
|
||||||
func (a *Account) ResetSkin() (profile PlayerProfile, err error) {
|
func (a *Account) ResetSkin() (profile PlayerProfile, err error) {
|
||||||
err = a.doMcApiRequest("DELETE", BaseUrlApi+"/minecraft/profile/skins/active", nil, &profile)
|
err = a.doMcApiRequest("DELETE", a.ServicesHost+"/minecraft/profile/skins/active", nil, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// HideCape hides the player's active cape
|
// HideCape hides the player's active cape
|
||||||
func (a *Account) HideCape() (profile PlayerProfile, err error) {
|
func (a *Account) HideCape() (profile PlayerProfile, err error) {
|
||||||
err = a.doMcApiRequest("DELETE", BaseUrlApi+"/minecraft/profile/capes/active", nil, &profile)
|
err = a.doMcApiRequest("DELETE", a.ServicesHost+"/minecraft/profile/capes/active", nil, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,29 +261,53 @@ type ShowCapeRequest struct {
|
|||||||
// ShowCape shows a specific cape
|
// ShowCape shows a specific cape
|
||||||
func (a *Account) ShowCape(capeID string) (profile PlayerProfile, err error) {
|
func (a *Account) ShowCape(capeID string) (profile PlayerProfile, err error) {
|
||||||
req := ShowCapeRequest{CapeID: capeID}
|
req := ShowCapeRequest{CapeID: capeID}
|
||||||
err = a.doMcApiRequest("PUT", BaseUrlApi+"/minecraft/profile/capes/active", req, &profile)
|
err = a.doMcApiRequest("PUT", a.ServicesHost+"/minecraft/profile/capes/active", req, &profile)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckGiftCodeValidity checks if a gift code is valid
|
// CheckGiftCodeValidity checks if a gift code is valid
|
||||||
func (a *Account) CheckGiftCodeValidity(giftCode string) (valid bool, err error) {
|
func (a *Account) CheckGiftCodeValidity(giftCode string) (valid bool, err error) {
|
||||||
url := BaseUrlApi + "/productvoucher/giftcode"
|
url := a.ServicesHost + "/productvoucher/" + giftCode
|
||||||
r, err := http.NewRequest("GET", url, nil)
|
r, err := http.NewRequest("GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Header.Set("Authorization", "Bearer "+a.Ygg)
|
r.Header.Set("Authorization", "Bearer "+a.Ygg)
|
||||||
|
|
||||||
resp, err := http.DefaultClient.Do(r)
|
resp, err := http.DefaultClient.Do(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
// Returns HTTP 200 or 204 if valid, 404 if invalid
|
// Returns HTTP 200 or 204 if valid, 404 if invalid
|
||||||
if resp.StatusCode == 200 || resp.StatusCode == 204 {
|
if resp.StatusCode == 200 || resp.StatusCode == 204 {
|
||||||
return true, nil
|
valid = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAccountFromYGG(ygg string) (a *Account, err error) {
|
||||||
|
a = &Account{
|
||||||
|
Ygg: ygg,
|
||||||
|
Servers: DefaultServers,
|
||||||
|
}
|
||||||
|
p, err := a.QueryProfile()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
a.Name = p.Name
|
||||||
|
a.Uuid, err = uuid.Parse(strings.ReplaceAll(p.ID, "-", ""))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAccount(name string, uuid uuid.UUID, ygg string) (a *Account) {
|
||||||
|
return &Account{
|
||||||
|
Name: name,
|
||||||
|
Uuid: uuid,
|
||||||
|
Ygg: ygg,
|
||||||
|
Servers: DefaultServers,
|
||||||
}
|
}
|
||||||
return false, nil
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import "github.com/admin-else/strom/crypto"
|
||||||
|
|
||||||
|
func NewOfflineAccount(name string) *Account {
|
||||||
|
return &Account{
|
||||||
|
Name: name,
|
||||||
|
Uuid: crypto.FromOfflinePlayer(name),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BlockedServers() (s []string, err error) {
|
||||||
|
resp, err := http.Get("https://sessionserver.mojang.com/blockedservers")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
d, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s = strings.Split(string(d), "\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProfileProperty struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Signature string `json:"signature,omitempty"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProfileResp struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Legacy bool `json:"legacy"`
|
||||||
|
Properties []ProfileProperty `json:"properties"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func HasJoined(name, server, ip string) (p ProfileResp, err error) {
|
||||||
|
url := "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + server
|
||||||
|
if ip != "" {
|
||||||
|
url += "&ip=" + ip
|
||||||
|
}
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
err = fmt.Errorf("bad status code %v", resp.StatusCode)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type MojangPublicKeysResp struct {
|
||||||
|
ProfilePropertyKeys []string `json:"profilePropertyKeys"`
|
||||||
|
PlayerCertificateKeys []string `json:"playerCertificateKeys"`
|
||||||
|
|
||||||
|
// AuthenticationKeys are undocumented by wiki.vg but they exist as of the time of writing so ill include them
|
||||||
|
AuthenticationKeys []string `json:"authenticationKeys"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func MojangPublicKeys() (keys MojangPublicKeysResp, err error) {
|
||||||
|
resp, err := http.Get("https://sessionserver.mojang.com/session/minecraft/profile/public_key_by_token")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&keys)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func Profile(id string, unsinged bool) (p ProfileResp, err error) {
|
||||||
|
url := "https://sessionserver.mojang.com/session/minecraft/profile/" + id
|
||||||
|
if !unsinged {
|
||||||
|
url += "?unsigned=false"
|
||||||
|
}
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type IdName struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NameToId(name string) (idName IdName, err error) {
|
||||||
|
// may also use these:
|
||||||
|
//https://api.mojang.com/users/profiles/minecraft/<player name>
|
||||||
|
//https://api.minecraftservices.com/minecraft/profile/lookup/name/<player name>
|
||||||
|
//https://api.mojang.com/minecraft/profile/lookup/name/<player name>
|
||||||
|
resp, err := http.Get("https://api.minecraftservices.com/minecraft/profile/lookup/name/" + name)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&idName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NameToIdBulk(names []string) (idNames []IdName, err error) {
|
||||||
|
b := bytes.NewBuffer(nil)
|
||||||
|
err = json.NewEncoder(b).Encode(names)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// may also use these:
|
||||||
|
//https://api.mojang.com/profiles/minecraft
|
||||||
|
//https://api.minecraftservices.com/minecraft/profile/lookup/bulk/byname
|
||||||
|
//https://api.mojang.com/minecraft/profile/lookup/bulk/byname
|
||||||
|
r, err := http.NewRequest("POST", "https://api.minecraftservices.com/minecraft/profile/lookup/bulk/byname", b)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r.Header.Set("Content-Type", "application/json")
|
||||||
|
resp, err := http.DefaultClient.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&idNames)
|
||||||
|
return
|
||||||
|
}
|
||||||
+8
-5
@@ -1,6 +1,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/admin-else/strom/proto"
|
"github.com/admin-else/strom/proto"
|
||||||
@@ -22,15 +23,17 @@ func Connect(addr string) (ret *proto.Conn, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ConnectVersionLess(addr string) (ret *proto.Conn, err error) {
|
||||||
|
return ConnectVersionLessCtx(context.Background(), addr)
|
||||||
|
}
|
||||||
|
|
||||||
// ConnectVersionLess connects to the given address without setting the version you should set it
|
// ConnectVersionLess connects to the given address without setting the version you should set it
|
||||||
// when using this function.
|
// when using this function.
|
||||||
// You must close the connection when you're done with it
|
// You must close the connection when you're done with it
|
||||||
func ConnectVersionLess(addr string) (ret *proto.Conn, err error) {
|
func ConnectVersionLessCtx(ctx context.Context, addr string) (ret *proto.Conn, err error) {
|
||||||
ret = &proto.Conn{}
|
ret = proto.NewConnCtx(ctx)
|
||||||
ret.SetState(proto_base.Handshaking)
|
|
||||||
ret.SetCompressionThreshold(-1)
|
|
||||||
ret.Actor = proto_base.Client
|
ret.Actor = proto_base.Client
|
||||||
ret.Conn, err = net.Dial("tcp", addr)
|
ret.Conn, err = (&net.Dialer{}).DialContext(ctx, "tcp", addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package client
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
|
||||||
|
|
||||||
"github.com/admin-else/strom/event"
|
"github.com/admin-else/strom/event"
|
||||||
"github.com/admin-else/strom/proto"
|
"github.com/admin-else/strom/proto"
|
||||||
@@ -19,8 +18,8 @@ func (c *ConfigIgnorer) OnStart() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConfigIgnorer) Default(event event.Anything) (err error) {
|
func (c *ConfigIgnorer) Default(e event.Anything) (err error) {
|
||||||
slog.Debug("Config ignorer", "packet", fmt.Sprintf("%#v", event))
|
c.Log.Debug("Config ignorer", "packet", fmt.Sprintf("%#v", e))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +55,7 @@ func IgnoreConfig(c *proto.Conn) (err error) {
|
|||||||
ci.RegisterUntilLatest(ci.OnPing)
|
ci.RegisterUntilLatest(ci.OnPing)
|
||||||
ci.RegisterUntilLatest(ci.OnKeepAlive)
|
ci.RegisterUntilLatest(ci.OnKeepAlive)
|
||||||
|
|
||||||
err = ci.Start()
|
err = ci.StartConn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.Join(err, errors.New("failed to ignore config"))
|
err = errors.Join(err, errors.New("failed to ignore config"))
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -106,7 +106,7 @@ func DoDnsSimple(in string) (out string, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
out = in
|
out = host + ":" + strconv.Itoa(int(portN))
|
||||||
if portN != 25565 {
|
if portN != 25565 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ func MakeHandshakePacket(c *proto.Conn, nextState proto_base.State) (p *v1_21_8.
|
|||||||
return MakeHandshakePacketAddr(c, nextState, c.RemoteAddr().String())
|
return MakeHandshakePacketAddr(c, nextState, c.RemoteAddr().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MakeHandshakePacketAddr gets a custom addr
|
||||||
func MakeHandshakePacketAddr(s *proto.Conn, nextState proto_base.State, addr string) (p *v1_21_8.HandshakingToServerPacketSetProtocol, err error) {
|
func MakeHandshakePacketAddr(s *proto.Conn, nextState proto_base.State, addr string) (p *v1_21_8.HandshakingToServerPacketSetProtocol, err error) {
|
||||||
p = &v1_21_8.HandshakingToServerPacketSetProtocol{NextState: int32(nextState), ProtocolVersion: s.ProtocolVersion}
|
p = &v1_21_8.HandshakingToServerPacketSetProtocol{NextState: int32(nextState), ProtocolVersion: s.ProtocolVersion}
|
||||||
var portStr string
|
var portStr string
|
||||||
|
|||||||
+23
-16
@@ -6,7 +6,6 @@ import (
|
|||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/admin-else/strom/api"
|
"github.com/admin-else/strom/api"
|
||||||
"github.com/admin-else/strom/crypto"
|
"github.com/admin-else/strom/crypto"
|
||||||
@@ -42,11 +41,10 @@ func (k KickedDuringLoginErr) Error() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *LoginClient) OnDefault(event event.Unhandled) (err error) {
|
func (s *LoginClient) OnDefault(event event.Unhandled) (err error) {
|
||||||
err = fmt.Errorf("unexpected event: %#v", event)
|
if _, ok := event.Val.(proto_base.EncodeDecodeAble); !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
s.Log.Warn("unexpected packet during login client", "packet", event.Val)
|
||||||
func (s *LoginClient) OnCycle(_ event.Tick) (err error) {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,18 +125,17 @@ func (s *LoginClient) OnStart() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Login(c *proto.Conn, account *api.Account) (err error) {
|
func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
|
||||||
lc := &LoginClient{
|
lc := &LoginClient{
|
||||||
Conn: c,
|
Conn: c,
|
||||||
Account: account,
|
Account: account,
|
||||||
}
|
}
|
||||||
lc.RegisterCritical(lc.OnDefault)
|
lc.RegisterCritical(lc.OnDefault)
|
||||||
lc.RegisterCritical(lc.OnCycle)
|
|
||||||
lc.RegisterCritical(lc.OnClose)
|
lc.RegisterCritical(lc.OnClose)
|
||||||
lc.RegisterUntilLatest(lc.OnCompress)
|
lc.RegisterCriticalUntilLatest(lc.OnCompress)
|
||||||
lc.RegisterUntilLatest(lc.OnEncrypt)
|
lc.RegisterCriticalUntilLatest(lc.OnEncrypt)
|
||||||
lc.RegisterUntilLatest(lc.OnDisconnect)
|
lc.RegisterCriticalUntilLatest(lc.OnDisconnect)
|
||||||
lc.RegisterUntilLatest(lc.OnSuccess)
|
lc.RegisterCriticalUntilLatest(lc.OnSuccess)
|
||||||
|
|
||||||
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
|
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -152,21 +149,31 @@ func Login(c *proto.Conn, account *api.Account) (err error) {
|
|||||||
lc.SetState(proto_base.Login)
|
lc.SetState(proto_base.Login)
|
||||||
err = lc.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: lc.Account.Name, PlayerUUID: lc.Account.Uuid})
|
err = lc.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: lc.Account.Name, PlayerUUID: lc.Account.Uuid})
|
||||||
|
|
||||||
err = lc.Start()
|
err = lc.StartConn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.Join(FailedToLoginErr, err)
|
err = errors.Join(FailedToLoginErr, err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err error) {
|
func LoginNoSrv(connectTo string, account *api.Account) (c *proto.Conn, err error) {
|
||||||
c, err = Connect(connectTo)
|
c, err = Connect(connectTo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = Login(c, account)
|
err = LoginRaw(c, account)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func Login(connectTo string, account *api.Account) (c *proto.Conn, err error) {
|
||||||
|
connectTo, err = DoDnsSimple(connectTo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.Join(FailedToLoginErr, err)
|
return
|
||||||
}
|
}
|
||||||
|
c, err = Connect(connectTo)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = LoginRaw(c, account)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-11
@@ -1,6 +1,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -19,10 +20,6 @@ type StatusClient struct {
|
|||||||
DoPingRoundTripTime bool
|
DoPingRoundTripTime bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StatusClient) OnStart() (err error) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) {
|
func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) {
|
||||||
s.Status = p.Response
|
s.Status = p.Response
|
||||||
s.PingSendTime = time.Now()
|
s.PingSendTime = time.Now()
|
||||||
@@ -41,8 +38,9 @@ func (s *StatusClient) OnPong(p *v1_21_8.StatusToClientPacketPing) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StatusRaw returns a StatusClient that is not connected to a server.
|
// StatusRaw returns a StatusClient that is not connected to a server.
|
||||||
// So ignore the resource leak warning. And maybe attach a warn ignore comment
|
// So ignore the resource leak warning. And maybe attach a warn ignore comment.
|
||||||
func StatusRaw(addr string) (s *StatusClient, err error) {
|
// It does not resolve SRV records.
|
||||||
|
func StatusRaw(ctx context.Context, addr string) (s *StatusClient, err error) {
|
||||||
c, err := ConnectVersionLess(addr)
|
c, err := ConnectVersionLess(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -55,9 +53,8 @@ func StatusRaw(addr string) (s *StatusClient, err error) {
|
|||||||
s = &StatusClient{
|
s = &StatusClient{
|
||||||
Conn: c,
|
Conn: c,
|
||||||
}
|
}
|
||||||
s.Loop = event.NewLoop()
|
s.RegisterCriticalUntilLatest(s.OnStatus)
|
||||||
s.RegisterUntilLatest(s.OnStatus)
|
s.RegisterCriticalUntilLatest(s.OnPong)
|
||||||
s.RegisterUntilLatest(s.OnPong)
|
|
||||||
|
|
||||||
p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
|
p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -74,11 +71,21 @@ func StatusRaw(addr string) (s *StatusClient, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Status(addr string) (status server.StatusResponse, err error) {
|
// StatusNoDns is like Status but does not resolve SRV records.
|
||||||
s, err := StatusRaw(addr)
|
func StatusNoDns(addr string) (status server.StatusResponse, err error) {
|
||||||
|
s, err := StatusRaw(context.Background(), addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = json.Unmarshal([]byte(s.Status), &status)
|
err = json.Unmarshal([]byte(s.Status), &status)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Status resolves the status of the minecraft server at the given address.
|
||||||
|
func Status(addr string) (status server.StatusResponse, err error) {
|
||||||
|
addr, err = DoDnsSimple(addr)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return StatusNoDns(addr)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cmd = flag.NewFlagSet("api", flag.ContinueOnError)
|
||||||
|
var tokenFlag = cmd.String("token", os.Getenv("MC_TOKEN"), "token to use")
|
||||||
|
|
||||||
|
var renameFlag = cmd.String("rename", "", "rename the player")
|
||||||
|
|
||||||
|
var uuidFlag = cmd.String("uuid", "", "get data about player with uuid")
|
||||||
|
var nameFlag = cmd.String("name", "", "get data about player with name")
|
||||||
|
var unsignedFlag = cmd.Bool("unsigned", true, "use unsigned mode for properties signatures")
|
||||||
|
|
||||||
|
var PleaseProvideArgumentErr = errors.New("please provide an argument")
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
a := &api.Account{}
|
||||||
|
if *tokenFlag != "" {
|
||||||
|
a, err = api.NewAccountFromYGG(*tokenFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var data any
|
||||||
|
if *renameFlag != "" {
|
||||||
|
data, err = a.ChangeName(*renameFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if *uuidFlag != "" || *nameFlag != "" {
|
||||||
|
if *nameFlag != "" {
|
||||||
|
var idName api.IdName
|
||||||
|
idName, err = api.NameToId(*nameFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
*uuidFlag = idName.Id
|
||||||
|
}
|
||||||
|
data, err = api.Profile(*uuidFlag, *unsignedFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = PleaseProvideArgumentErr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = json.NewEncoder(os.Stdout).Encode(data)
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package extract_mca
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/level/anvil"
|
||||||
|
"github.com/admin-else/strom/nbt"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
cmd = flag.NewFlagSet("print-nbt", flag.ContinueOnError)
|
||||||
|
FileFlag = cmd.String("file", "", "The MCA file to extract")
|
||||||
|
IndexXFlag = cmd.Int("x", 0, "The x chunk coordinate")
|
||||||
|
IndexZFlag = cmd.Int("z", 0, "The z chunk coordinate")
|
||||||
|
ToFlag = cmd.String("to", "mca-chunk.nbt", "The output file")
|
||||||
|
)
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if *FileFlag == "" {
|
||||||
|
return fmt.Errorf("no file specified")
|
||||||
|
}
|
||||||
|
f, err := os.Open(*FileFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
mca, err := anvil.ReadChunkHeader(f)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t, err := mca.TimeAt(f, int32(*IndexXFlag), int32(*IndexZFlag))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
slog.Info("Chunk last written", "time", t)
|
||||||
|
n, err := mca.ChunkAt(f, int32(*IndexXFlag), int32(*IndexZFlag))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = nbt.WriteUnstructuredFilePath(*ToFlag, n)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"debug/buildinfo"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"maps"
|
||||||
|
"os"
|
||||||
|
"slices"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/cmd/strom/api"
|
||||||
|
"github.com/admin-else/strom/cmd/strom/extract_mca"
|
||||||
|
"github.com/admin-else/strom/cmd/strom/offline_uuid"
|
||||||
|
"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/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ExpectedASubcommandErr = errors.New("expected a subcommand")
|
||||||
|
var UnknownSubcommandErr = errors.New("unknown subcommand try 'strom help' for a list of subcommands")
|
||||||
|
|
||||||
|
func Version(args []string) (err error) {
|
||||||
|
selfPath, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
info, err := buildinfo.ReadFile(selfPath)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("strom cli ", info.Main.Version, " (", info.Main.Sum, ")")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var subcommands = map[string]func(args []string) error{
|
||||||
|
"offline-uuid": offline_uuid.Run,
|
||||||
|
"print-nbt": print_nbt.Run,
|
||||||
|
"status": status.Run,
|
||||||
|
"packet-spy": packet_inspector.Run,
|
||||||
|
"api": api.Run,
|
||||||
|
"version": Version,
|
||||||
|
"extract-mca": extract_mca.Run,
|
||||||
|
}
|
||||||
|
|
||||||
|
func Help(args []string) (err error) {
|
||||||
|
subcommandNames := slices.Collect(maps.Keys(subcommands))
|
||||||
|
slices.Sort(subcommandNames)
|
||||||
|
fmt.Println("Available subcommands", subcommandNames)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mainE() (err error) {
|
||||||
|
subcommands["help"] = Help // this is here because if it isn't tools/cli/main.go:17:5: initialization cycle for subcommands
|
||||||
|
// tools/cli/main.go:17:5: subcommands refers to Help
|
||||||
|
// tools/cli/main.go:22:6: Help refers to subcommands
|
||||||
|
args := os.Args
|
||||||
|
|
||||||
|
// Debug stuff
|
||||||
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
||||||
|
//args = []string{"TEST", "version"}
|
||||||
|
|
||||||
|
if len(args) < 2 {
|
||||||
|
err = ExpectedASubcommandErr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f, ok := subcommands[args[1]]
|
||||||
|
if !ok {
|
||||||
|
err = UnknownSubcommandErr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = f(args[2:])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := mainE()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("exiting", "err", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
package packet_inspector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/api"
|
||||||
|
"github.com/admin-else/strom/client"
|
||||||
|
"github.com/admin-else/strom/event"
|
||||||
|
"github.com/admin-else/strom/nbt"
|
||||||
|
"github.com/admin-else/strom/proto"
|
||||||
|
"github.com/admin-else/strom/proto_base"
|
||||||
|
"github.com/admin-else/strom/proto_generated/v1_21_11"
|
||||||
|
"github.com/admin-else/strom/server"
|
||||||
|
"github.com/admin-else/strom/text"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Cmd = flag.NewFlagSet("packet-inspector", flag.ContinueOnError)
|
||||||
|
|
||||||
|
var OfflineNameFlag = Cmd.String("name", "packet_inspector", "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")
|
||||||
|
|
||||||
|
type Proxy struct {
|
||||||
|
Client, Servee *proto.Conn
|
||||||
|
Data nbt.Tag
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) Start() (err error) {
|
||||||
|
p.Client.RegisterCritical(p.OnAnything)
|
||||||
|
p.Servee.RegisterCritical(p.OnAnything)
|
||||||
|
|
||||||
|
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) OnAnything(e event.Anything) (err error) {
|
||||||
|
packet, ok := e.Val.(proto_base.EncodeDecodeAble)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
packetInfo, ok := proto.LookupPacketInfoByType(packet)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch packetInfo.Direction {
|
||||||
|
case proto_base.ToServer:
|
||||||
|
err = p.Client.Send(packet)
|
||||||
|
case proto_base.ToClient:
|
||||||
|
err = p.Servee.Send(packet)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Proxy) OnFinishConfiguration(packet *v1_21_11.ConfigurationToServerPacketFinishConfiguration) (err error) {
|
||||||
|
err = p.Client.Send(packet)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Servee.SetState(proto_base.Play)
|
||||||
|
p.Client.SetState(proto_base.Play)
|
||||||
|
err = event.DontForwardErr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var StatusResponse = server.StatusResponse{
|
||||||
|
Version: server.StatusResponseVersion{
|
||||||
|
Name: text.Pretty("STROM"),
|
||||||
|
Protocol: 772,
|
||||||
|
},
|
||||||
|
Players: server.StatusResponsePlayers{},
|
||||||
|
Description: text.Pretty("Packet spy forwards to " + *TargetAddr),
|
||||||
|
Favicon: "",
|
||||||
|
EnforcesSecureChat: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = Cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
||||||
|
slog.Info("Starting packet inspector", "listen", *ListenAddr)
|
||||||
|
err = server.StartServerWithOnConn(*ListenAddr, func(serveeConn *proto.Conn) (err error) {
|
||||||
|
serveeConn.DebugPrintPackets = []string{""}
|
||||||
|
p := &Proxy{Servee: serveeConn, Client: nil}
|
||||||
|
var 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())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
*TargetAddr, err = client.DoDnsSimple(*TargetAddr)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c, err := client.Connect(*TargetAddr)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.DebugPrintPackets = []string{""}
|
||||||
|
err = client.LoginRaw(c, acc)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
p.Client = c
|
||||||
|
err = p.Start()
|
||||||
|
return
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package print_nbt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/nbt"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
cmd = flag.NewFlagSet("print-nbt", flag.ContinueOnError)
|
||||||
|
FileFlag = cmd.String("file", "", "The NBT file to print")
|
||||||
|
HashFormatFlag = cmd.Bool("snbt", false, "will print with go %#v")
|
||||||
|
)
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if *FileFlag == "" {
|
||||||
|
return fmt.Errorf("no file specified")
|
||||||
|
}
|
||||||
|
f, err := os.Open(*FileFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
n, err := nbt.ReadUnstructuredFile(f)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var b []byte
|
||||||
|
if *HashFormatFlag {
|
||||||
|
bb := bytes.NewBuffer(nil)
|
||||||
|
err = nbt.PrintSNBTAny(n.Value, bb)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b = bb.Bytes()
|
||||||
|
//b = []byte(strings.ReplaceAll(string(b), ",", ",\n"))
|
||||||
|
} else {
|
||||||
|
b, err = json.MarshalIndent(n, "", " ")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = os.Stdout.Write(b)
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package status
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/client"
|
||||||
|
"github.com/admin-else/strom/event"
|
||||||
|
"github.com/admin-else/strom/proto"
|
||||||
|
"github.com/admin-else/strom/proto_base"
|
||||||
|
"github.com/admin-else/strom/proto_generated/v1_21_8"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cmd = flag.NewFlagSet("status", flag.ContinueOnError)
|
||||||
|
var addrFlag = cmd.String("addr", "localhost:25565", "address to connect to")
|
||||||
|
var srvFlag = cmd.Bool("srv", false, "use SRV records to resolve the address")
|
||||||
|
var versionFlag = cmd.String("version", "1.21.8", "version to use")
|
||||||
|
|
||||||
|
type StatusClient struct {
|
||||||
|
*proto.Conn
|
||||||
|
Status string
|
||||||
|
PingSendTime, PingReceiveTime time.Time
|
||||||
|
DoPingRoundTripTime bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) {
|
||||||
|
s.Status = p.Response
|
||||||
|
s.PingSendTime = time.Now()
|
||||||
|
if s.DoPingRoundTripTime {
|
||||||
|
err = s.Send(&v1_21_8.StatusToServerPacketPing{Time: s.PingSendTime.UnixMilli()})
|
||||||
|
} else {
|
||||||
|
err = event.HandlerDoneErr{}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StatusClient) OnPong(p *v1_21_8.StatusToClientPacketPing) (err error) {
|
||||||
|
s.PingReceiveTime = time.Now()
|
||||||
|
err = event.HandlerDoneErr{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatusRaw returns a StatusClient that is not connected to a server.
|
||||||
|
// So ignore the resource leak warning. And maybe attach a warn ignore comment.
|
||||||
|
// It does not resolve SRV records.
|
||||||
|
func StatusRaw(addr string) (s *StatusClient, err error) {
|
||||||
|
c, err := client.ConnectVersionLess(addr)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
err = c.SetVersion(*versionFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s = &StatusClient{
|
||||||
|
Conn: c,
|
||||||
|
}
|
||||||
|
s.RegisterCriticalUntilLatest(s.OnStatus)
|
||||||
|
s.RegisterCriticalUntilLatest(s.OnPong)
|
||||||
|
|
||||||
|
p, err := client.MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = s.Send(p)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.SetState(proto_base.Status)
|
||||||
|
err = s.Send(&v1_21_8.StatusToServerPacketPingStart{})
|
||||||
|
|
||||||
|
err = s.StartConn()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run(args []string) (err error) {
|
||||||
|
err = cmd.Parse(args)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if *srvFlag {
|
||||||
|
*addrFlag, err = client.DoDnsSimple(*addrFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slog.Debug("resolved address to ", "addr", *addrFlag)
|
||||||
|
|
||||||
|
status, err := StatusRaw(*addrFlag)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(status.Status)
|
||||||
|
return
|
||||||
|
}
|
||||||
+21
-6
@@ -1,5 +1,7 @@
|
|||||||
package data
|
package data
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
// [
|
// [
|
||||||
//
|
//
|
||||||
// {
|
// {
|
||||||
@@ -14,7 +16,7 @@ package data
|
|||||||
// },
|
// },
|
||||||
|
|
||||||
type Biome struct {
|
type Biome struct {
|
||||||
Id int
|
Id int32
|
||||||
Name string
|
Name string
|
||||||
Category string
|
Category string
|
||||||
Temperature float64
|
Temperature float64
|
||||||
@@ -24,22 +26,35 @@ type Biome struct {
|
|||||||
Color int
|
Color int
|
||||||
}
|
}
|
||||||
|
|
||||||
var BiomesCache = make(map[string][]Biome)
|
var BiomesCache = make(map[string][]*Biome)
|
||||||
|
|
||||||
func BiomesForVersion(v string) (ret []Biome) {
|
func BiomesForVersion(v string) (ret []*Biome) {
|
||||||
var ok bool
|
var ok bool
|
||||||
if ret, ok = BiomesCache[v]; ok {
|
if ret, ok = BiomesCache[v]; ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var b []Biome
|
var b []*Biome
|
||||||
must(LoadVersionedJson(v, "biomes", &b))
|
must(LoadVersionedJson(v, "biomes", &b))
|
||||||
BiomesCache[v] = b
|
BiomesCache[v] = b
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func LookupBiomeById(version string, id int32) (biome Biome, ok bool) {
|
func LookupBiomeById(version string, id int32) (biome *Biome, ok bool) {
|
||||||
for _, b := range BiomesForVersion(version) {
|
for _, b := range BiomesForVersion(version) {
|
||||||
if b.Id == int(id) {
|
if b.Id == id {
|
||||||
|
biome = b
|
||||||
|
ok = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var UnknownBiomeNameErr = errors.New("unknown biome Name")
|
||||||
|
|
||||||
|
func LookupBiomeByName(version string, name string) (biome *Biome, ok bool) {
|
||||||
|
for _, b := range BiomesForVersion(version) {
|
||||||
|
if b.Name == name {
|
||||||
biome = b
|
biome = b
|
||||||
ok = true
|
ok = true
|
||||||
return
|
return
|
||||||
|
|||||||
+55
-37
@@ -2,6 +2,7 @@ package data
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// {
|
// {
|
||||||
@@ -52,6 +53,7 @@ type BlockState struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var BlocksCache = make(map[string][]*Block)
|
var BlocksCache = make(map[string][]*Block)
|
||||||
|
var BlocksCacheIdMap = make(map[string]map[int32]*Block)
|
||||||
|
|
||||||
func BlocksForVersion(v string) (ret []*Block) {
|
func BlocksForVersion(v string) (ret []*Block) {
|
||||||
var ok bool
|
var ok bool
|
||||||
@@ -65,23 +67,44 @@ func BlocksForVersion(v string) (ret []*Block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool) {
|
func LookupBlockByStateId(version string, stateId int32) (block *Block, ok bool) {
|
||||||
|
idmap, found := BlocksCacheIdMap[version]
|
||||||
|
if !found {
|
||||||
|
idmap = make(map[int32]*Block)
|
||||||
|
for _, b := range BlocksForVersion(version) {
|
||||||
|
for i := range b.MaxStateId - b.MinStateId + 1 {
|
||||||
|
idmap[b.MinStateId+i] = b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BlocksCacheIdMap[version] = idmap
|
||||||
|
}
|
||||||
|
block, ok = idmap[stateId]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var UnknownBlockNameErr = errors.New("unknown block Name")
|
||||||
|
|
||||||
|
func LookupBlockByName(version string, name string) (block *Block, ok bool) {
|
||||||
for _, b := range BlocksForVersion(version) {
|
for _, b := range BlocksForVersion(version) {
|
||||||
if b.MinStateId <= stateId && stateId <= b.MaxStateId {
|
if b.Name == name {
|
||||||
block = b
|
block = b
|
||||||
ok = true
|
ok = true
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func LookupBlockByName(version string, stateId int32) (block *Block, ok bool) {
|
func StateIdFromBlocKAndStateMap(version string, name string, stateMap map[string]string) (stateId int32, err error) {
|
||||||
for _, b := range BlocksForVersion(version) {
|
b, ok := LookupBlockByName(version, name)
|
||||||
if b.MinStateId <= stateId && stateId <= b.MaxStateId {
|
if !ok {
|
||||||
block = b
|
err = BlockNotFoundErr
|
||||||
ok = true
|
return
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if stateMap == nil {
|
||||||
|
stateId = b.DefaultState
|
||||||
|
} else {
|
||||||
|
stateId, err = b.IdFromStateMap(stateMap)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +115,7 @@ var BadBlockStateTypeErr = errors.New("bad block state type")
|
|||||||
var BadEnumErr = errors.New("bad enum")
|
var BadEnumErr = errors.New("bad enum")
|
||||||
var SupplyAllStatesErr = errors.New("supply all states")
|
var SupplyAllStatesErr = errors.New("supply all states")
|
||||||
|
|
||||||
func FromBlockState(version string, stateId int32) (b *Block, stateData map[string]any, err error) {
|
func FromBlockState(version string, stateId int32) (b *Block, stateData map[string]string, err error) {
|
||||||
b, ok := LookupBlockByStateId(version, stateId)
|
b, ok := LookupBlockByStateId(version, stateId)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = BlockNotFoundErr
|
err = BlockNotFoundErr
|
||||||
@@ -101,19 +124,17 @@ func FromBlockState(version string, stateId int32) (b *Block, stateData map[stri
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: mc stores these as strings so we will do the same
|
func mcDataBlockStateTypeParse(n int32, s *BlockState) (v string, err error) {
|
||||||
|
|
||||||
func mcDataBlockStateTypeParse(n int32, s *BlockState) (v any, err error) {
|
|
||||||
switch s.Type {
|
switch s.Type {
|
||||||
case "int":
|
case "int":
|
||||||
v = n
|
v = strconv.Itoa(int(n))
|
||||||
case "enum":
|
case "enum":
|
||||||
v = s.Values[n]
|
v = s.Values[n]
|
||||||
case "bool":
|
case "bool":
|
||||||
if n == 0 { // MOJANK: 0 is true, 1 is false
|
if n == 0 { // MOJANK: 0 is true, 1 is false
|
||||||
v = true
|
v = "true"
|
||||||
} else if n == 1 {
|
} else if n == 1 {
|
||||||
v = false
|
v = "false"
|
||||||
} else {
|
} else {
|
||||||
err = InvalidBoolValueErr
|
err = InvalidBoolValueErr
|
||||||
}
|
}
|
||||||
@@ -123,35 +144,32 @@ func mcDataBlockStateTypeParse(n int32, s *BlockState) (v any, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func mcDataBlockStateTypeSerialize(v any, s *BlockState) (n int32, err error) {
|
func mcDataBlockStateTypeSerialize(v string, s *BlockState) (n int32, err error) {
|
||||||
switch t := v.(type) {
|
if v == "true" {
|
||||||
case int32:
|
return 0, nil
|
||||||
n = t
|
|
||||||
case bool:
|
|
||||||
if t {
|
|
||||||
n = 0
|
|
||||||
} else {
|
|
||||||
n = 1
|
|
||||||
}
|
|
||||||
case string:
|
|
||||||
for i, enumValue := range s.Values {
|
|
||||||
if enumValue == t {
|
|
||||||
return int32(i), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = BadEnumErr
|
|
||||||
default:
|
|
||||||
err = BadBlockStateTypeErr
|
|
||||||
}
|
}
|
||||||
|
if v == "false" {
|
||||||
|
return 1, nil
|
||||||
|
}
|
||||||
|
n1, errMabye := strconv.Atoi(v)
|
||||||
|
if errMabye == nil {
|
||||||
|
return int32(n1), nil
|
||||||
|
}
|
||||||
|
for i, enumValue := range s.Values {
|
||||||
|
if enumValue == v {
|
||||||
|
return int32(i), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = BadEnumErr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Block) StateMapFromId(stateId int32) (ret map[string]any, err error) {
|
func (b *Block) StateMapFromId(stateId int32) (ret map[string]string, err error) {
|
||||||
if stateId < b.MinStateId || stateId > b.MaxStateId {
|
if stateId < b.MinStateId || stateId > b.MaxStateId {
|
||||||
err = BlockStateOutOfRangeErr
|
err = BlockStateOutOfRangeErr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ret = make(map[string]any)
|
ret = make(map[string]string)
|
||||||
stateId -= b.MinStateId
|
stateId -= b.MinStateId
|
||||||
|
|
||||||
a := int32(1)
|
a := int32(1)
|
||||||
@@ -166,7 +184,7 @@ func (b *Block) StateMapFromId(stateId int32) (ret map[string]any, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Block) IdFromStateMap(m map[string]any) (ret int32, err error) {
|
func (b *Block) IdFromStateMap(m map[string]string) (ret int32, err error) {
|
||||||
a := int32(1)
|
a := int32(1)
|
||||||
for i := range len(b.States) {
|
for i := range len(b.States) {
|
||||||
s := b.States[len(b.States)-1-i]
|
s := b.States[len(b.States)-1-i]
|
||||||
|
|||||||
+7
-3
@@ -4,9 +4,12 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed minecraft-data/data
|
//go:generate ./download_minecraft_data.sh
|
||||||
|
|
||||||
|
//go:embed minecraft-data/pc minecraft-data/dataPaths.json
|
||||||
var MinecraftData embed.FS
|
var MinecraftData embed.FS
|
||||||
|
|
||||||
func LoadJson(path string, data any) (err error) {
|
func LoadJson(path string, data any) (err error) {
|
||||||
@@ -19,9 +22,10 @@ func LoadJson(path string, data any) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func LoadVersionedJson(version, dataName string, data any) (err error) {
|
func LoadVersionedJson(version, dataName string, data any) (err error) {
|
||||||
b, err := MinecraftData.ReadFile("minecraft-data/data/" + Paths.Data[version][dataName] + "/" + dataName + ".json")
|
b, err := MinecraftData.ReadFile("minecraft-data/" + Paths.Data[version][dataName] + "/" + dataName + ".json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
// If you get this error, you need to probably need to update the download script
|
||||||
|
return fmt.Errorf("minecraft-data/%s/%s/%s.json: %w", version, Paths.Data[version][dataName], dataName, err)
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, data)
|
err = json.Unmarshal(b, data)
|
||||||
return
|
return
|
||||||
|
|||||||
+1
-1
@@ -9,5 +9,5 @@ var Paths struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
must(LoadJson("minecraft-data/data/dataPaths.json", &Paths))
|
must(LoadJson("minecraft-data/dataPaths.json", &Paths))
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+25
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/sh
|
||||||
|
set -xeuo pipefail
|
||||||
|
|
||||||
|
# Go get / install does not clone git submodules so we have to do it like this
|
||||||
|
|
||||||
|
rm -rf minecraft-data/
|
||||||
|
git clone --depth 1 git@github.com:PrismarineJS/minecraft-data.git
|
||||||
|
mv minecraft-data minecraft-data-untrimmed
|
||||||
|
|
||||||
|
mkdir minecraft-data
|
||||||
|
mkdir minecraft-data/pc
|
||||||
|
|
||||||
|
mv minecraft-data-untrimmed/data/dataPaths.json minecraft-data
|
||||||
|
|
||||||
|
copy-mc() {
|
||||||
|
mv minecraft-data-untrimmed/data/pc/$1 minecraft-data/pc
|
||||||
|
}
|
||||||
|
|
||||||
|
copy-mc common
|
||||||
|
|
||||||
|
copy-mc 1.21.8
|
||||||
|
copy-mc 1.21.9
|
||||||
|
copy-mc 1.21.11
|
||||||
|
|
||||||
|
rm -rf minecraft-data-untrimmed
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package data
|
package data
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
// {
|
// {
|
||||||
// "id": 2,
|
// "id": 2,
|
||||||
// "name": "granite",
|
// "name": "granite",
|
||||||
@@ -15,15 +17,21 @@ type Item struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var ItemsCache = make(map[string][]*Item)
|
var ItemsCache = make(map[string][]*Item)
|
||||||
|
var ItemsCacheMutex = &sync.RWMutex{}
|
||||||
|
|
||||||
func ItemsForVersion(v string) (ret []*Item) {
|
func ItemsForVersion(v string) (ret []*Item) {
|
||||||
var ok bool
|
var ok bool
|
||||||
|
ItemsCacheMutex.RLock()
|
||||||
if ret, ok = ItemsCache[v]; ok {
|
if ret, ok = ItemsCache[v]; ok {
|
||||||
|
ItemsCacheMutex.RUnlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
ItemsCacheMutex.RUnlock()
|
||||||
var b []*Item
|
var b []*Item
|
||||||
must(LoadVersionedJson(v, "items", &b))
|
must(LoadVersionedJson(v, "items", &b))
|
||||||
|
ItemsCacheMutex.Lock()
|
||||||
ItemsCache[v] = b
|
ItemsCache[v] = b
|
||||||
|
ItemsCacheMutex.Unlock()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Submodule data/minecraft-data deleted from 3e12d39f67
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,247 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "armor",
|
||||||
|
"resource": "minecraft:armor",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 30.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armorToughness",
|
||||||
|
"resource": "minecraft:armor_toughness",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackDamage",
|
||||||
|
"resource": "minecraft:attack_damage",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackKnockback",
|
||||||
|
"resource": "minecraft:attack_knockback",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 5.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackSpeed",
|
||||||
|
"resource": "minecraft:attack_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockBreakSpeed",
|
||||||
|
"resource": "minecraft:block_break_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockInteractionRange",
|
||||||
|
"resource": "minecraft:block_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "burningTime",
|
||||||
|
"resource": "minecraft:burning_time",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cameraDistance",
|
||||||
|
"resource": "minecraft:camera_distance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explosionKnockbackResistance",
|
||||||
|
"resource": "minecraft:explosion_knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityInteractionRange",
|
||||||
|
"resource": "minecraft:entity_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fallDamageMultiplier",
|
||||||
|
"resource": "minecraft:fall_damage_multiplier",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 100.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "flyingSpeed",
|
||||||
|
"resource": "minecraft:flying_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "followRange",
|
||||||
|
"resource": "minecraft:follow_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 32.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gravity",
|
||||||
|
"resource": "minecraft:gravity",
|
||||||
|
"min": -1.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jumpStrength",
|
||||||
|
"resource": "minecraft:jump_strength",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 0.41999998688697815
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "knockbackResistance",
|
||||||
|
"resource": "minecraft:knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "luck",
|
||||||
|
"resource": "minecraft:luck",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxAbsorption",
|
||||||
|
"resource": "minecraft:max_absorption",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxHealth",
|
||||||
|
"resource": "minecraft:max_health",
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 20.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "miningEfficiency",
|
||||||
|
"resource": "minecraft:mining_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementEfficiency",
|
||||||
|
"resource": "minecraft:movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementSpeed",
|
||||||
|
"resource": "minecraft:movement_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oxygenBonus",
|
||||||
|
"resource": "minecraft:oxygen_bonus",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "safeFallDistance",
|
||||||
|
"resource": "minecraft:safe_fall_distance",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scale",
|
||||||
|
"resource": "minecraft:scale",
|
||||||
|
"min": 0.0625,
|
||||||
|
"max": 16.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sneakingSpeed",
|
||||||
|
"resource": "minecraft:sneaking_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnReinforcements",
|
||||||
|
"resource": "minecraft:spawn_reinforcements",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stepHeight",
|
||||||
|
"resource": "minecraft:step_height",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 10.0,
|
||||||
|
"default": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "submergedMiningSpeed",
|
||||||
|
"resource": "minecraft:submerged_mining_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sweepingDamageRatio",
|
||||||
|
"resource": "minecraft:sweeping_damage_ratio",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temptRange",
|
||||||
|
"resource": "minecraft:tempt_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waterMovementEfficiency",
|
||||||
|
"resource": "minecraft:water_movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointTransmitRange",
|
||||||
|
"resource": "minecraft:waypoint_transmit_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointReceiveRange",
|
||||||
|
"resource": "minecraft:waypoint_receive_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,652 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bamboo_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Bamboo Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "basalt_deltas",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Basalt Deltas",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Beach",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "cherry_grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cherry Grove",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "crimson_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Crimson Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dark_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dark Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "deep_cold_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Cold Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "deep_dark",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Dark",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "deep_frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Frozen Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "deep_lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "deep_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Deep Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "desert",
|
||||||
|
"category": "desert",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Desert",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "dripstone_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Dripstone Caves",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "end_barrens",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Barrens",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "end_highlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Highlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "end_midlands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "End Midlands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "eroded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Eroded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "flower_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Flower Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Forest",
|
||||||
|
"color": 7972607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "frozen_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Ocean",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "frozen_peaks",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "frozen_river",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Frozen River",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "grove",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": -0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Grove",
|
||||||
|
"color": 8495359
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "ice_spikes",
|
||||||
|
"category": "ice",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ice Spikes",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "jagged_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jagged Peaks",
|
||||||
|
"color": 8756735
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "lukewarm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lukewarm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "lush_caves",
|
||||||
|
"category": "underground",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Lush Caves",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "mangrove_swamp",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mangrove Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "meadow",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Meadow",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "mushroom_fields",
|
||||||
|
"category": "mushroom",
|
||||||
|
"temperature": 0.9,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Mushroom Fields",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "nether_wastes",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Nether Wastes",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "old_growth_birch_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.6,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Birch Forest",
|
||||||
|
"color": 8037887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "old_growth_pine_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Pine Taiga",
|
||||||
|
"color": 8168447
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "old_growth_spruce_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Old Growth Spruce Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "pale_garden",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.7,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Pale Garden",
|
||||||
|
"color": 12171705
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "river",
|
||||||
|
"category": "river",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "River",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "savanna_plateau",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Savanna Plateau",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "small_end_islands",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "Small End Islands",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "snowy_beach",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.05,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Beach",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "snowy_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Plains",
|
||||||
|
"color": 8364543
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "snowy_slopes",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": -0.3,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Slopes",
|
||||||
|
"color": 8560639
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "snowy_taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": -0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Snowy Taiga",
|
||||||
|
"color": 8625919
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "soul_sand_valley",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Soul Sand Valley",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "sparse_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sparse Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "stony_peaks",
|
||||||
|
"category": "mountain",
|
||||||
|
"temperature": 1.0,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Peaks",
|
||||||
|
"color": 7776511
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "stony_shore",
|
||||||
|
"category": "beach",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Stony Shore",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "sunflower_plains",
|
||||||
|
"category": "plains",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Sunflower Plains",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "swamp",
|
||||||
|
"category": "swamp",
|
||||||
|
"temperature": 0.8,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Swamp",
|
||||||
|
"color": 7907327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "taiga",
|
||||||
|
"category": "taiga",
|
||||||
|
"temperature": 0.25,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Taiga",
|
||||||
|
"color": 8233983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "the_end",
|
||||||
|
"category": "the_end",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "end",
|
||||||
|
"displayName": "The End",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "the_void",
|
||||||
|
"category": "none",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "The Void",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "warm_ocean",
|
||||||
|
"category": "ocean",
|
||||||
|
"temperature": 0.5,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Warm Ocean",
|
||||||
|
"color": 8103167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "warped_forest",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Warped Forest",
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "windswept_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Forest",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "windswept_gravelly_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Gravelly Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "windswept_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "windswept_savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "wooded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Wooded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,242 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "Speed",
|
||||||
|
"displayName": "Speed",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Slowness",
|
||||||
|
"displayName": "Slowness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "Haste",
|
||||||
|
"displayName": "Haste",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "MiningFatigue",
|
||||||
|
"displayName": "Mining Fatigue",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "Strength",
|
||||||
|
"displayName": "Strength",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "InstantHealth",
|
||||||
|
"displayName": "Instant Health",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "InstantDamage",
|
||||||
|
"displayName": "Instant Damage",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "JumpBoost",
|
||||||
|
"displayName": "Jump Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "Nausea",
|
||||||
|
"displayName": "Nausea",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "Regeneration",
|
||||||
|
"displayName": "Regeneration",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "Resistance",
|
||||||
|
"displayName": "Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "FireResistance",
|
||||||
|
"displayName": "Fire Resistance",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "WaterBreathing",
|
||||||
|
"displayName": "Water Breathing",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "Invisibility",
|
||||||
|
"displayName": "Invisibility",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "Blindness",
|
||||||
|
"displayName": "Blindness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "NightVision",
|
||||||
|
"displayName": "Night Vision",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "Hunger",
|
||||||
|
"displayName": "Hunger",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "Weakness",
|
||||||
|
"displayName": "Weakness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "Poison",
|
||||||
|
"displayName": "Poison",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "Wither",
|
||||||
|
"displayName": "Wither",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "HealthBoost",
|
||||||
|
"displayName": "Health Boost",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "Absorption",
|
||||||
|
"displayName": "Absorption",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "Saturation",
|
||||||
|
"displayName": "Saturation",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "Glowing",
|
||||||
|
"displayName": "Glowing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "Levitation",
|
||||||
|
"displayName": "Levitation",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "Luck",
|
||||||
|
"displayName": "Luck",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "BadLuck",
|
||||||
|
"displayName": "Bad Luck",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "SlowFalling",
|
||||||
|
"displayName": "Slow Falling",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "ConduitPower",
|
||||||
|
"displayName": "Conduit Power",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "DolphinsGrace",
|
||||||
|
"displayName": "Dolphin's Grace",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "BadOmen",
|
||||||
|
"displayName": "Bad Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "HeroOfTheVillage",
|
||||||
|
"displayName": "Hero of the Village",
|
||||||
|
"type": "good"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "Darkness",
|
||||||
|
"displayName": "Darkness",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "TrialOmen",
|
||||||
|
"displayName": "Trial Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "RaidOmen",
|
||||||
|
"displayName": "Raid Omen",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "WindCharged",
|
||||||
|
"displayName": "Wind Charged",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "Weaving",
|
||||||
|
"displayName": "Weaving",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "Oozing",
|
||||||
|
"displayName": "Oozing",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "Infested",
|
||||||
|
"displayName": "Infested",
|
||||||
|
"type": "bad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "BreathOfTheNautilus",
|
||||||
|
"displayName": "Breath of the Nautilus",
|
||||||
|
"type": "good"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,980 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "aqua_affinity",
|
||||||
|
"displayName": "Aqua Affinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bane_of_arthropods",
|
||||||
|
"displayName": "Bane of Arthropods",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "binding_curse",
|
||||||
|
"displayName": "Curse of Binding",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "equippable",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "blast_protection",
|
||||||
|
"displayName": "Blast Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "breach",
|
||||||
|
"displayName": "Breach",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "channeling",
|
||||||
|
"displayName": "Channeling",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "density",
|
||||||
|
"displayName": "Density",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"impaling",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "depth_strider",
|
||||||
|
"displayName": "Depth Strider",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"frost_walker"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "efficiency",
|
||||||
|
"displayName": "Efficiency",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mining",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "feather_falling",
|
||||||
|
"displayName": "Feather Falling",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "fire_aspect",
|
||||||
|
"displayName": "Fire Aspect",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fire_aspect",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "fire_protection",
|
||||||
|
"displayName": "Fire Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"projectile_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "flame",
|
||||||
|
"displayName": "Flame",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "fortune",
|
||||||
|
"displayName": "Fortune",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"silk_touch"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "frost_walker",
|
||||||
|
"displayName": "Frost Walker",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"depth_strider"
|
||||||
|
],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "impaling",
|
||||||
|
"displayName": "Impaling",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"sharpness",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "infinity",
|
||||||
|
"displayName": "Infinity",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"mending"
|
||||||
|
],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "knockback",
|
||||||
|
"displayName": "Knockback",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "looting",
|
||||||
|
"displayName": "Looting",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "melee_weapon",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "loyalty",
|
||||||
|
"displayName": "Loyalty",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"riptide"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "luck_of_the_sea",
|
||||||
|
"displayName": "Luck of the Sea",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "lunge",
|
||||||
|
"displayName": "Lunge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "lunge",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "lure",
|
||||||
|
"displayName": "Lure",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "fishing",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "mending",
|
||||||
|
"displayName": "Mending",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"infinity"
|
||||||
|
],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "multishot",
|
||||||
|
"displayName": "Multishot",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"piercing"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "piercing",
|
||||||
|
"displayName": "Piercing",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"multishot"
|
||||||
|
],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "power",
|
||||||
|
"displayName": "Power",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "projectile_protection",
|
||||||
|
"displayName": "Projectile Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "protection",
|
||||||
|
"displayName": "Protection",
|
||||||
|
"maxLevel": 4,
|
||||||
|
"minCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 3,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"blast_protection",
|
||||||
|
"fire_protection",
|
||||||
|
"projectile_protection"
|
||||||
|
],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "punch",
|
||||||
|
"displayName": "Punch",
|
||||||
|
"maxLevel": 2,
|
||||||
|
"minCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "bow",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "quick_charge",
|
||||||
|
"displayName": "Quick Charge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "crossbow",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "respiration",
|
||||||
|
"displayName": "Respiration",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "head_armor",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "riptide",
|
||||||
|
"displayName": "Riptide",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"channeling",
|
||||||
|
"loyalty"
|
||||||
|
],
|
||||||
|
"category": "trident",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "sharpness",
|
||||||
|
"displayName": "Sharpness",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"smite"
|
||||||
|
],
|
||||||
|
"category": "sharp_weapon",
|
||||||
|
"weight": 10,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "silk_touch",
|
||||||
|
"displayName": "Silk Touch",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"fortune"
|
||||||
|
],
|
||||||
|
"category": "mining_loot",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "smite",
|
||||||
|
"displayName": "Smite",
|
||||||
|
"maxLevel": 5,
|
||||||
|
"minCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 4,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [
|
||||||
|
"bane_of_arthropods",
|
||||||
|
"breach",
|
||||||
|
"density",
|
||||||
|
"impaling",
|
||||||
|
"sharpness"
|
||||||
|
],
|
||||||
|
"category": "weapon",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "soul_speed",
|
||||||
|
"displayName": "Soul Speed",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "foot_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sweeping_edge",
|
||||||
|
"displayName": "Sweeping Edge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "sweeping",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "swift_sneak",
|
||||||
|
"displayName": "Swift Sneak",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "leg_armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "thorns",
|
||||||
|
"displayName": "Thorns",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "armor",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "unbreaking",
|
||||||
|
"displayName": "Unbreaking",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "durability",
|
||||||
|
"weight": 5,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "vanishing_curse",
|
||||||
|
"displayName": "Curse of Vanishing",
|
||||||
|
"maxLevel": 1,
|
||||||
|
"minCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": true,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "vanishing",
|
||||||
|
"weight": 1,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "wind_burst",
|
||||||
|
"displayName": "Wind Burst",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,442 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 893,
|
||||||
|
"name": "apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 947,
|
||||||
|
"name": "mushroom_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Mushroom Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 953,
|
||||||
|
"name": "bread",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Bread",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 983,
|
||||||
|
"name": "porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Porkchop",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 984,
|
||||||
|
"name": "cooked_porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Porkchop",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 986,
|
||||||
|
"name": "golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 987,
|
||||||
|
"name": "enchanted_golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Enchanted Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1019,
|
||||||
|
"name": "pufferfish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1020,
|
||||||
|
"name": "salmon_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1021,
|
||||||
|
"name": "cod_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1022,
|
||||||
|
"name": "tropical_fish_bucket",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Bucket of Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1057,
|
||||||
|
"name": "cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1058,
|
||||||
|
"name": "salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1059,
|
||||||
|
"name": "tropical_fish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1060,
|
||||||
|
"name": "pufferfish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1061,
|
||||||
|
"name": "cooked_cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Cod",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1062,
|
||||||
|
"name": "cooked_salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Salmon",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1102,
|
||||||
|
"name": "cookie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cookie",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1106,
|
||||||
|
"name": "melon_slice",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Melon Slice",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1107,
|
||||||
|
"name": "dried_kelp",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Dried Kelp",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1110,
|
||||||
|
"name": "beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Beef",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1111,
|
||||||
|
"name": "cooked_beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Steak",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1112,
|
||||||
|
"name": "chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Chicken",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1113,
|
||||||
|
"name": "cooked_chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Chicken",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1114,
|
||||||
|
"name": "rotten_flesh",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Rotten Flesh",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 6.4,
|
||||||
|
"effectiveQuality": 10.4,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1122,
|
||||||
|
"name": "spider_eye",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Spider Eye",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 14.8,
|
||||||
|
"saturationRatio": 6.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1227,
|
||||||
|
"name": "carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Carrot",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 21.6,
|
||||||
|
"effectiveQuality": 24.6,
|
||||||
|
"saturationRatio": 7.2000003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1228,
|
||||||
|
"name": "potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Potato",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1229,
|
||||||
|
"name": "baked_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Baked Potato",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1230,
|
||||||
|
"name": "poisonous_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Poisonous Potato",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1232,
|
||||||
|
"name": "golden_carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Carrot",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 172.8,
|
||||||
|
"effectiveQuality": 178.8,
|
||||||
|
"saturationRatio": 28.800001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1241,
|
||||||
|
"name": "pumpkin_pie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pumpkin Pie",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 84.8,
|
||||||
|
"saturationRatio": 9.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1249,
|
||||||
|
"name": "rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Rabbit",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1250,
|
||||||
|
"name": "cooked_rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Rabbit",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1251,
|
||||||
|
"name": "rabbit_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Rabbit Stew",
|
||||||
|
"foodPoints": 10.0,
|
||||||
|
"saturation": 240.0,
|
||||||
|
"effectiveQuality": 250.0,
|
||||||
|
"saturationRatio": 24.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1264,
|
||||||
|
"name": "mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Mutton",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1265,
|
||||||
|
"name": "cooked_mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Mutton",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1283,
|
||||||
|
"name": "chorus_fruit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Chorus Fruit",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1287,
|
||||||
|
"name": "beetroot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Beetroot",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 3.4,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1289,
|
||||||
|
"name": "beetroot_soup",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Beetroot Soup",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1340,
|
||||||
|
"name": "suspicious_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Suspicious Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1373,
|
||||||
|
"name": "sweet_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Sweet Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1374,
|
||||||
|
"name": "glow_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Glow Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1381,
|
||||||
|
"name": "honey_bottle",
|
||||||
|
"stackSize": 16,
|
||||||
|
"displayName": "Honey Bottle",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 14.400001,
|
||||||
|
"effectiveQuality": 20.400002,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "zombie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "creeper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "dragon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "wither_skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "piglin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "custom_head"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
|||||||
|
{
|
||||||
|
"default": {},
|
||||||
|
"leaves": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"coweb": {
|
||||||
|
"1105": 15.0,
|
||||||
|
"911": 15.0,
|
||||||
|
"916": 15.0,
|
||||||
|
"921": 15.0,
|
||||||
|
"926": 15.0,
|
||||||
|
"931": 15.0,
|
||||||
|
"936": 15.0,
|
||||||
|
"941": 15.0
|
||||||
|
},
|
||||||
|
"plant": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"gourd": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen": {
|
||||||
|
"1105": 2.0
|
||||||
|
},
|
||||||
|
"wool": {
|
||||||
|
"1105": 1.0
|
||||||
|
},
|
||||||
|
"sword_instantly_mines": {
|
||||||
|
"911": 2.0,
|
||||||
|
"916": 1.0,
|
||||||
|
"921": 4.0,
|
||||||
|
"926": 12.0,
|
||||||
|
"931": 6.0,
|
||||||
|
"936": 8.0,
|
||||||
|
"941": 9.0
|
||||||
|
},
|
||||||
|
"sword_efficient": {
|
||||||
|
"911": 2.0,
|
||||||
|
"916": 1.0,
|
||||||
|
"921": 4.0,
|
||||||
|
"926": 12.0,
|
||||||
|
"931": 6.0,
|
||||||
|
"936": 8.0,
|
||||||
|
"941": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_wooden_tool": {
|
||||||
|
"912": 2.0,
|
||||||
|
"913": 2.0,
|
||||||
|
"914": 2.0,
|
||||||
|
"915": 2.0
|
||||||
|
},
|
||||||
|
"mineable/shovel": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"mineable/pickaxe": {
|
||||||
|
"913": 2.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"943": 9.0
|
||||||
|
},
|
||||||
|
"mineable/axe": {
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"mineable/hoe": {
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_copper_tool": {
|
||||||
|
"917": 1.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"920": 1.0
|
||||||
|
},
|
||||||
|
"incorrect_for_stone_tool": {
|
||||||
|
"922": 4.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"925": 4.0
|
||||||
|
},
|
||||||
|
"incorrect_for_gold_tool": {
|
||||||
|
"927": 12.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"930": 12.0
|
||||||
|
},
|
||||||
|
"incorrect_for_iron_tool": {
|
||||||
|
"932": 6.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"935": 6.0
|
||||||
|
},
|
||||||
|
"incorrect_for_diamond_tool": {
|
||||||
|
"937": 8.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"940": 8.0
|
||||||
|
},
|
||||||
|
"incorrect_for_netherite_tool": {
|
||||||
|
"942": 9.0,
|
||||||
|
"943": 9.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"plant;mineable/axe": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"gourd;mineable/axe": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/hoe": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 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/axe;mineable/hoe": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen;plant;mineable/axe": {
|
||||||
|
"1105": 2.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,462 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "item_slime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "item_cobweb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "item_snowball"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "large_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "mycelium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "note"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "poof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "rain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "white_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "sneeze"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "spit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 65,
|
||||||
|
"name": "sweep_attack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 66,
|
||||||
|
"name": "totem_of_undying"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 67,
|
||||||
|
"name": "underwater"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 68,
|
||||||
|
"name": "splash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 69,
|
||||||
|
"name": "witch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 70,
|
||||||
|
"name": "bubble_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 71,
|
||||||
|
"name": "current_down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 72,
|
||||||
|
"name": "bubble_column_up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 73,
|
||||||
|
"name": "nautilus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 74,
|
||||||
|
"name": "dolphin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 75,
|
||||||
|
"name": "campfire_cosy_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76,
|
||||||
|
"name": "campfire_signal_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 77,
|
||||||
|
"name": "dripping_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 78,
|
||||||
|
"name": "falling_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 79,
|
||||||
|
"name": "landing_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 80,
|
||||||
|
"name": "falling_nectar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 81,
|
||||||
|
"name": "falling_spore_blossom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 82,
|
||||||
|
"name": "ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 83,
|
||||||
|
"name": "crimson_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 84,
|
||||||
|
"name": "warped_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"name": "spore_blossom_air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 86,
|
||||||
|
"name": "dripping_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 87,
|
||||||
|
"name": "falling_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 88,
|
||||||
|
"name": "landing_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 89,
|
||||||
|
"name": "reverse_portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"name": "white_ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"name": "small_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"name": "snowflake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"name": "dripping_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"name": "falling_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"name": "dripping_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"name": "falling_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"name": "glow_squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"name": "glow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 99,
|
||||||
|
"name": "wax_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 100,
|
||||||
|
"name": "wax_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "electric_spark"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 102,
|
||||||
|
"name": "scrape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 103,
|
||||||
|
"name": "shriek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 104,
|
||||||
|
"name": "egg_crack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 105,
|
||||||
|
"name": "dust_plume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 106,
|
||||||
|
"name": "trial_spawner_detection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 107,
|
||||||
|
"name": "trial_spawner_detection_ominous"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 108,
|
||||||
|
"name": "vault_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 109,
|
||||||
|
"name": "dust_pillar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 110,
|
||||||
|
"name": "ominous_spawning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 111,
|
||||||
|
"name": "raid_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 112,
|
||||||
|
"name": "trial_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 113,
|
||||||
|
"name": "block_crumble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 114,
|
||||||
|
"name": "firefly"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,465 @@
|
|||||||
|
{
|
||||||
|
"grass": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": -7306931
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"bamboo_jungle",
|
||||||
|
"basalt_deltas",
|
||||||
|
"beach",
|
||||||
|
"birch_forest",
|
||||||
|
"cold_ocean",
|
||||||
|
"crimson_forest",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"deep_dark",
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"deep_ocean",
|
||||||
|
"desert",
|
||||||
|
"dripstone_caves",
|
||||||
|
"end_barrens",
|
||||||
|
"end_highlands",
|
||||||
|
"end_midlands",
|
||||||
|
"flower_forest",
|
||||||
|
"forest",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_peaks",
|
||||||
|
"frozen_river",
|
||||||
|
"grove",
|
||||||
|
"ice_spikes",
|
||||||
|
"jagged_peaks",
|
||||||
|
"jungle",
|
||||||
|
"lukewarm_ocean",
|
||||||
|
"lush_caves",
|
||||||
|
"meadow",
|
||||||
|
"mushroom_fields",
|
||||||
|
"nether_wastes",
|
||||||
|
"ocean",
|
||||||
|
"old_growth_birch_forest",
|
||||||
|
"old_growth_pine_taiga",
|
||||||
|
"old_growth_spruce_taiga",
|
||||||
|
"plains",
|
||||||
|
"river",
|
||||||
|
"savanna",
|
||||||
|
"savanna_plateau",
|
||||||
|
"small_end_islands",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_plains",
|
||||||
|
"snowy_slopes",
|
||||||
|
"snowy_taiga",
|
||||||
|
"soul_sand_valley",
|
||||||
|
"sparse_jungle",
|
||||||
|
"stony_peaks",
|
||||||
|
"stony_shore",
|
||||||
|
"sunflower_plains",
|
||||||
|
"taiga",
|
||||||
|
"the_end",
|
||||||
|
"the_void",
|
||||||
|
"warm_ocean",
|
||||||
|
"warped_forest",
|
||||||
|
"windswept_forest",
|
||||||
|
"windswept_gravelly_hills",
|
||||||
|
"windswept_hills",
|
||||||
|
"windswept_savanna"
|
||||||
|
],
|
||||||
|
"color": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": -4793503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"dark_forest"
|
||||||
|
],
|
||||||
|
"color": 1317381
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp",
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6975545
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 774,
|
||||||
|
"minecraftVersion": "1.21.11",
|
||||||
|
"majorVersion": "1.21",
|
||||||
|
"releaseType": "release"
|
||||||
|
}
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "armor",
|
||||||
|
"resource": "minecraft:armor",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 30.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armorToughness",
|
||||||
|
"resource": "minecraft:armor_toughness",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackDamage",
|
||||||
|
"resource": "minecraft:attack_damage",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackKnockback",
|
||||||
|
"resource": "minecraft:attack_knockback",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 5.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackSpeed",
|
||||||
|
"resource": "minecraft:attack_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockBreakSpeed",
|
||||||
|
"resource": "minecraft:block_break_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockInteractionRange",
|
||||||
|
"resource": "minecraft:block_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "burningTime",
|
||||||
|
"resource": "minecraft:burning_time",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cameraDistance",
|
||||||
|
"resource": "minecraft:camera_distance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explosionKnockbackResistance",
|
||||||
|
"resource": "minecraft:explosion_knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityInteractionRange",
|
||||||
|
"resource": "minecraft:entity_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fallDamageMultiplier",
|
||||||
|
"resource": "minecraft:fall_damage_multiplier",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 100.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "flyingSpeed",
|
||||||
|
"resource": "minecraft:flying_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "followRange",
|
||||||
|
"resource": "minecraft:follow_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 32.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gravity",
|
||||||
|
"resource": "minecraft:gravity",
|
||||||
|
"min": -1.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jumpStrength",
|
||||||
|
"resource": "minecraft:jump_strength",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 0.41999998688697815
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "knockbackResistance",
|
||||||
|
"resource": "minecraft:knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "luck",
|
||||||
|
"resource": "minecraft:luck",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxAbsorption",
|
||||||
|
"resource": "minecraft:max_absorption",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxHealth",
|
||||||
|
"resource": "minecraft:max_health",
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 20.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "miningEfficiency",
|
||||||
|
"resource": "minecraft:mining_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementEfficiency",
|
||||||
|
"resource": "minecraft:movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementSpeed",
|
||||||
|
"resource": "minecraft:movement_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oxygenBonus",
|
||||||
|
"resource": "minecraft:oxygen_bonus",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "safeFallDistance",
|
||||||
|
"resource": "minecraft:safe_fall_distance",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scale",
|
||||||
|
"resource": "minecraft:scale",
|
||||||
|
"min": 0.0625,
|
||||||
|
"max": 16.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sneakingSpeed",
|
||||||
|
"resource": "minecraft:sneaking_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnReinforcements",
|
||||||
|
"resource": "minecraft:spawn_reinforcements",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stepHeight",
|
||||||
|
"resource": "minecraft:step_height",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 10.0,
|
||||||
|
"default": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "submergedMiningSpeed",
|
||||||
|
"resource": "minecraft:submerged_mining_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sweepingDamageRatio",
|
||||||
|
"resource": "minecraft:sweeping_damage_ratio",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temptRange",
|
||||||
|
"resource": "minecraft:tempt_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waterMovementEfficiency",
|
||||||
|
"resource": "minecraft:water_movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointTransmitRange",
|
||||||
|
"resource": "minecraft:waypoint_transmit_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointReceiveRange",
|
||||||
|
"resource": "minecraft:waypoint_receive_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,652 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bamboo_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Bamboo Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "basalt_deltas",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Basalt Deltas",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "windswept_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Forest",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "windswept_gravelly_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Gravelly Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "windswept_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "windswept_savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "wooded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Wooded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,236 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,959 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "sword",
|
||||||
|
"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": "sword",
|
||||||
|
"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": "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": 22,
|
||||||
|
"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": 23,
|
||||||
|
"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": 24,
|
||||||
|
"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": 25,
|
||||||
|
"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": 26,
|
||||||
|
"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": 27,
|
||||||
|
"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": 28,
|
||||||
|
"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": 29,
|
||||||
|
"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": 30,
|
||||||
|
"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": 31,
|
||||||
|
"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": 32,
|
||||||
|
"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": 33,
|
||||||
|
"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": 34,
|
||||||
|
"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": 35,
|
||||||
|
"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": 36,
|
||||||
|
"name": "sweeping_edge",
|
||||||
|
"displayName": "Sweeping Edge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "sword",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"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": 38,
|
||||||
|
"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": 39,
|
||||||
|
"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": 40,
|
||||||
|
"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": 41,
|
||||||
|
"name": "wind_burst",
|
||||||
|
"displayName": "Wind Burst",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,402 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 857,
|
||||||
|
"name": "apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 906,
|
||||||
|
"name": "mushroom_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Mushroom Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 912,
|
||||||
|
"name": "bread",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Bread",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 938,
|
||||||
|
"name": "porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Porkchop",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 939,
|
||||||
|
"name": "cooked_porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Porkchop",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 941,
|
||||||
|
"name": "golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 942,
|
||||||
|
"name": "enchanted_golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Enchanted Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1012,
|
||||||
|
"name": "cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1013,
|
||||||
|
"name": "salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1014,
|
||||||
|
"name": "tropical_fish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1015,
|
||||||
|
"name": "pufferfish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1016,
|
||||||
|
"name": "cooked_cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Cod",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1017,
|
||||||
|
"name": "cooked_salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Salmon",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1057,
|
||||||
|
"name": "cookie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cookie",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1061,
|
||||||
|
"name": "melon_slice",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Melon Slice",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1062,
|
||||||
|
"name": "dried_kelp",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Dried Kelp",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1065,
|
||||||
|
"name": "beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Beef",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1066,
|
||||||
|
"name": "cooked_beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Steak",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1067,
|
||||||
|
"name": "chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Chicken",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1068,
|
||||||
|
"name": "cooked_chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Chicken",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1069,
|
||||||
|
"name": "rotten_flesh",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Rotten Flesh",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 6.4,
|
||||||
|
"effectiveQuality": 10.4,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1077,
|
||||||
|
"name": "spider_eye",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Spider Eye",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 14.8,
|
||||||
|
"saturationRatio": 6.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1177,
|
||||||
|
"name": "carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Carrot",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 21.6,
|
||||||
|
"effectiveQuality": 24.6,
|
||||||
|
"saturationRatio": 7.2000003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1178,
|
||||||
|
"name": "potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Potato",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1179,
|
||||||
|
"name": "baked_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Baked Potato",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1180,
|
||||||
|
"name": "poisonous_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Poisonous Potato",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1182,
|
||||||
|
"name": "golden_carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Carrot",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 172.8,
|
||||||
|
"effectiveQuality": 178.8,
|
||||||
|
"saturationRatio": 28.800001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1191,
|
||||||
|
"name": "pumpkin_pie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pumpkin Pie",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 84.8,
|
||||||
|
"saturationRatio": 9.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1199,
|
||||||
|
"name": "rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Rabbit",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1200,
|
||||||
|
"name": "cooked_rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Rabbit",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1201,
|
||||||
|
"name": "rabbit_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Rabbit Stew",
|
||||||
|
"foodPoints": 10.0,
|
||||||
|
"saturation": 240.0,
|
||||||
|
"effectiveQuality": 250.0,
|
||||||
|
"saturationRatio": 24.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1212,
|
||||||
|
"name": "mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Mutton",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1213,
|
||||||
|
"name": "cooked_mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Mutton",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1231,
|
||||||
|
"name": "chorus_fruit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Chorus Fruit",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1235,
|
||||||
|
"name": "beetroot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Beetroot",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 3.4,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1237,
|
||||||
|
"name": "beetroot_soup",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Beetroot Soup",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1275,
|
||||||
|
"name": "suspicious_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Suspicious Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1300,
|
||||||
|
"name": "sweet_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Sweet Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1301,
|
||||||
|
"name": "glow_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Glow Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1308,
|
||||||
|
"name": "honey_bottle",
|
||||||
|
"stackSize": 16,
|
||||||
|
"displayName": "Honey Bottle",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 14.400001,
|
||||||
|
"effectiveQuality": 20.400002,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "zombie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "creeper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "dragon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "wither_skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "piglin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"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,206 @@
|
|||||||
|
{
|
||||||
|
"default": {},
|
||||||
|
"leaves": {
|
||||||
|
"1060": 1.0,
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5
|
||||||
|
},
|
||||||
|
"coweb": {
|
||||||
|
"1060": 15.0,
|
||||||
|
"875": 15.0,
|
||||||
|
"880": 15.0,
|
||||||
|
"885": 15.0,
|
||||||
|
"890": 15.0,
|
||||||
|
"895": 15.0,
|
||||||
|
"900": 15.0
|
||||||
|
},
|
||||||
|
"plant": {
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5
|
||||||
|
},
|
||||||
|
"gourd": {
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen": {
|
||||||
|
"1060": 2.0
|
||||||
|
},
|
||||||
|
"wool": {
|
||||||
|
"1060": 1.0
|
||||||
|
},
|
||||||
|
"sword_instantly_mines": {
|
||||||
|
"875": 2.0,
|
||||||
|
"880": 4.0,
|
||||||
|
"885": 12.0,
|
||||||
|
"890": 6.0,
|
||||||
|
"895": 8.0,
|
||||||
|
"900": 9.0
|
||||||
|
},
|
||||||
|
"sword_efficient": {
|
||||||
|
"875": 2.0,
|
||||||
|
"880": 4.0,
|
||||||
|
"885": 12.0,
|
||||||
|
"890": 6.0,
|
||||||
|
"895": 8.0,
|
||||||
|
"900": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_wooden_tool": {
|
||||||
|
"876": 2.0,
|
||||||
|
"877": 2.0,
|
||||||
|
"878": 2.0,
|
||||||
|
"879": 2.0
|
||||||
|
},
|
||||||
|
"mineable/shovel": {
|
||||||
|
"876": 2.0,
|
||||||
|
"881": 4.0,
|
||||||
|
"886": 12.0,
|
||||||
|
"891": 6.0,
|
||||||
|
"896": 8.0,
|
||||||
|
"901": 9.0
|
||||||
|
},
|
||||||
|
"mineable/pickaxe": {
|
||||||
|
"877": 2.0,
|
||||||
|
"882": 4.0,
|
||||||
|
"887": 12.0,
|
||||||
|
"892": 6.0,
|
||||||
|
"897": 8.0,
|
||||||
|
"902": 9.0
|
||||||
|
},
|
||||||
|
"mineable/axe": {
|
||||||
|
"878": 2.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"903": 9.0
|
||||||
|
},
|
||||||
|
"mineable/hoe": {
|
||||||
|
"879": 2.0,
|
||||||
|
"884": 4.0,
|
||||||
|
"889": 12.0,
|
||||||
|
"894": 6.0,
|
||||||
|
"899": 8.0,
|
||||||
|
"904": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_stone_tool": {
|
||||||
|
"881": 4.0,
|
||||||
|
"882": 4.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"884": 4.0
|
||||||
|
},
|
||||||
|
"incorrect_for_gold_tool": {
|
||||||
|
"886": 12.0,
|
||||||
|
"887": 12.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"889": 12.0
|
||||||
|
},
|
||||||
|
"incorrect_for_iron_tool": {
|
||||||
|
"891": 6.0,
|
||||||
|
"892": 6.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"894": 6.0
|
||||||
|
},
|
||||||
|
"incorrect_for_diamond_tool": {
|
||||||
|
"896": 8.0,
|
||||||
|
"897": 8.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"899": 8.0
|
||||||
|
},
|
||||||
|
"incorrect_for_netherite_tool": {
|
||||||
|
"901": 9.0,
|
||||||
|
"902": 9.0,
|
||||||
|
"903": 9.0,
|
||||||
|
"904": 9.0
|
||||||
|
},
|
||||||
|
"plant;mineable/axe": {
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5,
|
||||||
|
"878": 2.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"903": 9.0
|
||||||
|
},
|
||||||
|
"gourd;mineable/axe": {
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5,
|
||||||
|
"878": 2.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"903": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/hoe": {
|
||||||
|
"1060": 1.0,
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5,
|
||||||
|
"879": 2.0,
|
||||||
|
"884": 4.0,
|
||||||
|
"889": 12.0,
|
||||||
|
"894": 6.0,
|
||||||
|
"899": 8.0,
|
||||||
|
"904": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/axe;mineable/hoe": {
|
||||||
|
"1060": 1.0,
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5,
|
||||||
|
"878": 2.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"903": 9.0,
|
||||||
|
"879": 2.0,
|
||||||
|
"884": 4.0,
|
||||||
|
"889": 12.0,
|
||||||
|
"894": 6.0,
|
||||||
|
"899": 8.0,
|
||||||
|
"904": 9.0
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen;plant;mineable/axe": {
|
||||||
|
"1060": 2.0,
|
||||||
|
"875": 1.5,
|
||||||
|
"880": 1.5,
|
||||||
|
"885": 1.5,
|
||||||
|
"890": 1.5,
|
||||||
|
"895": 1.5,
|
||||||
|
"900": 1.5,
|
||||||
|
"878": 2.0,
|
||||||
|
"883": 4.0,
|
||||||
|
"888": 12.0,
|
||||||
|
"893": 6.0,
|
||||||
|
"898": 8.0,
|
||||||
|
"903": 9.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,458 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "crit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "damage_indicator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "dragon_breath"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "dripping_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "falling_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "landing_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "dripping_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "falling_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 14,
|
||||||
|
"name": "dust_color_transition"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"name": "elder_guardian"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "enchanted_hit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "enchant"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "end_rod"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "entity_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "explosion_emitter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "explosion"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 24,
|
||||||
|
"name": "small_gust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"name": "gust_emitter_large"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "gust_emitter_small"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 27,
|
||||||
|
"name": "sonic_boom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"name": "falling_dust"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"name": "firework"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 30,
|
||||||
|
"name": "fishing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"name": "infested"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"name": "cherry_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "pale_oak_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 35,
|
||||||
|
"name": "tinted_leaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"name": "sculk_soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"name": "sculk_charge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"name": "sculk_charge_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "soul_fire_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 40,
|
||||||
|
"name": "soul"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"name": "flash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"name": "happy_villager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"name": "composter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 44,
|
||||||
|
"name": "heart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "instant_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 46,
|
||||||
|
"name": "item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"name": "vibration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"name": "trail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"name": "item_slime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 50,
|
||||||
|
"name": "item_cobweb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "item_snowball"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "large_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "mycelium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "note"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "poof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "rain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "white_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "sneeze"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "spit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "sweep_attack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 65,
|
||||||
|
"name": "totem_of_undying"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 66,
|
||||||
|
"name": "underwater"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 67,
|
||||||
|
"name": "splash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 68,
|
||||||
|
"name": "witch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 69,
|
||||||
|
"name": "bubble_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 70,
|
||||||
|
"name": "current_down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 71,
|
||||||
|
"name": "bubble_column_up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 72,
|
||||||
|
"name": "nautilus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 73,
|
||||||
|
"name": "dolphin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 74,
|
||||||
|
"name": "campfire_cosy_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 75,
|
||||||
|
"name": "campfire_signal_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76,
|
||||||
|
"name": "dripping_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 77,
|
||||||
|
"name": "falling_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 78,
|
||||||
|
"name": "landing_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 79,
|
||||||
|
"name": "falling_nectar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 80,
|
||||||
|
"name": "falling_spore_blossom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 81,
|
||||||
|
"name": "ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 82,
|
||||||
|
"name": "crimson_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 83,
|
||||||
|
"name": "warped_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 84,
|
||||||
|
"name": "spore_blossom_air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"name": "dripping_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 86,
|
||||||
|
"name": "falling_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 87,
|
||||||
|
"name": "landing_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 88,
|
||||||
|
"name": "reverse_portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 89,
|
||||||
|
"name": "white_ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"name": "small_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"name": "snowflake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"name": "dripping_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"name": "falling_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"name": "dripping_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"name": "falling_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"name": "glow_squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"name": "glow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"name": "wax_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 99,
|
||||||
|
"name": "wax_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 100,
|
||||||
|
"name": "electric_spark"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "scrape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 102,
|
||||||
|
"name": "shriek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 103,
|
||||||
|
"name": "egg_crack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 104,
|
||||||
|
"name": "dust_plume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 105,
|
||||||
|
"name": "trial_spawner_detection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 106,
|
||||||
|
"name": "trial_spawner_detection_ominous"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 107,
|
||||||
|
"name": "vault_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 108,
|
||||||
|
"name": "dust_pillar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 109,
|
||||||
|
"name": "ominous_spawning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 110,
|
||||||
|
"name": "raid_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 111,
|
||||||
|
"name": "trial_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 112,
|
||||||
|
"name": "block_crumble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 113,
|
||||||
|
"name": "firefly"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,465 @@
|
|||||||
|
{
|
||||||
|
"grass": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": 9470285
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 11983713
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"dark_forest"
|
||||||
|
],
|
||||||
|
"color": 1317381
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp",
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6975545
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 7832178
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"foliage": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": 10387789
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 11983713
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": 9285927
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 8883574
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6975545
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"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": 4159204
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": 6141935
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cold_ocean",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_taiga"
|
||||||
|
],
|
||||||
|
"color": 4020182
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_river"
|
||||||
|
],
|
||||||
|
"color": 3750089
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"lukewarm_ocean"
|
||||||
|
],
|
||||||
|
"color": 4566514
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": 3832426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"meadow"
|
||||||
|
],
|
||||||
|
"color": 937679
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 7768221
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6388580
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"warm_ocean"
|
||||||
|
],
|
||||||
|
"color": 4445678
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"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": 772,
|
||||||
|
"minecraftVersion": "1.21.8",
|
||||||
|
"majorVersion": "1.21",
|
||||||
|
"releaseType": "release"
|
||||||
|
}
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "armor",
|
||||||
|
"resource": "minecraft:armor",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 30.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armorToughness",
|
||||||
|
"resource": "minecraft:armor_toughness",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackDamage",
|
||||||
|
"resource": "minecraft:attack_damage",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackKnockback",
|
||||||
|
"resource": "minecraft:attack_knockback",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 5.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attackSpeed",
|
||||||
|
"resource": "minecraft:attack_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockBreakSpeed",
|
||||||
|
"resource": "minecraft:block_break_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockInteractionRange",
|
||||||
|
"resource": "minecraft:block_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "burningTime",
|
||||||
|
"resource": "minecraft:burning_time",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cameraDistance",
|
||||||
|
"resource": "minecraft:camera_distance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 4.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explosionKnockbackResistance",
|
||||||
|
"resource": "minecraft:explosion_knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityInteractionRange",
|
||||||
|
"resource": "minecraft:entity_interaction_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 64.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fallDamageMultiplier",
|
||||||
|
"resource": "minecraft:fall_damage_multiplier",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 100.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "flyingSpeed",
|
||||||
|
"resource": "minecraft:flying_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "followRange",
|
||||||
|
"resource": "minecraft:follow_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 32.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gravity",
|
||||||
|
"resource": "minecraft:gravity",
|
||||||
|
"min": -1.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jumpStrength",
|
||||||
|
"resource": "minecraft:jump_strength",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 32.0,
|
||||||
|
"default": 0.41999998688697815
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "knockbackResistance",
|
||||||
|
"resource": "minecraft:knockback_resistance",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "luck",
|
||||||
|
"resource": "minecraft:luck",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxAbsorption",
|
||||||
|
"resource": "minecraft:max_absorption",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maxHealth",
|
||||||
|
"resource": "minecraft:max_health",
|
||||||
|
"min": 1.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 20.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "miningEfficiency",
|
||||||
|
"resource": "minecraft:mining_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementEfficiency",
|
||||||
|
"resource": "minecraft:movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "movementSpeed",
|
||||||
|
"resource": "minecraft:movement_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oxygenBonus",
|
||||||
|
"resource": "minecraft:oxygen_bonus",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "safeFallDistance",
|
||||||
|
"resource": "minecraft:safe_fall_distance",
|
||||||
|
"min": -1024.0,
|
||||||
|
"max": 1024.0,
|
||||||
|
"default": 3.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scale",
|
||||||
|
"resource": "minecraft:scale",
|
||||||
|
"min": 0.0625,
|
||||||
|
"max": 16.0,
|
||||||
|
"default": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sneakingSpeed",
|
||||||
|
"resource": "minecraft:sneaking_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnReinforcements",
|
||||||
|
"resource": "minecraft:spawn_reinforcements",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stepHeight",
|
||||||
|
"resource": "minecraft:step_height",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 10.0,
|
||||||
|
"default": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "submergedMiningSpeed",
|
||||||
|
"resource": "minecraft:submerged_mining_speed",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 20.0,
|
||||||
|
"default": 0.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sweepingDamageRatio",
|
||||||
|
"resource": "minecraft:sweeping_damage_ratio",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "temptRange",
|
||||||
|
"resource": "minecraft:tempt_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 2048.0,
|
||||||
|
"default": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waterMovementEfficiency",
|
||||||
|
"resource": "minecraft:water_movement_efficiency",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 1.0,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointTransmitRange",
|
||||||
|
"resource": "minecraft:waypoint_transmit_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "waypointReceiveRange",
|
||||||
|
"resource": "minecraft:waypoint_receive_range",
|
||||||
|
"min": 0.0,
|
||||||
|
"max": 6.0E7,
|
||||||
|
"default": 0.0
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,652 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"name": "badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "bamboo_jungle",
|
||||||
|
"category": "jungle",
|
||||||
|
"temperature": 0.95,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Bamboo Jungle",
|
||||||
|
"color": 7842047
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "basalt_deltas",
|
||||||
|
"category": "nether",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "nether",
|
||||||
|
"displayName": "Basalt Deltas",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "windswept_forest",
|
||||||
|
"category": "forest",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Forest",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "windswept_gravelly_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Gravelly Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "windswept_hills",
|
||||||
|
"category": "extreme_hills",
|
||||||
|
"temperature": 0.2,
|
||||||
|
"has_precipitation": true,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Hills",
|
||||||
|
"color": 8233727
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "windswept_savanna",
|
||||||
|
"category": "savanna",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Windswept Savanna",
|
||||||
|
"color": 7254527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "wooded_badlands",
|
||||||
|
"category": "mesa",
|
||||||
|
"temperature": 2.0,
|
||||||
|
"has_precipitation": false,
|
||||||
|
"dimension": "overworld",
|
||||||
|
"displayName": "Wooded Badlands",
|
||||||
|
"color": 7254527
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,236 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,959 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "sword",
|
||||||
|
"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": "sword",
|
||||||
|
"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": "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": 22,
|
||||||
|
"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": 23,
|
||||||
|
"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": 24,
|
||||||
|
"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": 25,
|
||||||
|
"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": 26,
|
||||||
|
"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": 27,
|
||||||
|
"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": 28,
|
||||||
|
"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": 29,
|
||||||
|
"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": 30,
|
||||||
|
"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": 31,
|
||||||
|
"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": 32,
|
||||||
|
"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": 33,
|
||||||
|
"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": 34,
|
||||||
|
"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": 35,
|
||||||
|
"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": 36,
|
||||||
|
"name": "sweeping_edge",
|
||||||
|
"displayName": "Sweeping Edge",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": false,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "sword",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": true,
|
||||||
|
"discoverable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"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": 38,
|
||||||
|
"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": 39,
|
||||||
|
"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": 40,
|
||||||
|
"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": 41,
|
||||||
|
"name": "wind_burst",
|
||||||
|
"displayName": "Wind Burst",
|
||||||
|
"maxLevel": 3,
|
||||||
|
"minCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"maxCost": {
|
||||||
|
"a": 2,
|
||||||
|
"b": 1
|
||||||
|
},
|
||||||
|
"treasureOnly": true,
|
||||||
|
"curse": false,
|
||||||
|
"exclude": [],
|
||||||
|
"category": "mace",
|
||||||
|
"weight": 2,
|
||||||
|
"tradeable": false,
|
||||||
|
"discoverable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,402 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 893,
|
||||||
|
"name": "apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 947,
|
||||||
|
"name": "mushroom_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Mushroom Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 953,
|
||||||
|
"name": "bread",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Bread",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 983,
|
||||||
|
"name": "porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Porkchop",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 984,
|
||||||
|
"name": "cooked_porkchop",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Porkchop",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 986,
|
||||||
|
"name": "golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 987,
|
||||||
|
"name": "enchanted_golden_apple",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Enchanted Golden Apple",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 80.8,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1057,
|
||||||
|
"name": "cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Cod",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1058,
|
||||||
|
"name": "salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Salmon",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1059,
|
||||||
|
"name": "tropical_fish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Tropical Fish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1060,
|
||||||
|
"name": "pufferfish",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pufferfish",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 0.4,
|
||||||
|
"effectiveQuality": 1.4,
|
||||||
|
"saturationRatio": 0.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1061,
|
||||||
|
"name": "cooked_cod",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Cod",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1062,
|
||||||
|
"name": "cooked_salmon",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Salmon",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1102,
|
||||||
|
"name": "cookie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cookie",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1106,
|
||||||
|
"name": "melon_slice",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Melon Slice",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1107,
|
||||||
|
"name": "dried_kelp",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Dried Kelp",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1110,
|
||||||
|
"name": "beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Beef",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1111,
|
||||||
|
"name": "cooked_beef",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Steak",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 204.8,
|
||||||
|
"effectiveQuality": 212.8,
|
||||||
|
"saturationRatio": 25.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1112,
|
||||||
|
"name": "chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Chicken",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1113,
|
||||||
|
"name": "cooked_chicken",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Chicken",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1114,
|
||||||
|
"name": "rotten_flesh",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Rotten Flesh",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 6.4,
|
||||||
|
"effectiveQuality": 10.4,
|
||||||
|
"saturationRatio": 1.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1122,
|
||||||
|
"name": "spider_eye",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Spider Eye",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 12.8,
|
||||||
|
"effectiveQuality": 14.8,
|
||||||
|
"saturationRatio": 6.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1223,
|
||||||
|
"name": "carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Carrot",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 21.6,
|
||||||
|
"effectiveQuality": 24.6,
|
||||||
|
"saturationRatio": 7.2000003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1224,
|
||||||
|
"name": "potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Potato",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 1.2,
|
||||||
|
"effectiveQuality": 2.2,
|
||||||
|
"saturationRatio": 1.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1225,
|
||||||
|
"name": "baked_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Baked Potato",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1226,
|
||||||
|
"name": "poisonous_potato",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Poisonous Potato",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1228,
|
||||||
|
"name": "golden_carrot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Golden Carrot",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 172.8,
|
||||||
|
"effectiveQuality": 178.8,
|
||||||
|
"saturationRatio": 28.800001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1237,
|
||||||
|
"name": "pumpkin_pie",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Pumpkin Pie",
|
||||||
|
"foodPoints": 8.0,
|
||||||
|
"saturation": 76.8,
|
||||||
|
"effectiveQuality": 84.8,
|
||||||
|
"saturationRatio": 9.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1245,
|
||||||
|
"name": "rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Rabbit",
|
||||||
|
"foodPoints": 3.0,
|
||||||
|
"saturation": 10.8,
|
||||||
|
"effectiveQuality": 13.8,
|
||||||
|
"saturationRatio": 3.6000001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1246,
|
||||||
|
"name": "cooked_rabbit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Rabbit",
|
||||||
|
"foodPoints": 5.0,
|
||||||
|
"saturation": 60.0,
|
||||||
|
"effectiveQuality": 65.0,
|
||||||
|
"saturationRatio": 12.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1247,
|
||||||
|
"name": "rabbit_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Rabbit Stew",
|
||||||
|
"foodPoints": 10.0,
|
||||||
|
"saturation": 240.0,
|
||||||
|
"effectiveQuality": 250.0,
|
||||||
|
"saturationRatio": 24.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1259,
|
||||||
|
"name": "mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Raw Mutton",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 4.8,
|
||||||
|
"effectiveQuality": 6.8,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1260,
|
||||||
|
"name": "cooked_mutton",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Cooked Mutton",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 115.200005,
|
||||||
|
"effectiveQuality": 121.200005,
|
||||||
|
"saturationRatio": 19.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1278,
|
||||||
|
"name": "chorus_fruit",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Chorus Fruit",
|
||||||
|
"foodPoints": 4.0,
|
||||||
|
"saturation": 19.2,
|
||||||
|
"effectiveQuality": 23.2,
|
||||||
|
"saturationRatio": 4.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1282,
|
||||||
|
"name": "beetroot",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Beetroot",
|
||||||
|
"foodPoints": 1.0,
|
||||||
|
"saturation": 2.4,
|
||||||
|
"effectiveQuality": 3.4,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1284,
|
||||||
|
"name": "beetroot_soup",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Beetroot Soup",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1323,
|
||||||
|
"name": "suspicious_stew",
|
||||||
|
"stackSize": 1,
|
||||||
|
"displayName": "Suspicious Stew",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 86.4,
|
||||||
|
"effectiveQuality": 92.4,
|
||||||
|
"saturationRatio": 14.400001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1356,
|
||||||
|
"name": "sweet_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Sweet Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1357,
|
||||||
|
"name": "glow_berries",
|
||||||
|
"stackSize": 64,
|
||||||
|
"displayName": "Glow Berries",
|
||||||
|
"foodPoints": 2.0,
|
||||||
|
"saturation": 1.6,
|
||||||
|
"effectiveQuality": 3.6,
|
||||||
|
"saturationRatio": 0.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1364,
|
||||||
|
"name": "honey_bottle",
|
||||||
|
"stackSize": 16,
|
||||||
|
"displayName": "Honey Bottle",
|
||||||
|
"foodPoints": 6.0,
|
||||||
|
"saturation": 14.400001,
|
||||||
|
"effectiveQuality": 20.400002,
|
||||||
|
"saturationRatio": 2.4
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "zombie"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"name": "skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "creeper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 19,
|
||||||
|
"name": "dragon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"name": "wither_skeleton"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 21,
|
||||||
|
"name": "piglin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 22,
|
||||||
|
"name": "custom_head"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
|||||||
|
{
|
||||||
|
"default": {},
|
||||||
|
"leaves": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"coweb": {
|
||||||
|
"1105": 15.0,
|
||||||
|
"911": 15.0,
|
||||||
|
"916": 15.0,
|
||||||
|
"921": 15.0,
|
||||||
|
"926": 15.0,
|
||||||
|
"931": 15.0,
|
||||||
|
"936": 15.0,
|
||||||
|
"941": 15.0
|
||||||
|
},
|
||||||
|
"plant": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"gourd": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen": {
|
||||||
|
"1105": 2.0
|
||||||
|
},
|
||||||
|
"wool": {
|
||||||
|
"1105": 1.0
|
||||||
|
},
|
||||||
|
"sword_instantly_mines": {
|
||||||
|
"911": 2.0,
|
||||||
|
"916": 1.0,
|
||||||
|
"921": 4.0,
|
||||||
|
"926": 12.0,
|
||||||
|
"931": 6.0,
|
||||||
|
"936": 8.0,
|
||||||
|
"941": 9.0
|
||||||
|
},
|
||||||
|
"sword_efficient": {
|
||||||
|
"911": 2.0,
|
||||||
|
"916": 1.0,
|
||||||
|
"921": 4.0,
|
||||||
|
"926": 12.0,
|
||||||
|
"931": 6.0,
|
||||||
|
"936": 8.0,
|
||||||
|
"941": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_wooden_tool": {
|
||||||
|
"912": 2.0,
|
||||||
|
"913": 2.0,
|
||||||
|
"914": 2.0,
|
||||||
|
"915": 2.0
|
||||||
|
},
|
||||||
|
"mineable/shovel": {
|
||||||
|
"912": 2.0,
|
||||||
|
"917": 1.0,
|
||||||
|
"922": 4.0,
|
||||||
|
"927": 12.0,
|
||||||
|
"932": 6.0,
|
||||||
|
"937": 8.0,
|
||||||
|
"942": 9.0
|
||||||
|
},
|
||||||
|
"mineable/pickaxe": {
|
||||||
|
"913": 2.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"943": 9.0
|
||||||
|
},
|
||||||
|
"mineable/axe": {
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"mineable/hoe": {
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"incorrect_for_copper_tool": {
|
||||||
|
"917": 1.0,
|
||||||
|
"918": 1.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"920": 1.0
|
||||||
|
},
|
||||||
|
"incorrect_for_stone_tool": {
|
||||||
|
"922": 4.0,
|
||||||
|
"923": 4.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"925": 4.0
|
||||||
|
},
|
||||||
|
"incorrect_for_gold_tool": {
|
||||||
|
"927": 12.0,
|
||||||
|
"928": 12.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"930": 12.0
|
||||||
|
},
|
||||||
|
"incorrect_for_iron_tool": {
|
||||||
|
"932": 6.0,
|
||||||
|
"933": 6.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"935": 6.0
|
||||||
|
},
|
||||||
|
"incorrect_for_diamond_tool": {
|
||||||
|
"937": 8.0,
|
||||||
|
"938": 8.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"940": 8.0
|
||||||
|
},
|
||||||
|
"incorrect_for_netherite_tool": {
|
||||||
|
"942": 9.0,
|
||||||
|
"943": 9.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"plant;mineable/axe": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"gourd;mineable/axe": {
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
},
|
||||||
|
"leaves;mineable/hoe": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 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/axe;mineable/hoe": {
|
||||||
|
"1105": 1.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0,
|
||||||
|
"915": 2.0,
|
||||||
|
"920": 1.0,
|
||||||
|
"925": 4.0,
|
||||||
|
"930": 12.0,
|
||||||
|
"935": 6.0,
|
||||||
|
"940": 8.0,
|
||||||
|
"945": 9.0
|
||||||
|
},
|
||||||
|
"vine_or_glow_lichen;plant;mineable/axe": {
|
||||||
|
"1105": 2.0,
|
||||||
|
"911": 1.5,
|
||||||
|
"916": 1.5,
|
||||||
|
"921": 1.5,
|
||||||
|
"926": 1.5,
|
||||||
|
"931": 1.5,
|
||||||
|
"936": 1.5,
|
||||||
|
"941": 1.5,
|
||||||
|
"914": 2.0,
|
||||||
|
"919": 1.0,
|
||||||
|
"924": 4.0,
|
||||||
|
"929": 12.0,
|
||||||
|
"934": 6.0,
|
||||||
|
"939": 8.0,
|
||||||
|
"944": 9.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,462 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"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": "item_slime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 51,
|
||||||
|
"name": "item_cobweb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 52,
|
||||||
|
"name": "item_snowball"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 53,
|
||||||
|
"name": "large_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 54,
|
||||||
|
"name": "lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 55,
|
||||||
|
"name": "mycelium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 56,
|
||||||
|
"name": "note"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 57,
|
||||||
|
"name": "poof"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 58,
|
||||||
|
"name": "portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 59,
|
||||||
|
"name": "rain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 60,
|
||||||
|
"name": "smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 61,
|
||||||
|
"name": "white_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 62,
|
||||||
|
"name": "sneeze"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 63,
|
||||||
|
"name": "spit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 64,
|
||||||
|
"name": "squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 65,
|
||||||
|
"name": "sweep_attack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 66,
|
||||||
|
"name": "totem_of_undying"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 67,
|
||||||
|
"name": "underwater"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 68,
|
||||||
|
"name": "splash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 69,
|
||||||
|
"name": "witch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 70,
|
||||||
|
"name": "bubble_pop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 71,
|
||||||
|
"name": "current_down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 72,
|
||||||
|
"name": "bubble_column_up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 73,
|
||||||
|
"name": "nautilus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 74,
|
||||||
|
"name": "dolphin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 75,
|
||||||
|
"name": "campfire_cosy_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76,
|
||||||
|
"name": "campfire_signal_smoke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 77,
|
||||||
|
"name": "dripping_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 78,
|
||||||
|
"name": "falling_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 79,
|
||||||
|
"name": "landing_honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 80,
|
||||||
|
"name": "falling_nectar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 81,
|
||||||
|
"name": "falling_spore_blossom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 82,
|
||||||
|
"name": "ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 83,
|
||||||
|
"name": "crimson_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 84,
|
||||||
|
"name": "warped_spore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 85,
|
||||||
|
"name": "spore_blossom_air"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 86,
|
||||||
|
"name": "dripping_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 87,
|
||||||
|
"name": "falling_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 88,
|
||||||
|
"name": "landing_obsidian_tear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 89,
|
||||||
|
"name": "reverse_portal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 90,
|
||||||
|
"name": "white_ash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 91,
|
||||||
|
"name": "small_flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 92,
|
||||||
|
"name": "snowflake"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 93,
|
||||||
|
"name": "dripping_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 94,
|
||||||
|
"name": "falling_dripstone_lava"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 95,
|
||||||
|
"name": "dripping_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 96,
|
||||||
|
"name": "falling_dripstone_water"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 97,
|
||||||
|
"name": "glow_squid_ink"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 98,
|
||||||
|
"name": "glow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 99,
|
||||||
|
"name": "wax_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 100,
|
||||||
|
"name": "wax_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "electric_spark"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 102,
|
||||||
|
"name": "scrape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 103,
|
||||||
|
"name": "shriek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 104,
|
||||||
|
"name": "egg_crack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 105,
|
||||||
|
"name": "dust_plume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 106,
|
||||||
|
"name": "trial_spawner_detection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 107,
|
||||||
|
"name": "trial_spawner_detection_ominous"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 108,
|
||||||
|
"name": "vault_connection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 109,
|
||||||
|
"name": "dust_pillar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 110,
|
||||||
|
"name": "ominous_spawning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 111,
|
||||||
|
"name": "raid_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 112,
|
||||||
|
"name": "trial_omen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 113,
|
||||||
|
"name": "block_crumble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 114,
|
||||||
|
"name": "firefly"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,465 @@
|
|||||||
|
{
|
||||||
|
"grass": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": 9470285
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 11983713
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"dark_forest"
|
||||||
|
],
|
||||||
|
"color": 1317381
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp",
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6975545
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 7832178
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"foliage": {
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"badlands",
|
||||||
|
"eroded_badlands",
|
||||||
|
"wooded_badlands"
|
||||||
|
],
|
||||||
|
"color": 10387789
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": 11983713
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": 9285927
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 8883574
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6975545
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"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": 4159204
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cherry_grove"
|
||||||
|
],
|
||||||
|
"color": 6141935
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"cold_ocean",
|
||||||
|
"deep_cold_ocean",
|
||||||
|
"snowy_beach",
|
||||||
|
"snowy_taiga"
|
||||||
|
],
|
||||||
|
"color": 4020182
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_frozen_ocean",
|
||||||
|
"frozen_ocean",
|
||||||
|
"frozen_river"
|
||||||
|
],
|
||||||
|
"color": 3750089
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"deep_lukewarm_ocean",
|
||||||
|
"lukewarm_ocean"
|
||||||
|
],
|
||||||
|
"color": 4566514
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"mangrove_swamp"
|
||||||
|
],
|
||||||
|
"color": 3832426
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"meadow"
|
||||||
|
],
|
||||||
|
"color": 937679
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"pale_garden"
|
||||||
|
],
|
||||||
|
"color": 7768221
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"swamp"
|
||||||
|
],
|
||||||
|
"color": 6388580
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"warm_ocean"
|
||||||
|
],
|
||||||
|
"color": 4445678
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"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": 773,
|
||||||
|
"minecraftVersion": "1.21.9",
|
||||||
|
"majorVersion": "1.21",
|
||||||
|
"releaseType": "release"
|
||||||
|
}
|
||||||
@@ -0,0 +1,914 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "usesPalettedChunks",
|
||||||
|
"description": "the chunk format uses local palettes",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mobSpawner",
|
||||||
|
"description": "spawner is called mob_spawner",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawner",
|
||||||
|
"description": "spawner is called spawner",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasElytraFlying",
|
||||||
|
"description": "the elytra exists and players can fly with it",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fireworkMetadataVarInt7",
|
||||||
|
"description": "firework attached entity metadata is at index 7 and is varint",
|
||||||
|
"versions": ["1.11", "1.13.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fireworkMetadataOptVarInt8",
|
||||||
|
"description": "firework attached entity metadata is at index 8 and is optvarint",
|
||||||
|
"versions": ["1.14", "1.16.5"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fireworkMetadataOptVarInt9",
|
||||||
|
"description": "firework attached entity metadata is at index 9 and is optvarint",
|
||||||
|
"versions": ["1.17", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fireworkNamePlural",
|
||||||
|
"description": "the firework entity used for elytra boosting is named fireworks_rocket",
|
||||||
|
"versions": ["1.11", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fireworkNameSingular",
|
||||||
|
"description": "the firework entity used for elytra boosting is named firework_rocket",
|
||||||
|
"versions": ["1.13", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockMetadata",
|
||||||
|
"description": "block metadata is encoded in a separate metadata",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockStateId",
|
||||||
|
"description": "block metadata is encoded as state id",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "creativeSleepNearMobs",
|
||||||
|
"description": "can sleep near mobs in creative",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fixedPointPosition",
|
||||||
|
"description": "Entity positions are represented with fixed point numbers",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "doublePosition",
|
||||||
|
"description": "Entity positions are represented with double",
|
||||||
|
"versions": [
|
||||||
|
"1.9",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fixedPointDelta",
|
||||||
|
"description": "Delta of position are represented with fixed point numbers",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fixedPointDelta128",
|
||||||
|
"description": "Delta of position are represented with fixed point numbers times 128",
|
||||||
|
"versions": [
|
||||||
|
"1.9",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "customChannelMCPrefixed",
|
||||||
|
"description": "custom channel are prefixed by MC|",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "customChannelIdentifier",
|
||||||
|
"description": "custom channel is an identifier starting in minecraft namespace",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dimensionDataIsAvailable",
|
||||||
|
"description": "dimensionData is available, providing an additional information about the current dimension",
|
||||||
|
"versions": ["1.17", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dimensionDataInCodec",
|
||||||
|
"description": "dimensionData like world height is exclusively in the codec in login packet",
|
||||||
|
"versions": ["1.19", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useItemWithBlockPlace",
|
||||||
|
"description": "use item is done with block place packet",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useItemWithOwnPacket",
|
||||||
|
"description": "use item is done with its own packet",
|
||||||
|
"versions": [
|
||||||
|
"1.9",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockPlaceHasHeldItem",
|
||||||
|
"description": "block_place packet has heldItem",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockPlaceHasHandAndIntCursor",
|
||||||
|
"description": "block_place packet has hand and int cursor",
|
||||||
|
"versions": ["1.9", "1.10.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockPlaceHasHandAndFloatCursor",
|
||||||
|
"description": "block_place packet has hand and float cursor",
|
||||||
|
"versions": ["1.11", "1.13.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockPlaceHasInsideBlock",
|
||||||
|
"description": "block_place packet has inside block",
|
||||||
|
"versions": [
|
||||||
|
"1.14",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "teleportUsesPositionPacket",
|
||||||
|
"description": "teleport is done using position packet",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "positionUpdateSentEveryTick",
|
||||||
|
"description": "the position is sent every tick",
|
||||||
|
"versions": ["1.8", "1.11.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "teleportUsesOwnPacket",
|
||||||
|
"description": "teleport is done using its own packet",
|
||||||
|
"versions": [
|
||||||
|
"1.9",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "oneBlockForSeveralVariations",
|
||||||
|
"description": "one block of several variations",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockSchemeIsFlat",
|
||||||
|
"description": "all variations of a packet have their own id",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tabCompleteHasNoToolTip",
|
||||||
|
"description": "tab complete doesn't have a tool tip",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tabCompleteHasAToolTip",
|
||||||
|
"description": "tab complete has a tool tip",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "effectAreMinecraftPrefixed",
|
||||||
|
"description": "effect are prefixed by minecraft:",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "effectAreNotPrefixed",
|
||||||
|
"description": "effect are not prefixed",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemsAreAlsoBlocks",
|
||||||
|
"description": "items are also blocks",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemsAreNotBlocks",
|
||||||
|
"description": "items are not block",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fishingBobberCorrectlyNamed",
|
||||||
|
"description": "the fishing hook entity is named fishing_bobber",
|
||||||
|
"versions": [
|
||||||
|
"1.14",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "editBookIsPluginChannel",
|
||||||
|
"description": "book editing is handled through plugin channels",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasEditBookPacket",
|
||||||
|
"description": "book editing is handled through a packet with the updated book item",
|
||||||
|
"versions": ["1.13", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "editBookPacketUsesNbt",
|
||||||
|
"description": "edit_book packet sends a new book item (with its NBT containing page data) to server",
|
||||||
|
"versions": ["1.13", "1.17"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "clientUpdateBookIdWhenSign",
|
||||||
|
"description": "when sending MC|BSign, item type should be written_book",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useMCTrSel",
|
||||||
|
"description": "select trade through plugin channel MC|TrSel",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useMCTrList",
|
||||||
|
"description": "receive trade list through plugin channel MC|TrList",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usetraderlist",
|
||||||
|
"description": "receive trade list through plugin channel usetrader_list",
|
||||||
|
"versions": ["1.13", "1.13.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "doesntHaveOffHandSlot",
|
||||||
|
"description": "doesn't have an off-hand slot",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "multiBlockChangeHasTrustEdges",
|
||||||
|
"description": "multi block changes has trust edges field",
|
||||||
|
"versions": ["1.16", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dimensionIsAnInt",
|
||||||
|
"description": "dimension is an int (the index of an enum)",
|
||||||
|
"versions": ["1.8", "1.15.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dimensionIsAString",
|
||||||
|
"description": "dimension is a string (the dimension is the same as the world name)",
|
||||||
|
"versions": ["1.16", "1.16.1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dimensionIsAWorld",
|
||||||
|
"description": "dimension is an nbt compound",
|
||||||
|
"versions": ["1.16.2", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "doesntHaveChestType",
|
||||||
|
"description": "chests don't have a type property",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesAdvCdm",
|
||||||
|
"description": "packet MC|AdvCmd was incorrectly spelled in 1.8 as MC|AdvCdm",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesAdvCmd",
|
||||||
|
"description": "uses MC|AdvCmd to set command block information",
|
||||||
|
"versions": ["1.9", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "indexesVillagerRecipes",
|
||||||
|
"description": "gives a index for each trade in a villagers metadata",
|
||||||
|
"versions": ["1.8", "1.11.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasAttackCooldown",
|
||||||
|
"description": "if there is a cooldown after attacks to deal full damage",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesLoginPacket",
|
||||||
|
"description": "uses the login packet as defined in mcData",
|
||||||
|
"versions": ["1.16", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesMultiblockSingleLong",
|
||||||
|
"description": "in the multi_block_change packet is stored as a single number",
|
||||||
|
"versions": [
|
||||||
|
"1.16.2",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesMultiblock3DChunkCoords",
|
||||||
|
"description": "in the multi_block_change packet, all 3 axis coords are defined",
|
||||||
|
"versions": [
|
||||||
|
"1.16.2",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "setBlockUsesMetadataNumber",
|
||||||
|
"description": "the parameter metadata of the setblock command is a number",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useMCItemName",
|
||||||
|
"description": "send item name for anvil using plugin channel MC|TrList",
|
||||||
|
"versions": ["1.8", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "selectingTradeMovesItems",
|
||||||
|
"description": "selecting a trade automatically puts the required items into trading slots",
|
||||||
|
"versions": [
|
||||||
|
"1.14",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "resourcePackUsesHash",
|
||||||
|
"description": "resource pack uses hash validation",
|
||||||
|
"versions": ["1.8", "1.9.4"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "resourcePackUsesUUID",
|
||||||
|
"description": "resource pack uses UUID identification",
|
||||||
|
"versions": ["1.20.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lessCharsInChat",
|
||||||
|
"description": "max chars in chat",
|
||||||
|
"versions": ["1.8", "1.10.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "teamUsesChatComponents",
|
||||||
|
"description": "teams use chatcomponents for formatting",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "teamUsesScoreboard",
|
||||||
|
"description": "teams use scoreboard_team packet",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "enderCrystalNameEndsInErNoCaps",
|
||||||
|
"description": "this is when the end_crystal's entity name is ender_crystal",
|
||||||
|
"versions": ["1.11", "1.12.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "enderCrystalNameNoCapsWithUnderscore",
|
||||||
|
"description": "this is when the end_crystal's entity name is end_crystal",
|
||||||
|
"versions": [
|
||||||
|
"1.14",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityNameUpperCaseNoUnderscore",
|
||||||
|
"description": "this is when some entities names would be captialized and appended without underscores like 'Boat' or 'ArmorStand'",
|
||||||
|
"versions": ["1.8", "1.10.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityNameLowerCaseNoUnderscore",
|
||||||
|
"description": "this is when some entity names are lowercase and appended without underscores like 'armorstand' or 'endercrystal'",
|
||||||
|
"versions": ["1.13", "1.13.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "transactionPacketExists",
|
||||||
|
"description": "this is when the description packet existed",
|
||||||
|
"versions": ["1.8", "1.16.5"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stateIdUsed",
|
||||||
|
"description": "starting in 1.17.1, actionId has been replaced with stateId",
|
||||||
|
"versions": [
|
||||||
|
"1.17.1",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "actionIdUsed",
|
||||||
|
"description": "pre 1.17, actionId is used",
|
||||||
|
"versions": ["1.8", "1.16.5"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "setSlotAsTransaction",
|
||||||
|
"description": "use setslot as transaction instead of just hoping it'll work",
|
||||||
|
"versions": [
|
||||||
|
"1.17",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "armAnimationBeforeUse",
|
||||||
|
"description": "arm animation packet sent before use entity packet",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tallWorld",
|
||||||
|
"description": "world y defaults to starts at -64 and ends at 384",
|
||||||
|
"versions": [
|
||||||
|
"1.18",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sendStringifiedSignText",
|
||||||
|
"description": "sign text send when updating signs is send as stringified strings",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesBlockStates",
|
||||||
|
"description": "uses block states for block identification instead of block ID + metadata",
|
||||||
|
"versions": [
|
||||||
|
"1.13",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "effectNamesMatchRegistryName",
|
||||||
|
"description": "effect names match their registry names rather than legacy names",
|
||||||
|
"versions": [
|
||||||
|
"1.17",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "shieldSlot",
|
||||||
|
"description": "shields are equipped in the off-hand slot",
|
||||||
|
"versions": [
|
||||||
|
"1.9",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "village&pillageInventoryWindows",
|
||||||
|
"description": "inventory windows introduced in Village & Pillage update",
|
||||||
|
"versions": [
|
||||||
|
"1.14",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "netherUpdateInventoryWindows",
|
||||||
|
"description": "inventory windows introduced in Nether Update",
|
||||||
|
"versions": [
|
||||||
|
"1.16",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "unloadChunkByEmptyChunk",
|
||||||
|
"description": "Chunk unloading is done by sending an empty chunk",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "unloadChunkDirect",
|
||||||
|
"description": "Chunk unloading is done by sending directly an unload chunk packet",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityCamelCase",
|
||||||
|
"description": "entity names are in camel case",
|
||||||
|
"versions": ["1.8", "1.10.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entitySnakeCase",
|
||||||
|
"description": "entity name are in snake case",
|
||||||
|
"versions": ["1.11", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "respawnIsPayload",
|
||||||
|
"description": "respawn field is payload",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "respawnIsActionId",
|
||||||
|
"description": "respawn field is action id",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attachStackEntity",
|
||||||
|
"description": "attach is used to stack entities",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "setPassengerStackEntity",
|
||||||
|
"description": "set passengers is used to stack entities",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "theFlattening",
|
||||||
|
"description": "many items got merged, separated or renamed",
|
||||||
|
"versions": ["1.13", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockPlaceHasIntCursor",
|
||||||
|
"description": "block_place packet has int cursor",
|
||||||
|
"versions": ["1.8", "1.10.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "updateViewPosition",
|
||||||
|
"description": "the client's chunk position must be updated to render chunks correctly",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lightSentSeparately",
|
||||||
|
"description": "chunk light data is sent in a separate packet",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "difficultySentSeparately",
|
||||||
|
"description": "game difficulty is sent separately from the login packet",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "biomesSentSeparately",
|
||||||
|
"description": "biomes sent in own packet",
|
||||||
|
"versions": ["1.15", "1.17_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "acknowledgePlayerDigging",
|
||||||
|
"description": "player digging packets should be responded to",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "multiTypeSigns",
|
||||||
|
"description": "there are 6 types of signs based on the different trees",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityMetadataSentSeparately",
|
||||||
|
"description": "entity metadata is sent separately from the spawn packets",
|
||||||
|
"versions": ["1.15", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "attributeSnakeCase",
|
||||||
|
"description": "entity attributes are in snake case",
|
||||||
|
"versions": ["1.16", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "allEntityEquipmentInOne",
|
||||||
|
"description": "entity equipment packet contains all equipment slots instead of just one",
|
||||||
|
"versions": ["1.16", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityMCPrefixed",
|
||||||
|
"description": "entity prefixed with minecraft: on this versions",
|
||||||
|
"versions": ["1.12", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nbtOnMetadata",
|
||||||
|
"description": "in never versions its nbt but in 1.8 its on metadata",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "theShulkerBoxes",
|
||||||
|
"description": "added shulker boxes to the game",
|
||||||
|
"versions": ["1.13", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "metadataIxOfItem",
|
||||||
|
"description": "item.metadata[this_ix] will be the item that was dropped on the ground",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"value": 8,
|
||||||
|
"versions": ["1.17_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 7,
|
||||||
|
"versions": ["1.14_major", "1.16_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 6,
|
||||||
|
"versions": ["1.10_major", "1.13_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 5,
|
||||||
|
"version": "1.9_major"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 8,
|
||||||
|
"version": "1.8_major"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemSerializationWillOnlyUsePresent",
|
||||||
|
"description": "item serialization in [even] newer versions uses present field [exclusively] to show nullability rather than sending blockId as -1",
|
||||||
|
"versions": ["1.14_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemSerializationAllowsPresent",
|
||||||
|
"description": "item serialization in newer versions uses present field to show nullability rather or sending blockId as -1 can be used",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemSerializationUsesBlockId",
|
||||||
|
"description": "item serialization in older versions uses blockId field to show nullability by setting blockId to -1",
|
||||||
|
"versions": ["1.8_major", "1.12_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "saveDurabilityAsDamage",
|
||||||
|
"description": "in newer versions, an nbt key called 'Damage' is used to store durability",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nbtNameForEnchant",
|
||||||
|
"description": "what the nbt key for enchants is",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"value": "Enchantments",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "ench",
|
||||||
|
"versions": ["1.8_major", "1.12_major"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "booksUseStoredEnchantments",
|
||||||
|
"description": "Enchanted books store enchantment data in a separate NBT tag called StoredEnchantments",
|
||||||
|
"versions": ["1.8_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "typeOfValueForEnchantLevel",
|
||||||
|
"description": "type of value that stores enchant lvl in the nbt",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"value": "string",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "short",
|
||||||
|
"versions": ["1.8_major", "1.12_major"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "whereDurabilityIsSerialized",
|
||||||
|
"description": "where the durability is saved in nbt",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"value": "Damage",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "metadata",
|
||||||
|
"versions": ["1.8_major", "1.12_major"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemLoreIsAString",
|
||||||
|
"description": "An item's custom Lore is stored as a string in NBT, in older versions it's a list of strings",
|
||||||
|
"versions": ["1.14_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnEggsUseInternalIdInNbt",
|
||||||
|
"description": "in older versions, spawn eggs have a field in their nbt called 'internalId' which tells what entity they will spawn",
|
||||||
|
"versions": ["1.8_major", "1.8_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnEggsUseEntityTagInNbt",
|
||||||
|
"description": "in older versions, spawn eggs have a key in their nbt called EntityTag which is an object with a field called id, which is an identifier like 'minecraft:cow' that tells the client what mob this egg will spawn",
|
||||||
|
"versions": ["1.9_major", "1.12_major"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnEggsHaveSpawnedEntityInName",
|
||||||
|
"description": "in newer versions, spawn eggs have the entity they spawn in their name, ex: 'squid_spawn_egg'",
|
||||||
|
"versions": ["1.13_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "signedChat",
|
||||||
|
"description": "starting in 1.19 chat messages generally carry a cryptographic signature, `packet_chat` has been replaced clientbound by `packet_player_chat` and `packet_system_chat` and serverbound by `packet_chat_message`",
|
||||||
|
"versions": ["1.19_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "signatureEncryption",
|
||||||
|
"description": "allows for usage of `signature` instead of verifyToken in serverbound packet_encryption_begin",
|
||||||
|
"versions": ["1.19", "1.19.2"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "profileKeySignatureV2",
|
||||||
|
"description": "uses `signatureV2` public key signature",
|
||||||
|
"versions": [
|
||||||
|
"1.19.2",
|
||||||
|
"latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "clientboundChatHasSender",
|
||||||
|
"description": "clientbound chat packet contains message sender's UUID",
|
||||||
|
"versions": ["1.16_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "consolidatedEntitySpawnPacket",
|
||||||
|
"description": "One packet to add living and non-living entities",
|
||||||
|
"versions": ["1.19", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "chainedChatWithHashing",
|
||||||
|
"description": "Signed messages are ordered and depend on previous messages, and message payloads are hashed before generating a signature",
|
||||||
|
"version": "1.19.2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "useChatSessions",
|
||||||
|
"description": "Users generate a session with a unique ID upon login. Chat messages are signed using this ID and an index that is increased with each message",
|
||||||
|
"versions": ["1.19.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "playerInfoActionIsBitfield",
|
||||||
|
"description": "The player_info packet may contain multiple actions in one packet. The actions field is a bitfield signifying what actions are included",
|
||||||
|
"versions": ["1.19.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "removedNamedSoundEffectPacket",
|
||||||
|
"description": "The named_sound_effect packet was removed and you must use the expanded sound_effect packet",
|
||||||
|
"versions": ["1.19.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "clientsideChatFormatting",
|
||||||
|
"description": "Chat messages are formatted on the client side",
|
||||||
|
"versions": ["1.19_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityMetadataHasLong",
|
||||||
|
"description": "There exists a serializer of type long for entity metadata",
|
||||||
|
"versions": ["1.19.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasBundlePacket",
|
||||||
|
"description": "Has a Bundle Packet to group packets for processing at once",
|
||||||
|
"versions": ["1.19.4", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mcDataHasEntityMetadata",
|
||||||
|
"description": "Entity Metadata is defined in mcdata",
|
||||||
|
"versions": ["1.19.4", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "multiSidedSigns",
|
||||||
|
"description": "Signs can have text on the front and back",
|
||||||
|
"versions": ["1.20", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "explicitMaxDurability",
|
||||||
|
"description": "Items with maximum durability have explicit NBT data Damage:0",
|
||||||
|
"versions": ["1.15_major", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "newLightingDataFormat",
|
||||||
|
"description": "in 1.17, light encoding changed to handle new world height",
|
||||||
|
"versions": ["1.17", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasConfigurationState",
|
||||||
|
"description": "in 1.20.2, a new configuration state was added to allow configuration after login",
|
||||||
|
"versions": ["1.20.2", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "unifiedPlayerAndEntitySpawnPacket",
|
||||||
|
"description": "Players and entities spawn with the same spawn_entity packet",
|
||||||
|
"versions": ["1.20.2", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "chatPacketsUseNbtComponents",
|
||||||
|
"description": "Chat message packets use NBT to serialize chat components instead of JSON",
|
||||||
|
"versions": ["1.20.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "seperateSignedChatCommandPacket",
|
||||||
|
"description": "Signed chat commands use new `packet_chat_command_signed` packet",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnRespawnWorldDataField",
|
||||||
|
"description": "Spawn and respawn packet now use shared worldState type for their data, and dimensions are now integers",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "updatedParticlesPacket",
|
||||||
|
"description": "Particle packet structure contains uses strings instead of integers in protocol",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "segmentedRegistryCodecData",
|
||||||
|
"description": "Codec data is now split into multiple NBTs by ID instead of one",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemsWithComponents",
|
||||||
|
"description": "New Item schema",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "positionPacketHasBitflags",
|
||||||
|
"description": "positionPacketHasBitflags",
|
||||||
|
"versions": ["1.20.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasExecuteCommand",
|
||||||
|
"description": "Support the execute command",
|
||||||
|
"versions": ["1.14", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "chatTypeIsHolder",
|
||||||
|
"description": "The chat `type` field in the `player_chat` packet now is a Holder type",
|
||||||
|
"versions": ["1.21", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "registryDataIsMandatory",
|
||||||
|
"description": "The server needs to send the registry data to the client before sending the finish_configuration packet",
|
||||||
|
"versions": ["1.21", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "newPlayerInputPacket",
|
||||||
|
"description": "New player_input packet for movements, which replaces steer_vehicle",
|
||||||
|
"versions": ["1.21.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "noAckOnCreateSetSlotPacket",
|
||||||
|
"description": "Server does not send ack on creative_set_slot packets",
|
||||||
|
"versions": ["1.21.3", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "titleUsesLegacyPackets",
|
||||||
|
"description": "title system uses legacy title packets",
|
||||||
|
"versions": ["1.8", "1.17"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "titleUsesNewPackets",
|
||||||
|
"description": "title system uses new set_title_text and set_title_subtitle packets",
|
||||||
|
"versions": ["1.17.1", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "playsoundUsesResourceLocation",
|
||||||
|
"description": "the /playsound command uses resource location syntax",
|
||||||
|
"versions": ["1.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "noteBlockNameIsNoteBlock",
|
||||||
|
"description": "the note block is named 'note_block'",
|
||||||
|
"versions": ["1.13", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "usesOldSoundPacket",
|
||||||
|
"description": "uses the old sound packet format",
|
||||||
|
"versions": ["1.8", "1.8.9"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "chatGlobalIndexAndChecksum",
|
||||||
|
"description": "chatGlobalIndexAndChecksum",
|
||||||
|
"versions": ["1.21.5", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "entityActionUsesStringMapper",
|
||||||
|
"description": "entity_action packet uses string mappings instead of numeric actionId",
|
||||||
|
"versions": ["1.21.6", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "spawnPositionIsGlobal",
|
||||||
|
"description": "spawn position includes a dimension component",
|
||||||
|
"versions": ["1.21.9", "latest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gameRuleUsesResourceLocation",
|
||||||
|
"description": "gamerule names use resource location syntax",
|
||||||
|
"versions": ["1.21.11", "latest"]
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,73 @@
|
|||||||
|
[
|
||||||
|
"0.30c",
|
||||||
|
"1.7",
|
||||||
|
"1.8",
|
||||||
|
"15w40b",
|
||||||
|
"1.9",
|
||||||
|
"1.9.1-pre2",
|
||||||
|
"1.9.2",
|
||||||
|
"1.9.4",
|
||||||
|
"16w20a",
|
||||||
|
"1.10-pre1",
|
||||||
|
"1.10",
|
||||||
|
"1.10.1",
|
||||||
|
"1.10.2",
|
||||||
|
"16w35a",
|
||||||
|
"1.11",
|
||||||
|
"1.11.2",
|
||||||
|
"17w15a",
|
||||||
|
"17w18b",
|
||||||
|
"1.12-pre4",
|
||||||
|
"1.12",
|
||||||
|
"1.12.1",
|
||||||
|
"1.12.2",
|
||||||
|
"17w50a",
|
||||||
|
"1.13",
|
||||||
|
"1.13.1",
|
||||||
|
"1.13.2-pre1",
|
||||||
|
"1.13.2-pre2",
|
||||||
|
"1.13.2",
|
||||||
|
"1.14",
|
||||||
|
"1.14.1",
|
||||||
|
"1.14.3",
|
||||||
|
"1.14.4",
|
||||||
|
"1.15",
|
||||||
|
"1.15.1",
|
||||||
|
"1.15.2",
|
||||||
|
"20w13b",
|
||||||
|
"20w14a",
|
||||||
|
"1.16-rc1",
|
||||||
|
"1.16",
|
||||||
|
"1.16.1",
|
||||||
|
"1.16.2",
|
||||||
|
"1.16.3",
|
||||||
|
"1.16.4",
|
||||||
|
"1.16.5",
|
||||||
|
"21w07a",
|
||||||
|
"1.17",
|
||||||
|
"1.17.1",
|
||||||
|
"1.18",
|
||||||
|
"1.18.1",
|
||||||
|
"1.18.2",
|
||||||
|
"1.19",
|
||||||
|
"1.19.2",
|
||||||
|
"1.19.3",
|
||||||
|
"1.19.4",
|
||||||
|
"1.20",
|
||||||
|
"1.20.1",
|
||||||
|
"1.20.2",
|
||||||
|
"1.20.3",
|
||||||
|
"1.20.4",
|
||||||
|
"1.20.5",
|
||||||
|
"1.20.6",
|
||||||
|
"1.21",
|
||||||
|
"1.21.1",
|
||||||
|
"1.21.3",
|
||||||
|
"1.21.4",
|
||||||
|
"1.21.5",
|
||||||
|
"1.21.6",
|
||||||
|
"1.21.8",
|
||||||
|
"1.21.9",
|
||||||
|
"1.21.10",
|
||||||
|
"1.21.11"
|
||||||
|
]
|
||||||
@@ -12,7 +12,7 @@ package data
|
|||||||
type VersionInfo struct {
|
type VersionInfo struct {
|
||||||
MinecraftVersion string
|
MinecraftVersion string
|
||||||
Version int32
|
Version int32
|
||||||
DataVersion int
|
DataVersion int32
|
||||||
UsesNetty bool
|
UsesNetty bool
|
||||||
MajorVersion string
|
MajorVersion string
|
||||||
ReleaseType string
|
ReleaseType string
|
||||||
@@ -42,6 +42,17 @@ func LookUpVersionByProtocolVersion(version int32) (ret VersionInfo, err error)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func LookUpVersionByDataVersion(version int32) (ret VersionInfo, err error) {
|
||||||
|
for _, v := range ProtocolVersions {
|
||||||
|
if v.DataVersion == version {
|
||||||
|
ret = v
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = UnknownMinecraftVersionError
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
must(LoadJson("minecraft-data/data/pc/common/protocolVersions.json", &ProtocolVersions))
|
must(LoadJson("minecraft-data/pc/common/protocolVersions.json", &ProtocolVersions))
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -6,6 +6,8 @@ import (
|
|||||||
"github.com/admin-else/strom/nbt"
|
"github.com/admin-else/strom/nbt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: this is stupid loginPacket.json exists next version migrate to that
|
||||||
|
|
||||||
//go:embed registry/*
|
//go:embed registry/*
|
||||||
var Registry embed.FS
|
var Registry embed.FS
|
||||||
|
|
||||||
@@ -15,6 +17,6 @@ func LoadRegistry(name string) (n *nbt.Tag, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer r.Close()
|
defer r.Close()
|
||||||
n, err = nbt.ReadFile(r)
|
n, err = nbt.ReadUnstructuredFile(r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
+123
-53
@@ -7,20 +7,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
LoopsPerSecond = 100 // i dunno seems reasonable
|
|
||||||
TimePerLoop = time.Second / LoopsPerSecond
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Loop struct {
|
type Loop struct {
|
||||||
HandlerFunctions map[reflect.Type][]reflect.Value
|
HandlerFunctions map[reflect.Type][]reflect.Value
|
||||||
|
|
||||||
Ctx context.Context
|
Ctx context.Context
|
||||||
ErrChan chan error
|
Cancel context.CancelFunc
|
||||||
cancel context.CancelFunc
|
eventSources []reflect.SelectCase
|
||||||
}
|
}
|
||||||
|
|
||||||
type Unhandled struct {
|
type Unhandled struct {
|
||||||
@@ -31,18 +25,22 @@ type Anything struct {
|
|||||||
Val any
|
Val any
|
||||||
}
|
}
|
||||||
|
|
||||||
type (
|
// Close is fired when the loop shuts down.
|
||||||
Tick struct{}
|
type Close struct {
|
||||||
)
|
Reason error
|
||||||
|
}
|
||||||
|
|
||||||
// HandlerDoneErr will stop the event loop and return the error if provided.
|
// HandlerDoneErr will stop the event loop and return the error if provided.
|
||||||
type HandlerDoneErr struct {
|
type HandlerDoneErr struct {
|
||||||
Return error
|
Return error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close is fired when the loop shuts down.
|
// CallFunc is a special value that when fired with Loop.Fire it calls a function on the main loop
|
||||||
type Close struct {
|
// Its usefull for event event sources to call functions on the main loop
|
||||||
Reason error
|
// because event sources dont run on the main loop
|
||||||
|
type CallFunc struct {
|
||||||
|
F reflect.Value
|
||||||
|
Args []reflect.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e HandlerDoneErr) Error() string {
|
func (e HandlerDoneErr) Error() string {
|
||||||
@@ -53,9 +51,24 @@ func (e HandlerDoneErr) Unwrap() error {
|
|||||||
return e.Return
|
return e.Return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrDontForward will stop the event from being forwarded to other handlers, including anything handlers.
|
// MainHandlerErr is a special error used to tell the event loop that the main loop has exited
|
||||||
var ErrDontForward = errors.New("dont forward")
|
type MainHandlerErr struct {
|
||||||
|
Return error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e MainHandlerErr) Error() string {
|
||||||
|
return "MainHandlerErr"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e MainHandlerErr) Unwrap() error {
|
||||||
|
return e.Return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DontForwardErr will stop the event from being forwarded to other handlers, including anything handlers.
|
||||||
|
var DontForwardErr = errors.New("dont forward")
|
||||||
var WhileClosingErr = errors.New("error while closing")
|
var WhileClosingErr = errors.New("error while closing")
|
||||||
|
var ContextDoneErr = errors.New("context done")
|
||||||
|
var RecvNotOkErr = errors.New("recv not ok")
|
||||||
|
|
||||||
func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
|
func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
|
||||||
hv = reflect.ValueOf(h)
|
hv = reflect.ValueOf(h)
|
||||||
@@ -72,36 +85,64 @@ func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegisterEventSource registers an event source an event source is a channel this channel along with all other event sources will be reflect.Select 'ed until the loop closes
|
||||||
|
// here is an example of an event source function
|
||||||
|
//
|
||||||
|
// func() (chSending <-chan any) {
|
||||||
|
// ch := make(chan any)
|
||||||
|
// go func() {
|
||||||
|
// ctx := conn.Ctx
|
||||||
|
// for {
|
||||||
|
// select {
|
||||||
|
// case <-ctx.Done():
|
||||||
|
// return
|
||||||
|
// case eventt := <-otherSource:
|
||||||
|
// err = c.DoCommand(eventt)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }()
|
||||||
|
// chSending = ch
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
func (l *Loop) RegisterEventSource(ch <-chan any) {
|
||||||
|
l.eventSources = append(l.eventSources, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)})
|
||||||
|
}
|
||||||
|
|
||||||
// Register registers a handler that will not close the loop if it returns an error.
|
// Register registers a handler that will not close the loop if it returns an error.
|
||||||
// Instead, it will log it to slog.Error
|
// Instead, it will log it to slog.Error
|
||||||
// Warning: If a bad handler is passed in the program will panic.
|
// Warning: If a bad handler is passed in the program will panic.
|
||||||
func (l *Loop) Register(h any) {
|
func (l *Loop) Register(h any) {
|
||||||
l.RegisterCustomType(ValidateHandler(h))
|
eventType, hv := ValidateHandler(h)
|
||||||
|
l.RegisterLow(eventType, hv, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterCustomType registers a handler that will not close the loop if it returns an error.
|
// RegisterLow registers a handler that will not close the loop if it returns an error.
|
||||||
// Instead, it will log it to slog.Error
|
// Instead, it will log it to slog.Error
|
||||||
|
// This does not hold true for signaling errors like HandlerDoneErr or DontForwardErr
|
||||||
// Warning: If a bad handler is passed in the program will panic.
|
// Warning: If a bad handler is passed in the program will panic.
|
||||||
func (l *Loop) RegisterCustomType(eventType reflect.Type, hv reflect.Value) {
|
func (l *Loop) RegisterLow(eventType reflect.Type, hv reflect.Value, critical bool) {
|
||||||
handleFunc := func(packet any) error {
|
handleFunc := hv
|
||||||
v := hv.Call([]reflect.Value{reflect.ValueOf(packet)})[0]
|
if !critical {
|
||||||
if !v.IsNil() {
|
handleFunc = reflect.ValueOf(func(packet any) error {
|
||||||
slog.Error("handler failed", "err", v.Interface().(error))
|
v := hv.Call([]reflect.Value{reflect.ValueOf(packet)})[0]
|
||||||
}
|
if !v.IsNil() {
|
||||||
return nil
|
err := v.Interface().(error)
|
||||||
|
if errors.As(err, &HandlerDoneErr{}) || errors.Is(err, DontForwardErr) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
slog.Error("handler failed", "err", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
}
|
}
|
||||||
l.RegisterDirect(eventType, reflect.ValueOf(handleFunc))
|
l.HandlerFunctions[eventType] = append(l.HandlerFunctions[eventType], handleFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterCritical registers a handler that will close the loop if it returns an error.
|
// RegisterCritical registers a handler that will close the loop if it returns an error.
|
||||||
// Warning: If a bad handler is passed in the program will panic.
|
// Warning: If a bad handler is passed in the program will panic.
|
||||||
func (l *Loop) RegisterCritical(h any) {
|
func (l *Loop) RegisterCritical(h any) {
|
||||||
eventType, hv := ValidateHandler(h)
|
eventType, hv := ValidateHandler(h)
|
||||||
l.RegisterDirect(eventType, hv)
|
l.HandlerFunctions[eventType] = append(l.HandlerFunctions[eventType], hv)
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Loop) RegisterDirect(k reflect.Type, h reflect.Value) {
|
|
||||||
l.HandlerFunctions[k] = append(l.HandlerFunctions[k], h)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
|
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
|
||||||
@@ -112,7 +153,7 @@ func (l *Loop) FireFound(event any) (found bool, err error) {
|
|||||||
errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0]
|
errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0]
|
||||||
if !errV.IsNil() {
|
if !errV.IsNil() {
|
||||||
err = errV.Interface().(error)
|
err = errV.Interface().(error)
|
||||||
err = errors.Join(fmt.Errorf("event handler failed at: %s(%T)", handler.Type().In(0), event), err)
|
err = errors.Join(fmt.Errorf("event handler failed at: %T", event), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,56 +163,85 @@ func (l *Loop) FireFound(event any) (found bool, err error) {
|
|||||||
|
|
||||||
// Fire dispatches the provided event to all appropriate handlers and invokes fallback handlers if the event is unhandled.
|
// Fire dispatches the provided event to all appropriate handlers and invokes fallback handlers if the event is unhandled.
|
||||||
func (l *Loop) Fire(event any) (err error) {
|
func (l *Loop) Fire(event any) (err error) {
|
||||||
|
err, isErr := event.(error)
|
||||||
|
if isErr {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = nil
|
||||||
|
|
||||||
|
f, isCallFunc := event.(CallFunc)
|
||||||
|
if isCallFunc {
|
||||||
|
errV := f.F.Call(f.Args)[0].Interface()
|
||||||
|
if errV != nil {
|
||||||
|
err = errV.(error)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
found, err := l.FireFound(event)
|
found, err := l.FireFound(event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, ErrDontForward) {
|
if errors.Is(err, DontForwardErr) {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !found {
|
if !found {
|
||||||
_, err = l.FireFound(Unhandled{event})
|
found, err = l.FireFound(Unhandled{event})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err = l.FireFound(Anything{event})
|
found, err = l.FireFound(Anything{event})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Loop) startLoop() (err error) {
|
func (l *Loop) ContextDoneListener() (chSending <-chan any) {
|
||||||
|
ch := make(chan any)
|
||||||
|
go func() {
|
||||||
|
<-l.Ctx.Done()
|
||||||
|
ch <- ContextDoneErr
|
||||||
|
}()
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Loop) IsTypeRegistered(t reflect.Type) bool {
|
||||||
|
_, ok := l.HandlerFunctions[t]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Loop) StartLoop() (err error) {
|
||||||
_ = *l // exit early on nil loop
|
_ = *l // exit early on nil loop
|
||||||
|
l.RegisterEventSource(l.ContextDoneListener())
|
||||||
for {
|
for {
|
||||||
tickStartTime := time.Now()
|
_, v, ok := reflect.Select(l.eventSources)
|
||||||
err = l.Fire(Tick{})
|
if !ok {
|
||||||
|
err = RecvNotOkErr
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = l.Fire(v.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
time.Sleep(TimePerLoop - time.Since(tickStartTime))
|
|
||||||
}
|
}
|
||||||
if errors.Is(err, HandlerDoneErr{}) {
|
var contextDoneErr HandlerDoneErr
|
||||||
err = errors.Unwrap(err)
|
if errors.As(err, &contextDoneErr) {
|
||||||
|
err = contextDoneErr.Return
|
||||||
}
|
}
|
||||||
closeErr := l.Fire(Close{err})
|
closeErr := l.Fire(Close{err})
|
||||||
if closeErr != nil {
|
if closeErr != nil {
|
||||||
err = errors.Join(err, errors.Join(WhileClosingErr, closeErr))
|
err = errors.Join(err, errors.Join(WhileClosingErr, closeErr))
|
||||||
}
|
}
|
||||||
return
|
l.Cancel()
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Loop) Start() (err error) {
|
|
||||||
go func() {
|
|
||||||
l.ErrChan <- l.startLoop()
|
|
||||||
}()
|
|
||||||
err = <-l.ErrChan
|
|
||||||
l.cancel()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLoop() (l *Loop) {
|
func NewLoop() (l *Loop) {
|
||||||
|
return NewLoopCtx(context.Background())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLoopCtx(ctx context.Context) (l *Loop) {
|
||||||
l = &Loop{}
|
l = &Loop{}
|
||||||
l.ErrChan = make(chan error)
|
l.Ctx, l.Cancel = context.WithCancel(ctx)
|
||||||
l.Ctx, l.cancel = context.WithCancel(context.Background())
|
|
||||||
l.HandlerFunctions = make(map[reflect.Type][]reflect.Value)
|
l.HandlerFunctions = make(map[reflect.Type][]reflect.Value)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-32
@@ -2,7 +2,6 @@ package event
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -10,36 +9,26 @@ type Stdin struct {
|
|||||||
Val string
|
Val string
|
||||||
}
|
}
|
||||||
|
|
||||||
type StdinHandler struct {
|
func StartListingStdin(l *Loop) {
|
||||||
*Loop
|
l.RegisterEventSource(func() (chSending <-chan any) {
|
||||||
stdInChan chan Stdin
|
ch := make(chan any)
|
||||||
Ctx context.Context
|
go func() {
|
||||||
}
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
ctx := l.Ctx
|
||||||
func (s *StdinHandler) OnTick(_ Tick) (err error) {
|
for scanner.Scan() {
|
||||||
select {
|
select {
|
||||||
case stdin := <-s.stdInChan:
|
case <-ctx.Done():
|
||||||
err = s.Fire(Stdin{stdin.Val})
|
return
|
||||||
default:
|
default:
|
||||||
|
ch <- Stdin{scanner.Text()}
|
||||||
}
|
}
|
||||||
return
|
}
|
||||||
}
|
if err := scanner.Err(); err != nil {
|
||||||
|
ch <- err
|
||||||
func (s *StdinHandler) ScanJob() {
|
}
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
}()
|
||||||
for scanner.Scan() {
|
chSending = ch
|
||||||
select {
|
return
|
||||||
case <-s.Ctx.Done():
|
}())
|
||||||
return
|
|
||||||
default:
|
|
||||||
s.stdInChan <- Stdin{scanner.Text()}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (s *StdinHandler) OnStart() (err error) {
|
|
||||||
s.RegisterCritical(s.OnTick)
|
|
||||||
s.stdInChan = make(chan Stdin)
|
|
||||||
go s.ScanJob()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+61
-24
@@ -1,6 +1,8 @@
|
|||||||
package event
|
package event
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -19,39 +21,54 @@ type OnceTask struct {
|
|||||||
type Timer struct {
|
type Timer struct {
|
||||||
Once []OnceTask
|
Once []OnceTask
|
||||||
Interval []IntervalTask
|
Interval []IntervalTask
|
||||||
Active bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Timer) Tick() (err error) {
|
func (t *Timer) Trigger(ch chan any) {
|
||||||
if !t.Active {
|
triggerAt := time.Time{}
|
||||||
|
found := false
|
||||||
|
iOnce, iInterval := -1, -1
|
||||||
|
|
||||||
|
for i, oTask := range t.Once {
|
||||||
|
if oTask.Trigger.Before(triggerAt) || triggerAt.IsZero() {
|
||||||
|
found = true
|
||||||
|
triggerAt = oTask.Trigger
|
||||||
|
iOnce = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, iTask := range t.Interval {
|
||||||
|
if iTask.LastTrigger.Add(iTask.Interval).Before(triggerAt) || triggerAt.IsZero() {
|
||||||
|
found = true
|
||||||
|
triggerAt = iTask.LastTrigger.Add(iTask.Interval)
|
||||||
|
iOnce = -1
|
||||||
|
iInterval = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for i, task := range t.Interval {
|
now := time.Now()
|
||||||
if time.Since(task.LastTrigger) >= task.Interval {
|
sleepFor := triggerAt.Sub(now)
|
||||||
task.LastTrigger = time.Now()
|
//slog.Debug("sleep next", "dur", sleepFor)
|
||||||
err = task.F()
|
time.Sleep(sleepFor)
|
||||||
if err != nil {
|
if iOnce >= 0 {
|
||||||
return
|
ch <- CallFunc{F: reflect.ValueOf(t.Once[iOnce].F), Args: []reflect.Value{}}
|
||||||
}
|
t.Once = slices.Delete(t.Once, iOnce, iOnce+1)
|
||||||
}
|
return
|
||||||
t.Interval[i] = task
|
|
||||||
}
|
}
|
||||||
for i, task := range t.Once {
|
if iInterval >= 0 {
|
||||||
if task.Trigger.After(time.Now()) {
|
t.Interval[iInterval].LastTrigger = triggerAt
|
||||||
err = task.F()
|
ch <- CallFunc{F: reflect.ValueOf(t.Interval[iInterval].F), Args: []reflect.Value{}}
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
t.Once = slices.Delete(t.Once, i, i)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
panic("unreachable")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Timer) Every(interval time.Duration, f func() error) {
|
func (t *Timer) Every(interval time.Duration, f func() error) {
|
||||||
t.Interval = append(t.Interval, IntervalTask{
|
t.Interval = append(t.Interval, IntervalTask{
|
||||||
F: f,
|
F: f,
|
||||||
Interval: interval,
|
Interval: interval,
|
||||||
|
LastTrigger: time.Now(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,3 +78,23 @@ func (t *Timer) In(interval time.Duration, f func() error) {
|
|||||||
Trigger: time.Now().Add(interval),
|
Trigger: time.Now().Add(interval),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Timer) MakeEventSource(ctx context.Context) (chSending <-chan any) {
|
||||||
|
ch := make(chan any)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
t.Trigger(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
chSending = ch
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Timer) Start(c *Loop) {
|
||||||
|
c.RegisterEventSource(t.MakeEventSource(c.Ctx))
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,80 @@
|
|||||||
|
package anvil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/data"
|
||||||
|
"github.com/admin-else/strom/level"
|
||||||
|
"github.com/admin-else/strom/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Chunk struct {
|
||||||
|
DataVersion int32
|
||||||
|
Heightmaps map[string][]int64
|
||||||
|
InhabitedTime int64
|
||||||
|
XPos, YPos, ZPos int32
|
||||||
|
Sections []Section
|
||||||
|
}
|
||||||
|
|
||||||
|
const McPrefix = "minecraft:"
|
||||||
|
|
||||||
|
func (c Chunk) ToStorage(version string) (toChunk *level.Chunk, err error) {
|
||||||
|
f := level.MakeBlockFormat(version)
|
||||||
|
toChunk = new(level.Chunk)
|
||||||
|
|
||||||
|
toChunk.Sections = make([]level.Section, len(c.Sections))
|
||||||
|
for i, s := range c.Sections {
|
||||||
|
pallete := make([]int32, len(s.BlockStates.Palette))
|
||||||
|
for j, p := range s.BlockStates.Palette {
|
||||||
|
pallete[j], err = data.StateIdFromBlocKAndStateMap(version, strings.TrimPrefix(p.Name, McPrefix), p.Properties)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// this is probably fine
|
||||||
|
uintSlice := unsafe.Slice((*uint64)(unsafe.Pointer(unsafe.SliceData(s.BlockStates.Data))), len(s.BlockStates.Data))
|
||||||
|
|
||||||
|
toChunk.Sections[i].Blocks, err = f.Import(uintSlice, util.BpeByNum(float64(len(s.BlockStates.Palette))), pallete)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
toChunk.Sections[i].BlockCount = int16(level.CountStorage(toChunk.Sections[i].Blocks, 0))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, s := range c.Sections {
|
||||||
|
pallete := make([]int32, len(s.Biomes.Palette))
|
||||||
|
for j, p := range s.Biomes.Palette {
|
||||||
|
var b *data.Biome
|
||||||
|
b, ok := data.LookupBiomeByName(version, strings.TrimPrefix(p, McPrefix))
|
||||||
|
if !ok {
|
||||||
|
err = data.UnknownBiomeNameErr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pallete[j] = b.Id
|
||||||
|
}
|
||||||
|
// this is probably fine
|
||||||
|
uintSlice := unsafe.Slice((*uint64)(unsafe.Pointer(unsafe.SliceData(s.Biomes.Data))), len(s.Biomes.Data))
|
||||||
|
|
||||||
|
toChunk.Sections[i].Biomes, err = f.Import(uintSlice, util.BpeByNum(float64(len(pallete))), pallete)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type Section struct {
|
||||||
|
Y int8
|
||||||
|
BlockStates struct {
|
||||||
|
Data []int64 `nbt:"data,omitempty"`
|
||||||
|
Palette []struct {
|
||||||
|
Name string
|
||||||
|
Properties map[string]string `nbt:"properties,omitempty"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Biomes struct {
|
||||||
|
Data []int64 `nbt:"data,omitempty"`
|
||||||
|
Palette []string
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
package anvil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/admin-else/strom/nbt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Level struct {
|
||||||
|
ClearWeatherTime int32 `nbt:"clearWeatherTime"`
|
||||||
|
DataPacks DataPacks
|
||||||
|
DayTime int64
|
||||||
|
WanderingTraderSpawnChance int32
|
||||||
|
GameType int32
|
||||||
|
WorldGenSettings WorldGenSettings
|
||||||
|
ScheduledEvents []interface{}
|
||||||
|
WasModded bool
|
||||||
|
ThunderTime int32 `nbt:"thunderTime"`
|
||||||
|
Difficulty int8
|
||||||
|
DragonFight DragonFight
|
||||||
|
Initialized bool
|
||||||
|
AllowCommands bool `nbt:"allowCommands"`
|
||||||
|
Thundering bool
|
||||||
|
LastPlayed int64
|
||||||
|
GameRules map[string]interface{}
|
||||||
|
RainTime int32 `nbt:"rainTime"`
|
||||||
|
DataVersion int32
|
||||||
|
Version Version
|
||||||
|
WanderingTraderSpawnDelay int32
|
||||||
|
Hardcore bool
|
||||||
|
Spawn Spawn
|
||||||
|
Raining bool
|
||||||
|
Player Player
|
||||||
|
DifficultyLocked bool
|
||||||
|
LevelName string
|
||||||
|
Time int64
|
||||||
|
ServerBrands []string
|
||||||
|
CustomBossEvents map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type DataPacks struct {
|
||||||
|
Enabled []string
|
||||||
|
Disabled []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type WorldGenSettings struct {
|
||||||
|
BonusChest bool
|
||||||
|
Seed int64
|
||||||
|
GenerateFeatures bool
|
||||||
|
Dimensions map[string]Dimension
|
||||||
|
}
|
||||||
|
|
||||||
|
type Dimensions struct {
|
||||||
|
Overworld Dimension
|
||||||
|
Nether Dimension
|
||||||
|
End Dimension
|
||||||
|
}
|
||||||
|
|
||||||
|
type Dimension struct {
|
||||||
|
Generator Generator
|
||||||
|
Type string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Generator struct {
|
||||||
|
Type string
|
||||||
|
Settings string
|
||||||
|
BiomeSource BiomeSource
|
||||||
|
}
|
||||||
|
|
||||||
|
type BiomeSource struct {
|
||||||
|
Preset string `nbt:"preset,omitempty"`
|
||||||
|
Type string
|
||||||
|
}
|
||||||
|
|
||||||
|
type DragonFight struct {
|
||||||
|
NeedsStateScanning bool
|
||||||
|
Gateways []int32
|
||||||
|
DragonKilled bool
|
||||||
|
PreviouslyKilled bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Version struct {
|
||||||
|
Snapshot bool
|
||||||
|
Series string
|
||||||
|
Id int32
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Spawn struct {
|
||||||
|
Dimension string
|
||||||
|
Yaw float32
|
||||||
|
Pos [3]int32
|
||||||
|
Pitch float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Player struct {
|
||||||
|
XpLevel int32
|
||||||
|
HurtTime int16
|
||||||
|
DeathTime int16
|
||||||
|
XpTotal int32
|
||||||
|
FoodExhaustionLevel float32
|
||||||
|
RecipeBook RecipeBook
|
||||||
|
Fire int16
|
||||||
|
Brain Brain
|
||||||
|
XpSeed int32
|
||||||
|
XpP float32
|
||||||
|
EnderItems []interface{}
|
||||||
|
Invulnerable bool
|
||||||
|
Pos [3]float64
|
||||||
|
Inventory []InventoryItem
|
||||||
|
SleepTimer int16
|
||||||
|
Abilities Abilities
|
||||||
|
PlayerGameType int32
|
||||||
|
SeenCredits bool
|
||||||
|
FoodSaturationLevel float32
|
||||||
|
FallDistance float64
|
||||||
|
OnGround bool
|
||||||
|
Dimension string
|
||||||
|
PortalCooldown int32
|
||||||
|
Motion [3]float64
|
||||||
|
IgnoreFallDamageFromCurrentExplosion bool
|
||||||
|
Rotation [2]float32
|
||||||
|
CurrentImpulseContextResetGraceTime int32
|
||||||
|
WardenSpawnTracker WardenSpawnTracker
|
||||||
|
PreviousPlayerGameType int32
|
||||||
|
Attributes []Attribute
|
||||||
|
HurtByTimestamp int32
|
||||||
|
UUID [4]int32
|
||||||
|
Score int32
|
||||||
|
DataVersion int32
|
||||||
|
FoodLevel int32
|
||||||
|
SpawnExtraParticlesOnFall bool
|
||||||
|
SelectedItemSlot int32
|
||||||
|
FoodTickTimer int32
|
||||||
|
FallFlying bool
|
||||||
|
AbsorptionAmount float32
|
||||||
|
Health float32
|
||||||
|
Air int16
|
||||||
|
}
|
||||||
|
|
||||||
|
type RecipeBook struct {
|
||||||
|
Recipes []string
|
||||||
|
ToBeDisplayed []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Brain struct {
|
||||||
|
Memories map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type InventoryItem struct {
|
||||||
|
Count int32
|
||||||
|
Slot int8
|
||||||
|
Id string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Abilities struct {
|
||||||
|
Invulnerable bool
|
||||||
|
Mayfly bool
|
||||||
|
Instabuild bool
|
||||||
|
WalkSpeed float32
|
||||||
|
MayBuild bool
|
||||||
|
Flying bool
|
||||||
|
FlySpeed float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type WardenSpawnTracker struct {
|
||||||
|
WarningLevel int32
|
||||||
|
TicksSinceLastWarning int32
|
||||||
|
CooldownTicks int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Attribute struct {
|
||||||
|
Id string
|
||||||
|
Base float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadLevelData(r io.Reader) (l Level, err error) {
|
||||||
|
var lDataWrapped struct{ Data Level }
|
||||||
|
err = nbt.ReadFile(r, &lDataWrapped)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
l = lDataWrapped.Data
|
||||||
|
return
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user