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:
parent
d6a3506627
commit
3d1e0bf35c
@ -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
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
435074
assets/blocks.json
435074
assets/blocks.json
File diff suppressed because one or more lines are too long
1
assets/chunk.json
Normal file
1
assets/chunk.json
Normal file
File diff suppressed because one or more lines are too long
@ -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
187703
assets/density_function.json
187703
assets/density_function.json
File diff suppressed because one or more lines are too long
33776
assets/density_function_tests.json
Normal file
33776
assets/density_function_tests.json
Normal file
File diff suppressed because it is too large
Load Diff
7003
assets/en_us.json
7003
assets/en_us.json
File diff suppressed because one or more lines are too long
6079
assets/entities.json
6079
assets/entities.json
File diff suppressed because one or more lines are too long
@ -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"
|
||||
]
|
||||
@ -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
54
assets/game_rules.json
Normal 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"
|
||||
}
|
||||
26429
assets/items.json
26429
assets/items.json
File diff suppressed because one or more lines are too long
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1
assets/meta_data_types.json
Normal file
1
assets/meta_data_types.json
Normal 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
1599
assets/multi_noise.json
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_0_0.chunk
Normal file
98306
assets/no_blend_no_beard_0_0.chunk
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_7_4.chunk
Normal file
98306
assets/no_blend_no_beard_7_4.chunk
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_only_cell_cache_0_0.chunk
Normal file
98306
assets/no_blend_no_beard_only_cell_cache_0_0.chunk
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_only_cell_cache_flat_cache_0_0.chunk
Normal file
98306
assets/no_blend_no_beard_only_cell_cache_flat_cache_0_0.chunk
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_only_cell_cache_interpolated_0_0.chunk
Normal file
98306
assets/no_blend_no_beard_only_cell_cache_interpolated_0_0.chunk
Normal file
File diff suppressed because it is too large
Load Diff
98306
assets/no_blend_no_beard_only_cell_cache_once_cache_0_0.chunk
Normal file
98306
assets/no_blend_no_beard_only_cell_cache_once_cache_0_0.chunk
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
19039
assets/recipes.json
19039
assets/recipes.json
File diff suppressed because one or more lines are too long
@ -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"
|
||||
]
|
||||
@ -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"
|
||||
]
|
||||
@ -1 +1,12 @@
|
||||
["MASTER","MUSIC","RECORDS","WEATHER","BLOCKS","HOSTILE","NEUTRAL","PLAYERS","AMBIENT","VOICE"]
|
||||
[
|
||||
"MASTER",
|
||||
"MUSIC",
|
||||
"RECORDS",
|
||||
"WEATHER",
|
||||
"BLOCKS",
|
||||
"HOSTILE",
|
||||
"NEUTRAL",
|
||||
"PLAYERS",
|
||||
"AMBIENT",
|
||||
"VOICE"
|
||||
]
|
||||
1654
assets/sounds.json
1654
assets/sounds.json
File diff suppressed because one or more lines are too long
@ -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
11500
assets/tags.json
11500
assets/tags.json
File diff suppressed because one or more lines are too long
@ -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
|
||||
}
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
152
pumpkin-data/src/tag.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
|
||||
@ -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())
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -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" }
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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())
|
||||
]
|
||||
|
||||
@ -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())
|
||||
}
|
||||
}
|
||||
@ -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>,
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user