diff --git a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java index e1d2d6277a7..059bfde4cc8 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -52,6 +52,7 @@ public void generate(InputStream resourceFile, String packageName, String typeNa Map replacementOptions = new HashMap<>(); replacementOptions.put("minecraft:", ""); replacementOptions.put(".", "_"); + replacementOptions.put("/", "_"); // Use data json.keySet().forEach(namespace -> { final String constantName = extractNamespaces(namespace, replacementOptions); diff --git a/code-generators/src/main/java/net/minestom/codegen/Generators.java b/code-generators/src/main/java/net/minestom/codegen/Generators.java index 140c1afc966..9bde44108f5 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -42,6 +42,11 @@ public static void main(String[] args) { generator.generate(resource("attributes.json"), "net.minestom.server.attribute", "Attribute", "AttributeImpl", "Attributes"); generator.generate(resource("fluids.json"), "net.minestom.server.fluid", "Fluid", "FluidImpl", "Fluids"); generator.generate(resource("feature_flags.json"), "net.minestom.server.featureflag", "FeatureFlag", "FeatureFlagImpl", "FeatureFlags"); + generator.generate(resource("tags/gameplay_tags.json"), "net.minestom.server.gametag", "Tag", "GameEventTag", "GameEventTags"); + generator.generate(resource("tags/entity_type_tags.json"), "net.minestom.server.gametag", "Tag", "EntityTag", "EntityTags"); + generator.generate(resource("tags/block_tags.json"), "net.minestom.server.gametag", "Tag", "BlockTag", "BlockTags"); + generator.generate(resource("tags/item_tags.json"), "net.minestom.server.gametag", "Tag", "ItemTag", "ItemTags"); + generator.generate(resource("tags/fluid_tags.json"), "net.minestom.server.gametag", "Tag", "FluidTag", "FluidTags"); LOGGER.info("Finished generating code"); } diff --git a/src/autogenerated/java/net/minestom/server/gametag/BlockTags.java b/src/autogenerated/java/net/minestom/server/gametag/BlockTags.java new file mode 100644 index 00000000000..7477c702593 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/gametag/BlockTags.java @@ -0,0 +1,351 @@ +package net.minestom.server.gametag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface BlockTags { + Tag SNOW = BlockTag.get("minecraft:snow"); + + Tag CHERRY_LOGS = BlockTag.get("minecraft:cherry_logs"); + + Tag FIRE = BlockTag.get("minecraft:fire"); + + Tag WOODEN_SLABS = BlockTag.get("minecraft:wooden_slabs"); + + Tag PLANKS = BlockTag.get("minecraft:planks"); + + Tag CONCRETE_POWDER = BlockTag.get("minecraft:concrete_powder"); + + Tag BUTTONS = BlockTag.get("minecraft:buttons"); + + Tag LUSH_GROUND_REPLACEABLE = BlockTag.get("minecraft:lush_ground_replaceable"); + + Tag LAVA_POOL_STONE_CANNOT_REPLACE = BlockTag.get("minecraft:lava_pool_stone_cannot_replace"); + + Tag RABBITS_SPAWNABLE_ON = BlockTag.get("minecraft:rabbits_spawnable_on"); + + Tag SLABS = BlockTag.get("minecraft:slabs"); + + Tag SPRUCE_LOGS = BlockTag.get("minecraft:spruce_logs"); + + Tag CRYSTAL_SOUND_BLOCKS = BlockTag.get("minecraft:crystal_sound_blocks"); + + Tag WALL_HANGING_SIGNS = BlockTag.get("minecraft:wall_hanging_signs"); + + Tag COPPER_ORES = BlockTag.get("minecraft:copper_ores"); + + Tag DAMPENS_VIBRATIONS = BlockTag.get("minecraft:dampens_vibrations"); + + Tag MINEABLE_SHOVEL = BlockTag.get("minecraft:mineable/shovel"); + + Tag MINEABLE_HOE = BlockTag.get("minecraft:mineable/hoe"); + + Tag MINEABLE_AXE = BlockTag.get("minecraft:mineable/axe"); + + Tag MINEABLE_PICKAXE = BlockTag.get("minecraft:mineable/pickaxe"); + + Tag CORALS = BlockTag.get("minecraft:corals"); + + Tag CAMPFIRES = BlockTag.get("minecraft:campfires"); + + Tag DEAD_BUSH_MAY_PLACE_ON = BlockTag.get("minecraft:dead_bush_may_place_on"); + + Tag REPLACEABLE_BY_TREES = BlockTag.get("minecraft:replaceable_by_trees"); + + Tag DEEPSLATE_ORE_REPLACEABLES = BlockTag.get("minecraft:deepslate_ore_replaceables"); + + Tag IRON_ORES = BlockTag.get("minecraft:iron_ores"); + + Tag WOODEN_PRESSURE_PLATES = BlockTag.get("minecraft:wooden_pressure_plates"); + + Tag COAL_ORES = BlockTag.get("minecraft:coal_ores"); + + Tag STAIRS = BlockTag.get("minecraft:stairs"); + + Tag COMPLETES_FIND_TREE_TUTORIAL = BlockTag.get("minecraft:completes_find_tree_tutorial"); + + Tag CANDLES = BlockTag.get("minecraft:candles"); + + Tag GOATS_SPAWNABLE_ON = BlockTag.get("minecraft:goats_spawnable_on"); + + Tag BASE_STONE_OVERWORLD = BlockTag.get("minecraft:base_stone_overworld"); + + Tag BEEHIVES = BlockTag.get("minecraft:beehives"); + + Tag CAMEL_SAND_STEP_SOUND_BLOCKS = BlockTag.get("minecraft:camel_sand_step_sound_blocks"); + + Tag TRAIL_RUINS_REPLACEABLE = BlockTag.get("minecraft:trail_ruins_replaceable"); + + Tag MOSS_REPLACEABLE = BlockTag.get("minecraft:moss_replaceable"); + + Tag WALL_POST_OVERRIDE = BlockTag.get("minecraft:wall_post_override"); + + Tag WALLS = BlockTag.get("minecraft:walls"); + + Tag WALL_SIGNS = BlockTag.get("minecraft:wall_signs"); + + Tag UNDERWATER_BONEMEALS = BlockTag.get("minecraft:underwater_bonemeals"); + + Tag REPLACEABLE = BlockTag.get("minecraft:replaceable"); + + Tag STANDING_SIGNS = BlockTag.get("minecraft:standing_signs"); + + Tag GOLD_ORES = BlockTag.get("minecraft:gold_ores"); + + Tag NYLIUM = BlockTag.get("minecraft:nylium"); + + Tag MAINTAINS_FARMLAND = BlockTag.get("minecraft:maintains_farmland"); + + Tag DIAMOND_ORES = BlockTag.get("minecraft:diamond_ores"); + + Tag NEEDS_IRON_TOOL = BlockTag.get("minecraft:needs_iron_tool"); + + Tag WITHER_IMMUNE = BlockTag.get("minecraft:wither_immune"); + + Tag CANDLE_CAKES = BlockTag.get("minecraft:candle_cakes"); + + Tag PIGLIN_REPELLENTS = BlockTag.get("minecraft:piglin_repellents"); + + Tag BIRCH_LOGS = BlockTag.get("minecraft:birch_logs"); + + Tag CORAL_PLANTS = BlockTag.get("minecraft:coral_plants"); + + Tag MANGROVE_ROOTS_CAN_GROW_THROUGH = BlockTag.get("minecraft:mangrove_roots_can_grow_through"); + + Tag ENCHANTMENT_POWER_PROVIDER = BlockTag.get("minecraft:enchantment_power_provider"); + + Tag ANVIL = BlockTag.get("minecraft:anvil"); + + Tag EMERALD_ORES = BlockTag.get("minecraft:emerald_ores"); + + Tag ENCHANTMENT_POWER_TRANSMITTER = BlockTag.get("minecraft:enchantment_power_transmitter"); + + Tag FALL_DAMAGE_RESETTING = BlockTag.get("minecraft:fall_damage_resetting"); + + Tag FROG_PREFER_JUMP_TO = BlockTag.get("minecraft:frog_prefer_jump_to"); + + Tag SOUL_SPEED_BLOCKS = BlockTag.get("minecraft:soul_speed_blocks"); + + Tag WOODEN_TRAPDOORS = BlockTag.get("minecraft:wooden_trapdoors"); + + Tag DRAGON_IMMUNE = BlockTag.get("minecraft:dragon_immune"); + + Tag WOODEN_STAIRS = BlockTag.get("minecraft:wooden_stairs"); + + Tag WOOL_CARPETS = BlockTag.get("minecraft:wool_carpets"); + + Tag ALL_SIGNS = BlockTag.get("minecraft:all_signs"); + + Tag GUARDED_BY_PIGLINS = BlockTag.get("minecraft:guarded_by_piglins"); + + Tag GEODE_INVALID_BLOCKS = BlockTag.get("minecraft:geode_invalid_blocks"); + + Tag BEE_GROWABLES = BlockTag.get("minecraft:bee_growables"); + + Tag WOODEN_DOORS = BlockTag.get("minecraft:wooden_doors"); + + Tag BEACON_BASE_BLOCKS = BlockTag.get("minecraft:beacon_base_blocks"); + + Tag FLOWERS = BlockTag.get("minecraft:flowers"); + + Tag SNOW_LAYER_CAN_SURVIVE_ON = BlockTag.get("minecraft:snow_layer_can_survive_on"); + + Tag JUNGLE_LOGS = BlockTag.get("minecraft:jungle_logs"); + + Tag BAMBOO_BLOCKS = BlockTag.get("minecraft:bamboo_blocks"); + + Tag INSIDE_STEP_SOUND_BLOCKS = BlockTag.get("minecraft:inside_step_sound_blocks"); + + Tag WART_BLOCKS = BlockTag.get("minecraft:wart_blocks"); + + Tag COMBINATION_STEP_SOUND_BLOCKS = BlockTag.get("minecraft:combination_step_sound_blocks"); + + Tag STONE_BRICKS = BlockTag.get("minecraft:stone_bricks"); + + Tag INVALID_SPAWN_INSIDE = BlockTag.get("minecraft:invalid_spawn_inside"); + + Tag INFINIBURN_END = BlockTag.get("minecraft:infiniburn_end"); + + Tag DIRT = BlockTag.get("minecraft:dirt"); + + Tag MANGROVE_LOGS = BlockTag.get("minecraft:mangrove_logs"); + + Tag FEATURES_CANNOT_REPLACE = BlockTag.get("minecraft:features_cannot_replace"); + + Tag CROPS = BlockTag.get("minecraft:crops"); + + Tag TRAPDOORS = BlockTag.get("minecraft:trapdoors"); + + Tag TERRACOTTA = BlockTag.get("minecraft:terracotta"); + + Tag SWORD_EFFICIENT = BlockTag.get("minecraft:sword_efficient"); + + Tag INFINIBURN_NETHER = BlockTag.get("minecraft:infiniburn_nether"); + + Tag AXOLOTLS_SPAWNABLE_ON = BlockTag.get("minecraft:axolotls_spawnable_on"); + + Tag CAULDRONS = BlockTag.get("minecraft:cauldrons"); + + Tag ALL_HANGING_SIGNS = BlockTag.get("minecraft:all_hanging_signs"); + + Tag FOXES_SPAWNABLE_ON = BlockTag.get("minecraft:foxes_spawnable_on"); + + Tag CLIMBABLE = BlockTag.get("minecraft:climbable"); + + Tag ACACIA_LOGS = BlockTag.get("minecraft:acacia_logs"); + + Tag BEDS = BlockTag.get("minecraft:beds"); + + Tag ICE = BlockTag.get("minecraft:ice"); + + Tag WITHER_SUMMON_BASE_BLOCKS = BlockTag.get("minecraft:wither_summon_base_blocks"); + + Tag TALL_FLOWERS = BlockTag.get("minecraft:tall_flowers"); + + Tag POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = BlockTag.get("minecraft:polar_bears_spawnable_on_alternate"); + + Tag SMALL_FLOWERS = BlockTag.get("minecraft:small_flowers"); + + Tag SMELTS_TO_GLASS = BlockTag.get("minecraft:smelts_to_glass"); + + Tag DRIPSTONE_REPLACEABLE_BLOCKS = BlockTag.get("minecraft:dripstone_replaceable_blocks"); + + Tag REDSTONE_ORES = BlockTag.get("minecraft:redstone_ores"); + + Tag WALL_CORALS = BlockTag.get("minecraft:wall_corals"); + + Tag FLOWER_POTS = BlockTag.get("minecraft:flower_pots"); + + Tag WOODEN_FENCES = BlockTag.get("minecraft:wooden_fences"); + + Tag WOLVES_SPAWNABLE_ON = BlockTag.get("minecraft:wolves_spawnable_on"); + + Tag FENCES = BlockTag.get("minecraft:fences"); + + Tag OAK_LOGS = BlockTag.get("minecraft:oak_logs"); + + Tag ENDERMAN_HOLDABLE = BlockTag.get("minecraft:enderman_holdable"); + + Tag SNOW_LAYER_CANNOT_SURVIVE_ON = BlockTag.get("minecraft:snow_layer_cannot_survive_on"); + + Tag WOODEN_BUTTONS = BlockTag.get("minecraft:wooden_buttons"); + + Tag STONE_PRESSURE_PLATES = BlockTag.get("minecraft:stone_pressure_plates"); + + Tag SMALL_DRIPLEAF_PLACEABLE = BlockTag.get("minecraft:small_dripleaf_placeable"); + + Tag OCCLUDES_VIBRATION_SIGNALS = BlockTag.get("minecraft:occludes_vibration_signals"); + + Tag WARPED_STEMS = BlockTag.get("minecraft:warped_stems"); + + Tag IMPERMEABLE = BlockTag.get("minecraft:impermeable"); + + Tag HOGLIN_REPELLENTS = BlockTag.get("minecraft:hoglin_repellents"); + + Tag PREVENT_MOB_SPAWNING_INSIDE = BlockTag.get("minecraft:prevent_mob_spawning_inside"); + + Tag SNIFFER_EGG_HATCH_BOOST = BlockTag.get("minecraft:sniffer_egg_hatch_boost"); + + Tag LEAVES = BlockTag.get("minecraft:leaves"); + + Tag PORTALS = BlockTag.get("minecraft:portals"); + + Tag LOGS = BlockTag.get("minecraft:logs"); + + Tag CONVERTABLE_TO_MUD = BlockTag.get("minecraft:convertable_to_mud"); + + Tag SIGNS = BlockTag.get("minecraft:signs"); + + Tag MANGROVE_LOGS_CAN_GROW_THROUGH = BlockTag.get("minecraft:mangrove_logs_can_grow_through"); + + Tag OVERWORLD_CARVER_REPLACEABLES = BlockTag.get("minecraft:overworld_carver_replaceables"); + + Tag AZALEA_GROWS_ON = BlockTag.get("minecraft:azalea_grows_on"); + + Tag FENCE_GATES = BlockTag.get("minecraft:fence_gates"); + + Tag PARROTS_SPAWNABLE_ON = BlockTag.get("minecraft:parrots_spawnable_on"); + + Tag INFINIBURN_OVERWORLD = BlockTag.get("minecraft:infiniburn_overworld"); + + Tag WOOL = BlockTag.get("minecraft:wool"); + + Tag AZALEA_ROOT_REPLACEABLE = BlockTag.get("minecraft:azalea_root_replaceable"); + + Tag ANCIENT_CITY_REPLACEABLE = BlockTag.get("minecraft:ancient_city_replaceable"); + + Tag SAPLINGS = BlockTag.get("minecraft:saplings"); + + Tag ANIMALS_SPAWNABLE_ON = BlockTag.get("minecraft:animals_spawnable_on"); + + Tag PRESSURE_PLATES = BlockTag.get("minecraft:pressure_plates"); + + Tag SCULK_REPLACEABLE = BlockTag.get("minecraft:sculk_replaceable"); + + Tag BAMBOO_PLANTABLE_ON = BlockTag.get("minecraft:bamboo_plantable_on"); + + Tag SCULK_REPLACEABLE_WORLD_GEN = BlockTag.get("minecraft:sculk_replaceable_world_gen"); + + Tag STONE_BUTTONS = BlockTag.get("minecraft:stone_buttons"); + + Tag SAND = BlockTag.get("minecraft:sand"); + + Tag MUSHROOM_GROW_BLOCK = BlockTag.get("minecraft:mushroom_grow_block"); + + Tag UNSTABLE_BOTTOM_CENTER = BlockTag.get("minecraft:unstable_bottom_center"); + + Tag VIBRATION_RESONATORS = BlockTag.get("minecraft:vibration_resonators"); + + Tag SHULKER_BOXES = BlockTag.get("minecraft:shulker_boxes"); + + Tag CEILING_HANGING_SIGNS = BlockTag.get("minecraft:ceiling_hanging_signs"); + + Tag NETHER_CARVER_REPLACEABLES = BlockTag.get("minecraft:nether_carver_replaceables"); + + Tag BIG_DRIPLEAF_PLACEABLE = BlockTag.get("minecraft:big_dripleaf_placeable"); + + Tag LOGS_THAT_BURN = BlockTag.get("minecraft:logs_that_burn"); + + Tag DRAGON_TRANSPARENT = BlockTag.get("minecraft:dragon_transparent"); + + Tag DOORS = BlockTag.get("minecraft:doors"); + + Tag RAILS = BlockTag.get("minecraft:rails"); + + Tag BASE_STONE_NETHER = BlockTag.get("minecraft:base_stone_nether"); + + Tag STONE_ORE_REPLACEABLES = BlockTag.get("minecraft:stone_ore_replaceables"); + + Tag SOUL_FIRE_BASE_BLOCKS = BlockTag.get("minecraft:soul_fire_base_blocks"); + + Tag FROGS_SPAWNABLE_ON = BlockTag.get("minecraft:frogs_spawnable_on"); + + Tag NEEDS_DIAMOND_TOOL = BlockTag.get("minecraft:needs_diamond_tool"); + + Tag OVERWORLD_NATURAL_LOGS = BlockTag.get("minecraft:overworld_natural_logs"); + + Tag CAVE_VINES = BlockTag.get("minecraft:cave_vines"); + + Tag DARK_OAK_LOGS = BlockTag.get("minecraft:dark_oak_logs"); + + Tag MOOSHROOMS_SPAWNABLE_ON = BlockTag.get("minecraft:mooshrooms_spawnable_on"); + + Tag SNAPS_GOAT_HORN = BlockTag.get("minecraft:snaps_goat_horn"); + + Tag CRIMSON_STEMS = BlockTag.get("minecraft:crimson_stems"); + + Tag CORAL_BLOCKS = BlockTag.get("minecraft:coral_blocks"); + + Tag NEEDS_STONE_TOOL = BlockTag.get("minecraft:needs_stone_tool"); + + Tag LAPIS_ORES = BlockTag.get("minecraft:lapis_ores"); + + Tag SNIFFER_DIGGABLE_BLOCK = BlockTag.get("minecraft:sniffer_diggable_block"); + + Tag BANNERS = BlockTag.get("minecraft:banners"); + + Tag VALID_SPAWN = BlockTag.get("minecraft:valid_spawn"); + + Tag STRIDER_WARM_BLOCKS = BlockTag.get("minecraft:strider_warm_blocks"); +} diff --git a/src/autogenerated/java/net/minestom/server/gametag/EntityTags.java b/src/autogenerated/java/net/minestom/server/gametag/EntityTags.java new file mode 100644 index 00000000000..1664d8746f1 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/gametag/EntityTags.java @@ -0,0 +1,41 @@ +package net.minestom.server.gametag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface EntityTags { + Tag FALL_DAMAGE_IMMUNE = EntityTag.get("minecraft:fall_damage_immune"); + + Tag RAIDERS = EntityTag.get("minecraft:raiders"); + + Tag NON_CONTROLLING_RIDER = EntityTag.get("minecraft:non_controlling_rider"); + + Tag AXOLOTL_ALWAYS_HOSTILES = EntityTag.get("minecraft:axolotl_always_hostiles"); + + Tag SKELETONS = EntityTag.get("minecraft:skeletons"); + + Tag ARROWS = EntityTag.get("minecraft:arrows"); + + Tag CAN_BREATHE_UNDER_WATER = EntityTag.get("minecraft:can_breathe_under_water"); + + Tag FROG_FOOD = EntityTag.get("minecraft:frog_food"); + + Tag FREEZE_HURTS_EXTRA_TYPES = EntityTag.get("minecraft:freeze_hurts_extra_types"); + + Tag FREEZE_IMMUNE_ENTITY_TYPES = EntityTag.get("minecraft:freeze_immune_entity_types"); + + Tag UNDEAD = EntityTag.get("minecraft:undead"); + + Tag IMPACT_PROJECTILES = EntityTag.get("minecraft:impact_projectiles"); + + Tag ZOMBIES = EntityTag.get("minecraft:zombies"); + + Tag DISMOUNTS_UNDERWATER = EntityTag.get("minecraft:dismounts_underwater"); + + Tag AXOLOTL_HUNT_TARGETS = EntityTag.get("minecraft:axolotl_hunt_targets"); + + Tag POWDER_SNOW_WALKABLE_MOBS = EntityTag.get("minecraft:powder_snow_walkable_mobs"); + + Tag BEEHIVE_INHABITORS = EntityTag.get("minecraft:beehive_inhabitors"); +} diff --git a/src/autogenerated/java/net/minestom/server/gametag/FluidTags.java b/src/autogenerated/java/net/minestom/server/gametag/FluidTags.java new file mode 100644 index 00000000000..ee2ce63ade0 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/gametag/FluidTags.java @@ -0,0 +1,11 @@ +package net.minestom.server.gametag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface FluidTags { + Tag LAVA = FluidTag.get("minecraft:lava"); + + Tag WATER = FluidTag.get("minecraft:water"); +} diff --git a/src/autogenerated/java/net/minestom/server/gametag/GameEventTags.java b/src/autogenerated/java/net/minestom/server/gametag/GameEventTags.java new file mode 100644 index 00000000000..2db6f68dc74 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/gametag/GameEventTags.java @@ -0,0 +1,17 @@ +package net.minestom.server.gametag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface GameEventTags { + Tag WARDEN_CAN_LISTEN = GameEventTag.get("minecraft:warden_can_listen"); + + Tag SHRIEKER_CAN_LISTEN = GameEventTag.get("minecraft:shrieker_can_listen"); + + Tag ALLAY_CAN_LISTEN = GameEventTag.get("minecraft:allay_can_listen"); + + Tag VIBRATIONS = GameEventTag.get("minecraft:vibrations"); + + Tag IGNORE_VIBRATIONS_SNEAKING = GameEventTag.get("minecraft:ignore_vibrations_sneaking"); +} diff --git a/src/autogenerated/java/net/minestom/server/gametag/ItemTags.java b/src/autogenerated/java/net/minestom/server/gametag/ItemTags.java new file mode 100644 index 00000000000..daae1bf9563 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/gametag/ItemTags.java @@ -0,0 +1,205 @@ +package net.minestom.server.gametag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface ItemTags { + Tag CHERRY_LOGS = ItemTag.get("minecraft:cherry_logs"); + + Tag WOODEN_SLABS = ItemTag.get("minecraft:wooden_slabs"); + + Tag SWORDS = ItemTag.get("minecraft:swords"); + + Tag PLANKS = ItemTag.get("minecraft:planks"); + + Tag BUTTONS = ItemTag.get("minecraft:buttons"); + + Tag LECTERN_BOOKS = ItemTag.get("minecraft:lectern_books"); + + Tag SLABS = ItemTag.get("minecraft:slabs"); + + Tag SPRUCE_LOGS = ItemTag.get("minecraft:spruce_logs"); + + Tag FREEZE_IMMUNE_WEARABLES = ItemTag.get("minecraft:freeze_immune_wearables"); + + Tag COPPER_ORES = ItemTag.get("minecraft:copper_ores"); + + Tag DAMPENS_VIBRATIONS = ItemTag.get("minecraft:dampens_vibrations"); + + Tag CHEST_BOATS = ItemTag.get("minecraft:chest_boats"); + + Tag CLUSTER_MAX_HARVESTABLES = ItemTag.get("minecraft:cluster_max_harvestables"); + + Tag IRON_ORES = ItemTag.get("minecraft:iron_ores"); + + Tag WOODEN_PRESSURE_PLATES = ItemTag.get("minecraft:wooden_pressure_plates"); + + Tag STONE_TOOL_MATERIALS = ItemTag.get("minecraft:stone_tool_materials"); + + Tag COAL_ORES = ItemTag.get("minecraft:coal_ores"); + + Tag SNIFFER_FOOD = ItemTag.get("minecraft:sniffer_food"); + + Tag ARROWS = ItemTag.get("minecraft:arrows"); + + Tag STONE_CRAFTING_MATERIALS = ItemTag.get("minecraft:stone_crafting_materials"); + + Tag STAIRS = ItemTag.get("minecraft:stairs"); + + Tag COMPLETES_FIND_TREE_TUTORIAL = ItemTag.get("minecraft:completes_find_tree_tutorial"); + + Tag CANDLES = ItemTag.get("minecraft:candles"); + + Tag DECORATED_POT_SHERDS = ItemTag.get("minecraft:decorated_pot_sherds"); + + Tag WALLS = ItemTag.get("minecraft:walls"); + + Tag COMPASSES = ItemTag.get("minecraft:compasses"); + + Tag AXES = ItemTag.get("minecraft:axes"); + + Tag GOLD_ORES = ItemTag.get("minecraft:gold_ores"); + + Tag DIAMOND_ORES = ItemTag.get("minecraft:diamond_ores"); + + Tag BEACON_PAYMENT_ITEMS = ItemTag.get("minecraft:beacon_payment_items"); + + Tag PIGLIN_REPELLENTS = ItemTag.get("minecraft:piglin_repellents"); + + Tag BIRCH_LOGS = ItemTag.get("minecraft:birch_logs"); + + Tag BOOKSHELF_BOOKS = ItemTag.get("minecraft:bookshelf_books"); + + Tag ANVIL = ItemTag.get("minecraft:anvil"); + + Tag EMERALD_ORES = ItemTag.get("minecraft:emerald_ores"); + + Tag WOODEN_TRAPDOORS = ItemTag.get("minecraft:wooden_trapdoors"); + + Tag WOODEN_STAIRS = ItemTag.get("minecraft:wooden_stairs"); + + Tag WOOL_CARPETS = ItemTag.get("minecraft:wool_carpets"); + + Tag BOATS = ItemTag.get("minecraft:boats"); + + Tag WOODEN_DOORS = ItemTag.get("minecraft:wooden_doors"); + + Tag TRIM_MATERIALS = ItemTag.get("minecraft:trim_materials"); + + Tag FLOWERS = ItemTag.get("minecraft:flowers"); + + Tag JUNGLE_LOGS = ItemTag.get("minecraft:jungle_logs"); + + Tag BAMBOO_BLOCKS = ItemTag.get("minecraft:bamboo_blocks"); + + Tag WART_BLOCKS = ItemTag.get("minecraft:wart_blocks"); + + Tag STONE_BRICKS = ItemTag.get("minecraft:stone_bricks"); + + Tag IGNORED_BY_PIGLIN_BABIES = ItemTag.get("minecraft:ignored_by_piglin_babies"); + + Tag DIRT = ItemTag.get("minecraft:dirt"); + + Tag MANGROVE_LOGS = ItemTag.get("minecraft:mangrove_logs"); + + Tag TRAPDOORS = ItemTag.get("minecraft:trapdoors"); + + Tag TERRACOTTA = ItemTag.get("minecraft:terracotta"); + + Tag TRIMMABLE_ARMOR = ItemTag.get("minecraft:trimmable_armor"); + + Tag ACACIA_LOGS = ItemTag.get("minecraft:acacia_logs"); + + Tag PICKAXES = ItemTag.get("minecraft:pickaxes"); + + Tag NOTEBLOCK_TOP_INSTRUMENTS = ItemTag.get("minecraft:noteblock_top_instruments"); + + Tag BEDS = ItemTag.get("minecraft:beds"); + + Tag CREEPER_DROP_MUSIC_DISCS = ItemTag.get("minecraft:creeper_drop_music_discs"); + + Tag TALL_FLOWERS = ItemTag.get("minecraft:tall_flowers"); + + Tag SMALL_FLOWERS = ItemTag.get("minecraft:small_flowers"); + + Tag BREAKS_DECORATED_POTS = ItemTag.get("minecraft:breaks_decorated_pots"); + + Tag SMELTS_TO_GLASS = ItemTag.get("minecraft:smelts_to_glass"); + + Tag TOOLS = ItemTag.get("minecraft:tools"); + + Tag REDSTONE_ORES = ItemTag.get("minecraft:redstone_ores"); + + Tag WOODEN_FENCES = ItemTag.get("minecraft:wooden_fences"); + + Tag FENCES = ItemTag.get("minecraft:fences"); + + Tag VILLAGER_PLANTABLE_SEEDS = ItemTag.get("minecraft:villager_plantable_seeds"); + + Tag OAK_LOGS = ItemTag.get("minecraft:oak_logs"); + + Tag PIGLIN_FOOD = ItemTag.get("minecraft:piglin_food"); + + Tag MUSIC_DISCS = ItemTag.get("minecraft:music_discs"); + + Tag PIGLIN_LOVED = ItemTag.get("minecraft:piglin_loved"); + + Tag WOODEN_BUTTONS = ItemTag.get("minecraft:wooden_buttons"); + + Tag WARPED_STEMS = ItemTag.get("minecraft:warped_stems"); + + Tag HANGING_SIGNS = ItemTag.get("minecraft:hanging_signs"); + + Tag LEAVES = ItemTag.get("minecraft:leaves"); + + Tag NON_FLAMMABLE_WOOD = ItemTag.get("minecraft:non_flammable_wood"); + + Tag LOGS = ItemTag.get("minecraft:logs"); + + Tag SIGNS = ItemTag.get("minecraft:signs"); + + Tag FOX_FOOD = ItemTag.get("minecraft:fox_food"); + + Tag FISHES = ItemTag.get("minecraft:fishes"); + + Tag FENCE_GATES = ItemTag.get("minecraft:fence_gates"); + + Tag SHOVELS = ItemTag.get("minecraft:shovels"); + + Tag WOOL = ItemTag.get("minecraft:wool"); + + Tag SAPLINGS = ItemTag.get("minecraft:saplings"); + + Tag CREEPER_IGNITERS = ItemTag.get("minecraft:creeper_igniters"); + + Tag STONE_BUTTONS = ItemTag.get("minecraft:stone_buttons"); + + Tag SAND = ItemTag.get("minecraft:sand"); + + Tag HOES = ItemTag.get("minecraft:hoes"); + + Tag LOGS_THAT_BURN = ItemTag.get("minecraft:logs_that_burn"); + + Tag DOORS = ItemTag.get("minecraft:doors"); + + Tag RAILS = ItemTag.get("minecraft:rails"); + + Tag SOUL_FIRE_BASE_BLOCKS = ItemTag.get("minecraft:soul_fire_base_blocks"); + + Tag DECORATED_POT_INGREDIENTS = ItemTag.get("minecraft:decorated_pot_ingredients"); + + Tag DARK_OAK_LOGS = ItemTag.get("minecraft:dark_oak_logs"); + + Tag AXOLOTL_TEMPT_ITEMS = ItemTag.get("minecraft:axolotl_tempt_items"); + + Tag CRIMSON_STEMS = ItemTag.get("minecraft:crimson_stems"); + + Tag LAPIS_ORES = ItemTag.get("minecraft:lapis_ores"); + + Tag BANNERS = ItemTag.get("minecraft:banners"); + + Tag TRIM_TEMPLATES = ItemTag.get("minecraft:trim_templates"); + + Tag COALS = ItemTag.get("minecraft:coals"); +} diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index e19a6cfca2a..92809edb72b 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -8,7 +8,6 @@ import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.exception.ExceptionManager; import net.minestom.server.extensions.ExtensionManager; -import net.minestom.server.gamedata.tags.TagManager; import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.item.armor.TrimManager; @@ -264,10 +263,6 @@ public static AdvancementManager getAdvancementManager() { return serverProcess.extension(); } - public static TagManager getTagManager() { - return serverProcess.tag(); - } - public static TrimManager getTrimManager() { return serverProcess.trim(); } diff --git a/src/main/java/net/minestom/server/ServerProcess.java b/src/main/java/net/minestom/server/ServerProcess.java index 401745f5d08..0d269ae2480 100644 --- a/src/main/java/net/minestom/server/ServerProcess.java +++ b/src/main/java/net/minestom/server/ServerProcess.java @@ -7,7 +7,6 @@ import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.exception.ExceptionManager; import net.minestom.server.extensions.ExtensionManager; -import net.minestom.server.gamedata.tags.TagManager; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.block.BlockManager; @@ -109,11 +108,6 @@ public interface ServerProcess extends Snapshotable { */ @Nullable ExtensionManager extension(); - /** - * Handles registry tags. - */ - @NotNull TagManager tag(); - @NotNull TrimManager trim(); /** diff --git a/src/main/java/net/minestom/server/ServerProcessImpl.java b/src/main/java/net/minestom/server/ServerProcessImpl.java index 5eff5ac8daf..845a144429c 100644 --- a/src/main/java/net/minestom/server/ServerProcessImpl.java +++ b/src/main/java/net/minestom/server/ServerProcessImpl.java @@ -17,7 +17,6 @@ import net.minestom.server.event.server.ServerTickMonitorEvent; import net.minestom.server.exception.ExceptionManager; import net.minestom.server.extensions.ExtensionManager; -import net.minestom.server.gamedata.tags.TagManager; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceManager; @@ -71,7 +70,6 @@ final class ServerProcessImpl implements ServerProcess { private final AttributeManager attribute; private final AdvancementManager advancement; private final BossBarManager bossBar; - private final TagManager tag; private final TrimManager trim; private final Server server; private final Metrics metrics; @@ -104,7 +102,6 @@ public ServerProcessImpl() throws IOException { this.attribute = new AttributeManager(); this.advancement = new AdvancementManager(); this.bossBar = new BossBarManager(); - this.tag = new TagManager(); this.trim = new TrimManager(); this.server = new Server(packetProcessor); @@ -183,11 +180,6 @@ public ServerProcessImpl() throws IOException { return extension; } - @Override - public @NotNull TagManager tag() { - return tag; - } - @Override public @NotNull TrimManager trim() { return trim; diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java deleted file mode 100644 index 7e6a665f3a2..00000000000 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.minestom.server.gamedata.tags; - -import net.minestom.server.entity.EntityType; -import net.minestom.server.fluid.Fluid; -import net.minestom.server.instance.block.Block; -import net.minestom.server.item.Material; -import net.minestom.server.registry.Registry; -import net.minestom.server.utils.NamespaceID; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; - -/** - * Represents a group of items, blocks, fluids, entity types or function. - * Immutable by design - */ -public final class Tag { - private final NamespaceID name; - private final Set values; - - /** - * Creates a new empty tag. This does not cache the tag. - */ - public Tag(NamespaceID name) { - this.name = name; - this.values = new HashSet<>(); - } - - /** - * Creates a new tag with the given values. This does not cache the tag. - */ - public Tag(NamespaceID name, Set values) { - this.name = name; - this.values = new HashSet<>(values); - } - - /** - * Checks whether the given id in inside this tag. - * - * @param id the id to check against - * @return 'true' iif this tag contains the given id - */ - public boolean contains(NamespaceID id) { - return values.contains(id); - } - - /** - * Returns an immutable set of values present in this tag - * - * @return immutable set of values present in this tag - */ - public Set getValues() { - return Collections.unmodifiableSet(values); - } - - /** - * Returns the name of this tag - */ - public NamespaceID getName() { - return name; - } - - public enum BasicType { - BLOCKS("minecraft:block", Registry.Resource.BLOCK_TAGS, - name -> Objects.requireNonNull(Block.fromNamespaceId(name)).id()), - ITEMS("minecraft:item", Registry.Resource.ITEM_TAGS, - name -> Objects.requireNonNull(Material.fromNamespaceId(name)).id()), - FLUIDS("minecraft:fluid", Registry.Resource.FLUID_TAGS, - name -> Objects.requireNonNull(Fluid.fromNamespaceId(name)).id()), - ENTITY_TYPES("minecraft:entity_type", Registry.Resource.ENTITY_TYPE_TAGS, - name -> Objects.requireNonNull(EntityType.fromNamespaceId(name)).id());/* - GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS, - name -> Objects.requireNonNull(Fluid.fromNamespaceId(name)).id());*/ - - private final static BasicType[] VALUES = values(); - private final String identifier; - private final Registry.Resource resource; - private final Function function; - - BasicType(@NotNull String identifier, - @NotNull Registry.Resource resource, - @NotNull Function function) { - this.identifier = identifier; - this.resource = resource; - this.function = function; - } - - public @NotNull String getIdentifier() { - return identifier; - } - - public Registry.Resource getResource() { - return resource; - } - - public Function getFunction() { - return function; - } - - public static @Nullable Tag.BasicType fromIdentifer(@NotNull String identifier) { - for (BasicType value : VALUES) { - if (value.identifier.equals(identifier)) { - return value; - } - } - return null; - } - } -} diff --git a/src/main/java/net/minestom/server/gamedata/tags/TagManager.java b/src/main/java/net/minestom/server/gamedata/tags/TagManager.java deleted file mode 100644 index 79b2b3a6cf2..00000000000 --- a/src/main/java/net/minestom/server/gamedata/tags/TagManager.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.minestom.server.gamedata.tags; - -import net.minestom.server.registry.Registry; -import net.minestom.server.utils.NamespaceID; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * Handles loading and caching of tags. - */ -public final class TagManager { - private final Map> tagMap = new ConcurrentHashMap<>(); - - public TagManager() { - // Load required tags from files - for (var type : Tag.BasicType.values()) { - final var json = Registry.load(type.getResource()); - final var tagIdentifierMap = tagMap.computeIfAbsent(type, s -> new CopyOnWriteArrayList<>()); - json.keySet().forEach(tagName -> { - final var tag = new Tag(NamespaceID.from(tagName), getValues(json, tagName)); - tagIdentifierMap.add(tag); - }); - } - } - - public @Nullable Tag getTag(Tag.BasicType type, String namespace) { - final var tags = tagMap.get(type); - for (var tag : tags) { - if (tag.getName().asString().equals(namespace)) - return tag; - } - return null; - } - - public Map> getTagMap() { - return Collections.unmodifiableMap(tagMap); - } - - private Set getValues(Map> main, String value) { - Map tagObject = main.get(value); - final List tagValues = (List) tagObject.get("values"); - Set result = new HashSet<>(tagValues.size()); - tagValues.forEach(tagString -> { - if (tagString.startsWith("#")) { - result.addAll(getValues(main, tagString.substring(1))); - } else { - result.add(NamespaceID.from(tagString)); - } - }); - return result; - } -} diff --git a/src/main/java/net/minestom/server/gametag/BlockTag.java b/src/main/java/net/minestom/server/gametag/BlockTag.java new file mode 100644 index 00000000000..629d268637c --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/BlockTag.java @@ -0,0 +1,56 @@ +package net.minestom.server.gametag; + +import net.minestom.server.instance.block.Block; +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +public record BlockTag(Registry.TagEntry registry, int id, List stringValue) implements Tag, BlockTags { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Function TAG_TO_ID = namespaceID -> Block.fromNamespaceId(namespaceID).id(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.BLOCK_TAGS, BlockTag::createImpl); + + public static final String IDENTIFIER = "minecraft:block"; + + public BlockTag(Registry.TagEntry registry) { + this(registry, INDEX.getAndIncrement(), registry.values()); + } + + private static Tag createImpl(String namespace, Registry.Properties properties) { + return new BlockTag(Registry.tag(namespace, properties)); + } + + static Tag get(String namespace) { + return CONTAINER.get(namespace); + } + + public static @NotNull Collection values() { + return CONTAINER.values(); + } + + @Override + public @NotNull Collection<@NotNull NamespaceID> tagValues() { + var concatinatedTags = stringValue.stream().filter(s -> s.startsWith("#")).toList(); + var result = new ArrayList<>(stringValue.stream().filter(s -> !s.startsWith("#")).map(NamespaceID::from).toList()); + concatinatedTags.stream().map(BlockTag::getSafe).filter(Objects::nonNull).map(Tag::tagValues).forEach(result::addAll); + return Collections.unmodifiableCollection(result); + } + + @Override + public @NotNull Function getMapper() { + return TAG_TO_ID; + } + + static Tag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + +} diff --git a/src/main/java/net/minestom/server/gametag/EntityTag.java b/src/main/java/net/minestom/server/gametag/EntityTag.java new file mode 100644 index 00000000000..3e2e21a605c --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/EntityTag.java @@ -0,0 +1,54 @@ +package net.minestom.server.gametag; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +public record EntityTag(Registry.TagEntry registry, int id, List stringValue) implements Tag, EntityTags { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.ENTITY_TYPE_TAGS, EntityTag::createImpl); + private static final Function TAG_TO_ID = namespaceID -> Objects.requireNonNull(EntityType.fromNamespaceId(namespaceID)).id(); + + public static final String IDENTIFIER = "minecraft:entity_type"; + + public EntityTag(Registry.TagEntry registry) { + this(registry, INDEX.getAndIncrement(), registry.values()); + } + + private static Tag createImpl(String namespace, Registry.Properties properties) { + return new EntityTag(Registry.tag(namespace, properties)); + } + + public static Tag get(String namespace) { + return CONTAINER.get(namespace); + } + + public static @NotNull Collection values() { + return CONTAINER.values(); + } + + static Tag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + @Override + public @NotNull Collection<@NotNull NamespaceID> tagValues() { + var concatinatedTags = stringValue.stream().filter(s -> s.startsWith("#")).toList(); + var result = new ArrayList<>(stringValue.stream().filter(s -> !s.startsWith("#")).map(NamespaceID::from).toList()); + concatinatedTags.stream().map(EntityTag::getSafe).filter(Objects::nonNull).map(Tag::tagValues).forEach(result::addAll); + return Collections.unmodifiableCollection(result); + } + + @Override + public @NotNull Function getMapper() { + return TAG_TO_ID; + } +} diff --git a/src/main/java/net/minestom/server/gametag/FluidTag.java b/src/main/java/net/minestom/server/gametag/FluidTag.java new file mode 100644 index 00000000000..3519668db68 --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/FluidTag.java @@ -0,0 +1,55 @@ +package net.minestom.server.gametag; + +import net.minestom.server.fluid.Fluid; +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +public record FluidTag(Registry.TagEntry registry, int id, List stringValue) implements Tag, FluidTags { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.FLUID_TAGS, FluidTag::createImpl); + private static final Function TAG_TO_ID = namespaceID -> Objects.requireNonNull(Fluid.fromNamespaceId(namespaceID)).id(); + + public static final String IDENTIFIER = "minecraft:fluid"; + + public FluidTag(Registry.TagEntry registry) { + this(registry, INDEX.getAndIncrement(), registry.values()); + } + + private static Tag createImpl(String namespace, Registry.Properties properties) { + return new FluidTag(Registry.tag(namespace, properties)); + } + + public static Tag get(String namespace) { + return CONTAINER.get(namespace); + } + + public static @NotNull Collection values() { + return CONTAINER.values(); + } + + static Tag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + + @Override + public @NotNull Collection<@NotNull NamespaceID> tagValues() { + var concatinatedTags = stringValue.stream().filter(s -> s.startsWith("#")).toList(); + var result = new ArrayList<>(stringValue.stream().filter(s -> !s.startsWith("#")).map(NamespaceID::from).toList()); + concatinatedTags.stream().map(FluidTag::getSafe).filter(Objects::nonNull).map(Tag::tagValues).forEach(result::addAll); + return Collections.unmodifiableCollection(result); + } + + @Override + public @NotNull Function getMapper() { + return TAG_TO_ID; + } +} diff --git a/src/main/java/net/minestom/server/gametag/GameEventTag.java b/src/main/java/net/minestom/server/gametag/GameEventTag.java new file mode 100644 index 00000000000..1d5eb3b2f6d --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/GameEventTag.java @@ -0,0 +1,54 @@ +package net.minestom.server.gametag; + +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +public record GameEventTag(Registry.TagEntry registry, int id, List stringValue) implements Tag, GameEventTags { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.GAMEPLAY_TAGS, GameEventTag::createImpl); + private static final Function TAG_TO_ID = namespaceID -> Objects.requireNonNull(GameEventTag.getSafe(namespaceID.asString())).id(); + + public static final String IDENTIFIER = "minecraft:game_event"; + + public GameEventTag(Registry.TagEntry registry) { + this(registry, INDEX.getAndIncrement(), registry.values()); + } + + private static Tag createImpl(String namespace, Registry.Properties properties) { + return new GameEventTag(Registry.tag(namespace, properties)); + } + + public static Tag get(String namespace) { + return CONTAINER.get(namespace); + } + + public static @NotNull Collection values() { + return CONTAINER.values(); + } + + static Tag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + + @Override + public @NotNull Collection<@NotNull NamespaceID> tagValues() { + var concatinatedTags = stringValue.stream().filter(s -> s.startsWith("#")).toList(); + var result = new ArrayList<>(stringValue.stream().filter(s -> !s.startsWith("#")).map(NamespaceID::from).toList()); + concatinatedTags.stream().map(GameEventTag::getSafe).filter(Objects::nonNull).map(Tag::tagValues).forEach(result::addAll); + return Collections.unmodifiableCollection(result); + } + + @Override + public @NotNull Function getMapper() { + return TAG_TO_ID; + } +} diff --git a/src/main/java/net/minestom/server/gametag/ItemTag.java b/src/main/java/net/minestom/server/gametag/ItemTag.java new file mode 100644 index 00000000000..e53a3ee6011 --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/ItemTag.java @@ -0,0 +1,54 @@ +package net.minestom.server.gametag; + +import net.minestom.server.item.Material; +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +public record ItemTag(Registry.TagEntry registry, int id, List stringValue) implements Tag, ItemTags { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.ITEM_TAGS, ItemTag::createImpl); + public static final Function TAG_TO_ID = namespaceID -> Objects.requireNonNull(Material.fromNamespaceId(namespaceID)).id(); + + public static final String IDENTIFIER = "minecraft:item"; + + public ItemTag(Registry.TagEntry registry) { + this(registry, INDEX.getAndIncrement(), registry.values()); + } + + private static Tag createImpl(String namespace, Registry.Properties properties) { + return new ItemTag(Registry.tag(namespace, properties)); + } + + public static Tag get(String namespace) { + return CONTAINER.get(namespace); + } + + public static @NotNull Collection values() { + return CONTAINER.values(); + } + + static Tag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + @Override + public @NotNull Collection<@NotNull NamespaceID> tagValues() { + var concatinatedTags = stringValue.stream().filter(s -> s.startsWith("#")).toList(); + var result = new ArrayList<>(stringValue.stream().filter(s -> !s.startsWith("#")).map(NamespaceID::from).toList()); + concatinatedTags.stream().map(ItemTag::getSafe).filter(Objects::nonNull).map(Tag::tagValues).forEach(result::addAll); + return Collections.unmodifiableCollection(result); + } + + @Override + public @NotNull Function getMapper() { + return TAG_TO_ID; + } +} diff --git a/src/main/java/net/minestom/server/gametag/Tag.java b/src/main/java/net/minestom/server/gametag/Tag.java new file mode 100644 index 00000000000..6f271c9aae4 --- /dev/null +++ b/src/main/java/net/minestom/server/gametag/Tag.java @@ -0,0 +1,25 @@ +package net.minestom.server.gametag; + +import net.minestom.server.registry.Registry; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.function.Function; + +public sealed interface Tag extends StaticProtocolObject permits BlockTag, EntityTag, FluidTag, GameEventTag, ItemTag { + + @Contract(pure = true) + @NotNull Registry.TagEntry registry(); + + @Override + default @NotNull NamespaceID namespace() { + return registry().namespace(); + } + + @NotNull Collection<@NotNull NamespaceID> tagValues(); + + @NotNull Function getMapper(); +} diff --git a/src/main/java/net/minestom/server/network/ConnectionManager.java b/src/main/java/net/minestom/server/network/ConnectionManager.java index 3b34d62a0e5..71f16647baa 100644 --- a/src/main/java/net/minestom/server/network/ConnectionManager.java +++ b/src/main/java/net/minestom/server/network/ConnectionManager.java @@ -13,6 +13,7 @@ import net.minestom.server.listener.preplay.LoginListener; import net.minestom.server.message.Messenger; import net.minestom.server.network.packet.client.login.ClientLoginStartPacket; +import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.common.KeepAlivePacket; import net.minestom.server.network.packet.server.common.PluginMessagePacket; import net.minestom.server.network.packet.server.common.TagsPacket; @@ -59,6 +60,7 @@ public final class ConnectionManager { private final Set configurationPlayers = new CopyOnWriteArraySet<>(); // Players in play state private final Set playPlayers = new CopyOnWriteArraySet<>(); + public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(TagsPacket.createDefaultTags())); // The players who need keep alive ticks. This was added because we may not send a keep alive in // the time after sending finish configuration but before receiving configuration end (to swap to play). @@ -293,7 +295,7 @@ public void doConfiguration(@NotNull Player player, boolean isFirstConfig) { registry.put("minecraft:trim_pattern", MinecraftServer.getTrimManager().getTrimPatternNBT()); player.sendPacket(new RegistryDataPacket(NBT.Compound(registry))); - player.sendPacket(TagsPacket.DEFAULT_TAGS); + player.sendPacket(DEFAULT_TAGS); } player.sendPacket(new UpdateEnabledFeaturesPacket(event.getEnabledFeatures())); diff --git a/src/main/java/net/minestom/server/network/packet/server/common/TagsPacket.java b/src/main/java/net/minestom/server/network/packet/server/common/TagsPacket.java index daa06217cad..ef8e4e5ee49 100644 --- a/src/main/java/net/minestom/server/network/packet/server/common/TagsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/common/TagsPacket.java @@ -1,24 +1,36 @@ package net.minestom.server.network.packet.server.common; -import net.minestom.server.MinecraftServer; -import net.minestom.server.gamedata.tags.Tag; +import net.minestom.server.gametag.BlockTag; +import net.minestom.server.gametag.EntityTag; +import net.minestom.server.gametag.FluidTag; +import net.minestom.server.gametag.GameEventTag; +import net.minestom.server.gametag.ItemTag; +import net.minestom.server.gametag.Tag; import net.minestom.server.network.NetworkBuffer; -import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; -import org.jetbrains.annotations.ApiStatus; +import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.NotNull; -import java.util.EnumMap; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import static net.minestom.server.network.NetworkBuffer.*; public record TagsPacket( - @NotNull Map> tagsMap) implements ServerPacket.Configuration, ServerPacket.Play { - @ApiStatus.Internal - public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(MinecraftServer.getTagManager().getTagMap())); + @NotNull Map> tagsMap) implements ServerPacket.Configuration, ServerPacket.Play { + + public static @NotNull Map> createDefaultTags() { + Map> tagsMap = new HashMap<>(); + tagsMap.put(NamespaceID.from(BlockTag.IDENTIFIER), new ArrayList<>(BlockTag.values())); + tagsMap.put(NamespaceID.from(ItemTag.IDENTIFIER), new ArrayList<>(ItemTag.values())); + tagsMap.put(NamespaceID.from(FluidTag.IDENTIFIER), new ArrayList<>(FluidTag.values())); + tagsMap.put(NamespaceID.from(EntityTag.IDENTIFIER), new ArrayList<>(EntityTag.values())); + // tagsMap.put(NamespaceID.from(GameEventTag.IDENTIFIER), new ArrayList<>(GameEventTag.values())); + return tagsMap; + } public TagsPacket { tagsMap = Map.copyOf(tagsMap); @@ -34,14 +46,14 @@ public void write(@NotNull NetworkBuffer writer) { for (var entry : tagsMap.entrySet()) { final var type = entry.getKey(); final var tags = entry.getValue(); - writer.write(STRING, type.getIdentifier()); + writer.write(STRING, type.asString()); writer.write(VAR_INT, tags.size()); for (var tag : tags) { - writer.write(STRING, tag.getName().asString()); - final var values = tag.getValues(); + writer.write(STRING, tag.namespace().asString()); + final var values = tag.tagValues(); writer.write(VAR_INT, values.size()); for (var name : values) { - writer.write(VAR_INT, type.getFunction().apply(name.asString())); + writer.write(VAR_INT, tag.getMapper().apply(name)); } } } @@ -57,16 +69,17 @@ public int playId() { return ServerPacketIdentifier.TAGS; } - private static Map> readTagsMap(@NotNull NetworkBuffer reader) { - Map> tagsMap = new EnumMap<>(Tag.BasicType.class); + private static Map> readTagsMap(@NotNull NetworkBuffer reader) { + Map> tagsMap = new HashMap<>(); // Read amount of tag types final int typeCount = reader.read(VAR_INT); for (int i = 0; i < typeCount; i++) { // Read tag type - final Tag.BasicType tagType = Tag.BasicType.fromIdentifer(reader.read(STRING)); - if (tagType == null) { - throw new IllegalArgumentException("Tag type could not be resolved"); - } + final String id = reader.read(STRING); + // final Tag.BasicType tagType = Tag.BasicType.fromIdentifer(reader.read(STRING)); + // if (tagType == null) { + // throw new IllegalArgumentException("Tag type could not be resolved"); + // } final int tagCount = reader.read(VAR_INT); for (int j = 0; j < tagCount; j++) { diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 1f8ee98d8e1..41d32aea211 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -20,11 +20,19 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import net.minestom.server.gametag.Tag; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -107,6 +115,11 @@ public static FluidEntry fluidEntry(String namespace, @NotNull Properties main) return new FluidEntry(namespace, main, null); } + @ApiStatus.Internal + public static TagEntry tag(String namespace, @NotNull Properties main) { + return new TagEntry(namespace , main, null); + } + @ApiStatus.Internal public static Map> load(Resource resource) { Map> map = new HashMap<>(); @@ -273,6 +286,18 @@ public enum Resource { } } + public record TagEntry( + @NotNull NamespaceID namespace, + @NotNull List<@NotNull String> values, + @Nullable Properties custom + ) implements Entry { + + public TagEntry(String namespace, Properties main, Properties custom) { + this(NamespaceID.from(namespace), ((List) main.asMap().get("values")), + custom); + } + } + public record FeatureFlagEntry( @NotNull NamespaceID namespace, @Nullable Properties custom