diff --git a/assets/tags.json b/assets/tags.json new file mode 100644 index 0000000..2866add --- /dev/null +++ b/assets/tags.json @@ -0,0 +1,607 @@ +{ + "minecraft:banner_pattern": { + "minecraft:no_item_required": [ + "minecraft:square_bottom_left", + "minecraft:square_bottom_right", + "minecraft:square_top_left", + "minecraft:square_top_right", + "minecraft:stripe_bottom", + "minecraft:stripe_top", + "minecraft:stripe_left", + "minecraft:stripe_right", + "minecraft:stripe_center", + "minecraft:stripe_middle", + "minecraft:stripe_downright", + "minecraft:stripe_downleft", + "minecraft:small_stripes", + "minecraft:cross", + "minecraft:straight_cross", + "minecraft:triangle_bottom", + "minecraft:triangle_top", + "minecraft:triangles_bottom", + "minecraft:triangles_top", + "minecraft:diagonal_left", + "minecraft:diagonal_up_right", + "minecraft:diagonal_up_left", + "minecraft:diagonal_right", + "minecraft:circle", + "minecraft:rhombus", + "minecraft:half_vertical", + "minecraft:half_horizontal", + "minecraft:half_vertical_right", + "minecraft:half_horizontal_bottom", + "minecraft:border", + "minecraft:gradient", + "minecraft:gradient_up" + ] + }, + "minecraft:damage_type": { + "minecraft:always_hurts_ender_dragons": [ + "#minecraft:is_explosion" + ], + "minecraft:always_kills_armor_stands": [ + "minecraft:arrow", + "minecraft:trident", + "minecraft:fireball", + "minecraft:wither_skull", + "minecraft:wind_charge" + ], + "minecraft:always_most_significant_fall": [ + "minecraft:out_of_world" + ], + "minecraft:always_triggers_silverfish": [ + "minecraft:magic" + ], + "minecraft:avoids_guardian_thorns": [ + "minecraft:magic", + "minecraft:thorns", + "#minecraft:is_explosion" + ], + "minecraft:burns_armor_stands": [ + "minecraft:on_fire" + ], + "minecraft:burn_from_stepping": [ + "minecraft:campfire", + "minecraft:hot_floor" + ], + "minecraft:bypasses_armor": [ + "minecraft:on_fire", + "minecraft:in_wall", + "minecraft:cramming", + "minecraft:drown", + "minecraft:fly_into_wall", + "minecraft:generic", + "minecraft:wither", + "minecraft:dragon_breath", + "minecraft:starve", + "minecraft:fall", + "minecraft:ender_pearl", + "minecraft:freeze", + "minecraft:stalagmite", + "minecraft:magic", + "minecraft:indirect_magic", + "minecraft:out_of_world", + "minecraft:generic_kill", + "minecraft:sonic_boom", + "minecraft:outside_border" + ], + "minecraft:bypasses_effects": [ + "minecraft:starve" + ], + "minecraft:bypasses_enchantments": [ + "minecraft:sonic_boom" + ], + "minecraft:bypasses_invulnerability": [ + "minecraft:out_of_world", + "minecraft:generic_kill" + ], + "minecraft:bypasses_resistance": [ + "minecraft:out_of_world", + "minecraft:generic_kill" + ], + "minecraft:bypasses_shield": [ + "#minecraft:bypasses_armor", + "minecraft:falling_anvil", + "minecraft:falling_stalactite" + ], + "minecraft:bypasses_wolf_armor": [ + "#minecraft:bypasses_invulnerability", + "minecraft:cramming", + "minecraft:drown", + "minecraft:dry_out", + "minecraft:freeze", + "minecraft:in_wall", + "minecraft:indirect_magic", + "minecraft:magic", + "minecraft:outside_border", + "minecraft:starve", + "minecraft:thorns", + "minecraft:wither" + ], + "minecraft:can_break_armor_stand": [ + "minecraft:player_explosion", + "#minecraft:is_player_attack" + ], + "minecraft:damages_helmet": [ + "minecraft:falling_anvil", + "minecraft:falling_block", + "minecraft:falling_stalactite" + ], + "minecraft:ignites_armor_stands": [ + "minecraft:in_fire", + "minecraft:campfire" + ], + "minecraft:is_drowning": [ + "minecraft:drown" + ], + "minecraft:is_explosion": [ + "minecraft:fireworks", + "minecraft:explosion", + "minecraft:player_explosion", + "minecraft:bad_respawn_point" + ], + "minecraft:is_fall": [ + "minecraft:fall", + "minecraft:ender_pearl", + "minecraft:stalagmite" + ], + "minecraft:is_fire": [ + "minecraft:in_fire", + "minecraft:campfire", + "minecraft:on_fire", + "minecraft:lava", + "minecraft:hot_floor", + "minecraft:unattributed_fireball", + "minecraft:fireball" + ], + "minecraft:is_freezing": [ + "minecraft:freeze" + ], + "minecraft:is_lightning": [ + "minecraft:lightning_bolt" + ], + "minecraft:is_player_attack": [ + "minecraft:player_attack", + "minecraft:mace_smash" + ], + "minecraft:is_projectile": [ + "minecraft:arrow", + "minecraft:trident", + "minecraft:mob_projectile", + "minecraft:unattributed_fireball", + "minecraft:fireball", + "minecraft:wither_skull", + "minecraft:thrown", + "minecraft:wind_charge" + ], + "minecraft:mace_smash": [ + "minecraft:mace_smash" + ], + "minecraft:no_anger": [ + "minecraft:mob_attack_no_aggro" + ], + "minecraft:no_impact": [ + "minecraft:drown" + ], + "minecraft:no_knockback": [ + "minecraft:explosion", + "minecraft:player_explosion", + "minecraft:bad_respawn_point", + "minecraft:in_fire", + "minecraft:lightning_bolt", + "minecraft:on_fire", + "minecraft:lava", + "minecraft:hot_floor", + "minecraft:in_wall", + "minecraft:cramming", + "minecraft:drown", + "minecraft:starve", + "minecraft:cactus", + "minecraft:fall", + "minecraft:ender_pearl", + "minecraft:fly_into_wall", + "minecraft:out_of_world", + "minecraft:generic", + "minecraft:magic", + "minecraft:wither", + "minecraft:dragon_breath", + "minecraft:dry_out", + "minecraft:sweet_berry_bush", + "minecraft:freeze", + "minecraft:stalagmite", + "minecraft:outside_border", + "minecraft:generic_kill", + "minecraft:campfire" + ], + "minecraft:panic_causes": [ + "#minecraft:panic_environmental_causes", + "minecraft:arrow", + "minecraft:dragon_breath", + "minecraft:explosion", + "minecraft:fireball", + "minecraft:fireworks", + "minecraft:indirect_magic", + "minecraft:magic", + "minecraft:mob_attack", + "minecraft:mob_projectile", + "minecraft:player_explosion", + "minecraft:sonic_boom", + "minecraft:sting", + "minecraft:thrown", + "minecraft:trident", + "minecraft:unattributed_fireball", + "minecraft:wind_charge", + "minecraft:wither", + "minecraft:wither_skull", + "#minecraft:is_player_attack" + ], + "minecraft:panic_environmental_causes": [ + "minecraft:cactus", + "minecraft:freeze", + "minecraft:hot_floor", + "minecraft:in_fire", + "minecraft:lava", + "minecraft:lightning_bolt", + "minecraft:on_fire" + ], + "minecraft:witch_resistant_to": [ + "minecraft:magic", + "minecraft:indirect_magic", + "minecraft:sonic_boom", + "minecraft:thorns" + ], + "minecraft:wither_immune_to": [ + "minecraft:drown" + ] + }, + "minecraft:painting_variant": { + "minecraft:placeable": [ + "minecraft:kebab", + "minecraft:aztec", + "minecraft:alban", + "minecraft:aztec2", + "minecraft:bomb", + "minecraft:plant", + "minecraft:wasteland", + "minecraft:pool", + "minecraft:courbet", + "minecraft:sea", + "minecraft:sunset", + "minecraft:creebet", + "minecraft:wanderer", + "minecraft:graham", + "minecraft:match", + "minecraft:bust", + "minecraft:stage", + "minecraft:void", + "minecraft:skull_and_roses", + "minecraft:wither", + "minecraft:fighters", + "minecraft:pointer", + "minecraft:pigscene", + "minecraft:burning_skull", + "minecraft:skeleton", + "minecraft:donkey_kong", + "minecraft:baroque", + "minecraft:humble", + "minecraft:meditative", + "minecraft:prairie_ride", + "minecraft:unpacked", + "minecraft:backyard", + "minecraft:bouquet", + "minecraft:cavebird", + "minecraft:changing", + "minecraft:cotan", + "minecraft:endboss", + "minecraft:fern", + "minecraft:finding", + "minecraft:lowmist", + "minecraft:orb", + "minecraft:owlemons", + "minecraft:passage", + "minecraft:pond", + "minecraft:sunflowers", + "minecraft:tides" + ] + }, + "minecraft:worldgen/biome": { + "minecraft:allows_surface_slime_spawns": [ + "minecraft:swamp", + "minecraft:mangrove_swamp" + ], + "minecraft:allows_tropical_fish_spawns_at_any_height": [ + "minecraft:lush_caves" + ], + "minecraft:has_closer_water_fog": [ + "minecraft:swamp", + "minecraft:mangrove_swamp" + ], + "minecraft:increased_fire_burnout": [ + "minecraft:bamboo_jungle", + "minecraft:mushroom_fields", + "minecraft:mangrove_swamp", + "minecraft:snowy_slopes", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:swamp", + "minecraft:jungle" + ], + "minecraft:is_badlands": [ + "minecraft:badlands", + "minecraft:eroded_badlands", + "minecraft:wooded_badlands" + ], + "minecraft:is_beach": [ + "minecraft:beach", + "minecraft:snowy_beach" + ], + "minecraft:is_deep_ocean": [ + "minecraft:deep_frozen_ocean", + "minecraft:deep_cold_ocean", + "minecraft:deep_ocean", + "minecraft:deep_lukewarm_ocean" + ], + "minecraft:is_end": [ + "minecraft:the_end", + "minecraft:end_highlands", + "minecraft:end_midlands", + "minecraft:small_end_islands", + "minecraft:end_barrens" + ], + "minecraft:is_forest": [ + "minecraft:forest", + "minecraft:flower_forest", + "minecraft:birch_forest", + "minecraft:old_growth_birch_forest", + "minecraft:dark_forest", + "minecraft:pale_garden", + "minecraft:grove" + ], + "minecraft:is_hill": [ + "minecraft:windswept_hills", + "minecraft:windswept_forest", + "minecraft:windswept_gravelly_hills" + ], + "minecraft:is_jungle": [ + "minecraft:bamboo_jungle", + "minecraft:jungle", + "minecraft:sparse_jungle" + ], + "minecraft:is_mountain": [ + "minecraft:meadow", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:stony_peaks", + "minecraft:snowy_slopes", + "minecraft:cherry_grove" + ], + "minecraft:is_nether": [ + "minecraft:nether_wastes", + "minecraft:soul_sand_valley", + "minecraft:crimson_forest", + "minecraft:warped_forest", + "minecraft:basalt_deltas" + ], + "minecraft:is_ocean": [ + "#minecraft:is_deep_ocean", + "minecraft:frozen_ocean", + "minecraft:ocean", + "minecraft:cold_ocean", + "minecraft:lukewarm_ocean", + "minecraft:warm_ocean" + ], + "minecraft:is_overworld": [ + "minecraft:mushroom_fields", + "minecraft:deep_frozen_ocean", + "minecraft:frozen_ocean", + "minecraft:deep_cold_ocean", + "minecraft:cold_ocean", + "minecraft:deep_ocean", + "minecraft:ocean", + "minecraft:deep_lukewarm_ocean", + "minecraft:lukewarm_ocean", + "minecraft:warm_ocean", + "minecraft:stony_shore", + "minecraft:swamp", + "minecraft:mangrove_swamp", + "minecraft:snowy_slopes", + "minecraft:snowy_plains", + "minecraft:snowy_beach", + "minecraft:windswept_gravelly_hills", + "minecraft:grove", + "minecraft:windswept_hills", + "minecraft:snowy_taiga", + "minecraft:windswept_forest", + "minecraft:taiga", + "minecraft:plains", + "minecraft:meadow", + "minecraft:beach", + "minecraft:forest", + "minecraft:old_growth_spruce_taiga", + "minecraft:flower_forest", + "minecraft:birch_forest", + "minecraft:dark_forest", + "minecraft:savanna_plateau", + "minecraft:savanna", + "minecraft:jungle", + "minecraft:badlands", + "minecraft:desert", + "minecraft:wooded_badlands", + "minecraft:jagged_peaks", + "minecraft:stony_peaks", + "minecraft:frozen_river", + "minecraft:river", + "minecraft:ice_spikes", + "minecraft:old_growth_pine_taiga", + "minecraft:sunflower_plains", + "minecraft:old_growth_birch_forest", + "minecraft:sparse_jungle", + "minecraft:bamboo_jungle", + "minecraft:eroded_badlands", + "minecraft:windswept_savanna", + "minecraft:cherry_grove", + "minecraft:pale_garden", + "minecraft:frozen_peaks", + "minecraft:dripstone_caves", + "minecraft:lush_caves", + "minecraft:deep_dark" + ], + "minecraft:is_river": [ + "minecraft:river", + "minecraft:frozen_river" + ], + "minecraft:is_savanna": [ + "minecraft:savanna", + "minecraft:savanna_plateau", + "minecraft:windswept_savanna" + ], + "minecraft:is_taiga": [ + "minecraft:taiga", + "minecraft:snowy_taiga", + "minecraft:old_growth_pine_taiga", + "minecraft:old_growth_spruce_taiga" + ], + "minecraft:mineshaft_blocking": [ + "minecraft:deep_dark" + ], + "minecraft:more_frequent_drowned_spawns": [ + "#minecraft:is_river" + ], + "minecraft:plays_underwater_music": [ + "#minecraft:is_ocean", + "#minecraft:is_river" + ], + "minecraft:polar_bears_spawn_on_alternate_blocks": [ + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean" + ], + "minecraft:produces_corals_from_bonemeal": [ + "minecraft:warm_ocean" + ], + "minecraft:reduce_water_ambient_spawns": [ + "#minecraft:is_river" + ], + "minecraft:required_ocean_monument_surrounding": [ + "#minecraft:is_ocean", + "#minecraft:is_river" + ], + "minecraft:snow_golem_melts": [ + "minecraft:badlands", + "minecraft:basalt_deltas", + "minecraft:crimson_forest", + "minecraft:desert", + "minecraft:eroded_badlands", + "minecraft:nether_wastes", + "minecraft:savanna", + "minecraft:savanna_plateau", + "minecraft:soul_sand_valley", + "minecraft:warped_forest", + "minecraft:windswept_savanna", + "minecraft:wooded_badlands" + ], + "minecraft:spawns_cold_variant_frogs": [ + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:snowy_slopes", + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean", + "minecraft:grove", + "minecraft:deep_dark", + "minecraft:frozen_river", + "minecraft:snowy_taiga", + "minecraft:snowy_beach", + "#minecraft:is_end" + ], + "minecraft:spawns_gold_rabbits": [ + "minecraft:desert" + ], + "minecraft:spawns_snow_foxes": [ + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:frozen_ocean", + "minecraft:snowy_taiga", + "minecraft:frozen_river", + "minecraft:snowy_beach", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:snowy_slopes", + "minecraft:grove" + ], + "minecraft:spawns_warm_variant_frogs": [ + "minecraft:desert", + "minecraft:warm_ocean", + "#minecraft:is_jungle", + "#minecraft:is_savanna", + "#minecraft:is_nether", + "#minecraft:is_badlands", + "minecraft:mangrove_swamp" + ], + "minecraft:spawns_white_rabbits": [ + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:frozen_ocean", + "minecraft:snowy_taiga", + "minecraft:frozen_river", + "minecraft:snowy_beach", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:snowy_slopes", + "minecraft:grove" + ], + "minecraft:stronghold_biased_to": [ + "minecraft:plains", + "minecraft:sunflower_plains", + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:desert", + "minecraft:forest", + "minecraft:flower_forest", + "minecraft:birch_forest", + "minecraft:dark_forest", + "minecraft:pale_garden", + "minecraft:old_growth_birch_forest", + "minecraft:old_growth_pine_taiga", + "minecraft:old_growth_spruce_taiga", + "minecraft:taiga", + "minecraft:snowy_taiga", + "minecraft:savanna", + "minecraft:savanna_plateau", + "minecraft:windswept_hills", + "minecraft:windswept_gravelly_hills", + "minecraft:windswept_forest", + "minecraft:windswept_savanna", + "minecraft:jungle", + "minecraft:sparse_jungle", + "minecraft:bamboo_jungle", + "minecraft:badlands", + "minecraft:eroded_badlands", + "minecraft:wooded_badlands", + "minecraft:meadow", + "minecraft:grove", + "minecraft:snowy_slopes", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:stony_peaks", + "minecraft:mushroom_fields", + "minecraft:dripstone_caves", + "minecraft:lush_caves" + ], + "minecraft:water_on_map_outlines": [ + "#minecraft:is_ocean", + "#minecraft:is_river", + "minecraft:swamp", + "minecraft:mangrove_swamp" + ], + "minecraft:without_patrol_spawns": [ + "minecraft:mushroom_fields" + ], + "minecraft:without_wandering_trader_spawns": [ + "minecraft:the_void" + ], + "minecraft:without_zombie_sieges": [ + "minecraft:mushroom_fields" + ] + } +} \ No newline at end of file diff --git a/src/net/cache.rs b/src/net/cache.rs index 98369eb..0067065 100644 --- a/src/net/cache.rs +++ b/src/net/cache.rs @@ -25,7 +25,7 @@ use crate::{ protocol::{ datatypes::VarInt, packets::{ - login::registry::{AllRegistries, Registry}, + login::registry::{AllRegistries, Registry, AllTags}, play::ChunkDataUpdateLightC, }, Encoder, @@ -33,6 +33,7 @@ use crate::{ world::{blocks::Blocks, BlockEntity, Container, World}, CrawlState, }; +use crate::protocol::packets::login::registry::RegistryItem; #[derive(Debug)] pub struct WorldCache { @@ -123,6 +124,25 @@ impl WorldCache { } } +#[derive(Debug)] +pub struct TagCache { + pub encoded: Vec, +} + +impl From<&AllTags> for TagCache { + fn from(tags: &AllTags) -> Self { + let mut encoder = Encoder::new(); + + encoder + .append_packet(tags) + .expect("Failed to encode tags"); + + Self { + encoded: encoder.take().to_vec() + } + } +} + #[derive(Debug)] pub struct RegistryCache { pub encoded: Vec, diff --git a/src/protocol/packets/login/registry/tags.rs b/src/protocol/packets/login/registry/tags.rs new file mode 100644 index 0000000..ef3352f --- /dev/null +++ b/src/protocol/packets/login/registry/tags.rs @@ -0,0 +1,39 @@ +use std::collections::HashMap; +use crate::protocol::{Encode, Packet}; +use crate::protocol::datatypes::{Bounded, VarInt}; + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct AllTags(pub HashMap); + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct Tags(pub HashMap>); + +impl Packet for AllTags { + const ID: i32 = 0x0D; +} + +impl Encode for AllTags { + fn encode(&self, mut w: impl std::io::Write) -> color_eyre::Result<()> { + VarInt(self.0.len() as i32).encode(&mut w)?; + + for (registry, tags) in self.0.clone() { + Bounded::<&'_ str>(registry.as_str()).encode(&mut w)?; + tags.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Encode for Tags { + fn encode(&self, mut w: impl std::io::Write) -> color_eyre::Result<()> { + VarInt(self.0.len() as i32).encode(&mut w)?; + + for (name, _) in self.0.clone() { + Bounded::<&'_ str>(name.as_str()).encode(&mut w)?; + VarInt(0).encode(&mut w)?; + } + + Ok(()) + } +} \ No newline at end of file