111 Commits
Author SHA1 Message Date
admin-elseandGitHub 2ed4498181 Merge pull request #2 from admin-else/feat/data-cli
add `data` command and utility functions for type assertion and map k…
2026-05-05 15:32:03 +02:00
adman 0316b0aa09 add data command and utility functions for type assertion and map key access 2026-05-05 15:28:40 +02:00
adman 94d15258d8 change Proxy.Data to pointer for consistency with nbt.Tag usage 2026-05-03 16:31:14 +02:00
adman ab03b36b4f add bounds checking for ChunkAt and add TimeAt function to ChunkHeader 2026-05-03 16:28:50 +02:00
adman da0c3c6f14 add bounds checking for ChunkAt and add TimeAt function to ChunkHeader 2026-05-03 16:28:37 +02:00
adman b01e482bc5 add file validation to print_nbt command 2026-05-03 16:23:01 +02:00
adman c560966177 add WriteUnstructuredFilePath function to simplify file writing logic 2026-05-03 16:22:17 +02:00
adman 66f86c5599 update Go version to 1.25 in GitHub Actions workflow 2026-05-03 15:32:58 +02:00
adman 5a2bfcb1c1 Merge remote-tracking branch 'origin/master' 2026-05-03 15:30:06 +02:00
admin-elseandGitHub b34f8d68ff Create Go CI workflow in GitHub Actions
Add GitHub Actions workflow for Go project build and test
2026-05-03 15:29:52 +02:00
adman c98472165b update connection initialization logic 2026-05-03 15:14:47 +02:00
adman 4888a07ebb update connection initialization to use LatestVersion instead of EarliestVersion 2026-05-03 15:11:08 +02:00
adman a9bf30a609 remove unused TestStorageImportBpeNotAvailable test because there is resizing for mca level storage to block format 2026-05-03 15:00:05 +02:00
adman 35030601e1 fix PrettyToNbt test to include empty text field and improve error formatting 2026-05-03 14:58:04 +02:00
adman 66f32b4cd2 update minecraft data binding to make binary smaller 2026-05-03 14:39:31 +02:00
adman e6d08dccbb working on disk to chunk packet test 2026-05-03 14:33:13 +02:00
adman 8a4f203621 add WithoutOnlineMode setting to login server and update usage in packet inspector 2026-05-02 16:16:54 +02:00
adman 69e230a79c add 'version' subcommand to display build information 2026-05-02 16:07:31 +02:00
adman 1a5f4f4f8e remove unused address parameter from LoginRaw and fix biome palette length calculation 2026-05-02 15:52:06 +02:00
adman d0844dd6b5 anvil chunk to real chunk conversion things 2026-05-02 01:36:29 +02:00
adman d8e36aa6fa make login server respect online mode settings 2026-05-02 00:21:26 +02:00
adman 6781e4c16d support upsizing storage on import if bpe not available 2026-05-02 00:21:17 +02:00
adman fccba0248a this makes errors that happen during login display 2026-05-01 22:17:51 +02:00
adman 52b3c1ce17 Revert "add export-ignore rules for proto_generator and tools directories in .gitattributes"
This reverts commit 3511cd2699.
2026-05-01 16:49:10 +02:00
adman 3511cd2699 add export-ignore rules for proto_generator and tools directories in .gitattributes 2026-05-01 16:48:26 +02:00
adman 6dddccab7f fix gitattributes 2026-05-01 16:45:58 +02:00
adman 9109d77f98 add export-ignore rules for test files in .gitattributes 2026-05-01 16:44:08 +02:00
adman 9eec1e8370 clone only needed minecraft-data 2026-05-01 16:33:28 +02:00
adman 96481da0a4 refactor: add context propagation to connection and event systems 2026-04-29 23:38:24 +02:00
adman 159437c1ca fix: handle empty kick status message properly in Status protocol state 2026-04-29 18:48:10 +02:00
adman 3d34ad59e9 allow for custom kick status message 2026-04-29 18:31:36 +02:00
adman 4878c6cc7b fix logger not being and other thing maybe 2026-04-28 22:25:36 +02:00
adman 719a3bacd8 Add fuzz testing for Section encoding/decoding with multiple edge cases 2026-04-28 09:31:35 +02:00
adman ce0c58e7c5 refactor shit 2026-04-27 01:50:45 +02:00
adman 8a4e44760e fix: TestRealStorageResizeDirect and TestRealStorageDirectModeNoPalette bugs
- resize() was writing to wrong array (r.data instead of newData) and using
  wrong elementsPerLong during resize loop
- TestRealStorageDirectModeNoPalette had invalid test data (0x1FFFF needs
  bpe>=17 but test used bpe=9)
2026-04-27 01:45:41 +02:00
adman e810a60848 111111 2026-04-27 01:26:56 +02:00
adman 0981339028 1111 2026-04-27 01:03:47 +02:00
adman 7746dd8ee9 real storage 2026-04-27 00:17:56 +02:00
adman 378b78312e storage=????? 2026-04-25 18:00:10 +02:00
adman bd3139754d add import storage and test 2026-04-23 22:36:34 +02:00
adman 841d91b91d storage 2026-04-23 21:30:17 +02:00
adman 895ec53698 parse the world 2026-04-21 22:24:12 +02:00
adman f6001c8b22 mojang cant get their cases straight
i had to implement like 4 cases just  to parse that file
2026-04-21 09:38:14 +02:00
adman d87c362270 anvil testdata 2026-04-21 08:35:40 +02:00
adman 236e414242 anvil start 2026-04-21 08:35:24 +02:00
adman 5222390b65 nbt changes 2026-04-21 08:35:18 +02:00
adman dc04fdc7d0 remove redundant bool arg 2026-04-20 23:38:02 +02:00
adman 8de34dfda1 mapstructure 2026-04-20 23:16:01 +02:00
adman 997594d7c3 fix chunk sections being one 2026-04-20 20:23:25 +02:00
adman c83a777eac mojang is weird i tell them 1 and they turn it into 4 2026-04-20 18:12:25 +02:00
adman 65fea61667 chunk builder 2026-04-19 17:41:13 +02:00
adman c2777f2ca9 chunk serialization fixes and fuzzies 2026-04-19 16:10:09 +02:00
adman dcb42f1970 chunk serialization 2026-04-19 11:04:37 +02:00
adman 7a2081f0a0 support kicker status 2026-04-17 21:51:47 +02:00
adman acc583f694 more logging 2026-04-14 09:20:00 +02:00
adman 76409d07a3 fix smart convert panic 2026-04-12 23:16:36 +02:00
adman bb89730781 fix bug with treshold 0 never compressing instead of always compressing 2026-04-12 23:16:19 +02:00
adman 9f6b1f6bcf more logging for status cli so you can debug address resolution 2026-04-12 23:15:50 +02:00
adman 1b8a9677c6 reduce binary size by not bundling bedrock data 2026-04-12 23:15:16 +02:00
adman 79ab13ca4b server encryption and online mode 2026-04-10 17:28:13 +02:00
adman 3cc414185a implement compression threshold setting 2026-04-10 14:30:35 +02:00
adman fe4a17dce2 Shutdownserver error 2026-04-08 00:31:05 +02:00
adman 891551f9dd simple api cli 2026-04-06 00:34:28 +02:00
adman 8fb48c6ea9 add version flag to status cmd 2026-04-05 23:39:08 +02:00
adman ec25c28061 Remove unused import 2026-04-05 23:38:57 +02:00
adman 45287f47d2 Expose lower register functions
Added RegisterLow and RegisterUntilLow

this gives more power to the user
2026-04-05 16:07:05 +02:00
adman 4cc4b6af5b fix earlies version
It was the latest version i dunno what i was thinking?
2026-04-05 16:05:33 +02:00
adman 09e6760d61 fix timer drifting off and delte old code 2026-04-05 16:04:53 +02:00
adman ca74a3c3d4 more explicit asyncPackets switch 2026-04-04 19:32:46 +02:00
adman fbc3693219 Revert "Send event"
This reverts commit abb0fa4d37.
2026-04-04 15:31:30 +02:00
Admin Else fb69fd93ec my code broke after i changed this last time and this fixed it 2026-04-03 19:01:33 +02:00
Admin Else a3a3c3714e Maybe fix contex done err 2026-04-03 19:00:52 +02:00
Admin Else 9294631c6c fix race condition 2026-04-03 09:05:24 +02:00
Admin Else 293f0b1eed this makes debugging easier trust me 2026-04-03 09:05:10 +02:00
Admin Else 272dcb4d36 warn instead of crash on unexpected packet 2026-04-02 18:49:50 +02:00
Admin Else abb0fa4d37 Send event 2026-04-02 18:49:30 +02:00
Admin Else e5212624af text components prints with tags 2026-04-01 16:43:47 +02:00
Admin Else 35772aca03 Cancle and signal errors shouldnt be voided 2026-03-31 21:57:04 +02:00
Admin Else 819d89b26e Delte schematic server 2026-03-31 17:04:44 +02:00
Admin Else 958102e43c fixes for config in 1.21.11 2026-03-31 16:51:07 +02:00
Admin Else f749d3bfc5 Add support for empty registry serving 2026-03-29 21:16:28 +02:00
Admin Else d207cf52cf 1.21.11 data registry 2026-03-29 21:09:05 +02:00
Admin Else 420ec5611c Fix register(critical)?untilLatest being inverted 2026-03-29 21:08:48 +02:00
Admin Else 4bfaf9b7c5 Remove redundant return 2026-03-29 21:07:23 +02:00
Admin Else 48beb861e8 Add vscode folder to gitignore 2026-03-29 17:50:33 +02:00
Admin Else 9fd2f517d9 Fix SmartConver for slices 2026-03-29 17:34:41 +02:00
Admin Else 1b5af63b75 Fix packet inspector 2026-03-29 17:13:11 +02:00
Admin Else dfb847eb3e Fix registry hunter 2026-03-29 17:11:40 +02:00
Admin Else 322bd77f7f Remove redundant return statement 2026-03-29 14:35:46 +02:00
Admin Else aefe850281 Fix send debug message 2026-03-29 14:21:54 +02:00
Admin Else 57f88f2176 Fix debug message 2026-03-29 14:20:02 +02:00
Admin Else 8dd566c0da Add DebugPrintPackets and fix not translating packet id 2026-03-29 14:15:31 +02:00
Admin Else e386a45d96 Add basic README.md 2026-03-28 18:14:41 +01:00
adman 8f771166a6 better unknown command text 2026-03-27 13:16:16 +01:00
adman 5d6a1a25ea fix packet spy 2026-03-27 13:09:07 +01:00
adman ca33185f20 fix LookupPacketInfoByType for undecoable 2026-03-27 12:59:10 +01:00
adman e921e9e9d2 fix routine thing 2026-03-27 00:03:01 +01:00
adman 7337068d86 more performance 2026-03-26 23:34:30 +01:00
adman 9983062522 fix timer 2026-03-26 22:39:48 +01:00
adman 4fd5324064 new event system (again) 2026-03-26 22:19:03 +01:00
adman df0e5e354b more srv stuff and packet inspetor 2026-03-25 19:00:18 +01:00
adman 23b5a5d9b7 move cmd to more sensible location 2026-03-25 14:53:38 +01:00
adman 46770ed980 Account changes
- now supports custom enviorments/servers
- cleaner code imo
2026-03-25 14:48:42 +01:00
adman 6179c5f6b6 fix proxy 2026-03-24 22:36:14 +01:00
adman f758a10575 performance fix 2026-03-24 21:50:52 +01:00
adman 41d1ab4c45 performance 2026-03-24 17:46:23 +01:00
adman 032fa26927 fix some race conditions 2026-03-22 22:51:29 +01:00
adman f7401a287e minecraft data raw code 2026-03-22 19:49:37 +01:00
adman 2d1e8ef4f6 go get does not support git submodules 2026-03-22 19:48:21 +01:00
adman 2802cc36ce litematic format 2026-03-22 19:45:05 +01:00
adman ea024fe808 look at the code if you want to know what i did 2026-03-22 00:35:07 +01:00
306 changed files with 851835 additions and 883 deletions
+2
View File
@@ -0,0 +1,2 @@
**/*_test.go export-ignore
**/testdata export-ignore
+28
View File
@@ -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 ./...
+1
View File
@@ -2,3 +2,4 @@
.idea/
.failed_packets/
tools/.*/
.vscode/
-3
View File
@@ -1,3 +0,0 @@
[submodule "data/minecraft-data"]
path = data/minecraft-data
url = git@github.com:PrismarineJS/minecraft-data.git
+5
View File
@@ -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
View File
@@ -9,32 +9,40 @@ import (
"strings"
"time"
"github.com/admin-else/strom/crypto"
"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 {
*Servers
Name string
Uuid uuid.UUID
Ygg string
}
const (
BaseUrlApi = "https://api.minecraftservices.com"
)
func (a *Account) doMcApiRequest(method string, url string, from any, to any) (err error) {
var b []byte
if method != "GET" {
b, err = json.Marshal(from)
if err != nil {
return err
return
}
}
r, err := http.NewRequest(method, url, bytes.NewReader(b))
if err != nil {
return err
return
}
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)
if err != nil {
return err
return
}
defer resp.Body.Close()
if !(resp.StatusCode >= 200 && resp.StatusCode <= 299) {
return fmt.Errorf("bad status code %v", resp.StatusCode)
}
b, err = io.ReadAll(resp.Body)
if err != nil {
return err
return
}
err = json.Unmarshal(b, to)
if err != nil {
return err
return
}
return nil
return
}
type PlayerKeys struct {
@@ -73,7 +82,7 @@ type PlayerKeys struct {
}
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
}
@@ -90,10 +99,12 @@ func (a *Account) JoinServer(serverId string) (err error) {
if err != nil {
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 {
return
}
defer resp.Body.Close()
if resp.StatusCode != 204 {
body, err = io.ReadAll(resp.Body)
if err != nil {
@@ -112,17 +123,10 @@ type NameChangResp struct {
}
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
}
func NewOfflineAccount(name string) *Account {
return &Account{
Name: name,
Uuid: crypto.FromOfflinePlayer(name),
}
}
// PlayerProfile represents the player's profile information
type PlayerProfile struct {
ID string `json:"id"`
@@ -143,7 +147,7 @@ type PlayerProfile struct {
// QueryProfile queries the player's profile
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
}
@@ -181,7 +185,7 @@ type PlayerAttributes struct {
// QueryAttributes queries the player's attributes
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
}
@@ -194,7 +198,7 @@ type ModifyAttributesRequest struct {
// ModifyAttributes modifies the player's attributes
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
}
@@ -205,24 +209,23 @@ type BlockedUsers struct {
// GetBlocklist gets the list of blocked users
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
}
// CheckNameAvailability checks if a name is available
type NameAvailability struct {
Status string `json:"status"` // DUPLICATE, AVAILABLE, NOT_ALLOWED
}
// CheckNameAvailability checks if a name is available
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
}
// ChangeName changes the player's name
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
}
@@ -234,19 +237,19 @@ type ChangeSkinRequest struct {
// ChangeSkin changes the player's skin
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
}
// ResetSkin resets the player's skin to default
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
}
// HideCape hides the player's active cape
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
}
@@ -258,29 +261,53 @@ type ShowCapeRequest struct {
// ShowCape shows a specific cape
func (a *Account) ShowCape(capeID string) (profile PlayerProfile, err error) {
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
}
// CheckGiftCodeValidity checks if a gift code is valid
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)
if err != nil {
return false, err
return
}
r.Header.Set("Authorization", "Bearer "+a.Ygg)
resp, err := http.DefaultClient.Do(r)
if err != nil {
return false, err
return
}
defer resp.Body.Close()
// Returns HTTP 200 or 204 if valid, 404 if invalid
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
}
+10
View File
@@ -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),
}
}
+130
View File
@@ -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
View File
@@ -1,6 +1,7 @@
package client
import (
"context"
"net"
"github.com/admin-else/strom/proto"
@@ -22,15 +23,17 @@ func Connect(addr string) (ret *proto.Conn, err error) {
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
// when using this function.
// You must close the connection when you're done with it
func ConnectVersionLess(addr string) (ret *proto.Conn, err error) {
ret = &proto.Conn{}
ret.SetState(proto_base.Handshaking)
ret.SetCompressionThreshold(-1)
func ConnectVersionLessCtx(ctx context.Context, addr string) (ret *proto.Conn, err error) {
ret = proto.NewConnCtx(ctx)
ret.Actor = proto_base.Client
ret.Conn, err = net.Dial("tcp", addr)
ret.Conn, err = (&net.Dialer{}).DialContext(ctx, "tcp", addr)
if err != nil {
return
}
+3 -4
View File
@@ -3,7 +3,6 @@ package client
import (
"errors"
"fmt"
"log/slog"
"github.com/admin-else/strom/event"
"github.com/admin-else/strom/proto"
@@ -19,8 +18,8 @@ func (c *ConfigIgnorer) OnStart() (err error) {
return
}
func (c *ConfigIgnorer) Default(event event.Anything) (err error) {
slog.Debug("Config ignorer", "packet", fmt.Sprintf("%#v", event))
func (c *ConfigIgnorer) Default(e event.Anything) (err error) {
c.Log.Debug("Config ignorer", "packet", fmt.Sprintf("%#v", e))
return
}
@@ -56,7 +55,7 @@ func IgnoreConfig(c *proto.Conn) (err error) {
ci.RegisterUntilLatest(ci.OnPing)
ci.RegisterUntilLatest(ci.OnKeepAlive)
err = ci.Start()
err = ci.StartConn()
if err != nil {
err = errors.Join(err, errors.New("failed to ignore config"))
}
+1 -1
View File
@@ -106,7 +106,7 @@ func DoDnsSimple(in string) (out string, err error) {
if err != nil {
return
}
out = in
out = host + ":" + strconv.Itoa(int(portN))
if portN != 25565 {
return
}
+1
View File
@@ -13,6 +13,7 @@ func MakeHandshakePacket(c *proto.Conn, nextState proto_base.State) (p *v1_21_8.
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) {
p = &v1_21_8.HandshakingToServerPacketSetProtocol{NextState: int32(nextState), ProtocolVersion: s.ProtocolVersion}
var portStr string
+23 -16
View File
@@ -6,7 +6,6 @@ import (
"crypto/x509"
"encoding/json"
"errors"
"fmt"
"github.com/admin-else/strom/api"
"github.com/admin-else/strom/crypto"
@@ -42,11 +41,10 @@ func (k KickedDuringLoginErr) Error() string {
}
func (s *LoginClient) OnDefault(event event.Unhandled) (err error) {
err = fmt.Errorf("unexpected event: %#v", event)
return
}
func (s *LoginClient) OnCycle(_ event.Tick) (err error) {
if _, ok := event.Val.(proto_base.EncodeDecodeAble); !ok {
return
}
s.Log.Warn("unexpected packet during login client", "packet", event.Val)
return
}
@@ -127,18 +125,17 @@ func (s *LoginClient) OnStart() (err error) {
return
}
func Login(c *proto.Conn, account *api.Account) (err error) {
func LoginRaw(c *proto.Conn, account *api.Account) (err error) {
lc := &LoginClient{
Conn: c,
Account: account,
}
lc.RegisterCritical(lc.OnDefault)
lc.RegisterCritical(lc.OnCycle)
lc.RegisterCritical(lc.OnClose)
lc.RegisterUntilLatest(lc.OnCompress)
lc.RegisterUntilLatest(lc.OnEncrypt)
lc.RegisterUntilLatest(lc.OnDisconnect)
lc.RegisterUntilLatest(lc.OnSuccess)
lc.RegisterCriticalUntilLatest(lc.OnCompress)
lc.RegisterCriticalUntilLatest(lc.OnEncrypt)
lc.RegisterCriticalUntilLatest(lc.OnDisconnect)
lc.RegisterCriticalUntilLatest(lc.OnSuccess)
p, err := MakeHandshakePacket(lc.Conn, proto_base.Login)
if err != nil {
@@ -152,21 +149,31 @@ func Login(c *proto.Conn, account *api.Account) (err error) {
lc.SetState(proto_base.Login)
err = lc.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: lc.Account.Name, PlayerUUID: lc.Account.Uuid})
err = lc.Start()
err = lc.StartConn()
if err != nil {
err = errors.Join(FailedToLoginErr, err)
}
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)
if err != nil {
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 {
err = errors.Join(FailedToLoginErr, err)
return
}
c, err = Connect(connectTo)
if err != nil {
return
}
err = LoginRaw(c, account)
return
}
+18 -11
View File
@@ -1,6 +1,7 @@
package client
import (
"context"
"encoding/json"
"time"
@@ -19,10 +20,6 @@ type StatusClient struct {
DoPingRoundTripTime bool
}
func (s *StatusClient) OnStart() (err error) {
return
}
func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) {
s.Status = p.Response
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.
// So ignore the resource leak warning. And maybe attach a warn ignore comment
func StatusRaw(addr string) (s *StatusClient, err error) {
// So ignore the resource leak warning. And maybe attach a warn ignore comment.
// It does not resolve SRV records.
func StatusRaw(ctx context.Context, addr string) (s *StatusClient, err error) {
c, err := ConnectVersionLess(addr)
if err != nil {
return
@@ -55,9 +53,8 @@ func StatusRaw(addr string) (s *StatusClient, err error) {
s = &StatusClient{
Conn: c,
}
s.Loop = event.NewLoop()
s.RegisterUntilLatest(s.OnStatus)
s.RegisterUntilLatest(s.OnPong)
s.RegisterCriticalUntilLatest(s.OnStatus)
s.RegisterCriticalUntilLatest(s.OnPong)
p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
if err != nil {
@@ -74,11 +71,21 @@ func StatusRaw(addr string) (s *StatusClient, err error) {
return
}
func Status(addr string) (status server.StatusResponse, err error) {
s, err := StatusRaw(addr)
// StatusNoDns is like Status but does not resolve SRV records.
func StatusNoDns(addr string) (status server.StatusResponse, err error) {
s, err := StatusRaw(context.Background(), addr)
if err != nil {
return
}
err = json.Unmarshal([]byte(s.Status), &status)
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)
}
+60
View File
@@ -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
}
+118
View File
@@ -0,0 +1,118 @@
package data
import (
"encoding/json"
"fmt"
"maps"
"os"
"slices"
"github.com/admin-else/strom/data"
"github.com/admin-else/strom/proto_generated"
"github.com/admin-else/strom/util"
)
// strom data 1.21.11 blocks id 0 name => air
// {
// "id": 0,
// "name": "air",
// "displayName": "Air",
// "hardness": 0.0,
// "resistance": 0.0,
// "stackSize": 64,
// "diggable": false,
// "material": "default",
// "transparent": true,
// "emitLight": 0,
// "filterLight": 0,
// "defaultState": 0,
// "minStateId": 0,
// "maxStateId": 0,
// "states": [],
// "drops": [],
// "boundingBox": "empty"
// },
func Run(args []string) (err error) {
var dataValues any
switch len(args) {
case 0: // print available versions
dataValues = proto_generated.SupportedVersions
case 1: // print available data for version
dataValues = slices.Collect(maps.Keys(data.Paths.Data[args[0]]))
case 2:
err = data.LoadVersionedJson(args[0], args[1], &dataValues)
case 3:
err = data.LoadVersionedJson(args[0], args[1], &dataValues)
if err != nil {
return
}
var dataSlices []any
dataSlices, err = util.AssertTypeError[[]any](dataValues)
if err != nil {
return
}
var result = make([]any, len(dataSlices))
for _, v := range dataSlices {
var dataMap map[string]any
dataMap, err = util.AssertTypeError[map[string]any](v)
if err != nil {
return
}
var vToAppend any
vToAppend, err = util.MapGetError(dataMap, args[2])
if err != nil {
return
}
result = append(result, vToAppend)
}
dataValues = result
case 4, 5:
err = data.LoadVersionedJson(args[0], args[1], &dataValues)
if err != nil {
return
}
var dataSlices []any
dataSlices, err = util.AssertTypeError[[]any](dataValues)
if err != nil {
return
}
found := false
for _, v := range dataSlices {
var dataMap map[string]any
dataMap, err = util.AssertTypeError[map[string]any](v)
if err != nil {
return
}
if v2, ok := dataMap[args[2]]; ok {
if args[3] != fmt.Sprint(v2) {
continue
}
dataValues = dataMap
found = true
if len(args) == 5 {
dataValues, err = util.MapGetError(dataMap, args[4])
if err != nil {
return
}
}
break
}
}
if !found {
err = fmt.Errorf("not found")
return
}
default:
err = fmt.Errorf("too many arguments")
}
if err == nil {
e := json.NewEncoder(os.Stdout)
e.SetIndent("", " ")
err = e.Encode(dataValues)
return
}
return
}
+52
View File
@@ -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
}
+84
View File
@@ -0,0 +1,84 @@
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/data"
"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,
"data": data.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)
}
}
+129
View File
@@ -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
}
+53
View File
@@ -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
}
+98
View File
@@ -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
View File
@@ -1,5 +1,7 @@
package data
import "errors"
// [
//
// {
@@ -14,7 +16,7 @@ package data
// },
type Biome struct {
Id int
Id int32
Name string
Category string
Temperature float64
@@ -24,22 +26,35 @@ type Biome struct {
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
if ret, ok = BiomesCache[v]; ok {
return
}
var b []Biome
var b []*Biome
must(LoadVersionedJson(v, "biomes", &b))
BiomesCache[v] = 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) {
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
ok = true
return
+55 -37
View File
@@ -2,6 +2,7 @@ package data
import (
"errors"
"strconv"
)
// {
@@ -52,6 +53,7 @@ type BlockState struct {
}
var BlocksCache = make(map[string][]*Block)
var BlocksCacheIdMap = make(map[string]map[int32]*Block)
func BlocksForVersion(v string) (ret []*Block) {
var ok bool
@@ -65,23 +67,44 @@ func BlocksForVersion(v string) (ret []*Block) {
}
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) {
if b.MinStateId <= stateId && stateId <= b.MaxStateId {
if b.Name == name {
block = b
ok = true
return
}
}
return
}
func LookupBlockByName(version string, stateId int32) (block *Block, ok bool) {
for _, b := range BlocksForVersion(version) {
if b.MinStateId <= stateId && stateId <= b.MaxStateId {
block = b
ok = true
}
func StateIdFromBlocKAndStateMap(version string, name string, stateMap map[string]string) (stateId int32, err error) {
b, ok := LookupBlockByName(version, name)
if !ok {
err = BlockNotFoundErr
return
}
if stateMap == nil {
stateId = b.DefaultState
} else {
stateId, err = b.IdFromStateMap(stateMap)
}
return
}
@@ -92,7 +115,7 @@ var BadBlockStateTypeErr = errors.New("bad block state type")
var BadEnumErr = errors.New("bad enum")
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)
if !ok {
err = BlockNotFoundErr
@@ -101,19 +124,17 @@ func FromBlockState(version string, stateId int32) (b *Block, stateData map[stri
return
}
// TODO: mc stores these as strings so we will do the same
func mcDataBlockStateTypeParse(n int32, s *BlockState) (v any, err error) {
func mcDataBlockStateTypeParse(n int32, s *BlockState) (v string, err error) {
switch s.Type {
case "int":
v = n
v = strconv.Itoa(int(n))
case "enum":
v = s.Values[n]
case "bool":
if n == 0 { // MOJANK: 0 is true, 1 is false
v = true
v = "true"
} else if n == 1 {
v = false
v = "false"
} else {
err = InvalidBoolValueErr
}
@@ -123,35 +144,32 @@ func mcDataBlockStateTypeParse(n int32, s *BlockState) (v any, err error) {
return
}
func mcDataBlockStateTypeSerialize(v any, s *BlockState) (n int32, err error) {
switch t := v.(type) {
case int32:
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
func mcDataBlockStateTypeSerialize(v string, s *BlockState) (n int32, err error) {
if v == "true" {
return 0, nil
}
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
}
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 {
err = BlockStateOutOfRangeErr
return
}
ret = make(map[string]any)
ret = make(map[string]string)
stateId -= b.MinStateId
a := int32(1)
@@ -166,7 +184,7 @@ func (b *Block) StateMapFromId(stateId int32) (ret map[string]any, err error) {
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)
for i := range len(b.States) {
s := b.States[len(b.States)-1-i]
+7 -3
View File
@@ -4,9 +4,12 @@ import (
"embed"
"encoding/json"
"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
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) {
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 {
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)
return
+1 -1
View File
@@ -9,5 +9,5 @@ var Paths struct {
}
func init() {
must(LoadJson("minecraft-data/data/dataPaths.json", &Paths))
must(LoadJson("minecraft-data/dataPaths.json", &Paths))
}
+25
View File
@@ -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
+8
View File
@@ -1,5 +1,7 @@
package data
import "sync"
// {
// "id": 2,
// "name": "granite",
@@ -15,15 +17,21 @@ type Item struct {
}
var ItemsCache = make(map[string][]*Item)
var ItemsCacheMutex = &sync.RWMutex{}
func ItemsForVersion(v string) (ret []*Item) {
var ok bool
ItemsCacheMutex.RLock()
if ret, ok = ItemsCache[v]; ok {
ItemsCacheMutex.RUnlock()
return
}
ItemsCacheMutex.RUnlock()
var b []*Item
must(LoadVersionedJson(v, "items", &b))
ItemsCacheMutex.Lock()
ItemsCache[v] = b
ItemsCacheMutex.Unlock()
return b
}
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
}
]
+652
View File
@@ -0,0 +1,652 @@
[
{
"id": 0,
"name": "badlands",
"category": "mesa",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Badlands",
"color": 7254527
},
{
"id": 1,
"name": "bamboo_jungle",
"category": "jungle",
"temperature": 0.95,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Bamboo Jungle",
"color": 7842047
},
{
"id": 2,
"name": "basalt_deltas",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Basalt Deltas",
"color": 0
},
{
"id": 3,
"name": "beach",
"category": "beach",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Beach",
"color": 7907327
},
{
"id": 4,
"name": "birch_forest",
"category": "forest",
"temperature": 0.6,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Birch Forest",
"color": 8037887
},
{
"id": 5,
"name": "cherry_grove",
"category": "forest",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Cherry Grove",
"color": 8103167
},
{
"id": 6,
"name": "cold_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Cold Ocean",
"color": 8103167
},
{
"id": 7,
"name": "crimson_forest",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Crimson Forest",
"color": 0
},
{
"id": 8,
"name": "dark_forest",
"category": "forest",
"temperature": 0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Dark Forest",
"color": 7972607
},
{
"id": 9,
"name": "deep_cold_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Deep Cold Ocean",
"color": 8103167
},
{
"id": 10,
"name": "deep_dark",
"category": "underground",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Deep Dark",
"color": 7907327
},
{
"id": 11,
"name": "deep_frozen_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Deep Frozen Ocean",
"color": 8103167
},
{
"id": 12,
"name": "deep_lukewarm_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Deep Lukewarm Ocean",
"color": 8103167
},
{
"id": 13,
"name": "deep_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Deep Ocean",
"color": 8103167
},
{
"id": 14,
"name": "desert",
"category": "desert",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Desert",
"color": 7254527
},
{
"id": 15,
"name": "dripstone_caves",
"category": "underground",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Dripstone Caves",
"color": 7907327
},
{
"id": 16,
"name": "end_barrens",
"category": "the_end",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "end",
"displayName": "End Barrens",
"color": 0
},
{
"id": 17,
"name": "end_highlands",
"category": "the_end",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "end",
"displayName": "End Highlands",
"color": 0
},
{
"id": 18,
"name": "end_midlands",
"category": "the_end",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "end",
"displayName": "End Midlands",
"color": 0
},
{
"id": 19,
"name": "eroded_badlands",
"category": "mesa",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Eroded Badlands",
"color": 7254527
},
{
"id": 20,
"name": "flower_forest",
"category": "forest",
"temperature": 0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Flower Forest",
"color": 7972607
},
{
"id": 21,
"name": "forest",
"category": "forest",
"temperature": 0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Forest",
"color": 7972607
},
{
"id": 22,
"name": "frozen_ocean",
"category": "ocean",
"temperature": 0.0,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Frozen Ocean",
"color": 8364543
},
{
"id": 23,
"name": "frozen_peaks",
"category": "ice",
"temperature": -0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Frozen Peaks",
"color": 8756735
},
{
"id": 24,
"name": "frozen_river",
"category": "ice",
"temperature": 0.0,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Frozen River",
"color": 8364543
},
{
"id": 25,
"name": "grove",
"category": "forest",
"temperature": -0.2,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Grove",
"color": 8495359
},
{
"id": 26,
"name": "ice_spikes",
"category": "ice",
"temperature": 0.0,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Ice Spikes",
"color": 8364543
},
{
"id": 27,
"name": "jagged_peaks",
"category": "mountain",
"temperature": -0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Jagged Peaks",
"color": 8756735
},
{
"id": 28,
"name": "jungle",
"category": "jungle",
"temperature": 0.95,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Jungle",
"color": 7842047
},
{
"id": 29,
"name": "lukewarm_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Lukewarm Ocean",
"color": 8103167
},
{
"id": 30,
"name": "lush_caves",
"category": "underground",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Lush Caves",
"color": 8103167
},
{
"id": 31,
"name": "mangrove_swamp",
"category": "forest",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Mangrove Swamp",
"color": 7907327
},
{
"id": 32,
"name": "meadow",
"category": "mountain",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Meadow",
"color": 8103167
},
{
"id": 33,
"name": "mushroom_fields",
"category": "mushroom",
"temperature": 0.9,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Mushroom Fields",
"color": 7842047
},
{
"id": 34,
"name": "nether_wastes",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Nether Wastes",
"color": 0
},
{
"id": 35,
"name": "ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Ocean",
"color": 8103167
},
{
"id": 36,
"name": "old_growth_birch_forest",
"category": "forest",
"temperature": 0.6,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Old Growth Birch Forest",
"color": 8037887
},
{
"id": 37,
"name": "old_growth_pine_taiga",
"category": "taiga",
"temperature": 0.3,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Old Growth Pine Taiga",
"color": 8168447
},
{
"id": 38,
"name": "old_growth_spruce_taiga",
"category": "taiga",
"temperature": 0.25,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Old Growth Spruce Taiga",
"color": 8233983
},
{
"id": 39,
"name": "pale_garden",
"category": "none",
"temperature": 0.7,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Pale Garden",
"color": 12171705
},
{
"id": 40,
"name": "plains",
"category": "plains",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Plains",
"color": 7907327
},
{
"id": 41,
"name": "river",
"category": "river",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "River",
"color": 8103167
},
{
"id": 42,
"name": "savanna",
"category": "savanna",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Savanna",
"color": 7254527
},
{
"id": 43,
"name": "savanna_plateau",
"category": "savanna",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Savanna Plateau",
"color": 7254527
},
{
"id": 44,
"name": "small_end_islands",
"category": "the_end",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "end",
"displayName": "Small End Islands",
"color": 0
},
{
"id": 45,
"name": "snowy_beach",
"category": "beach",
"temperature": 0.05,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Snowy Beach",
"color": 8364543
},
{
"id": 46,
"name": "snowy_plains",
"category": "plains",
"temperature": 0.0,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Snowy Plains",
"color": 8364543
},
{
"id": 47,
"name": "snowy_slopes",
"category": "mountain",
"temperature": -0.3,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Snowy Slopes",
"color": 8560639
},
{
"id": 48,
"name": "snowy_taiga",
"category": "taiga",
"temperature": -0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Snowy Taiga",
"color": 8625919
},
{
"id": 49,
"name": "soul_sand_valley",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Soul Sand Valley",
"color": 0
},
{
"id": 50,
"name": "sparse_jungle",
"category": "jungle",
"temperature": 0.95,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Sparse Jungle",
"color": 7842047
},
{
"id": 51,
"name": "stony_peaks",
"category": "mountain",
"temperature": 1.0,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Stony Peaks",
"color": 7776511
},
{
"id": 52,
"name": "stony_shore",
"category": "beach",
"temperature": 0.2,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Stony Shore",
"color": 8233727
},
{
"id": 53,
"name": "sunflower_plains",
"category": "plains",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Sunflower Plains",
"color": 7907327
},
{
"id": 54,
"name": "swamp",
"category": "swamp",
"temperature": 0.8,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Swamp",
"color": 7907327
},
{
"id": 55,
"name": "taiga",
"category": "taiga",
"temperature": 0.25,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Taiga",
"color": 8233983
},
{
"id": 56,
"name": "the_end",
"category": "the_end",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "end",
"displayName": "The End",
"color": 0
},
{
"id": 57,
"name": "the_void",
"category": "none",
"temperature": 0.5,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "The Void",
"color": 8103167
},
{
"id": 58,
"name": "warm_ocean",
"category": "ocean",
"temperature": 0.5,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Warm Ocean",
"color": 8103167
},
{
"id": 59,
"name": "warped_forest",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Warped Forest",
"color": 0
},
{
"id": 60,
"name": "windswept_forest",
"category": "forest",
"temperature": 0.2,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Windswept Forest",
"color": 8233727
},
{
"id": 61,
"name": "windswept_gravelly_hills",
"category": "extreme_hills",
"temperature": 0.2,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Windswept Gravelly Hills",
"color": 8233727
},
{
"id": 62,
"name": "windswept_hills",
"category": "extreme_hills",
"temperature": 0.2,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Windswept Hills",
"color": 8233727
},
{
"id": 63,
"name": "windswept_savanna",
"category": "savanna",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Windswept Savanna",
"color": 7254527
},
{
"id": 64,
"name": "wooded_badlands",
"category": "mesa",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Wooded Badlands",
"color": 7254527
}
]
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+242
View File
@@ -0,0 +1,242 @@
[
{
"id": 0,
"name": "Speed",
"displayName": "Speed",
"type": "good"
},
{
"id": 1,
"name": "Slowness",
"displayName": "Slowness",
"type": "bad"
},
{
"id": 2,
"name": "Haste",
"displayName": "Haste",
"type": "good"
},
{
"id": 3,
"name": "MiningFatigue",
"displayName": "Mining Fatigue",
"type": "bad"
},
{
"id": 4,
"name": "Strength",
"displayName": "Strength",
"type": "good"
},
{
"id": 5,
"name": "InstantHealth",
"displayName": "Instant Health",
"type": "good"
},
{
"id": 6,
"name": "InstantDamage",
"displayName": "Instant Damage",
"type": "bad"
},
{
"id": 7,
"name": "JumpBoost",
"displayName": "Jump Boost",
"type": "good"
},
{
"id": 8,
"name": "Nausea",
"displayName": "Nausea",
"type": "bad"
},
{
"id": 9,
"name": "Regeneration",
"displayName": "Regeneration",
"type": "good"
},
{
"id": 10,
"name": "Resistance",
"displayName": "Resistance",
"type": "good"
},
{
"id": 11,
"name": "FireResistance",
"displayName": "Fire Resistance",
"type": "good"
},
{
"id": 12,
"name": "WaterBreathing",
"displayName": "Water Breathing",
"type": "good"
},
{
"id": 13,
"name": "Invisibility",
"displayName": "Invisibility",
"type": "good"
},
{
"id": 14,
"name": "Blindness",
"displayName": "Blindness",
"type": "bad"
},
{
"id": 15,
"name": "NightVision",
"displayName": "Night Vision",
"type": "good"
},
{
"id": 16,
"name": "Hunger",
"displayName": "Hunger",
"type": "bad"
},
{
"id": 17,
"name": "Weakness",
"displayName": "Weakness",
"type": "bad"
},
{
"id": 18,
"name": "Poison",
"displayName": "Poison",
"type": "bad"
},
{
"id": 19,
"name": "Wither",
"displayName": "Wither",
"type": "bad"
},
{
"id": 20,
"name": "HealthBoost",
"displayName": "Health Boost",
"type": "good"
},
{
"id": 21,
"name": "Absorption",
"displayName": "Absorption",
"type": "good"
},
{
"id": 22,
"name": "Saturation",
"displayName": "Saturation",
"type": "good"
},
{
"id": 23,
"name": "Glowing",
"displayName": "Glowing",
"type": "bad"
},
{
"id": 24,
"name": "Levitation",
"displayName": "Levitation",
"type": "bad"
},
{
"id": 25,
"name": "Luck",
"displayName": "Luck",
"type": "good"
},
{
"id": 26,
"name": "BadLuck",
"displayName": "Bad Luck",
"type": "bad"
},
{
"id": 27,
"name": "SlowFalling",
"displayName": "Slow Falling",
"type": "good"
},
{
"id": 28,
"name": "ConduitPower",
"displayName": "Conduit Power",
"type": "good"
},
{
"id": 29,
"name": "DolphinsGrace",
"displayName": "Dolphin's Grace",
"type": "good"
},
{
"id": 30,
"name": "BadOmen",
"displayName": "Bad Omen",
"type": "bad"
},
{
"id": 31,
"name": "HeroOfTheVillage",
"displayName": "Hero of the Village",
"type": "good"
},
{
"id": 32,
"name": "Darkness",
"displayName": "Darkness",
"type": "bad"
},
{
"id": 33,
"name": "TrialOmen",
"displayName": "Trial Omen",
"type": "bad"
},
{
"id": 34,
"name": "RaidOmen",
"displayName": "Raid Omen",
"type": "bad"
},
{
"id": 35,
"name": "WindCharged",
"displayName": "Wind Charged",
"type": "bad"
},
{
"id": 36,
"name": "Weaving",
"displayName": "Weaving",
"type": "bad"
},
{
"id": 37,
"name": "Oozing",
"displayName": "Oozing",
"type": "bad"
},
{
"id": 38,
"name": "Infested",
"displayName": "Infested",
"type": "bad"
},
{
"id": 39,
"name": "BreathOfTheNautilus",
"displayName": "Breath of the Nautilus",
"type": "good"
}
]
@@ -0,0 +1,980 @@
[
{
"id": 0,
"name": "aqua_affinity",
"displayName": "Aqua Affinity",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "head_armor",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 1,
"name": "bane_of_arthropods",
"displayName": "Bane of Arthropods",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"breach",
"density",
"impaling",
"sharpness",
"smite"
],
"category": "weapon",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 2,
"name": "binding_curse",
"displayName": "Curse of Binding",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": true,
"curse": true,
"exclude": [],
"category": "equippable",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 3,
"name": "blast_protection",
"displayName": "Blast Protection",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"fire_protection",
"projectile_protection",
"protection"
],
"category": "armor",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 4,
"name": "breach",
"displayName": "Breach",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"bane_of_arthropods",
"density",
"impaling",
"sharpness",
"smite"
],
"category": "mace",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 5,
"name": "channeling",
"displayName": "Channeling",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"riptide"
],
"category": "trident",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 6,
"name": "density",
"displayName": "Density",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"bane_of_arthropods",
"breach",
"impaling",
"sharpness",
"smite"
],
"category": "mace",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 7,
"name": "depth_strider",
"displayName": "Depth Strider",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"frost_walker"
],
"category": "foot_armor",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 8,
"name": "efficiency",
"displayName": "Efficiency",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "mining",
"weight": 10,
"tradeable": true,
"discoverable": true
},
{
"id": 9,
"name": "feather_falling",
"displayName": "Feather Falling",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "foot_armor",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 10,
"name": "fire_aspect",
"displayName": "Fire Aspect",
"maxLevel": 2,
"minCost": {
"a": 1,
"b": 1
},
"maxCost": {
"a": 1,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "fire_aspect",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 11,
"name": "fire_protection",
"displayName": "Fire Protection",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"blast_protection",
"projectile_protection",
"protection"
],
"category": "armor",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 12,
"name": "flame",
"displayName": "Flame",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "bow",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 13,
"name": "fortune",
"displayName": "Fortune",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"silk_touch"
],
"category": "mining_loot",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 14,
"name": "frost_walker",
"displayName": "Frost Walker",
"maxLevel": 2,
"minCost": {
"a": 1,
"b": 1
},
"maxCost": {
"a": 1,
"b": 1
},
"treasureOnly": true,
"curse": false,
"exclude": [
"depth_strider"
],
"category": "foot_armor",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 15,
"name": "impaling",
"displayName": "Impaling",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"bane_of_arthropods",
"breach",
"density",
"sharpness",
"smite"
],
"category": "trident",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 16,
"name": "infinity",
"displayName": "Infinity",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"mending"
],
"category": "bow",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 17,
"name": "knockback",
"displayName": "Knockback",
"maxLevel": 2,
"minCost": {
"a": 1,
"b": 1
},
"maxCost": {
"a": 1,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "melee_weapon",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 18,
"name": "looting",
"displayName": "Looting",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "melee_weapon",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 19,
"name": "loyalty",
"displayName": "Loyalty",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"riptide"
],
"category": "trident",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 20,
"name": "luck_of_the_sea",
"displayName": "Luck of the Sea",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "fishing",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 21,
"name": "lunge",
"displayName": "Lunge",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "lunge",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 22,
"name": "lure",
"displayName": "Lure",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "fishing",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 23,
"name": "mending",
"displayName": "Mending",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": true,
"curse": false,
"exclude": [
"infinity"
],
"category": "durability",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 24,
"name": "multishot",
"displayName": "Multishot",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"piercing"
],
"category": "crossbow",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 25,
"name": "piercing",
"displayName": "Piercing",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"multishot"
],
"category": "crossbow",
"weight": 10,
"tradeable": true,
"discoverable": true
},
{
"id": 26,
"name": "power",
"displayName": "Power",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "bow",
"weight": 10,
"tradeable": true,
"discoverable": true
},
{
"id": 27,
"name": "projectile_protection",
"displayName": "Projectile Protection",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"blast_protection",
"fire_protection",
"protection"
],
"category": "armor",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 28,
"name": "protection",
"displayName": "Protection",
"maxLevel": 4,
"minCost": {
"a": 3,
"b": 1
},
"maxCost": {
"a": 3,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"blast_protection",
"fire_protection",
"projectile_protection"
],
"category": "armor",
"weight": 10,
"tradeable": true,
"discoverable": true
},
{
"id": 29,
"name": "punch",
"displayName": "Punch",
"maxLevel": 2,
"minCost": {
"a": 1,
"b": 1
},
"maxCost": {
"a": 1,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "bow",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 30,
"name": "quick_charge",
"displayName": "Quick Charge",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "crossbow",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 31,
"name": "respiration",
"displayName": "Respiration",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "head_armor",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 32,
"name": "riptide",
"displayName": "Riptide",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"channeling",
"loyalty"
],
"category": "trident",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 33,
"name": "sharpness",
"displayName": "Sharpness",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"bane_of_arthropods",
"breach",
"density",
"impaling",
"smite"
],
"category": "sharp_weapon",
"weight": 10,
"tradeable": true,
"discoverable": true
},
{
"id": 34,
"name": "silk_touch",
"displayName": "Silk Touch",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"fortune"
],
"category": "mining_loot",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 35,
"name": "smite",
"displayName": "Smite",
"maxLevel": 5,
"minCost": {
"a": 4,
"b": 1
},
"maxCost": {
"a": 4,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [
"bane_of_arthropods",
"breach",
"density",
"impaling",
"sharpness"
],
"category": "weapon",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 36,
"name": "soul_speed",
"displayName": "Soul Speed",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": true,
"curse": false,
"exclude": [],
"category": "foot_armor",
"weight": 1,
"tradeable": false,
"discoverable": false
},
{
"id": 37,
"name": "sweeping_edge",
"displayName": "Sweeping Edge",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "sweeping",
"weight": 2,
"tradeable": true,
"discoverable": true
},
{
"id": 38,
"name": "swift_sneak",
"displayName": "Swift Sneak",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": true,
"curse": false,
"exclude": [],
"category": "leg_armor",
"weight": 1,
"tradeable": false,
"discoverable": false
},
{
"id": 39,
"name": "thorns",
"displayName": "Thorns",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "armor",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 40,
"name": "unbreaking",
"displayName": "Unbreaking",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": false,
"curse": false,
"exclude": [],
"category": "durability",
"weight": 5,
"tradeable": true,
"discoverable": true
},
{
"id": 41,
"name": "vanishing_curse",
"displayName": "Curse of Vanishing",
"maxLevel": 1,
"minCost": {
"a": 0,
"b": 1
},
"maxCost": {
"a": 0,
"b": 1
},
"treasureOnly": true,
"curse": true,
"exclude": [],
"category": "vanishing",
"weight": 1,
"tradeable": true,
"discoverable": true
},
{
"id": 42,
"name": "wind_burst",
"displayName": "Wind Burst",
"maxLevel": 3,
"minCost": {
"a": 2,
"b": 1
},
"maxCost": {
"a": 2,
"b": 1
},
"treasureOnly": true,
"curse": false,
"exclude": [],
"category": "mace",
"weight": 2,
"tradeable": false,
"discoverable": false
}
]
File diff suppressed because it is too large Load Diff
+442
View File
@@ -0,0 +1,442 @@
[
{
"id": 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
+465
View File
@@ -0,0 +1,465 @@
{
"grass": {
"data": [
{
"keys": [
"badlands",
"eroded_badlands",
"wooded_badlands"
],
"color": -7306931
},
{
"keys": [
"bamboo_jungle",
"basalt_deltas",
"beach",
"birch_forest",
"cold_ocean",
"crimson_forest",
"deep_cold_ocean",
"deep_dark",
"deep_frozen_ocean",
"deep_lukewarm_ocean",
"deep_ocean",
"desert",
"dripstone_caves",
"end_barrens",
"end_highlands",
"end_midlands",
"flower_forest",
"forest",
"frozen_ocean",
"frozen_peaks",
"frozen_river",
"grove",
"ice_spikes",
"jagged_peaks",
"jungle",
"lukewarm_ocean",
"lush_caves",
"meadow",
"mushroom_fields",
"nether_wastes",
"ocean",
"old_growth_birch_forest",
"old_growth_pine_taiga",
"old_growth_spruce_taiga",
"plains",
"river",
"savanna",
"savanna_plateau",
"small_end_islands",
"snowy_beach",
"snowy_plains",
"snowy_slopes",
"snowy_taiga",
"soul_sand_valley",
"sparse_jungle",
"stony_peaks",
"stony_shore",
"sunflower_plains",
"taiga",
"the_end",
"the_void",
"warm_ocean",
"warped_forest",
"windswept_forest",
"windswept_gravelly_hills",
"windswept_hills",
"windswept_savanna"
],
"color": 0
},
{
"keys": [
"cherry_grove"
],
"color": -4793503
},
{
"keys": [
"dark_forest"
],
"color": 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
}
]
+652
View File
@@ -0,0 +1,652 @@
[
{
"id": 0,
"name": "badlands",
"category": "mesa",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Badlands",
"color": 7254527
},
{
"id": 1,
"name": "bamboo_jungle",
"category": "jungle",
"temperature": 0.95,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Bamboo Jungle",
"color": 7842047
},
{
"id": 2,
"name": "basalt_deltas",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Basalt Deltas",
"color": 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
+236
View File
@@ -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
+402
View File
@@ -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
+465
View File
@@ -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
}
]
+652
View File
@@ -0,0 +1,652 @@
[
{
"id": 0,
"name": "badlands",
"category": "mesa",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "overworld",
"displayName": "Badlands",
"color": 7254527
},
{
"id": 1,
"name": "bamboo_jungle",
"category": "jungle",
"temperature": 0.95,
"has_precipitation": true,
"dimension": "overworld",
"displayName": "Bamboo Jungle",
"color": 7842047
},
{
"id": 2,
"name": "basalt_deltas",
"category": "nether",
"temperature": 2.0,
"has_precipitation": false,
"dimension": "nether",
"displayName": "Basalt Deltas",
"color": 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
+236
View File
@@ -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
+402
View File
@@ -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
+465
View File
@@ -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"
}
+914
View File
@@ -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"
]
+13 -2
View File
@@ -12,7 +12,7 @@ package data
type VersionInfo struct {
MinecraftVersion string
Version int32
DataVersion int
DataVersion int32
UsesNetty bool
MajorVersion string
ReleaseType string
@@ -42,6 +42,17 @@ func LookUpVersionByProtocolVersion(version int32) (ret VersionInfo, err error)
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() {
must(LoadJson("minecraft-data/data/pc/common/protocolVersions.json", &ProtocolVersions))
must(LoadJson("minecraft-data/pc/common/protocolVersions.json", &ProtocolVersions))
}
+3 -1
View File
@@ -6,6 +6,8 @@ import (
"github.com/admin-else/strom/nbt"
)
// TODO: this is stupid loginPacket.json exists next version migrate to that
//go:embed registry/*
var Registry embed.FS
@@ -15,6 +17,6 @@ func LoadRegistry(name string) (n *nbt.Tag, err error) {
return
}
defer r.Close()
n, err = nbt.ReadFile(r)
n, err = nbt.ReadUnstructuredFile(r)
return
}
Binary file not shown.
+123 -53
View File
@@ -7,20 +7,14 @@ import (
"fmt"
"log/slog"
"reflect"
"time"
)
const (
LoopsPerSecond = 100 // i dunno seems reasonable
TimePerLoop = time.Second / LoopsPerSecond
)
type Loop struct {
HandlerFunctions map[reflect.Type][]reflect.Value
Ctx context.Context
ErrChan chan error
cancel context.CancelFunc
Ctx context.Context
Cancel context.CancelFunc
eventSources []reflect.SelectCase
}
type Unhandled struct {
@@ -31,18 +25,22 @@ type Anything struct {
Val any
}
type (
Tick struct{}
)
// Close is fired when the loop shuts down.
type Close struct {
Reason error
}
// HandlerDoneErr will stop the event loop and return the error if provided.
type HandlerDoneErr struct {
Return error
}
// Close is fired when the loop shuts down.
type Close struct {
Reason error
// CallFunc is a special value that when fired with Loop.Fire it calls a function on the main loop
// Its usefull for event event sources to call functions on the main loop
// because event sources dont run on the main loop
type CallFunc struct {
F reflect.Value
Args []reflect.Value
}
func (e HandlerDoneErr) Error() string {
@@ -53,9 +51,24 @@ func (e HandlerDoneErr) Unwrap() error {
return e.Return
}
// ErrDontForward will stop the event from being forwarded to other handlers, including anything handlers.
var ErrDontForward = errors.New("dont forward")
// MainHandlerErr is a special error used to tell the event loop that the main loop has exited
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 ContextDoneErr = errors.New("context done")
var RecvNotOkErr = errors.New("recv not ok")
func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
hv = reflect.ValueOf(h)
@@ -72,36 +85,64 @@ func ValidateHandler(h any) (eventType reflect.Type, hv reflect.Value) {
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.
// Instead, it will log it to slog.Error
// Warning: If a bad handler is passed in the program will panic.
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
// This does not hold true for signaling errors like HandlerDoneErr or DontForwardErr
// Warning: If a bad handler is passed in the program will panic.
func (l *Loop) RegisterCustomType(eventType reflect.Type, hv reflect.Value) {
handleFunc := func(packet any) error {
v := hv.Call([]reflect.Value{reflect.ValueOf(packet)})[0]
if !v.IsNil() {
slog.Error("handler failed", "err", v.Interface().(error))
}
return nil
func (l *Loop) RegisterLow(eventType reflect.Type, hv reflect.Value, critical bool) {
handleFunc := hv
if !critical {
handleFunc = reflect.ValueOf(func(packet any) error {
v := hv.Call([]reflect.Value{reflect.ValueOf(packet)})[0]
if !v.IsNil() {
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.
// Warning: If a bad handler is passed in the program will panic.
func (l *Loop) RegisterCritical(h any) {
eventType, hv := ValidateHandler(h)
l.RegisterDirect(eventType, hv)
}
func (l *Loop) RegisterDirect(k reflect.Type, h reflect.Value) {
l.HandlerFunctions[k] = append(l.HandlerFunctions[k], h)
l.HandlerFunctions[eventType] = append(l.HandlerFunctions[eventType], hv)
}
// FireFound triggers all handlers registered for the specified event type and returns if handlers were found or an error occurred.
@@ -112,7 +153,7 @@ func (l *Loop) FireFound(event any) (found bool, err error) {
errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0]
if !errV.IsNil() {
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
}
}
@@ -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.
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)
if err != nil {
if errors.Is(err, ErrDontForward) {
if errors.Is(err, DontForwardErr) {
err = nil
}
return
}
if !found {
_, err = l.FireFound(Unhandled{event})
found, err = l.FireFound(Unhandled{event})
if err != nil {
return
}
}
_, err = l.FireFound(Anything{event})
found, err = l.FireFound(Anything{event})
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.RegisterEventSource(l.ContextDoneListener())
for {
tickStartTime := time.Now()
err = l.Fire(Tick{})
_, v, ok := reflect.Select(l.eventSources)
if !ok {
err = RecvNotOkErr
break
}
err = l.Fire(v.Interface())
if err != nil {
break
}
time.Sleep(TimePerLoop - time.Since(tickStartTime))
}
if errors.Is(err, HandlerDoneErr{}) {
err = errors.Unwrap(err)
var contextDoneErr HandlerDoneErr
if errors.As(err, &contextDoneErr) {
err = contextDoneErr.Return
}
closeErr := l.Fire(Close{err})
if closeErr != nil {
err = errors.Join(err, errors.Join(WhileClosingErr, closeErr))
}
return
}
func (l *Loop) Start() (err error) {
go func() {
l.ErrChan <- l.startLoop()
}()
err = <-l.ErrChan
l.cancel()
l.Cancel()
return
}
func NewLoop() (l *Loop) {
return NewLoopCtx(context.Background())
}
func NewLoopCtx(ctx context.Context) (l *Loop) {
l = &Loop{}
l.ErrChan = make(chan error)
l.Ctx, l.cancel = context.WithCancel(context.Background())
l.Ctx, l.Cancel = context.WithCancel(ctx)
l.HandlerFunctions = make(map[reflect.Type][]reflect.Value)
return
}
+21 -32
View File
@@ -2,7 +2,6 @@ package event
import (
"bufio"
"context"
"os"
)
@@ -10,36 +9,26 @@ type Stdin struct {
Val string
}
type StdinHandler struct {
*Loop
stdInChan chan Stdin
Ctx context.Context
}
func (s *StdinHandler) OnTick(_ Tick) (err error) {
select {
case stdin := <-s.stdInChan:
err = s.Fire(Stdin{stdin.Val})
default:
}
return
}
func (s *StdinHandler) ScanJob() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
select {
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()
func StartListingStdin(l *Loop) {
l.RegisterEventSource(func() (chSending <-chan any) {
ch := make(chan any)
go func() {
scanner := bufio.NewScanner(os.Stdin)
ctx := l.Ctx
for scanner.Scan() {
select {
case <-ctx.Done():
return
default:
ch <- Stdin{scanner.Text()}
}
}
if err := scanner.Err(); err != nil {
ch <- err
}
}()
chSending = ch
return
}())
return
}
+61 -24
View File
@@ -1,6 +1,8 @@
package event
import (
"context"
"reflect"
"slices"
"time"
)
@@ -19,39 +21,54 @@ type OnceTask struct {
type Timer struct {
Once []OnceTask
Interval []IntervalTask
Active bool
}
func (t *Timer) Tick() (err error) {
if !t.Active {
func (t *Timer) Trigger(ch chan any) {
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
}
for i, task := range t.Interval {
if time.Since(task.LastTrigger) >= task.Interval {
task.LastTrigger = time.Now()
err = task.F()
if err != nil {
return
}
}
t.Interval[i] = task
now := time.Now()
sleepFor := triggerAt.Sub(now)
//slog.Debug("sleep next", "dur", sleepFor)
time.Sleep(sleepFor)
if iOnce >= 0 {
ch <- CallFunc{F: reflect.ValueOf(t.Once[iOnce].F), Args: []reflect.Value{}}
t.Once = slices.Delete(t.Once, iOnce, iOnce+1)
return
}
for i, task := range t.Once {
if task.Trigger.After(time.Now()) {
err = task.F()
if err != nil {
return
}
t.Once = slices.Delete(t.Once, i, i)
}
if iInterval >= 0 {
t.Interval[iInterval].LastTrigger = triggerAt
ch <- CallFunc{F: reflect.ValueOf(t.Interval[iInterval].F), Args: []reflect.Value{}}
return
}
return
panic("unreachable")
}
func (t *Timer) Every(interval time.Duration, f func() error) {
t.Interval = append(t.Interval, IntervalTask{
F: f,
Interval: interval,
F: f,
Interval: interval,
LastTrigger: time.Now(),
})
}
@@ -61,3 +78,23 @@ func (t *Timer) In(interval time.Duration, f func() error) {
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
+80
View File
@@ -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
}
}

Some files were not shown because too many files have changed in this diff Show More