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;