Check for correct tool when breaking blocks

Also rewrite how we handle tags. Now we can use tags everywhere we want!. I also decided to make the json assets pretty printed which is so much easier to debug, The decision was made because of the reason that we are moving to compile time assets, so pretty printing does not affect performance
This commit is contained in:
Alexander Medvedev 2025-02-14 22:47:09 +01:00
parent d6a3506627
commit 3d1e0bf35c
50 changed files with 1327391 additions and 302 deletions

View File

@ -1 +1,34 @@
{"armor":0.0,"armor_toughness":0.0,"attack_damage":2.0,"attack_knockback":0.0,"attack_speed":4.0,"block_break_speed":1.0,"block_interaction_range":4.5,"burning_time":1.0,"explosion_knockback_resistance":0.0,"entity_interaction_range":3.0,"fall_damage_multiplier":1.0,"flying_speed":0.4,"follow_range":32.0,"gravity":0.08,"jump_strength":0.41999998688697815,"knockback_resistance":0.0,"luck":0.0,"max_absorption":0.0,"max_health":20.0,"mining_efficiency":0.0,"movement_efficiency":0.0,"movement_speed":0.7,"oxygen_bonus":0.0,"safe_fall_distance":3.0,"scale":1.0,"sneaking_speed":0.3,"spawn_reinforcements":0.0,"step_height":0.6,"submerged_mining_speed":0.2,"sweeping_damage_ratio":0.0,"tempt_range":10.0,"water_movement_efficiency":0.0}
{
"armor": 0.0,
"armor_toughness": 0.0,
"attack_damage": 2.0,
"attack_knockback": 0.0,
"attack_speed": 4.0,
"block_break_speed": 1.0,
"block_interaction_range": 4.5,
"burning_time": 1.0,
"explosion_knockback_resistance": 0.0,
"entity_interaction_range": 3.0,
"fall_damage_multiplier": 1.0,
"flying_speed": 0.4,
"follow_range": 32.0,
"gravity": 0.08,
"jump_strength": 0.41999998688697815,
"knockback_resistance": 0.0,
"luck": 0.0,
"max_absorption": 0.0,
"max_health": 20.0,
"mining_efficiency": 0.0,
"movement_efficiency": 0.0,
"movement_speed": 0.7,
"oxygen_bonus": 0.0,
"safe_fall_distance": 3.0,
"scale": 1.0,
"sneaking_speed": 0.3,
"spawn_reinforcements": 0.0,
"step_height": 0.6,
"submerged_mining_speed": 0.2,
"sweeping_damage_ratio": 0.0,
"tempt_range": 10.0,
"water_movement_efficiency": 0.0
}

View File

@ -1 +1,67 @@
["badlands","bamboo_jungle","basalt_deltas","beach","birch_forest","cherry_grove","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","eroded_badlands","flower_forest","forest","frozen_ocean","frozen_peaks","frozen_river","grove","ice_spikes","jagged_peaks","jungle","lukewarm_ocean","lush_caves","mangrove_swamp","meadow","mushroom_fields","nether_wastes","ocean","old_growth_birch_forest","old_growth_pine_taiga","old_growth_spruce_taiga","pale_garden","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","swamp","taiga","the_end","the_void","warm_ocean","warped_forest","windswept_forest","windswept_gravelly_hills","windswept_hills","windswept_savanna","wooded_badlands"]
[
"badlands",
"bamboo_jungle",
"basalt_deltas",
"beach",
"birch_forest",
"cherry_grove",
"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",
"eroded_badlands",
"flower_forest",
"forest",
"frozen_ocean",
"frozen_peaks",
"frozen_river",
"grove",
"ice_spikes",
"jagged_peaks",
"jungle",
"lukewarm_ocean",
"lush_caves",
"mangrove_swamp",
"meadow",
"mushroom_fields",
"nether_wastes",
"ocean",
"old_growth_birch_forest",
"old_growth_pine_taiga",
"old_growth_spruce_taiga",
"pale_garden",
"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",
"swamp",
"taiga",
"the_end",
"the_void",
"warm_ocean",
"warped_forest",
"windswept_forest",
"windswept_gravelly_hills",
"windswept_hills",
"windswept_savanna",
"wooded_badlands"
]

File diff suppressed because one or more lines are too long

1
assets/chunk.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -1 +1,14 @@
["empty","structure_starts","structure_references","biomes","noise","surface","carvers","features","initialize_light","light","spawn","full"]
[
"empty",
"structure_starts",
"structure_references",
"biomes",
"noise",
"surface",
"carvers",
"features",
"initialize_light",
"light",
"spawn",
"full"
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1,20 @@
["STANDING","FALL_FLYING","SLEEPING","SWIMMING","SPIN_ATTACK","CROUCHING","LONG_JUMPING","DYING","CROAKING","USING_TONGUE","SITTING","ROARING","SNIFFING","EMERGING","DIGGING","SLIDING","SHOOTING","INHALING"]
[
"STANDING",
"FALL_FLYING",
"SLEEPING",
"SWIMMING",
"SPIN_ATTACK",
"CROUCHING",
"LONG_JUMPING",
"DYING",
"CROAKING",
"USING_TONGUE",
"SITTING",
"ROARING",
"SNIFFING",
"EMERGING",
"DIGGING",
"SLIDING",
"SHOOTING",
"INHALING"
]

View File

@ -1 +1,62 @@
["block_activate","block_attach","block_change","block_close","block_deactivate","block_destroy","block_detach","block_open","block_place","container_close","container_open","drink","eat","elytra_glide","entity_damage","entity_die","entity_dismount","entity_interact","entity_mount","entity_place","entity_action","equip","explode","flap","fluid_pickup","fluid_place","hit_ground","instrument_play","item_interact_finish","item_interact_start","jukebox_play","jukebox_stop_play","lightning_strike","note_block_play","prime_fuse","projectile_land","projectile_shoot","sculk_sensor_tendrils_clicking","shear","shriek","splash","step","swim","teleport","unequip","resonate_1","resonate_2","resonate_3","resonate_4","resonate_5","resonate_6","resonate_7","resonate_8","resonate_9","resonate_10","resonate_11","resonate_12","resonate_13","resonate_14","resonate_15"]
[
"block_activate",
"block_attach",
"block_change",
"block_close",
"block_deactivate",
"block_destroy",
"block_detach",
"block_open",
"block_place",
"container_close",
"container_open",
"drink",
"eat",
"elytra_glide",
"entity_damage",
"entity_die",
"entity_dismount",
"entity_interact",
"entity_mount",
"entity_place",
"entity_action",
"equip",
"explode",
"flap",
"fluid_pickup",
"fluid_place",
"hit_ground",
"instrument_play",
"item_interact_finish",
"item_interact_start",
"jukebox_play",
"jukebox_stop_play",
"lightning_strike",
"note_block_play",
"prime_fuse",
"projectile_land",
"projectile_shoot",
"sculk_sensor_tendrils_clicking",
"shear",
"shriek",
"splash",
"step",
"swim",
"teleport",
"unequip",
"resonate_1",
"resonate_2",
"resonate_3",
"resonate_4",
"resonate_5",
"resonate_6",
"resonate_7",
"resonate_8",
"resonate_9",
"resonate_10",
"resonate_11",
"resonate_12",
"resonate_13",
"resonate_14",
"resonate_15"
]

54
assets/game_rules.json Normal file
View File

@ -0,0 +1,54 @@
{
"announceAdvancements": "true",
"blockExplosionDropDecay": "true",
"commandBlockOutput": "true",
"commandModificationBlockLimit": "32768",
"disableElytraMovementCheck": "false",
"disablePlayerMovementCheck": "false",
"disableRaids": "false",
"doDaylightCycle": "true",
"doEntityDrops": "true",
"doFireTick": "true",
"doImmediateRespawn": "false",
"doInsomnia": "true",
"doLimitedCrafting": "false",
"doMobLoot": "true",
"doMobSpawning": "true",
"doPatrolSpawning": "true",
"doTileDrops": "true",
"doTraderSpawning": "true",
"doVinesSpread": "true",
"doWardenSpawning": "true",
"doWeatherCycle": "true",
"drowningDamage": "true",
"enderPearlsVanishOnDeath": "true",
"fallDamage": "true",
"fireDamage": "true",
"forgiveDeadPlayers": "true",
"freezeDamage": "true",
"globalSoundEvents": "true",
"keepInventory": "false",
"lavaSourceConversion": "false",
"logAdminCommands": "true",
"maxCommandChainLength": "65536",
"maxCommandForkCount": "65536",
"maxEntityCramming": "24",
"mobExplosionDropDecay": "true",
"mobGriefing": "true",
"naturalRegeneration": "true",
"playersNetherPortalCreativeDelay": "0",
"playersNetherPortalDefaultDelay": "80",
"playersSleepingPercentage": "100",
"projectilesCanBreakBlocks": "true",
"randomTickSpeed": "3",
"reducedDebugInfo": "false",
"sendCommandFeedback": "true",
"showDeathMessages": "true",
"snowAccumulationHeight": "1",
"spawnChunkRadius": "2",
"spawnRadius": "10",
"spectatorsGenerateChunks": "true",
"tntExplosionDropDecay": "false",
"universalAnger": "false",
"waterSourceConversion": "true"
}

File diff suppressed because one or more lines are too long

View File

@ -1 +1,145 @@
{"chat":{"id":0,"components":{"chat":{"translation_key":"chat.type.text","parameters":["sender","content"]},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}},"emote_command":{"id":1,"components":{"chat":{"translation_key":"chat.type.emote","parameters":["sender","content"]},"narration":{"translation_key":"chat.type.emote","parameters":["sender","content"]}}},"msg_command_incoming":{"id":2,"components":{"chat":{"translation_key":"commands.message.display.incoming","parameters":["sender","content"],"style":{"italic":true,"color":"gray"}},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}},"msg_command_outgoing":{"id":3,"components":{"chat":{"translation_key":"commands.message.display.outgoing","parameters":["target","content"],"style":{"italic":true,"color":"gray"}},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}},"say_command":{"id":4,"components":{"chat":{"translation_key":"chat.type.announcement","parameters":["sender","content"]},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}},"team_msg_command_incoming":{"id":5,"components":{"chat":{"translation_key":"chat.type.team.text","parameters":["target","sender","content"]},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}},"team_msg_command_outgoing":{"id":6,"components":{"chat":{"translation_key":"chat.type.team.sent","parameters":["target","sender","content"]},"narration":{"translation_key":"chat.type.text.narrate","parameters":["sender","content"]}}}}
{
"chat": {
"id": 0,
"components": {
"chat": {
"translation_key": "chat.type.text",
"parameters": [
"sender",
"content"
]
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
},
"emote_command": {
"id": 1,
"components": {
"chat": {
"translation_key": "chat.type.emote",
"parameters": [
"sender",
"content"
]
},
"narration": {
"translation_key": "chat.type.emote",
"parameters": [
"sender",
"content"
]
}
}
},
"msg_command_incoming": {
"id": 2,
"components": {
"chat": {
"translation_key": "commands.message.display.incoming",
"parameters": [
"sender",
"content"
],
"style": {
"italic": true,
"color": "gray"
}
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
},
"msg_command_outgoing": {
"id": 3,
"components": {
"chat": {
"translation_key": "commands.message.display.outgoing",
"parameters": [
"target",
"content"
],
"style": {
"italic": true,
"color": "gray"
}
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
},
"say_command": {
"id": 4,
"components": {
"chat": {
"translation_key": "chat.type.announcement",
"parameters": [
"sender",
"content"
]
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
},
"team_msg_command_incoming": {
"id": 5,
"components": {
"chat": {
"translation_key": "chat.type.team.text",
"parameters": [
"target",
"sender",
"content"
]
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
},
"team_msg_command_outgoing": {
"id": 6,
"components": {
"chat": {
"translation_key": "chat.type.team.sent",
"parameters": [
"target",
"sender",
"content"
]
},
"narration": {
"translation_key": "chat.type.text.narrate",
"parameters": [
"sender",
"content"
]
}
}
}
}

View File

@ -0,0 +1 @@
["BYTE","INTEGER","LONG","FLOAT","STRING","TEXT_COMPONENT","OPTIONAL_TEXT_COMPONENT","ITEM_STACK","BLOCK_STATE","OPTIONAL_BLOCK_STATE","BOOLEAN","PARTICLE","PARTICLE_LIST","ROTATION","BLOCK_POS","OPTIONAL_BLOCK_POS","FACING","OPTIONAL_UUID","OPTIONAL_GLOBAL_POS","NBT_COMPOUND","VILLAGER_DATA","OPTIONAL_INT","ENTITY_POSE","CAT_VARIANT","WOLF_VARIANT","FROG_VARIANT","PAINTING_VARIANT","ARMADILLO_STATE","SNIFFER_STATE","VECTOR_3F","QUATERNION_F"]

1599
assets/multi_noise.json Normal file

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

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

View File

@ -1 +1,497 @@
{"aquifer_barrier":{"firstOctave":-3,"amplitudes":[1.0]},"aquifer_fluid_level_floodedness":{"firstOctave":-7,"amplitudes":[1.0]},"aquifer_fluid_level_spread":{"firstOctave":-5,"amplitudes":[1.0]},"aquifer_lava":{"firstOctave":-1,"amplitudes":[1.0]},"badlands_pillar":{"firstOctave":-2,"amplitudes":[1.0,1.0,1.0,1.0]},"badlands_pillar_roof":{"firstOctave":-8,"amplitudes":[1.0]},"badlands_surface":{"firstOctave":-6,"amplitudes":[1.0,1.0,1.0]},"calcite":{"firstOctave":-9,"amplitudes":[1.0,1.0,1.0,1.0]},"cave_cheese":{"firstOctave":-8,"amplitudes":[0.5,1.0,2.0,1.0,2.0,1.0,0.0,2.0,0.0]},"cave_entrance":{"firstOctave":-7,"amplitudes":[0.4,0.5,1.0]},"cave_layer":{"firstOctave":-8,"amplitudes":[1.0]},"clay_bands_offset":{"firstOctave":-8,"amplitudes":[1.0]},"continentalness":{"firstOctave":-9,"amplitudes":[1.0,1.0,2.0,2.0,2.0,1.0,1.0,1.0,1.0]},"continentalness_large":{"firstOctave":-11,"amplitudes":[1.0,1.0,2.0,2.0,2.0,1.0,1.0,1.0,1.0]},"erosion":{"firstOctave":-9,"amplitudes":[1.0,1.0,0.0,1.0,1.0]},"erosion_large":{"firstOctave":-11,"amplitudes":[1.0,1.0,0.0,1.0,1.0]},"gravel":{"firstOctave":-8,"amplitudes":[1.0,1.0,1.0,1.0]},"gravel_layer":{"firstOctave":-8,"amplitudes":[1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.013333333333333334]},"ice":{"firstOctave":-4,"amplitudes":[1.0,1.0,1.0,1.0]},"iceberg_pillar":{"firstOctave":-6,"amplitudes":[1.0,1.0,1.0,1.0]},"iceberg_pillar_roof":{"firstOctave":-3,"amplitudes":[1.0]},"iceberg_surface":{"firstOctave":-6,"amplitudes":[1.0,1.0,1.0]},"jagged":{"firstOctave":-16,"amplitudes":[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]},"nether_state_selector":{"firstOctave":-4,"amplitudes":[1.0]},"nether_wart":{"firstOctave":-3,"amplitudes":[1.0,0.0,0.0,0.9]},"netherrack":{"firstOctave":-3,"amplitudes":[1.0,0.0,0.0,0.35]},"noodle":{"firstOctave":-8,"amplitudes":[1.0]},"noodle_ridge_a":{"firstOctave":-7,"amplitudes":[1.0]},"noodle_ridge_b":{"firstOctave":-7,"amplitudes":[1.0]},"noodle_thickness":{"firstOctave":-8,"amplitudes":[1.0]},"offset":{"firstOctave":-3,"amplitudes":[1.0,1.0,1.0,0.0]},"ore_gap":{"firstOctave":-5,"amplitudes":[1.0]},"ore_vein_a":{"firstOctave":-7,"amplitudes":[1.0]},"ore_vein_b":{"firstOctave":-7,"amplitudes":[1.0]},"ore_veininess":{"firstOctave":-8,"amplitudes":[1.0]},"packed_ice":{"firstOctave":-7,"amplitudes":[1.0,1.0,1.0,1.0]},"patch":{"firstOctave":-5,"amplitudes":[1.0,0.0,0.0,0.0,0.0,0.013333333333333334]},"pillar":{"firstOctave":-7,"amplitudes":[1.0,1.0]},"pillar_rareness":{"firstOctave":-8,"amplitudes":[1.0]},"pillar_thickness":{"firstOctave":-8,"amplitudes":[1.0]},"powder_snow":{"firstOctave":-6,"amplitudes":[1.0,1.0,1.0,1.0]},"ridge":{"firstOctave":-7,"amplitudes":[1.0,2.0,1.0,0.0,0.0,0.0]},"soul_sand_layer":{"firstOctave":-8,"amplitudes":[1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.013333333333333334]},"spaghetti_2d":{"firstOctave":-7,"amplitudes":[1.0]},"spaghetti_2d_elevation":{"firstOctave":-8,"amplitudes":[1.0]},"spaghetti_2d_modulator":{"firstOctave":-11,"amplitudes":[1.0]},"spaghetti_2d_thickness":{"firstOctave":-11,"amplitudes":[1.0]},"spaghetti_3d_1":{"firstOctave":-7,"amplitudes":[1.0]},"spaghetti_3d_2":{"firstOctave":-7,"amplitudes":[1.0]},"spaghetti_3d_rarity":{"firstOctave":-11,"amplitudes":[1.0]},"spaghetti_3d_thickness":{"firstOctave":-8,"amplitudes":[1.0]},"spaghetti_roughness":{"firstOctave":-5,"amplitudes":[1.0]},"spaghetti_roughness_modulator":{"firstOctave":-8,"amplitudes":[1.0]},"surface":{"firstOctave":-6,"amplitudes":[1.0,1.0,1.0]},"surface_secondary":{"firstOctave":-6,"amplitudes":[1.0,1.0,0.0,1.0]},"surface_swamp":{"firstOctave":-2,"amplitudes":[1.0]},"temperature":{"firstOctave":-10,"amplitudes":[1.5,0.0,1.0,0.0,0.0,0.0]},"temperature_large":{"firstOctave":-12,"amplitudes":[1.5,0.0,1.0,0.0,0.0,0.0]},"vegetation":{"firstOctave":-8,"amplitudes":[1.0,1.0,0.0,0.0,0.0,0.0]},"vegetation_large":{"firstOctave":-10,"amplitudes":[1.0,1.0,0.0,0.0,0.0,0.0]}}
{
"aquifer_barrier": {
"firstOctave": -3,
"amplitudes": [
1.0
]
},
"aquifer_fluid_level_floodedness": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"aquifer_fluid_level_spread": {
"firstOctave": -5,
"amplitudes": [
1.0
]
},
"aquifer_lava": {
"firstOctave": -1,
"amplitudes": [
1.0
]
},
"badlands_pillar": {
"firstOctave": -2,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"badlands_pillar_roof": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"badlands_surface": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
1.0
]
},
"calcite": {
"firstOctave": -9,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"cave_cheese": {
"firstOctave": -8,
"amplitudes": [
0.5,
1.0,
2.0,
1.0,
2.0,
1.0,
0.0,
2.0,
0.0
]
},
"cave_entrance": {
"firstOctave": -7,
"amplitudes": [
0.4,
0.5,
1.0
]
},
"cave_layer": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"clay_bands_offset": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"continentalness": {
"firstOctave": -9,
"amplitudes": [
1.0,
1.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
]
},
"continentalness_large": {
"firstOctave": -11,
"amplitudes": [
1.0,
1.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
]
},
"erosion": {
"firstOctave": -9,
"amplitudes": [
1.0,
1.0,
0.0,
1.0,
1.0
]
},
"erosion_large": {
"firstOctave": -11,
"amplitudes": [
1.0,
1.0,
0.0,
1.0,
1.0
]
},
"gravel": {
"firstOctave": -8,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"gravel_layer": {
"firstOctave": -8,
"amplitudes": [
1.0,
1.0,
1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.013333333333333334
]
},
"ice": {
"firstOctave": -4,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"iceberg_pillar": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"iceberg_pillar_roof": {
"firstOctave": -3,
"amplitudes": [
1.0
]
},
"iceberg_surface": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
1.0
]
},
"jagged": {
"firstOctave": -16,
"amplitudes": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
]
},
"nether_state_selector": {
"firstOctave": -4,
"amplitudes": [
1.0
]
},
"nether_wart": {
"firstOctave": -3,
"amplitudes": [
1.0,
0.0,
0.0,
0.9
]
},
"netherrack": {
"firstOctave": -3,
"amplitudes": [
1.0,
0.0,
0.0,
0.35
]
},
"noodle": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"noodle_ridge_a": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"noodle_ridge_b": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"noodle_thickness": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"offset": {
"firstOctave": -3,
"amplitudes": [
1.0,
1.0,
1.0,
0.0
]
},
"ore_gap": {
"firstOctave": -5,
"amplitudes": [
1.0
]
},
"ore_vein_a": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"ore_vein_b": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"ore_veininess": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"packed_ice": {
"firstOctave": -7,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"patch": {
"firstOctave": -5,
"amplitudes": [
1.0,
0.0,
0.0,
0.0,
0.0,
0.013333333333333334
]
},
"pillar": {
"firstOctave": -7,
"amplitudes": [
1.0,
1.0
]
},
"pillar_rareness": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"pillar_thickness": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"powder_snow": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
1.0,
1.0
]
},
"ridge": {
"firstOctave": -7,
"amplitudes": [
1.0,
2.0,
1.0,
0.0,
0.0,
0.0
]
},
"soul_sand_layer": {
"firstOctave": -8,
"amplitudes": [
1.0,
1.0,
1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.013333333333333334
]
},
"spaghetti_2d": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"spaghetti_2d_elevation": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"spaghetti_2d_modulator": {
"firstOctave": -11,
"amplitudes": [
1.0
]
},
"spaghetti_2d_thickness": {
"firstOctave": -11,
"amplitudes": [
1.0
]
},
"spaghetti_3d_1": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"spaghetti_3d_2": {
"firstOctave": -7,
"amplitudes": [
1.0
]
},
"spaghetti_3d_rarity": {
"firstOctave": -11,
"amplitudes": [
1.0
]
},
"spaghetti_3d_thickness": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"spaghetti_roughness": {
"firstOctave": -5,
"amplitudes": [
1.0
]
},
"spaghetti_roughness_modulator": {
"firstOctave": -8,
"amplitudes": [
1.0
]
},
"surface": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
1.0
]
},
"surface_secondary": {
"firstOctave": -6,
"amplitudes": [
1.0,
1.0,
0.0,
1.0
]
},
"surface_swamp": {
"firstOctave": -2,
"amplitudes": [
1.0
]
},
"temperature": {
"firstOctave": -10,
"amplitudes": [
1.5,
0.0,
1.0,
0.0,
0.0,
0.0
]
},
"temperature_large": {
"firstOctave": -12,
"amplitudes": [
1.5,
0.0,
1.0,
0.0,
0.0,
0.0
]
},
"vegetation": {
"firstOctave": -8,
"amplitudes": [
1.0,
1.0,
0.0,
0.0,
0.0,
0.0
]
},
"vegetation_large": {
"firstOctave": -10,
"amplitudes": [
1.0,
1.0,
0.0,
0.0,
0.0,
0.0
]
}
}

View File

@ -1 +1,258 @@
{"serverbound":{"handshake":["intention"],"status":["status_request","ping_request"],"login":["hello","key","custom_query_answer","login_acknowledged","cookie_response"],"config":["client_information","cookie_response","custom_payload","finish_configuration","keep_alive","pong","resource_pack","select_known_packs"],"play":["accept_teleportation","block_entity_tag_query","bundle_item_selected","change_difficulty","chat_ack","chat_command","chat_command_signed","chat","chat_session_update","chunk_batch_received","client_command","client_tick_end","client_information","command_suggestion","configuration_acknowledged","container_button_click","container_click","container_close","container_slot_state_changed","cookie_response","custom_payload","debug_sample_subscription","edit_book","entity_tag_query","interact","jigsaw_generate","keep_alive","lock_difficulty","move_player_pos","move_player_pos_rot","move_player_rot","move_player_status_only","move_vehicle","paddle_boat","pick_item_from_block","pick_item_from_entity","ping_request","place_recipe","player_abilities","player_action","player_command","player_input","player_loaded","pong","recipe_book_change_settings","recipe_book_seen_recipe","rename_item","resource_pack","seen_advancements","select_trade","set_beacon","set_carried_item","set_command_block","set_command_minecart","set_creative_mode_slot","set_jigsaw_block","set_structure_block","sign_update","swing","teleport_to_entity","use_item_on","use_item"]},"clientbound":{"status":["status_response","pong_response"],"login":["login_disconnect","hello","login_finished","login_compression","custom_query","cookie_request"],"config":["cookie_request","custom_payload","disconnect","finish_configuration","keep_alive","ping","reset_chat","registry_data","resource_pack_pop","resource_pack_push","store_cookie","transfer","update_enabled_features","update_tags","select_known_packs","custom_report_details","server_links"],"play":["bundle_delimiter","add_entity","add_experience_orb","animate","award_stats","block_changed_ack","block_destruction","block_entity_data","block_event","block_update","boss_event","change_difficulty","chunk_batch_finished","chunk_batch_start","chunks_biomes","clear_titles","command_suggestions","commands","container_close","container_set_content","container_set_data","container_set_slot","cookie_request","cooldown","custom_chat_completions","custom_payload","damage_event","debug_sample","delete_chat","disconnect","disguised_chat","entity_event","entity_position_sync","explode","forget_level_chunk","game_event","horse_screen_open","hurt_animation","initialize_border","keep_alive","level_chunk_with_light","level_event","level_particles","light_update","login","map_item_data","merchant_offers","move_entity_pos","move_entity_pos_rot","move_minecart_along_track","move_entity_rot","move_vehicle","open_book","open_screen","open_sign_editor","ping","pong_response","place_ghost_recipe","player_abilities","player_chat","player_combat_end","player_combat_enter","player_combat_kill","player_info_remove","player_info_update","player_look_at","player_position","player_rotation","recipe_book_add","recipe_book_remove","recipe_book_settings","remove_entities","remove_mob_effect","reset_score","resource_pack_pop","resource_pack_push","respawn","rotate_head","section_blocks_update","select_advancements_tab","server_data","set_action_bar_text","set_border_center","set_border_lerp_size","set_border_size","set_border_warning_delay","set_border_warning_distance","set_camera","set_chunk_cache_center","set_chunk_cache_radius","set_cursor_item","set_default_spawn_position","set_display_objective","set_entity_data","set_entity_link","set_entity_motion","set_equipment","set_experience","set_health","set_held_slot","set_objective","set_passengers","set_player_inventory","set_player_team","set_score","set_simulation_distance","set_subtitle_text","set_time","set_title_text","set_titles_animation","sound_entity","sound","start_configuration","stop_sound","store_cookie","system_chat","tab_list","tag_query","take_item_entity","teleport_entity","ticking_state","ticking_step","transfer","update_advancements","update_attributes","update_mob_effect","update_recipes","update_tags","projectile_power","custom_report_details","server_links"]}}
{
"serverbound": {
"handshake": [
"intention"
],
"status": [
"status_request",
"ping_request"
],
"login": [
"hello",
"key",
"custom_query_answer",
"login_acknowledged",
"cookie_response"
],
"config": [
"client_information",
"cookie_response",
"custom_payload",
"finish_configuration",
"keep_alive",
"pong",
"resource_pack",
"select_known_packs"
],
"play": [
"accept_teleportation",
"block_entity_tag_query",
"bundle_item_selected",
"change_difficulty",
"chat_ack",
"chat_command",
"chat_command_signed",
"chat",
"chat_session_update",
"chunk_batch_received",
"client_command",
"client_tick_end",
"client_information",
"command_suggestion",
"configuration_acknowledged",
"container_button_click",
"container_click",
"container_close",
"container_slot_state_changed",
"cookie_response",
"custom_payload",
"debug_sample_subscription",
"edit_book",
"entity_tag_query",
"interact",
"jigsaw_generate",
"keep_alive",
"lock_difficulty",
"move_player_pos",
"move_player_pos_rot",
"move_player_rot",
"move_player_status_only",
"move_vehicle",
"paddle_boat",
"pick_item_from_block",
"pick_item_from_entity",
"ping_request",
"place_recipe",
"player_abilities",
"player_action",
"player_command",
"player_input",
"player_loaded",
"pong",
"recipe_book_change_settings",
"recipe_book_seen_recipe",
"rename_item",
"resource_pack",
"seen_advancements",
"select_trade",
"set_beacon",
"set_carried_item",
"set_command_block",
"set_command_minecart",
"set_creative_mode_slot",
"set_jigsaw_block",
"set_structure_block",
"sign_update",
"swing",
"teleport_to_entity",
"use_item_on",
"use_item"
]
},
"clientbound": {
"status": [
"status_response",
"pong_response"
],
"login": [
"login_disconnect",
"hello",
"login_finished",
"login_compression",
"custom_query",
"cookie_request"
],
"config": [
"cookie_request",
"custom_payload",
"disconnect",
"finish_configuration",
"keep_alive",
"ping",
"reset_chat",
"registry_data",
"resource_pack_pop",
"resource_pack_push",
"store_cookie",
"transfer",
"update_enabled_features",
"update_tags",
"select_known_packs",
"custom_report_details",
"server_links"
],
"play": [
"bundle_delimiter",
"add_entity",
"add_experience_orb",
"animate",
"award_stats",
"block_changed_ack",
"block_destruction",
"block_entity_data",
"block_event",
"block_update",
"boss_event",
"change_difficulty",
"chunk_batch_finished",
"chunk_batch_start",
"chunks_biomes",
"clear_titles",
"command_suggestions",
"commands",
"container_close",
"container_set_content",
"container_set_data",
"container_set_slot",
"cookie_request",
"cooldown",
"custom_chat_completions",
"custom_payload",
"damage_event",
"debug_sample",
"delete_chat",
"disconnect",
"disguised_chat",
"entity_event",
"entity_position_sync",
"explode",
"forget_level_chunk",
"game_event",
"horse_screen_open",
"hurt_animation",
"initialize_border",
"keep_alive",
"level_chunk_with_light",
"level_event",
"level_particles",
"light_update",
"login",
"map_item_data",
"merchant_offers",
"move_entity_pos",
"move_entity_pos_rot",
"move_minecart_along_track",
"move_entity_rot",
"move_vehicle",
"open_book",
"open_screen",
"open_sign_editor",
"ping",
"pong_response",
"place_ghost_recipe",
"player_abilities",
"player_chat",
"player_combat_end",
"player_combat_enter",
"player_combat_kill",
"player_info_remove",
"player_info_update",
"player_look_at",
"player_position",
"player_rotation",
"recipe_book_add",
"recipe_book_remove",
"recipe_book_settings",
"remove_entities",
"remove_mob_effect",
"reset_score",
"resource_pack_pop",
"resource_pack_push",
"respawn",
"rotate_head",
"section_blocks_update",
"select_advancements_tab",
"server_data",
"set_action_bar_text",
"set_border_center",
"set_border_lerp_size",
"set_border_size",
"set_border_warning_delay",
"set_border_warning_distance",
"set_camera",
"set_chunk_cache_center",
"set_chunk_cache_radius",
"set_cursor_item",
"set_default_spawn_position",
"set_display_objective",
"set_entity_data",
"set_entity_link",
"set_entity_motion",
"set_equipment",
"set_experience",
"set_health",
"set_held_slot",
"set_objective",
"set_passengers",
"set_player_inventory",
"set_player_team",
"set_score",
"set_simulation_distance",
"set_subtitle_text",
"set_time",
"set_title_text",
"set_titles_animation",
"sound_entity",
"sound",
"start_configuration",
"stop_sound",
"store_cookie",
"system_chat",
"tab_list",
"tag_query",
"take_item_entity",
"teleport_entity",
"ticking_state",
"ticking_step",
"transfer",
"update_advancements",
"update_attributes",
"update_mob_effect",
"update_recipes",
"update_tags",
"projectile_power",
"custom_report_details",
"server_links"
]
}
}

View File

@ -1 +1,114 @@
["angry_villager","block","block_marker","bubble","cloud","crit","damage_indicator","dragon_breath","dripping_lava","falling_lava","landing_lava","dripping_water","falling_water","dust","dust_color_transition","effect","elder_guardian","enchanted_hit","enchant","end_rod","entity_effect","explosion_emitter","explosion","gust","small_gust","gust_emitter_large","gust_emitter_small","sonic_boom","falling_dust","firework","fishing","flame","infested","cherry_leaves","pale_oak_leaves","sculk_soul","sculk_charge","sculk_charge_pop","soul_fire_flame","soul","flash","happy_villager","composter","heart","instant_effect","item","vibration","trail","item_slime","item_cobweb","item_snowball","large_smoke","lava","mycelium","note","poof","portal","rain","smoke","white_smoke","sneeze","spit","squid_ink","sweep_attack","totem_of_undying","underwater","splash","witch","bubble_pop","current_down","bubble_column_up","nautilus","dolphin","campfire_cosy_smoke","campfire_signal_smoke","dripping_honey","falling_honey","landing_honey","falling_nectar","falling_spore_blossom","ash","crimson_spore","warped_spore","spore_blossom_air","dripping_obsidian_tear","falling_obsidian_tear","landing_obsidian_tear","reverse_portal","white_ash","small_flame","snowflake","dripping_dripstone_lava","falling_dripstone_lava","dripping_dripstone_water","falling_dripstone_water","glow_squid_ink","glow","wax_on","wax_off","electric_spark","scrape","shriek","egg_crack","dust_plume","trial_spawner_detection","trial_spawner_detection_ominous","vault_connection","dust_pillar","ominous_spawning","raid_omen","trial_omen","block_crumble"]
[
"angry_villager",
"block",
"block_marker",
"bubble",
"cloud",
"crit",
"damage_indicator",
"dragon_breath",
"dripping_lava",
"falling_lava",
"landing_lava",
"dripping_water",
"falling_water",
"dust",
"dust_color_transition",
"effect",
"elder_guardian",
"enchanted_hit",
"enchant",
"end_rod",
"entity_effect",
"explosion_emitter",
"explosion",
"gust",
"small_gust",
"gust_emitter_large",
"gust_emitter_small",
"sonic_boom",
"falling_dust",
"firework",
"fishing",
"flame",
"infested",
"cherry_leaves",
"pale_oak_leaves",
"sculk_soul",
"sculk_charge",
"sculk_charge_pop",
"soul_fire_flame",
"soul",
"flash",
"happy_villager",
"composter",
"heart",
"instant_effect",
"item",
"vibration",
"trail",
"item_slime",
"item_cobweb",
"item_snowball",
"large_smoke",
"lava",
"mycelium",
"note",
"poof",
"portal",
"rain",
"smoke",
"white_smoke",
"sneeze",
"spit",
"squid_ink",
"sweep_attack",
"totem_of_undying",
"underwater",
"splash",
"witch",
"bubble_pop",
"current_down",
"bubble_column_up",
"nautilus",
"dolphin",
"campfire_cosy_smoke",
"campfire_signal_smoke",
"dripping_honey",
"falling_honey",
"landing_honey",
"falling_nectar",
"falling_spore_blossom",
"ash",
"crimson_spore",
"warped_spore",
"spore_blossom_air",
"dripping_obsidian_tear",
"falling_obsidian_tear",
"landing_obsidian_tear",
"reverse_portal",
"white_ash",
"small_flame",
"snowflake",
"dripping_dripstone_lava",
"falling_dripstone_lava",
"dripping_dripstone_water",
"falling_dripstone_water",
"glow_squid_ink",
"glow",
"wax_on",
"wax_off",
"electric_spark",
"scrape",
"shriek",
"egg_crack",
"dust_plume",
"trial_spawner_detection",
"trial_spawner_detection_ominous",
"vault_connection",
"dust_pillar",
"ominous_spawning",
"raid_omen",
"trial_omen",
"block_crumble"
]

File diff suppressed because one or more lines are too long

View File

@ -1 +1,21 @@
["LIST","SIDEBAR","BELOW_NAME","TEAM_BLACK","TEAM_DARK_BLUE","TEAM_DARK_GREEN","TEAM_DARK_AQUA","TEAM_DARK_RED","TEAM_DARK_PURPLE","TEAM_GOLD","TEAM_GRAY","TEAM_DARK_GRAY","TEAM_BLUE","TEAM_GREEN","TEAM_AQUA","TEAM_RED","TEAM_LIGHT_PURPLE","TEAM_YELLOW","TEAM_WHITE"]
[
"LIST",
"SIDEBAR",
"BELOW_NAME",
"TEAM_BLACK",
"TEAM_DARK_BLUE",
"TEAM_DARK_GREEN",
"TEAM_DARK_AQUA",
"TEAM_DARK_RED",
"TEAM_DARK_PURPLE",
"TEAM_GOLD",
"TEAM_GRAY",
"TEAM_DARK_GRAY",
"TEAM_BLUE",
"TEAM_GREEN",
"TEAM_AQUA",
"TEAM_RED",
"TEAM_LIGHT_PURPLE",
"TEAM_YELLOW",
"TEAM_WHITE"
]

View File

@ -1 +1,27 @@
["generic_9x1","generic_9x2","generic_9x3","generic_9x4","generic_9x5","generic_9x6","generic_3x3","crafter_3x3","anvil","beacon","blast_furnace","brewing_stand","crafting","enchantment","furnace","grindstone","hopper","lectern","loom","merchant","shulker_box","smithing","smoker","cartography_table","stonecutter"]
[
"generic_9x1",
"generic_9x2",
"generic_9x3",
"generic_9x4",
"generic_9x5",
"generic_9x6",
"generic_3x3",
"crafter_3x3",
"anvil",
"beacon",
"blast_furnace",
"brewing_stand",
"crafting",
"enchantment",
"furnace",
"grindstone",
"hopper",
"lectern",
"loom",
"merchant",
"shulker_box",
"smithing",
"smoker",
"cartography_table",
"stonecutter"
]

View File

@ -1 +1,12 @@
["MASTER","MUSIC","RECORDS","WEATHER","BLOCKS","HOSTILE","NEUTRAL","PLAYERS","AMBIENT","VOICE"]
[
"MASTER",
"MUSIC",
"RECORDS",
"WEATHER",
"BLOCKS",
"HOSTILE",
"NEUTRAL",
"PLAYERS",
"AMBIENT",
"VOICE"
]

File diff suppressed because one or more lines are too long

View File

@ -1 +1,83 @@
{"1130":"wither_skeleton","1071":"creeper","1094":"ocelot","1114":"snow_golem","1125":"vindicator","1090":"llama","1129":"wither","1134":"zombie","1080":"fox","1085":"guardian","1076":"ender_dragon","1102":"polar_bear","1081":"frog","1131":"wolf","1070":"cow","1111":"skeleton_horse","1122":"turtle","1096":"parrot","1104":"rabbit","1093":"mule","1092":"mooshroom","1106":"salmon","1082":"ghast","1126":"wandering_trader","1109":"silverfish","1132":"zoglin","1065":"cat","1062":"blaze","1068":"chicken","1072":"dolphin","1103":"pufferfish","1108":"shulker","1119":"tadpole","1059":"axolotl","1069":"cod","1112":"slime","1113":"sniffer","1137":"zombified_piglin","1087":"horse","1105":"ravager","1110":"skeleton","1083":"glow_squid","1066":"camel","1067":"cave_spider","1057":"armadillo","1086":"hoglin","1118":"strider","1077":"enderman","1124":"villager","1128":"witch","1107":"sheep","1063":"bogged","1120":"trader_llama","1074":"drowned","1064":"breeze","1075":"elder_guardian","1115":"spider","1097":"phantom","1116":"squid","1101":"pillager","1127":"warden","1078":"endermite","1061":"bee","1089":"iron_golem","1098":"pig","1135":"zombie_horse","1117":"stray","1133":"creaking","1073":"donkey","1095":"panda","1136":"zombie_villager","1091":"magma_cube","1099":"piglin","1100":"piglin_brute","1084":"goat","1058":"allay","1121":"tropical_fish","1060":"bat","1079":"evoker","1088":"husk","1123":"vex"}
{
"1076": "ender_dragon",
"1066": "camel",
"1132": "zoglin",
"1113": "sniffer",
"1060": "bat",
"1057": "armadillo",
"1080": "fox",
"1094": "ocelot",
"1093": "mule",
"1125": "vindicator",
"1117": "stray",
"1134": "zombie",
"1110": "skeleton",
"1089": "iron_golem",
"1115": "spider",
"1111": "skeleton_horse",
"1059": "axolotl",
"1063": "bogged",
"1120": "trader_llama",
"1082": "ghast",
"1100": "piglin_brute",
"1114": "snow_golem",
"1123": "vex",
"1069": "cod",
"1077": "enderman",
"1101": "pillager",
"1107": "sheep",
"1062": "blaze",
"1112": "slime",
"1124": "villager",
"1136": "zombie_villager",
"1072": "dolphin",
"1095": "panda",
"1105": "ravager",
"1122": "turtle",
"1099": "piglin",
"1118": "strider",
"1096": "parrot",
"1067": "cave_spider",
"1137": "zombified_piglin",
"1086": "hoglin",
"1127": "warden",
"1084": "goat",
"1108": "shulker",
"1106": "salmon",
"1128": "witch",
"1135": "zombie_horse",
"1068": "chicken",
"1116": "squid",
"1131": "wolf",
"1121": "tropical_fish",
"1065": "cat",
"1092": "mooshroom",
"1064": "breeze",
"1070": "cow",
"1091": "magma_cube",
"1061": "bee",
"1088": "husk",
"1102": "polar_bear",
"1129": "wither",
"1078": "endermite",
"1075": "elder_guardian",
"1085": "guardian",
"1119": "tadpole",
"1090": "llama",
"1130": "wither_skeleton",
"1087": "horse",
"1126": "wandering_trader",
"1079": "evoker",
"1097": "phantom",
"1103": "pufferfish",
"1104": "rabbit",
"1073": "donkey",
"1133": "creaking",
"1071": "creeper",
"1109": "silverfish",
"1081": "frog",
"1098": "pig",
"1074": "drowned",
"1058": "allay",
"1083": "glow_squid"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1,84 @@
{"DISPENSER_DISPENSES":1000,"DISPENSER_FAILS":1001,"DISPENSER_LAUNCHES_PROJECTILE":1002,"FIREWORK_ROCKET_SHOOTS":1004,"FIRE_EXTINGUISHED":1009,"JUKEBOX_STARTS_PLAYING":1010,"JUKEBOX_STOPS_PLAYING":1011,"GHAST_WARNS":1015,"GHAST_SHOOTS":1016,"ENDER_DRAGON_SHOOTS":1017,"BLAZE_SHOOTS":1018,"ZOMBIE_ATTACKS_WOODEN_DOOR":1019,"ZOMBIE_ATTACKS_IRON_DOOR":1020,"ZOMBIE_BREAKS_WOODEN_DOOR":1021,"WITHER_BREAKS_BLOCK":1022,"WITHER_SPAWNS":1023,"WITHER_SHOOTS":1024,"BAT_TAKES_OFF":1025,"ZOMBIE_INFECTS_VILLAGER":1026,"ZOMBIE_VILLAGER_CURED":1027,"ENDER_DRAGON_DIES":1028,"ANVIL_DESTROYED":1029,"ANVIL_USED":1030,"ANVIL_LANDS":1031,"TRAVEL_THROUGH_PORTAL":1032,"CHORUS_FLOWER_GROWS":1033,"CHORUS_FLOWER_DIES":1034,"BREWING_STAND_BREWS":1035,"END_PORTAL_OPENED":1038,"PHANTOM_BITES":1039,"ZOMBIE_CONVERTS_TO_DROWNED":1040,"HUSK_CONVERTS_TO_ZOMBIE":1041,"GRINDSTONE_USED":1042,"LECTERN_BOOK_PAGE_TURNED":1043,"SMITHING_TABLE_USED":1044,"POINTED_DRIPSTONE_LANDS":1045,"POINTED_DRIPSTONE_DRIPS_LAVA_INTO_CAULDRON":1046,"POINTED_DRIPSTONE_DRIPS_WATER_INTO_CAULDRON":1047,"SKELETON_CONVERTS_TO_STRAY":1048,"CRAFTER_CRAFTS":1049,"CRAFTER_FAILS":1050,"field_51787":1051,"COMPOSTER_USED":1500,"LAVA_EXTINGUISHED":1501,"REDSTONE_TORCH_BURNS_OUT":1502,"END_PORTAL_FRAME_FILLED":1503,"POINTED_DRIPSTONE_DRIPS":1504,"BONE_MEAL_USED":1505,"DISPENSER_ACTIVATED":2000,"BLOCK_BROKEN":2001,"SPLASH_POTION_SPLASHED":2002,"EYE_OF_ENDER_BREAKS":2003,"SPAWNER_SPAWNS_MOB":2004,"DRAGON_BREATH_CLOUD_SPAWNS":2006,"INSTANT_SPLASH_POTION_SPLASHED":2007,"ENDER_DRAGON_BREAKS_BLOCK":2008,"WET_SPONGE_DRIES_OUT":2009,"CRAFTER_SHOOTS":2010,"BEE_FERTILIZES_PLANT":2011,"TURTLE_EGG_PLACED":2012,"SMASH_ATTACK":2013,"END_GATEWAY_SPAWNS":3000,"ENDER_DRAGON_RESURRECTED":3001,"ELECTRICITY_SPARKS":3002,"BLOCK_WAXED":3003,"WAX_REMOVED":3004,"BLOCK_SCRAPED":3005,"SCULK_CHARGE":3006,"SCULK_SHRIEKS":3007,"BLOCK_FINISHED_BRUSHING":3008,"SNIFFER_EGG_CRACKS":3009,"TRIAL_SPAWNER_SPAWNS_MOB":3011,"TRIAL_SPAWNER_SPAWNS_MOB_AT_SPAWN_POS":3012,"TRIAL_SPAWNER_DETECTS_PLAYER":3013,"TRIAL_SPAWNER_EJECTS_ITEM":3014,"VAULT_ACTIVATES":3015,"VAULT_DEACTIVATES":3016,"VAULT_EJECTS_ITEM":3017,"COBWEB_WEAVED":3018,"OMINOUS_TRIAL_SPAWNER_DETECTS_PLAYER":3019,"TRIAL_SPAWNER_TURNS_OMINOUS":3020,"OMINOUS_ITEM_SPAWNER_SPAWNS_ITEM":3021}
{
"DISPENSER_DISPENSES": 1000,
"DISPENSER_FAILS": 1001,
"DISPENSER_LAUNCHES_PROJECTILE": 1002,
"FIREWORK_ROCKET_SHOOTS": 1004,
"FIRE_EXTINGUISHED": 1009,
"JUKEBOX_STARTS_PLAYING": 1010,
"JUKEBOX_STOPS_PLAYING": 1011,
"GHAST_WARNS": 1015,
"GHAST_SHOOTS": 1016,
"ENDER_DRAGON_SHOOTS": 1017,
"BLAZE_SHOOTS": 1018,
"ZOMBIE_ATTACKS_WOODEN_DOOR": 1019,
"ZOMBIE_ATTACKS_IRON_DOOR": 1020,
"ZOMBIE_BREAKS_WOODEN_DOOR": 1021,
"WITHER_BREAKS_BLOCK": 1022,
"WITHER_SPAWNS": 1023,
"WITHER_SHOOTS": 1024,
"BAT_TAKES_OFF": 1025,
"ZOMBIE_INFECTS_VILLAGER": 1026,
"ZOMBIE_VILLAGER_CURED": 1027,
"ENDER_DRAGON_DIES": 1028,
"ANVIL_DESTROYED": 1029,
"ANVIL_USED": 1030,
"ANVIL_LANDS": 1031,
"TRAVEL_THROUGH_PORTAL": 1032,
"CHORUS_FLOWER_GROWS": 1033,
"CHORUS_FLOWER_DIES": 1034,
"BREWING_STAND_BREWS": 1035,
"END_PORTAL_OPENED": 1038,
"PHANTOM_BITES": 1039,
"ZOMBIE_CONVERTS_TO_DROWNED": 1040,
"HUSK_CONVERTS_TO_ZOMBIE": 1041,
"GRINDSTONE_USED": 1042,
"LECTERN_BOOK_PAGE_TURNED": 1043,
"SMITHING_TABLE_USED": 1044,
"POINTED_DRIPSTONE_LANDS": 1045,
"POINTED_DRIPSTONE_DRIPS_LAVA_INTO_CAULDRON": 1046,
"POINTED_DRIPSTONE_DRIPS_WATER_INTO_CAULDRON": 1047,
"SKELETON_CONVERTS_TO_STRAY": 1048,
"CRAFTER_CRAFTS": 1049,
"CRAFTER_FAILS": 1050,
"field_51787": 1051,
"COMPOSTER_USED": 1500,
"LAVA_EXTINGUISHED": 1501,
"REDSTONE_TORCH_BURNS_OUT": 1502,
"END_PORTAL_FRAME_FILLED": 1503,
"POINTED_DRIPSTONE_DRIPS": 1504,
"BONE_MEAL_USED": 1505,
"DISPENSER_ACTIVATED": 2000,
"BLOCK_BROKEN": 2001,
"SPLASH_POTION_SPLASHED": 2002,
"EYE_OF_ENDER_BREAKS": 2003,
"SPAWNER_SPAWNS_MOB": 2004,
"DRAGON_BREATH_CLOUD_SPAWNS": 2006,
"INSTANT_SPLASH_POTION_SPLASHED": 2007,
"ENDER_DRAGON_BREAKS_BLOCK": 2008,
"WET_SPONGE_DRIES_OUT": 2009,
"CRAFTER_SHOOTS": 2010,
"BEE_FERTILIZES_PLANT": 2011,
"TURTLE_EGG_PLACED": 2012,
"SMASH_ATTACK": 2013,
"END_GATEWAY_SPAWNS": 3000,
"ENDER_DRAGON_RESURRECTED": 3001,
"ELECTRICITY_SPARKS": 3002,
"BLOCK_WAXED": 3003,
"WAX_REMOVED": 3004,
"BLOCK_SCRAPED": 3005,
"SCULK_CHARGE": 3006,
"SCULK_SHRIEKS": 3007,
"BLOCK_FINISHED_BRUSHING": 3008,
"SNIFFER_EGG_CRACKS": 3009,
"TRIAL_SPAWNER_SPAWNS_MOB": 3011,
"TRIAL_SPAWNER_SPAWNS_MOB_AT_SPAWN_POS": 3012,
"TRIAL_SPAWNER_DETECTS_PLAYER": 3013,
"TRIAL_SPAWNER_EJECTS_ITEM": 3014,
"VAULT_ACTIVATES": 3015,
"VAULT_DEACTIVATES": 3016,
"VAULT_EJECTS_ITEM": 3017,
"COBWEB_WEAVED": 3018,
"OMINOUS_TRIAL_SPAWNER_DETECTS_PLAYER": 3019,
"TRIAL_SPAWNER_TURNS_OMINOUS": 3020,
"OMINOUS_ITEM_SPAWNER_SPAWNS_ITEM": 3021
}

View File

@ -1,9 +1,9 @@
use heck::ToShoutySnakeCase;
use proc_macro2::{Span, TokenStream};
use quote::{format_ident, quote, ToTokens};
use serde::Deserialize;
use std::collections::HashMap;
use syn::{Ident, LitInt, LitStr};
use syn::{Ident, LitBool, LitFloat, LitInt, LitStr};
include!("../src/tag.rs");
#[derive(Deserialize, Clone, Debug)]
pub struct Item {
@ -26,6 +26,8 @@ pub struct ItemComponents {
pub max_damage: Option<u16>,
#[serde(rename = "minecraft:attribute_modifiers")]
pub attribute_modifiers: Option<AttributeModifiers>,
#[serde(rename = "minecraft:tool")]
pub tool: Option<ToolComponent>,
}
impl ToTokens for ItemComponents {
@ -88,6 +90,59 @@ impl ToTokens for ItemComponents {
None => quote! { None },
};
let tool = match &self.tool {
Some(tool) => {
let rules_code = tool.rules.iter().map(|rule| {
let mut block_array = Vec::new();
for reg in rule.blocks.get_values() {
for tag in reg.get_values(RegistryKey::Block) {
match tag {
Some(tag) => block_array.extend(quote! { #tag }),
None => continue,
}
}
}
let speed = match rule.speed {
Some(speed) => {
quote! { Some(#speed) }
}
None => quote! { None },
};
let correct_for_drops = match rule.correct_for_drops {
Some(correct_for_drops) => {
let correct_for_drops =
LitBool::new(correct_for_drops, Span::call_site());
quote! { Some(#correct_for_drops) }
}
None => quote! { None },
};
quote! {
ToolRule {
blocks: &[#(#block_array),*],
speed: #speed,
correct_for_drops: #correct_for_drops
}
}
});
let damage_per_block = match tool.damage_per_block {
Some(speed) => {
let speed = LitInt::new(&speed.to_string(), Span::call_site());
quote! { Some(#speed) }
}
None => quote! { None },
};
let default_mining_speed = match tool.default_mining_speed {
Some(speed) => {
let speed = LitFloat::new(&speed.to_string(), Span::call_site());
quote! { Some(#speed) }
}
None => quote! { None },
};
quote! { Some(ToolComponent { rules: &[#(#rules_code),*], damage_per_block: #damage_per_block, default_mining_speed: #default_mining_speed }) }
}
None => quote! { None },
};
tokens.extend(quote! {
ItemComponents {
item_name: #item_name,
@ -96,10 +151,24 @@ impl ToTokens for ItemComponents {
damage: #damage,
max_damage: #max_damage,
attribute_modifiers: #attribute_modifiers,
tool: #tool
}
});
}
}
#[derive(Deserialize, Clone, Debug)]
pub struct ToolComponent {
rules: Vec<ToolRule>,
default_mining_speed: Option<f32>,
damage_per_block: Option<u32>,
}
#[derive(Deserialize, Clone, Debug)]
pub struct ToolRule {
blocks: RegistryEntryList,
speed: Option<f32>,
correct_for_drops: Option<bool>,
}
#[derive(Deserialize, Clone, Debug)]
pub struct JukeboxPlayable {
@ -183,6 +252,7 @@ pub(crate) fn build() -> TokenStream {
pub damage: Option<u16>,
pub max_damage: Option<u16>,
pub attribute_modifiers: Option<AttributeModifiers>,
pub tool: Option<ToolComponent>
}
#[derive(Clone, Copy, Debug)]
@ -212,6 +282,20 @@ pub(crate) fn build() -> TokenStream {
AddMultipliedTotal,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ToolComponent {
pub rules: &'static [ToolRule],
pub default_mining_speed: Option<f32>,
pub damage_per_block: Option<u32>,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ToolRule {
pub blocks: &'static [&'static str],
pub speed: Option<f32>,
pub correct_for_drops: Option<bool>,
}
impl Item {
#constants

View File

@ -1,3 +1,5 @@
pub mod tag;
pub mod item {
include!(concat!(env!("OUT_DIR"), "/item.rs"));
}

152
pumpkin-data/src/tag.rs Normal file
View File

@ -0,0 +1,152 @@
use serde::de::{self, Error, SeqAccess, Visitor};
use serde::{Deserialize, Deserializer};
use std::collections::HashMap;
use std::fmt::Formatter;
use std::sync::LazyLock;
#[derive(Deserialize, Eq, PartialEq, Hash)]
#[serde(rename_all = "snake_case")]
// TODO: We should parse this from vanilla ig
pub enum RegistryKey {
Instrument,
#[serde(rename = "worldgen/biome")]
WorldGenBiome,
PointOfInterestType,
EntityType,
DamageType,
BannerPattern,
Block,
Fluid,
Enchantment,
CatVariant,
PaintingVariant,
Item,
GameEvent,
}
const TAG_JSON: &str = include_str!("../../assets/tags.json");
#[expect(clippy::type_complexity)]
pub static TAGS: LazyLock<HashMap<RegistryKey, HashMap<String, Vec<Option<String>>>>> =
LazyLock::new(|| serde_json::from_str(TAG_JSON).expect("Valid tag collections"));
pub fn get_tag_values(tag_category: RegistryKey, tag: &str) -> Option<&Vec<Option<String>>> {
TAGS.get(&tag_category)
.expect("Should deserialize all tag categories")
.get(tag)
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum TagType {
Item(String),
Tag(String),
}
impl TagType {
pub fn get_values(&self, registry: RegistryKey) -> Vec<Option<String>> {
match self {
TagType::Item(s) => vec![Some(s.clone())],
TagType::Tag(s) => get_tag_values(registry, s).unwrap().clone(),
}
}
}
pub struct TagVisitor;
impl Visitor<'_> for TagVisitor {
type Value = TagType;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "valid tag")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
match v.strip_prefix('#') {
Some(v) => Ok(TagType::Tag(v.to_string())),
None => Ok(TagType::Item(v.to_string())),
}
}
}
impl<'de> Deserialize<'de> for TagType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(TagVisitor)
}
}
#[cfg(test)]
mod test {
use crate::tag::TAGS;
#[test]
// This test assures that all tags that exist are loaded into the tags registry
fn load_tags() {
assert!(!TAGS.is_empty())
}
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum RegistryEntryList {
Single(TagType),
Many(Vec<TagType>),
}
impl RegistryEntryList {
pub fn get_values(&self) -> Vec<TagType> {
match self {
RegistryEntryList::Single(s) => vec![s.clone()],
RegistryEntryList::Many(s) => s.clone(),
}
}
}
impl PartialEq<TagType> for RegistryEntryList {
fn eq(&self, other: &TagType) -> bool {
match self {
RegistryEntryList::Single(ingredient) => other == ingredient,
RegistryEntryList::Many(ingredients) => ingredients.contains(other),
}
}
}
impl<'de> Deserialize<'de> for RegistryEntryList {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct SlotTypeVisitor;
impl<'de> Visitor<'de> for SlotTypeVisitor {
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "valid ingredient slot")
}
type Value = RegistryEntryList;
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(RegistryEntryList::Single(TagVisitor.visit_str(v)?))
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut ingredients: Vec<TagType> = vec![];
while let Some(element) = seq.next_element()? {
ingredients.push(element)
}
if ingredients.len() == 1 {
Ok(RegistryEntryList::Single(ingredients[0].clone()))
} else {
Ok(RegistryEntryList::Many(ingredients))
}
}
}
deserializer.deserialize_any(SlotTypeVisitor)
}
}

View File

@ -1,25 +1,24 @@
use pumpkin_data::item::Item;
use pumpkin_registry::{
flatten_3x3, get_tag_values, IngredientSlot, IngredientType, RecipeResult, TagCategory, RECIPES,
use pumpkin_data::{
item::Item,
tag::{get_tag_values, RegistryEntryList, RegistryKey, TagType},
};
use pumpkin_registry::{flatten_3x3, RecipeResult, RECIPES};
use pumpkin_world::item::ItemStack;
use rayon::prelude::*;
#[inline(always)]
fn check_ingredient_type(ingredient_type: &IngredientType, input: ItemStack) -> bool {
fn check_ingredient_type(ingredient_type: &TagType, input: ItemStack) -> bool {
match ingredient_type {
IngredientType::Tag(tag) => {
let items = match get_tag_values(TagCategory::Item, tag) {
TagType::Tag(tag) => {
let _items = match get_tag_values(RegistryKey::Item, tag) {
Some(items) => items,
None => return false,
};
items
.iter()
.any(|tag| check_ingredient_type(&tag.to_ingredient_type(), input))
}
IngredientType::Item(item) => {
Item::from_name(item).is_some_and(|item| item.id == input.item.id)
// TODO
false
// items.iter().any(|tag| check_ingredient_type(&tag, input))
}
TagType::Item(item) => Item::from_name(item).is_some_and(|item| item.id == input.item.id),
}
}
@ -65,19 +64,19 @@ pub fn check_if_matches_crafting(input: [[Option<ItemStack>; 3]; 3]) -> Option<I
})?
}
fn ingredient_slot_check(recipe_item: &IngredientSlot, input: ItemStack) -> bool {
fn ingredient_slot_check(recipe_item: &RegistryEntryList, input: ItemStack) -> bool {
match recipe_item {
IngredientSlot::Single(ingredient) => check_ingredient_type(ingredient, input),
IngredientSlot::Many(ingredients) => ingredients
RegistryEntryList::Single(ingredient) => check_ingredient_type(ingredient, input),
RegistryEntryList::Many(ingredients) => ingredients
.iter()
.any(|ingredient| check_ingredient_type(ingredient, input)),
}
}
fn shapeless_crafting_match(
input: [[Option<ItemStack>; 3]; 3],
pattern: &[[[Option<IngredientSlot>; 3]; 3]],
pattern: &[[[Option<RegistryEntryList>; 3]; 3]],
) -> bool {
let mut pattern: Vec<IngredientSlot> = pattern
let mut pattern: Vec<RegistryEntryList> = pattern
.iter()
.flatten()
.flatten()

View File

@ -171,9 +171,9 @@ impl From<Option<&ItemStack>> for Slot {
}
}
impl From<&Option<ItemStack>> for Slot {
fn from(item: &Option<ItemStack>) -> Self {
item.map(|stack| Self::from(&stack))
.unwrap_or(Slot::empty())
}
}
// impl From<&Option<ItemStack>> for Slot {
// fn from(item: &Option<ItemStack>) -> Self {
// item.map(|stack| Self::from(&stack))
// .unwrap_or(Slot::empty())
// }
// }

View File

@ -4,6 +4,7 @@ version.workspace = true
edition.workspace = true
[dependencies]
pumpkin-data = { path = "../pumpkin-data" }
pumpkin-protocol = { path = "../pumpkin-protocol" }
pumpkin-nbt = { path = "../pumpkin-nbt" }
pumpkin-util = { path = "../pumpkin-util" }

View File

@ -11,11 +11,8 @@ use instrument::Instrument;
use jukebox_song::JukeboxSong;
use paint::Painting;
use pumpkin_protocol::{client::config::RegistryEntry, codec::identifier::Identifier};
pub use recipe::{
flatten_3x3, IngredientSlot, IngredientType, Recipe, RecipeResult, RecipeType, RECIPES,
};
pub use recipe::{flatten_3x3, Recipe, RecipeResult, RecipeType, RECIPES};
use serde::{Deserialize, Serialize};
pub use tags::{get_tag_values, TagCategory, TagType};
use trim_material::TrimMaterial;
use trim_pattern::TrimPattern;
use wolf::WolfVariant;
@ -30,7 +27,6 @@ mod instrument;
mod jukebox_song;
mod paint;
mod recipe;
mod tags;
mod trim_material;
mod trim_pattern;
mod wolf;

View File

@ -1,9 +1,7 @@
mod read;
mod recipe_formats;
pub use read::{
ingredients::IngredientSlot, ingredients::IngredientType, Recipe, RecipeResult, RecipeType,
};
pub use read::{Recipe, RecipeResult, RecipeType};
use std::sync::LazyLock;
pub fn flatten_3x3<T: Clone>(input: [[Option<T>; 3]; 3]) -> [[Option<T>; 3]; 3] {
let mut final_output = [const { [const { None }; 3] }; 3];

View File

@ -1,10 +1,11 @@
use crate::flatten_3x3;
use crate::recipe::read::ingredients::{IngredientSlot, Ingredients};
use crate::recipe::read::ingredients::Ingredients;
use crate::recipe::read::SpecialCraftingType::{
ArmorDye, BannerDuplicate, BookCloning, Firework, RepairItem, ShieldDecoration,
ShulkerboxColoring, SuspiciousStew, TippedArrow,
};
use crate::recipe::recipe_formats::{ShapedCrafting, ShapelessCrafting};
use pumpkin_data::tag::RegistryEntryList;
use serde::de::{Error, MapAccess, Visitor};
use serde::{de, Deserialize, Deserializer};
use std::collections::HashMap;
@ -73,107 +74,12 @@ impl FromStr for RecipeType {
}
}
pub mod ingredients {
use serde::de::{Error, SeqAccess, Visitor};
use serde::{de, Deserialize, Deserializer};
use std::collections::HashMap;
use pumpkin_data::tag::RegistryEntryList;
use serde::de::{SeqAccess, Visitor};
use serde::{Deserialize, Deserializer};
use std::fmt::Formatter;
use std::hash::Hash;
#[derive(Clone, PartialEq, Debug, Eq, Hash)]
pub enum IngredientType {
Item(String),
Tag(String),
}
impl IngredientType {
pub fn to_all_types(&self, item_tags: &HashMap<String, Vec<String>>) -> Vec<String> {
match &self {
IngredientType::Tag(tag) => item_tags.get(tag).unwrap().clone(),
IngredientType::Item(s) => vec![s.to_string()],
}
}
}
struct IngredientTypeVisitor;
impl Visitor<'_> for IngredientTypeVisitor {
type Value = IngredientType;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "valid item type")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
match v.strip_prefix('#') {
Some(tag) => Ok(IngredientType::Tag(tag.to_string())),
None => Ok(IngredientType::Item(v.to_string())),
}
}
}
impl<'de> Deserialize<'de> for IngredientType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(IngredientTypeVisitor)
}
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum IngredientSlot {
Single(IngredientType),
Many(Vec<IngredientType>),
}
impl PartialEq<IngredientType> for IngredientSlot {
fn eq(&self, other: &IngredientType) -> bool {
match self {
IngredientSlot::Single(ingredient) => other == ingredient,
IngredientSlot::Many(ingredients) => ingredients.contains(other),
}
}
}
impl<'de> Deserialize<'de> for IngredientSlot {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct SlotTypeVisitor;
impl<'de> Visitor<'de> for SlotTypeVisitor {
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "valid ingredient slot")
}
type Value = IngredientSlot;
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(IngredientSlot::Single(IngredientTypeVisitor.visit_str(v)?))
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut ingredients: Vec<IngredientType> = vec![];
while let Some(element) = seq.next_element()? {
ingredients.push(element)
}
if ingredients.len() == 1 {
Ok(IngredientSlot::Single(ingredients[0].clone()))
} else {
Ok(IngredientSlot::Many(ingredients))
}
}
}
deserializer.deserialize_any(SlotTypeVisitor)
}
}
pub struct Ingredients(pub Vec<IngredientSlot>);
pub struct Ingredients(pub Vec<RegistryEntryList>);
impl<'de> Deserialize<'de> for Ingredients {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
@ -293,7 +199,7 @@ impl<'de> Deserialize<'de> for RecipeResult {
deserializer.deserialize_any(ResultVisitor)
}
}
pub struct RecipeKeys(pub(super) HashMap<char, IngredientSlot>);
pub struct RecipeKeys(pub(super) HashMap<char, RegistryEntryList>);
impl<'de> Deserialize<'de> for RecipeKeys {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
@ -302,7 +208,7 @@ impl<'de> Deserialize<'de> for RecipeKeys {
{
struct KeyVisitor;
impl<'de> Visitor<'de> for KeyVisitor {
type Value = HashMap<char, IngredientSlot>;
type Value = HashMap<char, RegistryEntryList>;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "existing key inside recipe")
@ -316,7 +222,7 @@ impl<'de> Deserialize<'de> for RecipeKeys {
while let Some(next) = map.next_key()? {
let test: &str = next;
let c: char = test.chars().next().unwrap();
let ingredient_type: IngredientSlot = map.next_value()?;
let ingredient_type: RegistryEntryList = map.next_value()?;
return_map.insert(c, ingredient_type);
}
Ok(return_map)
@ -379,15 +285,15 @@ impl<'de> Deserialize<'de> for Recipe {
let mut pattern: Option<Vec<&str>> = None;
let mut result: Option<RecipeResult> = None;
let mut ingredients: Option<Ingredients> = None;
let mut ingredient: Option<IngredientSlot> = None;
let mut addition: Option<IngredientSlot> = None;
let mut base: Option<IngredientSlot> = None;
let mut template: Option<IngredientSlot> = None;
let mut ingredient: Option<RegistryEntryList> = None;
let mut addition: Option<RegistryEntryList> = None;
let mut base: Option<RegistryEntryList> = None;
let mut template: Option<RegistryEntryList> = None;
let mut cookingtime: Option<u16> = None;
let mut experience: Option<f32> = None;
let mut show_notification: Option<bool> = None;
let mut transmute_input: Option<IngredientSlot> = None;
let mut transmute_material: Option<IngredientSlot> = None;
let mut transmute_input: Option<RegistryEntryList> = None;
let mut transmute_material: Option<RegistryEntryList> = None;
while let Some(key) = map.next_key()? {
(match key {
Fields::Type => visit_option(&mut map, &mut recipe_type, "type"),
@ -521,12 +427,12 @@ fn visit_option<'de, T: Deserialize<'de>, Map: MapAccess<'de>>(
pub struct Recipe {
pub recipe_type: RecipeType,
pattern: Vec<[[Option<IngredientSlot>; 3]; 3]>,
pattern: Vec<[[Option<RegistryEntryList>; 3]; 3]>,
result: RecipeResult,
}
impl Recipe {
pub fn pattern(&self) -> &[[[Option<IngredientSlot>; 3]; 3]] {
pub fn pattern(&self) -> &[[[Option<RegistryEntryList>; 3]; 3]] {
&self.pattern
}
@ -556,7 +462,7 @@ impl RecipeTrait for Test {
self.recipe_type
}
fn pattern(&self) -> Vec<[[Option<IngredientSlot>; 3]; 3]> {
fn pattern(&self) -> Vec<[[Option<RegistryEntryList>; 3]; 3]> {
vec![[const { [const { None }; 3] }; 3]]
}
@ -573,7 +479,7 @@ impl<T: RecipeTrait> From<T> for Recipe {
pub trait RecipeTrait: Sized {
fn recipe_type(&self) -> RecipeType;
fn pattern(&self) -> Vec<[[Option<IngredientSlot>; 3]; 3]>;
fn pattern(&self) -> Vec<[[Option<RegistryEntryList>; 3]; 3]>;
fn result(self) -> RecipeResult;

View File

@ -1,7 +1,7 @@
use pumpkin_data::tag::RegistryEntryList;
use super::super::recipe::RecipeType;
use super::read::{
ingredients::IngredientSlot, CraftingType, RecipeKeys, RecipeResult, RecipeTrait,
};
use super::read::{CraftingType, RecipeKeys, RecipeResult, RecipeTrait};
pub struct ShapedCrafting {
keys: RecipeKeys,
pattern: [[Option<char>; 3]; 3],
@ -11,7 +11,7 @@ impl RecipeKeys {
fn pattern_to_thing(
&self,
pattern: [[Option<char>; 3]; 3],
) -> [[Option<IngredientSlot>; 3]; 3] {
) -> [[Option<RegistryEntryList>; 3]; 3] {
pattern
.map(|row| row.map(|maybe_char| maybe_char.and_then(|char| self.0.get(&char).cloned())))
}
@ -31,7 +31,7 @@ impl RecipeTrait for ShapedCrafting {
RecipeType::Crafting(CraftingType::Shaped)
}
fn pattern(&self) -> Vec<[[Option<IngredientSlot>; 3]; 3]> {
fn pattern(&self) -> Vec<[[Option<RegistryEntryList>; 3]; 3]> {
vec![self.keys.pattern_to_thing(self.pattern)]
}
@ -41,12 +41,12 @@ impl RecipeTrait for ShapedCrafting {
}
pub struct ShapelessCrafting {
ingredients: Vec<IngredientSlot>,
ingredients: Vec<RegistryEntryList>,
output: RecipeResult,
}
impl ShapelessCrafting {
pub(crate) fn new(ingredients: Vec<IngredientSlot>, output: RecipeResult) -> Self {
pub(crate) fn new(ingredients: Vec<RegistryEntryList>, output: RecipeResult) -> Self {
Self {
ingredients,
output,
@ -62,7 +62,7 @@ impl RecipeTrait for ShapelessCrafting {
// Iterating over all permutations is cheaper than resolving and iterating over all tags when trying to check if recipe
// is correct. Otherwise, we would have to backtrack and check for each item in the recipe input, which tags they are inside,
// and then sort those permutations
fn pattern(&self) -> Vec<[[std::option::Option<IngredientSlot>; 3]; 3]> {
fn pattern(&self) -> Vec<[[std::option::Option<RegistryEntryList>; 3]; 3]> {
vec![
self.ingredients.clone(), //.permutations(self.ingredients.len())
]

View File

@ -1,113 +0,0 @@
use serde::de::{Error, Visitor};
use serde::{Deserialize, Deserializer};
use std::collections::HashMap;
use std::fmt::Formatter;
use std::sync::LazyLock;
use crate::IngredientType;
#[derive(Deserialize, Eq, PartialEq, Hash)]
pub enum TagCategory {
#[serde(rename = "instrument")]
Instrument,
#[serde(rename = "worldgen/biome")]
WorldGenBiome,
#[serde(rename = "point_of_interest_type")]
PointOfInterest,
#[serde(rename = "entity_type")]
Entity,
#[serde(rename = "damage_type")]
DamageType,
#[serde(rename = "banner_pattern")]
BannerPattern,
#[serde(rename = "block")]
Block,
#[serde(rename = "fluid")]
Fluid,
#[serde(rename = "enchantment")]
Enchantment,
#[serde(rename = "cat_variant")]
Cat,
#[serde(rename = "painting_variant")]
Painting,
#[serde(rename = "item")]
Item,
#[serde(rename = "game_event")]
GameEvent,
}
pub static TAGS: LazyLock<HashMap<TagCategory, HashMap<String, Vec<TagType>>>> =
LazyLock::new(|| {
let mut map = HashMap::new();
let tags_str = include_str!("../../assets/tags.json");
let tags: Vec<TagCollection> =
serde_json::from_str(tags_str).expect("Valid tag collections");
for tag in tags {
map.insert(tag.name, tag.values);
}
map
});
pub fn get_tag_values(tag_category: TagCategory, tag: &str) -> Option<&Vec<TagType>> {
TAGS.get(&tag_category)
.expect("Should deserialize all tag categories")
.get(tag)
}
#[derive(Deserialize)]
pub struct TagCollection {
name: TagCategory,
#[serde(flatten)]
values: HashMap<String, Vec<TagType>>,
}
#[derive(Clone)]
pub enum TagType {
Item(String),
Tag(String),
}
impl TagType {
pub fn to_ingredient_type(&self) -> IngredientType {
match self {
TagType::Tag(tag) => IngredientType::Tag(tag.to_string()),
TagType::Item(item) => IngredientType::Item(item.to_string()),
}
}
}
impl<'de> Deserialize<'de> for TagType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct TagVisitor;
impl Visitor<'_> for TagVisitor {
type Value = TagType;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "valid tag")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
match v.strip_prefix('#') {
Some(v) => Ok(TagType::Tag(v.to_string())),
None => Ok(TagType::Item(v.to_string())),
}
}
}
deserializer.deserialize_str(TagVisitor)
}
}
#[cfg(test)]
mod test {
use crate::tags::TAGS;
#[test]
// This test assures that all tags that exist are loaded into the tags registry
fn load_tags() {
assert!(!TAGS.is_empty())
}
}

View File

@ -134,6 +134,7 @@ pub struct State {
pub air: bool,
pub luminance: u8,
pub burnable: bool,
pub tool_required: bool,
pub opacity: Option<u32>,
pub replaceable: bool,
pub collision_shapes: Vec<u16>,

View File

@ -27,4 +27,16 @@ impl ItemStack {
pub fn new(item_count: u8, item: Item) -> Self {
Self { item_count, item }
}
pub fn is_correct_for_drops(&self, block: &str) -> bool {
if let Some(tool) = self.item.components.tool {
for rule in tool.rules {
if rule.correct_for_drops.is_none() || !rule.blocks.contains(&block) {
continue;
}
return rule.correct_for_drops.unwrap();
}
}
false
}
}

View File

@ -1,3 +1,4 @@
use pumpkin_world::block::registry::State;
use std::{
num::NonZeroU8,
sync::{
@ -874,6 +875,16 @@ impl Player {
.await;
}
pub async fn can_harvest(&self, block: &State, block_name: &str) -> bool {
!block.tool_required
|| self
.inventory
.lock()
.await
.held_item()
.map_or_else(|| false, |e| e.is_correct_for_drops(block_name))
}
pub async fn send_message(
&self,
message: &TextComponent,

View File

@ -873,17 +873,15 @@ impl Player {
let entity = &self.living_entity.entity;
let world = &entity.world.read().await;
let block = world.get_block(&location).await;
world
.break_block(
server,
&location,
Some(self.clone()),
self.gamemode.load() != GameMode::Creative,
)
.await;
let state = world.get_block_state(&location).await;
if let Ok(block) = block {
if let Ok(state) = state {
let drop = self.gamemode.load() != GameMode::Creative
&& self.can_harvest(state, &block.name).await;
world
.break_block(server, &location, Some(self.clone()), drop)
.await;
}
server
.block_registry
.broken(block, &self, location, server)