From bf20559f781dd6f87c9c146ac1b99034291332f9 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sat, 25 May 2024 12:37:38 +0200 Subject: [PATCH 1/9] [Chore] Replace enum with registry system for feature flags --- .../net/minestom/codegen/CodeGenerator.java | 6 +- .../java/net/minestom/codegen/Generators.java | 3 +- .../codegen/feature/FeatureFlagGenerator.java | 106 ------------------ .../codegen/fluid/FluidGenerator.java | 2 +- settings.gradle.kts | 2 +- .../minestom/server/feature/FeatureFlags.java | 35 ------ .../server/featureflag/FeatureFlags.java | 15 +++ .../player/AsyncPlayerConfigurationEvent.java | 9 +- .../server/featureflag/FeatureFlag.java | 39 +++++++ .../server/featureflag/FeatureFlagImpl.java | 33 ++++++ .../UpdateEnabledFeaturesPacket.java | 10 +- .../minestom/server/registry/Registry.java | 16 +++ 12 files changed, 117 insertions(+), 159 deletions(-) delete mode 100644 code-generators/src/main/java/net/minestom/codegen/feature/FeatureFlagGenerator.java delete mode 100644 src/autogenerated/java/net/minestom/server/feature/FeatureFlags.java create mode 100644 src/autogenerated/java/net/minestom/server/featureflag/FeatureFlags.java create mode 100644 src/main/java/net/minestom/server/featureflag/FeatureFlag.java create mode 100644 src/main/java/net/minestom/server/featureflag/FeatureFlagImpl.java 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..3e92a443d25 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -3,11 +3,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.JavaFile; -import com.squareup.javapoet.TypeSpec; +import com.squareup.javapoet.*; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; 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 901eff6889f..92b3cd63c47 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -1,7 +1,6 @@ package net.minestom.codegen; import net.minestom.codegen.color.DyeColorGenerator; -import net.minestom.codegen.feature.FeatureFlagGenerator; import net.minestom.codegen.fluid.FluidGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +21,6 @@ public static void main(String[] args) { // Generate DyeColors new DyeColorGenerator(resource("dye_colors.json"), outputFolder).generate(); - new FeatureFlagGenerator(resource("feature_flags.json"), outputFolder).generate(); var generator = new CodeGenerator(outputFolder); @@ -43,6 +41,7 @@ public static void main(String[] args) { generator.generate(resource("villager_professions.json"), "net.minestom.server.entity.villager", "VillagerProfession", "VillagerProfessionImpl", "VillagerProfessions"); generator.generate(resource("villager_types.json"), "net.minestom.server.entity.villager", "VillagerType", "VillagerTypeImpl", "VillagerTypes"); generator.generate(resource("attributes.json"), "net.minestom.server.attribute", "Attribute", "AttributeImpl", "Attributes"); + generator.generate(resource("feature_flags.json"), "net.minestom.server.featureflag", "FeatureFlag", "FeatureFlagImpl", "FeatureFlags"); // Generate fluids diff --git a/code-generators/src/main/java/net/minestom/codegen/feature/FeatureFlagGenerator.java b/code-generators/src/main/java/net/minestom/codegen/feature/FeatureFlagGenerator.java deleted file mode 100644 index 8545161b910..00000000000 --- a/code-generators/src/main/java/net/minestom/codegen/feature/FeatureFlagGenerator.java +++ /dev/null @@ -1,106 +0,0 @@ -package net.minestom.codegen.feature; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.squareup.javapoet.*; -import net.minestom.codegen.MinestomCodeGenerator; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.lang.model.element.Modifier; -import java.io.File; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.List; - -public class FeatureFlagGenerator extends MinestomCodeGenerator { - - private static final String FEATURE_FLAG_FILE_PACKAGE = "net.minestom.server.feature"; // Microtus - Feature flag - private static final String CLASS_NAME = "FeatureFlags"; - private static final String FEATURE_KEY = "feature"; - private static final Logger LOGGER = LoggerFactory.getLogger(FeatureFlagGenerator.class); - - private final InputStream featureFlagFile; - private final File outputFolder; - - /** - * Creates a new code generator. - */ - public FeatureFlagGenerator(InputStream featureFlagFile, File outputFolder) { - super(FEATURE_FLAG_FILE_PACKAGE); - this.featureFlagFile = featureFlagFile; - this.outputFolder = outputFolder; - } - - @Override - public void generate() { - if (featureFlagFile == null) { - LOGGER.error("Failed to find feature_flag.json."); - LOGGER.error("Stopped code generation for feature_flag.json."); - return; - } - if (!outputFolder.exists() && !outputFolder.mkdirs()) { - LOGGER.error("Output folder for code generation does not exist and could not be created."); - return; - } - JsonElement featureFlags = GSON.fromJson(new InputStreamReader(featureFlagFile), JsonElement.class); - - ClassName featureFlag = ClassName.get(FEATURE_FLAG_FILE_PACKAGE, CLASS_NAME); - ClassName namespacedId = ClassName.get("net.minestom.server.utils", "NamespaceID"); - - TypeSpec.Builder featureFlagEnum = TypeSpec.enumBuilder(featureFlag) - .addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); - - // Fields - featureFlagEnum.addFields( - List.of( - FieldSpec.builder(namespacedId, FEATURE_KEY, Modifier.PRIVATE, Modifier.FINAL).build(), - FieldSpec.builder(ArrayTypeName.of(featureFlag), "VALUES", Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL).initializer(CLASS_NAME + ".values()").build() - ) - ); - - // Methods - featureFlagEnum.addMethods( - List.of( - // Constructor - MethodSpec.constructorBuilder() - .addParameter( - ParameterSpec.builder(namespacedId, FEATURE_KEY).addAnnotation(NotNull.class).build() - ) - .addStatement("this.$1L = $1L", FEATURE_KEY) - .build(), - MethodSpec.methodBuilder(FEATURE_KEY) - .addModifiers(Modifier.PUBLIC) - .returns(namespacedId.annotated(AnnotationSpec.builder(NotNull.class).build())) - .addStatement("return this.$L", FEATURE_KEY) - .build(), - MethodSpec.methodBuilder("getValue") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .addParameter(ParameterSpec.builder(TypeName.INT, "id").build()) - .addAnnotation(Nullable.class) - .returns(ClassName.get(FEATURE_FLAG_FILE_PACKAGE, CLASS_NAME)) - .addCode("return VALUES[$L];", "id") - .build() - ) - ); - featureFlags.getAsJsonArray().forEach(featureFlagElement -> { - String object = featureFlagElement.getAsString(); - featureFlagEnum.addEnumConstant(extractNamespace(object), TypeSpec.anonymousClassBuilder( - "$T.from($S)", - namespacedId, object - ).build() - ); - }); - writeFiles( - List.of( - JavaFile.builder(FEATURE_FLAG_FILE_PACKAGE, featureFlagEnum.build()) - .indent(DEFAULT_INDENT) - .skipJavaLangImports(true) - .build() - ), - outputFolder - ); - } -} diff --git a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java index 3968e9ec6eb..a681be57a32 100644 --- a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java @@ -3,12 +3,12 @@ import com.google.gson.JsonObject; import com.squareup.javapoet.*; import net.minestom.codegen.MinestomCodeGenerator; +import net.minestom.codegen.util.GenerationHelper; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.minestom.codegen.util.GenerationHelper; import javax.lang.model.element.Modifier; import java.io.File; diff --git a/settings.gradle.kts b/settings.gradle.kts index 8348dd6ff71..c6cf60d9010 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,7 +12,7 @@ dependencyResolutionManagement { version("kotlin", "1.9.22") version("hydrazine", "1.7.2") version("dependencyGetter", "v1.0.1") - version("data", "1.20.4-rv9") + version("data", "1.20.4-rv10") version("hephaistos", "2.6.1") version("jetbrainsAnnotations", "24.1.0") version("logback", "1.4.5") diff --git a/src/autogenerated/java/net/minestom/server/feature/FeatureFlags.java b/src/autogenerated/java/net/minestom/server/feature/FeatureFlags.java deleted file mode 100644 index 983bd307419..00000000000 --- a/src/autogenerated/java/net/minestom/server/feature/FeatureFlags.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.minestom.server.feature; - -import net.minestom.server.utils.NamespaceID; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * AUTOGENERATED by FeatureFlagGenerator - */ -public enum FeatureFlags { - UPDATE_1_21(NamespaceID.from("minecraft:update_1_21")), - - BUNDLE(NamespaceID.from("minecraft:bundle")), - - VANILLA(NamespaceID.from("minecraft:vanilla")), - - TRADE_REBALANCE(NamespaceID.from("minecraft:trade_rebalance")); - - private static final FeatureFlags[] VALUES = FeatureFlags.values(); - - private final NamespaceID feature; - - FeatureFlags(@NotNull NamespaceID feature) { - this.feature = feature; - } - - public @NotNull NamespaceID feature() { - return this.feature; - } - - @Nullable - public static FeatureFlags getValue(int id) { - return VALUES[id]; - } -} diff --git a/src/autogenerated/java/net/minestom/server/featureflag/FeatureFlags.java b/src/autogenerated/java/net/minestom/server/featureflag/FeatureFlags.java new file mode 100644 index 00000000000..1f92c8da724 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/featureflag/FeatureFlags.java @@ -0,0 +1,15 @@ +package net.minestom.server.featureflag; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface FeatureFlags { + FeatureFlag UPDATE_1_21 = FeatureFlagImpl.get("minecraft:update_1_21"); + + FeatureFlag BUNDLE = FeatureFlagImpl.get("minecraft:bundle"); + + FeatureFlag VANILLA = FeatureFlagImpl.get("minecraft:vanilla"); + + FeatureFlag TRADE_REBALANCE = FeatureFlagImpl.get("minecraft:trade_rebalance"); +} diff --git a/src/main/java/net/minestom/server/event/player/AsyncPlayerConfigurationEvent.java b/src/main/java/net/minestom/server/event/player/AsyncPlayerConfigurationEvent.java index 950794bcc21..c4d1a9f41fd 100644 --- a/src/main/java/net/minestom/server/event/player/AsyncPlayerConfigurationEvent.java +++ b/src/main/java/net/minestom/server/event/player/AsyncPlayerConfigurationEvent.java @@ -6,6 +6,7 @@ import net.kyori.adventure.key.Namespaced; import net.minestom.server.entity.Player; import net.minestom.server.event.trait.PlayerEvent; +import net.minestom.server.featureflag.FeatureFlag; import net.minestom.server.instance.Instance; import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.NotNull; @@ -27,9 +28,9 @@ public class AsyncPlayerConfigurationEvent implements PlayerEvent { private boolean hardcore; private boolean sendRegistryData; private Instance spawningInstance; - private Set enabledFeatures; + private Set enabledFeatures; - public AsyncPlayerConfigurationEvent(@NotNull Player player, boolean isFirstConfig, @NotNull Set enabledFeatures) { + public AsyncPlayerConfigurationEvent(@NotNull Player player, boolean isFirstConfig, @NotNull Set enabledFeatures) { this.player = player; this.isFirstConfig = isFirstConfig; this.enabledFeatures = enabledFeatures; @@ -75,11 +76,11 @@ public void setSpawningInstance(@Nullable Instance spawningInstance) { this.spawningInstance = spawningInstance; } - public void setEnabledFeatures(Set enabledFeatures) { + public void setEnabledFeatures(Set enabledFeatures) { this.enabledFeatures = enabledFeatures; } - public Set getEnabledFeatures() { + public Set getEnabledFeatures() { return enabledFeatures; } } diff --git a/src/main/java/net/minestom/server/featureflag/FeatureFlag.java b/src/main/java/net/minestom/server/featureflag/FeatureFlag.java new file mode 100644 index 00000000000..a19dc438601 --- /dev/null +++ b/src/main/java/net/minestom/server/featureflag/FeatureFlag.java @@ -0,0 +1,39 @@ +package net.minestom.server.featureflag; + +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 FeatureFlag extends StaticProtocolObject permits FeatureFlagImpl { + + /** + * Returns the entity registry. + * + * @return the entity registry or null if it was created with a builder + */ + @Contract(pure = true) + @Nullable + Registry.FeatureFlagEntry registry(); + + @Override + @NotNull + NamespaceID namespace(); + + static @NotNull Collection<@NotNull FeatureFlag> values() { + return FeatureFlagImpl.values(); + } + + static @Nullable FeatureFlag fromNamespaceId(@NotNull String namespaceID) { + return FeatureFlagImpl.getSafe(namespaceID); + } + + static @Nullable FeatureFlag fromNamespaceId(@NotNull NamespaceID namespaceID) { + return fromNamespaceId(namespaceID.asString()); + } + +} diff --git a/src/main/java/net/minestom/server/featureflag/FeatureFlagImpl.java b/src/main/java/net/minestom/server/featureflag/FeatureFlagImpl.java new file mode 100644 index 00000000000..a0333d5085f --- /dev/null +++ b/src/main/java/net/minestom/server/featureflag/FeatureFlagImpl.java @@ -0,0 +1,33 @@ +package net.minestom.server.featureflag; + +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 FeatureFlagImpl(Registry.FeatureFlagEntry registry, NamespaceID namespace, int id) implements FeatureFlag { + private static final Registry.DynamicContainer CONTAINER = Registry.createDynamicContainer(Registry.Resource.FEATURE_FLAGS, FeatureFlagImpl::createImpl); + private static final AtomicInteger INDEX = new AtomicInteger(); + + private static FeatureFlagImpl createImpl(String namespace, Registry.Properties properties) { + return new FeatureFlagImpl(Registry.featureFlag(namespace, properties)); + } + + private FeatureFlagImpl(Registry.FeatureFlagEntry registry) { + this(registry, registry.namespace(), INDEX.getAndIncrement()); + } + + static Collection values() { + return CONTAINER.values(); + } + + public static FeatureFlag get(@NotNull String namespace) { + return CONTAINER.get(namespace); + } + + static FeatureFlag getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } +} diff --git a/src/main/java/net/minestom/server/network/packet/server/configuration/UpdateEnabledFeaturesPacket.java b/src/main/java/net/minestom/server/network/packet/server/configuration/UpdateEnabledFeaturesPacket.java index 7bba65a9b18..226b347525f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/configuration/UpdateEnabledFeaturesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/configuration/UpdateEnabledFeaturesPacket.java @@ -1,25 +1,25 @@ package net.minestom.server.network.packet.server.configuration; +import net.minestom.server.featureflag.FeatureFlag; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; -import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.NotNull; import java.util.Set; import static net.minestom.server.network.NetworkBuffer.STRING; -public record UpdateEnabledFeaturesPacket(@NotNull Set features) implements ServerPacket.Configuration { - public static final int MAX_FEATURES = 1024; +public record UpdateEnabledFeaturesPacket(@NotNull Set features) implements ServerPacket.Configuration { + public static final int MAX_FEATURES = 64; public UpdateEnabledFeaturesPacket(@NotNull NetworkBuffer buffer) { - this(Set.copyOf(buffer.readCollection((b) -> NamespaceID.from(b.read(STRING)), MAX_FEATURES))); + this(Set.copyOf(buffer.readCollection((b) -> FeatureFlag.fromNamespaceId(b.read(STRING)), MAX_FEATURES))); } @Override public void write(@NotNull NetworkBuffer writer) { - writer.writeCollection(features, (b, feature) -> b.write(STRING, feature.asString())); + writer.writeCollection(features, (b, feature) -> b.write(STRING, feature.namespace().toString())); } @Override diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 5fe754d01bf..bce7a5927ae 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -87,6 +87,11 @@ public static AttributeEntry attribute(String namespace, @NotNull Properties mai return new AttributeEntry(namespace, main, null); } + @ApiStatus.Internal + public static FeatureFlagEntry featureFlag(String namespace, @NotNull Properties main) { + return new FeatureFlagEntry(namespace, main, null); + } + @ApiStatus.Internal public static VillagerProfession villagerProfession(String namespace, @NotNull Properties main) { return new VillagerProfession(namespace, main, null); @@ -252,6 +257,7 @@ public enum Resource { BIOMES("biomes.json"), VILLAGER_PROFESSION("villager_professions.json"), VILLAGER_TYPES("villager_types.json"), + FEATURE_FLAGS("feature_flags.json"), ; private final String name; @@ -261,6 +267,16 @@ public enum Resource { } } + public record FeatureFlagEntry( + @NotNull NamespaceID namespace, + @Nullable Properties custom + ) implements Entry { + + public FeatureFlagEntry(String namespace, Properties main, Properties custom) { + this(NamespaceID.from(namespace), custom); + } + } + public record AttributeEntry( @NotNull NamespaceID namespace, int id, From 6b708f794f307bac2948d1153b0603e96c74a018 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sun, 26 May 2024 10:36:27 +0200 Subject: [PATCH 2/9] Remove wildcard import --- .../src/main/java/net/minestom/codegen/CodeGenerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 3e92a443d25..e1d2d6277a7 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -3,7 +3,11 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import com.squareup.javapoet.*; +import com.squareup.javapoet.AnnotationSpec; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; From 2efc10b0794ee855570e1342c80d21dab59ab333 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sat, 25 May 2024 14:53:27 +0200 Subject: [PATCH 3/9] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..47835348cb4 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +microtus.onelitefeather.dev \ No newline at end of file From 975559ac86926b6b4e3c8fa9b4a774b0009ed3a7 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sat, 25 May 2024 18:22:29 +0200 Subject: [PATCH 4/9] Bump snapshot version (#31) --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index dc3efa6a041..9973263882b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,8 +8,8 @@ plugins { signing } -var baseVersion by extra("1.3.2") -var snapshot by extra("-SNAPSHOT") +var baseVersion by extra("1.4.0") +var snapshot by extra("") group = "net.onelitefeather.microtus" From 76d5c299f02e29ed31233431e690c8ef8a1c9971 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 25 May 2024 19:46:00 +0200 Subject: [PATCH 5/9] [Bugfix] Fix failing tests --- .../minestom/server/instance/AnvilLoaderIntegrationTest.java | 2 -- src/test/java/net/minestom/server/item/ItemAttributeTest.java | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/net/minestom/server/instance/AnvilLoaderIntegrationTest.java b/src/test/java/net/minestom/server/instance/AnvilLoaderIntegrationTest.java index 0b5b7a912b7..d35470ee9ed 100644 --- a/src/test/java/net/minestom/server/instance/AnvilLoaderIntegrationTest.java +++ b/src/test/java/net/minestom/server/instance/AnvilLoaderIntegrationTest.java @@ -51,7 +51,6 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) @Test void loadHouse(Env env) { - MinecraftServer.getBiomeManager().addBiome(VanillaBiome.PLAINS); // load a world that contains only a basic house and make sure it is loaded properly AnvilLoader chunkLoader = new AnvilLoader(worldFolder) { @@ -147,7 +146,6 @@ public boolean supportsParallelSaving() { @Test void loadAndSaveChunk(Env env) throws InterruptedException { - MinecraftServer.getBiomeManager().addBiome(VanillaBiome.PLAINS); Instance instance = env.createFlatInstance(new AnvilLoader(worldFolder) { // Force loads inside current thread @Override diff --git a/src/test/java/net/minestom/server/item/ItemAttributeTest.java b/src/test/java/net/minestom/server/item/ItemAttributeTest.java index 61d3424ce86..b2917aeb6bf 100644 --- a/src/test/java/net/minestom/server/item/ItemAttributeTest.java +++ b/src/test/java/net/minestom/server/item/ItemAttributeTest.java @@ -31,6 +31,7 @@ void attribute(Env env) { @Test void attributeReader(Env env) { + env.process().attribute().loadVanillaAttributes(); var attributes = List.of(new ItemAttribute( new UUID(0, 0), "generic.attack_damage", VanillaAttribute.GENERIC_ATTACK_DAMAGE, AttributeOperation.ADDITION, 2, AttributeSlot.MAINHAND)); From 2184f427e7f0b3a447d37c3c80a2f69ed134c590 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sun, 26 May 2024 10:43:50 +0200 Subject: [PATCH 6/9] Update build.gradle.kts --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9973263882b..2b008dd527f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } var baseVersion by extra("1.4.0") -var snapshot by extra("") +var snapshot by extra("-SNAPSHOT") group = "net.onelitefeather.microtus" From 32ee8055112c62aaeab10e6da9301c00336f1eec Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sun, 26 May 2024 15:32:17 +0200 Subject: [PATCH 7/9] [Chore] Replace enum with code generator for fluids (#27) * Move Fluids to CodeGenerator * [Chore] Replace enum with registry * Refactor: Move 'Fluids' interface from FluidImpl implements to Fluid extends --------- Co-authored-by: OneLiteFeather --- .../java/net/minestom/codegen/Generators.java | 6 +- .../codegen/fluid/FluidGenerator.java | 128 ------------------ .../java/net/minestom/server/fluid/Fluid.java | 62 --------- .../net/minestom/server/fluid/Fluids.java | 17 +++ .../minestom/server/registry/Registries.java | 45 ------ .../java/net/minestom/server/fluid/Fluid.java | 37 +++++ .../net/minestom/server/fluid/FluidImpl.java | 34 +++++ .../minestom/server/gamedata/tags/Tag.java | 6 +- .../minestom/server/registry/Registry.java | 20 +++ 9 files changed, 112 insertions(+), 243 deletions(-) delete mode 100644 src/autogenerated/java/net/minestom/server/fluid/Fluid.java create mode 100644 src/autogenerated/java/net/minestom/server/fluid/Fluids.java delete mode 100644 src/autogenerated/java/net/minestom/server/registry/Registries.java create mode 100644 src/main/java/net/minestom/server/fluid/Fluid.java create mode 100644 src/main/java/net/minestom/server/fluid/FluidImpl.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 92b3cd63c47..140c1afc966 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -1,7 +1,6 @@ package net.minestom.codegen; import net.minestom.codegen.color.DyeColorGenerator; -import net.minestom.codegen.fluid.FluidGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +40,9 @@ public static void main(String[] args) { generator.generate(resource("villager_professions.json"), "net.minestom.server.entity.villager", "VillagerProfession", "VillagerProfessionImpl", "VillagerProfessions"); generator.generate(resource("villager_types.json"), "net.minestom.server.entity.villager", "VillagerType", "VillagerTypeImpl", "VillagerTypes"); 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"); - - // Generate fluids - new FluidGenerator(resource("fluids.json"), outputFolder).generate(); - LOGGER.info("Finished generating code"); } diff --git a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java index a681be57a32..e69de29bb2d 100644 --- a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java @@ -1,128 +0,0 @@ -package net.minestom.codegen.fluid; - -import com.google.gson.JsonObject; -import com.squareup.javapoet.*; -import net.minestom.codegen.MinestomCodeGenerator; -import net.minestom.codegen.util.GenerationHelper; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.lang.model.element.Modifier; -import java.io.File; -import java.io.InputStream; -import java.io.InputStreamReader; - -@ApiStatus.NonExtendable -@ApiStatus.Internal -public final class FluidGenerator extends MinestomCodeGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(FluidGenerator.class); - private final InputStream fluidsFile; - private final File outputFolder; - - public FluidGenerator(@Nullable InputStream fluidsFile, @NotNull File outputFolder) { - super("net.minestom.server.fluid"); - this.fluidsFile = fluidsFile; - this.outputFolder = outputFolder; - } - - @Override - public void generate() { - if (fluidsFile == null) { - LOGGER.error("Failed to find fluids.json."); - LOGGER.error("Stopped code generation for fluids."); - return; - } - if (!outputFolder.exists() && !outputFolder.mkdirs()) { - LOGGER.error("Output folder for code generation does not exist and could not be created."); - return; - } - - JsonObject fluids = GSON.fromJson(new InputStreamReader(fluidsFile), JsonObject.class); - ClassName fluidClassName = ClassName.get(packageName, "Fluid"); - - // Particle - TypeSpec.Builder fluidClass = TypeSpec.enumBuilder(fluidClassName) - .addSuperinterface(KEYORI_ADVENTURE_KEY) - .addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); - - fluidClass.addField( - FieldSpec.builder(NAMESPACE_ID_CLASS, "id") - .addModifiers(PRIVATE_FINAL_MODIFIERS).addAnnotation(NotNull.class).build() - ); - // static field - fluidClass.addField( - FieldSpec.builder(ArrayTypeName.of(fluidClassName), "VALUES") - .addModifiers(CONSTANT_MODIFIERS) - .initializer("values()") - .build() - ); - - fluidClass.addMethod( - MethodSpec.constructorBuilder() - .addParameter(ParameterSpec.builder(NAMESPACE_ID_CLASS, "id").addAnnotation(NotNull.class).build()) - .addStatement("this.id = id") - .addStatement("$T.fluids.put(id, this)", REGISTRY_CLASS) - .build() - ); - // Override key method (adventure) - fluidClass.addMethod(GenerationHelper.ADVENTURE_KEY_METHOD); - // getId method - fluidClass.addMethod( - MethodSpec.methodBuilder("getId") - .returns(TypeName.SHORT) - .addStatement("return (short) ordinal()") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // getNamespaceID method - fluidClass.addMethod( - MethodSpec.methodBuilder("getNamespaceID") - .returns(NAMESPACE_ID_CLASS) - .addAnnotation(NotNull.class) - .addStatement("return this.id") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // toString method - fluidClass.addMethod(GenerationHelper.TO_STRING); - - // fromId Method - fluidClass.addMethod( - MethodSpec.methodBuilder("fromId") - .returns(fluidClassName) - .addAnnotation(Nullable.class) - .addParameter(TypeName.SHORT, "id") - .beginControlFlow("if(id >= 0 && id < VALUES.length)") - .addStatement("return VALUES[id]") - .endControlFlow() - .addStatement("return null") - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - - // Use data - fluids.entrySet().forEach(entry -> { - final String fluidName = entry.getKey(); - fluidClass.addEnumConstant( - extractNamespace(fluidName), - TypeSpec.anonymousClassBuilder( - "$T.from($S)", - NAMESPACE_ID_CLASS, - fluidName - ).build() - ); - }); - - // Write files to outputFolder - writeFile( - JavaFile.builder(packageName, fluidClass.build()) - .indent(DEFAULT_INDENT) - .skipJavaLangImports(true) - .build(), - outputFolder - ); - } -} diff --git a/src/autogenerated/java/net/minestom/server/fluid/Fluid.java b/src/autogenerated/java/net/minestom/server/fluid/Fluid.java deleted file mode 100644 index bcbc2019140..00000000000 --- a/src/autogenerated/java/net/minestom/server/fluid/Fluid.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.minestom.server.fluid; - -import net.kyori.adventure.key.Key; -import net.kyori.adventure.key.Keyed; -import net.minestom.server.registry.Registries; -import net.minestom.server.utils.NamespaceID; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * AUTOGENERATED by FluidGenerator - */ -public enum Fluid implements Keyed { - EMPTY(NamespaceID.from("minecraft:empty")), - - FLOWING_WATER(NamespaceID.from("minecraft:flowing_water")), - - WATER(NamespaceID.from("minecraft:water")), - - FLOWING_LAVA(NamespaceID.from("minecraft:flowing_lava")), - - LAVA(NamespaceID.from("minecraft:lava")); - - private static final Fluid[] VALUES = values(); - - @NotNull - private final NamespaceID id; - - Fluid(@NotNull NamespaceID id) { - this.id = id; - Registries.fluids.put(id, this); - } - - @Override - @NotNull - public Key key() { - return this.id; - } - - public short getId() { - return (short) ordinal(); - } - - @NotNull - public NamespaceID getNamespaceID() { - return this.id; - } - - @NotNull - @Override - public String toString() { - return "[" + this.id + "]"; - } - - @Nullable - public static Fluid fromId(short id) { - if(id >= 0 && id < VALUES.length) { - return VALUES[id]; - } - return null; - } -} diff --git a/src/autogenerated/java/net/minestom/server/fluid/Fluids.java b/src/autogenerated/java/net/minestom/server/fluid/Fluids.java new file mode 100644 index 00000000000..27157009e9e --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/fluid/Fluids.java @@ -0,0 +1,17 @@ +package net.minestom.server.fluid; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface Fluids { + Fluid EMPTY = FluidImpl.get("minecraft:empty"); + + Fluid FLOWING_WATER = FluidImpl.get("minecraft:flowing_water"); + + Fluid WATER = FluidImpl.get("minecraft:water"); + + Fluid FLOWING_LAVA = FluidImpl.get("minecraft:flowing_lava"); + + Fluid LAVA = FluidImpl.get("minecraft:lava"); +} diff --git a/src/autogenerated/java/net/minestom/server/registry/Registries.java b/src/autogenerated/java/net/minestom/server/registry/Registries.java deleted file mode 100644 index aa5c107ff6d..00000000000 --- a/src/autogenerated/java/net/minestom/server/registry/Registries.java +++ /dev/null @@ -1,45 +0,0 @@ -// AUTOGENERATED by net.minestom.codegen.RegistriesGenerator -package net.minestom.server.registry; - -import net.kyori.adventure.key.Key; -import net.minestom.server.fluid.Fluid; -import net.minestom.server.utils.NamespaceID; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; - -/** - * AUTOGENERATED - */ -public final class Registries { - - /** - * Should only be used for internal code, please use the get* methods. - */ - @Deprecated - public static final HashMap fluids = new HashMap<>(); - - /** - * Returns the corresponding Fluid matching the given id. Returns 'EMPTY' if none match. - */ - @NotNull - public static Fluid getFluid(String id) { - return getFluid(NamespaceID.from(id)); - } - - /** - * Returns the corresponding Fluid matching the given id. Returns 'EMPTY' if none match. - */ - @NotNull - public static Fluid getFluid(NamespaceID id) { - return fluids.getOrDefault(id, Fluid.EMPTY); - } - - /** - * Returns the corresponding Fluid matching the given key. Returns 'EMPTY' if none match. - */ - @NotNull - public static Fluid getFluid(Key key) { - return getFluid(NamespaceID.from(key)); - } -} diff --git a/src/main/java/net/minestom/server/fluid/Fluid.java b/src/main/java/net/minestom/server/fluid/Fluid.java new file mode 100644 index 00000000000..c9e6bedf370 --- /dev/null +++ b/src/main/java/net/minestom/server/fluid/Fluid.java @@ -0,0 +1,37 @@ +package net.minestom.server.fluid; + +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 Fluid extends StaticProtocolObject, Fluids permits FluidImpl { + /** + * Returns the entity registry. + * + * @return the entity registry or null if it was created with a builder + */ + @Contract(pure = true) + @Nullable + Registry.FluidEntry registry(); + + @Override + @NotNull + NamespaceID namespace(); + + static @NotNull Collection<@NotNull Fluid> values() { + return FluidImpl.values(); + } + + static @Nullable Fluid fromNamespaceId(@NotNull String namespaceID) { + return FluidImpl.getSafe(namespaceID); + } + + static @Nullable Fluid fromNamespaceId(@NotNull NamespaceID namespaceID) { + return fromNamespaceId(namespaceID.asString()); + } +} diff --git a/src/main/java/net/minestom/server/fluid/FluidImpl.java b/src/main/java/net/minestom/server/fluid/FluidImpl.java new file mode 100644 index 00000000000..d5c0cc3b741 --- /dev/null +++ b/src/main/java/net/minestom/server/fluid/FluidImpl.java @@ -0,0 +1,34 @@ +package net.minestom.server.fluid; + +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 FluidImpl(Registry.FluidEntry registry, NamespaceID namespace, int id) implements Fluid { + + private static final Registry.DynamicContainer CONTAINER = Registry.createDynamicContainer(Registry.Resource.FLUIDS, FluidImpl::createImpl); + private static final AtomicInteger INDEX = new AtomicInteger(); + + private static FluidImpl createImpl(String namespace, Registry.Properties properties) { + return new FluidImpl(Registry.fluidEntry(namespace, properties)); + } + + private FluidImpl(Registry.FluidEntry registry) { + this(registry, registry.namespace(), INDEX.getAndIncrement()); + } + + static Collection values() { + return CONTAINER.values(); + } + + public static Fluid get(@NotNull String namespace) { + return CONTAINER.get(namespace); + } + + static Fluid 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 273f2be07ce..1f8278611d8 100644 --- a/src/main/java/net/minestom/server/gamedata/tags/Tag.java +++ b/src/main/java/net/minestom/server/gamedata/tags/Tag.java @@ -1,9 +1,9 @@ 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.Registries; import net.minestom.server.registry.Registry; import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.NotNull; @@ -71,11 +71,11 @@ public enum BasicType { ITEMS("minecraft:item", Registry.Resource.ITEM_TAGS, name -> Objects.requireNonNull(Material.fromNamespaceId(name)).id()), FLUIDS("minecraft:fluid", Registry.Resource.FLUID_TAGS, - name -> Registries.getFluid(name).ordinal()), + name -> 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 -> Registries.getFluid(name).ordinal()); + name ->Fluid.fromNamespaceId(name).id()); private final static BasicType[] VALUES = values(); private final String identifier; diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index bce7a5927ae..38bc7b3c36f 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -102,6 +102,11 @@ public static VillagerType villagerType(String namespace, @NotNull Properties ma return new VillagerType(namespace, main, null); } + @ApiStatus.Internal + public static FluidEntry fluidEntry(String namespace, @NotNull Properties main) { + return new FluidEntry(namespace, main, null); + } + @ApiStatus.Internal public static Map> load(Resource resource) { Map> map = new HashMap<>(); @@ -257,6 +262,7 @@ public enum Resource { BIOMES("biomes.json"), VILLAGER_PROFESSION("villager_professions.json"), VILLAGER_TYPES("villager_types.json"), + FLUIDS("fluids.json"), FEATURE_FLAGS("feature_flags.json"), ; @@ -267,6 +273,20 @@ public enum Resource { } } + public record FluidEntry( + @NotNull NamespaceID namespace, + @NotNull NamespaceID bucketId, + @Nullable Properties custom + ) implements Entry { + + public FluidEntry(String namespace, Properties main, Properties custom) { + this(NamespaceID.from(namespace), + NamespaceID.from(main.getString("bucketId")), + custom + ); + } + } + public record FeatureFlagEntry( @NotNull NamespaceID namespace, @Nullable Properties custom From fd81737f01f67ac2812212ef92c738c919c1c533 Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sat, 25 May 2024 12:37:38 +0200 Subject: [PATCH 8/9] [Chore] Replace enum with registry system for feature flags --- .../main/java/net/minestom/codegen/CodeGenerator.java | 6 +----- .../java/net/minestom/server/registry/Registry.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) 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..3e92a443d25 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -3,11 +3,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import com.squareup.javapoet.AnnotationSpec; -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.JavaFile; -import com.squareup.javapoet.TypeSpec; +import com.squareup.javapoet.*; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 38bc7b3c36f..da7ee61c917 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -262,6 +262,7 @@ public enum Resource { BIOMES("biomes.json"), VILLAGER_PROFESSION("villager_professions.json"), VILLAGER_TYPES("villager_types.json"), + FEATURE_FLAGS("feature_flags.json"), FLUIDS("fluids.json"), FEATURE_FLAGS("feature_flags.json"), ; @@ -273,6 +274,16 @@ public enum Resource { } } + public record FeatureFlagEntry( + @NotNull NamespaceID namespace, + @Nullable Properties custom + ) implements Entry { + + public FeatureFlagEntry(String namespace, Properties main, Properties custom) { + this(NamespaceID.from(namespace), custom); + } + } + public record FluidEntry( @NotNull NamespaceID namespace, @NotNull NamespaceID bucketId, From aedfc1de69fb22e49fa27ed48f341d5226eeb23f Mon Sep 17 00:00:00 2001 From: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com> Date: Sun, 26 May 2024 16:44:03 +0200 Subject: [PATCH 9/9] Remove wildcard import --- .../src/main/java/net/minestom/codegen/CodeGenerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 3e92a443d25..e1d2d6277a7 100644 --- a/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/CodeGenerator.java @@ -3,7 +3,11 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import com.squareup.javapoet.*; +import com.squareup.javapoet.AnnotationSpec; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger;