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..da3672e1a47 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -2,7 +2,6 @@ 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; @@ -43,10 +42,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"); - - - // Generate fluids - new FluidGenerator(resource("fluids.json"), outputFolder).generate(); + generator.generate(resource("fluids.json"), "net.minestom.server.fluid", "Fluid", "FluidImpl", "Fluids"); 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 deleted file mode 100644 index 3968e9ec6eb..00000000000 --- a/code-generators/src/main/java/net/minestom/codegen/fluid/FluidGenerator.java +++ /dev/null @@ -1,128 +0,0 @@ -package net.minestom.codegen.fluid; - -import com.google.gson.JsonObject; -import com.squareup.javapoet.*; -import net.minestom.codegen.MinestomCodeGenerator; -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; -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 5fe754d01bf..465d4bf95f3 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -97,6 +97,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<>(); @@ -252,6 +257,7 @@ public enum Resource { BIOMES("biomes.json"), VILLAGER_PROFESSION("villager_professions.json"), VILLAGER_TYPES("villager_types.json"), + FLUIDS("fluids.json"), ; private final String name; @@ -261,6 +267,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 AttributeEntry( @NotNull NamespaceID namespace, int id,