From 9bfde096a4d9d8fa73d82c2c3a9afcfd2f0a1c9b Mon Sep 17 00:00:00 2001 From: Phillipp Glanz Date: Sun, 3 Nov 2024 20:21:50 +0100 Subject: [PATCH 1/7] Implement game tags and game events (cherry picked from commit 9e681c792f7588db2c8d77824b5010f6bc34b85d) --- .../java/net/minestom/codegen/Generators.java | 1 + .../net/minestom/server/game/GameEvents.java | 127 ++++++++++++++++++ .../net/minestom/server/game/GameEvent.java | 39 ++++++ .../minestom/server/game/GameEventImpl.java | 33 +++++ .../minestom/server/gamedata/tags/Tag.java | 5 +- .../minestom/server/registry/Registry.java | 10 ++ 6 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 src/autogenerated/java/net/minestom/server/game/GameEvents.java create mode 100644 src/main/java/net/minestom/server/game/GameEvent.java create mode 100644 src/main/java/net/minestom/server/game/GameEventImpl.java 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 148c4bf0763..93bb0553fb8 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -30,6 +30,7 @@ public static void main(String[] args) { // Static registries generator.generate(resource("blocks.json"), "net.minestom.server.instance.block", "Block", "BlockImpl", "Blocks"); generator.generate(resource("items.json"), "net.minestom.server.item", "Material", "MaterialImpl", "Materials"); + generator.generate(resource("game_events.json"), "net.minestom.server.game", "GameEvent", "GameEventImpl", "GameEvents"); generator.generate(resource("entities.json"), "net.minestom.server.entity", "EntityType", "EntityTypeImpl", "EntityTypes"); generator.generate(resource("potion_effects.json"), "net.minestom.server.potion", "PotionEffect", "PotionEffectImpl", "PotionEffects"); generator.generate(resource("potions.json"), "net.minestom.server.potion", "PotionType", "PotionTypeImpl", "PotionTypes"); diff --git a/src/autogenerated/java/net/minestom/server/game/GameEvents.java b/src/autogenerated/java/net/minestom/server/game/GameEvents.java new file mode 100644 index 00000000000..44e09b862d1 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/game/GameEvents.java @@ -0,0 +1,127 @@ +package net.minestom.server.game; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface GameEvents { + GameEvent BLOCK_ACTIVATE = GameEventImpl.get("minecraft:block_activate"); + + GameEvent BLOCK_ATTACH = GameEventImpl.get("minecraft:block_attach"); + + GameEvent BLOCK_CHANGE = GameEventImpl.get("minecraft:block_change"); + + GameEvent BLOCK_CLOSE = GameEventImpl.get("minecraft:block_close"); + + GameEvent BLOCK_DEACTIVATE = GameEventImpl.get("minecraft:block_deactivate"); + + GameEvent BLOCK_DESTROY = GameEventImpl.get("minecraft:block_destroy"); + + GameEvent BLOCK_DETACH = GameEventImpl.get("minecraft:block_detach"); + + GameEvent BLOCK_OPEN = GameEventImpl.get("minecraft:block_open"); + + GameEvent BLOCK_PLACE = GameEventImpl.get("minecraft:block_place"); + + GameEvent CONTAINER_CLOSE = GameEventImpl.get("minecraft:container_close"); + + GameEvent CONTAINER_OPEN = GameEventImpl.get("minecraft:container_open"); + + GameEvent DRINK = GameEventImpl.get("minecraft:drink"); + + GameEvent EAT = GameEventImpl.get("minecraft:eat"); + + GameEvent ELYTRA_GLIDE = GameEventImpl.get("minecraft:elytra_glide"); + + GameEvent ENTITY_DAMAGE = GameEventImpl.get("minecraft:entity_damage"); + + GameEvent ENTITY_DIE = GameEventImpl.get("minecraft:entity_die"); + + GameEvent ENTITY_DISMOUNT = GameEventImpl.get("minecraft:entity_dismount"); + + GameEvent ENTITY_INTERACT = GameEventImpl.get("minecraft:entity_interact"); + + GameEvent ENTITY_MOUNT = GameEventImpl.get("minecraft:entity_mount"); + + GameEvent ENTITY_PLACE = GameEventImpl.get("minecraft:entity_place"); + + GameEvent ENTITY_ACTION = GameEventImpl.get("minecraft:entity_action"); + + GameEvent EQUIP = GameEventImpl.get("minecraft:equip"); + + GameEvent EXPLODE = GameEventImpl.get("minecraft:explode"); + + GameEvent FLAP = GameEventImpl.get("minecraft:flap"); + + GameEvent FLUID_PICKUP = GameEventImpl.get("minecraft:fluid_pickup"); + + GameEvent FLUID_PLACE = GameEventImpl.get("minecraft:fluid_place"); + + GameEvent HIT_GROUND = GameEventImpl.get("minecraft:hit_ground"); + + GameEvent INSTRUMENT_PLAY = GameEventImpl.get("minecraft:instrument_play"); + + GameEvent ITEM_INTERACT_FINISH = GameEventImpl.get("minecraft:item_interact_finish"); + + GameEvent ITEM_INTERACT_START = GameEventImpl.get("minecraft:item_interact_start"); + + GameEvent JUKEBOX_PLAY = GameEventImpl.get("minecraft:jukebox_play"); + + GameEvent JUKEBOX_STOP_PLAY = GameEventImpl.get("minecraft:jukebox_stop_play"); + + GameEvent LIGHTNING_STRIKE = GameEventImpl.get("minecraft:lightning_strike"); + + GameEvent NOTE_BLOCK_PLAY = GameEventImpl.get("minecraft:note_block_play"); + + GameEvent PRIME_FUSE = GameEventImpl.get("minecraft:prime_fuse"); + + GameEvent PROJECTILE_LAND = GameEventImpl.get("minecraft:projectile_land"); + + GameEvent PROJECTILE_SHOOT = GameEventImpl.get("minecraft:projectile_shoot"); + + GameEvent SCULK_SENSOR_TENDRILS_CLICKING = GameEventImpl.get("minecraft:sculk_sensor_tendrils_clicking"); + + GameEvent SHEAR = GameEventImpl.get("minecraft:shear"); + + GameEvent SHRIEK = GameEventImpl.get("minecraft:shriek"); + + GameEvent SPLASH = GameEventImpl.get("minecraft:splash"); + + GameEvent STEP = GameEventImpl.get("minecraft:step"); + + GameEvent SWIM = GameEventImpl.get("minecraft:swim"); + + GameEvent TELEPORT = GameEventImpl.get("minecraft:teleport"); + + GameEvent UNEQUIP = GameEventImpl.get("minecraft:unequip"); + + GameEvent RESONATE_1 = GameEventImpl.get("minecraft:resonate_1"); + + GameEvent RESONATE_2 = GameEventImpl.get("minecraft:resonate_2"); + + GameEvent RESONATE_3 = GameEventImpl.get("minecraft:resonate_3"); + + GameEvent RESONATE_4 = GameEventImpl.get("minecraft:resonate_4"); + + GameEvent RESONATE_5 = GameEventImpl.get("minecraft:resonate_5"); + + GameEvent RESONATE_6 = GameEventImpl.get("minecraft:resonate_6"); + + GameEvent RESONATE_7 = GameEventImpl.get("minecraft:resonate_7"); + + GameEvent RESONATE_8 = GameEventImpl.get("minecraft:resonate_8"); + + GameEvent RESONATE_9 = GameEventImpl.get("minecraft:resonate_9"); + + GameEvent RESONATE_10 = GameEventImpl.get("minecraft:resonate_10"); + + GameEvent RESONATE_11 = GameEventImpl.get("minecraft:resonate_11"); + + GameEvent RESONATE_12 = GameEventImpl.get("minecraft:resonate_12"); + + GameEvent RESONATE_13 = GameEventImpl.get("minecraft:resonate_13"); + + GameEvent RESONATE_14 = GameEventImpl.get("minecraft:resonate_14"); + + GameEvent RESONATE_15 = GameEventImpl.get("minecraft:resonate_15"); +} diff --git a/src/main/java/net/minestom/server/game/GameEvent.java b/src/main/java/net/minestom/server/game/GameEvent.java new file mode 100644 index 00000000000..182a2e39999 --- /dev/null +++ b/src/main/java/net/minestom/server/game/GameEvent.java @@ -0,0 +1,39 @@ +package net.minestom.server.game; + +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 org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +public sealed interface GameEvent extends StaticProtocolObject permits GameEventImpl { + + /** + * Returns the entity registry. + * + * @return the entity registry or null if it was created with a builder + */ + @Contract(pure = true) + @Nullable + Registry.GameEventEntry registry(); + + @Override + @NotNull + NamespaceID namespace(); + + static @NotNull Collection<@NotNull GameEvent> values() { + return GameEventImpl.values(); + } + + static @Nullable GameEvent fromNamespaceId(@NotNull String namespaceID) { + return GameEventImpl.getSafe(namespaceID); + } + + static @Nullable GameEvent fromNamespaceId(@NotNull NamespaceID namespaceID) { + return fromNamespaceId(namespaceID.asString()); + } + +} \ No newline at end of file diff --git a/src/main/java/net/minestom/server/game/GameEventImpl.java b/src/main/java/net/minestom/server/game/GameEventImpl.java new file mode 100644 index 00000000000..0db6f44d6f8 --- /dev/null +++ b/src/main/java/net/minestom/server/game/GameEventImpl.java @@ -0,0 +1,33 @@ +package net.minestom.server.game; + +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; + +public record GameEventImpl(Registry.GameEventEntry registry, NamespaceID namespace, int id) implements GameEvent { + private static final AtomicInteger INDEX = new AtomicInteger(); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.GAMEPLAY_TAGS, GameEventImpl::createImpl); + + private static GameEventImpl createImpl(String namespace, Registry.Properties properties) { + return new GameEventImpl(Registry.gameEventEntry(namespace, properties)); + } + + private GameEventImpl(Registry.GameEventEntry registry) { + this(registry, registry.namespace(), INDEX.getAndIncrement()); + } + + static Collection values() { + return CONTAINER.values(); + } + + public static GameEvent get(@NotNull String namespace) { + return CONTAINER.get(namespace); + } + + static GameEvent getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } +} diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java index 32c73a947db..a90714daba7 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -5,6 +5,7 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.entity.EntityType; import net.minestom.server.fluid.Fluid; +import net.minestom.server.game.GameEvent; import net.minestom.server.instance.block.Block; import net.minestom.server.item.Material; import net.minestom.server.registry.DynamicRegistry; @@ -96,8 +97,8 @@ public enum BasicType { 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());*/ + GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS, + name -> Objects.requireNonNull(GameEvent.fromNamespaceId(name)).id()), SOUND_EVENTS("minecraft:sound_event", null, null), // Seems not to be included in server data POTION_EFFECTS("minecraft:sound_event", null, null), // Seems not to be included in server data diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 249ff3d8a7a..30f2a558929 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -145,6 +145,10 @@ public static VillagerType villagerType(String namespace, @NotNull Properties ma return new VillagerType(namespace, main, null); } + public static GameEventEntry gameEventEntry(String namespace, Properties properties) { + return new GameEventEntry(namespace, properties, null); + } + @ApiStatus.Internal public static Map> load(Resource resource) { Map> map = new HashMap<>(); @@ -558,6 +562,12 @@ public boolean hasPrecipitation() { } } + public static final record GameEventEntry(NamespaceID namespace, Properties main, Properties custom) implements Entry { + public GameEventEntry(String namespace, Properties main, Properties custom) { + this(NamespaceID.from(namespace), main, custom); + } + } + public static final class MaterialEntry implements Entry { private final NamespaceID namespace; private final Properties main; From 4c8bbe084c409d006194eddf7d52af937065e370 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz Date: Sun, 3 Nov 2024 21:41:40 +0100 Subject: [PATCH 2/7] Add documentation for game events (cherry picked from commit ef26c504d4d091af558a7000d320790be8035e27) --- .../net/minestom/server/game/GameEvent.java | 34 +++++++++++++++- .../minestom/server/game/GameEventImpl.java | 39 ++++++++++++++++++- .../server/registry/StaticProtocolObject.java | 28 +++++++++++++ 3 files changed, 98 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/game/GameEvent.java b/src/main/java/net/minestom/server/game/GameEvent.java index 182a2e39999..86ddb2a8d35 100644 --- a/src/main/java/net/minestom/server/game/GameEvent.java +++ b/src/main/java/net/minestom/server/game/GameEvent.java @@ -9,29 +9,59 @@ import java.util.Collection; +/** + * Represents a game event. + * Used for a wide variety of events, from weather to bed use to game mode to demo messages. + * + * @version 1.0.0 + * @since 1.6.0 + * @author themeinerlp + */ public sealed interface GameEvent extends StaticProtocolObject permits GameEventImpl { /** - * Returns the entity registry. + * Returns the game event registry. * - * @return the entity registry or null if it was created with a builder + * @return the game event registry or null if not found */ @Contract(pure = true) @Nullable Registry.GameEventEntry registry(); + /** + * Gets the namespace ID of this game event. + * + * @return the namespace ID + */ @Override @NotNull NamespaceID namespace(); + /** + * Gets the game events from the registry. + * + * @return the game events + */ static @NotNull Collection<@NotNull GameEvent> values() { return GameEventImpl.values(); } + /** + * Gets a game event by its namespace ID. + * + * @param namespaceID the namespace ID + * @return the game event or null if not found + */ static @Nullable GameEvent fromNamespaceId(@NotNull String namespaceID) { return GameEventImpl.getSafe(namespaceID); } + /** + * Gets a game event by its namespace ID. + * + * @param namespaceID the namespace ID + * @return the game event or null if not found + */ static @Nullable GameEvent fromNamespaceId(@NotNull NamespaceID namespaceID) { return fromNamespaceId(namespaceID.asString()); } diff --git a/src/main/java/net/minestom/server/game/GameEventImpl.java b/src/main/java/net/minestom/server/game/GameEventImpl.java index 0db6f44d6f8..2bddfd28f13 100644 --- a/src/main/java/net/minestom/server/game/GameEventImpl.java +++ b/src/main/java/net/minestom/server/game/GameEventImpl.java @@ -7,26 +7,63 @@ import java.util.Collection; import java.util.concurrent.atomic.AtomicInteger; -public record GameEventImpl(Registry.GameEventEntry registry, NamespaceID namespace, int id) implements GameEvent { +/** + * Represents a game event implementation. + * Used for a wide variety of events, from weather to bed use to game mode to demo messages. + * + * @version 1.0.0 + * @since 1.6.0 + * @author themeinerlp + */ +record GameEventImpl(Registry.GameEventEntry registry, NamespaceID namespace, int id) implements GameEvent { private static final AtomicInteger INDEX = new AtomicInteger(); private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.GAMEPLAY_TAGS, GameEventImpl::createImpl); + /** + * Creates a new {@link GameEventImpl} with the given namespace and properties. + * + * @param namespace the namespace + * @param properties the properties + * @return a new {@link GameEventImpl} + */ private static GameEventImpl createImpl(String namespace, Registry.Properties properties) { return new GameEventImpl(Registry.gameEventEntry(namespace, properties)); } + /** + * Creates a new {@link GameEventImpl} with the given registry. + * + * @param registry the registry + */ private GameEventImpl(Registry.GameEventEntry registry) { this(registry, registry.namespace(), INDEX.getAndIncrement()); } + /** + * Gets the game events from the registry. + * + * @return the game events + */ static Collection values() { return CONTAINER.values(); } + /** + * Gets a game event by its namespace ID. + * + * @param namespace the namespace ID + * @return the game event or null if not found + */ public static GameEvent get(@NotNull String namespace) { return CONTAINER.get(namespace); } + /** + * Gets a game event by its namespace ID. + * + * @param namespace the namespace ID + * @return the game event or null if not found + */ static GameEvent getSafe(@NotNull String namespace) { return CONTAINER.getSafe(namespace); } diff --git a/src/main/java/net/minestom/server/registry/StaticProtocolObject.java b/src/main/java/net/minestom/server/registry/StaticProtocolObject.java index a1dc1790aba..4ba895df31c 100644 --- a/src/main/java/net/minestom/server/registry/StaticProtocolObject.java +++ b/src/main/java/net/minestom/server/registry/StaticProtocolObject.java @@ -6,22 +6,50 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +/** + * Represents a static protocol object. + * Used for objects which are not dynamic and are known at compile time. + * + * @version 1.0.0 + * @since 1.0.0 + * @author themeinerlp + */ public interface StaticProtocolObject extends ProtocolObject, Keyed { + /** + * Gets the namespace ID of this object. + * + * @return the namespace ID + */ @Contract(pure = true) @NotNull NamespaceID namespace(); + /** + * Gets the name of this object. + * + * @return the name + */ @Contract(pure = true) default @NotNull String name() { return namespace().asString(); } + /** + * Gets the key of this object. + * + * @return the key + */ @Override @Contract(pure = true) default @NotNull Key key() { return namespace(); } + /** + * Gets the ID of this object. + * + * @return the ID + */ @Contract(pure = true) int id(); } From 30a2bb9d24a215aa98b7492a1cf09dd6554fa8d0 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:31:26 +0100 Subject: [PATCH 3/7] Improve nullability for Minecraft Tags (cherry picked from commit 1b800ad98410a9747a575d7ae31747890d2c02db) --- .../minestom/server/gamedata/tags/Tag.java | 19 ++++++++++--------- .../packet/server/common/TagsPacket.java | 6 +++++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java index a90714daba7..0255a51a38d 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.Function; @@ -90,30 +91,30 @@ public NamespaceID getName() { public enum BasicType { BLOCKS("minecraft:block", Registry.Resource.BLOCK_TAGS, - name -> Objects.requireNonNull(Block.fromNamespaceId(name)).id()), + name -> Optional.ofNullable(Block.fromNamespaceId(name)).map(Block::id)), ITEMS("minecraft:item", Registry.Resource.ITEM_TAGS, - name -> Objects.requireNonNull(Material.fromNamespaceId(name)).id()), + name -> Optional.ofNullable(Material.fromNamespaceId(name)).map(Material::id)), FLUIDS("minecraft:fluid", Registry.Resource.FLUID_TAGS, - name -> Objects.requireNonNull(Fluid.fromNamespaceId(name)).id()), + name -> Optional.ofNullable(Fluid.fromNamespaceId(name)).map(Fluid::id)), ENTITY_TYPES("minecraft:entity_type", Registry.Resource.ENTITY_TYPE_TAGS, - name -> Objects.requireNonNull(EntityType.fromNamespaceId(name)).id()), + name -> Optional.ofNullable(EntityType.fromNamespaceId(name)).map(EntityType::id)), GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS, - name -> Objects.requireNonNull(GameEvent.fromNamespaceId(name)).id()), + name -> Optional.ofNullable(EntityType.fromNamespaceId(name)).map(EntityType::id)), SOUND_EVENTS("minecraft:sound_event", null, null), // Seems not to be included in server data POTION_EFFECTS("minecraft:sound_event", null, null), // Seems not to be included in server data //todo this is cursed. it does not update as the registry changes. Fix later. ENCHANTMENTS("minecraft:enchantment", Registry.Resource.ENCHANTMENT_TAGS, - name -> MinecraftServer.getEnchantmentRegistry().getId(DynamicRegistry.Key.of(name))); + name -> Optional.of(DynamicRegistry.Key.of(name)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getEnchantmentRegistry()::getId)),; private final static BasicType[] VALUES = values(); private final String identifier; private final Registry.Resource resource; - private final Function function; + private final Function> function; BasicType(@NotNull String identifier, @Nullable Registry.Resource resource, - @Nullable Function function) { + @Nullable Function> function) { this.identifier = identifier; this.resource = resource; this.function = function; @@ -127,7 +128,7 @@ public Registry.Resource getResource() { return resource; } - public Function getFunction() { + public Function> getFunction() { return function; } 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 ec24448d05e..6b4315120d2 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 @@ -45,7 +45,11 @@ public void write(@NotNull NetworkBuffer writer) { final var values = tag.getValues(); writer.write(VAR_INT, values.size()); for (var name : values) { - writer.write(VAR_INT, type.getFunction().apply(name.asString())); + var applied = type.getFunction().apply(name.asString()); + if (applied.isEmpty()) { + continue; + } + writer.write(VAR_INT, applied.get()); } } } From 5761dcba46ac1d989c10690dece8bf3051da6cf3 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:44:52 +0100 Subject: [PATCH 4/7] Add better mapping for meta tags for client (cherry picked from commit 93ea3b9dafa392a9c4e3c81e9b31753c8d42bbab) --- src/main/java/net/minestom/server/game/GameEventImpl.java | 4 ++-- src/main/java/net/minestom/server/gamedata/tags/Tag.java | 5 ++++- src/main/java/net/minestom/server/registry/Registry.java | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/game/GameEventImpl.java b/src/main/java/net/minestom/server/game/GameEventImpl.java index 2bddfd28f13..e5ab9d437ab 100644 --- a/src/main/java/net/minestom/server/game/GameEventImpl.java +++ b/src/main/java/net/minestom/server/game/GameEventImpl.java @@ -17,7 +17,7 @@ */ record GameEventImpl(Registry.GameEventEntry registry, NamespaceID namespace, int id) implements GameEvent { private static final AtomicInteger INDEX = new AtomicInteger(); - private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.GAMEPLAY_TAGS, GameEventImpl::createImpl); + private static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.GAME_EVENTS, GameEventImpl::createImpl); /** * Creates a new {@link GameEventImpl} with the given namespace and properties. @@ -36,7 +36,7 @@ private static GameEventImpl createImpl(String namespace, Registry.Properties pr * @param registry the registry */ private GameEventImpl(Registry.GameEventEntry registry) { - this(registry, registry.namespace(), INDEX.getAndIncrement()); + this(registry, registry.namespace(), registry.main().getInt("id")); } /** diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java index 0255a51a38d..5a0c7f552c0 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -12,6 +12,7 @@ import net.minestom.server.registry.ProtocolObject; import net.minestom.server.registry.Registry; import net.minestom.server.utils.NamespaceID; +import net.minestom.server.world.biome.Biome; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -96,10 +97,12 @@ public enum BasicType { name -> Optional.ofNullable(Material.fromNamespaceId(name)).map(Material::id)), FLUIDS("minecraft:fluid", Registry.Resource.FLUID_TAGS, name -> Optional.ofNullable(Fluid.fromNamespaceId(name)).map(Fluid::id)), + BIOMES("minecraft:worldgen/biome", Registry.Resource.BIOME_TAGS, + name -> Optional.of(DynamicRegistry.Key.of(name)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getBiomeRegistry()::getId)), ENTITY_TYPES("minecraft:entity_type", Registry.Resource.ENTITY_TYPE_TAGS, name -> Optional.ofNullable(EntityType.fromNamespaceId(name)).map(EntityType::id)), GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS, - name -> Optional.ofNullable(EntityType.fromNamespaceId(name)).map(EntityType::id)), + name -> Optional.ofNullable(GameEvent.fromNamespaceId(name)).map(GameEvent::id)), SOUND_EVENTS("minecraft:sound_event", null, null), // Seems not to be included in server data POTION_EFFECTS("minecraft:sound_event", null, null), // Seems not to be included in server data diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 30f2a558929..bf5e00f52d3 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -245,6 +245,8 @@ public enum Resource { ENTITY_TYPE_TAGS("tags/entity_type.json"), FLUID_TAGS("tags/fluid.json"), GAMEPLAY_TAGS("tags/game_event.json"), + GAME_EVENTS("game_events.json"), + BIOME_TAGS("tags/biome.json"), ITEM_TAGS("tags/item.json"), ENCHANTMENT_TAGS("tags/enchantment.json"), DIMENSION_TYPES("dimension_types.json"), @@ -562,7 +564,7 @@ public boolean hasPrecipitation() { } } - public static final record GameEventEntry(NamespaceID namespace, Properties main, Properties custom) implements Entry { + public record GameEventEntry(NamespaceID namespace, Properties main, Properties custom) implements Entry { public GameEventEntry(String namespace, Properties main, Properties custom) { this(NamespaceID.from(namespace), main, custom); } From daccf7f8be71a40cc371550ec384c8d6dff60e41 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:45:06 +0100 Subject: [PATCH 5/7] Improve build file (cherry picked from commit 86e844205ba7fe762de8d5522c32d52a791e4e4c) --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 02a5977b32d..a0e99a51bab 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,7 +60,7 @@ tasks { addStringOption("-release", "21") // Links to external javadocs links("https://docs.oracle.com/en/java/javase/21/docs/api/") - links("https://jd.adventure.kyori.net/api/${libs.versions.adventure.get()}/") + links("https://jd.advntr.dev/api/${libs.versions.adventure.get()}/") } } withType { From 57ad62a63b1b875993daa873f7d9b605343a4ae1 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 2 Jan 2025 21:58:08 +0100 Subject: [PATCH 6/7] Cleanup unused imports (cherry picked from commit 9389bdbc535edd598d24c69050c9df2150f6868a) --- src/main/java/net/minestom/server/gamedata/tags/Tag.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java index 5a0c7f552c0..22e9e149338 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -12,14 +12,12 @@ import net.minestom.server.registry.ProtocolObject; import net.minestom.server.registry.Registry; import net.minestom.server.utils.NamespaceID; -import net.minestom.server.world.biome.Biome; import org.jetbrains.annotations.Contract; 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.Optional; import java.util.Set; import java.util.function.Function; From 04e66b9602aaffe14e262e9721c82e76d1c499fc Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 2 Jan 2025 22:00:56 +0100 Subject: [PATCH 7/7] Rename some variables to improve readability of the code (cherry picked from commit 93932862bdb1bfdcb21b26f425d67c3929345e1c) --- .../net/minestom/server/gamedata/tags/Tag.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/gamedata/tags/Tag.java b/src/main/java/net/minestom/server/gamedata/tags/Tag.java index 22e9e149338..2984ffd0243 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -90,25 +90,24 @@ public NamespaceID getName() { public enum BasicType { BLOCKS("minecraft:block", Registry.Resource.BLOCK_TAGS, - name -> Optional.ofNullable(Block.fromNamespaceId(name)).map(Block::id)), + blockName -> Optional.ofNullable(Block.fromNamespaceId(blockName)).map(Block::id)), ITEMS("minecraft:item", Registry.Resource.ITEM_TAGS, - name -> Optional.ofNullable(Material.fromNamespaceId(name)).map(Material::id)), + itemName -> Optional.ofNullable(Material.fromNamespaceId(itemName)).map(Material::id)), FLUIDS("minecraft:fluid", Registry.Resource.FLUID_TAGS, - name -> Optional.ofNullable(Fluid.fromNamespaceId(name)).map(Fluid::id)), + fluidName -> Optional.ofNullable(Fluid.fromNamespaceId(fluidName)).map(Fluid::id)), BIOMES("minecraft:worldgen/biome", Registry.Resource.BIOME_TAGS, - name -> Optional.of(DynamicRegistry.Key.of(name)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getBiomeRegistry()::getId)), + biomeName -> Optional.of(DynamicRegistry.Key.of(biomeName)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getBiomeRegistry()::getId)), ENTITY_TYPES("minecraft:entity_type", Registry.Resource.ENTITY_TYPE_TAGS, - name -> Optional.ofNullable(EntityType.fromNamespaceId(name)).map(EntityType::id)), + entityName -> Optional.ofNullable(EntityType.fromNamespaceId(entityName)).map(EntityType::id)), GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS, - name -> Optional.ofNullable(GameEvent.fromNamespaceId(name)).map(GameEvent::id)), + eventName -> Optional.ofNullable(GameEvent.fromNamespaceId(eventName)).map(GameEvent::id)), SOUND_EVENTS("minecraft:sound_event", null, null), // Seems not to be included in server data POTION_EFFECTS("minecraft:sound_event", null, null), // Seems not to be included in server data - //todo this is cursed. it does not update as the registry changes. Fix later. ENCHANTMENTS("minecraft:enchantment", Registry.Resource.ENCHANTMENT_TAGS, - name -> Optional.of(DynamicRegistry.Key.of(name)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getEnchantmentRegistry()::getId)),; + enchName -> Optional.of(DynamicRegistry.Key.of(enchName)).map(DynamicRegistry.Key::namespace).map(MinecraftServer.getEnchantmentRegistry()::getId)),; - private final static BasicType[] VALUES = values(); + private static final BasicType[] VALUES = values(); private final String identifier; private final Registry.Resource resource; private final Function> function;