diff --git a/build.gradle.kts b/build.gradle.kts index b9b55a567..304a3d4e4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,6 +23,7 @@ allprojects { description = shortDescription repositories { + mavenLocal() mavenCentral() } @@ -72,7 +73,6 @@ dependencies { implementation(libs.minestomData) // Performance/data structures - implementation(libs.caffeine) api(libs.fastutil) implementation(libs.bundles.flare) api(libs.gson) @@ -116,7 +116,7 @@ tasks { replaceToken("\"&ARTIFACT\"", if (artifact == null) "null" else "\"${artifact}\"", gitFile) } - nexusPublishing{ + nexusPublishing { useStaging.set(true) this.packageGroup.set("net.minestom") 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 deddd0e90..3ac9a26e5 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -4,6 +4,7 @@ import net.minestom.codegen.color.DyeColorGenerator; import net.minestom.codegen.fluid.FluidGenerator; import net.minestom.codegen.particle.ParticleGenerator; import net.minestom.codegen.recipe.RecipeTypeGenerator; +import net.minestom.codegen.util.GenericEnumGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +23,21 @@ public class Generators { // Special generators new DyeColorGenerator(resource("dye_colors.json"), outputFolder).generate(); - new RecipeTypeGenerator(resource("recipe_types.json"), outputFolder).generate(); new ParticleGenerator(resource("particles.json"), outputFolder).generate(); new ConstantsGenerator(resource("constants.json"), outputFolder).generate(); + new RecipeTypeGenerator(resource("recipe_types.json"), outputFolder).generate(); + new GenericEnumGenerator("net.minestom.server.recipe.display", "RecipeDisplayType", + resource("recipe_display_types.json"), outputFolder).generate(); + new GenericEnumGenerator("net.minestom.server.recipe.display", "SlotDisplayType", + resource("slot_display_types.json"), outputFolder).generate(); + new GenericEnumGenerator("net.minestom.server.recipe", "RecipeBookCategory", + resource("recipe_book_categories.json"), outputFolder).generate(); + new GenericEnumGenerator("net.minestom.server.item.component", "ConsumeEffectType", + resource("consume_effects.json"), outputFolder).packagePrivate().generate(); + new GenericEnumGenerator("net.minestom.server.command", "ArgumentParserType", + resource("command_arguments.json"), outputFolder).generate(); + new GenericEnumGenerator("net.minestom.server.entity", "VillagerType", + resource("villager_types.json"), outputFolder).generate(); var generator = new CodeGenerator(outputFolder); @@ -38,6 +51,8 @@ public class Generators { generator.generate(resource("custom_statistics.json"), "net.minestom.server.statistic", "StatisticType", "StatisticTypeImpl", "StatisticTypes"); generator.generate(resource("attributes.json"), "net.minestom.server.entity.attribute", "Attribute", "AttributeImpl", "Attributes"); generator.generate(resource("feature_flags.json"), "net.minestom.server", "FeatureFlag", "FeatureFlagImpl", "FeatureFlags"); + generator.generate(resource("villager_professions.json"), "net.minestom.server.entity", "VillagerProfession", "VillagerProfessionImpl", "VillagerProfessions"); + // Dynamic registries generator.generateKeys(resource("chat_types.json"), "net.minestom.server.message", "ChatType", "ChatTypes"); @@ -54,17 +69,7 @@ public class Generators { // Generate fluids new FluidGenerator(resource("fluids.json"), outputFolder).generate(); - - // TODO: Generate villager professions -// new VillagerProfessionGenerator( -// new File(inputFolder, targetVersion + "_villager_professions.json"), -// outputFolder -// ).generate(); - // TODO: Generate villager types -// new VillagerTypeGenerator( -// new File(inputFolder, targetVersion + "_villager_types.json"), -// outputFolder -// ).generate(); + LOGGER.info("Finished generating code"); } diff --git a/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java index a56248de3..0ba176ded 100644 --- a/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/MinestomCodeGenerator.java @@ -29,6 +29,8 @@ public abstract class MinestomCodeGenerator { } protected static String toConstant(String namespace) { - return namespace.replace("minecraft:", "").toUpperCase(Locale.ROOT); + return namespace.replace("minecraft:", "") + .replace("brigadier:", "") + .toUpperCase(Locale.ROOT); } } diff --git a/code-generators/src/main/java/net/minestom/codegen/entity/VillagerProfessionGenerator.java b/code-generators/src/main/java/net/minestom/codegen/entity/VillagerProfessionGenerator.java deleted file mode 100644 index 54eaae593..000000000 --- a/code-generators/src/main/java/net/minestom/codegen/entity/VillagerProfessionGenerator.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.minestom.codegen.entity; - -import com.google.gson.JsonArray; -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 final class VillagerProfessionGenerator extends MinestomCodeGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(VillagerProfessionGenerator.class); - private final InputStream villagerProfessionsFile; - private final File outputFolder; - - - public VillagerProfessionGenerator(@Nullable InputStream villagerProfessionsFile, @NotNull File outputFolder) { - this.villagerProfessionsFile = villagerProfessionsFile; - this.outputFolder = outputFolder; - } - - @Override - public void generate() { - if (villagerProfessionsFile == null) { - LOGGER.error("Failed to find villager_professions.json."); - LOGGER.error("Stopped code generation for villager professions."); - return; - } - if (!outputFolder.exists() && !outputFolder.mkdirs()) { - LOGGER.error("Output folder for code generation does not exist and could not be created."); - return; - } - // Important classes we use alot - ClassName namespaceIDClassName = ClassName.get("net.minestom.server.utils", "NamespaceID"); - ClassName rawVillagerProfessionDataClassName = ClassName.get("net.minestom.server.raw_data", "RawVillagerProfessionData"); - ClassName registryClassName = ClassName.get("net.minestom.server.registry", "Registry"); - - JsonArray villagerProfessions = GSON.fromJson(new InputStreamReader(villagerProfessionsFile), JsonArray.class); - ClassName villagerProfessionClassName = ClassName.get("net.minestom.server.entity.metadata.villager", "VillagerProfession"); - - // Particle - TypeSpec.Builder villagerProfessionClass = TypeSpec.classBuilder(villagerProfessionClassName) - .addSuperinterface(ClassName.get("net.kyori.adventure.key", "Keyed")) - .addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); - villagerProfessionClass.addField( - FieldSpec.builder(namespaceIDClassName, "id") - .addModifiers(Modifier.PRIVATE, Modifier.FINAL).addAnnotation(NotNull.class).build() - ); - villagerProfessionClass.addField( - FieldSpec.builder(rawVillagerProfessionDataClassName, "villagerProfessionData") - .addModifiers(Modifier.PRIVATE, Modifier.VOLATILE) - .addAnnotation(NotNull.class) - .build() - ); - villagerProfessionClass.addMethod( - MethodSpec.constructorBuilder() - .addParameter(ParameterSpec.builder(namespaceIDClassName, "id").addAnnotation(NotNull.class).build()) - .addParameter(ParameterSpec.builder(rawVillagerProfessionDataClassName, "villagerProfessionData").addAnnotation(NotNull.class).build()) - .addStatement("this.id = id") - .addStatement("this.villagerProfessionData = villagerProfessionData") - .addModifiers(Modifier.PROTECTED) - .build() - ); - // Override key method (adventure) - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("key") - .returns(ClassName.get("net.kyori.adventure.key", "Key")) - .addAnnotation(Override.class) - .addAnnotation(NotNull.class) - .addStatement("return this.id") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // getId method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("getId") - .returns(namespaceIDClassName) - .addAnnotation(NotNull.class) - .addStatement("return this.id") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // getVillagerProfessionData method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("getVillagerProfessionData") - .returns(rawVillagerProfessionDataClassName) - .addAnnotation(NotNull.class) - .addStatement("return this.villagerProfessionData") - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .build() - ); - // setVillagerProfessionData method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("setVillagerProfessionData") - .addParameter(ParameterSpec.builder(rawVillagerProfessionDataClassName, "villagerProfessionData").addAnnotation(NotNull.class).build()) - .addStatement("this.villagerProfessionData = villagerProfessionData") - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .build() - ); - // getNumericalId - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("getNumericalId") - .returns(TypeName.INT) - .addStatement("return $T.VILLAGER_PROFESSION_REGISTRY.getId(this)", registryClassName) - .addModifiers(Modifier.PUBLIC) - .build() - ); - // fromId Method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("fromId") - .returns(villagerProfessionClassName) - .addAnnotation(Nullable.class) - .addParameter(TypeName.INT, "id") - .addStatement("return $T.VILLAGER_PROFESSION_REGISTRY.get((short) id)", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - // fromId Method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("fromId") - .returns(villagerProfessionClassName) - .addAnnotation(NotNull.class) - .addParameter(ClassName.get("net.kyori.adventure.key", "Key"), "id") - .addStatement("return $T.VILLAGER_PROFESSION_REGISTRY.get(id)", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - // toString method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("toString") - .addAnnotation(NotNull.class) - .addAnnotation(Override.class) - .returns(String.class) - // this resolves to [Namespace] - .addStatement("return \"[\" + this.id + \"]\"") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // values method - villagerProfessionClass.addMethod( - MethodSpec.methodBuilder("values") - .addAnnotation(NotNull.class) - .returns(ParameterizedTypeName.get(ClassName.get(List.class), villagerProfessionClassName)) - .addStatement("return $T.VILLAGER_PROFESSION_REGISTRY.values()", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - CodeBlock.Builder staticBlock = CodeBlock.builder(); - // Use data - for (JsonElement vp : villagerProfessions) { - JsonObject villagerProfession = vp.getAsJsonObject(); - - String villagerProfessionName = villagerProfession.get("name").getAsString(); - JsonElement workSound = villagerProfession.get("workSound"); - if (workSound == null) { - villagerProfessionClass.addField( - FieldSpec.builder( - villagerProfessionClassName, - villagerProfessionName - ).initializer( - "new $T($T.from($S), new $T(() -> null))", - villagerProfessionClassName, - namespaceIDClassName, - villagerProfession.get("id").getAsString(), - - rawVillagerProfessionDataClassName - ).addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).build() - ); - } else { - villagerProfessionClass.addField( - FieldSpec.builder( - villagerProfessionClassName, - villagerProfessionName - ).initializer( - "new $T($T.from($S), new $T(() -> $T.SOUND_EVENT_REGISTRY.get($S)))", - villagerProfessionClassName, - namespaceIDClassName, - villagerProfession.get("id").getAsString(), - - rawVillagerProfessionDataClassName, - registryClassName, - workSound.getAsString() - ).addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).build() - ); - } - - // Add to static init. - staticBlock.addStatement("$T.VILLAGER_PROFESSION_REGISTRY.register($N)", registryClassName, villagerProfessionName); - } - - villagerProfessionClass.addStaticBlock(staticBlock.build()); - - // Write files to outputFolder - writeFiles( - List.of( - JavaFile.builder("net.minestom.server.entity.metadata.villager", villagerProfessionClass.build()) - .indent(" ") - .skipJavaLangImports(true) - .build() - ), - outputFolder - ); - } -} diff --git a/code-generators/src/main/java/net/minestom/codegen/entity/VillagerTypeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/entity/VillagerTypeGenerator.java deleted file mode 100644 index 8defb0243..000000000 --- a/code-generators/src/main/java/net/minestom/codegen/entity/VillagerTypeGenerator.java +++ /dev/null @@ -1,164 +0,0 @@ -package net.minestom.codegen.entity; - -import com.google.gson.JsonArray; -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 final class VillagerTypeGenerator extends MinestomCodeGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(VillagerTypeGenerator.class); - private final InputStream villagerTypesFile; - private final File outputFolder; - - public VillagerTypeGenerator(@Nullable InputStream villagerTypesFile, @NotNull File outputFolder) { - this.villagerTypesFile = villagerTypesFile; - this.outputFolder = outputFolder; - } - - @Override - public void generate() { - if (villagerTypesFile == null) { - LOGGER.error("Failed to find villager_types.json."); - LOGGER.error("Stopped code generation for villager types."); - return; - } - if (!outputFolder.exists() && !outputFolder.mkdirs()) { - LOGGER.error("Output folder for code generation does not exist and could not be created."); - return; - } - // Important classes we use alot - ClassName namespaceIDClassName = ClassName.get("net.minestom.server.utils", "NamespaceID"); - ClassName registryClassName = ClassName.get("net.minestom.server.registry", "Registry"); - - JsonArray villagerTypes = GSON.fromJson(new InputStreamReader(villagerTypesFile), JsonArray.class); - ClassName villagerTypeClassName = ClassName.get("net.minestom.server.entity.metadata.villager", "VillagerType"); - - // Particle - TypeSpec.Builder villagerTypeClass = TypeSpec.classBuilder(villagerTypeClassName) - .addSuperinterface(ClassName.get("net.kyori.adventure.key", "Keyed")) - .addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); - villagerTypeClass.addField( - FieldSpec.builder(namespaceIDClassName, "id") - .addModifiers(Modifier.PRIVATE, Modifier.FINAL).addAnnotation(NotNull.class).build() - ); - villagerTypeClass.addMethod( - MethodSpec.constructorBuilder() - .addParameter(ParameterSpec.builder(namespaceIDClassName, "id").addAnnotation(NotNull.class).build()) - .addStatement("this.id = id") - .addModifiers(Modifier.PROTECTED) - .build() - ); - // Override key method (adventure) - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("key") - .returns(ClassName.get("net.kyori.adventure.key", "Key")) - .addAnnotation(Override.class) - .addAnnotation(NotNull.class) - .addStatement("return this.id") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // getId method - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("getId") - .returns(namespaceIDClassName) - .addAnnotation(NotNull.class) - .addStatement("return this.id") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // getNumericalId - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("getNumericalId") - .returns(TypeName.INT) - .addStatement("return $T.VILLAGER_TYPE_REGISTRY.getId(this)", registryClassName) - .addModifiers(Modifier.PUBLIC) - .build() - ); - // fromId Method - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("fromId") - .returns(villagerTypeClassName) - .addAnnotation(Nullable.class) - .addParameter(TypeName.INT, "id") - .addStatement("return $T.VILLAGER_TYPE_REGISTRY.get((short) id)", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - // fromId Method - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("fromId") - .returns(villagerTypeClassName) - .addAnnotation(NotNull.class) - .addParameter(ClassName.get("net.kyori.adventure.key", "Key"), "id") - .addStatement("return $T.VILLAGER_TYPE_REGISTRY.get(id)", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - // toString method - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("toString") - .addAnnotation(NotNull.class) - .addAnnotation(Override.class) - .returns(String.class) - // this resolves to [Namespace] - .addStatement("return \"[\" + this.id + \"]\"") - .addModifiers(Modifier.PUBLIC) - .build() - ); - // values method - villagerTypeClass.addMethod( - MethodSpec.methodBuilder("values") - .addAnnotation(NotNull.class) - .returns(ParameterizedTypeName.get(ClassName.get(List.class), villagerTypeClassName)) - .addStatement("return $T.VILLAGER_TYPE_REGISTRY.values()", registryClassName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .build() - ); - CodeBlock.Builder staticBlock = CodeBlock.builder(); - // Use data - for (JsonElement vp : villagerTypes) { - JsonObject villagerProfession = vp.getAsJsonObject(); - - String villagerProfessionName = villagerProfession.get("name").getAsString(); - - villagerTypeClass.addField( - FieldSpec.builder( - villagerTypeClassName, - villagerProfessionName - ).initializer( - "new $T($T.from($S))", - villagerTypeClassName, - namespaceIDClassName, - villagerProfession.get("id").getAsString() - ).addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).build() - ); - // Add to static init. - staticBlock.addStatement("$T.VILLAGER_TYPE_REGISTRY.register($N)", registryClassName, villagerProfessionName); - } - - villagerTypeClass.addStaticBlock(staticBlock.build()); - - // Write files to outputFolder - writeFiles( - List.of( - JavaFile.builder("net.minestom.server.entity.metadata.villager", villagerTypeClass.build()) - .indent(" ") - .skipJavaLangImports(true) - .build() - ), - outputFolder - ); - } -} diff --git a/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java b/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java index 749dfc091..a575a0f2a 100644 --- a/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java +++ b/code-generators/src/main/java/net/minestom/codegen/recipe/RecipeTypeGenerator.java @@ -1,113 +1,21 @@ package net.minestom.codegen.recipe; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.squareup.javapoet.*; -import net.minestom.codegen.MinestomCodeGenerator; +import net.minestom.codegen.util.GenericEnumGenerator; 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.Comparator; -import java.util.List; -import java.util.stream.StreamSupport; -public class RecipeTypeGenerator extends MinestomCodeGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(RecipeTypeGenerator.class); - private final InputStream recipeTypesFile; - private final File outputFolder; +public class RecipeTypeGenerator extends GenericEnumGenerator { public RecipeTypeGenerator(@Nullable InputStream recipeTypesFile, @NotNull File outputFolder) { - this.recipeTypesFile = recipeTypesFile; - this.outputFolder = outputFolder; + super("net.minestom.server.recipe", "RecipeType", recipeTypesFile, outputFolder); } @Override - public void generate() { - if (recipeTypesFile == null) { - LOGGER.error("Failed to find recipe_types.json."); - LOGGER.error("Stopped code generation for recipe types."); - return; - } - if (!outputFolder.exists() && !outputFolder.mkdirs()) { - LOGGER.error("Output folder for code generation does not exist and could not be created."); - return; - } - - // Important classes we use alot - JsonArray recipeTypes = GSON.fromJson(new InputStreamReader(recipeTypesFile), JsonArray.class); - ClassName recipeTypeCN = ClassName.get("net.minestom.server.recipe", "RecipeType"); - TypeSpec.Builder recipeTypeEnum = TypeSpec.enumBuilder(recipeTypeCN) - .addSuperinterface(ClassName.get("net.minestom.server.registry", "StaticProtocolObject")) - .addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); - ClassName namespaceIdCN = ClassName.get("net.minestom.server.utils", "NamespaceID"); - - ClassName networkBufferCN = ClassName.get("net.minestom.server.network", "NetworkBuffer"); - ParameterizedTypeName networkBufferTypeCN = ParameterizedTypeName.get(networkBufferCN.nestedClass("Type"), recipeTypeCN); - - // Fields - recipeTypeEnum.addFields( - List.of( - FieldSpec.builder(networkBufferTypeCN, "NETWORK_TYPE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) - .initializer("$T.Enum($T.class)", networkBufferCN, recipeTypeCN) - .build(), - FieldSpec.builder(namespaceIdCN, "namespace", Modifier.PRIVATE, Modifier.FINAL).build() - ) - ); - - // Methods - recipeTypeEnum.addMethods( - List.of( - // Constructor - MethodSpec.constructorBuilder() - .addParameter(ParameterSpec.builder(namespaceIdCN, "namespace").addAnnotation(NotNull.class).build()) - .addStatement("this.namespace = namespace") - .build(), - MethodSpec.methodBuilder("namespace") - .addModifiers(Modifier.PUBLIC) - .addAnnotation(NotNull.class) - .addAnnotation(Override.class) - .returns(namespaceIdCN) - .addStatement("return this.namespace") - .build(), - MethodSpec.methodBuilder("id") - .addModifiers(Modifier.PUBLIC) - .returns(TypeName.INT) - .addAnnotation(Override.class) - .addStatement("return this.ordinal()") - .build() - ) - ); - - // Use data - for (JsonObject recipeTypeObject : StreamSupport.stream(recipeTypes.spliterator(), true).map(JsonElement::getAsJsonObject).sorted(Comparator.comparingInt(o -> o.get("id").getAsInt())).toList()) { - String recipeTypeName = recipeTypeObject.get("name").getAsString(); - recipeTypeEnum.addEnumConstant(recipeTypeConstantName(recipeTypeName), TypeSpec.anonymousClassBuilder( - "$T.from($S)", - namespaceIdCN, recipeTypeName - ).build() - ); - } - - // Write files to outputFolder - writeFiles( - List.of( - JavaFile.builder("net.minestom.server.recipe", recipeTypeEnum.build()) - .indent(" ") - .skipJavaLangImports(true) - .build() - ), - outputFolder - ); + protected @NotNull String nameGenerator(@NotNull String namespaceId) { + return toConstant(namespaceId).replace("CRAFTING_", ""); } - private static @NotNull String recipeTypeConstantName(@NotNull String name) { - return toConstant(name).replace("CRAFTING_", ""); - } } diff --git a/code-generators/src/main/java/net/minestom/codegen/util/GenericEnumGenerator.java b/code-generators/src/main/java/net/minestom/codegen/util/GenericEnumGenerator.java new file mode 100644 index 000000000..284ec8474 --- /dev/null +++ b/code-generators/src/main/java/net/minestom/codegen/util/GenericEnumGenerator.java @@ -0,0 +1,135 @@ +package net.minestom.codegen.util; + +import com.google.gson.JsonArray; +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.Comparator; +import java.util.List; +import java.util.stream.StreamSupport; + +public class GenericEnumGenerator extends MinestomCodeGenerator { + private static final Logger LOGGER = LoggerFactory.getLogger(GenericEnumGenerator.class); + + private final String packageName; + private final String className; + private final InputStream entriesFile; + private final File outputFolder; + + private boolean isPackagePrivate = false; + + public GenericEnumGenerator( + @NotNull String packageName, @NotNull String className, + @Nullable InputStream entriesFile, @NotNull File outputFolder + ) { + this.packageName = packageName; + this.className = className; + this.entriesFile = entriesFile; + this.outputFolder = outputFolder; + } + + public GenericEnumGenerator packagePrivate() { + this.isPackagePrivate = true; + return this; + } + + @Override + public void generate() { + if (entriesFile == null) { + LOGGER.error("Failed to find entries file."); + LOGGER.error("Stopped code generation for {}.", className); + return; + } + if (!outputFolder.exists() && !outputFolder.mkdirs()) { + LOGGER.error("Output folder for code generation does not exist and could not be created."); + return; + } + + // Important classes we use alot + JsonArray entryList = GSON.fromJson(new InputStreamReader(entriesFile), JsonArray.class); + ClassName entryCN = ClassName.get(packageName, className); + Modifier[] modifiers = isPackagePrivate ? new Modifier[0] : new Modifier[]{Modifier.PUBLIC}; + TypeSpec.Builder entryEnum = TypeSpec.enumBuilder(entryCN) + .addSuperinterface(ClassName.get("net.minestom.server.registry", "StaticProtocolObject")) + .addModifiers(modifiers).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName()); + ClassName namespaceIdCN = ClassName.get("net.minestom.server.utils", "NamespaceID"); + + ClassName networkBufferCN = ClassName.get("net.minestom.server.network", "NetworkBuffer"); + ParameterizedTypeName networkBufferTypeCN = ParameterizedTypeName.get(networkBufferCN.nestedClass("Type"), entryCN); + ClassName binaryTagSerializerRawCN = ClassName.get("net.minestom.server.utils.nbt", "BinaryTagSerializer"); + ParameterizedTypeName binaryTagSerializerCN = ParameterizedTypeName.get(binaryTagSerializerRawCN, entryCN); + + // Fields + entryEnum.addFields( + List.of( + FieldSpec.builder(networkBufferTypeCN, "NETWORK_TYPE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .initializer("$T.Enum($T.class)", networkBufferCN, entryCN) + .build(), + FieldSpec.builder(binaryTagSerializerCN, "NBT_TYPE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .initializer("$T.fromEnumKeyed($T.class)", binaryTagSerializerRawCN, entryCN) + .build(), + FieldSpec.builder(namespaceIdCN, "namespace", Modifier.PRIVATE, Modifier.FINAL).build() + ) + ); + + // Methods + entryEnum.addMethods( + List.of( + // Constructor + MethodSpec.constructorBuilder() + .addParameter(ParameterSpec.builder(namespaceIdCN, "namespace").addAnnotation(NotNull.class).build()) + .addStatement("this.namespace = namespace") + .build(), + MethodSpec.methodBuilder("namespace") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(NotNull.class) + .addAnnotation(Override.class) + .returns(namespaceIdCN) + .addStatement("return this.namespace") + .build(), + MethodSpec.methodBuilder("id") + .addModifiers(Modifier.PUBLIC) + .returns(TypeName.INT) + .addAnnotation(Override.class) + .addStatement("return this.ordinal()") + .build() + ) + ); + + // Use data + for (JsonObject entryObject : StreamSupport.stream(entryList.spliterator(), true).map(JsonElement::getAsJsonObject).sorted(Comparator.comparingInt(o -> o.get("id").getAsInt())).toList()) { + String entryName = entryObject.get("name").getAsString(); + entryEnum.addEnumConstant(nameGenerator(entryName), TypeSpec.anonymousClassBuilder( + "$T.from($S)", + namespaceIdCN, entryName + ).build() + ); + } + + // Write files to outputFolder + writeFiles( + List.of( + JavaFile.builder(packageName, entryEnum.build()) + .indent(" ") + .skipJavaLangImports(true) + .build() + ), + outputFolder + ); + } + + protected @NotNull String nameGenerator(@NotNull String namespaceId) { + return toConstant(namespaceId); + } + +} diff --git a/demo/src/main/java/net/minestom/demo/Main.java b/demo/src/main/java/net/minestom/demo/Main.java index 087ca866b..0baf150c1 100644 --- a/demo/src/main/java/net/minestom/demo/Main.java +++ b/demo/src/main/java/net/minestom/demo/Main.java @@ -8,9 +8,9 @@ import net.kyori.adventure.text.format.TextDecoration; import net.minestom.demo.block.TestBlockHandler; import net.minestom.demo.block.placement.DripstonePlacementRule; import net.minestom.demo.commands.*; +import net.minestom.demo.recipe.ShapelessRecipe; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; -import net.minestom.server.entity.Player; import net.minestom.server.event.server.ServerListPingEvent; import net.minestom.server.extras.MojangAuth; import net.minestom.server.extras.lan.OpenToLAN; @@ -19,14 +19,10 @@ import net.minestom.server.instance.block.BlockManager; import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; -import net.minestom.server.network.packet.server.play.DeclareRecipesPacket; import net.minestom.server.ping.ResponseData; -import net.minestom.server.recipe.RecipeCategory; -import net.minestom.server.recipe.ShapedRecipe; -import net.minestom.server.recipe.ShapelessRecipe; +import net.minestom.server.recipe.RecipeBookCategory; import net.minestom.server.utils.identity.NamedAndIdentified; import net.minestom.server.utils.time.TimeUnit; -import org.jetbrains.annotations.NotNull; import java.time.Duration; import java.util.List; @@ -81,6 +77,8 @@ public class Main { commandManager.register(new PotionCommand()); commandManager.register(new CookieCommand()); commandManager.register(new WorldBorderCommand()); + commandManager.register(new TestInstabreakCommand()); + commandManager.register(new AttributeCommand()); commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage(Component.text("Unknown command", NamedTextColor.RED))); @@ -122,37 +120,13 @@ public class Main { //responseData.setPlayersHidden(true); }); - var ironBlockRecipe = new ShapedRecipe( - "minestom:test", 2, 2, "", - RecipeCategory.Crafting.MISC, - List.of( - new DeclareRecipesPacket.Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))), - new DeclareRecipesPacket.Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))), - new DeclareRecipesPacket.Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))), - new DeclareRecipesPacket.Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))) - ), ItemStack.of(Material.IRON_BLOCK), true) { - @Override - public boolean shouldShow(@NotNull Player player) { - return true; - } - }; - MinecraftServer.getRecipeManager().addRecipe(ironBlockRecipe); - var recipe = new ShapelessRecipe( - "minestom:test2", "abc", - RecipeCategory.Crafting.MISC, - List.of( - new DeclareRecipesPacket.Ingredient(List.of(ItemStack.of(Material.DIRT))) - ), + MinecraftServer.getRecipeManager().addRecipe(new ShapelessRecipe( + RecipeBookCategory.CRAFTING_MISC, + List.of(Material.DIRT), ItemStack.builder(Material.GOLD_BLOCK) .set(ItemComponent.CUSTOM_NAME, Component.text("abc")) .build() - ) { - @Override - public boolean shouldShow(@NotNull Player player) { - return true; - } - }; - MinecraftServer.getRecipeManager().addRecipe(recipe); + )); new PlayerInit().init(); diff --git a/demo/src/main/java/net/minestom/demo/PlayerInit.java b/demo/src/main/java/net/minestom/demo/PlayerInit.java index 6d89fcffd..6fd80f58d 100644 --- a/demo/src/main/java/net/minestom/demo/PlayerInit.java +++ b/demo/src/main/java/net/minestom/demo/PlayerInit.java @@ -5,20 +5,17 @@ import net.kyori.adventure.text.Component; import net.minestom.server.FeatureFlag; import net.minestom.server.MinecraftServer; import net.minestom.server.advancements.FrameType; -import net.minestom.server.advancements.notifications.Notification; -import net.minestom.server.advancements.notifications.NotificationCenter; +import net.minestom.server.advancements.Notification; import net.minestom.server.adventure.MinestomAdventure; import net.minestom.server.adventure.audience.Audiences; import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.*; import net.minestom.server.entity.damage.Damage; -import net.minestom.server.entity.metadata.projectile.FireworkRocketMeta; import net.minestom.server.event.Event; import net.minestom.server.event.EventNode; import net.minestom.server.event.entity.EntityAttackEvent; -import net.minestom.server.event.item.ItemDropEvent; -import net.minestom.server.event.item.PickupItemEvent; +import net.minestom.server.event.item.*; import net.minestom.server.event.player.*; import net.minestom.server.event.server.ServerTickMonitorEvent; import net.minestom.server.instance.Instance; @@ -30,25 +27,23 @@ import net.minestom.server.instance.block.predicate.BlockPredicate; import net.minestom.server.instance.block.predicate.BlockTypeFilter; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.inventory.PlayerInventory; +import net.minestom.server.item.ItemAnimation; import net.minestom.server.item.ItemComponent; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.item.component.BlockPredicates; -import net.minestom.server.item.component.EnchantmentList; -import net.minestom.server.item.component.LodestoneTracker; -import net.minestom.server.item.component.PotionContents; -import net.minestom.server.item.enchant.Enchantment; +import net.minestom.server.item.component.Consumable; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.network.packet.server.common.CustomReportDetailsPacket; import net.minestom.server.network.packet.server.common.ServerLinksPacket; -import net.minestom.server.potion.CustomPotionEffect; -import net.minestom.server.potion.PotionEffect; import net.minestom.server.sound.SoundEvent; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.time.TimeUnit; import java.time.Duration; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; @@ -94,20 +89,13 @@ public class PlayerInit { itemEntity.setInstance(player.getInstance(), playerPos.withY(y -> y + 1.5)); Vec velocity = playerPos.direction().mul(6); itemEntity.setVelocity(velocity); - - var firework = new Entity(EntityType.FIREWORK_ROCKET); - firework.setInstance(player.getInstance()); - var meta = (FireworkRocketMeta) firework.getEntityMeta(); - meta.setFireworkInfo(ItemStack.of(Material.FIREWORK_ROCKET)); - meta.setShooter(player); - player.addPassenger(firework); }) .addListener(PlayerDisconnectEvent.class, event -> System.out.println("DISCONNECTION " + event.getPlayer().getUsername())) .addListener(AsyncPlayerConfigurationEvent.class, event -> { final Player player = event.getPlayer(); // Show off adding and removing feature flags - event.addFeatureFlag(FeatureFlag.BUNDLE); + event.addFeatureFlag(FeatureFlag.WINTER_DROP); event.removeFeatureFlag(FeatureFlag.TRADE_REBALANCE); // not enabled by default, just removed for demonstration var instances = MinecraftServer.getInstanceManager().getInstances(); @@ -132,14 +120,13 @@ public class PlayerInit { "hello", "world" ))); - player.setChestplate(ItemStack.of(Material.ELYTRA)); - player.sendPacket(new ServerLinksPacket( new ServerLinksPacket.Entry(ServerLinksPacket.KnownLinkType.NEWS, "https://minestom.net"), new ServerLinksPacket.Entry(ServerLinksPacket.KnownLinkType.BUG_REPORT, "https://minestom.net"), new ServerLinksPacket.Entry(Component.text("Hello world!"), "https://minestom.net") )); + // TODO(1.21.2): Handle bundle slot selection ItemStack bundle = ItemStack.builder(Material.BUNDLE) .set(ItemComponent.BUNDLE_CONTENTS, List.of( ItemStack.of(Material.DIAMOND, 5), @@ -148,38 +135,19 @@ public class PlayerInit { .build(); player.getInventory().addItemStack(bundle); - player.getInventory().addItemStack(ItemStack.builder(Material.COMPASS) - .set(ItemComponent.LODESTONE_TRACKER, new LodestoneTracker(player.getInstance().getDimensionName(), new Vec(10, 10, 10), true)) - .build()); - - player.getInventory().addItemStack(ItemStack.builder(Material.STONE_SWORD) - .set(ItemComponent.ENCHANTMENTS, new EnchantmentList(Map.of( - Enchantment.SHARPNESS, 10 - ))) - .build()); - - player.getInventory().addItemStack(ItemStack.builder(Material.STONE_SWORD) - .build()); - - player.getInventory().addItemStack(ItemStack.builder(Material.BLACK_BANNER) - .build()); - - player.getInventory().addItemStack(ItemStack.builder(Material.POTION) - .set(ItemComponent.POTION_CONTENTS, new PotionContents(null, null, List.of( - new CustomPotionEffect(PotionEffect.JUMP_BOOST, new CustomPotionEffect.Settings((byte) 4, - 45 * 20, false, true, true, null)) - ))) - .customName(Component.text("Sharpness 10 Sword").append(Component.space()).append(Component.text("§c§l[LEGENDARY]"))) - .build()); + player.setGameMode(GameMode.SURVIVAL); + PlayerInventory inventory = event.getPlayer().getInventory(); + inventory.addItemStack(getFoodItem(20)); + inventory.addItemStack(getFoodItem(10000)); + inventory.addItemStack(getFoodItem(Integer.MAX_VALUE)); if (event.isFirstSpawn()) { - Notification notification = new Notification( + event.getPlayer().sendNotification(new Notification( Component.text("Welcome!"), FrameType.TASK, Material.IRON_SWORD - ); - NotificationCenter.send(notification, event.getPlayer()); + )); player.playSound(Sound.sound(SoundEvent.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.PLAYER, 0.5f, 1f)); } @@ -192,7 +160,7 @@ public class PlayerInit { //System.out.println("in " + event.getPacket().getClass().getSimpleName()); }) .addListener(PlayerUseItemOnBlockEvent.class, event -> { - if (event.getHand() != Player.Hand.MAIN) return; + if (event.getHand() != PlayerHand.MAIN) return; var itemStack = event.getItemStack(); var block = event.getInstance().getBlock(event.getPosition()); @@ -206,16 +174,42 @@ public class PlayerInit { event.getInstance().setBlock(event.getPosition(), block); }) - .addListener(PlayerBlockPlaceEvent.class, event -> { -// event.setDoBlockUpdates(false); + .addListener(PlayerBeginItemUseEvent.class, event -> { + final Player player = event.getPlayer(); + final ItemStack itemStack = event.getItemStack(); + final boolean hasProjectile = !itemStack.get(ItemComponent.CHARGED_PROJECTILES, List.of()).isEmpty(); + if (itemStack.material() == Material.CROSSBOW && hasProjectile) { + // "shoot" the arrow + player.setItemInHand(event.getHand(), itemStack.without(ItemComponent.CHARGED_PROJECTILES)); + event.getPlayer().sendMessage("pew pew!"); + event.setItemUseDuration(0); // Do not start using the item + return; + } + }) + .addListener(PlayerFinishItemUseEvent.class, event -> { + if (event.getItemStack().material() == Material.APPLE) { + event.getPlayer().sendMessage("yummy yummy apple"); + } + }) + .addListener(PlayerCancelItemUseEvent.class, event -> { + final Player player = event.getPlayer(); + final ItemStack itemStack = event.getItemStack(); + if (itemStack.material() == Material.CROSSBOW && event.getUseDuration() > 25) { + player.setItemInHand(event.getHand(), itemStack.with(ItemComponent.CHARGED_PROJECTILES, List.of(ItemStack.of(Material.ARROW)))); + return; + } }) .addListener(PlayerBlockInteractEvent.class, event -> { var block = event.getBlock(); var rawOpenProp = block.getProperty("open"); - if (rawOpenProp == null) return; + if (rawOpenProp != null) { + block = block.withProperty("open", String.valueOf(!Boolean.parseBoolean(rawOpenProp))); + event.getInstance().setBlock(event.getBlockPosition(), block); + } - block = block.withProperty("open", String.valueOf(!Boolean.parseBoolean(rawOpenProp))); - event.getInstance().setBlock(event.getBlockPosition(), block); + if (block.id() == Block.CRAFTING_TABLE.id()) { + event.getPlayer().openInventory(new Inventory(InventoryType.CRAFTING, "Crafting")); + } }); { @@ -233,22 +227,6 @@ public class PlayerInit { instanceContainer.setTimeRate(0); instanceContainer.setTime(12000); -// var i2 = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD, null, NamespaceID.from("minestom:demo")); -// instanceManager.registerInstance(i2); -// i2.setGenerator(unit -> unit.modifier().fillHeight(0, 40, Block.GRASS_BLOCK)); -// i2.setChunkSupplier(LightingChunk::new); - - // System.out.println("start"); - // var chunks = new ArrayList>(); - // ChunkUtils.forChunksInRange(0, 0, 32, (x, z) -> chunks.add(instanceContainer.loadChunk(x, z))); - - // CompletableFuture.runAsync(() -> { - // CompletableFuture.allOf(chunks.toArray(CompletableFuture[]::new)).join(); - // System.out.println("load end"); - // LightingChunk.relight(instanceContainer, instanceContainer.getChunks()); - // System.out.println("light end"); - // }); - inventory = new Inventory(InventoryType.CHEST_1_ROW, Component.text("Test inventory")); inventory.setItemStack(3, ItemStack.of(Material.DIAMOND, 34)); } @@ -282,4 +260,16 @@ public class PlayerInit { Audiences.players().sendPlayerListHeaderAndFooter(header, footer); }).repeat(10, TimeUnit.SERVER_TICK).schedule(); } + + public static ItemStack getFoodItem(int consumeTicks) { + return ItemStack.builder(Material.IRON_NUGGET) + .amount(64) + .set(ItemComponent.CONSUMABLE, new Consumable( + (float) consumeTicks / 20, + ItemAnimation.EAT, + SoundEvent.BLOCK_CHAIN_STEP, + true, + new ArrayList<>())) + .build(); + } } diff --git a/demo/src/main/java/net/minestom/demo/commands/AttributeCommand.java b/demo/src/main/java/net/minestom/demo/commands/AttributeCommand.java new file mode 100644 index 000000000..18774f2c4 --- /dev/null +++ b/demo/src/main/java/net/minestom/demo/commands/AttributeCommand.java @@ -0,0 +1,115 @@ +package net.minestom.demo.commands; + +import net.kyori.adventure.text.Component; +import net.minestom.server.command.CommandSender; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.CommandContext; +import net.minestom.server.command.builder.arguments.ArgumentLiteral; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.command.builder.arguments.minecraft.ArgumentEntity; +import net.minestom.server.command.builder.arguments.minecraft.ArgumentResource; +import net.minestom.server.command.builder.arguments.number.ArgumentDouble; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.LivingEntity; +import net.minestom.server.entity.attribute.Attribute; +import net.minestom.server.utils.entity.EntityFinder; +import net.minestom.server.utils.identity.NamedAndIdentified; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; + +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.Component.translatable; + +public class AttributeCommand extends Command { + public AttributeCommand() { + super("attribute"); + + ArgumentEntity target = ArgumentType.Entity("target").singleEntity(true); + ArgumentResource attribute = ArgumentType.Resource("attribute", "minecraft:attribute"); + ArgumentLiteral base = ArgumentType.Literal("base"); + ArgumentLiteral get = ArgumentType.Literal("get"); + ArgumentLiteral set = ArgumentType.Literal("set"); + ArgumentDouble value = ArgumentType.Double("value"); + + addSyntax(this::get, target, attribute, get); + addSyntax(this::setBase, target, attribute, base, set, value); + addSyntax(this::getBase, target, attribute, base, get); + } + + private void setBase(CommandSender sender, CommandContext ctx) { + LivingEntity target = target(sender, ctx); + if (check(target, ctx, sender)) return; + Attribute attribute = attribute(ctx); + if (check(attribute, ctx, sender)) return; + double value = value(ctx); + target.getAttribute(attribute).setBaseValue(value); + sender.sendMessage(translatable("commands.attribute.base_value.set.success").arguments(description(attribute), name(target), text(value))); + } + + private void getBase(CommandSender sender, CommandContext ctx) { + LivingEntity target = target(sender, ctx); + if (check(target, ctx, sender)) return; + Attribute attribute = attribute(ctx); + if (check(attribute, ctx, sender)) return; + double value = target.getAttribute(attribute).getBaseValue(); + sender.sendMessage(translatable("commands.attribute.base_value.get.success").arguments(description(attribute), name(target), text(value))); + } + + private void get(CommandSender sender, CommandContext ctx) { + LivingEntity target = target(sender, ctx); + if (check(target, ctx, sender)) return; + Attribute attribute = attribute(ctx); + if (check(attribute, ctx, sender)) return; + double value = target.getAttributeValue(attribute); + sender.sendMessage(translatable("commands.attribute.value.get.success").arguments(description(attribute), name(target), text(value))); + } + + private Component description(Attribute attribute) { + return translatable(attribute.registry().translationKey()); + } + + private double value(CommandContext ctx) { + return ctx.get("value"); + } + + private LivingEntity target(CommandSender sender, CommandContext ctx) { + EntityFinder finder = ctx.get("target"); + Entity entity = finder.findFirstEntity(sender); + if (!(entity instanceof LivingEntity livingEntity)) { + return null; + } + return livingEntity; + } + + @Nullable + private Attribute attribute(CommandContext ctx) { + String namespaceId = ctx.get("attribute"); + return Attribute.fromNamespaceId(namespaceId); + } + + private Component name(Entity entity) { + if (entity instanceof NamedAndIdentified named) { + return named.getName(); + } + return entity.getCustomName() == null ? entity.getCustomName() : text(entity.getEntityType().name()); + } + + @Contract("!null, _, _ -> false; null, _, _ -> true") + private boolean check(@Nullable LivingEntity livingEntity, CommandContext ctx, CommandSender sender) { + if (livingEntity == null) { + Entity entity = ctx.get("target"); + sender.sendMessage(translatable("commands.attribute.failed.entity").arguments(name(entity))); + return true; + } + return false; + } + + @Contract("!null, _, _ -> false; null, _, _ -> true") + private boolean check(@Nullable Attribute attribute, CommandContext ctx, CommandSender sender) { + if (attribute == null) { + sender.sendMessage(translatable("argument.resource.invalid_type").arguments(text(ctx.get("attribute")), text("minecraft:attribute"), text("minecraft:attribute"))); + return true; + } + return false; + } +} diff --git a/demo/src/main/java/net/minestom/demo/commands/FindCommand.java b/demo/src/main/java/net/minestom/demo/commands/FindCommand.java index 7e4ade0c6..09ee57ee5 100644 --- a/demo/src/main/java/net/minestom/demo/commands/FindCommand.java +++ b/demo/src/main/java/net/minestom/demo/commands/FindCommand.java @@ -33,7 +33,6 @@ public class FindCommand extends Command { for (Entity entity : entities) { player.sendMessage(" " + entity.getEntityType() + ": "); player.sendMessage(" Meta: " + entity.getEntityMeta()); - player.sendMessage(" Permissions: " + entity.getAllPermissions()); player.sendMessage(" Position: " + entity.getPosition()); } diff --git a/demo/src/main/java/net/minestom/demo/commands/GamemodeCommand.java b/demo/src/main/java/net/minestom/demo/commands/GamemodeCommand.java index d6b6f300f..7402337c0 100644 --- a/demo/src/main/java/net/minestom/demo/commands/GamemodeCommand.java +++ b/demo/src/main/java/net/minestom/demo/commands/GamemodeCommand.java @@ -53,7 +53,6 @@ public class GamemodeCommand extends Command { return; } - //Check permission, this could be replaced with hasPermission if (p.getPermissionLevel() < 2) { sender.sendMessage(Component.text("You don't have permission to use this command.", NamedTextColor.RED)); return; diff --git a/demo/src/main/java/net/minestom/demo/commands/NotificationCommand.java b/demo/src/main/java/net/minestom/demo/commands/NotificationCommand.java index d5fc7453e..b5cc3f292 100644 --- a/demo/src/main/java/net/minestom/demo/commands/NotificationCommand.java +++ b/demo/src/main/java/net/minestom/demo/commands/NotificationCommand.java @@ -2,12 +2,10 @@ package net.minestom.demo.commands; import net.kyori.adventure.text.Component; import net.minestom.server.advancements.FrameType; -import net.minestom.server.advancements.notifications.Notification; -import net.minestom.server.advancements.notifications.NotificationCenter; +import net.minestom.server.advancements.Notification; import net.minestom.server.command.builder.Command; import net.minestom.server.entity.Player; import net.minestom.server.item.Material; -import org.jetbrains.annotations.NotNull; public class NotificationCommand extends Command { public NotificationCommand() { @@ -15,9 +13,10 @@ public class NotificationCommand extends Command { setDefaultExecutor((sender, context) -> { var player = (Player) sender; - - var notification = new Notification(Component.text("Hello World!"), FrameType.GOAL, Material.DIAMOND_AXE); - NotificationCenter.send(notification, player); + player.sendNotification(new Notification( + Component.text("Hello World!"), + FrameType.GOAL, + Material.DIAMOND_AXE)); }); } } diff --git a/demo/src/main/java/net/minestom/demo/commands/TestInstabreakCommand.java b/demo/src/main/java/net/minestom/demo/commands/TestInstabreakCommand.java new file mode 100644 index 000000000..d217518a7 --- /dev/null +++ b/demo/src/main/java/net/minestom/demo/commands/TestInstabreakCommand.java @@ -0,0 +1,142 @@ +package net.minestom.demo.commands; + +import net.kyori.adventure.text.Component; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.command.builder.arguments.number.ArgumentInteger; +import net.minestom.server.entity.GameMode; +import net.minestom.server.entity.Player; +import net.minestom.server.instance.batch.RelativeBlockBatch; +import net.minestom.server.instance.block.Block; +import net.minestom.server.inventory.Inventory; +import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemComponent; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.item.component.EnchantmentList; +import net.minestom.server.item.enchant.Enchantment; +import net.minestom.server.potion.Potion; +import net.minestom.server.potion.PotionEffect; + +import java.util.ArrayList; +import java.util.List; + +public class TestInstabreakCommand extends Command { + + public TestInstabreakCommand() { + super("testinstabreak"); + + ArgumentInteger level = ArgumentType.Integer("level"); + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + + int l = context.get(level); + player.removeEffect(PotionEffect.HASTE); + if (l != 0) { + player.addEffect(new Potion(PotionEffect.HASTE, (byte) (l - 1), -1)); + } + }, ArgumentType.Literal("haste"), level); + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + + int l = context.get(level); + player.removeEffect(PotionEffect.CONDUIT_POWER); + if (l != 0) { + player.addEffect(new Potion(PotionEffect.CONDUIT_POWER, (byte) (l - 1), -1)); + } + }, ArgumentType.Literal("conduit"), level); + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + + int l = context.get(level); + player.removeEffect(PotionEffect.MINING_FATIGUE); + if (l != 0) { + player.addEffect(new Potion(PotionEffect.MINING_FATIGUE, (byte) (l - 1), -1)); + } + }, ArgumentType.Literal("fatigue"), level); + + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + giveItems(player); + }, ArgumentType.Literal("giveItems")); + + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + player.openInventory(new Inventory(InventoryType.ANVIL, Component.translatable("container.repair"))); + }, ArgumentType.Literal("anvil")); + + RelativeBlockBatch areaBatch = new RelativeBlockBatch(); + for (int x = -20; x < 21; x++) { + for (int z = -20; z < 21; z++) { + for (int y = -10; y < 0; y++) { + areaBatch.setBlock(x, y, z, Block.WHITE_WOOL); + } + } + } + areaBatch.setBlock(2, 0, 0, Block.WATER); + areaBatch.setBlock(3, 0, 0, Block.WATER); + areaBatch.setBlock(2, 0, 1, Block.WATER); + areaBatch.setBlock(3, 0, 1, Block.WATER); + areaBatch.setBlock(5, 1, 0, Block.WATER); + areaBatch.setBlock(6, 1, 0, Block.WATER); + areaBatch.setBlock(5, 1, 1, Block.WATER); + areaBatch.setBlock(6, 1, 1, Block.WATER); + areaBatch.setBlock(8, 1, 1, Block.WATER.withProperty("level", "0")); + areaBatch.setBlock(10, 1, 1, Block.WATER.withProperty("level", "1")); + areaBatch.setBlock(8, 1, 3, Block.WATER.withProperty("level", "2")); + areaBatch.setBlock(10, 1, 3, Block.WATER.withProperty("level", "3")); + areaBatch.setBlock(8, 1, 5, Block.WATER.withProperty("level", "4")); + areaBatch.setBlock(10, 1, 5, Block.WATER.withProperty("level", "5")); + areaBatch.setBlock(8, 1, 7, Block.WATER.withProperty("level", "6")); + areaBatch.setBlock(10, 1, 7, Block.WATER.withProperty("level", "7")); + areaBatch.setBlock(8, 1, 9, Block.WATER.withProperty("level", "8")); + areaBatch.setBlock(10, 1, 9, Block.WATER.withProperty("level", "13")); + for (int x = -3; x < 0; x++) { + for (int z = -3; z < 0; z++) { + for (int y = 0; y < 4; y++) { + areaBatch.setBlock(x, y, z, Block.WATER); + } + } + } + for (int x = -9; x < -6; x++) { + for (int z = -9; z < -6; z++) { + for (int y = 0; y < 3; y++) { + areaBatch.setBlock(x, y, z, Block.BAMBOO); + } + areaBatch.setBlock(x, 3, z, Block.BAMBOO_SAPLING); + } + } + + + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + areaBatch.apply(player.getInstance(), player.getPosition(), null); + }, ArgumentType.Literal("placeArea")); + + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + boolean state = context.get("state"); + player.setInstantBreak(state); + }, ArgumentType.Literal("instabreak"), ArgumentType.Boolean("state")); + + addConditionalSyntax((sender, commandString) -> sender instanceof Player, (sender, context) -> { + Player player = (Player) sender; + player.setGameMode(GameMode.SURVIVAL); + player.getInventory().clear(); + giveItems(player); + areaBatch.apply(player.getInstance(), player.getPosition(), null); + }); + } + + private void giveItems(Player player) { + List items = new ArrayList<>(); + items.add(ItemStack.builder(Material.SHEARS).set(ItemComponent.ENCHANTMENTS, EnchantmentList.EMPTY.with(Enchantment.EFFICIENCY, 5)).build()); + items.add(ItemStack.builder(Material.WHITE_WOOL).amount(64).build()); + items.add(ItemStack.builder(Material.STONE).amount(64).build()); + items.add(ItemStack.of(Material.DIAMOND_SWORD)); + items.add(ItemStack.of(Material.DIAMOND_PICKAXE)); + for (ItemStack item : items) { + player.getInventory().addItemStack(item); + } + } +} diff --git a/demo/src/main/java/net/minestom/demo/entity/ChickenCreature.java b/demo/src/main/java/net/minestom/demo/entity/ChickenCreature.java index 14ea776f0..1dd300a23 100644 --- a/demo/src/main/java/net/minestom/demo/entity/ChickenCreature.java +++ b/demo/src/main/java/net/minestom/demo/entity/ChickenCreature.java @@ -35,7 +35,7 @@ public class ChickenCreature extends EntityCreature { // .build() // ); - getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0.1); + getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.1); } @Override diff --git a/demo/src/main/java/net/minestom/demo/recipe/ShapelessRecipe.java b/demo/src/main/java/net/minestom/demo/recipe/ShapelessRecipe.java new file mode 100644 index 000000000..8c6765d0c --- /dev/null +++ b/demo/src/main/java/net/minestom/demo/recipe/ShapelessRecipe.java @@ -0,0 +1,34 @@ +package net.minestom.demo.recipe; + +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.recipe.Ingredient; +import net.minestom.server.recipe.Recipe; +import net.minestom.server.recipe.RecipeBookCategory; +import net.minestom.server.recipe.display.RecipeDisplay; +import net.minestom.server.recipe.display.SlotDisplay; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public record ShapelessRecipe( + @NotNull RecipeBookCategory recipeBookCategory, + @NotNull List ingredients, + @NotNull ItemStack result +) implements Recipe { + + @Override + public @NotNull List createRecipeDisplays() { + return List.of(new RecipeDisplay.CraftingShapeless( + ingredients.stream().map(item -> (SlotDisplay) new SlotDisplay.Item(item)).toList(), + new SlotDisplay.ItemStack(result), + new SlotDisplay.Item(Material.CRAFTING_TABLE) + )); + } + + @Override + public @NotNull List craftingRequirements() { + return List.of(new Ingredient(ingredients)); + } + +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d75cacb1e..bd5728478 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,13 +3,12 @@ metadata.format.version = "1.1" [versions] # Important dependencies -data = "1.21-rv3" +data = "1.21.3-rv2" adventure = "4.17.0" jetbrainsAnnotations = "24.1.0" slf4j = "2.0.7" # Performance / Data Structures -caffeine = "3.1.8" fastutil = "8.5.14" flare = "2.0.1" gson = "2.11.0" @@ -49,7 +48,6 @@ jetbrainsAnnotations = { group = "org.jetbrains", name = "annotations", version. slf4j = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j"} # Performance / Data Structures -caffeine = { group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine" } fastutil = { group = "it.unimi.dsi", name = "fastutil", version.ref = "fastutil" } flare = { group = "space.vectrix.flare", name = "flare", version.ref = "flare" } flare-fastutil = { group = "space.vectrix.flare", name = "flare-fastutil", version.ref = "flare" } diff --git a/jcstress-tests/src/jcstress/java/net/minestom/server/utils/ObjectPoolTest.java b/jcstress-tests/src/jcstress/java/net/minestom/server/utils/ObjectPoolTest.java index 92e0fdeec..98a4523d0 100644 --- a/jcstress-tests/src/jcstress/java/net/minestom/server/utils/ObjectPoolTest.java +++ b/jcstress-tests/src/jcstress/java/net/minestom/server/utils/ObjectPoolTest.java @@ -1,6 +1,7 @@ package net.minestom.server.utils; -import net.minestom.server.utils.binary.BinaryBuffer; +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.network.packet.PacketVanilla; import org.openjdk.jcstress.annotations.*; import org.openjdk.jcstress.infra.results.L_Result; @@ -11,7 +12,7 @@ import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE; @Outcome(id = "2", expect = ACCEPTABLE) @State public class ObjectPoolTest { - private final ObjectPool pool = ObjectPool.BUFFER_POOL; + private final ObjectPool pool = PacketVanilla.PACKET_POOL; @Actor public void actor1() { diff --git a/src/autogenerated/java/net/minestom/server/FeatureFlags.java b/src/autogenerated/java/net/minestom/server/FeatureFlags.java index 8122bd62b..94d03c217 100644 --- a/src/autogenerated/java/net/minestom/server/FeatureFlags.java +++ b/src/autogenerated/java/net/minestom/server/FeatureFlags.java @@ -5,9 +5,13 @@ package net.minestom.server; */ @SuppressWarnings("unused") interface FeatureFlags { - FeatureFlag BUNDLE = FeatureFlagImpl.get("minecraft:bundle"); + FeatureFlag REDSTONE_EXPERIMENTS = FeatureFlagImpl.get("minecraft:redstone_experiments"); FeatureFlag VANILLA = FeatureFlagImpl.get("minecraft:vanilla"); + FeatureFlag WINTER_DROP = FeatureFlagImpl.get("minecraft:winter_drop"); + FeatureFlag TRADE_REBALANCE = FeatureFlagImpl.get("minecraft:trade_rebalance"); + + FeatureFlag MINECART_IMPROVEMENTS = FeatureFlagImpl.get("minecraft:minecart_improvements"); } diff --git a/src/autogenerated/java/net/minestom/server/MinecraftConstants.java b/src/autogenerated/java/net/minestom/server/MinecraftConstants.java index 47ac87d07..3c9b0b8d0 100644 --- a/src/autogenerated/java/net/minestom/server/MinecraftConstants.java +++ b/src/autogenerated/java/net/minestom/server/MinecraftConstants.java @@ -4,13 +4,13 @@ package net.minestom.server; * AUTOGENERATED by ConstantsGenerator */ interface MinecraftConstants { - String VERSION_NAME = "1.21"; + String VERSION_NAME = "1.21.3"; - int PROTOCOL_VERSION = 767; + int PROTOCOL_VERSION = 768; - int DATA_VERSION = 3953; + int DATA_VERSION = 4082; - int RESOURCE_PACK_VERSION = 34; + int RESOURCE_PACK_VERSION = 42; - int DATA_PACK_VERSION = 48; + int DATA_PACK_VERSION = 57; } diff --git a/src/autogenerated/java/net/minestom/server/command/ArgumentParserType.java b/src/autogenerated/java/net/minestom/server/command/ArgumentParserType.java new file mode 100644 index 000000000..cd27b3e8b --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/command/ArgumentParserType.java @@ -0,0 +1,141 @@ +package net.minestom.server.command; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +public enum ArgumentParserType implements StaticProtocolObject { + BOOL(NamespaceID.from("brigadier:bool")), + + FLOAT(NamespaceID.from("brigadier:float")), + + DOUBLE(NamespaceID.from("brigadier:double")), + + INTEGER(NamespaceID.from("brigadier:integer")), + + LONG(NamespaceID.from("brigadier:long")), + + STRING(NamespaceID.from("brigadier:string")), + + ENTITY(NamespaceID.from("minecraft:entity")), + + GAME_PROFILE(NamespaceID.from("minecraft:game_profile")), + + BLOCK_POS(NamespaceID.from("minecraft:block_pos")), + + COLUMN_POS(NamespaceID.from("minecraft:column_pos")), + + VEC3(NamespaceID.from("minecraft:vec3")), + + VEC2(NamespaceID.from("minecraft:vec2")), + + BLOCK_STATE(NamespaceID.from("minecraft:block_state")), + + BLOCK_PREDICATE(NamespaceID.from("minecraft:block_predicate")), + + ITEM_STACK(NamespaceID.from("minecraft:item_stack")), + + ITEM_PREDICATE(NamespaceID.from("minecraft:item_predicate")), + + COLOR(NamespaceID.from("minecraft:color")), + + COMPONENT(NamespaceID.from("minecraft:component")), + + STYLE(NamespaceID.from("minecraft:style")), + + MESSAGE(NamespaceID.from("minecraft:message")), + + NBT_COMPOUND_TAG(NamespaceID.from("minecraft:nbt_compound_tag")), + + NBT_TAG(NamespaceID.from("minecraft:nbt_tag")), + + NBT_PATH(NamespaceID.from("minecraft:nbt_path")), + + OBJECTIVE(NamespaceID.from("minecraft:objective")), + + OBJECTIVE_CRITERIA(NamespaceID.from("minecraft:objective_criteria")), + + OPERATION(NamespaceID.from("minecraft:operation")), + + PARTICLE(NamespaceID.from("minecraft:particle")), + + ANGLE(NamespaceID.from("minecraft:angle")), + + ROTATION(NamespaceID.from("minecraft:rotation")), + + SCOREBOARD_SLOT(NamespaceID.from("minecraft:scoreboard_slot")), + + SCORE_HOLDER(NamespaceID.from("minecraft:score_holder")), + + SWIZZLE(NamespaceID.from("minecraft:swizzle")), + + TEAM(NamespaceID.from("minecraft:team")), + + ITEM_SLOT(NamespaceID.from("minecraft:item_slot")), + + ITEM_SLOTS(NamespaceID.from("minecraft:item_slots")), + + RESOURCE_LOCATION(NamespaceID.from("minecraft:resource_location")), + + FUNCTION(NamespaceID.from("minecraft:function")), + + ENTITY_ANCHOR(NamespaceID.from("minecraft:entity_anchor")), + + INT_RANGE(NamespaceID.from("minecraft:int_range")), + + FLOAT_RANGE(NamespaceID.from("minecraft:float_range")), + + DIMENSION(NamespaceID.from("minecraft:dimension")), + + GAMEMODE(NamespaceID.from("minecraft:gamemode")), + + TIME(NamespaceID.from("minecraft:time")), + + RESOURCE_OR_TAG(NamespaceID.from("minecraft:resource_or_tag")), + + RESOURCE_OR_TAG_KEY(NamespaceID.from("minecraft:resource_or_tag_key")), + + RESOURCE(NamespaceID.from("minecraft:resource")), + + RESOURCE_KEY(NamespaceID.from("minecraft:resource_key")), + + TEMPLATE_MIRROR(NamespaceID.from("minecraft:template_mirror")), + + TEMPLATE_ROTATION(NamespaceID.from("minecraft:template_rotation")), + + HEIGHTMAP(NamespaceID.from("minecraft:heightmap")), + + LOOT_TABLE(NamespaceID.from("minecraft:loot_table")), + + LOOT_PREDICATE(NamespaceID.from("minecraft:loot_predicate")), + + LOOT_MODIFIER(NamespaceID.from("minecraft:loot_modifier")), + + UUID(NamespaceID.from("minecraft:uuid")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(ArgumentParserType.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(ArgumentParserType.class); + + private final NamespaceID namespace; + + ArgumentParserType(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/entity/EntityTypes.java b/src/autogenerated/java/net/minestom/server/entity/EntityTypes.java index 0574ffcf2..f4b6f1ea9 100644 --- a/src/autogenerated/java/net/minestom/server/entity/EntityTypes.java +++ b/src/autogenerated/java/net/minestom/server/entity/EntityTypes.java @@ -5,6 +5,10 @@ package net.minestom.server.entity; */ @SuppressWarnings("unused") interface EntityTypes { + EntityType ACACIA_BOAT = EntityTypeImpl.get("minecraft:acacia_boat"); + + EntityType ACACIA_CHEST_BOAT = EntityTypeImpl.get("minecraft:acacia_chest_boat"); + EntityType ALLAY = EntityTypeImpl.get("minecraft:allay"); EntityType AREA_EFFECT_CLOUD = EntityTypeImpl.get("minecraft:area_effect_cloud"); @@ -17,16 +21,22 @@ interface EntityTypes { EntityType AXOLOTL = EntityTypeImpl.get("minecraft:axolotl"); + EntityType BAMBOO_CHEST_RAFT = EntityTypeImpl.get("minecraft:bamboo_chest_raft"); + + EntityType BAMBOO_RAFT = EntityTypeImpl.get("minecraft:bamboo_raft"); + EntityType BAT = EntityTypeImpl.get("minecraft:bat"); EntityType BEE = EntityTypeImpl.get("minecraft:bee"); + EntityType BIRCH_BOAT = EntityTypeImpl.get("minecraft:birch_boat"); + + EntityType BIRCH_CHEST_BOAT = EntityTypeImpl.get("minecraft:birch_chest_boat"); + EntityType BLAZE = EntityTypeImpl.get("minecraft:blaze"); EntityType BLOCK_DISPLAY = EntityTypeImpl.get("minecraft:block_display"); - EntityType BOAT = EntityTypeImpl.get("minecraft:boat"); - EntityType BOGGED = EntityTypeImpl.get("minecraft:bogged"); EntityType BREEZE = EntityTypeImpl.get("minecraft:breeze"); @@ -39,7 +49,9 @@ interface EntityTypes { EntityType CAVE_SPIDER = EntityTypeImpl.get("minecraft:cave_spider"); - EntityType CHEST_BOAT = EntityTypeImpl.get("minecraft:chest_boat"); + EntityType CHERRY_BOAT = EntityTypeImpl.get("minecraft:cherry_boat"); + + EntityType CHERRY_CHEST_BOAT = EntityTypeImpl.get("minecraft:cherry_chest_boat"); EntityType CHEST_MINECART = EntityTypeImpl.get("minecraft:chest_minecart"); @@ -51,8 +63,16 @@ interface EntityTypes { EntityType COW = EntityTypeImpl.get("minecraft:cow"); + EntityType CREAKING = EntityTypeImpl.get("minecraft:creaking"); + + EntityType CREAKING_TRANSIENT = EntityTypeImpl.get("minecraft:creaking_transient"); + EntityType CREEPER = EntityTypeImpl.get("minecraft:creeper"); + EntityType DARK_OAK_BOAT = EntityTypeImpl.get("minecraft:dark_oak_boat"); + + EntityType DARK_OAK_CHEST_BOAT = EntityTypeImpl.get("minecraft:dark_oak_chest_boat"); + EntityType DOLPHIN = EntityTypeImpl.get("minecraft:dolphin"); EntityType DONKEY = EntityTypeImpl.get("minecraft:donkey"); @@ -65,15 +85,15 @@ interface EntityTypes { EntityType ELDER_GUARDIAN = EntityTypeImpl.get("minecraft:elder_guardian"); - EntityType END_CRYSTAL = EntityTypeImpl.get("minecraft:end_crystal"); + EntityType ENDERMAN = EntityTypeImpl.get("minecraft:enderman"); + + EntityType ENDERMITE = EntityTypeImpl.get("minecraft:endermite"); EntityType ENDER_DRAGON = EntityTypeImpl.get("minecraft:ender_dragon"); EntityType ENDER_PEARL = EntityTypeImpl.get("minecraft:ender_pearl"); - EntityType ENDERMAN = EntityTypeImpl.get("minecraft:enderman"); - - EntityType ENDERMITE = EntityTypeImpl.get("minecraft:endermite"); + EntityType END_CRYSTAL = EntityTypeImpl.get("minecraft:end_crystal"); EntityType EVOKER = EntityTypeImpl.get("minecraft:evoker"); @@ -87,6 +107,8 @@ interface EntityTypes { EntityType FALLING_BLOCK = EntityTypeImpl.get("minecraft:falling_block"); + EntityType FIREBALL = EntityTypeImpl.get("minecraft:fireball"); + EntityType FIREWORK_ROCKET = EntityTypeImpl.get("minecraft:firework_rocket"); EntityType FOX = EntityTypeImpl.get("minecraft:fox"); @@ -127,9 +149,9 @@ interface EntityTypes { EntityType ITEM_FRAME = EntityTypeImpl.get("minecraft:item_frame"); - EntityType OMINOUS_ITEM_SPAWNER = EntityTypeImpl.get("minecraft:ominous_item_spawner"); + EntityType JUNGLE_BOAT = EntityTypeImpl.get("minecraft:jungle_boat"); - EntityType FIREBALL = EntityTypeImpl.get("minecraft:fireball"); + EntityType JUNGLE_CHEST_BOAT = EntityTypeImpl.get("minecraft:jungle_chest_boat"); EntityType LEASH_KNOT = EntityTypeImpl.get("minecraft:leash_knot"); @@ -141,6 +163,10 @@ interface EntityTypes { EntityType MAGMA_CUBE = EntityTypeImpl.get("minecraft:magma_cube"); + EntityType MANGROVE_BOAT = EntityTypeImpl.get("minecraft:mangrove_boat"); + + EntityType MANGROVE_CHEST_BOAT = EntityTypeImpl.get("minecraft:mangrove_chest_boat"); + EntityType MARKER = EntityTypeImpl.get("minecraft:marker"); EntityType MINECART = EntityTypeImpl.get("minecraft:minecart"); @@ -149,10 +175,20 @@ interface EntityTypes { EntityType MULE = EntityTypeImpl.get("minecraft:mule"); + EntityType OAK_BOAT = EntityTypeImpl.get("minecraft:oak_boat"); + + EntityType OAK_CHEST_BOAT = EntityTypeImpl.get("minecraft:oak_chest_boat"); + EntityType OCELOT = EntityTypeImpl.get("minecraft:ocelot"); + EntityType OMINOUS_ITEM_SPAWNER = EntityTypeImpl.get("minecraft:ominous_item_spawner"); + EntityType PAINTING = EntityTypeImpl.get("minecraft:painting"); + EntityType PALE_OAK_BOAT = EntityTypeImpl.get("minecraft:pale_oak_boat"); + + EntityType PALE_OAK_CHEST_BOAT = EntityTypeImpl.get("minecraft:pale_oak_chest_boat"); + EntityType PANDA = EntityTypeImpl.get("minecraft:panda"); EntityType PARROT = EntityTypeImpl.get("minecraft:parrot"); @@ -197,16 +233,20 @@ interface EntityTypes { EntityType SNIFFER = EntityTypeImpl.get("minecraft:sniffer"); - EntityType SNOW_GOLEM = EntityTypeImpl.get("minecraft:snow_golem"); - EntityType SNOWBALL = EntityTypeImpl.get("minecraft:snowball"); + EntityType SNOW_GOLEM = EntityTypeImpl.get("minecraft:snow_golem"); + EntityType SPAWNER_MINECART = EntityTypeImpl.get("minecraft:spawner_minecart"); EntityType SPECTRAL_ARROW = EntityTypeImpl.get("minecraft:spectral_arrow"); EntityType SPIDER = EntityTypeImpl.get("minecraft:spider"); + EntityType SPRUCE_BOAT = EntityTypeImpl.get("minecraft:spruce_boat"); + + EntityType SPRUCE_CHEST_BOAT = EntityTypeImpl.get("minecraft:spruce_chest_boat"); + EntityType SQUID = EntityTypeImpl.get("minecraft:squid"); EntityType STRAY = EntityTypeImpl.get("minecraft:stray"); diff --git a/src/autogenerated/java/net/minestom/server/entity/VillagerProfessions.java b/src/autogenerated/java/net/minestom/server/entity/VillagerProfessions.java new file mode 100644 index 000000000..6e5bea66d --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/entity/VillagerProfessions.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity; + +/** + * Code autogenerated, do not edit! + */ +@SuppressWarnings("unused") +interface VillagerProfessions { + VillagerProfession NONE = VillagerProfessionImpl.get("minecraft:none"); + + VillagerProfession ARMORER = VillagerProfessionImpl.get("minecraft:armorer"); + + VillagerProfession BUTCHER = VillagerProfessionImpl.get("minecraft:butcher"); + + VillagerProfession CARTOGRAPHER = VillagerProfessionImpl.get("minecraft:cartographer"); + + VillagerProfession CLERIC = VillagerProfessionImpl.get("minecraft:cleric"); + + VillagerProfession FARMER = VillagerProfessionImpl.get("minecraft:farmer"); + + VillagerProfession FISHERMAN = VillagerProfessionImpl.get("minecraft:fisherman"); + + VillagerProfession FLETCHER = VillagerProfessionImpl.get("minecraft:fletcher"); + + VillagerProfession LEATHERWORKER = VillagerProfessionImpl.get("minecraft:leatherworker"); + + VillagerProfession LIBRARIAN = VillagerProfessionImpl.get("minecraft:librarian"); + + VillagerProfession MASON = VillagerProfessionImpl.get("minecraft:mason"); + + VillagerProfession NITWIT = VillagerProfessionImpl.get("minecraft:nitwit"); + + VillagerProfession SHEPHERD = VillagerProfessionImpl.get("minecraft:shepherd"); + + VillagerProfession TOOLSMITH = VillagerProfessionImpl.get("minecraft:toolsmith"); + + VillagerProfession WEAPONSMITH = VillagerProfessionImpl.get("minecraft:weaponsmith"); +} diff --git a/src/autogenerated/java/net/minestom/server/entity/VillagerType.java b/src/autogenerated/java/net/minestom/server/entity/VillagerType.java new file mode 100644 index 000000000..da4a14fa7 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/entity/VillagerType.java @@ -0,0 +1,47 @@ +package net.minestom.server.entity; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +public enum VillagerType implements StaticProtocolObject { + DESERT(NamespaceID.from("minecraft:desert")), + + JUNGLE(NamespaceID.from("minecraft:jungle")), + + PLAINS(NamespaceID.from("minecraft:plains")), + + SAVANNA(NamespaceID.from("minecraft:savanna")), + + SNOW(NamespaceID.from("minecraft:snow")), + + SWAMP(NamespaceID.from("minecraft:swamp")), + + TAIGA(NamespaceID.from("minecraft:taiga")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(VillagerType.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(VillagerType.class); + + private final NamespaceID namespace; + + VillagerType(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/entity/attribute/Attributes.java b/src/autogenerated/java/net/minestom/server/entity/attribute/Attributes.java index e660d3b29..6e714d0e9 100644 --- a/src/autogenerated/java/net/minestom/server/entity/attribute/Attributes.java +++ b/src/autogenerated/java/net/minestom/server/entity/attribute/Attributes.java @@ -5,65 +5,67 @@ package net.minestom.server.entity.attribute; */ @SuppressWarnings("unused") interface Attributes { - Attribute GENERIC_ARMOR = AttributeImpl.get("minecraft:generic.armor"); + Attribute ARMOR = AttributeImpl.get("minecraft:armor"); - Attribute GENERIC_ARMOR_TOUGHNESS = AttributeImpl.get("minecraft:generic.armor_toughness"); + Attribute ARMOR_TOUGHNESS = AttributeImpl.get("minecraft:armor_toughness"); - Attribute GENERIC_ATTACK_DAMAGE = AttributeImpl.get("minecraft:generic.attack_damage"); + Attribute ATTACK_DAMAGE = AttributeImpl.get("minecraft:attack_damage"); - Attribute GENERIC_ATTACK_KNOCKBACK = AttributeImpl.get("minecraft:generic.attack_knockback"); + Attribute ATTACK_KNOCKBACK = AttributeImpl.get("minecraft:attack_knockback"); - Attribute GENERIC_ATTACK_SPEED = AttributeImpl.get("minecraft:generic.attack_speed"); + Attribute ATTACK_SPEED = AttributeImpl.get("minecraft:attack_speed"); - Attribute PLAYER_BLOCK_BREAK_SPEED = AttributeImpl.get("minecraft:player.block_break_speed"); + Attribute BLOCK_BREAK_SPEED = AttributeImpl.get("minecraft:block_break_speed"); - Attribute PLAYER_BLOCK_INTERACTION_RANGE = AttributeImpl.get("minecraft:player.block_interaction_range"); + Attribute BLOCK_INTERACTION_RANGE = AttributeImpl.get("minecraft:block_interaction_range"); - Attribute GENERIC_BURNING_TIME = AttributeImpl.get("minecraft:generic.burning_time"); + Attribute BURNING_TIME = AttributeImpl.get("minecraft:burning_time"); - Attribute GENERIC_EXPLOSION_KNOCKBACK_RESISTANCE = AttributeImpl.get("minecraft:generic.explosion_knockback_resistance"); + Attribute EXPLOSION_KNOCKBACK_RESISTANCE = AttributeImpl.get("minecraft:explosion_knockback_resistance"); - Attribute PLAYER_ENTITY_INTERACTION_RANGE = AttributeImpl.get("minecraft:player.entity_interaction_range"); + Attribute ENTITY_INTERACTION_RANGE = AttributeImpl.get("minecraft:entity_interaction_range"); - Attribute GENERIC_FALL_DAMAGE_MULTIPLIER = AttributeImpl.get("minecraft:generic.fall_damage_multiplier"); + Attribute FALL_DAMAGE_MULTIPLIER = AttributeImpl.get("minecraft:fall_damage_multiplier"); - Attribute GENERIC_FLYING_SPEED = AttributeImpl.get("minecraft:generic.flying_speed"); + Attribute FLYING_SPEED = AttributeImpl.get("minecraft:flying_speed"); - Attribute GENERIC_FOLLOW_RANGE = AttributeImpl.get("minecraft:generic.follow_range"); + Attribute FOLLOW_RANGE = AttributeImpl.get("minecraft:follow_range"); - Attribute GENERIC_GRAVITY = AttributeImpl.get("minecraft:generic.gravity"); + Attribute GRAVITY = AttributeImpl.get("minecraft:gravity"); - Attribute GENERIC_JUMP_STRENGTH = AttributeImpl.get("minecraft:generic.jump_strength"); + Attribute JUMP_STRENGTH = AttributeImpl.get("minecraft:jump_strength"); - Attribute GENERIC_KNOCKBACK_RESISTANCE = AttributeImpl.get("minecraft:generic.knockback_resistance"); + Attribute KNOCKBACK_RESISTANCE = AttributeImpl.get("minecraft:knockback_resistance"); - Attribute GENERIC_LUCK = AttributeImpl.get("minecraft:generic.luck"); + Attribute LUCK = AttributeImpl.get("minecraft:luck"); - Attribute GENERIC_MAX_ABSORPTION = AttributeImpl.get("minecraft:generic.max_absorption"); + Attribute MAX_ABSORPTION = AttributeImpl.get("minecraft:max_absorption"); - Attribute GENERIC_MAX_HEALTH = AttributeImpl.get("minecraft:generic.max_health"); + Attribute MAX_HEALTH = AttributeImpl.get("minecraft:max_health"); - Attribute PLAYER_MINING_EFFICIENCY = AttributeImpl.get("minecraft:player.mining_efficiency"); + Attribute MINING_EFFICIENCY = AttributeImpl.get("minecraft:mining_efficiency"); - Attribute GENERIC_MOVEMENT_EFFICIENCY = AttributeImpl.get("minecraft:generic.movement_efficiency"); + Attribute MOVEMENT_EFFICIENCY = AttributeImpl.get("minecraft:movement_efficiency"); - Attribute GENERIC_MOVEMENT_SPEED = AttributeImpl.get("minecraft:generic.movement_speed"); + Attribute MOVEMENT_SPEED = AttributeImpl.get("minecraft:movement_speed"); - Attribute GENERIC_OXYGEN_BONUS = AttributeImpl.get("minecraft:generic.oxygen_bonus"); + Attribute OXYGEN_BONUS = AttributeImpl.get("minecraft:oxygen_bonus"); - Attribute GENERIC_SAFE_FALL_DISTANCE = AttributeImpl.get("minecraft:generic.safe_fall_distance"); + Attribute SAFE_FALL_DISTANCE = AttributeImpl.get("minecraft:safe_fall_distance"); - Attribute GENERIC_SCALE = AttributeImpl.get("minecraft:generic.scale"); + Attribute SCALE = AttributeImpl.get("minecraft:scale"); - Attribute PLAYER_SNEAKING_SPEED = AttributeImpl.get("minecraft:player.sneaking_speed"); + Attribute SNEAKING_SPEED = AttributeImpl.get("minecraft:sneaking_speed"); - Attribute ZOMBIE_SPAWN_REINFORCEMENTS = AttributeImpl.get("minecraft:zombie.spawn_reinforcements"); + Attribute SPAWN_REINFORCEMENTS = AttributeImpl.get("minecraft:spawn_reinforcements"); - Attribute GENERIC_STEP_HEIGHT = AttributeImpl.get("minecraft:generic.step_height"); + Attribute STEP_HEIGHT = AttributeImpl.get("minecraft:step_height"); - Attribute PLAYER_SUBMERGED_MINING_SPEED = AttributeImpl.get("minecraft:player.submerged_mining_speed"); + Attribute SUBMERGED_MINING_SPEED = AttributeImpl.get("minecraft:submerged_mining_speed"); - Attribute PLAYER_SWEEPING_DAMAGE_RATIO = AttributeImpl.get("minecraft:player.sweeping_damage_ratio"); + Attribute SWEEPING_DAMAGE_RATIO = AttributeImpl.get("minecraft:sweeping_damage_ratio"); - Attribute GENERIC_WATER_MOVEMENT_EFFICIENCY = AttributeImpl.get("minecraft:generic.water_movement_efficiency"); + Attribute TEMPT_RANGE = AttributeImpl.get("minecraft:tempt_range"); + + Attribute WATER_MOVEMENT_EFFICIENCY = AttributeImpl.get("minecraft:water_movement_efficiency"); } diff --git a/src/autogenerated/java/net/minestom/server/entity/damage/DamageTypes.java b/src/autogenerated/java/net/minestom/server/entity/damage/DamageTypes.java index 806d7a300..18adead63 100644 --- a/src/autogenerated/java/net/minestom/server/entity/damage/DamageTypes.java +++ b/src/autogenerated/java/net/minestom/server/entity/damage/DamageTypes.java @@ -9,44 +9,24 @@ import net.minestom.server.registry.DynamicRegistry; interface DamageTypes { DynamicRegistry.Key WITHER = DynamicRegistry.Key.of("minecraft:wither"); - DynamicRegistry.Key SONIC_BOOM = DynamicRegistry.Key.of("minecraft:sonic_boom"); - DynamicRegistry.Key WITHER_SKULL = DynamicRegistry.Key.of("minecraft:wither_skull"); - DynamicRegistry.Key DRY_OUT = DynamicRegistry.Key.of("minecraft:dry_out"); + DynamicRegistry.Key MACE_SMASH = DynamicRegistry.Key.of("minecraft:mace_smash"); DynamicRegistry.Key TRIDENT = DynamicRegistry.Key.of("minecraft:trident"); DynamicRegistry.Key ON_FIRE = DynamicRegistry.Key.of("minecraft:on_fire"); - DynamicRegistry.Key FALL = DynamicRegistry.Key.of("minecraft:fall"); - - DynamicRegistry.Key MOB_ATTACK = DynamicRegistry.Key.of("minecraft:mob_attack"); - - DynamicRegistry.Key MOB_PROJECTILE = DynamicRegistry.Key.of("minecraft:mob_projectile"); - DynamicRegistry.Key CAMPFIRE = DynamicRegistry.Key.of("minecraft:campfire"); - DynamicRegistry.Key THROWN = DynamicRegistry.Key.of("minecraft:thrown"); - DynamicRegistry.Key FALLING_STALACTITE = DynamicRegistry.Key.of("minecraft:falling_stalactite"); DynamicRegistry.Key FIREBALL = DynamicRegistry.Key.of("minecraft:fireball"); - DynamicRegistry.Key FALLING_BLOCK = DynamicRegistry.Key.of("minecraft:falling_block"); - - DynamicRegistry.Key WIND_CHARGE = DynamicRegistry.Key.of("minecraft:wind_charge"); - - DynamicRegistry.Key PLAYER_EXPLOSION = DynamicRegistry.Key.of("minecraft:player_explosion"); - DynamicRegistry.Key SPIT = DynamicRegistry.Key.of("minecraft:spit"); DynamicRegistry.Key STING = DynamicRegistry.Key.of("minecraft:sting"); - DynamicRegistry.Key UNATTRIBUTED_FIREBALL = DynamicRegistry.Key.of("minecraft:unattributed_fireball"); - - DynamicRegistry.Key IN_WALL = DynamicRegistry.Key.of("minecraft:in_wall"); - DynamicRegistry.Key IN_FIRE = DynamicRegistry.Key.of("minecraft:in_fire"); DynamicRegistry.Key ARROW = DynamicRegistry.Key.of("minecraft:arrow"); @@ -55,42 +35,68 @@ interface DamageTypes { DynamicRegistry.Key DROWN = DynamicRegistry.Key.of("minecraft:drown"); - DynamicRegistry.Key STARVE = DynamicRegistry.Key.of("minecraft:starve"); - DynamicRegistry.Key GENERIC_KILL = DynamicRegistry.Key.of("minecraft:generic_kill"); DynamicRegistry.Key DRAGON_BREATH = DynamicRegistry.Key.of("minecraft:dragon_breath"); - DynamicRegistry.Key MOB_ATTACK_NO_AGGRO = DynamicRegistry.Key.of("minecraft:mob_attack_no_aggro"); - DynamicRegistry.Key LAVA = DynamicRegistry.Key.of("minecraft:lava"); - DynamicRegistry.Key OUTSIDE_BORDER = DynamicRegistry.Key.of("minecraft:outside_border"); - DynamicRegistry.Key FLY_INTO_WALL = DynamicRegistry.Key.of("minecraft:fly_into_wall"); - DynamicRegistry.Key LIGHTNING_BOLT = DynamicRegistry.Key.of("minecraft:lightning_bolt"); - DynamicRegistry.Key PLAYER_ATTACK = DynamicRegistry.Key.of("minecraft:player_attack"); DynamicRegistry.Key FREEZE = DynamicRegistry.Key.of("minecraft:freeze"); DynamicRegistry.Key FALLING_ANVIL = DynamicRegistry.Key.of("minecraft:falling_anvil"); - DynamicRegistry.Key OUT_OF_WORLD = DynamicRegistry.Key.of("minecraft:out_of_world"); - - DynamicRegistry.Key MAGIC = DynamicRegistry.Key.of("minecraft:magic"); - DynamicRegistry.Key SWEET_BERRY_BUSH = DynamicRegistry.Key.of("minecraft:sweet_berry_bush"); DynamicRegistry.Key FIREWORKS = DynamicRegistry.Key.of("minecraft:fireworks"); + DynamicRegistry.Key STALAGMITE = DynamicRegistry.Key.of("minecraft:stalagmite"); + + DynamicRegistry.Key GENERIC = DynamicRegistry.Key.of("minecraft:generic"); + + DynamicRegistry.Key SONIC_BOOM = DynamicRegistry.Key.of("minecraft:sonic_boom"); + + DynamicRegistry.Key DRY_OUT = DynamicRegistry.Key.of("minecraft:dry_out"); + + DynamicRegistry.Key ENDER_PEARL = DynamicRegistry.Key.of("minecraft:ender_pearl"); + + DynamicRegistry.Key FALL = DynamicRegistry.Key.of("minecraft:fall"); + + DynamicRegistry.Key MOB_ATTACK = DynamicRegistry.Key.of("minecraft:mob_attack"); + + DynamicRegistry.Key MOB_PROJECTILE = DynamicRegistry.Key.of("minecraft:mob_projectile"); + + DynamicRegistry.Key THROWN = DynamicRegistry.Key.of("minecraft:thrown"); + + DynamicRegistry.Key FALLING_BLOCK = DynamicRegistry.Key.of("minecraft:falling_block"); + + DynamicRegistry.Key WIND_CHARGE = DynamicRegistry.Key.of("minecraft:wind_charge"); + + DynamicRegistry.Key PLAYER_EXPLOSION = DynamicRegistry.Key.of("minecraft:player_explosion"); + + DynamicRegistry.Key UNATTRIBUTED_FIREBALL = DynamicRegistry.Key.of("minecraft:unattributed_fireball"); + + DynamicRegistry.Key IN_WALL = DynamicRegistry.Key.of("minecraft:in_wall"); + + DynamicRegistry.Key STARVE = DynamicRegistry.Key.of("minecraft:starve"); + + DynamicRegistry.Key MOB_ATTACK_NO_AGGRO = DynamicRegistry.Key.of("minecraft:mob_attack_no_aggro"); + + DynamicRegistry.Key OUTSIDE_BORDER = DynamicRegistry.Key.of("minecraft:outside_border"); + + DynamicRegistry.Key LIGHTNING_BOLT = DynamicRegistry.Key.of("minecraft:lightning_bolt"); + + DynamicRegistry.Key OUT_OF_WORLD = DynamicRegistry.Key.of("minecraft:out_of_world"); + + DynamicRegistry.Key MAGIC = DynamicRegistry.Key.of("minecraft:magic"); + DynamicRegistry.Key EXPLOSION = DynamicRegistry.Key.of("minecraft:explosion"); DynamicRegistry.Key BAD_RESPAWN_POINT = DynamicRegistry.Key.of("minecraft:bad_respawn_point"); - DynamicRegistry.Key STALAGMITE = DynamicRegistry.Key.of("minecraft:stalagmite"); - DynamicRegistry.Key THORNS = DynamicRegistry.Key.of("minecraft:thorns"); DynamicRegistry.Key INDIRECT_MAGIC = DynamicRegistry.Key.of("minecraft:indirect_magic"); @@ -98,6 +104,4 @@ interface DamageTypes { DynamicRegistry.Key CRAMMING = DynamicRegistry.Key.of("minecraft:cramming"); DynamicRegistry.Key CACTUS = DynamicRegistry.Key.of("minecraft:cactus"); - - DynamicRegistry.Key GENERIC = DynamicRegistry.Key.of("minecraft:generic"); } diff --git a/src/autogenerated/java/net/minestom/server/instance/block/Blocks.java b/src/autogenerated/java/net/minestom/server/instance/block/Blocks.java index 974c15bb9..dafc5c222 100644 --- a/src/autogenerated/java/net/minestom/server/instance/block/Blocks.java +++ b/src/autogenerated/java/net/minestom/server/instance/block/Blocks.java @@ -45,6 +45,10 @@ interface Blocks { Block DARK_OAK_PLANKS = BlockImpl.get("minecraft:dark_oak_planks"); + Block PALE_OAK_WOOD = BlockImpl.get("minecraft:pale_oak_wood"); + + Block PALE_OAK_PLANKS = BlockImpl.get("minecraft:pale_oak_planks"); + Block MANGROVE_PLANKS = BlockImpl.get("minecraft:mangrove_planks"); Block BAMBOO_PLANKS = BlockImpl.get("minecraft:bamboo_planks"); @@ -65,6 +69,8 @@ interface Blocks { Block DARK_OAK_SAPLING = BlockImpl.get("minecraft:dark_oak_sapling"); + Block PALE_OAK_SAPLING = BlockImpl.get("minecraft:pale_oak_sapling"); + Block MANGROVE_PROPAGULE = BlockImpl.get("minecraft:mangrove_propagule"); Block BEDROCK = BlockImpl.get("minecraft:bedrock"); @@ -111,6 +117,8 @@ interface Blocks { Block DARK_OAK_LOG = BlockImpl.get("minecraft:dark_oak_log"); + Block PALE_OAK_LOG = BlockImpl.get("minecraft:pale_oak_log"); + Block MANGROVE_LOG = BlockImpl.get("minecraft:mangrove_log"); Block MANGROVE_ROOTS = BlockImpl.get("minecraft:mangrove_roots"); @@ -131,6 +139,8 @@ interface Blocks { Block STRIPPED_DARK_OAK_LOG = BlockImpl.get("minecraft:stripped_dark_oak_log"); + Block STRIPPED_PALE_OAK_LOG = BlockImpl.get("minecraft:stripped_pale_oak_log"); + Block STRIPPED_OAK_LOG = BlockImpl.get("minecraft:stripped_oak_log"); Block STRIPPED_MANGROVE_LOG = BlockImpl.get("minecraft:stripped_mangrove_log"); @@ -167,6 +177,8 @@ interface Blocks { Block STRIPPED_DARK_OAK_WOOD = BlockImpl.get("minecraft:stripped_dark_oak_wood"); + Block STRIPPED_PALE_OAK_WOOD = BlockImpl.get("minecraft:stripped_pale_oak_wood"); + Block STRIPPED_MANGROVE_WOOD = BlockImpl.get("minecraft:stripped_mangrove_wood"); Block OAK_LEAVES = BlockImpl.get("minecraft:oak_leaves"); @@ -183,6 +195,8 @@ interface Blocks { Block DARK_OAK_LEAVES = BlockImpl.get("minecraft:dark_oak_leaves"); + Block PALE_OAK_LEAVES = BlockImpl.get("minecraft:pale_oak_leaves"); + Block MANGROVE_LEAVES = BlockImpl.get("minecraft:mangrove_leaves"); Block AZALEA_LEAVES = BlockImpl.get("minecraft:azalea_leaves"); @@ -357,6 +371,8 @@ interface Blocks { Block SPAWNER = BlockImpl.get("minecraft:spawner"); + Block CREAKING_HEART = BlockImpl.get("minecraft:creaking_heart"); + Block OAK_STAIRS = BlockImpl.get("minecraft:oak_stairs"); Block CHEST = BlockImpl.get("minecraft:chest"); @@ -391,6 +407,8 @@ interface Blocks { Block DARK_OAK_SIGN = BlockImpl.get("minecraft:dark_oak_sign"); + Block PALE_OAK_SIGN = BlockImpl.get("minecraft:pale_oak_sign"); + Block MANGROVE_SIGN = BlockImpl.get("minecraft:mangrove_sign"); Block BAMBOO_SIGN = BlockImpl.get("minecraft:bamboo_sign"); @@ -417,6 +435,8 @@ interface Blocks { Block DARK_OAK_WALL_SIGN = BlockImpl.get("minecraft:dark_oak_wall_sign"); + Block PALE_OAK_WALL_SIGN = BlockImpl.get("minecraft:pale_oak_wall_sign"); + Block MANGROVE_WALL_SIGN = BlockImpl.get("minecraft:mangrove_wall_sign"); Block BAMBOO_WALL_SIGN = BlockImpl.get("minecraft:bamboo_wall_sign"); @@ -435,6 +455,8 @@ interface Blocks { Block DARK_OAK_HANGING_SIGN = BlockImpl.get("minecraft:dark_oak_hanging_sign"); + Block PALE_OAK_HANGING_SIGN = BlockImpl.get("minecraft:pale_oak_hanging_sign"); + Block CRIMSON_HANGING_SIGN = BlockImpl.get("minecraft:crimson_hanging_sign"); Block WARPED_HANGING_SIGN = BlockImpl.get("minecraft:warped_hanging_sign"); @@ -457,6 +479,8 @@ interface Blocks { Block DARK_OAK_WALL_HANGING_SIGN = BlockImpl.get("minecraft:dark_oak_wall_hanging_sign"); + Block PALE_OAK_WALL_HANGING_SIGN = BlockImpl.get("minecraft:pale_oak_wall_hanging_sign"); + Block MANGROVE_WALL_HANGING_SIGN = BlockImpl.get("minecraft:mangrove_wall_hanging_sign"); Block CRIMSON_WALL_HANGING_SIGN = BlockImpl.get("minecraft:crimson_wall_hanging_sign"); @@ -485,6 +509,8 @@ interface Blocks { Block DARK_OAK_PRESSURE_PLATE = BlockImpl.get("minecraft:dark_oak_pressure_plate"); + Block PALE_OAK_PRESSURE_PLATE = BlockImpl.get("minecraft:pale_oak_pressure_plate"); + Block MANGROVE_PRESSURE_PLATE = BlockImpl.get("minecraft:mangrove_pressure_plate"); Block BAMBOO_PRESSURE_PLATE = BlockImpl.get("minecraft:bamboo_pressure_plate"); @@ -587,6 +613,8 @@ interface Blocks { Block DARK_OAK_TRAPDOOR = BlockImpl.get("minecraft:dark_oak_trapdoor"); + Block PALE_OAK_TRAPDOOR = BlockImpl.get("minecraft:pale_oak_trapdoor"); + Block MANGROVE_TRAPDOOR = BlockImpl.get("minecraft:mangrove_trapdoor"); Block BAMBOO_TRAPDOOR = BlockImpl.get("minecraft:bamboo_trapdoor"); @@ -733,6 +761,8 @@ interface Blocks { Block POTTED_DARK_OAK_SAPLING = BlockImpl.get("minecraft:potted_dark_oak_sapling"); + Block POTTED_PALE_OAK_SAPLING = BlockImpl.get("minecraft:potted_pale_oak_sapling"); + Block POTTED_MANGROVE_PROPAGULE = BlockImpl.get("minecraft:potted_mangrove_propagule"); Block POTTED_FERN = BlockImpl.get("minecraft:potted_fern"); @@ -789,6 +819,8 @@ interface Blocks { Block DARK_OAK_BUTTON = BlockImpl.get("minecraft:dark_oak_button"); + Block PALE_OAK_BUTTON = BlockImpl.get("minecraft:pale_oak_button"); + Block MANGROVE_BUTTON = BlockImpl.get("minecraft:mangrove_button"); Block BAMBOO_BUTTON = BlockImpl.get("minecraft:bamboo_button"); @@ -925,6 +957,8 @@ interface Blocks { Block DARK_OAK_STAIRS = BlockImpl.get("minecraft:dark_oak_stairs"); + Block PALE_OAK_STAIRS = BlockImpl.get("minecraft:pale_oak_stairs"); + Block MANGROVE_STAIRS = BlockImpl.get("minecraft:mangrove_stairs"); Block BAMBOO_STAIRS = BlockImpl.get("minecraft:bamboo_stairs"); @@ -1097,6 +1131,8 @@ interface Blocks { Block DARK_OAK_SLAB = BlockImpl.get("minecraft:dark_oak_slab"); + Block PALE_OAK_SLAB = BlockImpl.get("minecraft:pale_oak_slab"); + Block MANGROVE_SLAB = BlockImpl.get("minecraft:mangrove_slab"); Block BAMBOO_SLAB = BlockImpl.get("minecraft:bamboo_slab"); @@ -1151,6 +1187,8 @@ interface Blocks { Block DARK_OAK_FENCE_GATE = BlockImpl.get("minecraft:dark_oak_fence_gate"); + Block PALE_OAK_FENCE_GATE = BlockImpl.get("minecraft:pale_oak_fence_gate"); + Block MANGROVE_FENCE_GATE = BlockImpl.get("minecraft:mangrove_fence_gate"); Block BAMBOO_FENCE_GATE = BlockImpl.get("minecraft:bamboo_fence_gate"); @@ -1167,6 +1205,8 @@ interface Blocks { Block DARK_OAK_FENCE = BlockImpl.get("minecraft:dark_oak_fence"); + Block PALE_OAK_FENCE = BlockImpl.get("minecraft:pale_oak_fence"); + Block MANGROVE_FENCE = BlockImpl.get("minecraft:mangrove_fence"); Block BAMBOO_FENCE = BlockImpl.get("minecraft:bamboo_fence"); @@ -1183,6 +1223,8 @@ interface Blocks { Block DARK_OAK_DOOR = BlockImpl.get("minecraft:dark_oak_door"); + Block PALE_OAK_DOOR = BlockImpl.get("minecraft:pale_oak_door"); + Block MANGROVE_DOOR = BlockImpl.get("minecraft:mangrove_door"); Block BAMBOO_DOOR = BlockImpl.get("minecraft:bamboo_door"); @@ -2124,4 +2166,10 @@ interface Blocks { Block VAULT = BlockImpl.get("minecraft:vault"); Block HEAVY_CORE = BlockImpl.get("minecraft:heavy_core"); + + Block PALE_MOSS_BLOCK = BlockImpl.get("minecraft:pale_moss_block"); + + Block PALE_MOSS_CARPET = BlockImpl.get("minecraft:pale_moss_carpet"); + + Block PALE_HANGING_MOSS = BlockImpl.get("minecraft:pale_hanging_moss"); } diff --git a/src/autogenerated/java/net/minestom/server/item/Materials.java b/src/autogenerated/java/net/minestom/server/item/Materials.java index 23f5ff7ba..7ba872bbf 100644 --- a/src/autogenerated/java/net/minestom/server/item/Materials.java +++ b/src/autogenerated/java/net/minestom/server/item/Materials.java @@ -91,6 +91,8 @@ interface Materials { Material DARK_OAK_PLANKS = MaterialImpl.get("minecraft:dark_oak_planks"); + Material PALE_OAK_PLANKS = MaterialImpl.get("minecraft:pale_oak_planks"); + Material MANGROVE_PLANKS = MaterialImpl.get("minecraft:mangrove_planks"); Material BAMBOO_PLANKS = MaterialImpl.get("minecraft:bamboo_planks"); @@ -115,6 +117,8 @@ interface Materials { Material DARK_OAK_SAPLING = MaterialImpl.get("minecraft:dark_oak_sapling"); + Material PALE_OAK_SAPLING = MaterialImpl.get("minecraft:pale_oak_sapling"); + Material MANGROVE_PROPAGULE = MaterialImpl.get("minecraft:mangrove_propagule"); Material BEDROCK = MaterialImpl.get("minecraft:bedrock"); @@ -281,6 +285,8 @@ interface Materials { Material CHERRY_LOG = MaterialImpl.get("minecraft:cherry_log"); + Material PALE_OAK_LOG = MaterialImpl.get("minecraft:pale_oak_log"); + Material DARK_OAK_LOG = MaterialImpl.get("minecraft:dark_oak_log"); Material MANGROVE_LOG = MaterialImpl.get("minecraft:mangrove_log"); @@ -309,6 +315,8 @@ interface Materials { Material STRIPPED_DARK_OAK_LOG = MaterialImpl.get("minecraft:stripped_dark_oak_log"); + Material STRIPPED_PALE_OAK_LOG = MaterialImpl.get("minecraft:stripped_pale_oak_log"); + Material STRIPPED_MANGROVE_LOG = MaterialImpl.get("minecraft:stripped_mangrove_log"); Material STRIPPED_CRIMSON_STEM = MaterialImpl.get("minecraft:stripped_crimson_stem"); @@ -329,6 +337,8 @@ interface Materials { Material STRIPPED_DARK_OAK_WOOD = MaterialImpl.get("minecraft:stripped_dark_oak_wood"); + Material STRIPPED_PALE_OAK_WOOD = MaterialImpl.get("minecraft:stripped_pale_oak_wood"); + Material STRIPPED_MANGROVE_WOOD = MaterialImpl.get("minecraft:stripped_mangrove_wood"); Material STRIPPED_CRIMSON_HYPHAE = MaterialImpl.get("minecraft:stripped_crimson_hyphae"); @@ -349,6 +359,8 @@ interface Materials { Material CHERRY_WOOD = MaterialImpl.get("minecraft:cherry_wood"); + Material PALE_OAK_WOOD = MaterialImpl.get("minecraft:pale_oak_wood"); + Material DARK_OAK_WOOD = MaterialImpl.get("minecraft:dark_oak_wood"); Material MANGROVE_WOOD = MaterialImpl.get("minecraft:mangrove_wood"); @@ -371,6 +383,8 @@ interface Materials { Material DARK_OAK_LEAVES = MaterialImpl.get("minecraft:dark_oak_leaves"); + Material PALE_OAK_LEAVES = MaterialImpl.get("minecraft:pale_oak_leaves"); + Material MANGROVE_LEAVES = MaterialImpl.get("minecraft:mangrove_leaves"); Material AZALEA_LEAVES = MaterialImpl.get("minecraft:azalea_leaves"); @@ -495,12 +509,18 @@ interface Materials { Material KELP = MaterialImpl.get("minecraft:kelp"); - Material MOSS_CARPET = MaterialImpl.get("minecraft:moss_carpet"); - Material PINK_PETALS = MaterialImpl.get("minecraft:pink_petals"); + Material MOSS_CARPET = MaterialImpl.get("minecraft:moss_carpet"); + Material MOSS_BLOCK = MaterialImpl.get("minecraft:moss_block"); + Material PALE_MOSS_CARPET = MaterialImpl.get("minecraft:pale_moss_carpet"); + + Material PALE_HANGING_MOSS = MaterialImpl.get("minecraft:pale_hanging_moss"); + + Material PALE_MOSS_BLOCK = MaterialImpl.get("minecraft:pale_moss_block"); + Material HANGING_ROOTS = MaterialImpl.get("minecraft:hanging_roots"); Material BIG_DRIPLEAF = MaterialImpl.get("minecraft:big_dripleaf"); @@ -523,6 +543,8 @@ interface Materials { Material DARK_OAK_SLAB = MaterialImpl.get("minecraft:dark_oak_slab"); + Material PALE_OAK_SLAB = MaterialImpl.get("minecraft:pale_oak_slab"); + Material MANGROVE_SLAB = MaterialImpl.get("minecraft:mangrove_slab"); Material BAMBOO_SLAB = MaterialImpl.get("minecraft:bamboo_slab"); @@ -603,6 +625,8 @@ interface Materials { Material SPAWNER = MaterialImpl.get("minecraft:spawner"); + Material CREAKING_HEART = MaterialImpl.get("minecraft:creaking_heart"); + Material CHEST = MaterialImpl.get("minecraft:chest"); Material CRAFTING_TABLE = MaterialImpl.get("minecraft:crafting_table"); @@ -641,6 +665,8 @@ interface Materials { Material DARK_OAK_FENCE = MaterialImpl.get("minecraft:dark_oak_fence"); + Material PALE_OAK_FENCE = MaterialImpl.get("minecraft:pale_oak_fence"); + Material MANGROVE_FENCE = MaterialImpl.get("minecraft:mangrove_fence"); Material BAMBOO_FENCE = MaterialImpl.get("minecraft:bamboo_fence"); @@ -785,6 +811,8 @@ interface Materials { Material DARK_OAK_STAIRS = MaterialImpl.get("minecraft:dark_oak_stairs"); + Material PALE_OAK_STAIRS = MaterialImpl.get("minecraft:pale_oak_stairs"); + Material MANGROVE_STAIRS = MaterialImpl.get("minecraft:mangrove_stairs"); Material BAMBOO_STAIRS = MaterialImpl.get("minecraft:bamboo_stairs"); @@ -1387,6 +1415,8 @@ interface Materials { Material DARK_OAK_BUTTON = MaterialImpl.get("minecraft:dark_oak_button"); + Material PALE_OAK_BUTTON = MaterialImpl.get("minecraft:pale_oak_button"); + Material MANGROVE_BUTTON = MaterialImpl.get("minecraft:mangrove_button"); Material BAMBOO_BUTTON = MaterialImpl.get("minecraft:bamboo_button"); @@ -1417,6 +1447,8 @@ interface Materials { Material DARK_OAK_PRESSURE_PLATE = MaterialImpl.get("minecraft:dark_oak_pressure_plate"); + Material PALE_OAK_PRESSURE_PLATE = MaterialImpl.get("minecraft:pale_oak_pressure_plate"); + Material MANGROVE_PRESSURE_PLATE = MaterialImpl.get("minecraft:mangrove_pressure_plate"); Material BAMBOO_PRESSURE_PLATE = MaterialImpl.get("minecraft:bamboo_pressure_plate"); @@ -1441,6 +1473,8 @@ interface Materials { Material DARK_OAK_DOOR = MaterialImpl.get("minecraft:dark_oak_door"); + Material PALE_OAK_DOOR = MaterialImpl.get("minecraft:pale_oak_door"); + Material MANGROVE_DOOR = MaterialImpl.get("minecraft:mangrove_door"); Material BAMBOO_DOOR = MaterialImpl.get("minecraft:bamboo_door"); @@ -1481,6 +1515,8 @@ interface Materials { Material DARK_OAK_TRAPDOOR = MaterialImpl.get("minecraft:dark_oak_trapdoor"); + Material PALE_OAK_TRAPDOOR = MaterialImpl.get("minecraft:pale_oak_trapdoor"); + Material MANGROVE_TRAPDOOR = MaterialImpl.get("minecraft:mangrove_trapdoor"); Material BAMBOO_TRAPDOOR = MaterialImpl.get("minecraft:bamboo_trapdoor"); @@ -1519,6 +1555,8 @@ interface Materials { Material DARK_OAK_FENCE_GATE = MaterialImpl.get("minecraft:dark_oak_fence_gate"); + Material PALE_OAK_FENCE_GATE = MaterialImpl.get("minecraft:pale_oak_fence_gate"); + Material MANGROVE_FENCE_GATE = MaterialImpl.get("minecraft:mangrove_fence_gate"); Material BAMBOO_FENCE_GATE = MaterialImpl.get("minecraft:bamboo_fence_gate"); @@ -1551,6 +1589,8 @@ interface Materials { Material WARPED_FUNGUS_ON_A_STICK = MaterialImpl.get("minecraft:warped_fungus_on_a_stick"); + Material PHANTOM_MEMBRANE = MaterialImpl.get("minecraft:phantom_membrane"); + Material ELYTRA = MaterialImpl.get("minecraft:elytra"); Material OAK_BOAT = MaterialImpl.get("minecraft:oak_boat"); @@ -1581,6 +1621,10 @@ interface Materials { Material DARK_OAK_CHEST_BOAT = MaterialImpl.get("minecraft:dark_oak_chest_boat"); + Material PALE_OAK_BOAT = MaterialImpl.get("minecraft:pale_oak_boat"); + + Material PALE_OAK_CHEST_BOAT = MaterialImpl.get("minecraft:pale_oak_chest_boat"); + Material MANGROVE_BOAT = MaterialImpl.get("minecraft:mangrove_boat"); Material MANGROVE_CHEST_BOAT = MaterialImpl.get("minecraft:mangrove_chest_boat"); @@ -1791,6 +1835,8 @@ interface Materials { Material DARK_OAK_SIGN = MaterialImpl.get("minecraft:dark_oak_sign"); + Material PALE_OAK_SIGN = MaterialImpl.get("minecraft:pale_oak_sign"); + Material MANGROVE_SIGN = MaterialImpl.get("minecraft:mangrove_sign"); Material BAMBOO_SIGN = MaterialImpl.get("minecraft:bamboo_sign"); @@ -1813,6 +1859,8 @@ interface Materials { Material DARK_OAK_HANGING_SIGN = MaterialImpl.get("minecraft:dark_oak_hanging_sign"); + Material PALE_OAK_HANGING_SIGN = MaterialImpl.get("minecraft:pale_oak_hanging_sign"); + Material MANGROVE_HANGING_SIGN = MaterialImpl.get("minecraft:mangrove_hanging_sign"); Material BAMBOO_HANGING_SIGN = MaterialImpl.get("minecraft:bamboo_hanging_sign"); @@ -1867,6 +1915,38 @@ interface Materials { Material BUNDLE = MaterialImpl.get("minecraft:bundle"); + Material WHITE_BUNDLE = MaterialImpl.get("minecraft:white_bundle"); + + Material ORANGE_BUNDLE = MaterialImpl.get("minecraft:orange_bundle"); + + Material MAGENTA_BUNDLE = MaterialImpl.get("minecraft:magenta_bundle"); + + Material LIGHT_BLUE_BUNDLE = MaterialImpl.get("minecraft:light_blue_bundle"); + + Material YELLOW_BUNDLE = MaterialImpl.get("minecraft:yellow_bundle"); + + Material LIME_BUNDLE = MaterialImpl.get("minecraft:lime_bundle"); + + Material PINK_BUNDLE = MaterialImpl.get("minecraft:pink_bundle"); + + Material GRAY_BUNDLE = MaterialImpl.get("minecraft:gray_bundle"); + + Material LIGHT_GRAY_BUNDLE = MaterialImpl.get("minecraft:light_gray_bundle"); + + Material CYAN_BUNDLE = MaterialImpl.get("minecraft:cyan_bundle"); + + Material PURPLE_BUNDLE = MaterialImpl.get("minecraft:purple_bundle"); + + Material BLUE_BUNDLE = MaterialImpl.get("minecraft:blue_bundle"); + + Material BROWN_BUNDLE = MaterialImpl.get("minecraft:brown_bundle"); + + Material GREEN_BUNDLE = MaterialImpl.get("minecraft:green_bundle"); + + Material RED_BUNDLE = MaterialImpl.get("minecraft:red_bundle"); + + Material BLACK_BUNDLE = MaterialImpl.get("minecraft:black_bundle"); + Material FISHING_ROD = MaterialImpl.get("minecraft:fishing_rod"); Material CLOCK = MaterialImpl.get("minecraft:clock"); @@ -2001,10 +2081,10 @@ interface Materials { Material NETHER_WART = MaterialImpl.get("minecraft:nether_wart"); - Material POTION = MaterialImpl.get("minecraft:potion"); - Material GLASS_BOTTLE = MaterialImpl.get("minecraft:glass_bottle"); + Material POTION = MaterialImpl.get("minecraft:potion"); + Material SPIDER_EYE = MaterialImpl.get("minecraft:spider_eye"); Material FERMENTED_SPIDER_EYE = MaterialImpl.get("minecraft:fermented_spider_eye"); @@ -2173,6 +2253,8 @@ interface Materials { Material ZOGLIN_SPAWN_EGG = MaterialImpl.get("minecraft:zoglin_spawn_egg"); + Material CREAKING_SPAWN_EGG = MaterialImpl.get("minecraft:creaking_spawn_egg"); + Material ZOMBIE_SPAWN_EGG = MaterialImpl.get("minecraft:zombie_spawn_egg"); Material ZOMBIE_HORSE_SPAWN_EGG = MaterialImpl.get("minecraft:zombie_horse_spawn_egg"); @@ -2191,6 +2273,8 @@ interface Materials { Material WRITTEN_BOOK = MaterialImpl.get("minecraft:written_book"); + Material BREEZE_ROD = MaterialImpl.get("minecraft:breeze_rod"); + Material MACE = MaterialImpl.get("minecraft:mace"); Material ITEM_FRAME = MaterialImpl.get("minecraft:item_frame"); @@ -2383,8 +2467,6 @@ interface Materials { Material TRIDENT = MaterialImpl.get("minecraft:trident"); - Material PHANTOM_MEMBRANE = MaterialImpl.get("minecraft:phantom_membrane"); - Material NAUTILUS_SHELL = MaterialImpl.get("minecraft:nautilus_shell"); Material HEART_OF_THE_SEA = MaterialImpl.get("minecraft:heart_of_the_sea"); @@ -2411,6 +2493,10 @@ interface Materials { Material GUSTER_BANNER_PATTERN = MaterialImpl.get("minecraft:guster_banner_pattern"); + Material FIELD_MASONED_BANNER_PATTERN = MaterialImpl.get("minecraft:field_masoned_banner_pattern"); + + Material BORDURE_INDENTED_BANNER_PATTERN = MaterialImpl.get("minecraft:bordure_indented_banner_pattern"); + Material GOAT_HORN = MaterialImpl.get("minecraft:goat_horn"); Material COMPOSTER = MaterialImpl.get("minecraft:composter"); @@ -2668,6 +2754,4 @@ interface Materials { Material VAULT = MaterialImpl.get("minecraft:vault"); Material OMINOUS_BOTTLE = MaterialImpl.get("minecraft:ominous_bottle"); - - Material BREEZE_ROD = MaterialImpl.get("minecraft:breeze_rod"); } diff --git a/src/autogenerated/java/net/minestom/server/item/component/ConsumeEffectType.java b/src/autogenerated/java/net/minestom/server/item/component/ConsumeEffectType.java new file mode 100644 index 000000000..33572cbdf --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/item/component/ConsumeEffectType.java @@ -0,0 +1,43 @@ +package net.minestom.server.item.component; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +enum ConsumeEffectType implements StaticProtocolObject { + APPLY_EFFECTS(NamespaceID.from("minecraft:apply_effects")), + + REMOVE_EFFECTS(NamespaceID.from("minecraft:remove_effects")), + + CLEAR_ALL_EFFECTS(NamespaceID.from("minecraft:clear_all_effects")), + + TELEPORT_RANDOMLY(NamespaceID.from("minecraft:teleport_randomly")), + + PLAY_SOUND(NamespaceID.from("minecraft:play_sound")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(ConsumeEffectType.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(ConsumeEffectType.class); + + private final NamespaceID namespace; + + ConsumeEffectType(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/particle/Particles.java b/src/autogenerated/java/net/minestom/server/particle/Particles.java index 37ecf045e..9369be577 100644 --- a/src/autogenerated/java/net/minestom/server/particle/Particles.java +++ b/src/autogenerated/java/net/minestom/server/particle/Particles.java @@ -96,6 +96,8 @@ interface Particles { Particle.Vibration VIBRATION = (Particle.Vibration) ParticleImpl.get("minecraft:vibration"); + Particle.Trail TRAIL = (Particle.Trail) ParticleImpl.get("minecraft:trail"); + Particle ITEM_SLIME = ParticleImpl.get("minecraft:item_slime"); Particle ITEM_COBWEB = ParticleImpl.get("minecraft:item_cobweb"); @@ -221,4 +223,6 @@ interface Particles { Particle RAID_OMEN = ParticleImpl.get("minecraft:raid_omen"); Particle TRIAL_OMEN = ParticleImpl.get("minecraft:trial_omen"); + + Particle.BlockCrumble BLOCK_CRUMBLE = (Particle.BlockCrumble) ParticleImpl.get("minecraft:block_crumble"); } diff --git a/src/autogenerated/java/net/minestom/server/recipe/RecipeBookCategory.java b/src/autogenerated/java/net/minestom/server/recipe/RecipeBookCategory.java new file mode 100644 index 000000000..e8f176bef --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/recipe/RecipeBookCategory.java @@ -0,0 +1,59 @@ +package net.minestom.server.recipe; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +public enum RecipeBookCategory implements StaticProtocolObject { + CRAFTING_BUILDING_BLOCKS(NamespaceID.from("minecraft:crafting_building_blocks")), + + CRAFTING_REDSTONE(NamespaceID.from("minecraft:crafting_redstone")), + + CRAFTING_EQUIPMENT(NamespaceID.from("minecraft:crafting_equipment")), + + CRAFTING_MISC(NamespaceID.from("minecraft:crafting_misc")), + + FURNACE_FOOD(NamespaceID.from("minecraft:furnace_food")), + + FURNACE_BLOCKS(NamespaceID.from("minecraft:furnace_blocks")), + + FURNACE_MISC(NamespaceID.from("minecraft:furnace_misc")), + + BLAST_FURNACE_BLOCKS(NamespaceID.from("minecraft:blast_furnace_blocks")), + + BLAST_FURNACE_MISC(NamespaceID.from("minecraft:blast_furnace_misc")), + + SMOKER_FOOD(NamespaceID.from("minecraft:smoker_food")), + + STONECUTTER(NamespaceID.from("minecraft:stonecutter")), + + SMITHING(NamespaceID.from("minecraft:smithing")), + + CAMPFIRE(NamespaceID.from("minecraft:campfire")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(RecipeBookCategory.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(RecipeBookCategory.class); + + private final NamespaceID namespace; + + RecipeBookCategory(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java b/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java index 16735c2d4..75429bdc9 100644 --- a/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java +++ b/src/autogenerated/java/net/minestom/server/recipe/RecipeType.java @@ -3,41 +3,14 @@ package net.minestom.server.recipe; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.registry.StaticProtocolObject; import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; import org.jetbrains.annotations.NotNull; /** * AUTOGENERATED by RecipeTypeGenerator */ public enum RecipeType implements StaticProtocolObject { - SHAPED(NamespaceID.from("minecraft:crafting_shaped")), - - SHAPELESS(NamespaceID.from("minecraft:crafting_shapeless")), - - SPECIAL_ARMORDYE(NamespaceID.from("minecraft:crafting_special_armordye")), - - SPECIAL_BOOKCLONING(NamespaceID.from("minecraft:crafting_special_bookcloning")), - - SPECIAL_MAPCLONING(NamespaceID.from("minecraft:crafting_special_mapcloning")), - - SPECIAL_MAPEXTENDING(NamespaceID.from("minecraft:crafting_special_mapextending")), - - SPECIAL_FIREWORK_ROCKET(NamespaceID.from("minecraft:crafting_special_firework_rocket")), - - SPECIAL_FIREWORK_STAR(NamespaceID.from("minecraft:crafting_special_firework_star")), - - SPECIAL_FIREWORK_STAR_FADE(NamespaceID.from("minecraft:crafting_special_firework_star_fade")), - - SPECIAL_TIPPEDARROW(NamespaceID.from("minecraft:crafting_special_tippedarrow")), - - SPECIAL_BANNERDUPLICATE(NamespaceID.from("minecraft:crafting_special_bannerduplicate")), - - SPECIAL_SHIELDDECORATION(NamespaceID.from("minecraft:crafting_special_shielddecoration")), - - SPECIAL_SHULKERBOXCOLORING(NamespaceID.from("minecraft:crafting_special_shulkerboxcoloring")), - - SPECIAL_SUSPICIOUSSTEW(NamespaceID.from("minecraft:crafting_special_suspiciousstew")), - - SPECIAL_REPAIRITEM(NamespaceID.from("minecraft:crafting_special_repairitem")), + CRAFTING(NamespaceID.from("minecraft:crafting")), SMELTING(NamespaceID.from("minecraft:smelting")), @@ -49,14 +22,12 @@ public enum RecipeType implements StaticProtocolObject { STONECUTTING(NamespaceID.from("minecraft:stonecutting")), - SMITHING_TRANSFORM(NamespaceID.from("minecraft:smithing_transform")), - - SMITHING_TRIM(NamespaceID.from("minecraft:smithing_trim")), - - DECORATED_POT(NamespaceID.from("minecraft:crafting_decorated_pot")); + SMITHING(NamespaceID.from("minecraft:smithing")); public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(RecipeType.class); + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(RecipeType.class); + private final NamespaceID namespace; RecipeType(@NotNull NamespaceID namespace) { diff --git a/src/autogenerated/java/net/minestom/server/recipe/display/RecipeDisplayType.java b/src/autogenerated/java/net/minestom/server/recipe/display/RecipeDisplayType.java new file mode 100644 index 000000000..8f39c1624 --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/recipe/display/RecipeDisplayType.java @@ -0,0 +1,43 @@ +package net.minestom.server.recipe.display; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +public enum RecipeDisplayType implements StaticProtocolObject { + CRAFTING_SHAPELESS(NamespaceID.from("minecraft:crafting_shapeless")), + + CRAFTING_SHAPED(NamespaceID.from("minecraft:crafting_shaped")), + + FURNACE(NamespaceID.from("minecraft:furnace")), + + STONECUTTER(NamespaceID.from("minecraft:stonecutter")), + + SMITHING(NamespaceID.from("minecraft:smithing")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(RecipeDisplayType.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(RecipeDisplayType.class); + + private final NamespaceID namespace; + + RecipeDisplayType(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/recipe/display/SlotDisplayType.java b/src/autogenerated/java/net/minestom/server/recipe/display/SlotDisplayType.java new file mode 100644 index 000000000..24334a2ef --- /dev/null +++ b/src/autogenerated/java/net/minestom/server/recipe/display/SlotDisplayType.java @@ -0,0 +1,49 @@ +package net.minestom.server.recipe.display; + +import net.minestom.server.network.NetworkBuffer; +import net.minestom.server.registry.StaticProtocolObject; +import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.nbt.BinaryTagSerializer; +import org.jetbrains.annotations.NotNull; + +/** + * AUTOGENERATED by GenericEnumGenerator + */ +public enum SlotDisplayType implements StaticProtocolObject { + EMPTY(NamespaceID.from("minecraft:empty")), + + ANY_FUEL(NamespaceID.from("minecraft:any_fuel")), + + ITEM(NamespaceID.from("minecraft:item")), + + ITEM_STACK(NamespaceID.from("minecraft:item_stack")), + + TAG(NamespaceID.from("minecraft:tag")), + + SMITHING_TRIM(NamespaceID.from("minecraft:smithing_trim")), + + WITH_REMAINDER(NamespaceID.from("minecraft:with_remainder")), + + COMPOSITE(NamespaceID.from("minecraft:composite")); + + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.Enum(SlotDisplayType.class); + + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.fromEnumKeyed(SlotDisplayType.class); + + private final NamespaceID namespace; + + SlotDisplayType(@NotNull NamespaceID namespace) { + this.namespace = namespace; + } + + @NotNull + @Override + public NamespaceID namespace() { + return this.namespace; + } + + @Override + public int id() { + return this.ordinal(); + } +} diff --git a/src/autogenerated/java/net/minestom/server/sound/SoundEvents.java b/src/autogenerated/java/net/minestom/server/sound/SoundEvents.java index f886a7aa7..0c30cb41b 100644 --- a/src/autogenerated/java/net/minestom/server/sound/SoundEvents.java +++ b/src/autogenerated/java/net/minestom/server/sound/SoundEvents.java @@ -425,6 +425,8 @@ interface SoundEvents { SoundEvent BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE = BuiltinSoundEvent.get("minecraft:block.bubble_column.whirlpool_inside"); + SoundEvent UI_HUD_BUBBLE_POP = BuiltinSoundEvent.get("minecraft:ui.hud.bubble_pop"); + SoundEvent ITEM_BUCKET_EMPTY = BuiltinSoundEvent.get("minecraft:item.bucket.empty"); SoundEvent ITEM_BUCKET_EMPTY_AXOLOTL = BuiltinSoundEvent.get("minecraft:item.bucket.empty_axolotl"); @@ -453,6 +455,8 @@ interface SoundEvents { SoundEvent ITEM_BUNDLE_INSERT = BuiltinSoundEvent.get("minecraft:item.bundle.insert"); + SoundEvent ITEM_BUNDLE_INSERT_FAIL = BuiltinSoundEvent.get("minecraft:item.bundle.insert_fail"); + SoundEvent ITEM_BUNDLE_REMOVE_ONE = BuiltinSoundEvent.get("minecraft:item.bundle.remove_one"); SoundEvent BLOCK_CAKE_ADD_CANDLE = BuiltinSoundEvent.get("minecraft:block.cake.add_candle"); @@ -749,6 +753,42 @@ interface SoundEvents { SoundEvent BLOCK_CRAFTER_FAIL = BuiltinSoundEvent.get("minecraft:block.crafter.fail"); + SoundEvent ENTITY_CREAKING_AMBIENT = BuiltinSoundEvent.get("minecraft:entity.creaking.ambient"); + + SoundEvent ENTITY_CREAKING_ACTIVATE = BuiltinSoundEvent.get("minecraft:entity.creaking.activate"); + + SoundEvent ENTITY_CREAKING_DEACTIVATE = BuiltinSoundEvent.get("minecraft:entity.creaking.deactivate"); + + SoundEvent ENTITY_CREAKING_ATTACK = BuiltinSoundEvent.get("minecraft:entity.creaking.attack"); + + SoundEvent ENTITY_CREAKING_DEATH = BuiltinSoundEvent.get("minecraft:entity.creaking.death"); + + SoundEvent ENTITY_CREAKING_STEP = BuiltinSoundEvent.get("minecraft:entity.creaking.step"); + + SoundEvent ENTITY_CREAKING_FREEZE = BuiltinSoundEvent.get("minecraft:entity.creaking.freeze"); + + SoundEvent ENTITY_CREAKING_UNFREEZE = BuiltinSoundEvent.get("minecraft:entity.creaking.unfreeze"); + + SoundEvent ENTITY_CREAKING_SPAWN = BuiltinSoundEvent.get("minecraft:entity.creaking.spawn"); + + SoundEvent ENTITY_CREAKING_SWAY = BuiltinSoundEvent.get("minecraft:entity.creaking.sway"); + + SoundEvent BLOCK_CREAKING_HEART_BREAK = BuiltinSoundEvent.get("minecraft:block.creaking_heart.break"); + + SoundEvent BLOCK_CREAKING_HEART_FALL = BuiltinSoundEvent.get("minecraft:block.creaking_heart.fall"); + + SoundEvent BLOCK_CREAKING_HEART_HIT = BuiltinSoundEvent.get("minecraft:block.creaking_heart.hit"); + + SoundEvent BLOCK_CREAKING_HEART_HURT = BuiltinSoundEvent.get("minecraft:block.creaking_heart.hurt"); + + SoundEvent BLOCK_CREAKING_HEART_PLACE = BuiltinSoundEvent.get("minecraft:block.creaking_heart.place"); + + SoundEvent BLOCK_CREAKING_HEART_STEP = BuiltinSoundEvent.get("minecraft:block.creaking_heart.step"); + + SoundEvent BLOCK_CREAKING_HEART_IDLE = BuiltinSoundEvent.get("minecraft:block.creaking_heart.idle"); + + SoundEvent BLOCK_CREAKING_HEART_SPAWN = BuiltinSoundEvent.get("minecraft:block.creaking_heart.spawn"); + SoundEvent ENTITY_CREEPER_DEATH = BuiltinSoundEvent.get("minecraft:entity.creeper.death"); SoundEvent ENTITY_CREEPER_HURT = BuiltinSoundEvent.get("minecraft:entity.creeper.hurt"); @@ -1239,8 +1279,6 @@ interface SoundEvents { SoundEvent ENTITY_GOAT_HORN_BREAK = BuiltinSoundEvent.get("minecraft:entity.goat.horn_break"); - SoundEvent ITEM_GOAT_HORN_PLAY = BuiltinSoundEvent.get("minecraft:item.goat_horn.play"); - SoundEvent ENTITY_GOAT_SCREAMING_AMBIENT = BuiltinSoundEvent.get("minecraft:entity.goat.screaming.ambient"); SoundEvent ENTITY_GOAT_SCREAMING_DEATH = BuiltinSoundEvent.get("minecraft:entity.goat.screaming.death"); @@ -1257,8 +1295,6 @@ interface SoundEvents { SoundEvent ENTITY_GOAT_SCREAMING_RAM_IMPACT = BuiltinSoundEvent.get("minecraft:entity.goat.screaming.ram_impact"); - SoundEvent ENTITY_GOAT_SCREAMING_HORN_BREAK = BuiltinSoundEvent.get("minecraft:entity.goat.screaming.horn_break"); - SoundEvent ENTITY_GOAT_STEP = BuiltinSoundEvent.get("minecraft:entity.goat.step"); SoundEvent BLOCK_GRASS_BREAK = BuiltinSoundEvent.get("minecraft:block.grass.break"); @@ -2033,6 +2069,8 @@ interface SoundEvents { SoundEvent ENTITY_PAINTING_PLACE = BuiltinSoundEvent.get("minecraft:entity.painting.place"); + SoundEvent BLOCK_PALE_HANGING_MOSS_IDLE = BuiltinSoundEvent.get("minecraft:block.pale_hanging_moss.idle"); + SoundEvent ENTITY_PANDA_PRE_SNEEZE = BuiltinSoundEvent.get("minecraft:entity.panda.pre_sneeze"); SoundEvent ENTITY_PANDA_SNEEZE = BuiltinSoundEvent.get("minecraft:entity.panda.sneeze"); @@ -2071,6 +2109,8 @@ interface SoundEvents { SoundEvent ENTITY_PARROT_IMITATE_BREEZE = BuiltinSoundEvent.get("minecraft:entity.parrot.imitate.breeze"); + SoundEvent ENTITY_PARROT_IMITATE_CREAKING = BuiltinSoundEvent.get("minecraft:entity.parrot.imitate.creaking"); + SoundEvent ENTITY_PARROT_IMITATE_CREEPER = BuiltinSoundEvent.get("minecraft:entity.parrot.imitate.creeper"); SoundEvent ENTITY_PARROT_IMITATE_DROWNED = BuiltinSoundEvent.get("minecraft:entity.parrot.imitate.drowned"); @@ -2599,6 +2639,16 @@ interface SoundEvents { SoundEvent PARTICLE_SOUL_ESCAPE = BuiltinSoundEvent.get("minecraft:particle.soul_escape"); + SoundEvent BLOCK_SPAWNER_BREAK = BuiltinSoundEvent.get("minecraft:block.spawner.break"); + + SoundEvent BLOCK_SPAWNER_FALL = BuiltinSoundEvent.get("minecraft:block.spawner.fall"); + + SoundEvent BLOCK_SPAWNER_HIT = BuiltinSoundEvent.get("minecraft:block.spawner.hit"); + + SoundEvent BLOCK_SPAWNER_PLACE = BuiltinSoundEvent.get("minecraft:block.spawner.place"); + + SoundEvent BLOCK_SPAWNER_STEP = BuiltinSoundEvent.get("minecraft:block.spawner.step"); + SoundEvent BLOCK_SPORE_BLOSSOM_BREAK = BuiltinSoundEvent.get("minecraft:block.spore_blossom.break"); SoundEvent BLOCK_SPORE_BLOSSOM_FALL = BuiltinSoundEvent.get("minecraft:block.spore_blossom.fall"); diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 065ca0832..3eca63b50 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -21,7 +21,8 @@ import net.minestom.server.listener.manager.PacketListenerManager; import net.minestom.server.message.ChatType; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.PacketProcessor; +import net.minestom.server.network.packet.PacketParser; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.server.common.PluginMessagePacket; import net.minestom.server.network.packet.server.play.ServerDifficultyPacket; import net.minestom.server.network.socket.Server; @@ -30,7 +31,7 @@ import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.scoreboard.TeamManager; import net.minestom.server.thread.TickSchedulerThread; import net.minestom.server.timer.SchedulerManager; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketSendingUtils; import net.minestom.server.utils.nbt.BinaryTagSerializer; import net.minestom.server.utils.validate.Check; import net.minestom.server.world.Difficulty; @@ -40,7 +41,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnknownNullability; -import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; @@ -80,13 +80,8 @@ public final class MinecraftServer implements MinecraftConstants { @ApiStatus.Internal public static ServerProcess updateProcess() { - ServerProcess process; - try { - process = new ServerProcessImpl(); - serverProcess = process; - } catch (IOException e) { - throw new RuntimeException(e); - } + ServerProcess process = new ServerProcessImpl(); + serverProcess = process; return process; } @@ -108,7 +103,7 @@ public final class MinecraftServer implements MinecraftConstants { */ public static void setBrandName(@NotNull String brandName) { MinecraftServer.brandName = brandName; - PacketUtils.broadcastPlayPacket(PluginMessagePacket.getBrandPacket()); + PacketSendingUtils.broadcastPlayPacket(PluginMessagePacket.brandPacket(brandName)); } /** @@ -128,7 +123,7 @@ public final class MinecraftServer implements MinecraftConstants { */ public static void setDifficulty(@NotNull Difficulty difficulty) { MinecraftServer.difficulty = difficulty; - PacketUtils.broadcastPlayPacket(new ServerDifficultyPacket(difficulty, true)); + PacketSendingUtils.broadcastPlayPacket(new ServerDifficultyPacket(difficulty, true)); } public static @UnknownNullability ServerProcess process() { @@ -188,8 +183,8 @@ public final class MinecraftServer implements MinecraftConstants { return serverProcess.bossBar(); } - public static @NotNull PacketProcessor getPacketProcessor() { - return serverProcess.packetProcessor(); + public static @NotNull PacketParser getPacketParser() { + return serverProcess.packetParser(); } public static boolean isStarted() { diff --git a/src/main/java/net/minestom/server/ServerFlag.java b/src/main/java/net/minestom/server/ServerFlag.java index afd04ba8a..5dcd1dcb2 100644 --- a/src/main/java/net/minestom/server/ServerFlag.java +++ b/src/main/java/net/minestom/server/ServerFlag.java @@ -18,13 +18,7 @@ public final class ServerFlag { public static final int CHUNK_VIEW_DISTANCE = intProperty("minestom.chunk-view-distance", 8); public static final int ENTITY_VIEW_DISTANCE = intProperty("minestom.entity-view-distance", 5); public static final int ENTITY_SYNCHRONIZATION_TICKS = intProperty("minestom.entity-synchronization-ticks", 20); - public static final int WORKER_COUNT = intProperty("minestom.workers", Runtime.getRuntime().availableProcessors()); public static final int DISPATCHER_THREADS = intProperty("minestom.dispatcher-threads", 1); - public static final int MAX_PACKET_SIZE = intProperty("minestom.max-packet-size", 2_097_151); // 3 bytes var-int - public static final int SOCKET_SEND_BUFFER_SIZE = intProperty("minestom.send-buffer-size", 262_143); - public static final int SOCKET_RECEIVE_BUFFER_SIZE = intProperty("minestom.receive-buffer-size", 32_767); - public static final boolean SOCKET_NO_DELAY = booleanProperty("minestom.tcp-no-delay", true); - public static final int POOLED_BUFFER_SIZE = intProperty("minestom.pooled-buffer-size", 262_143); public static final int SEND_LIGHT_AFTER_BLOCK_PLACEMENT_DELAY = intProperty("minestom.send-light-after-block-placement-delay", 100); public static final long LOGIN_PLUGIN_MESSAGE_TIMEOUT = longProperty("minestom.login-plugin-message-timeout", 5_000); @@ -34,6 +28,15 @@ public final class ServerFlag { public static final long KEEP_ALIVE_DELAY = longProperty("minestom.keep-alive-delay", 10_000); public static final long KEEP_ALIVE_KICK = longProperty("minestom.keep-alive-kick", 15_000); + // Network buffers + public static final int MAX_PACKET_SIZE = intProperty("minestom.max-packet-size", 2_097_151); // 3 bytes var-int + public static final int MAX_PACKET_SIZE_PRE_AUTH = intProperty("minestom.max-packet-size-pre-auth", 8_192); + public static final int SOCKET_SEND_BUFFER_SIZE = intProperty("minestom.send-buffer-size", 262_143); + public static final int SOCKET_RECEIVE_BUFFER_SIZE = intProperty("minestom.receive-buffer-size", 32_767); + public static final boolean SOCKET_NO_DELAY = booleanProperty("minestom.tcp-no-delay", true); + public static final int SOCKET_TIMEOUT = intProperty("minestom.socket-timeout", 15_000); + public static final int POOLED_BUFFER_SIZE = intProperty("minestom.pooled-buffer-size", 16_383); + // Chunk update public static final float MIN_CHUNKS_PER_TICK = floatProperty("minestom.chunk-queue.min-per-tick", 0.01f); public static final float MAX_CHUNKS_PER_TICK = floatProperty("minestom.chunk-queue.max-per-tick", 64.0f); @@ -50,6 +53,7 @@ public final class ServerFlag { // Online Mode public static final @NotNull String AUTH_URL = stringProperty("minestom.auth.url", "https://sessionserver.mojang.com/session/minecraft/hasJoined"); + public static final boolean AUTH_PREVENT_PROXY_CONNECTIONS = booleanProperty("minestom.auth.prevent-proxy-connections", false); // World public static final int WORLD_BORDER_SIZE = intProperty("minestom.world-border-size", 29999984); diff --git a/src/main/java/net/minestom/server/ServerProcess.java b/src/main/java/net/minestom/server/ServerProcess.java index 9b058bab2..c231249ec 100644 --- a/src/main/java/net/minestom/server/ServerProcess.java +++ b/src/main/java/net/minestom/server/ServerProcess.java @@ -13,7 +13,8 @@ import net.minestom.server.instance.block.rule.BlockPlacementRule; import net.minestom.server.listener.manager.PacketListenerManager; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.PacketProcessor; +import net.minestom.server.network.packet.PacketParser; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.socket.Server; import net.minestom.server.recipe.RecipeManager; import net.minestom.server.registry.Registries; @@ -99,11 +100,11 @@ public interface ServerProcess extends Registries, Snapshotable { @NotNull PacketListenerManager packetListener(); /** - * Gets the object handling the client packets processing. + * Gets the object handling the client packets parsing. *

* Can be used if you want to convert a buffer to a client packet object. */ - @NotNull PacketProcessor packetProcessor(); + @NotNull PacketParser packetParser(); /** * Exposed socket server. diff --git a/src/main/java/net/minestom/server/ServerProcessImpl.java b/src/main/java/net/minestom/server/ServerProcessImpl.java index 3d6aa9263..375c0813d 100644 --- a/src/main/java/net/minestom/server/ServerProcessImpl.java +++ b/src/main/java/net/minestom/server/ServerProcessImpl.java @@ -27,7 +27,9 @@ import net.minestom.server.message.ChatType; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.PacketProcessor; +import net.minestom.server.network.packet.PacketParser; +import net.minestom.server.network.packet.PacketVanilla; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.socket.Server; import net.minestom.server.recipe.RecipeManager; import net.minestom.server.registry.DynamicRegistry; @@ -37,7 +39,7 @@ import net.minestom.server.thread.Acquirable; import net.minestom.server.thread.ThreadDispatcher; import net.minestom.server.thread.ThreadProvider; import net.minestom.server.timer.SchedulerManager; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketViewableUtils; import net.minestom.server.utils.collection.MappedCollection; import net.minestom.server.utils.nbt.BinaryTagSerializer; import net.minestom.server.world.DimensionType; @@ -77,7 +79,7 @@ final class ServerProcessImpl implements ServerProcess { private final ConnectionManager connection; private final PacketListenerManager packetListener; - private final PacketProcessor packetProcessor; + private final PacketParser packetParser; private final InstanceManager instance; private final BlockManager block; private final CommandManager command; @@ -98,7 +100,7 @@ final class ServerProcessImpl implements ServerProcess { private final AtomicBoolean started = new AtomicBoolean(); private final AtomicBoolean stopped = new AtomicBoolean(); - public ServerProcessImpl() throws IOException { + public ServerProcessImpl() { this.exception = new ExceptionManager(); // The order of initialization here is relevant, we must load the enchantment util registries before the vanilla data is loaded. @@ -122,7 +124,7 @@ final class ServerProcessImpl implements ServerProcess { this.connection = new ConnectionManager(); this.packetListener = new PacketListenerManager(); - this.packetProcessor = new PacketProcessor(packetListener); + this.packetParser = PacketVanilla.CLIENT_PACKET_PARSER; this.instance = new InstanceManager(this); this.block = new BlockManager(); this.command = new CommandManager(); @@ -135,7 +137,7 @@ final class ServerProcessImpl implements ServerProcess { this.bossBar = new BossBarManager(); this.tag = new TagManager(); - this.server = new Server(packetProcessor); + this.server = new Server(packetParser); this.dispatcher = ThreadDispatcher.of(ThreadProvider.counter(), ServerFlag.DISPATCHER_THREADS); this.ticker = new TickerImpl(); @@ -287,8 +289,8 @@ final class ServerProcessImpl implements ServerProcess { } @Override - public @NotNull PacketProcessor packetProcessor() { - return packetProcessor; + public @NotNull PacketParser packetParser() { + return packetParser; } @Override @@ -379,10 +381,7 @@ final class ServerProcessImpl implements ServerProcess { scheduler().processTickEnd(); // Flush all waiting packets - PacketUtils.flush(); - - // Server connection tick - server().tick(); + PacketViewableUtils.flush(); // Monitoring { diff --git a/src/main/java/net/minestom/server/Viewable.java b/src/main/java/net/minestom/server/Viewable.java index 6cf1c0b59..14f66763b 100644 --- a/src/main/java/net/minestom/server/Viewable.java +++ b/src/main/java/net/minestom/server/Viewable.java @@ -5,7 +5,7 @@ import net.minestom.server.adventure.audience.PacketGroupingAudience; import net.minestom.server.entity.Player; import net.minestom.server.network.packet.server.SendablePacket; import net.minestom.server.network.packet.server.ServerPacket; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketSendingUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -60,7 +60,7 @@ public interface Viewable { */ default void sendPacketToViewers(@NotNull SendablePacket packet) { if (packet instanceof ServerPacket serverPacket) { - PacketUtils.sendGroupedPacket(getViewers(), serverPacket); + PacketSendingUtils.sendGroupedPacket(getViewers(), serverPacket); } else { getViewers().forEach(player -> player.sendPacket(packet)); } diff --git a/src/main/java/net/minestom/server/advancements/Notification.java b/src/main/java/net/minestom/server/advancements/Notification.java new file mode 100644 index 000000000..0621fe399 --- /dev/null +++ b/src/main/java/net/minestom/server/advancements/Notification.java @@ -0,0 +1,58 @@ +package net.minestom.server.advancements; + +import net.kyori.adventure.text.Component; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.network.packet.server.play.AdvancementsPacket; + +import java.util.List; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Represents a toast which can be sent to the player using {@link net.minestom.server.entity.Player#sendNotification(Notification)}. + */ +public record Notification(@NotNull Component title, @NotNull FrameType frameType, @NotNull ItemStack icon) { + private static final String IDENTIFIER = "minestom:notification"; + + public Notification(@NotNull Component title, @NotNull FrameType frameType, @NotNull Material icon) { + this(title, frameType, ItemStack.of(icon)); + } + + @ApiStatus.Internal + public @NotNull AdvancementsPacket buildAddPacket() { + // For an advancement to be shown, it must have all of its criteria achieved (progress 100%) + // Create a criteria that we can set to 100% achieved. + final var displayData = new AdvancementsPacket.DisplayData( + title, Component.text("Articdive was here. #Minestom"), + icon, frameType, + 0x6, null, 0f, 0f); + + final var criteria = new AdvancementsPacket.Criteria("minestom:some_criteria", + new AdvancementsPacket.CriterionProgress(System.currentTimeMillis())); + + final var advancement = new AdvancementsPacket.Advancement(null, displayData, + List.of(new AdvancementsPacket.Requirement(List.of(criteria.criterionIdentifier()))), + false); + + final var mapping = new AdvancementsPacket.AdvancementMapping(IDENTIFIER, advancement); + final var progressMapping = new AdvancementsPacket.ProgressMapping(IDENTIFIER, + new AdvancementsPacket.AdvancementProgress(List.of(criteria))); + + return new AdvancementsPacket( + false, + List.of(mapping), + List.of(), + List.of(progressMapping)); + } + + @ApiStatus.Internal + public @NotNull AdvancementsPacket buildRemovePacket() { + return new AdvancementsPacket( + false, + List.of(), + List.of(IDENTIFIER), + List.of()); + } +} diff --git a/src/main/java/net/minestom/server/advancements/notifications/Notification.java b/src/main/java/net/minestom/server/advancements/notifications/Notification.java deleted file mode 100644 index 90660466e..000000000 --- a/src/main/java/net/minestom/server/advancements/notifications/Notification.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.minestom.server.advancements.notifications; - -import net.kyori.adventure.text.Component; -import net.minestom.server.advancements.FrameType; -import net.minestom.server.item.ItemStack; -import net.minestom.server.item.Material; -import org.jetbrains.annotations.NotNull; - -/** - * Represents a message which can be sent using the {@link NotificationCenter}. - */ -public record Notification(@NotNull Component title, @NotNull FrameType frameType, @NotNull ItemStack icon) { - public Notification(@NotNull Component title, @NotNull FrameType frameType, @NotNull Material icon) { - this(title, frameType, ItemStack.of(icon)); - } - - @Deprecated - public @NotNull Component getTitle() { - return title; - } - - @Deprecated - public @NotNull FrameType getFrameType() { - return frameType; - } -} diff --git a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java b/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java deleted file mode 100644 index 5c5326b3c..000000000 --- a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.minestom.server.advancements.notifications; - -import net.kyori.adventure.text.Component; -import net.minestom.server.entity.Player; -import net.minestom.server.network.packet.server.play.AdvancementsPacket; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.List; - -/** - * Used to send one or multiples {@link Notification}. - *

- * Works by sending a completed advancement and remove it immediately. - *

- * You can simply create a {@link Notification} object and call {@link #send(Notification, Player)}. - */ -public final class NotificationCenter { - private static final String IDENTIFIER = "minestom:notification"; - private static final AdvancementsPacket REMOVE_PACKET = new AdvancementsPacket(false, List.of(), List.of(IDENTIFIER), List.of()); - - /** - * Can't create an instance, use the static methods instead. - */ - private NotificationCenter() { - } - - /** - * Send a {@link Notification} to one player. - * - * @param notification the {@link Notification} to send - * @param player the player to send the notification to - */ - public static void send(@NotNull Notification notification, @NotNull Player player) { - player.sendPacket(createPacket(notification)); - player.sendPacket(REMOVE_PACKET); - } - - /** - * Send a {@link Notification} to a collection of players. - * - * @param notification the {@link Notification} to send - * @param players the collection of players to send the notification to - */ - public static void send(@NotNull Notification notification, @NotNull Collection players) { - // Can't use PacketWriterUtils because we need the packets to come in the correct order - players.forEach(player -> send(notification, player)); - } - - /** - * Create the {@link AdvancementsPacket} responsible for showing the Toast to players - * - * @param notification the notification - * @return the packet used to show the Toast - */ - private static AdvancementsPacket createPacket(Notification notification) { - // For An advancement to be shown, it must have all of its criteria achieved (progress 100%) - // Create a Criteria that we can set to 100% achieved. - final var displayData = new AdvancementsPacket.DisplayData( - notification.title(), Component.text("Articdive was here. #Minestom"), - notification.icon(), notification.frameType(), - 0x6, null, 0f, 0f); - - final var criteria = new AdvancementsPacket.Criteria("minestom:some_criteria", - new AdvancementsPacket.CriterionProgress(System.currentTimeMillis())); - - final var advancement = new AdvancementsPacket.Advancement(null, displayData, - List.of(new AdvancementsPacket.Requirement(List.of(criteria.criterionIdentifier()))), - false); - - final var mapping = new AdvancementsPacket.AdvancementMapping(IDENTIFIER, advancement); - final var progressMapping = new AdvancementsPacket.ProgressMapping(IDENTIFIER, - new AdvancementsPacket.AdvancementProgress(List.of(criteria))); - - return new AdvancementsPacket(false, List.of(mapping), List.of(), List.of(progressMapping)); - } -} diff --git a/src/main/java/net/minestom/server/adventure/Localizable.java b/src/main/java/net/minestom/server/adventure/Localizable.java deleted file mode 100644 index b9325a815..000000000 --- a/src/main/java/net/minestom/server/adventure/Localizable.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.minestom.server.adventure; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Locale; - -/** - * Represents something which can have a locale. - */ -public interface Localizable { - - /** - * Gets a localizable that returns {@code null} for all calls to {@link #getLocale()}. - * - * @return the empty localizable - */ - static @NotNull Localizable empty() { - return MinestomAdventure.NULL_LOCALIZABLE; - } - - /** - * Gets the locale. - * - * @return the locale, or {@code null} if they do not have a locale set - */ - @Nullable Locale getLocale(); - - /** - * Sets the locale. This can be set to {@code null} to remove a locale registration. - * - * @param locale the new locale - */ - default void setLocale(@Nullable Locale locale) { - throw new UnsupportedOperationException("You cannot set the locale for this object!"); - } -} diff --git a/src/main/java/net/minestom/server/adventure/MinestomAdventure.java b/src/main/java/net/minestom/server/adventure/MinestomAdventure.java index 10ffcdfa7..3975d8321 100644 --- a/src/main/java/net/minestom/server/adventure/MinestomAdventure.java +++ b/src/main/java/net/minestom/server/adventure/MinestomAdventure.java @@ -30,8 +30,6 @@ public final class MinestomAdventure { // todo: Need to properly add a translator interface so it can check for presence of a key for the flattener. public static BiFunction COMPONENT_TRANSLATOR = GlobalTranslator::render; - static final Localizable NULL_LOCALIZABLE = () -> null; - private static Locale defaultLocale = Locale.getDefault(); private MinestomAdventure() { diff --git a/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java b/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java index 3b512728f..6ce60a2b4 100644 --- a/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java +++ b/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java @@ -10,6 +10,7 @@ import net.kyori.adventure.sound.SoundStop; import net.kyori.adventure.text.Component; import net.kyori.adventure.title.TitlePart; import net.minestom.server.MinecraftServer; +import net.minestom.server.advancements.Notification; import net.minestom.server.adventure.AdventurePacketConvertor; import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Player; @@ -19,7 +20,7 @@ import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.play.ActionBarPacket; import net.minestom.server.network.packet.server.play.ClearTitlesPacket; import net.minestom.server.network.packet.server.play.PlayerListHeaderAndFooterPacket; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketSendingUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -28,7 +29,6 @@ import java.util.Collection; * An audience implementation that sends grouped packets if possible. */ public interface PacketGroupingAudience extends ForwardingAudience { - /** * Creates a packet grouping audience that copies an iterable of players. The * underlying collection is not copied, so changes to the collection will be @@ -54,7 +54,7 @@ public interface PacketGroupingAudience extends ForwardingAudience { * @param packet the packet to broadcast */ default void sendGroupedPacket(@NotNull ServerPacket packet) { - PacketUtils.sendGroupedPacket(getPlayers(), packet); + PacketSendingUtils.sendGroupedPacket(getPlayers(), packet); } @Deprecated @@ -129,6 +129,15 @@ public interface PacketGroupingAudience extends ForwardingAudience { sendGroupedPacket(AdventurePacketConvertor.createSoundStopPacket(stop)); } + /** + * Send a {@link Notification} to the audience. + * @param notification the {@link Notification} to send + */ + default void sendNotification(@NotNull Notification notification) { + sendGroupedPacket(notification.buildAddPacket()); + sendGroupedPacket(notification.buildRemovePacket()); + } + @Override default @NotNull Iterable audiences() { return this.getPlayers(); diff --git a/src/main/java/net/minestom/server/adventure/bossbar/BossBarListener.java b/src/main/java/net/minestom/server/adventure/bossbar/BossBarListener.java index 8d36ec6fd..d05c2514e 100644 --- a/src/main/java/net/minestom/server/adventure/bossbar/BossBarListener.java +++ b/src/main/java/net/minestom/server/adventure/bossbar/BossBarListener.java @@ -3,7 +3,7 @@ package net.minestom.server.adventure.bossbar; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketSendingUtils; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -29,33 +29,32 @@ class BossBarListener implements BossBar.Listener { @Override public void bossBarNameChanged(@NotNull BossBar bar, @NotNull Component oldName, @NotNull Component newName) { - this.doIfRegistered(bar, holder -> PacketUtils.sendGroupedPacket(holder.players, holder.createTitleUpdate(newName))); + this.doIfRegistered(bar, holder -> PacketSendingUtils.sendGroupedPacket(holder.players, holder.createTitleUpdate(newName))); } @Override public void bossBarProgressChanged(@NotNull BossBar bar, float oldProgress, float newProgress) { - this.doIfRegistered(bar, holder -> PacketUtils.sendGroupedPacket(holder.players, holder.createPercentUpdate(newProgress))); + this.doIfRegistered(bar, holder -> PacketSendingUtils.sendGroupedPacket(holder.players, holder.createPercentUpdate(newProgress))); } @Override public void bossBarColorChanged(@NotNull BossBar bar, @NotNull BossBar.Color oldColor, @NotNull BossBar.Color newColor) { - this.doIfRegistered(bar, holder -> PacketUtils.sendGroupedPacket(holder.players, holder.createColorUpdate(newColor))); + this.doIfRegistered(bar, holder -> PacketSendingUtils.sendGroupedPacket(holder.players, holder.createColorUpdate(newColor))); } @Override public void bossBarOverlayChanged(@NotNull BossBar bar, BossBar.@NotNull Overlay oldOverlay, BossBar.@NotNull Overlay newOverlay) { - this.doIfRegistered(bar, holder -> PacketUtils.sendGroupedPacket(holder.players, holder.createOverlayUpdate(newOverlay))); + this.doIfRegistered(bar, holder -> PacketSendingUtils.sendGroupedPacket(holder.players, holder.createOverlayUpdate(newOverlay))); } @Override public void bossBarFlagsChanged(@NotNull BossBar bar, @NotNull Set flagsAdded, @NotNull Set flagsRemoved) { - this.doIfRegistered(bar, holder -> PacketUtils.sendGroupedPacket(holder.players, holder.createFlagsUpdate())); + this.doIfRegistered(bar, holder -> PacketSendingUtils.sendGroupedPacket(holder.players, holder.createFlagsUpdate())); } private void doIfRegistered(@NotNull BossBar bar, @NotNull Consumer consumer) { BossBarHolder holder = this.manager.bars.get(bar); - if (holder != null) { consumer.accept(holder); } diff --git a/src/main/java/net/minestom/server/adventure/bossbar/BossBarManager.java b/src/main/java/net/minestom/server/adventure/bossbar/BossBarManager.java index b1a9fc4b7..7e03508ef 100644 --- a/src/main/java/net/minestom/server/adventure/bossbar/BossBarManager.java +++ b/src/main/java/net/minestom/server/adventure/bossbar/BossBarManager.java @@ -4,7 +4,7 @@ import net.kyori.adventure.audience.Audience; import net.kyori.adventure.bossbar.BossBar; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; -import net.minestom.server.utils.PacketUtils; +import net.minestom.server.utils.PacketSendingUtils; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -75,7 +75,7 @@ public class BossBarManager { BossBarHolder holder = this.getOrCreateHandler(bar); Collection addedPlayers = players.stream().filter(holder::addViewer).toList(); if (!addedPlayers.isEmpty()) { - PacketUtils.sendGroupedPacket(addedPlayers, holder.createAddPacket()); + PacketSendingUtils.sendGroupedPacket(addedPlayers, holder.createAddPacket()); } } @@ -90,7 +90,7 @@ public class BossBarManager { if (holder != null) { Collection removedPlayers = players.stream().filter(holder::removeViewer).toList(); if (!removedPlayers.isEmpty()) { - PacketUtils.sendGroupedPacket(removedPlayers, holder.createRemovePacket()); + PacketSendingUtils.sendGroupedPacket(removedPlayers, holder.createRemovePacket()); } } } @@ -103,7 +103,7 @@ public class BossBarManager { public void destroyBossBar(@NotNull BossBar bossBar) { BossBarHolder holder = this.bars.remove(bossBar); if (holder != null) { - PacketUtils.sendGroupedPacket(holder.players, holder.createRemovePacket()); + PacketSendingUtils.sendGroupedPacket(holder.players, holder.createRemovePacket()); for (Player player : holder.players) { this.removePlayer(player, holder); } diff --git a/src/main/java/net/minestom/server/collision/BoundingBox.java b/src/main/java/net/minestom/server/collision/BoundingBox.java index e6fbb8606..ab89455f1 100644 --- a/src/main/java/net/minestom/server/collision/BoundingBox.java +++ b/src/main/java/net/minestom/server/collision/BoundingBox.java @@ -3,7 +3,7 @@ package net.minestom.server.collision; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Vec; -import net.minestom.server.entity.Entity; +import net.minestom.server.entity.EntityPose; import net.minestom.server.instance.block.BlockFace; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -253,7 +253,7 @@ public record BoundingBox(Vec relativeStart, Vec relativeEnd) implements Shape { } } - public static @Nullable BoundingBox fromPose(@NotNull Entity.Pose pose) { + public static @Nullable BoundingBox fromPose(@NotNull EntityPose pose) { return switch (pose) { case FALL_FLYING, SWIMMING, SPIN_ATTACK -> SMALL; case SLEEPING, DYING -> SLEEPING; diff --git a/src/main/java/net/minestom/server/color/AlphaColor.java b/src/main/java/net/minestom/server/color/AlphaColor.java index 10138425a..d0d68d071 100644 --- a/src/main/java/net/minestom/server/color/AlphaColor.java +++ b/src/main/java/net/minestom/server/color/AlphaColor.java @@ -3,6 +3,7 @@ package net.minestom.server.color; import net.kyori.adventure.util.RGBLike; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.utils.MathUtils; +import net.minestom.server.utils.nbt.BinaryTagSerializer; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; @@ -16,17 +17,11 @@ import java.util.Objects; public final class AlphaColor extends Color { private static final int BIT_MASK = 0xff; - public static final NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type() { - @Override - public void write(@NotNull NetworkBuffer buffer, AlphaColor value) { - buffer.write(NetworkBuffer.INT, value.asARGB()); - } + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.INT.transform(AlphaColor::new, AlphaColor::asARGB); + public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.INT.map(AlphaColor::new, AlphaColor::asARGB); + + public static final AlphaColor WHITE = new AlphaColor(255, 255, 255, 255); - @Override - public AlphaColor read(@NotNull NetworkBuffer buffer) { - return new AlphaColor(buffer.read(NetworkBuffer.INT)); - } - }; private final int alpha; public AlphaColor(int alpha, int red, int green, int blue) { diff --git a/src/main/java/net/minestom/server/color/Color.java b/src/main/java/net/minestom/server/color/Color.java index a825be1ae..f6240e295 100644 --- a/src/main/java/net/minestom/server/color/Color.java +++ b/src/main/java/net/minestom/server/color/Color.java @@ -17,19 +17,15 @@ import java.util.Objects; public class Color implements RGBLike { private static final int BIT_MASK = 0xff; - public static final NetworkBuffer.Type NETWORK_TYPE = new NetworkBuffer.Type() { - @Override - public void write(@NotNull NetworkBuffer buffer, RGBLike value) { - buffer.write(NetworkBuffer.INT, Color.fromRGBLike(value).asRGB()); - } - - @Override - public RGBLike read(@NotNull NetworkBuffer buffer) { - return new Color(buffer.read(NetworkBuffer.INT)); - } - }; + public static final NetworkBuffer.Type NETWORK_TYPE = NetworkBuffer.INT.transform( + Color::new, + color -> Color.fromRGBLike(color).asRGB() + ); public static final BinaryTagSerializer NBT_TYPE = BinaryTagSerializer.INT .map(Color::new, color -> Color.fromRGBLike(color).asRGB()); + + public static final RGBLike WHITE = new Color(255, 255, 255); + private final int red; private final int green; private final int blue; diff --git a/src/main/java/net/minestom/server/command/CommandSender.java b/src/main/java/net/minestom/server/command/CommandSender.java index 20a22bac0..90c5a54cd 100644 --- a/src/main/java/net/minestom/server/command/CommandSender.java +++ b/src/main/java/net/minestom/server/command/CommandSender.java @@ -4,7 +4,6 @@ import net.kyori.adventure.audience.Audience; import net.kyori.adventure.identity.Identified; import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; -import net.minestom.server.permission.PermissionHandler; import net.minestom.server.tag.Taggable; import org.jetbrains.annotations.NotNull; @@ -13,7 +12,7 @@ import org.jetbrains.annotations.NotNull; *

* Main implementations are {@link Player} and {@link ConsoleSender}. */ -public interface CommandSender extends PermissionHandler, Audience, Taggable, Identified { +public interface CommandSender extends Audience, Taggable, Identified { /** * Sends a raw string message. diff --git a/src/main/java/net/minestom/server/command/ConsoleSender.java b/src/main/java/net/minestom/server/command/ConsoleSender.java index d97bc82ae..cd82472b7 100644 --- a/src/main/java/net/minestom/server/command/ConsoleSender.java +++ b/src/main/java/net/minestom/server/command/ConsoleSender.java @@ -1,27 +1,19 @@ package net.minestom.server.command; -import java.util.UUID; - import net.kyori.adventure.audience.MessageType; -import net.kyori.adventure.identity.Identified; import net.kyori.adventure.identity.Identity; import net.kyori.adventure.pointer.Pointers; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.logger.slf4j.ComponentLogger; -import net.minestom.server.permission.Permission; import net.minestom.server.tag.TagHandler; import org.jetbrains.annotations.NotNull; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - /** * Represents the console when sending a command to the server. */ public class ConsoleSender implements CommandSender { private static final ComponentLogger LOGGER = ComponentLogger.logger(ConsoleSender.class); - private final Set permissions = new CopyOnWriteArraySet<>(); private final TagHandler tagHandler = TagHandler.newHandler(); private final Identity identity = Identity.nil(); @@ -39,12 +31,6 @@ public class ConsoleSender implements CommandSender { LOGGER.info(message); } - @NotNull - @Override - public Set getAllPermissions() { - return permissions; - } - @Override public boolean isConsole() { return true; diff --git a/src/main/java/net/minestom/server/command/ServerSender.java b/src/main/java/net/minestom/server/command/ServerSender.java index ee0496e01..000f17a2f 100644 --- a/src/main/java/net/minestom/server/command/ServerSender.java +++ b/src/main/java/net/minestom/server/command/ServerSender.java @@ -3,14 +3,9 @@ package net.minestom.server.command; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.identity.Identity; import net.minestom.server.command.builder.CommandContext; -import net.minestom.server.permission.Permission; import net.minestom.server.tag.TagHandler; import org.jetbrains.annotations.NotNull; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - /** * Sender used in {@link CommandManager#executeServerCommand(String)}. *

@@ -20,14 +15,8 @@ import java.util.Set; */ public class ServerSender implements CommandSender { - private final Set permissions = Collections.unmodifiableSet(new HashSet<>()); private final TagHandler tagHandler = TagHandler.newHandler(); - @NotNull - @Override - public Set getAllPermissions() { - return permissions; - } @Override public @NotNull TagHandler tagHandler() { diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index 497924a2e..945508bf1 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.ArgumentCallback; import net.minestom.server.command.builder.Command; @@ -7,9 +8,6 @@ import net.minestom.server.command.builder.CommandExecutor; import net.minestom.server.command.builder.arguments.minecraft.SuggestionType; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.command.builder.suggestion.SuggestionCallback; -import net.minestom.server.registry.Registry; -import net.minestom.server.registry.StaticProtocolObject; -import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,17 +27,6 @@ import java.util.function.Supplier; * @param the type of this parsed argument */ public abstract class Argument { - @ApiStatus.Internal - public static final Registry.Container CONTAINER = Registry.createStaticContainer(Registry.Resource.COMMAND_ARGUMENTS, - (namespace, properties) -> new ArgumentImpl(NamespaceID.from(namespace), properties.getInt("id"))); - - record ArgumentImpl(NamespaceID namespace, int id) implements StaticProtocolObject { - @Override - public String toString() { - return name(); - } - } - private final String id; protected final boolean allowSpace; protected final boolean useRemaining; @@ -105,7 +92,7 @@ public abstract class Argument { */ public abstract @NotNull T parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException; - public abstract String parser(); + public abstract ArgumentParserType parser(); public byte @Nullable [] nodeProperties() { return null; @@ -325,7 +312,7 @@ public abstract class Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return argument.parser(); } @@ -359,7 +346,7 @@ public abstract class Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return argument.parser(); } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java index 92f1d9f06..5e9dfc7d1 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -29,8 +30,8 @@ public class ArgumentBoolean extends Argument { } @Override - public String parser() { - return "brigadier:bool"; + public ArgumentParserType parser() { + return ArgumentParserType.BOOL; } @Override public String toString() { diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java index 5ffe90d35..6f5608faa 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java @@ -1,6 +1,7 @@ package net.minestom.server.command.builder.arguments; import net.minestom.server.MinecraftServer; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.CommandDispatcher; import net.minestom.server.command.builder.CommandResult; @@ -8,6 +9,7 @@ import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.utils.StringUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class ArgumentCommand extends Argument { @@ -36,7 +38,7 @@ public class ArgumentCommand extends Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return null; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java index da100c8c5..f88d49789 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -41,7 +42,7 @@ public class ArgumentEnum extends Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return null; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java index f65b28e5c..6a1c6c732 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentGroup.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.CommandContext; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -39,7 +40,7 @@ public class ArgumentGroup extends Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return null; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java index 7f45dadae..dd0ffcb13 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -22,7 +23,7 @@ public class ArgumentLiteral extends Argument { } @Override - public String parser() { + public ArgumentParserType parser() { return null; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java index aa5065da1..a7ac36b61 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLoop.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.utils.StringUtils; @@ -62,7 +63,7 @@ public class ArgumentLoop extends Argument> { } @Override - public String parser() { + public ArgumentParserType parser() { return null; } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java index 6c6f78039..0f408948e 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java @@ -1,9 +1,10 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +import net.minestom.server.network.NetworkBuffer; import net.minestom.server.utils.StringUtils; -import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,15 +32,13 @@ public class ArgumentString extends Argument { } @Override - public String parser() { - return "brigadier:string"; + public ArgumentParserType parser() { + return ArgumentParserType.STRING; } @Override public byte @Nullable [] nodeProperties() { - return BinaryWriter.makeArray(packetWriter -> { - packetWriter.writeVarInt(1); // Quotable phrase - }); + return NetworkBuffer.makeArray(NetworkBuffer.VAR_INT, 1); // Quotable phrase } /** diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java index 3e41f18d7..d02c31547 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java @@ -1,8 +1,9 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; +import net.minestom.server.network.NetworkBuffer; import net.minestom.server.utils.StringUtils; -import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,15 +27,13 @@ public class ArgumentStringArray extends Argument { } @Override - public String parser() { - return "brigadier:string"; + public ArgumentParserType parser() { + return ArgumentParserType.STRING; } @Override public byte @Nullable [] nodeProperties() { - return BinaryWriter.makeArray(packetWriter -> { - packetWriter.writeVarInt(2); // Greedy phrase - }); + return NetworkBuffer.makeArray(NetworkBuffer.VAR_INT, 2); // Greedy phrase } @Override diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java index 8dcbc8933..27f1e6633 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java @@ -1,9 +1,10 @@ package net.minestom.server.command.builder.arguments; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +import net.minestom.server.network.NetworkBuffer; import net.minestom.server.utils.StringUtils; -import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -69,15 +70,13 @@ public class ArgumentWord extends Argument { } @Override - public String parser() { - return "brigadier:string"; + public ArgumentParserType parser() { + return ArgumentParserType.STRING; } @Override public byte @Nullable [] nodeProperties() { - return BinaryWriter.makeArray(packetWriter -> { - packetWriter.writeVarInt(0); // Single word - }); + return NetworkBuffer.makeArray(NetworkBuffer.VAR_INT, 0); // Single word } /** diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java index 94637ec97..6a5a2f59c 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentBlockState.java @@ -1,5 +1,6 @@ package net.minestom.server.command.builder.arguments.minecraft; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -24,8 +25,8 @@ public class ArgumentBlockState extends Argument { } @Override - public String parser() { - return "minecraft:block_state"; + public @NotNull ArgumentParserType parser() { + return ArgumentParserType.BLOCK_STATE; } /** diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java index 1163dc3fe..c38f7d51d 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java @@ -2,6 +2,7 @@ package net.minestom.server.command.builder.arguments.minecraft; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; +import net.minestom.server.command.ArgumentParserType; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; @@ -40,8 +41,8 @@ public class ArgumentColor extends Argument