From 1e05eb880063528d24d1025b5b23caa8fe5f523e Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 20 Nov 2025 22:48:45 +0100 Subject: [PATCH 01/20] Fix MC-304369 to fix build --- .../neodev/e2e/RunProductionClient.java | 1 + .../net/minecraft/client/Options.java.patch | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/buildSrc/src/main/java/net/neoforged/neodev/e2e/RunProductionClient.java b/buildSrc/src/main/java/net/neoforged/neodev/e2e/RunProductionClient.java index 65c67495fc4..9d04f9dfb18 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/e2e/RunProductionClient.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/e2e/RunProductionClient.java @@ -144,6 +144,7 @@ public void exec() { spec.environment(getEnvironment()); applyVersionManifest(installDir, versionId, placeholders, librariesDir, spec); + spec.args("--offlineDeveloperMode"); // Suppress complaints about the invalid access token }); } diff --git a/patches/net/minecraft/client/Options.java.patch b/patches/net/minecraft/client/Options.java.patch index 435740b3f5e..5322ce630fb 100644 --- a/patches/net/minecraft/client/Options.java.patch +++ b/patches/net/minecraft/client/Options.java.patch @@ -1,5 +1,56 @@ --- a/net/minecraft/client/Options.java +++ b/net/minecraft/client/Options.java +@@ -181,6 +_,7 @@ + new OptionInstance.IntRange(2, 128, true), + 128, + p_454151_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + Minecraft.getInstance().levelRenderer.getCloudRenderer().markForRebuild(); + this.setGraphicsPresetToCustom(); + } +@@ -197,6 +_,7 @@ + private static final Component GRAPHICS_TOOLTIP_CUTOUT_LEAVES = Component.translatable("options.cutoutLeaves.tooltip"); + private final OptionInstance cutoutLeaves = OptionInstance.createBoolean( + "options.cutoutLeaves", OptionInstance.cachedConstantTooltip(GRAPHICS_TOOLTIP_CUTOUT_LEAVES), true, p_454154_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + Minecraft.getInstance().levelRenderer.allChanged(); + this.setGraphicsPresetToCustom(); + } +@@ -213,12 +_,14 @@ + if (p_454138_ && gpuwarnlistmanager.willShowWarning()) { + gpuwarnlistmanager.showWarning(); + } else { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + minecraft.levelRenderer.allChanged(); + this.setGraphicsPresetToCustom(); + } + } + ); + private final OptionInstance ambientOcclusion = OptionInstance.createBoolean("options.ao", true, p_454143_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + Minecraft.getInstance().levelRenderer.allChanged(); + this.setGraphicsPresetToCustom(); + }); +@@ -457,6 +_,7 @@ + int i = p_232017_ * 2 + 1; + return genericValueLabel(p_232016_, Component.translatable("options.biomeBlendRadius." + i)); + }, new OptionInstance.IntRange(0, 7, false), 2, p_454145_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + Minecraft.getInstance().levelRenderer.allChanged(); + this.setGraphicsPresetToCustom(); + } +@@ -772,7 +_,10 @@ + new OptionInstance.IntRange(30, 110), + Codec.DOUBLE.xmap(p_232007_ -> (int)(p_232007_ * 40.0 + 70.0), p_232009_ -> (p_232009_.intValue() - 70.0) / 40.0), + 70, +- p_231992_ -> Minecraft.getInstance().levelRenderer.needsUpdate() ++ p_231992_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. ++ Minecraft.getInstance().levelRenderer.needsUpdate(); ++ } + ); + private static final Component TELEMETRY_TOOLTIP = Component.translatable( + "options.telemetry.button.tooltip", Component.translatable("options.telemetry.state.minimal"), Component.translatable("options.telemetry.state.all") @@ -903,9 +_,10 @@ } }, @@ -29,6 +80,14 @@ this.minecraft = p_92138_; this.optionsFile = new File(p_92139_, "options.txt"); boolean flag = Runtime.getRuntime().maxMemory() >= 1000000000L; +@@ -1410,6 +_,7 @@ + new OptionInstance.IntRange(2, flag ? 32 : 16, false), + 12, + p_454147_ -> { ++ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. + Minecraft.getInstance().levelRenderer.needsUpdate(); + this.setGraphicsPresetToCustom(); + } @@ -1423,6 +_,7 @@ p_461224_ -> this.setGraphicsPresetToCustom() ); From edb361213b17b6b148ab486550b33ede0a916bfd Mon Sep 17 00:00:00 2001 From: XFactHD Date: Thu, 20 Nov 2025 22:06:23 +0100 Subject: [PATCH 02/20] Fix RenderTypeHelper.getEntityRenderType() returning the wrong translucent render type --- .../client/renderer/ItemBlockRenderTypes.java.patch | 9 +-------- .../net/neoforged/neoforge/client/RenderTypeHelper.java | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/patches/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch b/patches/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch index b980de04ed9..c905543cca4 100644 --- a/patches/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch +++ b/patches/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch @@ -26,7 +26,7 @@ public static RenderType getMovingBlockRenderType(BlockState p_109294_) { Block block = p_109294_.getBlock(); if (block instanceof LeavesBlock) { -@@ -391,11 +_,15 @@ +@@ -391,6 +_,8 @@ } } @@ -35,13 +35,6 @@ public static RenderType getRenderType(BlockState p_366653_) { ChunkSectionLayer chunksectionlayer = getChunkRenderType(p_366653_); return chunksectionlayer == ChunkSectionLayer.TRANSLUCENT ? Sheets.translucentBlockItemSheet() : Sheets.cutoutBlockSheet(); - } - -+ /** @deprecated Neo: See {@link net.minecraft.client.renderer.item.BlockModelWrapper#renderType}. */ -+ @Deprecated // Note: this method does NOT support model-based render types - public static ChunkSectionLayer getRenderLayer(FluidState p_109288_) { - ChunkSectionLayer chunksectionlayer = LAYER_BY_FLUID.get(p_109288_.getType()); - return chunksectionlayer != null ? chunksectionlayer : ChunkSectionLayer.SOLID; @@ -403,5 +_,30 @@ public static void setCutoutLeaves(boolean p_455116_) { diff --git a/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java b/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java index 0961dcb1fc4..c8522f2aef6 100644 --- a/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java +++ b/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java @@ -27,7 +27,7 @@ public final class RenderTypeHelper { public static RenderType getEntityRenderType(ChunkSectionLayer chunkSectionLayer) { if (chunkSectionLayer != ChunkSectionLayer.TRANSLUCENT) return Sheets.cutoutBlockSheet(); - return Sheets.translucentItemSheet(); + return Sheets.translucentBlockItemSheet(); } /** From 7d5759b258e6caec5f546f9e4dc65e32125c7b59 Mon Sep 17 00:00:00 2001 From: Dennis C Date: Fri, 21 Nov 2025 00:42:15 +0100 Subject: [PATCH 03/20] [1.21.11] Split "entity" render type in RenderTypeGroup into separate types for block and item atlas (#2817) --- .../item/BlockModelWrapper.java.patch | 2 +- .../neoforge/client/ClientNeoForgeMod.java | 2 +- .../client/NamedRenderTypeManager.java | 11 ++--- .../neoforge/client/NeoForgeRenderTypes.java | 46 +++++++++---------- .../neoforge/client/RenderTypeGroup.java | 20 ++++++-- .../neoforge/client/RenderTypeHelper.java | 38 +++++++++++++++ .../event/RegisterNamedRenderTypesEvent.java | 6 +-- .../item/DynamicFluidContainerModel.java | 15 ++++-- 8 files changed, 95 insertions(+), 45 deletions(-) diff --git a/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch b/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch index 114749c5c02..033b46f2b04 100644 --- a/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch +++ b/patches/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch @@ -16,7 +16,7 @@ - Function function = BlockModelWrapper.detectRenderType(list); + var renderTypeGroup = resolvedmodel.getTopAdditionalProperties().getOptional( + net.neoforged.neoforge.client.model.NeoForgeModelProperties.RENDER_TYPE); -+ Function function = renderTypeGroup == null ? BlockModelWrapper.detectRenderType(list) : ignored -> renderTypeGroup.entity(); ++ Function function = renderTypeGroup == null ? BlockModelWrapper.detectRenderType(list) : net.neoforged.neoforge.client.RenderTypeHelper.detectItemModelRenderType(list, renderTypeGroup); return new BlockModelWrapper(this.tints, list, modelrenderproperties, function); } diff --git a/src/client/java/net/neoforged/neoforge/client/ClientNeoForgeMod.java b/src/client/java/net/neoforged/neoforge/client/ClientNeoForgeMod.java index 5da32f25aba..b6815ebf9eb 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientNeoForgeMod.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientNeoForgeMod.java @@ -190,7 +190,7 @@ static void onRegisterReloadListeners(AddClientReloadListenersEvent event) { @SubscribeEvent static void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register(Identifier.fromNamespaceAndPath("neoforge", "item_unlit"), ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get()); + event.register(Identifier.fromNamespaceAndPath("neoforge", "item_unlit"), ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes::getUnlitUnsortedTranslucent); } @SubscribeEvent diff --git a/src/client/java/net/neoforged/neoforge/client/NamedRenderTypeManager.java b/src/client/java/net/neoforged/neoforge/client/NamedRenderTypeManager.java index 22e8e0dc208..9323773efb5 100644 --- a/src/client/java/net/neoforged/neoforge/client/NamedRenderTypeManager.java +++ b/src/client/java/net/neoforged/neoforge/client/NamedRenderTypeManager.java @@ -43,13 +43,10 @@ public static void init() { * Pre-registers vanilla render types. */ private static void preRegisterVanillaRenderTypes(Map blockRenderTypes) { - blockRenderTypes.put(Identifier.withDefaultNamespace("solid"), new RenderTypeGroup(ChunkSectionLayer.SOLID, NeoForgeRenderTypes.ITEM_LAYERED_SOLID.get())); - blockRenderTypes.put(Identifier.withDefaultNamespace("cutout"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT, NeoForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); - // Generally entity/item rendering shouldn't use mipmaps, so cutout_mipped has them off by default. To enforce them, use cutout_mipped_all. - // TODO 1.21.11: Investigate how to deal with block atlas/item atlas split -> blockRenderTypes.put(Identifier.withDefaultNamespace("cutout_mipped"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT_MIPPED, NeoForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); - // TODO 1.21.11: Investigate how to deal with block atlas/item atlas split -> blockRenderTypes.put(Identifier.withDefaultNamespace("cutout_mipped_all"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT_MIPPED, NeoForgeRenderTypes.ITEM_LAYERED_CUTOUT_MIPPED.get())); - blockRenderTypes.put(Identifier.withDefaultNamespace("translucent"), new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); - blockRenderTypes.put(Identifier.withDefaultNamespace("tripwire"), new RenderTypeGroup(ChunkSectionLayer.TRIPWIRE, NeoForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); + blockRenderTypes.put(Identifier.withDefaultNamespace("solid"), new RenderTypeGroup(ChunkSectionLayer.SOLID, NeoForgeRenderTypes::getItemLayeredSolid)); + blockRenderTypes.put(Identifier.withDefaultNamespace("cutout"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT, NeoForgeRenderTypes::getItemLayeredCutout)); + blockRenderTypes.put(Identifier.withDefaultNamespace("translucent"), new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes::getItemLayeredTranslucent)); + blockRenderTypes.put(Identifier.withDefaultNamespace("tripwire"), new RenderTypeGroup(ChunkSectionLayer.TRIPWIRE, NeoForgeRenderTypes::getItemLayeredTranslucent)); } private NamedRenderTypeManager() {} diff --git a/src/client/java/net/neoforged/neoforge/client/NeoForgeRenderTypes.java b/src/client/java/net/neoforged/neoforge/client/NeoForgeRenderTypes.java index 7b725f08dc8..c8940d3031b 100644 --- a/src/client/java/net/neoforged/neoforge/client/NeoForgeRenderTypes.java +++ b/src/client/java/net/neoforged/neoforge/client/NeoForgeRenderTypes.java @@ -14,6 +14,7 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.rendertype.RenderTypes; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.resources.Identifier; import net.minecraft.util.Util; @@ -21,13 +22,18 @@ @SuppressWarnings("deprecation") public enum NeoForgeRenderTypes { - ITEM_LAYERED_SOLID(() -> getItemLayeredSolid(TextureAtlas.LOCATION_BLOCKS)), - ITEM_LAYERED_CUTOUT(() -> getItemLayeredCutout(TextureAtlas.LOCATION_BLOCKS)), - ITEM_LAYERED_CUTOUT_MIPPED(() -> getItemLayeredCutoutMipped(TextureAtlas.LOCATION_BLOCKS)), - ITEM_LAYERED_TRANSLUCENT(() -> getItemLayeredTranslucent(TextureAtlas.LOCATION_BLOCKS)), - ITEM_UNSORTED_TRANSLUCENT(() -> getUnsortedTranslucent(TextureAtlas.LOCATION_BLOCKS)), - ITEM_UNLIT_TRANSLUCENT(() -> getUnlitTranslucent(TextureAtlas.LOCATION_BLOCKS)), - ITEM_UNSORTED_UNLIT_TRANSLUCENT(() -> getUnlitTranslucent(TextureAtlas.LOCATION_BLOCKS, false)); + BLOCK_ITEM_LAYERED_SOLID(() -> getItemLayeredSolid(TextureAtlas.LOCATION_BLOCKS)), + BLOCK_ITEM_LAYERED_CUTOUT(() -> getItemLayeredCutout(TextureAtlas.LOCATION_BLOCKS)), + BLOCK_ITEM_LAYERED_TRANSLUCENT(() -> getItemLayeredTranslucent(TextureAtlas.LOCATION_BLOCKS)), + BLOCK_ITEM_UNSORTED_TRANSLUCENT(() -> getUnsortedTranslucent(TextureAtlas.LOCATION_BLOCKS)), + BLOCK_ITEM_UNLIT_TRANSLUCENT(() -> getUnlitTranslucent(TextureAtlas.LOCATION_BLOCKS)), + BLOCK_ITEM_UNSORTED_UNLIT_TRANSLUCENT(() -> getUnlitUnsortedTranslucent(TextureAtlas.LOCATION_BLOCKS)), + ITEM_LAYERED_SOLID(() -> getItemLayeredSolid(TextureAtlas.LOCATION_ITEMS)), + ITEM_LAYERED_CUTOUT(() -> getItemLayeredCutout(TextureAtlas.LOCATION_ITEMS)), + ITEM_LAYERED_TRANSLUCENT(() -> getItemLayeredTranslucent(TextureAtlas.LOCATION_ITEMS)), + ITEM_UNSORTED_TRANSLUCENT(() -> getUnsortedTranslucent(TextureAtlas.LOCATION_ITEMS)), + ITEM_UNLIT_TRANSLUCENT(() -> getUnlitTranslucent(TextureAtlas.LOCATION_ITEMS)), + ITEM_UNSORTED_UNLIT_TRANSLUCENT(() -> getUnlitUnsortedTranslucent(TextureAtlas.LOCATION_ITEMS)); // TODO 1.21.11: Some render types previously enabled linear filtering, this intends to be equivalent, but was not checked. Also check the mipmap flag. private static final Supplier LINEAR_FILTERING_SAMPLER = () -> RenderSystem.getSamplerCache() @@ -47,13 +53,6 @@ public static RenderType getItemLayeredCutout(Identifier textureLocation) { return Internal.LAYERED_ITEM_CUTOUT.apply(textureLocation); } - /** - * @return A RenderType fit for multi-layer cutout-mipped item rendering. - */ - public static RenderType getItemLayeredCutoutMipped(Identifier textureLocation) { - return Internal.LAYERED_ITEM_CUTOUT_MIPPED.apply(textureLocation); - } - /** * @return A RenderType fit for multi-layer translucent item rendering. */ @@ -79,56 +78,55 @@ public static RenderType getUnlitTranslucent(Identifier textureLocation) { /** * @return A RenderType fit for translucent item/entity rendering, but with diffuse lighting disabled * so that fullbright quads look correct. - * @param sortingEnabled If false, depth sorting will not be performed. */ - public static RenderType getUnlitTranslucent(Identifier textureLocation, boolean sortingEnabled) { - return (sortingEnabled ? Internal.UNLIT_TRANSLUCENT_SORTED : Internal.UNLIT_TRANSLUCENT_UNSORTED).apply(textureLocation); + public static RenderType getUnlitUnsortedTranslucent(Identifier textureLocation) { + return Internal.UNLIT_TRANSLUCENT_UNSORTED.apply(textureLocation); } /** - * @return Same as {@link RenderType#entityCutout(Identifier)}, but with mipmapping enabled. + * @return Same as {@link RenderTypes#entityCutout(Identifier)}, but with mipmapping enabled. */ public static RenderType getEntityCutoutMipped(Identifier textureLocation) { return Internal.LAYERED_ITEM_CUTOUT_MIPPED.apply(textureLocation); } /** - * @return Replacement of {@link RenderType#text(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#text(Identifier)}, but with linear texture filtering. */ public static RenderType getTextFiltered(Identifier locationIn) { return Internal.TEXT_FILTERED.apply(locationIn); } /** - * @return Replacement of {@link RenderType#textIntensity(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#textIntensity(Identifier)}, but with linear texture filtering. */ public static RenderType getTextIntensityFiltered(Identifier locationIn) { return Internal.TEXT_INTENSITY_FILTERED.apply(locationIn); } /** - * @return Replacement of {@link RenderType#textPolygonOffset(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#textPolygonOffset(Identifier)}, but with linear texture filtering. */ public static RenderType getTextPolygonOffsetFiltered(Identifier locationIn) { return Internal.TEXT_POLYGON_OFFSET_FILTERED.apply(locationIn); } /** - * @return Replacement of {@link RenderType#textIntensityPolygonOffset(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#textIntensityPolygonOffset(Identifier)}, but with linear texture filtering. */ public static RenderType getTextIntensityPolygonOffsetFiltered(Identifier locationIn) { return Internal.TEXT_INTENSITY_POLYGON_OFFSET_FILTERED.apply(locationIn); } /** - * @return Replacement of {@link RenderType#textSeeThrough(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#textSeeThrough(Identifier)}, but with linear texture filtering. */ public static RenderType getTextSeeThroughFiltered(Identifier locationIn) { return Internal.TEXT_SEETHROUGH_FILTERED.apply(locationIn); } /** - * @return Replacement of {@link RenderType#textIntensitySeeThrough(Identifier)}, but with linear texture filtering. + * @return Replacement of {@link RenderTypes#textIntensitySeeThrough(Identifier)}, but with linear texture filtering. */ public static RenderType getTextIntensitySeeThroughFiltered(Identifier locationIn) { return Internal.TEXT_INTENSITY_SEETHROUGH_FILTERED.apply(locationIn); diff --git a/src/client/java/net/neoforged/neoforge/client/RenderTypeGroup.java b/src/client/java/net/neoforged/neoforge/client/RenderTypeGroup.java index e0a4e110a36..072e9bccd0d 100644 --- a/src/client/java/net/neoforged/neoforge/client/RenderTypeGroup.java +++ b/src/client/java/net/neoforged/neoforge/client/RenderTypeGroup.java @@ -5,20 +5,32 @@ package net.neoforged.neoforge.client; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import java.util.function.Function; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.Identifier; /** * A set of functionally equivalent shaders. One using {@link com.mojang.blaze3d.vertex.DefaultVertexFormat#BLOCK}, - * and the other one using {@link com.mojang.blaze3d.vertex.DefaultVertexFormat#NEW_ENTITY}. + * and the other two using {@link com.mojang.blaze3d.vertex.DefaultVertexFormat#NEW_ENTITY}. */ -public record RenderTypeGroup(ChunkSectionLayer block, RenderType entity) { +public record RenderTypeGroup(ChunkSectionLayer block, RenderType entityBlock, RenderType entityItem) { public RenderTypeGroup { - if ((block == null) != (entity == null)) + if ((block == null) != (entityBlock == null) || (block == null) != (entityItem == null)) { throw new IllegalArgumentException("The render types in a group must either be all null, or all non-null."); + } + if (entityBlock != null && (entityBlock.format() != DefaultVertexFormat.NEW_ENTITY || entityItem.format() != DefaultVertexFormat.NEW_ENTITY)) { + throw new IllegalArgumentException("The entity render types must use DefaultVertexFormat.NEW_ENTITY."); + } } - public static RenderTypeGroup EMPTY = new RenderTypeGroup(null, null); + public RenderTypeGroup(ChunkSectionLayer block, Function entity) { + this(block, entity.apply(TextureAtlas.LOCATION_BLOCKS), entity.apply(TextureAtlas.LOCATION_ITEMS)); + } + + public static RenderTypeGroup EMPTY = new RenderTypeGroup(null, null, null); /** * {@return true if this group has render types or not. It either has all, or none} diff --git a/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java b/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java index c8522f2aef6..ddde6ee305c 100644 --- a/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java +++ b/src/client/java/net/neoforged/neoforge/client/RenderTypeHelper.java @@ -6,17 +6,26 @@ package net.neoforged.neoforge.client; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import java.util.Iterator; +import java.util.List; +import java.util.function.Function; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockModelPart; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.item.BlockModelWrapper; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; /** * Provides helper functions replacing those in {@link ItemBlockRenderTypes}. */ +@SuppressWarnings("deprecation") public final class RenderTypeHelper { /** * Provides a {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for the given {@link DefaultVertexFormat#BLOCK} format. @@ -45,5 +54,34 @@ public static RenderType getMovingBlockRenderType(ChunkSectionLayer chunkSection }; } + /** + * Determines whether the provided quads need use textures from the block atlas or the item atlas and returns the + * respective {@link RenderType} getter. + *

+ * Mimics the behavior of vanilla's {@link BlockModelWrapper#detectRenderType(List)}. + */ + public static Function detectItemModelRenderType(List quads, RenderTypeGroup renderTypes) { + Iterator iterator = quads.iterator(); + if (!iterator.hasNext()) { + return $ -> renderTypes.entityItem(); + } + + Identifier atlasId = iterator.next().sprite().atlasLocation(); + while (iterator.hasNext()) { + Identifier currAtlasId = iterator.next().sprite().atlasLocation(); + if (!currAtlasId.equals(atlasId)) { + throw new IllegalStateException("Multiple atlases used in model, expected " + atlasId + ", but also got " + currAtlasId); + } + } + + if (atlasId.equals(TextureAtlas.LOCATION_ITEMS)) { + return $ -> renderTypes.entityItem(); + } + if (atlasId.equals(TextureAtlas.LOCATION_BLOCKS)) { + return $ -> renderTypes.entityBlock(); + } + throw new IllegalArgumentException("Atlas " + atlasId + " can't be used for item models"); + } + private RenderTypeHelper() {} } diff --git a/src/client/java/net/neoforged/neoforge/client/event/RegisterNamedRenderTypesEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RegisterNamedRenderTypesEvent.java index 5e79b44c44d..871496a1794 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RegisterNamedRenderTypesEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RegisterNamedRenderTypesEvent.java @@ -8,6 +8,7 @@ import com.google.common.base.Preconditions; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import java.util.Map; +import java.util.function.Function; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.resources.Identifier; @@ -38,11 +39,10 @@ public RegisterNamedRenderTypesEvent(Map renderType * * @param key The ID of the group * @param chunkLayer The {@link ChunkSectionLayer} to render blocks with as part of the terrain - * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} + * @param entityRenderType A factory for a {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} with the atlas passed to the function */ - public void register(Identifier key, ChunkSectionLayer chunkLayer, RenderType entityRenderType) { + public void register(Identifier key, ChunkSectionLayer chunkLayer, Function entityRenderType) { Preconditions.checkArgument(!renderTypes.containsKey(key), "Render type already registered: " + key); - Preconditions.checkArgument(entityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The entity render type must use the NEW_ENTITY vertex format."); renderTypes.put(key, new RenderTypeGroup(chunkLayer, entityRenderType)); } } diff --git a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java index eea30d3fad5..6a0aa70aa69 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java @@ -39,6 +39,7 @@ import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.NeoForgeRenderTypes; import net.neoforged.neoforge.client.RenderTypeGroup; +import net.neoforged.neoforge.client.RenderTypeHelper; import net.neoforged.neoforge.client.color.item.FluidContentsTint; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.client.model.ComposedModelState; @@ -60,9 +61,11 @@ public class DynamicFluidContainerModel implements ItemModel { private static final Transformation FLUID_TRANSFORM = new Transformation(new Vector3f(), new Quaternionf(), new Vector3f(1, 1, 1.002f), new Quaternionf()); private static final Transformation COVER_TRANSFORM = new Transformation(new Vector3f(), new Quaternionf(), new Vector3f(1, 1, 1.004f), new Quaternionf()); private static final ModelDebugName DEBUG_NAME = () -> "DynamicFluidContainerModel"; + private static final RenderTypeGroup RENDER_TYPES_DEFAULT = new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes::getUnsortedTranslucent); + private static final RenderTypeGroup RENDER_TYPES_UNLIT = new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, NeoForgeRenderTypes::getUnlitTranslucent); private static RenderTypeGroup getLayerRenderTypes(boolean unlit) { - return new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, unlit ? NeoForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get() : NeoForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get()); + return unlit ? RENDER_TYPES_UNLIT : RENDER_TYPES_DEFAULT; } private final Unbaked unbakedModel; @@ -114,7 +117,8 @@ private ItemModel bakeModelForFluid(Fluid fluid) { // Base texture var unbaked = UnbakedElementsHelper.createUnbakedItemElements(0, baseSprite); var quads = UnbakedElementsHelper.bakeElements(unbaked, $ -> baseSprite, state); - subModels.add(new BlockModelWrapper(List.of(), quads, renderProperties, stack -> normalRenderTypes.entity())); + var renderType = RenderTypeHelper.detectItemModelRenderType(quads, normalRenderTypes); + subModels.add(new BlockModelWrapper(List.of(), quads, renderProperties, renderType)); } if (fluidMaskLocation != null && fluidSprite != null) { @@ -125,10 +129,10 @@ private ItemModel bakeModelForFluid(Fluid fluid) { var quads = UnbakedElementsHelper.bakeElements(unbaked, $ -> fluidSprite, transformedState); // Bake with fluid texture var emissive = unbakedModel.applyFluidLuminosity && fluid.getFluidType().getLightLevel() > 0; - var renderTypes = getLayerRenderTypes(emissive); + var renderType = RenderTypeHelper.detectItemModelRenderType(quads, getLayerRenderTypes(emissive)); if (emissive) QuadTransformers.settingMaxEmissivity().processInPlace(quads); - subModels.add(new BlockModelWrapper(List.of(FluidContentsTint.INSTANCE), quads, renderProperties, stack -> renderTypes.entity())); + subModels.add(new BlockModelWrapper(List.of(FluidContentsTint.INSTANCE), quads, renderProperties, renderType)); } if (coverSprite != null) { @@ -137,7 +141,8 @@ private ItemModel bakeModelForFluid(Fluid fluid) { var transformedState = new ComposedModelState(state, COVER_TRANSFORM); var unbaked = UnbakedElementsHelper.createUnbakedItemMaskElements(0, coverSprite); // Use cover as mask var quads = UnbakedElementsHelper.bakeElements(unbaked, $ -> sprite, transformedState); // Bake with selected texture - subModels.add(new BlockModelWrapper(List.of(), quads, renderProperties, stack -> normalRenderTypes.entity())); + var renderType = RenderTypeHelper.detectItemModelRenderType(quads, normalRenderTypes); + subModels.add(new BlockModelWrapper(List.of(), quads, renderProperties, renderType)); } return new CompositeModel(subModels); From 80998ca34d4550768066c2d30ea19a494f340c64 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 21 Nov 2025 18:42:27 +0100 Subject: [PATCH 04/20] Update to 1.21.11-pre2 --- gradle.properties | 4 +- .../net/minecraft/client/Options.java.patch | 36 ++++-------- .../client/player/LocalPlayer.java.patch | 8 +-- .../client/renderer/LevelRenderer.java.patch | 50 ++++++++-------- .../texture/MipmapGenerator.java.patch | 4 +- .../server/level/ServerPlayer.java.patch | 54 ++++++++--------- .../world/entity/player/Player.java.patch | 58 +++++++++---------- .../projectile/ProjectileUtil.java.patch | 4 +- .../world/level/block/ChestBlock.java.patch | 2 +- 9 files changed, 102 insertions(+), 118 deletions(-) diff --git a/gradle.properties b/gradle.properties index 687f7197d8b..e825b72a384 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,8 +16,8 @@ diffpatch_version=2.0.0.35 java_version=21 -minecraft_version=1.21.11-pre1 -neoform_version=20251119.112005 +minecraft_version=1.21.11-pre2 +neoform_version=20251121.153702 # on snapshot versions, used to prefix the version neoforge_snapshot_next_stable=21.11 diff --git a/patches/net/minecraft/client/Options.java.patch b/patches/net/minecraft/client/Options.java.patch index 5322ce630fb..9abe78d085c 100644 --- a/patches/net/minecraft/client/Options.java.patch +++ b/patches/net/minecraft/client/Options.java.patch @@ -1,14 +1,6 @@ --- a/net/minecraft/client/Options.java +++ b/net/minecraft/client/Options.java -@@ -181,6 +_,7 @@ - new OptionInstance.IntRange(2, 128, true), - 128, - p_454151_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - Minecraft.getInstance().levelRenderer.getCloudRenderer().markForRebuild(); - this.setGraphicsPresetToCustom(); - } -@@ -197,6 +_,7 @@ +@@ -201,6 +_,7 @@ private static final Component GRAPHICS_TOOLTIP_CUTOUT_LEAVES = Component.translatable("options.cutoutLeaves.tooltip"); private final OptionInstance cutoutLeaves = OptionInstance.createBoolean( "options.cutoutLeaves", OptionInstance.cachedConstantTooltip(GRAPHICS_TOOLTIP_CUTOUT_LEAVES), true, p_454154_ -> { @@ -16,7 +8,7 @@ Minecraft.getInstance().levelRenderer.allChanged(); this.setGraphicsPresetToCustom(); } -@@ -213,12 +_,14 @@ +@@ -217,12 +_,14 @@ if (p_454138_ && gpuwarnlistmanager.willShowWarning()) { gpuwarnlistmanager.showWarning(); } else { @@ -31,7 +23,7 @@ Minecraft.getInstance().levelRenderer.allChanged(); this.setGraphicsPresetToCustom(); }); -@@ -457,6 +_,7 @@ +@@ -461,6 +_,7 @@ int i = p_232017_ * 2 + 1; return genericValueLabel(p_232016_, Component.translatable("options.biomeBlendRadius." + i)); }, new OptionInstance.IntRange(0, 7, false), 2, p_454145_ -> { @@ -39,7 +31,7 @@ Minecraft.getInstance().levelRenderer.allChanged(); this.setGraphicsPresetToCustom(); } -@@ -772,7 +_,10 @@ +@@ -776,7 +_,10 @@ new OptionInstance.IntRange(30, 110), Codec.DOUBLE.xmap(p_232007_ -> (int)(p_232007_ * 40.0 + 70.0), p_232009_ -> (p_232009_.intValue() - 70.0) / 40.0), 70, @@ -51,7 +43,7 @@ ); private static final Component TELEMETRY_TOOLTIP = Component.translatable( "options.telemetry.button.tooltip", Component.translatable("options.telemetry.state.minimal"), Component.translatable("options.telemetry.state.all") -@@ -903,9 +_,10 @@ +@@ -907,9 +_,10 @@ } }, new OptionInstance.LazyEnum<>( @@ -63,7 +55,7 @@ && !Minecraft.getInstance().getSoundManager().getAvailableSoundDevices().contains(p_232011_) ? Optional.empty() : Optional.of(p_232011_), -@@ -1027,7 +_,7 @@ +@@ -1031,7 +_,7 @@ this.incompatibleResourcePacks.clear(); for (Pack pack : p_275268_.getSelectedPacks()) { @@ -72,7 +64,7 @@ this.resourcePacks.add(pack.getId()); if (!pack.getCompatibility().isCompatible()) { this.incompatibleResourcePacks.add(pack.getId()); -@@ -1400,6 +_,7 @@ +@@ -1404,6 +_,7 @@ } public Options(Minecraft p_92138_, File p_92139_) { @@ -80,15 +72,7 @@ this.minecraft = p_92138_; this.optionsFile = new File(p_92139_, "options.txt"); boolean flag = Runtime.getRuntime().maxMemory() >= 1000000000L; -@@ -1410,6 +_,7 @@ - new OptionInstance.IntRange(2, flag ? 32 : 16, false), - 12, - p_454147_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - Minecraft.getInstance().levelRenderer.needsUpdate(); - this.setGraphicsPresetToCustom(); - } -@@ -1423,6 +_,7 @@ +@@ -1431,6 +_,7 @@ p_461224_ -> this.setGraphicsPresetToCustom() ); this.syncWrites = Util.getPlatform() == Util.OS.WINDOWS; @@ -96,7 +80,7 @@ this.load(); } -@@ -1554,10 +_,14 @@ +@@ -1562,10 +_,14 @@ p_168428_.process("musicFrequency", this.musicFrequency); for (KeyMapping keymapping : this.keyMappings) { @@ -113,7 +97,7 @@ } } -@@ -1847,6 +_,23 @@ +@@ -1855,6 +_,23 @@ } p_92146_.setSelected(set); diff --git a/patches/net/minecraft/client/player/LocalPlayer.java.patch b/patches/net/minecraft/client/player/LocalPlayer.java.patch index 0a823d9d150..163eb367726 100644 --- a/patches/net/minecraft/client/player/LocalPlayer.java.patch +++ b/patches/net/minecraft/client/player/LocalPlayer.java.patch @@ -24,7 +24,7 @@ } @Override -@@ -773,6 +_,7 @@ +@@ -768,6 +_,7 @@ && this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.CROUCHING) && (this.isShiftKeyDown() || !this.isSleeping() && !this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.STANDING)); this.input.tick(); @@ -32,7 +32,7 @@ this.minecraft.getTutorial().onInput(this.input); boolean flag3 = false; if (this.autoJumpTime > 0) { -@@ -817,7 +_,7 @@ +@@ -812,7 +_,7 @@ } boolean flag4 = false; @@ -41,7 +41,7 @@ if (this.minecraft.gameMode.isSpectator()) { if (!abilities.flying) { abilities.flying = true; -@@ -914,7 +_,7 @@ +@@ -909,7 +_,7 @@ } private boolean shouldStopSwimSprinting() { @@ -50,7 +50,7 @@ } public Portal.Transition getActivePortalLocalTransition() { -@@ -959,6 +_,10 @@ +@@ -954,6 +_,10 @@ @Override public void rideTick() { super.rideTick(); diff --git a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch index 2ea00e078cb..2c57e7fd5a2 100644 --- a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/LevelRenderer.java +++ b/net/minecraft/client/renderer/LevelRenderer.java -@@ -488,7 +_,7 @@ +@@ -490,7 +_,7 @@ profilerfiller.push("entities"); this.extractVisibleEntities(p_109604_, frustum, p_348530_, this.levelRenderState); profilerfiller.popPush("blockEntities"); @@ -9,7 +9,7 @@ profilerfiller.popPush("blockOutline"); this.extractBlockOutline(p_109604_, this.levelRenderState); profilerfiller.popPush("blockBreaking"); -@@ -502,6 +_,10 @@ +@@ -504,6 +_,10 @@ .extract( this.level.getWorldBorder(), f, vec3, this.minecraft.options.getEffectiveRenderDistance() * 16, this.levelRenderState.worldBorderRenderState ); @@ -20,7 +20,7 @@ profilerfiller.pop(); profilerfiller.popPush("debug"); this.debugRenderer.emitGizmos(frustum, vec3.x, vec3.y, vec3.z, p_348530_.getGameTimeDeltaPartialTick(false)); -@@ -514,7 +_,7 @@ +@@ -516,7 +_,7 @@ this.targets.main = framegraphbuilder.importExternal("main", this.minecraft.getMainRenderTarget()); int i = this.minecraft.getMainRenderTarget().width; int j = this.minecraft.getMainRenderTarget().height; @@ -29,7 +29,7 @@ PostChain postchain = this.getTransparencyChain(); if (postchain != null) { this.targets.translucent = framegraphbuilder.createInternal("translucent", rendertargetdescriptor); -@@ -528,6 +_,9 @@ +@@ -530,6 +_,9 @@ this.targets.entityOutline = framegraphbuilder.importExternal("entity_outline", this.entityOutlineTarget); } @@ -39,7 +39,7 @@ FramePass framepass = framegraphbuilder.addPass("clear"); this.targets.main = framepass.readsAndWrites(this.targets.main); framepass.executes( -@@ -541,7 +_,7 @@ +@@ -543,7 +_,7 @@ } ); if (p_426302_) { @@ -48,7 +48,7 @@ } this.addMainPass(framegraphbuilder, frustum, p_254120_, p_425977_, p_109603_, this.levelRenderState, p_348530_, profilerfiller); -@@ -551,17 +_,17 @@ +@@ -553,17 +_,17 @@ } this.minecraft.particleEngine.extract(this.particlesRenderState, new Frustum(frustum).offset(-3.0F), p_109604_, f); @@ -69,7 +69,7 @@ if (postchain != null) { postchain.addToFrame(framegraphbuilder, i, j, this.targets); } -@@ -635,6 +_,9 @@ +@@ -637,6 +_,9 @@ ChunkSectionsToRender chunksectionstorender = this.prepareChunkRenders(p_362420_, d0, d1, d2); chunksectionstorender.renderGroup(ChunkSectionLayerGroup.OPAQUE, this.chunkLayerSampler); @@ -79,7 +79,7 @@ this.minecraft.gameRenderer.getLighting().setupFor(Lighting.Entry.LEVEL); if (resourcehandle2 != null) { resourcehandle2.get().copyDepthFrom(this.minecraft.getMainRenderTarget()); -@@ -669,6 +_,8 @@ +@@ -671,6 +_,8 @@ multibuffersource$buffersource.endBatch(Sheets.hangingSignSheet()); multibuffersource$buffersource.endBatch(Sheets.chestSheet()); this.renderBuffers.outlineBufferSource().endOutlineBatch(); @@ -88,7 +88,7 @@ if (p_363964_) { this.renderBlockOutline(multibuffersource$buffersource, posestack, false, p_451509_); } -@@ -698,8 +_,12 @@ +@@ -700,8 +_,12 @@ p_362234_.push("translucent"); chunksectionstorender.renderGroup(ChunkSectionLayerGroup.TRANSLUCENT, this.chunkLayerSampler); @@ -101,7 +101,7 @@ if (p_363964_) { this.renderBlockOutline(multibuffersource$buffersource, posestack, true, p_451509_); } -@@ -710,7 +_,15 @@ +@@ -712,7 +_,15 @@ ); } @@ -117,7 +117,7 @@ FramePass framepass = p_363357_.addPass("particles"); if (this.targets.particles != null) { this.targets.particles = framepass.readsAndWrites(this.targets.particles); -@@ -730,12 +_,24 @@ +@@ -732,12 +_,24 @@ this.particlesRenderState.submit(this.submitNodeStorage, this.levelRenderState.cameraRenderState); this.featureRenderDispatcher.renderAllFeatures(); this.particlesRenderState.reset(); @@ -142,7 +142,7 @@ FramePass framepass = p_361907_.addPass("clouds"); if (this.targets.clouds != null) { this.targets.clouds = framepass.readsAndWrites(this.targets.clouds); -@@ -743,10 +_,22 @@ +@@ -745,10 +_,22 @@ this.targets.main = framepass.readsAndWrites(this.targets.main); } @@ -166,7 +166,7 @@ int i = this.minecraft.options.getEffectiveRenderDistance() * 16; float f = this.minecraft.gameRenderer.getDepthFar(); FramePass framepass = p_364025_.addPass("weather"); -@@ -761,6 +_,9 @@ +@@ -763,6 +_,9 @@ MultiBufferSource.BufferSource multibuffersource$buffersource = this.renderBuffers.bufferSource(); CameraRenderState camerarenderstate = this.levelRenderState.cameraRenderState; this.weatherEffectRenderer.render(multibuffersource$buffersource, camerarenderstate.pos, this.levelRenderState.weatherRenderState); @@ -176,7 +176,7 @@ this.worldBorderRenderer.render(this.levelRenderState.worldBorderRenderState, camerarenderstate.pos, i, f); multibuffersource$buffersource.endBatch(); }); -@@ -813,7 +_,7 @@ +@@ -815,7 +_,7 @@ || p_435924_.isDetached() || p_435924_.entity() instanceof LivingEntity && ((LivingEntity)p_435924_.entity()).isSleeping() ) @@ -185,7 +185,7 @@ if (entity.tickCount == 0) { entity.xOld = entity.getX(); entity.yOld = entity.getY(); -@@ -826,6 +_,9 @@ +@@ -828,6 +_,9 @@ if (entityrenderstate.appearsGlowing() && flag) { p_450957_.haveGlowingEntities = true; } @@ -195,7 +195,7 @@ } } } -@@ -855,12 +_,21 @@ +@@ -857,12 +_,21 @@ } } @@ -217,7 +217,7 @@ for (SectionRenderDispatcher.RenderSection sectionrenderdispatcher$rendersection : this.visibleSections) { List list = sectionrenderdispatcher$rendersection.getSectionMesh().getRenderableBlockEntities(); -@@ -879,9 +_,12 @@ +@@ -881,9 +_,12 @@ } BlockEntityRenderState blockentityrenderstate = this.blockEntityRenderDispatcher @@ -231,7 +231,7 @@ } } } -@@ -894,9 +_,12 @@ +@@ -896,9 +_,12 @@ if (blockentity1.isRemoved()) { iterator.remove(); } else { @@ -245,7 +245,7 @@ } } } -@@ -964,19 +_,23 @@ +@@ -966,19 +_,23 @@ BlockPos blockpos = blockhitresult.getBlockPos(); BlockState blockstate = this.level.getBlockState(blockpos); if (!blockstate.isAir() && this.level.getWorldBorder().isWithinBounds(blockpos)) { @@ -272,7 +272,7 @@ } } } -@@ -986,6 +_,14 @@ +@@ -988,6 +_,14 @@ private void renderBlockOutline(MultiBufferSource.BufferSource p_362782_, PoseStack p_361893_, boolean p_361698_, LevelRenderState p_451577_) { BlockOutlineRenderState blockoutlinerenderstate = p_451577_.blockOutlineRenderState; if (blockoutlinerenderstate != null) { @@ -287,7 +287,7 @@ if (blockoutlinerenderstate.isTranslucent() == p_361698_) { Vec3 vec3 = p_451577_.cameraRenderState.pos; if (blockoutlinerenderstate.highContrast()) { -@@ -1166,7 +_,15 @@ +@@ -1168,7 +_,15 @@ } } @@ -303,7 +303,7 @@ FogType fogtype = p_362177_.getFluidInCamera(); if (fogtype != FogType.POWDER_SNOW && fogtype != FogType.LAVA && !this.doesMobEffectBlockSky(p_362177_)) { SkyRenderState skyrenderstate = this.levelRenderState.skyRenderState; -@@ -1177,6 +_,7 @@ +@@ -1179,6 +_,7 @@ this.targets.main = framepass.readsAndWrites(this.targets.main); framepass.executes( () -> { @@ -311,7 +311,7 @@ RenderSystem.setShaderFog(p_418294_); if (skyrenderstate.skybox == DimensionType.Skybox.END) { skyrenderer.renderEndSky(); -@@ -1203,6 +_,10 @@ +@@ -1205,6 +_,10 @@ skyrenderer.renderDarkDisc(); } } @@ -322,7 +322,7 @@ } ); } -@@ -1457,7 +_,7 @@ +@@ -1459,7 +_,7 @@ } else { int i = p_412967_.packedBrightness(p_109538_, p_109540_); int j = LightTexture.block(i); @@ -331,7 +331,7 @@ if (j < k) { int l = LightTexture.sky(i); return LightTexture.pack(k, l); -@@ -1514,6 +_,22 @@ +@@ -1516,6 +_,22 @@ public CloudRenderer getCloudRenderer() { return this.cloudRenderer; diff --git a/patches/net/minecraft/client/renderer/texture/MipmapGenerator.java.patch b/patches/net/minecraft/client/renderer/texture/MipmapGenerator.java.patch index ea668b7b67c..dadc91d2347 100644 --- a/patches/net/minecraft/client/renderer/texture/MipmapGenerator.java.patch +++ b/patches/net/minecraft/client/renderer/texture/MipmapGenerator.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/texture/MipmapGenerator.java +++ b/net/minecraft/client/renderer/texture/MipmapGenerator.java -@@ -113,12 +_,15 @@ +@@ -112,12 +_,15 @@ float f = p_459088_ == MipmapStrategy.STRICT_CUTOUT ? 0.3F : 0.5F; float f1 = flag ? alphaTestCoverage(p_251300_[0], f, 1.0F) : 0.0F; @@ -17,7 +17,7 @@ int j = nativeimage1.getWidth(); int k = nativeimage1.getHeight(); -@@ -137,6 +_,7 @@ +@@ -136,6 +_,7 @@ nativeimage1.setPixel(l, i1, j2); } diff --git a/patches/net/minecraft/server/level/ServerPlayer.java.patch b/patches/net/minecraft/server/level/ServerPlayer.java.patch index c5bed66cfbf..ca64d9ca8a3 100644 --- a/patches/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -317,6 +_,10 @@ +@@ -313,6 +_,10 @@ } private void broadcastDataValue(AbstractContainerMenu p_143455_, int p_143456_, int p_143457_) { @@ -11,7 +11,7 @@ ServerPlayer.this.connection.send(new ClientboundContainerSetDataPacket(p_143455_.containerId, p_143456_, p_143457_)); } -@@ -366,6 +_,7 @@ +@@ -362,6 +_,7 @@ private Set> requestedDebugSubscriptions = Set.of(); private int containerCounter; public boolean wonGame; @@ -19,7 +19,7 @@ public ServerPlayer(MinecraftServer p_254143_, ServerLevel p_254435_, GameProfile p_253651_, ClientInformation p_301997_) { super(p_254435_, p_253651_); -@@ -665,7 +_,11 @@ +@@ -661,7 +_,11 @@ } if (!this.isSleeping()) { @@ -32,7 +32,7 @@ } } -@@ -720,6 +_,11 @@ +@@ -716,6 +_,11 @@ this.connection.send(new ClientboundSetExperiencePacket(this.experienceProgress, this.totalExperience, this.experienceLevel)); } @@ -44,7 +44,7 @@ if (this.tickCount % 20 == 0) { CriteriaTriggers.LOCATION.trigger(this); } -@@ -733,7 +_,7 @@ +@@ -729,7 +_,7 @@ private void synchronizeSpecialItemUpdates(ItemStack p_372884_) { MapId mapid = p_372884_.get(DataComponents.MAP_ID); @@ -53,7 +53,7 @@ if (mapitemsaveddata != null) { Packet packet = mapitemsaveddata.getUpdatePacket(mapid, this); if (packet != null) { -@@ -882,6 +_,7 @@ +@@ -878,6 +_,7 @@ @Override public void die(DamageSource p_9035_) { this.gameEvent(GameEvent.ENTITY_DIE); @@ -61,7 +61,7 @@ boolean flag = this.level().getGameRules().get(GameRules.SHOW_DEATH_MESSAGES); if (flag) { Component component = this.getCombatTracker().getDeathMessage(); -@@ -1070,7 +_,7 @@ +@@ -1066,7 +_,7 @@ return BedBlock.findStandUpPosition(EntityType.PLAYER, p_348505_, blockpos, blockstate.getValue(BedBlock.FACING), f) .map(p_450850_ -> ServerPlayer.RespawnPosAngle.of(p_450850_, blockpos, 0.0F)); } else if (!flag) { @@ -70,7 +70,7 @@ } else { boolean flag1 = block.isPossibleToRespawnInThis(blockstate); BlockState blockstate1 = p_348505_.getBlockState(blockpos.above()); -@@ -1092,6 +_,7 @@ +@@ -1088,6 +_,7 @@ } public @Nullable ServerPlayer teleport(TeleportTransition p_379854_) { @@ -78,7 +78,7 @@ if (this.isRemoved()) { return null; } else { -@@ -1119,7 +_,7 @@ +@@ -1115,7 +_,7 @@ PlayerList playerlist = this.server.getPlayerList(); playerlist.sendPlayerPermissionLevel(this); serverlevel1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); @@ -87,7 +87,7 @@ ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push("moving"); if (resourcekey == Level.OVERWORLD && serverlevel.dimension() == Level.NETHER) { -@@ -1139,11 +_,15 @@ +@@ -1135,11 +_,15 @@ playerlist.sendLevelInfo(this, serverlevel); playerlist.sendAllPlayerInfo(this); playerlist.sendActivePlayerEffects(this); @@ -103,7 +103,7 @@ return this; } } -@@ -1185,8 +_,19 @@ +@@ -1181,8 +_,19 @@ @Override public Either startSleepInBed(BlockPos p_9115_) { @@ -124,7 +124,7 @@ BedRule bedrule = this.level().environmentAttributes().getValue(EnvironmentAttributes.BED_RULE, p_9115_); boolean flag = bedrule.canSleep(this.level()); boolean flag1 = bedrule.canSetSpawn(this.level()); -@@ -1222,6 +_,23 @@ +@@ -1218,6 +_,23 @@ } } @@ -148,7 +148,7 @@ Either either = super.startSleepInBed(p_9115_).ifRight(p_466339_ -> { this.awardStat(Stats.SLEEP_IN_BED); CriteriaTriggers.SLEPT_IN_BED.trigger(this); -@@ -1234,8 +_,6 @@ +@@ -1230,8 +_,6 @@ return either; } } @@ -157,7 +157,7 @@ } } -@@ -1246,6 +_,7 @@ +@@ -1242,6 +_,7 @@ } private boolean bedInRange(BlockPos p_9117_, Direction p_9118_) { @@ -165,7 +165,7 @@ return this.isReachableBedBlock(p_9117_) || this.isReachableBedBlock(p_9117_.relative(p_9118_.getOpposite())); } -@@ -1329,11 +_,19 @@ +@@ -1325,11 +_,19 @@ @Override public OptionalInt openMenu(@Nullable MenuProvider p_9033_) { @@ -185,7 +185,7 @@ } this.nextContainerCounter(); -@@ -1345,10 +_,32 @@ +@@ -1341,10 +_,32 @@ return OptionalInt.empty(); } else { @@ -218,7 +218,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -1370,6 +_,7 @@ +@@ -1366,6 +_,7 @@ this.connection.send(new ClientboundMountScreenOpenPacket(this.containerCounter, i, p_478702_.getId())); this.containerMenu = new HorseInventoryMenu(this.containerCounter, this.getInventory(), p_9060_, p_478702_, i); this.initMenu(this.containerMenu); @@ -226,7 +226,7 @@ } @Override -@@ -1411,6 +_,7 @@ +@@ -1407,6 +_,7 @@ public void doCloseContainer() { this.containerMenu.removed(this); this.inventoryMenu.transferState(this.containerMenu); @@ -234,7 +234,7 @@ this.containerMenu = this.inventoryMenu; } -@@ -1641,6 +_,15 @@ +@@ -1637,6 +_,15 @@ this.setShoulderEntityLeft(p_9016_.getShoulderEntityLeft()); this.setShoulderEntityRight(p_9016_.getShoulderEntityRight()); this.setLastDeathLocation(p_9016_.getLastDeathLocation()); @@ -250,7 +250,7 @@ } @Override -@@ -1745,6 +_,8 @@ +@@ -1741,6 +_,8 @@ public boolean setGameMode(GameType p_143404_) { boolean flag = this.isSpectator(); @@ -259,7 +259,7 @@ if (!this.gameMode.changeGameModeForPlayer(p_143404_)) { return false; } else { -@@ -1914,6 +_,7 @@ +@@ -1910,6 +_,7 @@ public void setCamera(@Nullable Entity p_9214_) { Entity entity = this.getCamera(); this.camera = (Entity)(p_9214_ == null ? this : p_9214_); @@ -267,7 +267,7 @@ if (entity != this.camera) { if (this.camera.level() instanceof ServerLevel serverlevel) { this.teleportTo(serverlevel, this.camera.getX(), this.camera.getY(), this.camera.getZ(), Set.of(), this.getYRot(), this.getXRot(), false); -@@ -1949,7 +_,11 @@ +@@ -1945,7 +_,11 @@ } public @Nullable Component getTabListDisplayName() { @@ -280,7 +280,7 @@ } public int getTabListOrder() { -@@ -1983,6 +_,7 @@ +@@ -1979,6 +_,7 @@ } public void setRespawnPosition(ServerPlayer.@Nullable RespawnConfig p_405460_, boolean p_9162_) { @@ -288,7 +288,7 @@ if (p_9162_ && p_405460_ != null && !p_405460_.isSamePosition(this.respawnConfig)) { this.sendSystemMessage(SPAWN_SET_MESSAGE); } -@@ -2037,6 +_,75 @@ +@@ -2016,6 +_,75 @@ return itementity; } @@ -364,7 +364,7 @@ public TextFilter getTextFilter() { return this.textFilter; } -@@ -2051,6 +_,7 @@ +@@ -2030,6 +_,7 @@ } private GameType calculateGameModeForNewPlayer(@Nullable GameType p_143424_) { @@ -372,7 +372,7 @@ GameType gametype = this.server.getForcedGameType(); if (gametype != null) { return gametype; -@@ -2087,6 +_,9 @@ +@@ -2066,6 +_,9 @@ public void drop(boolean p_182295_) { Inventory inventory = this.getInventory(); @@ -382,7 +382,7 @@ ItemStack itemstack = inventory.removeFromSelected(p_182295_); this.containerMenu .findSlot(inventory, inventory.getSelectedSlot()) -@@ -2096,6 +_,7 @@ +@@ -2075,6 +_,7 @@ } this.drop(itemstack, false, true); diff --git a/patches/net/minecraft/world/entity/player/Player.java.patch b/patches/net/minecraft/world/entity/player/Player.java.patch index a6f493a71e8..0c8063235fb 100644 --- a/patches/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/net/minecraft/world/entity/player/Player.java.patch @@ -74,7 +74,7 @@ if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose pose = this.getDesiredPose(); Pose pose1; -@@ -533,6 +_,7 @@ +@@ -530,6 +_,7 @@ @Override public void die(DamageSource p_36152_) { @@ -82,7 +82,7 @@ super.die(p_36152_); this.reapplyPosition(); if (!this.isSpectator() && this.level() instanceof ServerLevel serverlevel) { -@@ -589,10 +_,18 @@ +@@ -586,10 +_,18 @@ } public @Nullable ItemEntity drop(ItemStack p_36177_, boolean p_36178_) { @@ -102,7 +102,7 @@ float f = this.inventory.getSelectedItem().getDestroySpeed(p_36282_); if (f > 1.0F) { f += (float)this.getAttributeValue(Attributes.MINING_EFFICIENCY); -@@ -621,13 +_,19 @@ +@@ -618,13 +_,19 @@ f /= 5.0F; } @@ -122,7 +122,7 @@ @Override protected void readAdditionalSaveData(ValueInput p_422427_) { super.readAdditionalSaveData(p_422427_); -@@ -702,7 +_,8 @@ +@@ -699,7 +_,8 @@ return false; } else { this.removeEntitiesOnShoulder(); @@ -132,7 +132,7 @@ if (p_376451_.getDifficulty() == Difficulty.PEACEFUL) { p_376389_ = 0.0F; } -@@ -760,11 +_,14 @@ +@@ -757,11 +_,14 @@ @Override protected void actuallyHurt(ServerLevel p_376500_, DamageSource p_36312_, float p_36313_) { if (!this.isInvulnerableTo(p_376500_, p_36312_)) { @@ -152,7 +152,7 @@ if (f > 0.0F && f < 3.4028235E37F) { this.awardStat(Stats.DAMAGE_ABSORBED, Math.round(f * 10.0F)); } -@@ -778,7 +_,9 @@ +@@ -775,7 +_,9 @@ } this.gameEvent(GameEvent.ENTITY_DAMAGE); @@ -162,7 +162,7 @@ } } -@@ -834,6 +_,8 @@ +@@ -831,6 +_,8 @@ return InteractionResult.PASS; } else { @@ -171,7 +171,7 @@ ItemStack itemstack = this.getItemInHand(p_36159_); ItemStack itemstack1 = itemstack.copy(); InteractionResult interactionresult = p_36158_.interact(this, p_36159_); -@@ -842,6 +_,9 @@ +@@ -839,6 +_,9 @@ itemstack.setCount(itemstack1.getCount()); } @@ -181,7 +181,7 @@ return interactionresult; } else { if (!itemstack.isEmpty() && p_36158_ instanceof LivingEntity) { -@@ -853,6 +_,7 @@ +@@ -850,6 +_,7 @@ if (interactionresult1.consumesAction()) { this.level().gameEvent(GameEvent.ENTITY_INTERACT, p_36158_.position(), GameEvent.Context.of(this)); if (itemstack.isEmpty() && !this.hasInfiniteMaterials()) { @@ -189,7 +189,7 @@ this.setItemInHand(p_36159_, ItemStack.EMPTY); } -@@ -882,6 +_,7 @@ +@@ -879,6 +_,7 @@ } @Override @@ -197,7 +197,7 @@ protected Vec3 maybeBackOffFromEdge(Vec3 p_36201_, MoverType p_36202_) { float f = this.maxUpStep(); if (!this.abilities.flying -@@ -931,6 +_,7 @@ +@@ -928,6 +_,7 @@ } } @@ -205,7 +205,7 @@ private boolean isAboveGround(float p_341626_) { return this.onGround() || this.fallDistance < p_341626_ && !this.canFallAtLeast(0.0, 0.0, p_341626_ - this.fallDistance); } -@@ -952,6 +_,7 @@ +@@ -949,6 +_,7 @@ } public void attack(Entity p_36347_) { @@ -213,7 +213,7 @@ if (!this.cannotAttack(p_36347_)) { float f = this.isAutoSpinAttack() ? this.autoSpinAttackDmg : (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); ItemStack itemstack = this.getWeaponItem(); -@@ -973,12 +_,22 @@ +@@ -970,12 +_,22 @@ f += itemstack.getItem().getAttackDamageBonus(p_36347_, f, damagesource); boolean flag2 = flag && this.canCriticalAttack(p_36347_); @@ -238,7 +238,7 @@ float f4 = 0.0F; if (p_36347_ instanceof LivingEntity livingentity) { f4 = livingentity.getHealth(); -@@ -989,7 +_,8 @@ +@@ -986,7 +_,8 @@ if (flag4) { this.causeExtraKnockback(p_36347_, this.getKnockback(p_36347_, damagesource) + (flag1 ? 0.5F : 0.0F), vec3); if (flag3) { @@ -248,7 +248,7 @@ } this.attackVisualEffects(p_36347_, flag2, flag3, flag, f2); -@@ -1046,7 +_,8 @@ +@@ -1043,7 +_,8 @@ double d0 = this.getKnownMovement().horizontalDistanceSqr(); double d1 = this.getSpeed() * 2.5; if (d0 < Mth.square(d1)) { @@ -258,7 +258,7 @@ } } -@@ -1082,11 +_,12 @@ +@@ -1079,11 +_,12 @@ private void itemAttackInteraction(Entity p_455471_, ItemStack p_456074_, DamageSource p_455954_, boolean p_458145_) { Entity entity = p_455471_; @@ -273,7 +273,7 @@ if (this.level() instanceof ServerLevel serverlevel) { if (entity instanceof LivingEntity livingentity) { flag = p_456074_.hurtEnemy(livingentity, this); -@@ -1103,6 +_,7 @@ +@@ -1100,6 +_,7 @@ } if (p_456074_.isEmpty()) { @@ -281,7 +281,7 @@ if (p_456074_ == this.getMainHandItem()) { this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } else { -@@ -1139,17 +_,24 @@ +@@ -1136,17 +_,24 @@ return 1.0F; } @@ -308,7 +308,7 @@ float f1 = this.getEnchantedDamage(livingentity, f, p_455188_) * p_455105_; if (livingentity.hurtServer(serverlevel, p_455188_, f1)) { livingentity.knockback(0.4F, Mth.sin(this.getYRot() * (float) (Math.PI / 180.0)), -Mth.cos(this.getYRot() * (float) (Math.PI / 180.0))); -@@ -1308,6 +_,7 @@ +@@ -1305,6 +_,7 @@ } public void stopSleepInBed(boolean p_36226_, boolean p_36227_) { @@ -316,7 +316,7 @@ super.stopSleeping(); if (this.level() instanceof ServerLevel && p_36227_) { ((ServerLevel)this.level()).updateSleepingPlayerList(); -@@ -1413,7 +_,8 @@ +@@ -1410,7 +_,8 @@ @Override public boolean causeFallDamage(double p_397701_, float p_150093_, DamageSource p_150095_) { @@ -326,7 +326,7 @@ return false; } else { if (p_397701_ >= 2.0) { -@@ -1468,13 +_,13 @@ +@@ -1465,13 +_,13 @@ protected void playStepSound(BlockPos p_282121_, BlockState p_282194_) { if (this.isInWater()) { this.waterSwimSound(); @@ -342,7 +342,7 @@ } else { super.playStepSound(blockpos, blockstate); } -@@ -1505,6 +_,10 @@ +@@ -1502,6 +_,10 @@ } public void giveExperiencePoints(int p_36291_) { @@ -353,7 +353,7 @@ this.increaseScore(p_36291_); this.experienceProgress = this.experienceProgress + (float)p_36291_ / this.getXpNeededForNextLevel(); this.totalExperience = Mth.clamp(this.totalExperience + p_36291_, 0, Integer.MAX_VALUE); -@@ -1532,7 +_,7 @@ +@@ -1529,7 +_,7 @@ } public void onEnchantmentPerformed(ItemStack p_36172_, int p_36173_) { @@ -362,7 +362,7 @@ if (this.experienceLevel < 0) { this.experienceLevel = 0; this.experienceProgress = 0.0F; -@@ -1543,6 +_,10 @@ +@@ -1540,6 +_,10 @@ } public void giveExperienceLevels(int p_36276_) { @@ -373,7 +373,7 @@ this.experienceLevel = IntMath.saturatedAdd(this.experienceLevel, p_36276_); if (this.experienceLevel < 0) { this.experienceLevel = 0; -@@ -1581,7 +_,7 @@ +@@ -1578,7 +_,7 @@ } protected boolean hasEnoughFoodToDoExhaustiveManoeuvres() { @@ -382,7 +382,7 @@ } public Optional getWardenSpawnTracker() { -@@ -1688,7 +_,11 @@ +@@ -1685,7 +_,11 @@ @Override public Component getDisplayName() { @@ -395,7 +395,7 @@ return this.decorateDisplayNameComponent(mutablecomponent); } -@@ -1867,21 +_,21 @@ +@@ -1864,21 +_,21 @@ if (!(p_36349_.getItem() instanceof ProjectileWeaponItem)) { return ItemStack.EMPTY; } else { @@ -422,7 +422,7 @@ } } } -@@ -1921,7 +_,7 @@ +@@ -1918,7 +_,7 @@ } public boolean isScoping() { @@ -431,7 +431,7 @@ } @Override -@@ -2061,5 +_,41 @@ +@@ -2058,5 +_,41 @@ public static final Player.BedSleepingProblem OBSTRUCTED = new Player.BedSleepingProblem(Component.translatable("block.minecraft.bed.obstructed")); public static final Player.BedSleepingProblem OTHER_PROBLEM = new Player.BedSleepingProblem(null); public static final Player.BedSleepingProblem NOT_SAFE = new Player.BedSleepingProblem(Component.translatable("block.minecraft.bed.not_safe")); diff --git a/patches/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch b/patches/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch index b38c75554b4..2b834190fc4 100644 --- a/patches/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch +++ b/patches/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/ProjectileUtil.java +++ b/net/minecraft/world/entity/projectile/ProjectileUtil.java -@@ -115,7 +_,7 @@ +@@ -117,7 +_,7 @@ Vec3 vec31 = optional.get(); double d1 = p_37289_.distanceToSqr(vec31); if (d1 < d0 || d0 == 0.0) { @@ -9,7 +9,7 @@ if (d0 == 0.0) { entity = entity1; vec3 = vec31; -@@ -246,8 +_,13 @@ +@@ -248,8 +_,13 @@ } } diff --git a/patches/net/minecraft/world/level/block/ChestBlock.java.patch b/patches/net/minecraft/world/level/block/ChestBlock.java.patch index 99655a4e313..23aac036ac7 100644 --- a/patches/net/minecraft/world/level/block/ChestBlock.java.patch +++ b/patches/net/minecraft/world/level/block/ChestBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -357,7 +_,8 @@ +@@ -363,7 +_,8 @@ @Override protected BlockState mirror(BlockState p_51549_, Mirror p_51550_) { From 3d436255204f6bfc6ca3f059f90ee2f63f86deb4 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 21 Nov 2025 18:56:37 +0100 Subject: [PATCH 05/20] Remove now obsolete patches for MC-304369 --- .../net/minecraft/client/Options.java.patch | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/patches/net/minecraft/client/Options.java.patch b/patches/net/minecraft/client/Options.java.patch index 9abe78d085c..9eff349f19b 100644 --- a/patches/net/minecraft/client/Options.java.patch +++ b/patches/net/minecraft/client/Options.java.patch @@ -1,48 +1,5 @@ --- a/net/minecraft/client/Options.java +++ b/net/minecraft/client/Options.java -@@ -201,6 +_,7 @@ - private static final Component GRAPHICS_TOOLTIP_CUTOUT_LEAVES = Component.translatable("options.cutoutLeaves.tooltip"); - private final OptionInstance cutoutLeaves = OptionInstance.createBoolean( - "options.cutoutLeaves", OptionInstance.cachedConstantTooltip(GRAPHICS_TOOLTIP_CUTOUT_LEAVES), true, p_454154_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - Minecraft.getInstance().levelRenderer.allChanged(); - this.setGraphicsPresetToCustom(); - } -@@ -217,12 +_,14 @@ - if (p_454138_ && gpuwarnlistmanager.willShowWarning()) { - gpuwarnlistmanager.showWarning(); - } else { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - minecraft.levelRenderer.allChanged(); - this.setGraphicsPresetToCustom(); - } - } - ); - private final OptionInstance ambientOcclusion = OptionInstance.createBoolean("options.ao", true, p_454143_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - Minecraft.getInstance().levelRenderer.allChanged(); - this.setGraphicsPresetToCustom(); - }); -@@ -461,6 +_,7 @@ - int i = p_232017_ * 2 + 1; - return genericValueLabel(p_232016_, Component.translatable("options.biomeBlendRadius." + i)); - }, new OptionInstance.IntRange(0, 7, false), 2, p_454145_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. - Minecraft.getInstance().levelRenderer.allChanged(); - this.setGraphicsPresetToCustom(); - } -@@ -776,7 +_,10 @@ - new OptionInstance.IntRange(30, 110), - Codec.DOUBLE.xmap(p_232007_ -> (int)(p_232007_ * 40.0 + 70.0), p_232009_ -> (p_232009_.intValue() - 70.0) / 40.0), - 70, -- p_231992_ -> Minecraft.getInstance().levelRenderer.needsUpdate() -+ p_231992_ -> { -+ if (Minecraft.getInstance().levelRenderer != null) // TODO 1.21.11: Fixes MC-304369, remove when upstream fixes it. -+ Minecraft.getInstance().levelRenderer.needsUpdate(); -+ } - ); - private static final Component TELEMETRY_TOOLTIP = Component.translatable( - "options.telemetry.button.tooltip", Component.translatable("options.telemetry.state.minimal"), Component.translatable("options.telemetry.state.all") @@ -907,9 +_,10 @@ } }, From 42787a4998c76da159a41567873caee2113a7b20 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 21 Nov 2025 19:15:41 +0100 Subject: [PATCH 06/20] Fix typos/patch mistakes around Annotations/Screen --- .../com/mojang/blaze3d/buffers/GpuBuffer.java.patch | 6 +++--- .../mojang/blaze3d/opengl/DirectStateAccess.java.patch | 6 +++--- .../net/minecraft/client/gui/screens/Screen.java.patch | 10 ---------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch b/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch index 324d6253ae6..d82928854bf 100644 --- a/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch +++ b/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch @@ -1,13 +1,13 @@ --- a/com/mojang/blaze3d/buffers/GpuBuffer.java +++ b/com/mojang/blaze3d/buffers/GpuBuffer.java -@@ -22,6 +_,10 @@ +@@ -21,6 +_,10 @@ + public static final int USAGE_INDEX = 64; public static final int USAGE_UNIFORM = 128; public static final int USAGE_UNIFORM_TEXEL_BUFFER = 256; - @GpuBuffer.Usage + /** + * Neo: These bits are reserved for alternate backend specific uses + */ + public static final int RESERVED_USAGE_BITS = 0xFF << 24; + @GpuBuffer.Usage private final int usage; private final int size; - diff --git a/patches/com/mojang/blaze3d/opengl/DirectStateAccess.java.patch b/patches/com/mojang/blaze3d/opengl/DirectStateAccess.java.patch index 548fb28010e..648ad5c8f94 100644 --- a/patches/com/mojang/blaze3d/opengl/DirectStateAccess.java.patch +++ b/patches/com/mojang/blaze3d/opengl/DirectStateAccess.java.patch @@ -5,9 +5,9 @@ abstract int createFrameBufferObject(); - abstract void bindFrameBufferTextures(int p_412046_, int p_412388_, int p_412116_, int p_412536_, int p_412779_); -+ abstract void bindFrameBufferTextures(int p_412046_, int p_412388_, int p_412116_, int p_412536_, int p_412779_, boolean useStencil); ++ abstract void bindFrameBufferTextures(int p_412046_, int p_412388_, int p_412116_, int p_412536_, @GpuBuffer.Usage int p_412779_, boolean useStencil); + -+ public void bindFrameBufferTextures(int p_412046_, int p_412388_, int p_412116_, int p_412536_, int p_412779_) { ++ public void bindFrameBufferTextures(int p_412046_, int p_412388_, int p_412116_, int p_412536_, @GpuBuffer.Usage int p_412779_) { + bindFrameBufferTextures(p_412046_, p_412388_, p_412116_, p_412536_, p_412779_, false); + } @@ -18,7 +18,7 @@ @Override - public void bindFrameBufferTextures(int p_412474_, int p_412101_, int p_412181_, int p_412742_, @GpuBuffer.Usage int p_412591_) { -+ public void bindFrameBufferTextures(int p_412474_, int p_412101_, int p_412181_, int p_412742_, int p_412591_, boolean useStencil) { ++ public void bindFrameBufferTextures(int p_412474_, int p_412101_, int p_412181_, int p_412742_, @GpuBuffer.Usage int p_412591_, boolean useStencil) { ARBDirectStateAccess.glNamedFramebufferTexture(p_412474_, 36064, p_412101_, p_412742_); ARBDirectStateAccess.glNamedFramebufferTexture(p_412474_, 36096, p_412181_, p_412742_); + if (useStencil) { diff --git a/patches/net/minecraft/client/gui/screens/Screen.java.patch b/patches/net/minecraft/client/gui/screens/Screen.java.patch index ceb3559a86d..a267d261063 100644 --- a/patches/net/minecraft/client/gui/screens/Screen.java.patch +++ b/patches/net/minecraft/client/gui/screens/Screen.java.patch @@ -1,15 +1,5 @@ --- a/net/minecraft/client/gui/screens/Screen.java +++ b/net/minecraft/client/gui/screens/Screen.java -@@ -50,7 +_,8 @@ - import org.slf4j.Logger; - - @OnlyIn(Dist.CLIENT) --public abstract class Screen extends AbstractContainerEventHandler implements Renderable { -+public abstract class -+Screen extends AbstractContainerEventHandler implements Renderable { - private static final Logger LOGGER = LogUtils.getLogger(); - private static final Component USAGE_NARRATION = Component.translatable("narrator.screen.usage"); - public static final Identifier MENU_BACKGROUND = Identifier.withDefaultNamespace("textures/gui/menu_background.png"); @@ -107,6 +_,7 @@ public final void renderWithTooltipAndSubtitles(GuiGraphics p_434220_, int p_435721_, int p_435145_, float p_435742_) { p_434220_.nextStratum(); From b7caddfe9495ce2c66cf05f7ee7af2c89a0c8909 Mon Sep 17 00:00:00 2001 From: Dennis C Date: Fri, 21 Nov 2025 23:20:49 +0100 Subject: [PATCH 07/20] [1.21.11] Add back baked colors and normals to BakedQuad (#2819) Co-authored-by: Sebastian Hartte --- .../blaze3d/vertex/VertexConsumer.java.patch | 33 +++++-------- .../renderer/block/model/BakedQuad.java.patch | 6 ++- .../block/model/FaceBakery.java.patch | 19 +++---- .../renderer/entity/ItemRenderer.java.patch | 11 ----- .../resources/model/ModelBakery.java.patch | 23 +++++++++ .../neoforge/client/ClientHooks.java | 15 ++---- .../extensions/IVertexConsumerExtension.java | 48 +++--------------- .../ModelBakerPartCacheExtension.java | 19 +++++++ .../neoforge/client/model/ExtraFaceData.java | 10 ++-- .../client/model/IQuadTransformer.java | 2 +- .../model/ao/EnhancedAoRenderStorage.java | 6 +-- .../generators/template/ElementBuilder.java | 22 +-------- .../generators/template/FaceBuilder.java | 19 +++---- .../client/model/obj/ObjGeometry.java | 5 +- .../pipeline/QuadBakingVertexConsumer.java | 40 ++++++--------- .../client/model/quad/BakedColors.java | 48 ++++++++++++++++++ .../client/model/quad/BakedNormals.java | 49 +++++++++++++++++++ .../client/model/quad/package-info.java | 9 ++++ .../META-INF/injected-interfaces.json | 3 ++ 19 files changed, 218 insertions(+), 169 deletions(-) delete mode 100644 patches/net/minecraft/client/renderer/entity/ItemRenderer.java.patch create mode 100644 src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerPartCacheExtension.java create mode 100644 src/client/java/net/neoforged/neoforge/client/model/quad/BakedColors.java create mode 100644 src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java create mode 100644 src/client/java/net/neoforged/neoforge/client/model/quad/package-info.java diff --git a/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch b/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch index 05087fc2c32..4d6d32305a2 100644 --- a/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch +++ b/patches/com/mojang/blaze3d/vertex/VertexConsumer.java.patch @@ -1,22 +1,15 @@ --- a/com/mojang/blaze3d/vertex/VertexConsumer.java +++ b/com/mojang/blaze3d/vertex/VertexConsumer.java -@@ -67,6 +_,11 @@ - default void putBulkData( - PoseStack.Pose p_85996_, BakedQuad p_85997_, float p_85999_, float p_86000_, float p_86001_, float p_331520_, int p_86003_, int p_331548_ - ) { -+ // Neo: also apply alpha that's coming from the baked quad -+ // TODO 1.21.11: Restore per-quad or per-vertex color -> int vertexAlpha = p_331268_ ? (int)((p_331416_ * (float) (bytebuffer.get(15) & 255) / 255.0F) * 255) : k; -+ // TODO 1.21.11: Restore per-quad or per-vertex color -> int j1 = ARGB.color(vertexAlpha, (int)f3, (int)f4, (int)f5); -+ // TODO 1.21.11: Restore pre-baked per-quad lighting? -> int k1 = applyBakedLighting(LightTexture.lightCoordsWithEmission(p_331378_[i1], l), bytebuffer); -+ - this.putBulkData( - p_85996_, - p_85997_, -@@ -91,6 +_,7 @@ - int[] p_331378_, - int p_85993_ - ) { -+ // TODO 1.21.11: Restore per-quad or per-vertex normals: applyBakedNormals(vector3f, bytebuffer, p_85988_.normal()); - Vector3fc vector3fc = p_85989_.direction().getUnitVec3f(); - Matrix4f matrix4f = p_85988_.pose(); - Vector3f vector3f = p_85988_.transformNormal(vector3fc, new Vector3f()); +@@ -101,10 +_,12 @@ + long k = p_85989_.packedUV(j); + float f = p_331397_[j]; + int l = ARGB.colorFromFloat(p_331416_, f * p_85990_, f * p_85991_, f * p_85992_); ++ l = ARGB.multiply(l, ARGB.toABGR(p_85989_.bakedColors().color(j))); // Neo: apply baked color from the quad + int i1 = LightTexture.lightCoordsWithEmission(p_331378_[j], i); + Vector3f vector3f1 = matrix4f.transformPosition(vector3fc1, new Vector3f()); + float f1 = UVPair.unpackU(k); + float f2 = UVPair.unpackV(k); ++ applyBakedNormals(vector3f, p_85989_.bakedNormals(), j, p_85988_.normal()); // Neo: apply baked normals from the quad + this.addVertex(vector3f1.x(), vector3f1.y(), vector3f1.z(), l, f1, f2, p_85993_, i1, vector3f.x(), vector3f.y(), vector3f.z()); + } + } diff --git a/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch b/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch index 79bdca8d9ee..03a2d29c63e 100644 --- a/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch @@ -12,16 +12,18 @@ @OnlyIn(Dist.CLIENT) public record BakedQuad( Vector3fc position0, -@@ -20,8 +_,13 @@ +@@ -20,8 +_,15 @@ Direction direction, TextureAtlasSprite sprite, boolean shade, - int lightEmission + int lightEmission, ++ net.neoforged.neoforge.client.model.quad.BakedNormals bakedNormals, ++ net.neoforged.neoforge.client.model.quad.BakedColors bakedColors, + boolean hasAmbientOcclusion ) { + public BakedQuad(Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3, long packedUV0, long packedUV1, long packedUV2, long packedUV3, int tintIndex, Direction direction, TextureAtlasSprite sprite, boolean shade, int lightEmission) { -+ this(position0, position1, position2, position3, packedUV0, packedUV1, packedUV2, packedUV3, tintIndex, direction, sprite, shade, lightEmission, true); ++ this(position0, position1, position2, position3, packedUV0, packedUV1, packedUV2, packedUV3, tintIndex, direction, sprite, shade, lightEmission, net.neoforged.neoforge.client.model.quad.BakedNormals.UNSPECIFIED, net.neoforged.neoforge.client.model.quad.BakedColors.DEFAULT, true); + } + public static final int VERTEX_COUNT = 4; diff --git a/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch b/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch index dc4d69ea946..edf6e0a9bfd 100644 --- a/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch @@ -9,18 +9,15 @@ recalculateWinding(avector3fc, along, direction); } -@@ -95,6 +_,14 @@ +@@ -93,7 +_,10 @@ + Objects.requireNonNullElse(direction, Direction.UP), + p_111604_, p_111608_, - p_364857_ +- p_364857_ ++ Math.max(p_364857_, p_111603_.faceData().lightEmission()), ++ net.neoforged.neoforge.client.ClientHooks.fillNormal(p_470769_, avector3fc[0], avector3fc[1], avector3fc[2], avector3fc[3]), ++ p_470769_.colors(net.neoforged.neoforge.client.model.quad.BakedColors.of(p_111603_.faceData().color())), ++ p_111603_.faceData().ambientOcclusion() ); -+ // TODO 1.21.11: net.neoforged.neoforge.client.ClientHooks.fillNormal(aint); -+ // TODO 1.21.11:var data = p_111603_.faceData(); -+ // TODO 1.21.11:var quad = new BakedQuad(aint, p_111603_.tintIndex(), direction, p_111604_, p_111608_, p_364857_, data.ambientOcclusion()); -+ // TODO 1.21.11:if (!net.neoforged.neoforge.client.model.ExtraFaceData.DEFAULT.equals(data)) { -+ // TODO 1.21.11: net.neoforged.neoforge.client.model.QuadTransformers.applyingLightmap(data.blockLight(), data.skyLight()).processInPlace(quad); -+ // TODO 1.21.11: net.neoforged.neoforge.client.model.QuadTransformers.applyingColor(data.color()).processInPlace(quad); -+ // TODO 1.21.11:} -+ // TODO 1.21.11:return quad; } - private static void bakeVertex( diff --git a/patches/net/minecraft/client/renderer/entity/ItemRenderer.java.patch b/patches/net/minecraft/client/renderer/entity/ItemRenderer.java.patch deleted file mode 100644 index 962b10663e8..00000000000 --- a/patches/net/minecraft/client/renderer/entity/ItemRenderer.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/client/renderer/entity/ItemRenderer.java -+++ b/net/minecraft/client/renderer/entity/ItemRenderer.java -@@ -114,7 +_,7 @@ - f3 = 1.0F; - } - -- p_115164_.putBulkData(posestack$pose, bakedquad, f1, f2, f3, f, p_115167_, p_115168_); -+ p_115164_.putBulkData(posestack$pose, bakedquad, f1, f2, f3, f, p_115167_, p_115168_, true); - } - } - } diff --git a/patches/net/minecraft/client/resources/model/ModelBakery.java.patch b/patches/net/minecraft/client/resources/model/ModelBakery.java.patch index 44fceb37bb4..5983c49ff5c 100644 --- a/patches/net/minecraft/client/resources/model/ModelBakery.java.patch +++ b/patches/net/minecraft/client/resources/model/ModelBakery.java.patch @@ -95,3 +95,26 @@ } @OnlyIn(Dist.CLIENT) +@@ -234,10 +_,22 @@ + @OnlyIn(Dist.CLIENT) + static class PartCacheImpl implements ModelBaker.PartCache { + private final Interner vectors = Interners.newStrongInterner(); ++ private final Interner normals = Interners.newStrongInterner(); ++ private final Interner colors = Interners.newStrongInterner(); + + @Override + public Vector3fc vector(Vector3fc p_470814_) { + return this.vectors.intern(p_470814_); ++ } ++ ++ @Override ++ public net.neoforged.neoforge.client.model.quad.BakedNormals normals(net.neoforged.neoforge.client.model.quad.BakedNormals normals) { ++ return this.normals.intern(normals); ++ } ++ ++ @Override ++ public net.neoforged.neoforge.client.model.quad.BakedColors colors(net.neoforged.neoforge.client.model.quad.BakedColors colors) { ++ return this.colors.intern(colors); + } + } + } diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index ba0dd2dbc20..f1e5eb323f6 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -109,6 +109,7 @@ import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.MaterialSet; +import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.sounds.SoundInstance; @@ -202,6 +203,7 @@ import net.neoforged.neoforge.client.gui.map.MapDecorationRendererManager; import net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay; import net.neoforged.neoforge.client.model.block.BlockStateModelHooks; +import net.neoforged.neoforge.client.model.quad.BakedNormals; import net.neoforged.neoforge.client.pipeline.PipelineModifiers; import net.neoforged.neoforge.client.renderstate.RegisterRenderStateModifiersEvent; import net.neoforged.neoforge.common.CommonHooks; @@ -502,17 +504,8 @@ public static int computeQuadNormal(Vector3fc position0, Vector3fc position1, Ve return packedx | (packedy << 8) | (packedz << 16); } - /** - * Modifies the passed {@code faceData} to fill in the vertex normals. - * The normals are computed from the vertex positions, see {@link #computeQuadNormal}. - */ - public static void fillNormal(Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3) { - int normal = computeQuadNormal(position0, position1, position2, position3); - - // TODO 1.21.11: quads can no longer store baked normals - //for (int i = 0; i < 4; i++) { - // faceData[i * 8 + 7] = normal; - //} + public static BakedNormals fillNormal(ModelBaker.PartCache partCache, Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3) { + return partCache.normals(BakedNormals.of(computeQuadNormal(position0, position1, position2, position3))); } public static boolean loadEntityShader(@Nullable Entity entity, GameRenderer gameRenderer) { diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java index 26bd37d90de..0f2b9254b2a 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java @@ -5,12 +5,9 @@ package net.neoforged.neoforge.client.extensions; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormatElement; -import java.nio.ByteBuffer; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.neoforged.neoforge.client.model.IQuadTransformer; +import net.neoforged.neoforge.client.model.quad.BakedNormals; import org.joml.Matrix3f; import org.joml.Vector3f; @@ -31,43 +28,12 @@ default VertexConsumer misc(VertexFormatElement element, int... rawData) { return self(); } - /** - * Variant with no per-vertex shading. - */ - default void putBulkData(PoseStack.Pose pose, BakedQuad bakedQuad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay, boolean readExistingColor) { - self().putBulkData( - pose, - bakedQuad, - new float[] { 1.0F, 1.0F, 1.0F, 1.0F }, - red, - green, - blue, - alpha, - new int[] { packedLight, packedLight, packedLight, packedLight }, - packedOverlay - // TODO 1.21.11: quads no longer store baked color - /*, readExistingColor*/ - ); - } - - // TODO 1.21.11: This doesn't work anymore since BakedQuad no longer has full vertexdata. - default int applyBakedLighting(int packedLight, ByteBuffer data) { - int bl = packedLight & 0xFFFF; - int sl = (packedLight >> 16) & 0xFFFF; - int offset = IQuadTransformer.UV2 * 4; // int offset for vertex 0 * 4 bytes per int - int blBaked = Short.toUnsignedInt(data.getShort(offset)); - int slBaked = Short.toUnsignedInt(data.getShort(offset + 2)); - bl = Math.max(bl, blBaked); - sl = Math.max(sl, slBaked); - return bl | (sl << 16); - } - - // TODO 1.21.11: This doesn't work anymore since BakedQuad no longer has full vertexdata. - default void applyBakedNormals(Vector3f generated, ByteBuffer data, Matrix3f normalTransform) { - byte nx = data.get(28); - byte ny = data.get(29); - byte nz = data.get(30); - if (nx != 0 || ny != 0 || nz != 0) { + default void applyBakedNormals(Vector3f generated, BakedNormals data, int vertex, Matrix3f normalTransform) { + int packed = data.normals(vertex); + if ((packed & 0x00FFFFFF) != 0) { + byte nx = (byte) (packed & 0xFF); + byte ny = (byte) (packed >> 8 & 0xFF); + byte nz = (byte) (packed >> 16 & 0xFF); generated.set(nx / 127f, ny / 127f, nz / 127f); generated.mul(normalTransform); } diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerPartCacheExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerPartCacheExtension.java new file mode 100644 index 00000000000..c09c97cfe0b --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerPartCacheExtension.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.extensions; + +import net.neoforged.neoforge.client.model.quad.BakedColors; +import net.neoforged.neoforge.client.model.quad.BakedNormals; + +public interface ModelBakerPartCacheExtension { + default BakedNormals normals(BakedNormals normals) { + return normals; + } + + default BakedColors colors(BakedColors colors) { + return colors; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java b/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java index 096f0853b8c..80f5c850af5 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java +++ b/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java @@ -21,12 +21,11 @@ * Used by {@link ItemLayerModel}, {@link BlockElement} and {@link BlockElementFace} * * @param color Color in ARGB format - * @param blockLight Block Light for this face from 0-15 (inclusive) - * @param skyLight Sky Light for this face from 0-15 (inclusive) + * @param lightEmission Light emission for the face or element from 0-15 (inclusive) * @param ambientOcclusion If this face has AO */ -public record ExtraFaceData(int color, int blockLight, int skyLight, boolean ambientOcclusion) { - public static final ExtraFaceData DEFAULT = new ExtraFaceData(0xFFFFFFFF, 0, 0, true); +public record ExtraFaceData(int color, int lightEmission, boolean ambientOcclusion) { + public static final ExtraFaceData DEFAULT = new ExtraFaceData(0xFFFFFFFF, 0, true); public static final Codec COLOR = Codec.either(Codec.INT, Codec.STRING).xmap( either -> either.map(Function.identity(), str -> (int) Long.parseLong(str, 16)), @@ -36,8 +35,7 @@ public record ExtraFaceData(int color, int blockLight, int skyLight, boolean amb builder -> builder .group( COLOR.optionalFieldOf("color", 0xFFFFFFFF).forGetter(ExtraFaceData::color), - Codec.intRange(0, 15).optionalFieldOf("block_light", 0).forGetter(ExtraFaceData::blockLight), - Codec.intRange(0, 15).optionalFieldOf("sky_light", 0).forGetter(ExtraFaceData::skyLight), + Codec.intRange(0, 15).optionalFieldOf("light_emission", 0).forGetter(ExtraFaceData::lightEmission), Codec.BOOL.optionalFieldOf("ambient_occlusion", true).forGetter(ExtraFaceData::ambientOcclusion)) .apply(builder, ExtraFaceData::new)); diff --git a/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java b/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java index af99fce64ae..731ffe4b266 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java +++ b/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java @@ -50,7 +50,7 @@ default IQuadTransformer andThen(IQuadTransformer other) { private static BakedQuad copy(BakedQuad quad) { // TODO 1.21.11: this is pretty much useless now - return new BakedQuad(quad.position0(), quad.position1(), quad.position2(), quad.position3(), quad.packedUV0(), quad.packedUV1(), quad.packedUV2(), quad.packedUV3(), quad.tintIndex(), quad.direction(), quad.sprite(), quad.shade(), quad.lightEmission(), quad.hasAmbientOcclusion()); + return new BakedQuad(quad.position0(), quad.position1(), quad.position2(), quad.position3(), quad.packedUV0(), quad.packedUV1(), quad.packedUV2(), quad.packedUV3(), quad.tintIndex(), quad.direction(), quad.sprite(), quad.shade(), quad.lightEmission(), quad.bakedNormals(), quad.bakedColors(), quad.hasAmbientOcclusion()); } private static int findOffset(VertexFormatElement element) { diff --git a/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java b/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java index 0cb2138a557..34c4ba603ce 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java +++ b/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java @@ -48,8 +48,7 @@ public static void applyFlatQuadBrightness(BlockAndTintGetter level, BakedQuad q for (int vertex = 0; vertex < 4; ++vertex) { // Handle each vertex separately to apply vertex normals. - // TODO 1.21.11: quads can no longer store baked normals - int normal = 0;//quad.vertices()[IQuadTransformer.STRIDE * vertex + IQuadTransformer.NORMAL]; + int normal = quad.bakedNormals().normals(vertex); // The ignored byte is padding and may be filled with user data if ((normal & 0x00FFFFFF) == 0) { // No normal! Try to use the quad normal. @@ -194,8 +193,7 @@ private void calculateIrregular(BlockAndTintGetter level, BlockState state, Bloc for (int vertex = 0; vertex < 4; ++vertex) { // Handle each vertex separately to apply vertex normals. - // TODO 1.21.11: quads can no longer store baked normals - int normal = 0;//vertices[IQuadTransformer.STRIDE * vertex + IQuadTransformer.NORMAL]; + int normal = currentQuad.bakedNormals().normals(vertex); // The ignored byte is padding and may be filled with user data if ((normal & 0x00FFFFFF) == 0) { // No normal! Try to use the quad normal. diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java index b073687ed42..e747af19038 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java @@ -30,8 +30,6 @@ public final class ElementBuilder { private boolean shade = true; private int lightEmission = 0; private int color = 0xFFFFFFFF; - private int blockLight = 0; - private int skyLight = 0; private boolean hasAmbientOcclusion = true; /** @@ -176,24 +174,8 @@ public ElementBuilder cube(TextureSlot texture) { return allFaces(addTexture(texture).andThen((dir, f) -> f.cullface(dir))); } - /** - * Set the block and sky light of the element (0-15). - * Traditional "emissivity" values were set both of these to the same value. - * - * @param blockLight the block light - * @param skyLight the sky light - * @return this builder - */ - public ElementBuilder emissivity(int blockLight, int skyLight) { - this.blockLight = blockLight; - this.skyLight = skyLight; - return this; - } - /** * Set the light emission of the element (0-15) - *

- * If block and sky light values should be different, use {@link #emissivity(int, int)} instead * * @param lightEmission the light value * @return this builder @@ -244,7 +226,7 @@ BlockElement build() { Map faces = this.faces.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().build(), (k1, k2) -> { throw new IllegalArgumentException(); }, LinkedHashMap::new)); - return new BlockElement(from, to, faces, rotation == null ? null : rotation.build(), shade, lightEmission, new ExtraFaceData(this.color, this.blockLight, this.skyLight, this.hasAmbientOcclusion)); + return new BlockElement(from, to, faces, rotation == null ? null : rotation.build(), shade, lightEmission, new ExtraFaceData(this.color, 0, this.hasAmbientOcclusion)); } ElementBuilder copy() { @@ -256,8 +238,6 @@ ElementBuilder copy() { builder.shade = this.shade; builder.lightEmission = this.lightEmission; builder.color = this.color; - builder.blockLight = this.blockLight; - builder.skyLight = this.skyLight; builder.hasAmbientOcclusion = this.hasAmbientOcclusion; return builder; } diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java index 6263d449aaf..8f22fe9f37f 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java @@ -24,8 +24,7 @@ public final class FaceBuilder { private BlockElementFace.UVs uvs; private Quadrant rotation = Quadrant.R0; private int color = 0xFFFFFFFF; - private int blockLight = 0; - private int skyLight = 0; + private int lightEmission = 0; private boolean hasAmbientOcclusion = true; /** @@ -79,16 +78,13 @@ public FaceBuilder rotation(Quadrant rot) { } /** - * Set the block and sky light of the face (0-15). - * Traditional "emissivity" values set both of these to the same value. + * Set the light emission of the face (0-15) * - * @param blockLight the block light - * @param skyLight the sky light + * @param lightEmission the light value * @return this builder */ - public FaceBuilder emissivity(int blockLight, int skyLight) { - this.blockLight = blockLight; - this.skyLight = skyLight; + public FaceBuilder lightEmission(int lightEmission) { + this.lightEmission = lightEmission; return this; } @@ -118,7 +114,7 @@ BlockElementFace build() { if (this.texture == null) { throw new IllegalStateException("A model face must have a texture"); } - return new BlockElementFace(cullface, tintindex, texture.toString(), uvs, rotation, new ExtraFaceData(this.color, this.blockLight, this.skyLight, this.hasAmbientOcclusion), new MutableObject<>()); + return new BlockElementFace(cullface, tintindex, texture.toString(), uvs, rotation, new ExtraFaceData(this.color, this.lightEmission, this.hasAmbientOcclusion), new MutableObject<>()); } FaceBuilder copy() { @@ -129,8 +125,7 @@ FaceBuilder copy() { builder.tintindex = this.tintindex; builder.uvs = this.uvs; builder.rotation = this.rotation; - builder.blockLight = this.blockLight; - builder.skyLight = this.skyLight; + builder.lightEmission = this.lightEmission; builder.hasAmbientOcclusion = this.hasAmbientOcclusion; return builder; } diff --git a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java index d47acbe2af4..f67896d6df0 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java +++ b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java @@ -16,7 +16,6 @@ import java.util.Objects; import java.util.Set; import joptsimple.internal.Strings; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.TextureSlots; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -308,10 +307,9 @@ private Pair makeQuad(int[][] indices, int tintIndex, Vect quadBaker.setSprite(texture); quadBaker.setTintIndex(tintIndex); - int uv2 = 0; if (emissiveAmbient) { int fakeLight = (int) ((ambientColor.x() + ambientColor.y() + ambientColor.z()) * 15 / 3.0f); - uv2 = LightTexture.pack(fakeLight, fakeLight); + quadBaker.setLightEmission(fakeLight); quadBaker.setShade(fakeLight == 0 && shadeQuads); } else { quadBaker.setShade(shadeQuads); @@ -346,7 +344,6 @@ private Pair makeQuad(int[][] indices, int tintIndex, Vect quadBaker.setUv( texture.getU(texCoord.x), texture.getV((flipV ? 1 - texCoord.y : texCoord.y))); - quadBaker.setLight(uv2); quadBaker.setNormal(normal.x(), normal.y(), normal.z()); if (i == 0) { quadBaker.setDirection(Direction.getApproximateNearest(normal.x(), normal.y(), normal.z())); diff --git a/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java b/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java index 68ef8b56cc3..2763c05f5db 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java +++ b/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java @@ -5,18 +5,16 @@ package net.neoforged.neoforge.client.model.pipeline; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormatElement; import java.util.Arrays; -import java.util.IdentityHashMap; -import java.util.Map; import net.minecraft.client.model.geom.builders.UVPair; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.util.ARGB; -import net.minecraft.util.Util; +import net.neoforged.neoforge.client.model.quad.BakedColors; +import net.neoforged.neoforge.client.model.quad.BakedNormals; import net.neoforged.neoforge.client.textures.UnitTextureAtlasSprite; import org.joml.Vector3f; @@ -29,13 +27,10 @@ * Built quads must be retrieved after building four vertices */ public class QuadBakingVertexConsumer implements VertexConsumer { - private final Map ELEMENT_OFFSETS = Util.make(new IdentityHashMap<>(), map -> { - for (var element : DefaultVertexFormat.BLOCK.getElements()) - map.put(element, DefaultVertexFormat.BLOCK.getOffset(element) / 4); // Int offset - }); - private final Vector3f[] positions = new Vector3f[4]; private final long[] uvs = new long[4]; + private final int[] normals = new int[4]; + private final int[] colors = new int[4]; private int vertexIndex = 0; private boolean building = false; @@ -65,28 +60,21 @@ public VertexConsumer addVertex(float x, float y, float z) { @Override public VertexConsumer setNormal(float x, float y, float z) { - // TODO 1.21.11: quads can no longer store baked normals - //int offset = vertexIndex * IQuadTransformer.STRIDE + IQuadTransformer.NORMAL; - //quadData[offset] = ((int) (x * 127.0f) & 0xFF) | - // (((int) (y * 127.0f) & 0xFF) << 8) | - // (((int) (z * 127.0f) & 0xFF) << 16); + normals[vertexIndex] = ((int) (x * 127.0f) & 0xFF) | + (((int) (y * 127.0f) & 0xFF) << 8) | + (((int) (z * 127.0f) & 0xFF) << 16); return this; } @Override public VertexConsumer setColor(int packedColor) { - return setColor(ARGB.red(packedColor), ARGB.green(packedColor), ARGB.blue(packedColor), ARGB.alpha(packedColor)); + colors[vertexIndex] = packedColor; + return this; } @Override public VertexConsumer setColor(int r, int g, int b, int a) { - // TODO 1.21.11: quads can no longer store baked colors - //int offset = vertexIndex * IQuadTransformer.STRIDE + IQuadTransformer.COLOR; - //quadData[offset] = ((a & 0xFF) << 24) | - // ((b & 0xFF) << 16) | - // ((g & 0xFF) << 8) | - // (r & 0xFF); - return this; + return setColor(ARGB.color(a, r, g, b)); } @Override @@ -102,9 +90,6 @@ public VertexConsumer setUv1(int u, int v) { @Override public VertexConsumer setUv2(int u, int v) { - // TODO 1.21.11: quads can no longer store baked per-vertex lighting - //int offset = vertexIndex * IQuadTransformer.STRIDE + IQuadTransformer.UV2; - //quadData[offset] = (u & 0xFFFF) | ((v & 0xFFFF) << 16); return this; } @@ -161,6 +146,8 @@ public BakedQuad bakeQuad() { sprite, shade, lightEmission, + BakedNormals.of(normals[0], normals[1], normals[2], normals[3]), + BakedColors.of(colors[0], colors[1], colors[2], colors[3]), hasAmbientOcclusion); clear(); return quad; @@ -171,7 +158,10 @@ private void clear() { building = false; Arrays.setAll(positions, $ -> new Vector3f()); Arrays.fill(uvs, 0L); + Arrays.fill(normals, 0); + Arrays.fill(colors, 0xFFFFFFFF); direction = Direction.DOWN; sprite = UnitTextureAtlasSprite.INSTANCE; + lightEmission = 0; } } diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/BakedColors.java b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedColors.java new file mode 100644 index 00000000000..ee496e9ee30 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedColors.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.model.quad; + +/** + * Holds a static color modulator, either for the entire quad or for each vertex, in the ARGB format. + *

+ * The stored color value is converted from ARGB to ABGR during buffering. + */ +public sealed interface BakedColors { + BakedColors DEFAULT = new PerQuad(0xFFFFFFFF); + + int color(int vertex); + + record PerQuad(int color) implements BakedColors { + @Override + public int color(int vertex) { + return color; + } + } + + record PerVertex(int color0, int color1, int color2, int color3) implements BakedColors { + @Override + public int color(int vertex) { + return switch (vertex) { + case 0 -> color0; + case 1 -> color1; + case 2 -> color2; + case 3 -> color3; + default -> throw new IndexOutOfBoundsException(vertex); + }; + } + } + + static BakedColors of(int color0, int color1, int color2, int color3) { + if (color0 == color1 && color0 == color2 && color0 == color3) { + return of(color0); + } + return new PerVertex(color0, color1, color2, color3); + } + + static BakedColors of(int color) { + return color == 0xFFFFFFFF ? DEFAULT : new PerQuad(color); + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java new file mode 100644 index 00000000000..1ee56de42cf --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.model.quad; + +/** + * Holds pre-computed normals, either for the entire quad or for each vertex. + *

+ * The normal values are quantized to an integer between -127 and 127, truncated to a byte + * and packed into an int, leaving the MSB unused. + */ +public sealed interface BakedNormals { + BakedNormals UNSPECIFIED = new PerQuad(0); + + int normals(int vertex); + + record PerQuad(int normals) implements BakedNormals { + @Override + public int normals(int vertex) { + return normals; + } + } + + record PerVertex(int normals0, int normals1, int normals2, int normals3) implements BakedNormals { + @Override + public int normals(int vertex) { + return switch (vertex) { + case 0 -> normals0; + case 1 -> normals1; + case 2 -> normals2; + case 3 -> normals3; + default -> throw new IndexOutOfBoundsException(vertex); + }; + } + } + + static BakedNormals of(int normals0, int normals1, int normals2, int normals3) { + if (normals0 == normals1 && normals0 == normals2 && normals0 == normals3) { + return of(normals0); + } + return new PerVertex(normals0, normals1, normals2, normals3); + } + + static BakedNormals of(int normals) { + return normals == 0 ? UNSPECIFIED : new PerQuad(normals); + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/package-info.java b/src/client/java/net/neoforged/neoforge/client/model/quad/package-info.java new file mode 100644 index 00000000000..f290020ced0 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/package-info.java @@ -0,0 +1,9 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +@NullMarked +package net.neoforged.neoforge.client.model.quad; + +import org.jspecify.annotations.NullMarked; diff --git a/src/main/resources/META-INF/injected-interfaces.json b/src/main/resources/META-INF/injected-interfaces.json index 569a13c3516..13a8eb72be5 100644 --- a/src/main/resources/META-INF/injected-interfaces.json +++ b/src/main/resources/META-INF/injected-interfaces.json @@ -47,6 +47,9 @@ "net/minecraft/client/resources/model/ModelBaker": [ "net/neoforged/neoforge/client/extensions/ModelBakerExtension" ], + "net/minecraft/client/resources/model/ModelBaker$PartCache": [ + "net/neoforged/neoforge/client/extensions/ModelBakerPartCacheExtension" + ], "net/minecraft/client/resources/model/ModelState": [ "net/neoforged/neoforge/client/extensions/ModelStateExtension" ], From 1808352ee345145e8b750b57305e0ee601cfb4e6 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:09:47 +0100 Subject: [PATCH 08/20] Remove IQuadTransformer and QuadTransformers; introduce QuadTransforms --- .../renderer/block/model/BakedQuad.java.patch | 2 +- .../client/model/IQuadTransformer.java | 63 ------- .../client/model/QuadTransformers.java | 163 ------------------ .../item/DynamicFluidContainerModel.java | 28 ++- .../client/model/quad/QuadTransforms.java | 80 +++++++++ .../oldtest/client/model/MegaModelTest.java | 10 +- .../client/model/TRSRTransformerTest.java | 12 +- 7 files changed, 117 insertions(+), 241 deletions(-) delete mode 100644 src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java delete mode 100644 src/client/java/net/neoforged/neoforge/client/model/QuadTransformers.java create mode 100644 src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java diff --git a/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch b/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch index 03a2d29c63e..8bfa1976b01 100644 --- a/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/BakedQuad.java.patch @@ -7,7 +7,7 @@ +/** + * @param hasAmbientOcclusion {@code false} to force-disable AO for this quad + * or {@code true} to use the behavior dictated by -+ * {@link net.neoforged.neoforge.client.extensions.IBakedModelExtension#useAmbientOcclusion(net.minecraft.world.level.block.state.BlockState, net.neoforged.neoforge.model.data.ModelData, net.minecraft.client.renderer.rendertype.RenderType)} ++ * {@link net.neoforged.neoforge.client.extensions.BlockModelPartExtension#ambientOcclusion}. + */ @OnlyIn(Dist.CLIENT) public record BakedQuad( diff --git a/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java b/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java deleted file mode 100644 index 731ffe4b266..00000000000 --- a/src/client/java/net/neoforged/neoforge/client/model/IQuadTransformer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.client.model; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormatElement; -import java.util.List; -import net.minecraft.client.renderer.block.model.BakedQuad; - -/** - * Transformer for {@link BakedQuad baked quads}. - * - * @see QuadTransformers - */ -public interface IQuadTransformer { - int STRIDE = DefaultVertexFormat.BLOCK.getVertexSize() / 4; - int POSITION = findOffset(VertexFormatElement.POSITION); - int COLOR = findOffset(VertexFormatElement.COLOR); - int UV0 = findOffset(VertexFormatElement.UV0); - int UV1 = findOffset(VertexFormatElement.UV1); - int UV2 = findOffset(VertexFormatElement.UV2); - int NORMAL = findOffset(VertexFormatElement.NORMAL); - - void processInPlace(BakedQuad quad); - - default void processInPlace(List quads) { - for (BakedQuad quad : quads) - processInPlace(quad); - } - - default BakedQuad process(BakedQuad quad) { - var copy = copy(quad); - processInPlace(copy); - return copy; - } - - default List process(List inputs) { - return inputs.stream().map(IQuadTransformer::copy).peek(this::processInPlace).toList(); - } - - default IQuadTransformer andThen(IQuadTransformer other) { - return quad -> { - processInPlace(quad); - other.processInPlace(quad); - }; - } - - private static BakedQuad copy(BakedQuad quad) { - // TODO 1.21.11: this is pretty much useless now - return new BakedQuad(quad.position0(), quad.position1(), quad.position2(), quad.position3(), quad.packedUV0(), quad.packedUV1(), quad.packedUV2(), quad.packedUV3(), quad.tintIndex(), quad.direction(), quad.sprite(), quad.shade(), quad.lightEmission(), quad.bakedNormals(), quad.bakedColors(), quad.hasAmbientOcclusion()); - } - - private static int findOffset(VertexFormatElement element) { - if (DefaultVertexFormat.BLOCK.contains(element)) { - // Divide by 4 because we want the int offset - return DefaultVertexFormat.BLOCK.getOffset(element) / 4; - } - return -1; - } -} diff --git a/src/client/java/net/neoforged/neoforge/client/model/QuadTransformers.java b/src/client/java/net/neoforged/neoforge/client/model/QuadTransformers.java deleted file mode 100644 index 7285f37216f..00000000000 --- a/src/client/java/net/neoforged/neoforge/client/model/QuadTransformers.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.client.model; - -import com.google.common.base.Preconditions; -import com.mojang.math.Transformation; -import java.util.Arrays; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.util.Util; - -/** - * A collection of {@link IQuadTransformer} implementations. - * - * @see IQuadTransformer - */ -public final class QuadTransformers { - private static final IQuadTransformer EMPTY = quad -> {}; - private static final IQuadTransformer[] EMISSIVE_TRANSFORMERS = Util.make(new IQuadTransformer[16], array -> { - Arrays.setAll(array, i -> applyingLightmap(LightTexture.pack(i, i))); - }); - - /** - * {@return a {@link BakedQuad} transformer that does nothing} - */ - public static IQuadTransformer empty() { - return EMPTY; - } - - /** - * {@return a new {@link BakedQuad} transformer that applies the specified {@link Transformation}} - */ - public static IQuadTransformer applying(Transformation transform) { - if (transform.isIdentity()) - return empty(); - return quad -> { - // TODO 1.21.11: quad vertex data can no longer be modified in-place - /*var vertices = quad.vertices(); - for (int i = 0; i < 4; i++) { - int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; - float x = Float.intBitsToFloat(vertices[offset]); - float y = Float.intBitsToFloat(vertices[offset + 1]); - float z = Float.intBitsToFloat(vertices[offset + 2]); - - Vector4f pos = new Vector4f(x, y, z, 1); - transform.transformPosition(pos); - pos.div(pos.w); - - vertices[offset] = Float.floatToRawIntBits(pos.x()); - vertices[offset + 1] = Float.floatToRawIntBits(pos.y()); - vertices[offset + 2] = Float.floatToRawIntBits(pos.z()); - } - - for (int i = 0; i < 4; i++) { - int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.NORMAL; - int normalIn = vertices[offset]; - if ((normalIn & 0x00FFFFFF) != 0) // The ignored byte is padding and may be filled with user data - { - float x = ((byte) (normalIn & 0xFF)) / 127.0f; - float y = ((byte) ((normalIn >> 8) & 0xFF)) / 127.0f; - float z = ((byte) ((normalIn >> 16) & 0xFF)) / 127.0f; - - Vector3f pos = new Vector3f(x, y, z); - transform.transformNormal(pos); - - vertices[offset] = (((byte) (pos.x() * 127.0f)) & 0xFF) | - ((((byte) (pos.y() * 127.0f)) & 0xFF) << 8) | - ((((byte) (pos.z() * 127.0f)) & 0xFF) << 16) | - (normalIn & 0xFF000000); // Restore padding, just in case - } - }*/ - }; - } - - /** - * @return A new {@link BakedQuad} transformer that applies the specified packed light value. - */ - public static IQuadTransformer applyingLightmap(int packedLight) { - return quad -> { - // TODO 1.21.11: quad vertex data can no longer be modified in-place - //var vertices = quad.vertices(); - //for (int i = 0; i < 4; i++) - // vertices[i * IQuadTransformer.STRIDE + IQuadTransformer.UV2] = packedLight; - }; - } - - /** - * @return A new {@link BakedQuad} transformer that applies the specified block and sky light values. - */ - public static IQuadTransformer applyingLightmap(int blockLight, int skyLight) { - return applyingLightmap(LightTexture.pack(blockLight, skyLight)); - } - - /** - * @return A {@link BakedQuad} transformer that sets the lightmap to the given emissivity (0-15) - */ - public static IQuadTransformer settingEmissivity(int emissivity) { - Preconditions.checkArgument(emissivity >= 0 && emissivity < 16, "Emissivity must be between 0 and 15."); - return EMISSIVE_TRANSFORMERS[emissivity]; - } - - /** - * @return A {@link BakedQuad} transformer that sets the lightmap to its max value - */ - public static IQuadTransformer settingMaxEmissivity() { - return EMISSIVE_TRANSFORMERS[15]; - } - - /** - * @param color The color in ARGB format. - * @return A {@link BakedQuad} transformer that sets the color to the specified value. - */ - public static IQuadTransformer applyingColor(int color) { - final int fixedColor = toABGR(color); - return quad -> { - // TODO 1.21.11: quad vertex data can no longer be modified in-place - //var vertices = quad.vertices(); - //for (int i = 0; i < 4; i++) - // vertices[i * IQuadTransformer.STRIDE + IQuadTransformer.COLOR] = fixedColor; - }; - } - - /** - * This method supplies a default alpha value of 255 (no transparency) - * - * @param red The red value (0-255) - * @param green The green value (0-255) - * @param blue The blue value (0-255) - * @return A {@link BakedQuad} transformer that sets the color to the specified value. - */ - public static IQuadTransformer applyingColor(int red, int green, int blue) { - return applyingColor(255, red, green, blue); - } - - /** - * @param alpha The alpha value (0-255) - * @param red The red value (0-255) - * @param green The green value (0-255) - * @param blue The blue value (0-255) - * @return A {@link BakedQuad} transformer that sets the color to the specified value. - */ - public static IQuadTransformer applyingColor(int alpha, int red, int green, int blue) { - return applyingColor(alpha << 24 | red << 16 | green << 8 | blue); - } - - /** - * Converts an ARGB color to an ABGR color, as the commonly used color format is not the format colors end up packed into. - * This function doubles as its own inverse. - * - * @param argb ARGB color - * @return ABGR color - */ - public static int toABGR(int argb) { - return (argb & 0xFF00FF00) // alpha and green same spot - | ((argb >> 16) & 0x000000FF) // red moves to blue - | ((argb << 16) & 0x00FF0000); // blue moves to red - } - - private QuadTransformers() {} -} diff --git a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java index 6a0aa70aa69..43d04e22453 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java @@ -16,6 +16,7 @@ import java.util.Map; import java.util.Optional; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.item.BlockModelWrapper; @@ -34,6 +35,7 @@ import net.minecraft.world.entity.ItemOwner; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; import net.neoforged.neoforge.client.ClientHooks; @@ -43,7 +45,6 @@ import net.neoforged.neoforge.client.color.item.FluidContentsTint; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.client.model.ComposedModelState; -import net.neoforged.neoforge.client.model.QuadTransformers; import net.neoforged.neoforge.client.model.UnbakedElementsHelper; import net.neoforged.neoforge.transfer.fluid.FluidUtil; import org.jetbrains.annotations.Nullable; @@ -130,7 +131,10 @@ private ItemModel bakeModelForFluid(Fluid fluid) { var emissive = unbakedModel.applyFluidLuminosity && fluid.getFluidType().getLightLevel() > 0; var renderType = RenderTypeHelper.detectItemModelRenderType(quads, getLayerRenderTypes(emissive)); - if (emissive) QuadTransformers.settingMaxEmissivity().processInPlace(quads); + if (emissive) { + quads = new ArrayList<>(quads); + quads.replaceAll(DynamicFluidContainerModel::setMaxEmissivity); + } subModels.add(new BlockModelWrapper(List.of(FluidContentsTint.INSTANCE), quads, renderProperties, renderType)); } @@ -148,6 +152,26 @@ private ItemModel bakeModelForFluid(Fluid fluid) { return new CompositeModel(subModels); } + private static BakedQuad setMaxEmissivity(BakedQuad quad) { + return new BakedQuad( + quad.position0(), + quad.position1(), + quad.position2(), + quad.position3(), + quad.packedUV0(), + quad.packedUV1(), + quad.packedUV2(), + quad.packedUV3(), + quad.tintIndex(), + quad.direction(), + quad.sprite(), + quad.shade(), + Level.MAX_BRIGHTNESS, + quad.bakedNormals(), + quad.bakedColors(), + quad.hasAmbientOcclusion()); + } + @Override public void update(ItemStackRenderState renderState, ItemStack stack, ItemModelResolver modelResolver, ItemDisplayContext displayContext, @Nullable ClientLevel level, @Nullable ItemOwner owner, int seed) { var fluidStack = FluidUtil.getFirstStackContained(stack); diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java b/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java new file mode 100644 index 00000000000..7cb0c02cf48 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.model.quad; + +import com.mojang.math.Transformation; +import net.minecraft.client.renderer.block.model.BakedQuad; +import org.joml.Vector3f; +import org.joml.Vector3fc; +import org.joml.Vector4f; + +public final class QuadTransforms { + private QuadTransforms() {} + + /** + * Returns a baked quad with the passed transformation applied. + */ + public static BakedQuad applyTransformation(BakedQuad quad, Transformation transformation) { + if (transformation.isIdentity()) { + return quad; + } + BakedNormals updatedNormals; + if (quad.bakedNormals() == BakedNormals.UNSPECIFIED) { + updatedNormals = BakedNormals.UNSPECIFIED; + } else { + var normalTemp = new Vector3f(); + updatedNormals = switch (quad.bakedNormals()) { + case BakedNormals.PerQuad(int n) -> BakedNormals.of( + transformNormal(normalTemp, n, transformation)); + case BakedNormals.PerVertex(int n0, int n1, int n2, int n3) -> BakedNormals.of( + transformNormal(normalTemp, n0, transformation), + transformNormal(normalTemp, n1, transformation), + transformNormal(normalTemp, n2, transformation), + transformNormal(normalTemp, n3, transformation)); + }; + } + var posTemp = new Vector4f(); + return new BakedQuad( + transformPosition(posTemp, quad.position0(), transformation), + transformPosition(posTemp, quad.position1(), transformation), + transformPosition(posTemp, quad.position2(), transformation), + transformPosition(posTemp, quad.position3(), transformation), + quad.packedUV0(), + quad.packedUV1(), + quad.packedUV2(), + quad.packedUV3(), + quad.tintIndex(), + // TODO: the direction is currently not being transformed, but probably should be + quad.direction(), + quad.sprite(), + quad.shade(), + quad.lightEmission(), + updatedNormals, + quad.bakedColors(), + quad.hasAmbientOcclusion()); + } + + private static Vector3fc transformPosition(Vector4f temp, Vector3fc pos, Transformation transformation) { + temp.set(pos.x(), pos.y(), pos.z(), 1); + transformation.transformPosition(temp); + temp.div(temp.w); + return new Vector3f(temp.x(), temp.y(), temp.z()); + } + + private static int transformNormal(Vector3f temp, int packedNormal, Transformation transformation) { + float x = ((byte) (packedNormal & 0xFF)) / 127.0f; + float y = ((byte) ((packedNormal >> 8) & 0xFF)) / 127.0f; + float z = ((byte) ((packedNormal >> 16) & 0xFF)) / 127.0f; + + temp.set(x, y, z); + transformation.transformNormal(temp); + + return (((byte) (temp.x() * 127.0f)) & 0xFF) | + ((((byte) (temp.y() * 127.0f)) & 0xFF) << 8) | + ((((byte) (temp.z() * 127.0f)) & 0xFF) << 16) | + (packedNormal & 0xFF000000); // Restore padding, just in case + } +} diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/MegaModelTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/MegaModelTest.java index fa0a56fe4ba..5686ff3eabd 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/MegaModelTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/MegaModelTest.java @@ -41,8 +41,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.ModelEvent; import net.neoforged.neoforge.client.model.DelegateBlockStateModel; -import net.neoforged.neoforge.client.model.IQuadTransformer; -import net.neoforged.neoforge.client.model.QuadTransformers; +import net.neoforged.neoforge.client.model.quad.QuadTransforms; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.model.data.ModelData; import net.neoforged.neoforge.model.data.ModelProperty; @@ -50,9 +49,9 @@ import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; /** * Test mod that demos most Forge-provided model loaders in a single block + item, as well as in-JSON render states @@ -151,7 +150,7 @@ private record TestData(Transformation transform) { } private static class TransformingModelWrapper extends DelegateBlockStateModel { - private static final Direction[] DIRECTIONS = Arrays.copyOfRange(Direction.values(), 0, 7); + private static final @Nullable Direction[] DIRECTIONS = Arrays.copyOfRange(Direction.values(), 0, 7); public TransformingModelWrapper(BlockStateModel originalModel) { super(originalModel); @@ -165,12 +164,11 @@ public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState stat return; } - IQuadTransformer transformer = QuadTransformers.applying(data.transform()); for (BlockModelPart part : delegate.collectParts(level, pos, state, random)) { QuadCollection.Builder builder = new QuadCollection.Builder(); for (Direction side : DIRECTIONS) { for (BakedQuad quad : part.getQuads(side)) { - quad = transformer.process(quad); + quad = QuadTransforms.applyTransformation(quad, data.transform()); if (side == null) { builder.addUnculledFace(quad); } else { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/TRSRTransformerTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/TRSRTransformerTest.java index 62f42019db6..96fb380f508 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/TRSRTransformerTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/TRSRTransformerTest.java @@ -29,8 +29,7 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.client.event.ModelEvent; import net.neoforged.neoforge.client.model.DelegateBlockStateModel; -import net.neoforged.neoforge.client.model.IQuadTransformer; -import net.neoforged.neoforge.client.model.QuadTransformers; +import net.neoforged.neoforge.client.model.quad.QuadTransforms; import net.neoforged.neoforge.common.util.TransformationHelper; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.registries.DeferredBlock; @@ -38,6 +37,7 @@ import net.neoforged.neoforge.registries.DeferredRegister; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; @Mod(TRSRTransformerTest.MODID) public class TRSRTransformerTest { @@ -73,12 +73,12 @@ private static void onModelBake(ModelEvent.ModifyBakingResult e) { } private static class MyBakedModel extends DelegateBlockStateModel { - private static final Direction[] DIRECTIONS = Arrays.copyOfRange(Direction.values(), 0, 7); - private static final IQuadTransformer TRANSFORMER = QuadTransformers.applying(Util.make(() -> { + private static final @Nullable Direction[] DIRECTIONS = Arrays.copyOfRange(Direction.values(), 0, 7); + private static final Transformation TRANSFORMATION = Util.make(() -> { Quaternionf rot = TransformationHelper.quatFromXYZ(new Vector3f(0, 45, 0), true); Vector3f translation = new Vector3f(0, 0.33f, 0); return new Transformation(translation, rot, null, null).blockCenterToCorner(); - })); + }); public MyBakedModel(BlockStateModel base) { super(base); @@ -90,7 +90,7 @@ public void collectParts(BlockAndTintGetter level, BlockPos pos, BlockState stat QuadCollection.Builder builder = new QuadCollection.Builder(); for (Direction side : DIRECTIONS) { for (BakedQuad quad : part.getQuads(side)) { - quad = TRANSFORMER.process(quad); + quad = QuadTransforms.applyTransformation(quad, TRANSFORMATION); if (side == null) { builder.addUnculledFace(quad); } else { From 3575f692c78a46129d3f83afa3089b62962430ce Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:38:06 +0100 Subject: [PATCH 09/20] JSpecify here we go --- build.gradle | 5 +++-- .../groovy/neoforge.formatting-conventions.gradle | 9 +++++---- .../neodev/GenerateAccessTransformers.java | 2 +- .../neodev/installer/CreateInstallerProfile.java | 2 +- .../neoforged/neoforge/coremods/CoremodUtils.java | 2 +- .../coremods/ReplaceFieldWithGetterAccess.java | 2 +- .../inventory/AbstractContainerScreen.java.patch | 2 +- .../minecraft/client/model/HumanoidModel.java.patch | 5 ++--- .../renderer/WeatherEffectRenderer.java.patch | 2 +- .../blockentity/state/ChestRenderState.java.patch | 5 ++--- .../resources/language/ClientLanguage.java.patch | 2 +- .../client/resources/model/ModelManager.java.patch | 2 +- patches/net/minecraft/core/Holder.java.patch | 9 ++++----- patches/net/minecraft/core/HolderLookup.java.patch | 4 ++-- .../dispenser/BoatDispenseItemBehavior.java.patch | 2 +- .../core/particles/BlockParticleOption.java.patch | 12 +++++------- .../RegistriesDatapackGenerator.java.patch | 4 ++-- .../net/minecraft/data/tags/TagsProvider.java.patch | 2 +- patches/net/minecraft/locale/Language.java.patch | 4 ++-- .../ClientboundStatusResponsePacket.java.patch | 2 +- .../ServerStatusPacketListenerImpl.java.patch | 4 ++-- .../net/minecraft/world/entity/Entity.java.patch | 4 ++-- .../minecraft/world/entity/LivingEntity.java.patch | 2 +- .../entity/boss/enderdragon/EnderDragon.java.patch | 5 ++--- patches/net/minecraft/world/item/AxeItem.java.patch | 2 +- .../minecraft/world/item/CreativeModeTab.java.patch | 5 ++--- .../world/item/ItemDisplayContext.java.patch | 4 ++-- .../net/minecraft/world/item/ShovelItem.java.patch | 2 +- .../world/item/crafting/Ingredient.java.patch | 13 +++++-------- .../minecraft/world/level/BaseSpawner.java.patch | 5 ++--- .../world/level/block/BaseRailBlock.java.patch | 2 +- .../level/block/DropExperienceBlock.java.patch | 4 ++-- .../world/level/block/FenceGateBlock.java.patch | 2 +- .../world/level/block/FlowerPotBlock.java.patch | 7 +++---- .../world/level/block/RedStoneOreBlock.java.patch | 4 ++-- .../world/level/block/SculkCatalystBlock.java.patch | 4 ++-- .../world/level/block/SculkSensorBlock.java.patch | 4 ++-- .../world/level/block/SculkShriekerBlock.java.patch | 4 ++-- .../world/level/block/SpawnerBlock.java.patch | 4 ++-- .../entity/trialspawner/TrialSpawner.java.patch | 5 ++--- .../world/level/storage/loot/LootContext.java.patch | 4 ++-- .../level/storage/loot/LootDataType.java.patch | 4 ++-- .../world/level/storage/loot/LootPool.java.patch | 6 +++--- .../world/level/storage/loot/LootTable.java.patch | 4 ++-- .../neoforge/client/ClientCommandSourceStack.java | 2 +- .../net/neoforged/neoforge/client/ClientHooks.java | 2 +- .../client/CreativeModeTabSearchRegistry.java | 8 +++----- .../client/DimensionTransitionScreenManager.java | 2 +- .../client/EntitySpectatorShaderManager.java | 2 +- .../client/FireworkShapeFactoryRegistry.java | 2 +- .../neoforge/client/PresetEditorManager.java | 2 +- .../validation/ValidationCommandEncoder.java | 2 +- .../blaze3d/validation/ValidationGpuDevice.java | 2 +- .../client/color/item/FluidContentsTint.java | 2 +- .../entity/animation/json/AnimationHolder.java | 2 +- .../entity/animation/json/AnimationLoader.java | 2 +- .../entity/animation/json/AnimationTypeManager.java | 5 ++--- .../client/event/ClientChatReceivedEvent.java | 10 ++++------ .../client/event/ClientPlayerNetworkEvent.java | 2 +- .../neoforge/client/event/EntityRenderersEvent.java | 2 +- .../client/event/RegisterDebugEntriesEvent.java | 2 +- .../client/event/RegisterGuiLayersEvent.java | 2 +- .../client/event/RenderLevelStageEvent.java | 2 +- .../neoforge/client/event/RenderNameTagEvent.java | 2 +- .../neoforge/client/event/RenderTooltipEvent.java | 2 +- .../neoforge/client/event/ScreenEvent.java | 2 +- .../neoforge/client/event/ScreenshotEvent.java | 2 +- .../neoforge/client/event/SelectMusicEvent.java | 2 +- .../neoforge/client/event/ViewportEvent.java | 2 +- .../neoforge/client/event/sound/PlaySoundEvent.java | 2 +- .../client/extensions/BlockStateModelExtension.java | 2 +- .../client/extensions/IRenderStateExtension.java | 2 +- .../client/extensions/ModelBakerExtension.java | 2 +- .../client/extensions/ResolvedModelExtension.java | 2 +- .../extensions/common/IClientBlockExtensions.java | 2 +- .../common/IClientFluidTypeExtensions.java | 2 +- .../extensions/common/IClientItemExtensions.java | 5 ++--- .../client/gui/ClientTooltipComponentManager.java | 2 +- .../neoforge/client/gui/ConfigurationScreen.java | 2 +- .../neoforge/client/gui/LoadingErrorScreen.java | 2 +- .../neoforge/client/gui/ModListScreen.java | 2 +- .../client/gui/ModMismatchDisconnectedScreen.java | 2 +- .../client/gui/PictureInPictureRendererPool.java | 2 +- .../neoforge/client/gui/widget/ModsButton.java | 5 ++--- .../client/internal/NeoForgeClientProxy.java | 5 ++--- .../neoforge/client/loading/ClientModLoader.java | 2 +- .../neoforge/client/model/AbstractUnbakedModel.java | 2 +- .../neoforge/client/model/DelegateUnbakedModel.java | 2 +- .../neoforge/client/model/ExtraFaceData.java | 2 +- .../client/model/NeoForgeModelProperties.java | 2 +- .../client/model/StandardModelParameters.java | 4 ++-- .../client/model/UnbakedElementsHelper.java | 2 +- .../neoforge/client/model/UnbakedModelParser.java | 2 +- .../client/model/block/CompositeBlockModel.java | 2 +- .../model/generators/blockstate/UnbakedMutator.java | 2 +- .../model/generators/loaders/ObjModelBuilder.java | 2 +- .../model/generators/template/ElementBuilder.java | 2 +- .../generators/template/ExtendedModelTemplate.java | 5 ++--- .../template/ExtendedModelTemplateBuilder.java | 5 ++--- .../model/generators/template/FaceBuilder.java | 5 ++--- .../generators/template/RootTransformsBuilder.java | 5 ++--- .../model/generators/template/RotationBuilder.java | 5 ++--- .../model/item/DynamicFluidContainerModel.java | 2 +- .../neoforge/client/model/obj/ObjGeometry.java | 7 +++---- .../neoforge/client/model/obj/ObjTokenizer.java | 2 +- .../model/standalone/StandaloneModelLoader.java | 2 +- .../client/renderstate/BaseRenderState.java | 2 +- .../client/resources/VanillaClientListeners.java | 2 +- .../neoforge/client/settings/KeyModifier.java | 2 +- .../client/textures/SpriteContentsConstructor.java | 2 +- .../neoforge/attachment/AttachmentHolder.java | 2 +- .../neoforge/attachment/AttachmentSync.java | 2 +- .../neoforge/attachment/AttachmentSyncHandler.java | 2 +- .../neoforge/attachment/AttachmentType.java | 2 +- .../neoforge/attachment/IAttachmentCopyHandler.java | 2 +- .../neoforge/attachment/IAttachmentHolder.java | 2 +- .../neoforge/capabilities/BaseCapability.java | 2 +- .../neoforge/capabilities/BlockCapability.java | 2 +- .../neoforge/capabilities/BlockCapabilityCache.java | 2 +- .../neoforge/capabilities/Capabilities.java | 2 +- .../neoforge/capabilities/EntityCapability.java | 2 +- .../capabilities/IBlockCapabilityProvider.java | 2 +- .../neoforge/capabilities/ICapabilityProvider.java | 2 +- .../neoforge/capabilities/ItemCapability.java | 2 +- .../capabilities/RegisterCapabilitiesEvent.java | 2 +- .../neoforged/neoforge/common/BasicItemListing.java | 2 +- .../neoforged/neoforge/common/BooleanAttribute.java | 2 +- .../net/neoforged/neoforge/common/CommonHooks.java | 5 ++--- .../neoforge/common/CreativeModeTabRegistry.java | 2 +- .../net/neoforged/neoforge/common/DataMapHooks.java | 2 +- .../net/neoforged/neoforge/common/IOUtilities.java | 2 +- .../net/neoforged/neoforge/common/IShearable.java | 2 +- .../neoforged/neoforge/common/ModConfigSpec.java | 2 +- .../neoforge/common/MutableDataComponentHolder.java | 2 +- .../net/neoforged/neoforge/common/NeoForgeMod.java | 2 +- .../neoforged/neoforge/common/SpecialPlantable.java | 2 +- .../neoforged/neoforge/common/UsernameCache.java | 2 +- .../PiglinNeutralArmorEntityPredicate.java | 2 +- .../critereon/SnowBootsEntityPredicate.java | 2 +- .../critereon/TridentEntityPredicate.java | 2 +- .../common/crafting/BlockTagIngredient.java | 2 +- .../common/crafting/ConditionalRecipeOutput.java | 2 +- .../common/damagesource/IDeathMessageProvider.java | 2 +- .../neoforge/common/data/SoundDefinition.java | 2 +- .../data/internal/NeoForgeAdvancementProvider.java | 5 ++--- .../data/internal/NeoForgeLootTableProvider.java | 5 ++--- .../data/internal/NeoForgeRecipeProvider.java | 2 +- .../common/extensions/IAttributeExtension.java | 2 +- .../common/extensions/IBaseRailBlockExtension.java | 2 +- .../neoforge/common/extensions/IBlockExtension.java | 2 +- .../common/extensions/IBlockGetterExtension.java | 2 +- .../common/extensions/IBlockStateExtension.java | 2 +- .../extensions/ICommandSourceStackExtension.java | 2 +- .../IDataComponentMapBuilderExtensions.java | 2 +- .../IDispensibleContainerItemExtension.java | 2 +- .../common/extensions/IEntityExtension.java | 2 +- .../neoforge/common/extensions/IFluidExtension.java | 6 +++--- .../common/extensions/IFluidStateExtension.java | 6 +++--- .../common/extensions/IHolderExtension.java | 5 ++--- .../neoforge/common/extensions/IItemExtension.java | 2 +- .../common/extensions/IItemStackExtension.java | 2 +- .../neoforge/common/extensions/ILevelExtension.java | 2 +- .../neoforge/common/extensions/IOwnedSpawner.java | 2 +- .../common/extensions/IRecipeOutputExtension.java | 2 +- .../IServerCommonPacketListenerExtension.java | 2 +- .../neoforge/common/ticket/SimpleTicket.java | 2 +- .../common/util/AttributeTooltipContext.java | 2 +- .../neoforge/common/util/BlockSnapshot.java | 2 +- .../neoforged/neoforge/common/util/FakePlayer.java | 2 +- .../neoforged/neoforge/common/util/JsonUtils.java | 2 +- .../net/neoforged/neoforge/common/util/Lazy.java | 2 +- .../common/util/MutableHashedLinkedMap.java | 2 +- .../neoforge/common/util/RecipeMatcher.java | 2 +- .../neoforge/common/util/TransformationHelper.java | 2 +- .../world/LevelChunkAuxiliaryLightManager.java | 2 +- .../common/world/MobSpawnSettingsBuilder.java | 5 ++--- .../neoforge/common/world/ModifiableBiomeInfo.java | 2 +- .../common/world/ModifiableStructureInfo.java | 2 +- .../common/world/StructureSettingsBuilder.java | 2 +- .../common/world/chunk/ForcedChunkManager.java | 2 +- .../common/world/chunk/TicketController.java | 2 +- .../neoforge/common/world/chunk/TicketHelper.java | 2 +- .../neoforge/data/event/GatherDataEvent.java | 2 +- .../neoforge/entity/XpOrbTargetingEvent.java | 2 +- .../neoforged/neoforge/event/AnvilUpdateEvent.java | 2 +- .../event/BlockEntityTypeAddBlocksEvent.java | 2 +- .../net/neoforged/neoforge/event/CommandEvent.java | 2 +- .../net/neoforged/neoforge/event/EventHooks.java | 4 ++-- .../event/GatherSkippedAttributeTooltipsEvent.java | 2 +- .../neoforge/event/ItemAttributeModifierEvent.java | 5 ++--- .../neoforge/event/LootTableLoadEvent.java | 2 +- .../neoforged/neoforge/event/ModMismatchEvent.java | 2 +- .../neoforge/event/OnDatapackSyncEvent.java | 2 +- .../neoforge/event/PlayLevelSoundEvent.java | 2 +- .../neoforged/neoforge/event/VanillaGameEvent.java | 2 +- .../event/enchanting/GetEnchantmentLevelEvent.java | 2 +- .../neoforge/event/entity/EntityTeleportEvent.java | 2 +- .../event/entity/RegisterSpawnPlacementsEvent.java | 9 ++++----- .../event/entity/living/BabyEntitySpawnEvent.java | 2 +- .../living/EffectParticleModificationEvent.java | 2 +- .../event/entity/living/FinalizeSpawnEvent.java | 2 +- .../entity/living/LivingChangeTargetEvent.java | 2 +- .../neoforge/event/entity/living/LivingEvent.java | 2 +- .../entity/living/LivingExperienceDropEvent.java | 2 +- .../event/entity/living/MobEffectEvent.java | 2 +- .../neoforge/event/entity/living/MobSpawnEvent.java | 2 +- .../neoforge/event/entity/player/BonemealEvent.java | 2 +- .../entity/player/CanContinueSleepingEvent.java | 2 +- .../event/entity/player/CanPlayerSleepEvent.java | 2 +- .../event/entity/player/ItemTooltipEvent.java | 2 +- .../event/entity/player/PlayerDestroyItemEvent.java | 2 +- .../neoforge/event/entity/player/PlayerEvent.java | 2 +- .../event/entity/player/PlayerInteractEvent.java | 2 +- .../event/entity/player/PlayerSetSpawnEvent.java | 4 ++-- .../event/entity/player/UseItemOnBlockEvent.java | 2 +- .../event/furnace/FurnaceFuelBurnTimeEvent.java | 2 +- .../neoforge/event/level/BlockDropsEvent.java | 2 +- .../neoforged/neoforge/event/level/BlockEvent.java | 2 +- .../neoforge/event/level/BlockGrowFeatureEvent.java | 2 +- .../event/level/ChunkTicketLevelUpdatedEvent.java | 2 +- .../neoforged/neoforge/event/level/LevelEvent.java | 5 ++--- .../neoforged/neoforge/event/level/PistonEvent.java | 2 +- .../neoforged/neoforge/fluids/BaseFlowingFluid.java | 2 +- .../neoforge/fluids/CauldronFluidContent.java | 2 +- .../net/neoforged/neoforge/fluids/FluidStack.java | 2 +- .../neoforge/fluids/FluidStackLinkedSet.java | 2 +- .../net/neoforged/neoforge/fluids/FluidType.java | 2 +- .../net/neoforged/neoforge/fluids/FluidUtil.java | 2 +- .../fluids/RegisterCauldronFluidContentEvent.java | 2 +- .../neoforge/fluids/crafting/FluidIngredient.java | 2 +- .../neoforge/internal/BrandingControl.java | 2 +- .../neoforged/neoforge/internal/NeoForgeProxy.java | 5 ++--- .../neoforge/internal/NeoForgeVersionCheck.java | 2 +- .../neoforged/neoforge/items/ItemHandlerHelper.java | 2 +- .../neoforge/items/wrapper/SidedInvWrapper.java | 2 +- .../neoforged/neoforge/model/data/ModelData.java | 2 +- .../neoforged/neoforge/network/DualStackUtils.java | 2 +- .../neoforge/network/PacketDistributor.java | 2 +- .../network/filters/CommandTreeCleaner.java | 2 +- .../negotiation/NetworkComponentNegotiator.java | 2 +- .../network/payload/CommonRegisterPayload.java | 2 +- .../network/registration/ChannelAttributes.java | 2 +- .../network/registration/NetworkPayloadSetup.java | 2 +- .../network/registration/NetworkRegistry.java | 2 +- .../network/registration/PayloadRegistrar.java | 2 +- .../neoforge/registries/BaseMappedRegistry.java | 2 +- .../registries/DataPackRegistriesHooks.java | 5 ++--- .../neoforge/registries/DataPackRegistryEvent.java | 2 +- .../neoforge/registries/DeferredHolder.java | 2 +- .../neoforge/registries/DeferredRegister.java | 2 +- .../neoforge/registries/IRegistryExtension.java | 2 +- .../neoforge/registries/RegisterEvent.java | 2 +- .../neoforge/registries/RegistryBuilder.java | 2 +- .../neoforge/registries/RegistryManager.java | 2 +- .../neoforge/registries/RegistrySnapshot.java | 2 +- .../registries/datamaps/AdvancedDataMapType.java | 2 +- .../neoforge/registries/datamaps/DataMapType.java | 2 +- .../neoforge/registries/datamaps/IWithData.java | 2 +- .../registries/holdersets/CompositeHolderSet.java | 2 +- .../registries/holdersets/NotHolderSet.java | 2 +- .../neoforge/resource/EmptyPackResources.java | 2 +- .../neoforge/resource/JarContentsPackResources.java | 2 +- .../neoforge/resource/VanillaServerListeners.java | 2 +- .../neoforge/server/ServerLifecycleHooks.java | 2 +- .../neoforge/server/command/TPSCommand.java | 2 +- .../neoforge/server/permission/PermissionAPI.java | 2 +- .../server/permission/nodes/PermissionNode.java | 2 +- .../server/permission/nodes/PermissionTypes.java | 2 +- .../neoforge/transfer/ResourceHandlerUtil.java | 2 +- .../neoforge/transfer/access/ItemAccess.java | 2 +- .../neoforge/transfer/energy/EnergyHandlerUtil.java | 2 +- .../neoforge/transfer/fluid/FluidUtil.java | 2 +- .../neoforge/transfer/item/ComposterWrapper.java | 2 +- .../neoforge/transfer/item/ContainerOrHandler.java | 2 +- .../neoforged/neoforge/transfer/item/ItemUtil.java | 2 +- .../transfer/item/VanillaInventoryCodeHooks.java | 2 +- .../transfer/item/WorldlyContainerWrapper.java | 2 +- .../transfer/transaction/RootCommitJournal.java | 2 +- .../transfer/transaction/SnapshotJournal.java | 2 +- .../neoforge/transfer/transaction/Transaction.java | 2 +- .../transfer/transaction/TransactionManager.java | 2 +- .../neoforge/world/inventory/StackCopySlot.java | 2 +- .../net/neoforged/testframework/DynamicTest.java | 2 +- .../main/java/net/neoforged/testframework/Test.java | 2 +- .../net/neoforged/testframework/TestFramework.java | 2 +- .../net/neoforged/testframework/TestListener.java | 2 +- .../testframework/conf/FrameworkConfiguration.java | 2 +- .../gametest/ExtendedGameTestHelper.java | 2 +- .../testframework/gametest/GameTestData.java | 2 +- .../gametest/StructureTemplateBuilder.java | 2 +- .../gametest/TemplateBuilderHelper.java | 2 +- .../net/neoforged/testframework/group/Group.java | 2 +- .../testframework/impl/FrameworkCollectors.java | 2 +- .../testframework/impl/PlayerTestStore.java | 2 +- .../testframework/impl/TestFrameworkImpl.java | 2 +- .../testframework/impl/test/AbstractTest.java | 2 +- .../impl/test/MethodBasedEventTest.java | 2 +- .../impl/test/MethodBasedGameTestTest.java | 2 +- .../testframework/impl/test/MethodBasedTest.java | 2 +- .../registration/DeferredBlockBuilder.java | 2 +- .../testframework/summary/JUnitSummaryDumper.java | 2 +- .../InsertableLinkedOpenCustomHashSetTest.java | 2 +- .../neoforge/unittest/transfer/HandlerTestUtil.java | 2 +- .../neoforge/unittest/transfer/ItemTests.java | 2 +- .../unittest/transfer/TransactionTests.java | 2 +- .../debug/attachment/AttachmentSyncTests.java | 2 +- .../neoforge/debug/block/BlockEntityTests.java | 2 +- .../neoforged/neoforge/debug/chat/CommandTests.java | 2 +- .../neoforged/neoforge/debug/client/GuiTests.java | 2 +- .../neoforge/debug/crafting/IngredientTests.java | 4 ++-- .../debug/registry/BiomeModifierSyncTest.java | 2 +- .../neoforge/debug/resources/BulkKnownPackTest.java | 2 +- .../neoforge/oldtest/DataGeneratorTest.java | 2 +- .../block/RedstoneSidedConnectivityTest.java | 2 +- .../oldtest/client/model/CompositeModelTest.java | 2 +- .../client/model/CustomItemDisplayContextTest.java | 4 ++-- .../oldtest/client/model/NewModelLoaderTest.java | 2 +- .../oldtest/client/rendering/StencilEnableTest.java | 2 +- .../neoforge/oldtest/fluid/FluidTypeTest.java | 2 +- .../neoforge/oldtest/fluid/NewFluidTest.java | 2 +- .../neoforge/oldtest/item/EnderMaskTest.java | 2 +- .../neoforge/oldtest/misc/GameTestTest.java | 2 +- .../oldtest/recipebook/RecipeBookTestMenu.java | 2 +- .../oldtest/recipebook/RecipeBookTestRecipe.java | 2 +- .../neoforge/oldtest/world/ChunkWatchEventTest.java | 2 +- .../oldtest/world/LoginPacketSplitTest.java | 2 +- 326 files changed, 405 insertions(+), 440 deletions(-) diff --git a/build.gradle b/build.gradle index 2daa34f56cd..b1b68aa816f 100644 --- a/build.gradle +++ b/build.gradle @@ -157,9 +157,10 @@ immaculate { } } - //Replace any FQN versions of javax.annotation.Nullable with the jetbrains variant + //Replace any FQN versions of javax/jetbrains @Nullable with the jspecify variant custom 'jetbrainsNullablePatches', { String fileContents -> - fileContents.replace('@javax.annotation.Nullable', '@org.jetbrains.annotations.Nullable') + fileContents.replace('@javax.annotation.Nullable', '@org.jspecify.annotations.Nullable') + fileContents.replace('@org.jetbrains.annotations.Nullable', '@org.jspecify.annotations.Nullable') } } } diff --git a/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle b/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle index 2a929769d81..e8a22f07e4f 100644 --- a/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle +++ b/buildSrc/src/main/groovy/neoforge.formatting-conventions.gradle @@ -61,13 +61,14 @@ immaculate { } custom 'noNotNull', { String fileContents -> - if (fileContents.contains('@NotNull') || fileContents.contains('@Nonnull')) { - throw new GradleException('@NotNull and @Nonnull are disallowed.') + if (fileContents.contains('@NotNull') || fileContents.contains('@Nonnull') || fileContents.contains('@NonNull')) { + throw new GradleException('Non-nullability annotations are disallowed.') } } - custom 'jetbrainsNullable', { String fileContents -> - fileContents.replace('javax.annotation.Nullable', 'org.jetbrains.annotations.Nullable') + custom 'jspecifyNullable', { String fileContents -> + fileContents.replace('javax.annotation.Nullable', 'org.jspecify.annotations.Nullable') + fileContents.replace('org.jetbrains.annotations.Nullable', 'org.jspecify.annotations.Nullable') } } } diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java index 91a10b359a7..df4af69ea77 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateAccessTransformers.java @@ -21,7 +21,7 @@ import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.Opcodes; /** diff --git a/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java b/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java index 387fa7d5788..714a366070f 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java @@ -29,7 +29,7 @@ import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Creates the JSON profile used by legacyinstaller for installing the client into the vanilla launcher, diff --git a/coremods/src/main/java/net/neoforged/neoforge/coremods/CoremodUtils.java b/coremods/src/main/java/net/neoforged/neoforge/coremods/CoremodUtils.java index 52a63c2ee43..19b6d4d88a2 100644 --- a/coremods/src/main/java/net/neoforged/neoforge/coremods/CoremodUtils.java +++ b/coremods/src/main/java/net/neoforged/neoforge/coremods/CoremodUtils.java @@ -11,7 +11,7 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.MethodNode; diff --git a/coremods/src/main/java/net/neoforged/neoforge/coremods/ReplaceFieldWithGetterAccess.java b/coremods/src/main/java/net/neoforged/neoforge/coremods/ReplaceFieldWithGetterAccess.java index c529d137b48..c0b25da079c 100644 --- a/coremods/src/main/java/net/neoforged/neoforge/coremods/ReplaceFieldWithGetterAccess.java +++ b/coremods/src/main/java/net/neoforged/neoforge/coremods/ReplaceFieldWithGetterAccess.java @@ -13,7 +13,7 @@ import net.neoforged.neoforgespi.transformation.ProcessorName; import net.neoforged.neoforgespi.transformation.SimpleClassProcessor; import net.neoforged.neoforgespi.transformation.SimpleTransformationContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; diff --git a/patches/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch b/patches/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch index 40d3dc45e7e..1c6f14ed6a3 100644 --- a/patches/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch +++ b/patches/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch @@ -172,7 +172,7 @@ return this.menu; + } + -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public Slot getSlotUnderMouse() { return this.hoveredSlot; } + public int getGuiLeft() { return leftPos; } + public int getGuiTop() { return topPos; } diff --git a/patches/net/minecraft/client/model/HumanoidModel.java.patch b/patches/net/minecraft/client/model/HumanoidModel.java.patch index 16db9eae980..cc0df174e0f 100644 --- a/patches/net/minecraft/client/model/HumanoidModel.java.patch +++ b/patches/net/minecraft/client/model/HumanoidModel.java.patch @@ -20,12 +20,11 @@ } } -@@ -445,9 +_,21 @@ +@@ -445,9 +_,20 @@ private final boolean twoHanded; private final boolean affectsOffhandPose; -+ @org.jetbrains.annotations.Nullable -+ private final net.neoforged.neoforge.client.IArmPoseTransformer forgeArmPose; ++ private final net.neoforged.neoforge.client.@org.jspecify.annotations.Nullable IArmPoseTransformer forgeArmPose; + + @net.neoforged.fml.common.asm.enumextension.ReservedConstructor ArmPose(boolean p_102896_, boolean p_470634_) { diff --git a/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch b/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch index 515739c8a6a..7337b9ddaef 100644 --- a/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch @@ -12,7 +12,7 @@ + this.render(p_382792_, p_360652_, p_451561_, null); + } + -+ public void render(MultiBufferSource p_382792_, Vec3 p_360652_, WeatherRenderState p_451561_, @org.jetbrains.annotations.Nullable net.minecraft.client.renderer.state.LevelRenderState levelRenderState) { ++ public void render(MultiBufferSource p_382792_, Vec3 p_360652_, WeatherRenderState p_451561_, net.minecraft.client.renderer.state.@org.jspecify.annotations.Nullable LevelRenderState levelRenderState) { + if (levelRenderState != null && levelRenderState.dimensionSpecialEffects.renderSnowAndRain(levelRenderState, p_451561_, p_382792_, p_360652_)) { + return; + } diff --git a/patches/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java.patch b/patches/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java.patch index e7e3c6f59a3..39874c6d668 100644 --- a/patches/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java.patch +++ b/patches/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java +++ b/net/minecraft/client/renderer/blockentity/state/ChestRenderState.java -@@ -10,6 +_,8 @@ +@@ -10,6 +_,7 @@ public float open; public float angle; public ChestRenderState.ChestMaterialType material = ChestRenderState.ChestMaterialType.REGULAR; -+ @org.jetbrains.annotations.Nullable -+ public net.minecraft.client.resources.model.Material customMaterial; ++ public net.minecraft.client.resources.model.@org.jspecify.annotations.Nullable Material customMaterial; @OnlyIn(Dist.CLIENT) public static enum ChestMaterialType { diff --git a/patches/net/minecraft/client/resources/language/ClientLanguage.java.patch b/patches/net/minecraft/client/resources/language/ClientLanguage.java.patch index e82b4fb609f..773dac3ba0b 100644 --- a/patches/net/minecraft/client/resources/language/ClientLanguage.java.patch +++ b/patches/net/minecraft/client/resources/language/ClientLanguage.java.patch @@ -67,7 +67,7 @@ + } + + @Override -+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) { ++ public net.minecraft.network.chat.@org.jspecify.annotations.Nullable Component getComponent(String key) { + return componentStorage.get(key); } } diff --git a/patches/net/minecraft/client/resources/model/ModelManager.java.patch b/patches/net/minecraft/client/resources/model/ModelManager.java.patch index b3512764a76..739a86f4180 100644 --- a/patches/net/minecraft/client/resources/model/ModelManager.java.patch +++ b/patches/net/minecraft/client/resources/model/ModelManager.java.patch @@ -151,7 +151,7 @@ + return this.modelBakery.get(); + } + -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public T getStandaloneModel(net.neoforged.neoforge.client.model.standalone.StandaloneModelKey modelKey) { + return this.bakedStandaloneModels.get(modelKey); } diff --git a/patches/net/minecraft/core/Holder.java.patch b/patches/net/minecraft/core/Holder.java.patch index 1e24c37dc0a..30b8ee9addc 100644 --- a/patches/net/minecraft/core/Holder.java.patch +++ b/patches/net/minecraft/core/Holder.java.patch @@ -4,7 +4,7 @@ } } -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public A getData(net.neoforged.neoforge.registries.datamaps.DataMapType type) { + if (owner instanceof HolderLookup.RegistryLookup lookup) { + return lookup.getData(type, key()); @@ -15,7 +15,7 @@ void bindTags(Collection> p_205770_) { this.tags = Set.copyOf(p_205770_); } -@@ -238,6 +_,33 @@ +@@ -238,6 +_,32 @@ @Override public String toString() { return "Reference{" + this.key + "=" + this.value + "}"; @@ -23,7 +23,7 @@ + + // Neo: Add key getter that doesn't allocate + @Override -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public ResourceKey getKey() { + return this.key; + } @@ -43,8 +43,7 @@ + + // Neo: Helper method to get the registry lookup from a holder + @Override -+ @org.jetbrains.annotations.Nullable -+ public HolderLookup.RegistryLookup unwrapLookup() { ++ public HolderLookup.@Nullable RegistryLookup unwrapLookup() { + return this.owner instanceof HolderLookup.RegistryLookup rl ? rl : null; } diff --git a/patches/net/minecraft/core/HolderLookup.java.patch b/patches/net/minecraft/core/HolderLookup.java.patch index 152c9748c38..5b26bc1a802 100644 --- a/patches/net/minecraft/core/HolderLookup.java.patch +++ b/patches/net/minecraft/core/HolderLookup.java.patch @@ -11,7 +11,7 @@ + * @param key the object to get the value for + * @param the data type + */ -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + default A getData(net.neoforged.neoforge.registries.datamaps.DataMapType type, ResourceKey key) { + return null; + } @@ -26,7 +26,7 @@ + } + + @Override -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + default A getData(net.neoforged.neoforge.registries.datamaps.DataMapType attachment, ResourceKey key) { + return parent().getData(attachment, key); } diff --git a/patches/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java.patch b/patches/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java.patch index 2c10fc9d8e8..10ca2845471 100644 --- a/patches/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java.patch +++ b/patches/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java.patch @@ -35,7 +35,7 @@ return p_123376_; + } + -+ private static boolean canBoatInFluid(@org.jetbrains.annotations.Nullable AbstractBoat boat, net.minecraft.world.level.material.FluidState fluid) { ++ private static boolean canBoatInFluid(@org.jspecify.annotations.Nullable AbstractBoat boat, net.minecraft.world.level.material.FluidState fluid) { + return boat != null ? boat.canBoatInFluid(fluid) : fluid.is(FluidTags.WATER); } diff --git a/patches/net/minecraft/core/particles/BlockParticleOption.java.patch b/patches/net/minecraft/core/particles/BlockParticleOption.java.patch index f415767a4bd..b834a2361a2 100644 --- a/patches/net/minecraft/core/particles/BlockParticleOption.java.patch +++ b/patches/net/minecraft/core/particles/BlockParticleOption.java.patch @@ -1,12 +1,11 @@ --- a/net/minecraft/core/particles/BlockParticleOption.java +++ b/net/minecraft/core/particles/BlockParticleOption.java -@@ -15,18 +_,39 @@ +@@ -15,18 +_,38 @@ ); private final ParticleType type; private final BlockState state; + /** Neo: Position of the block this particle was spawned for, if available, to provide model data for the particle texture selection */ -+ @org.jetbrains.annotations.Nullable -+ private final net.minecraft.core.BlockPos pos; ++ private final net.minecraft.core.@org.jspecify.annotations.Nullable BlockPos pos; public static MapCodec codec(ParticleType p_123635_) { return BLOCK_STATE_CODEC.xmap(p_123638_ -> new BlockParticleOption(p_123635_, p_123638_), p_123633_ -> p_123633_.state).fieldOf("block_state"); @@ -34,14 +33,14 @@ + * Neo: construct a {@link BlockParticleOption} for the given type and {@link BlockState} and optionally the position + * of the block this particle is being spawned for + */ -+ public BlockParticleOption(ParticleType p_123629_, BlockState p_123630_, @org.jetbrains.annotations.Nullable net.minecraft.core.BlockPos pos) { ++ public BlockParticleOption(ParticleType p_123629_, BlockState p_123630_, net.minecraft.core.@org.jspecify.annotations.Nullable BlockPos pos) { this.type = p_123629_; this.state = p_123630_; + this.pos = pos; } @Override -@@ -36,5 +_,13 @@ +@@ -36,5 +_,12 @@ public BlockState getState() { return this.state; @@ -50,8 +49,7 @@ + /** + * Neo: returns the position of the block this particle was spawned for, if available + */ -+ @org.jetbrains.annotations.Nullable -+ public net.minecraft.core.BlockPos getPos() { ++ public net.minecraft.core.@org.jspecify.annotations.Nullable BlockPos getPos() { + return pos; } } diff --git a/patches/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch b/patches/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch index 3aace608735..b6a8240c226 100644 --- a/patches/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch +++ b/patches/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch @@ -19,11 +19,11 @@ + this(p_256643_, p_255780_, null, java.util.Map.of()); + } + -+ public RegistriesDatapackGenerator(PackOutput p_256643_, CompletableFuture p_255780_, @org.jetbrains.annotations.Nullable java.util.Set modIds) { ++ public RegistriesDatapackGenerator(PackOutput p_256643_, CompletableFuture p_255780_, java.util.@org.jspecify.annotations.Nullable Set modIds) { + this(p_256643_, p_255780_, modIds, java.util.Map.of()); + } + -+ public RegistriesDatapackGenerator(PackOutput p_256643_, CompletableFuture p_255780_, @org.jetbrains.annotations.Nullable java.util.Set modIds, java.util.Map, java.util.List> conditions) { ++ public RegistriesDatapackGenerator(PackOutput p_256643_, CompletableFuture p_255780_, java.util.@org.jspecify.annotations.Nullable Set modIds, java.util.Map, java.util.List> conditions) { + this.namespacePredicate = modIds == null ? namespace -> true : modIds::contains; this.registries = p_255780_; this.output = p_256643_; diff --git a/patches/net/minecraft/data/tags/TagsProvider.java.patch b/patches/net/minecraft/data/tags/TagsProvider.java.patch index ac10da6d376..9a8831a4558 100644 --- a/patches/net/minecraft/data/tags/TagsProvider.java.patch +++ b/patches/net/minecraft/data/tags/TagsProvider.java.patch @@ -40,7 +40,7 @@ + } + + // Forge: Allow customizing the path for a given tag or returning null -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + protected Path getPath(Identifier id) { + return this.pathProvider.json(id); } diff --git a/patches/net/minecraft/locale/Language.java.patch b/patches/net/minecraft/locale/Language.java.patch index b68b0a05d7a..e8b43278a66 100644 --- a/patches/net/minecraft/locale/Language.java.patch +++ b/patches/net/minecraft/locale/Language.java.patch @@ -25,7 +25,7 @@ + } + + @Override -+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) { ++ public net.minecraft.network.chat.@org.jspecify.annotations.Nullable Component getComponent(String key) { + return componentMap.get(key); + } }; @@ -76,7 +76,7 @@ + // Neo: All helpers methods below are injected by Neo to ease modder's usage of Language + public Map getLanguageData() { return com.google.common.collect.ImmutableMap.of(); } + -+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) { ++ public net.minecraft.network.chat.@org.jspecify.annotations.Nullable Component getComponent(String key) { + return null; } diff --git a/patches/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch b/patches/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch index e8f385352ae..966c622bfb5 100644 --- a/patches/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch +++ b/patches/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch @@ -5,7 +5,7 @@ import net.minecraft.resources.RegistryOps; -public record ClientboundStatusResponsePacket(ServerStatus status) implements Packet { -+public record ClientboundStatusResponsePacket(ServerStatus status, @org.jetbrains.annotations.Nullable String cachedStatus) implements Packet { ++public record ClientboundStatusResponsePacket(ServerStatus status, @org.jspecify.annotations.Nullable String cachedStatus) implements Packet { private static final RegistryOps OPS = RegistryAccess.EMPTY.createSerializationContext(JsonOps.INSTANCE); - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + public static final StreamCodec VANILLA_STREAM_CODEC = StreamCodec.composite( diff --git a/patches/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch b/patches/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch index 96f0b19963d..4e2654b7e89 100644 --- a/patches/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch +++ b/patches/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch @@ -4,14 +4,14 @@ public class ServerStatusPacketListenerImpl implements ServerStatusPacketListener { private static final Component DISCONNECT_REASON = Component.translatable("multiplayer.status.request_handled"); private final ServerStatus status; -+ private final @org.jetbrains.annotations.Nullable String statusCache; // FORGE: cache status JSON ++ private final @org.jspecify.annotations.Nullable String statusCache; // FORGE: cache status JSON private final Connection connection; private boolean hasRequestedStatus; public ServerStatusPacketListenerImpl(ServerStatus p_272864_, Connection p_273586_) { + this(p_272864_, p_273586_, null); + } -+ public ServerStatusPacketListenerImpl(ServerStatus p_272864_, Connection p_273586_, @org.jetbrains.annotations.Nullable String statusCache) { ++ public ServerStatusPacketListenerImpl(ServerStatus p_272864_, Connection p_273586_, @org.jspecify.annotations.Nullable String statusCache) { this.status = p_272864_; this.connection = p_273586_; + this.statusCache = statusCache; diff --git a/patches/net/minecraft/world/entity/Entity.java.patch b/patches/net/minecraft/world/entity/Entity.java.patch index 74f56c64f03..10e683e0057 100644 --- a/patches/net/minecraft/world/entity/Entity.java.patch +++ b/patches/net/minecraft/world/entity/Entity.java.patch @@ -606,12 +606,12 @@ + + // Neo: Hookup Capabilities getters to entities + @Nullable -+ public final T getCapability(net.neoforged.neoforge.capabilities.EntityCapability capability, C context) { ++ public final T getCapability(net.neoforged.neoforge.capabilities.EntityCapability capability, C context) { + return capability.getCapability(this, context); + } + + @Nullable -+ public final T getCapability(net.neoforged.neoforge.capabilities.EntityCapability capability) { ++ public final T getCapability(net.neoforged.neoforge.capabilities.EntityCapability capability) { + return capability.getCapability(this, null); } diff --git a/patches/net/minecraft/world/entity/LivingEntity.java.patch b/patches/net/minecraft/world/entity/LivingEntity.java.patch index 6f97472517c..f0897a23479 100644 --- a/patches/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/net/minecraft/world/entity/LivingEntity.java.patch @@ -6,7 +6,7 @@ private static final float WATER_FLOAT_IMPULSE = 0.04F; - public static final Predicate PLAYER_NOT_WEARING_DISGUISE_ITEM = p_401735_ -> { + // Neo: Support IItemExtension#isGazeDisguise -+ public static final java.util.function.BiPredicate PLAYER_NOT_WEARING_DISGUISE_ITEM_FOR_TARGET = (p_401735_, target) -> { ++ public static final java.util.function.BiPredicate PLAYER_NOT_WEARING_DISGUISE_ITEM_FOR_TARGET = (p_401735_, target) -> { if (p_401735_ instanceof Player player) { ItemStack itemstack = player.getItemBySlot(EquipmentSlot.HEAD); - return !itemstack.is(ItemTags.GAZE_DISGUISE_EQUIPMENT); diff --git a/patches/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch b/patches/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch index 19b931e4b38..b10612156fb 100644 --- a/patches/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch +++ b/patches/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch @@ -15,12 +15,11 @@ } public void setDragonFight(EndDragonFight p_287736_) { -@@ -148,8 +_,20 @@ +@@ -148,8 +_,19 @@ p_326491_.define(DATA_PHASE, EnderDragonPhase.HOVERING.getId()); } -+ @org.jetbrains.annotations.Nullable -+ private net.minecraft.world.entity.EntityReference unlimitedLastHurtByPlayer = null; ++ private net.minecraft.world.entity.@Nullable EntityReference unlimitedLastHurtByPlayer = null; + @Override public void aiStep() { diff --git a/patches/net/minecraft/world/item/AxeItem.java.patch b/patches/net/minecraft/world/item/AxeItem.java.patch index f387fc73bf9..d4d93e76d0c 100644 --- a/patches/net/minecraft/world/item/AxeItem.java.patch +++ b/patches/net/minecraft/world/item/AxeItem.java.patch @@ -46,7 +46,7 @@ } } -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public static BlockState getAxeStrippingState(BlockState originalState) { + var strippable = originalState.getBlock().builtInRegistryHolder().getData(net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps.STRIPPABLES); + if (strippable != null) return strippable.strippedBlock().withPropertiesOf(originalState); diff --git a/patches/net/minecraft/world/item/CreativeModeTab.java.patch b/patches/net/minecraft/world/item/CreativeModeTab.java.patch index 47414e1831f..32529b1b5ff 100644 --- a/patches/net/minecraft/world/item/CreativeModeTab.java.patch +++ b/patches/net/minecraft/world/item/CreativeModeTab.java.patch @@ -117,12 +117,11 @@ private final CreativeModeTab.Row row; private final int column; private Component displayName = Component.empty(); -@@ -134,6 +_,16 @@ +@@ -134,6 +_,15 @@ private boolean alignedRight = false; private CreativeModeTab.Type type = CreativeModeTab.Type.CATEGORY; private Identifier backgroundTexture = CreativeModeTab.DEFAULT_BACKGROUND; -+ @org.jetbrains.annotations.Nullable -+ private net.minecraft.resources.Identifier spriteScrollerLocation; ++ private net.minecraft.resources.@Nullable Identifier spriteScrollerLocation; + private boolean hasSearchBar = false; + private int searchBarWidth = 89; + private net.minecraft.resources.Identifier tabsImage = CREATIVE_INVENTORY_TABS_IMAGE; diff --git a/patches/net/minecraft/world/item/ItemDisplayContext.java.patch b/patches/net/minecraft/world/item/ItemDisplayContext.java.patch index fcd7fe550a5..f6fe2e60ae0 100644 --- a/patches/net/minecraft/world/item/ItemDisplayContext.java.patch +++ b/patches/net/minecraft/world/item/ItemDisplayContext.java.patch @@ -25,7 +25,7 @@ + this.fallback = () -> null; + } + -+ private ItemDisplayContext(int id, String name, @org.jetbrains.annotations.Nullable String fallbackName) { ++ private ItemDisplayContext(int id, String name, @org.jspecify.annotations.Nullable String fallbackName) { + this.id = (byte)id; + this.name = name; + this.isModded = true; @@ -50,7 +50,7 @@ + return isModded; + } + -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public ItemDisplayContext fallback() { + return fallback.get(); + } diff --git a/patches/net/minecraft/world/item/ShovelItem.java.patch b/patches/net/minecraft/world/item/ShovelItem.java.patch index 46159327dab..4ec00156187 100644 --- a/patches/net/minecraft/world/item/ShovelItem.java.patch +++ b/patches/net/minecraft/world/item/ShovelItem.java.patch @@ -27,7 +27,7 @@ } + } + -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public static BlockState getShovelPathingState(BlockState originalState) { + return FLATTENABLES.get(originalState.getBlock()); + } diff --git a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch index a7604a0a1fb..168bbb9eb96 100644 --- a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/crafting/Ingredient.java +++ b/net/minecraft/world/item/crafting/Ingredient.java -@@ -23,16 +_,20 @@ +@@ -23,16 +_,18 @@ import net.minecraft.world.level.ItemLike; public final class Ingredient implements StackedContents.IngredientInfo>, Predicate { @@ -20,14 +20,12 @@ - public static final Codec CODEC = ExtraCodecs.nonEmptyHolderSet(NON_AIR_HOLDER_SET_CODEC).xmap(Ingredient::new, p_360061_ -> p_360061_.values); + public static final Codec CODEC = net.neoforged.neoforge.common.crafting.IngredientCodecs.codec(ExtraCodecs.nonEmptyHolderSet(NON_AIR_HOLDER_SET_CODEC).xmap(Ingredient::new, p_360061_ -> p_360061_.values)); private final HolderSet values; -+ @org.jetbrains.annotations.Nullable -+ private net.neoforged.neoforge.common.crafting.ICustomIngredient customIngredient = null; -+ @org.jetbrains.annotations.Nullable -+ private List> customIngredientValues; ++ private net.neoforged.neoforge.common.crafting.@org.jspecify.annotations.Nullable ICustomIngredient customIngredient = null; ++ private @org.jspecify.annotations.Nullable List> customIngredientValues; private Ingredient(HolderSet p_365027_) { p_365027_.unwrap().ifRight(p_360057_ -> { -@@ -45,30 +_,96 @@ +@@ -45,30 +_,95 @@ this.values = p_365027_; } @@ -108,8 +106,7 @@ + return this.customIngredient == null || this.customIngredient.isSimple(); + } + -+ @org.jetbrains.annotations.Nullable -+ public net.neoforged.neoforge.common.crafting.ICustomIngredient getCustomIngredient() { ++ public net.neoforged.neoforge.common.crafting.@org.jspecify.annotations.Nullable ICustomIngredient getCustomIngredient() { + return this.customIngredient; + } + diff --git a/patches/net/minecraft/world/level/BaseSpawner.java.patch b/patches/net/minecraft/world/level/BaseSpawner.java.patch index 729bd958786..2fa419de02b 100644 --- a/patches/net/minecraft/world/level/BaseSpawner.java.patch +++ b/patches/net/minecraft/world/level/BaseSpawner.java.patch @@ -21,15 +21,14 @@ spawndata.getEquipment().ifPresent(mob::equip); } -@@ -281,5 +_,12 @@ +@@ -281,5 +_,11 @@ public double getOSpin() { return this.oSpin; + } + + @Override -+ @org.jetbrains.annotations.Nullable -+ public com.mojang.datafixers.util.Either getOwner() { ++ public com.mojang.datafixers.util.@Nullable Either getOwner() { + // The vanilla anonymous classes have proper overrides, but we return null here for compatibility. + return null; } diff --git a/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch b/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch index 9ba6674b15f..461d674a977 100644 --- a/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch +++ b/patches/net/minecraft/world/level/block/BaseRailBlock.java.patch @@ -60,7 +60,7 @@ + } + + @Override -+ public RailShape getRailDirection(BlockState state, BlockGetter world, BlockPos pos, @org.jetbrains.annotations.Nullable net.minecraft.world.entity.vehicle.minecart.AbstractMinecart cart) { ++ public RailShape getRailDirection(BlockState state, BlockGetter world, BlockPos pos, net.minecraft.world.entity.vehicle.minecart.@Nullable AbstractMinecart cart) { + return state.getValue(getShapeProperty()); } } diff --git a/patches/net/minecraft/world/level/block/DropExperienceBlock.java.patch b/patches/net/minecraft/world/level/block/DropExperienceBlock.java.patch index 0145bd6e3ac..94734d92ee8 100644 --- a/patches/net/minecraft/world/level/block/DropExperienceBlock.java.patch +++ b/patches/net/minecraft/world/level/block/DropExperienceBlock.java.patch @@ -12,8 +12,8 @@ + // Neo: Patch-in override for getExpDrop. Original vanilla logic passes this.xpRange to tryDropExperience. + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@org.jspecify.annotations.Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@org.jspecify.annotations.Nullable Entity breaker, ItemStack tool) { + return this.xpRange.sample(level.getRandom()); } } diff --git a/patches/net/minecraft/world/level/block/FenceGateBlock.java.patch b/patches/net/minecraft/world/level/block/FenceGateBlock.java.patch index bf619af1caf..3c1c7616fa0 100644 --- a/patches/net/minecraft/world/level/block/FenceGateBlock.java.patch +++ b/patches/net/minecraft/world/level/block/FenceGateBlock.java.patch @@ -18,7 +18,7 @@ Util.mapValues(SHAPE_OCCLUSION, p_393359_ -> p_393359_.move(0.0, -0.1875, 0.0).optimize()) ); + public final net.minecraft.sounds.SoundEvent openSound, closeSound; -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable private final WoodType type; @Override diff --git a/patches/net/minecraft/world/level/block/FlowerPotBlock.java.patch b/patches/net/minecraft/world/level/block/FlowerPotBlock.java.patch index ac7e8af636c..752ab8d9bf1 100644 --- a/patches/net/minecraft/world/level/block/FlowerPotBlock.java.patch +++ b/patches/net/minecraft/world/level/block/FlowerPotBlock.java.patch @@ -29,7 +29,7 @@ + * + * @param emptyPot The empty pot for this pot, or null for self. + */ -+ public FlowerPotBlock(@org.jetbrains.annotations.Nullable java.util.function.Supplier emptyPot, java.util.function.Supplier p_53528_, BlockBehaviour.Properties properties) { ++ public FlowerPotBlock(java.util.function.@org.jspecify.annotations.Nullable Supplier emptyPot, java.util.function.Supplier p_53528_, BlockBehaviour.Properties properties) { + super(properties); + this.potted = null; // Unused, redirected by coremod + this.flowerDelegate = p_53528_; @@ -61,7 +61,7 @@ p_316655_.gameEvent(p_316338_, GameEvent.BLOCK_CHANGE, p_316654_); return InteractionResult.SUCCESS; } -@@ -118,12 +_,45 @@ +@@ -118,12 +_,44 @@ } public Block getPotted() { @@ -77,8 +77,7 @@ + // Neo: Maps flower blocks to the filled flower pot equivalent + private final Map> fullPots; + -+ @org.jetbrains.annotations.Nullable -+ private final java.util.function.Supplier emptyPot; ++ private final java.util.function.@org.jspecify.annotations.Nullable Supplier emptyPot; + + private final java.util.function.Supplier flowerDelegate; + diff --git a/patches/net/minecraft/world/level/block/RedStoneOreBlock.java.patch b/patches/net/minecraft/world/level/block/RedStoneOreBlock.java.patch index cb1fabced6f..1e15752bcf4 100644 --- a/patches/net/minecraft/world/level/block/RedStoneOreBlock.java.patch +++ b/patches/net/minecraft/world/level/block/RedStoneOreBlock.java.patch @@ -12,8 +12,8 @@ + // Neo: Patch-in override for getExpDrop. Original vanilla logic passes UniformInt.of(1, 5) to tryDropExperience. + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@org.jspecify.annotations.Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@org.jspecify.annotations.Nullable Entity breaker, ItemStack tool) { + return UniformInt.of(1, 5).sample(level.getRandom()); } diff --git a/patches/net/minecraft/world/level/block/SculkCatalystBlock.java.patch b/patches/net/minecraft/world/level/block/SculkCatalystBlock.java.patch index f13ca722d60..8c6b657531f 100644 --- a/patches/net/minecraft/world/level/block/SculkCatalystBlock.java.patch +++ b/patches/net/minecraft/world/level/block/SculkCatalystBlock.java.patch @@ -13,8 +13,8 @@ + // Neo: Patch-in override for getExpDrop. Original vanilla logic passes this.xpRange to tryDropExperience. + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@Nullable Entity breaker, ItemStack tool) { + return this.xpRange.sample(level.getRandom()); } } diff --git a/patches/net/minecraft/world/level/block/SculkSensorBlock.java.patch b/patches/net/minecraft/world/level/block/SculkSensorBlock.java.patch index 19f476d5e52..8ae76a983cc 100644 --- a/patches/net/minecraft/world/level/block/SculkSensorBlock.java.patch +++ b/patches/net/minecraft/world/level/block/SculkSensorBlock.java.patch @@ -12,8 +12,8 @@ + // Neo: Patch-in override for getExpDrop. Original vanilla logic passes ConstantInt.of(5) to tryDropExperience. + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@Nullable Entity breaker, ItemStack tool) { + return 5; } } diff --git a/patches/net/minecraft/world/level/block/SculkShriekerBlock.java.patch b/patches/net/minecraft/world/level/block/SculkShriekerBlock.java.patch index 3eb50bc7592..c38ad6cade6 100644 --- a/patches/net/minecraft/world/level/block/SculkShriekerBlock.java.patch +++ b/patches/net/minecraft/world/level/block/SculkShriekerBlock.java.patch @@ -12,8 +12,8 @@ + // Neo: Patch-in override for getExpDrop. Original vanilla logic passes ConstantInt.of(5) to tryDropExperience. + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@Nullable Entity breaker, ItemStack tool) { + return 5; } diff --git a/patches/net/minecraft/world/level/block/SpawnerBlock.java.patch b/patches/net/minecraft/world/level/block/SpawnerBlock.java.patch index 4a2d8e981e3..95680281b4f 100644 --- a/patches/net/minecraft/world/level/block/SpawnerBlock.java.patch +++ b/patches/net/minecraft/world/level/block/SpawnerBlock.java.patch @@ -14,8 +14,8 @@ + // Original vanilla logic passes 15 + p_222478_.random.nextInt(15) + p_222478_.random.nextInt(15) to popExperience, bypassing enchantments + @Override + public int getExpDrop(BlockState state, net.minecraft.world.level.LevelAccessor level, BlockPos pos, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.level.block.entity.BlockEntity blockEntity, -+ @org.jetbrains.annotations.Nullable net.minecraft.world.entity.Entity breaker, ItemStack tool) { ++ net.minecraft.world.level.block.entity.@Nullable BlockEntity blockEntity, ++ net.minecraft.world.entity.@Nullable Entity breaker, ItemStack tool) { + return 15 + level.getRandom().nextInt(15) + level.getRandom().nextInt(15); } } diff --git a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch index 2ab708c6fb6..cf803fdb90e 100644 --- a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch +++ b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch @@ -13,15 +13,14 @@ mob.setPersistenceRequired(); spawndata.getEquipment().ifPresent(mob::equip); -@@ -414,5 +_,14 @@ +@@ -414,5 +_,13 @@ TrialSpawnerState getState(); void markUpdated(); + } + + @Override -+ @org.jetbrains.annotations.Nullable -+ public com.mojang.datafixers.util.Either getOwner() { ++ public com.mojang.datafixers.util.@org.jspecify.annotations.Nullable Either getOwner() { + if (this.stateAccessor instanceof net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity be) { + return com.mojang.datafixers.util.Either.left(be); + } diff --git a/patches/net/minecraft/world/level/storage/loot/LootContext.java.patch b/patches/net/minecraft/world/level/storage/loot/LootContext.java.patch index da24fc299e9..e11dd4a6dd7 100644 --- a/patches/net/minecraft/world/level/storage/loot/LootContext.java.patch +++ b/patches/net/minecraft/world/level/storage/loot/LootContext.java.patch @@ -5,7 +5,7 @@ } + // Neo: Keep track of the original loot table ID through modifications -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + private Identifier queriedLootTableId; + + private LootContext(LootParams p_287722_, RandomSource p_287702_, HolderGetter.Provider p_287619_, Identifier queriedLootTableId) { @@ -13,7 +13,7 @@ + this.queriedLootTableId = queriedLootTableId; + } + -+ public void setQueriedLootTableId(@org.jetbrains.annotations.Nullable Identifier queriedLootTableId) { ++ public void setQueriedLootTableId(@org.jspecify.annotations.Nullable Identifier queriedLootTableId) { + if (this.queriedLootTableId == null && queriedLootTableId != null) this.queriedLootTableId = queriedLootTableId; + } + diff --git a/patches/net/minecraft/world/level/storage/loot/LootDataType.java.patch b/patches/net/minecraft/world/level/storage/loot/LootDataType.java.patch index 94f50caef42..e3737de1348 100644 --- a/patches/net/minecraft/world/level/storage/loot/LootDataType.java.patch +++ b/patches/net/minecraft/world/level/storage/loot/LootDataType.java.patch @@ -5,7 +5,7 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -public record LootDataType(ResourceKey> registryKey, Codec codec, LootDataType.Validator validator) { -+public record LootDataType(ResourceKey> registryKey, Codec codec, LootDataType.Validator validator, @org.jetbrains.annotations.Nullable T defaultValue, Codec> conditionalCodec, java.util.function.BiConsumer idSetter) { ++public record LootDataType(ResourceKey> registryKey, Codec codec, LootDataType.Validator validator, @org.jspecify.annotations.Nullable T defaultValue, Codec> conditionalCodec, java.util.function.BiConsumer idSetter) { public static final LootDataType PREDICATE = new LootDataType<>( Registries.PREDICATE, LootItemCondition.DIRECT_CODEC, createSimpleValidator() ); @@ -23,7 +23,7 @@ + this(registryKey, codec, validator, null, (it, id) -> {}); + } + -+ private LootDataType(ResourceKey> registryKey, Codec codec, LootDataType.Validator validator, @org.jetbrains.annotations.Nullable T defaultValue, java.util.function.BiConsumer idSetter) { ++ private LootDataType(ResourceKey> registryKey, Codec codec, LootDataType.Validator validator, @org.jspecify.annotations.Nullable T defaultValue, java.util.function.BiConsumer idSetter) { + this(registryKey, codec, validator, defaultValue, net.neoforged.neoforge.common.conditions.ConditionalOps.createConditionalCodec(codec), idSetter); + } diff --git a/patches/net/minecraft/world/level/storage/loot/LootPool.java.patch b/patches/net/minecraft/world/level/storage/loot/LootPool.java.patch index 3cc301a4e37..3baafd11f05 100644 --- a/patches/net/minecraft/world/level/storage/loot/LootPool.java.patch +++ b/patches/net/minecraft/world/level/storage/loot/LootPool.java.patch @@ -49,10 +49,10 @@ + } + + // Neo: Apply names for LootPools to allow easier targeting specific pools -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + private String name; + -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public String getName() { + return this.name; + } @@ -90,7 +90,7 @@ private final ImmutableList.Builder functions = ImmutableList.builder(); private NumberProvider rolls = ConstantValue.exactly(1.0F); private NumberProvider bonusRolls = ConstantValue.exactly(0.0F); -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + private String name; public LootPool.Builder setRolls(NumberProvider p_165134_) { diff --git a/patches/net/minecraft/world/level/storage/loot/LootTable.java.patch b/patches/net/minecraft/world/level/storage/loot/LootTable.java.patch index 5917dc56f17..e1931291de9 100644 --- a/patches/net/minecraft/world/level/storage/loot/LootTable.java.patch +++ b/patches/net/minecraft/world/level/storage/loot/LootTable.java.patch @@ -105,13 +105,13 @@ + } + + // Neo: Retrieve LootPools by name -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public LootPool getPool(String name) { + return pools.stream().filter(e -> name.equals(e.getName())).findFirst().orElse(null); + } + + // Neo: Remove LootPools by name -+ @org.jetbrains.annotations.Nullable ++ @org.jspecify.annotations.Nullable + public LootPool removePool(String name) { + checkFrozen(); + for (LootPool pool : this.pools) { diff --git a/src/client/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java b/src/client/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java index b7109e6777a..4b4b6465a26 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java @@ -34,7 +34,7 @@ import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Scoreboard; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * overrides for {@link CommandSourceStack} so that the methods will run successfully client side diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index f1e5eb323f6..9ee355f291d 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -219,10 +219,10 @@ import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Vector3fc; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; /** * Class for various client-side-only hooks. diff --git a/src/client/java/net/neoforged/neoforge/client/CreativeModeTabSearchRegistry.java b/src/client/java/net/neoforged/neoforge/client/CreativeModeTabSearchRegistry.java index 3357b7602b5..9e859388297 100644 --- a/src/client/java/net/neoforged/neoforge/client/CreativeModeTabSearchRegistry.java +++ b/src/client/java/net/neoforged/neoforge/client/CreativeModeTabSearchRegistry.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.common.CreativeModeTabRegistry; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class CreativeModeTabSearchRegistry { private static final Map NAME_SEARCH_KEYS = new IdentityHashMap<>(); @@ -51,8 +51,7 @@ public static Map getTagSearchKeys() { return tagSearchKeys; } - @Nullable - public static SessionSearchTrees.Key getNameSearchKey(CreativeModeTab tab) { + public static SessionSearchTrees.@Nullable Key getNameSearchKey(CreativeModeTab tab) { if (tab == CreativeModeTabs.searchTab()) return SessionSearchTrees.CREATIVE_NAMES; @@ -62,8 +61,7 @@ public static SessionSearchTrees.Key getNameSearchKey(CreativeModeTab tab) { return NAME_SEARCH_KEYS.computeIfAbsent(tab, k -> new SessionSearchTrees.Key()); } - @Nullable - public static SessionSearchTrees.Key getTagSearchKey(CreativeModeTab tab) { + public static SessionSearchTrees.@Nullable Key getTagSearchKey(CreativeModeTab tab) { if (tab == CreativeModeTabs.searchTab()) return SessionSearchTrees.CREATIVE_TAGS; diff --git a/src/client/java/net/neoforged/neoforge/client/DimensionTransitionScreenManager.java b/src/client/java/net/neoforged/neoforge/client/DimensionTransitionScreenManager.java index 1c723f81486..23c65e31d01 100644 --- a/src/client/java/net/neoforged/neoforge/client/DimensionTransitionScreenManager.java +++ b/src/client/java/net/neoforged/neoforge/client/DimensionTransitionScreenManager.java @@ -15,7 +15,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.RegisterDimensionTransitionScreenEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class DimensionTransitionScreenManager { private static final Map, ResourceKey>, ReceivingLevelScreenFactory> conditionalDimensionEffects = new HashMap<>(); diff --git a/src/client/java/net/neoforged/neoforge/client/EntitySpectatorShaderManager.java b/src/client/java/net/neoforged/neoforge/client/EntitySpectatorShaderManager.java index 67c612e8465..bd9fe6262de 100644 --- a/src/client/java/net/neoforged/neoforge/client/EntitySpectatorShaderManager.java +++ b/src/client/java/net/neoforged/neoforge/client/EntitySpectatorShaderManager.java @@ -13,7 +13,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.RegisterEntitySpectatorShadersEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Manager for entity spectator mode shaders. diff --git a/src/client/java/net/neoforged/neoforge/client/FireworkShapeFactoryRegistry.java b/src/client/java/net/neoforged/neoforge/client/FireworkShapeFactoryRegistry.java index 76751f27455..2bc518e00a2 100644 --- a/src/client/java/net/neoforged/neoforge/client/FireworkShapeFactoryRegistry.java +++ b/src/client/java/net/neoforged/neoforge/client/FireworkShapeFactoryRegistry.java @@ -9,7 +9,7 @@ import java.util.Map; import net.minecraft.client.particle.FireworkParticles; import net.minecraft.world.item.component.FireworkExplosion; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Keeps track of custom firework shape types, because Particle is client side only this can't be on the Shape itself. diff --git a/src/client/java/net/neoforged/neoforge/client/PresetEditorManager.java b/src/client/java/net/neoforged/neoforge/client/PresetEditorManager.java index e9fd4a0f7f9..a9579e104d0 100644 --- a/src/client/java/net/neoforged/neoforge/client/PresetEditorManager.java +++ b/src/client/java/net/neoforged/neoforge/client/PresetEditorManager.java @@ -13,7 +13,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.RegisterPresetEditorsEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class PresetEditorManager { private PresetEditorManager() {} // Utility class diff --git a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java index bd49a4b6bd5..042eddf7b0b 100644 --- a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java +++ b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java @@ -18,7 +18,7 @@ import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Validation wrapper around CommandEncoder diff --git a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java index c4fd24e9d65..02e88acb7ed 100644 --- a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java +++ b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.client.blaze3d.GpuDeviceFeatures; import net.neoforged.neoforge.client.blaze3d.GpuDeviceProperties; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * The validation GpuDevice is used to ensure that both mods and backends are complying with the B3D API contract correctly. diff --git a/src/client/java/net/neoforged/neoforge/client/color/item/FluidContentsTint.java b/src/client/java/net/neoforged/neoforge/client/color/item/FluidContentsTint.java index 7e38a9dc7b2..f6b16270145 100644 --- a/src/client/java/net/neoforged/neoforge/client/color/item/FluidContentsTint.java +++ b/src/client/java/net/neoforged/neoforge/client/color/item/FluidContentsTint.java @@ -13,7 +13,7 @@ import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.client.model.item.DynamicFluidContainerModel; import net.neoforged.neoforge.transfer.fluid.FluidUtil; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Returns the tint color of the fluid contained in the item stack. diff --git a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationHolder.java b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationHolder.java index ffbdcf9408d..ffff5d35a6a 100644 --- a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationHolder.java +++ b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationHolder.java @@ -9,7 +9,7 @@ import java.util.Map; import net.minecraft.client.animation.AnimationDefinition; import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationLoader.java b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationLoader.java index f7e2d823409..c8297a8169f 100644 --- a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationLoader.java +++ b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationLoader.java @@ -22,7 +22,7 @@ import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; import net.minecraft.util.Util; import net.neoforged.neoforge.resource.ContextAwareReloadListener; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationTypeManager.java b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationTypeManager.java index ebc7edde89e..5112fc792c4 100644 --- a/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationTypeManager.java +++ b/src/client/java/net/neoforged/neoforge/client/entity/animation/json/AnimationTypeManager.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.client.entity.animation.AnimationTarget; import net.neoforged.neoforge.client.event.RegisterJsonAnimationTypesEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Manager for custom {@link AnimationTarget}s and {@link AnimationChannel.Interpolation interpolation function}s. @@ -85,8 +85,7 @@ public static Codec getKeyframeCodec(AnimationTarget target) { /** * Gets the {@link AnimationChannel.Interpolation interpolation function} associated with the given {@code name}. */ - @Nullable - public static AnimationChannel.Interpolation getInterpolation(Identifier name) { + public static AnimationChannel.@Nullable Interpolation getInterpolation(Identifier name) { return INTERPOLATIONS.get(name); } diff --git a/src/client/java/net/neoforged/neoforge/client/event/ClientChatReceivedEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ClientChatReceivedEvent.java index f886ff803ec..8ff0fe07feb 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ClientChatReceivedEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ClientChatReceivedEvent.java @@ -15,7 +15,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a chat message is received on the client. @@ -31,12 +31,11 @@ */ public class ClientChatReceivedEvent extends Event implements ICancellableEvent { private Component message; - @Nullable - private final ChatType.Bound boundChatType; + private final ChatType.@Nullable Bound boundChatType; private final UUID sender; @ApiStatus.Internal - public ClientChatReceivedEvent(@Nullable ChatType.Bound boundChatType, Component message, UUID sender) { + public ClientChatReceivedEvent(ChatType.@Nullable Bound boundChatType, Component message, UUID sender) { this.boundChatType = boundChatType; this.message = message; this.sender = sender; @@ -64,8 +63,7 @@ public void setMessage(Component message) { *

* This may be {@code null} when the message doesn't have a specific source (i.e. for system messages). */ - @Nullable - public ChatType.Bound getBoundChatType() { + public ChatType.@Nullable Bound getBoundChatType() { return this.boundChatType; } diff --git a/src/client/java/net/neoforged/neoforge/client/event/ClientPlayerNetworkEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ClientPlayerNetworkEvent.java index 5ca2992e045..3b4e4dd3d25 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ClientPlayerNetworkEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ClientPlayerNetworkEvent.java @@ -12,7 +12,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired for different client connectivity events. diff --git a/src/client/java/net/neoforged/neoforge/client/event/EntityRenderersEvent.java b/src/client/java/net/neoforged/neoforge/client/event/EntityRenderersEvent.java index 9c9117b7456..b6649ddfd14 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/EntityRenderersEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/EntityRenderersEvent.java @@ -40,7 +40,7 @@ import net.neoforged.fml.event.IModBusEvent; import net.neoforged.neoforge.client.ClientHooks; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired for on different events/actions relating to {@linkplain EntityRenderer entity renderers}. diff --git a/src/client/java/net/neoforged/neoforge/client/event/RegisterDebugEntriesEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RegisterDebugEntriesEvent.java index 361fcf56d53..9164d0987cc 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RegisterDebugEntriesEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RegisterDebugEntriesEvent.java @@ -21,7 +21,7 @@ import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.loading.FMLEnvironment; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Event fired when debug entries are registered. diff --git a/src/client/java/net/neoforged/neoforge/client/event/RegisterGuiLayersEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RegisterGuiLayersEvent.java index b3c72eb6c28..948659f9d4b 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RegisterGuiLayersEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RegisterGuiLayersEvent.java @@ -19,7 +19,7 @@ import net.neoforged.neoforge.client.gui.GuiLayerManager; import net.neoforged.neoforge.client.gui.VanillaGuiLayers; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Allows users to register custom {@link GuiLayer layers} for GUI rendering. diff --git a/src/client/java/net/neoforged/neoforge/client/event/RenderLevelStageEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RenderLevelStageEvent.java index cbcc1a44f92..c937f548f32 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RenderLevelStageEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RenderLevelStageEvent.java @@ -15,8 +15,8 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.client.IRenderableSection; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; +import org.jspecify.annotations.Nullable; /** * Fires at various times during {@linkplain LevelRenderer#renderLevel} and {@linkplain GameRenderer#renderLevel}. diff --git a/src/client/java/net/neoforged/neoforge/client/event/RenderNameTagEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RenderNameTagEvent.java index f46f2b633fa..5961deec098 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RenderNameTagEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RenderNameTagEvent.java @@ -17,7 +17,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired before an entity renderer renders the nameplate of an entity. diff --git a/src/client/java/net/neoforged/neoforge/client/event/RenderTooltipEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RenderTooltipEvent.java index 9df377e96fb..e0de3920b76 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/RenderTooltipEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/RenderTooltipEvent.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired during tooltip rendering. diff --git a/src/client/java/net/neoforged/neoforge/client/event/ScreenEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ScreenEvent.java index 22e7e684950..dfbc93a61bf 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ScreenEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ScreenEvent.java @@ -24,7 +24,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.glfw.GLFW; /** diff --git a/src/client/java/net/neoforged/neoforge/client/event/ScreenshotEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ScreenshotEvent.java index bb77a9126cc..6da41abd345 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ScreenshotEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ScreenshotEvent.java @@ -15,7 +15,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a screenshot is taken, but before it is written to disk. diff --git a/src/client/java/net/neoforged/neoforge/client/event/SelectMusicEvent.java b/src/client/java/net/neoforged/neoforge/client/event/SelectMusicEvent.java index 67fa93922b3..633f3649e78 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/SelectMusicEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/SelectMusicEvent.java @@ -12,7 +12,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when the {@link net.minecraft.client.sounds.MusicManager} checks what situational music should be used. This fires before the music begins playing.
diff --git a/src/client/java/net/neoforged/neoforge/client/event/ViewportEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ViewportEvent.java index 337054c1b57..232c1885c21 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ViewportEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ViewportEvent.java @@ -16,7 +16,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired for hooking into the entity view rendering in {@link GameRenderer}. diff --git a/src/client/java/net/neoforged/neoforge/client/event/sound/PlaySoundEvent.java b/src/client/java/net/neoforged/neoforge/client/event/sound/PlaySoundEvent.java index 1d3c52d0b19..e2bbf8063d5 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/sound/PlaySoundEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/sound/PlaySoundEvent.java @@ -10,7 +10,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a sound is about to be played by the sound engine. This fires before the sound is played and before any diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/BlockStateModelExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/BlockStateModelExtension.java index 31cf4effce4..e40a4b9308f 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/BlockStateModelExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/BlockStateModelExtension.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.common.extensions.IBlockGetterExtension; import net.neoforged.neoforge.common.extensions.IBlockStateExtension; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface BlockStateModelExtension { private BlockStateModel self() { diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/IRenderStateExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/IRenderStateExtension.java index 1170a443ac1..8f1bc937e17 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/IRenderStateExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/IRenderStateExtension.java @@ -7,7 +7,7 @@ import net.minecraft.util.context.ContextKey; import net.neoforged.neoforge.client.renderstate.BaseRenderState; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension class for render state objects. Implemented by {@link BaseRenderState} for diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerExtension.java index a49fec5c9ad..1f4b58210d4 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/ModelBakerExtension.java @@ -11,7 +11,7 @@ import net.minecraft.client.resources.model.ResolvableModel; import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.client.resources.model.UnbakedModel; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface ModelBakerExtension { /** diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/ResolvedModelExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/ResolvedModelExtension.java index dba75168c46..62f1d125988 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/ResolvedModelExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/ResolvedModelExtension.java @@ -8,7 +8,7 @@ import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.util.context.ContextKeySet; import net.minecraft.util.context.ContextMap; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension for {@link ResolvedModel}. diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientBlockExtensions.java b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientBlockExtensions.java index fb8aff7145b..0dcc6679786 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientBlockExtensions.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientBlockExtensions.java @@ -24,8 +24,8 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.HitResult; import net.neoforged.fml.LogicalSide; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; +import org.jspecify.annotations.Nullable; /** * {@linkplain LogicalSide#CLIENT Client-only} extensions to {@link Block}. diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientFluidTypeExtensions.java b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientFluidTypeExtensions.java index f114fc957c8..20c525f05dc 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientFluidTypeExtensions.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientFluidTypeExtensions.java @@ -25,8 +25,8 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.FluidType; -import org.jetbrains.annotations.Nullable; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; /** * {@linkplain LogicalSide#CLIENT Client-only} extensions to {@link FluidType}. diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientItemExtensions.java b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientItemExtensions.java index 89933781caa..8e904e0fac2 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientItemExtensions.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/common/IClientItemExtensions.java @@ -30,7 +30,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.IArmPoseTransformer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * {@linkplain LogicalSide#CLIENT Client-only} extensions to {@link Item}. @@ -70,8 +70,7 @@ default Font getFont(ItemStack stack, FontContext context) { * @param itemStack The stack being held * @return A custom ArmPose that can be used to define movement of the arm */ - @Nullable - default HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) { + default HumanoidModel.@Nullable ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) { return null; } diff --git a/src/client/java/net/neoforged/neoforge/client/gui/ClientTooltipComponentManager.java b/src/client/java/net/neoforged/neoforge/client/gui/ClientTooltipComponentManager.java index 4ca0ce7fe43..1dc6b8bd109 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/ClientTooltipComponentManager.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/ClientTooltipComponentManager.java @@ -13,7 +13,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Manager for {@link ClientTooltipComponent} factories. diff --git a/src/client/java/net/neoforged/neoforge/client/gui/ConfigurationScreen.java b/src/client/java/net/neoforged/neoforge/client/gui/ConfigurationScreen.java index f1f131ee71b..749bec4d845 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/ConfigurationScreen.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/ConfigurationScreen.java @@ -77,7 +77,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.util.Strings; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.glfw.GLFW; /** diff --git a/src/client/java/net/neoforged/neoforge/client/gui/LoadingErrorScreen.java b/src/client/java/net/neoforged/neoforge/client/gui/LoadingErrorScreen.java index cab854073a2..b3782ba2e8f 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/LoadingErrorScreen.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/LoadingErrorScreen.java @@ -26,7 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public class LoadingErrorScreen extends ErrorScreen { diff --git a/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java b/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java index 7f716396ff0..0fa69e3d9ad 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/ModListScreen.java @@ -63,7 +63,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.maven.artifact.versioning.ComparableVersion; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ModListScreen extends Screen { private static String stripControlCodes(String value) { diff --git a/src/client/java/net/neoforged/neoforge/client/gui/ModMismatchDisconnectedScreen.java b/src/client/java/net/neoforged/neoforge/client/gui/ModMismatchDisconnectedScreen.java index b1cb1a3c4ed..d78f2a303ad 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/ModMismatchDisconnectedScreen.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/ModMismatchDisconnectedScreen.java @@ -41,7 +41,7 @@ import net.neoforged.neoforge.client.gui.widget.ScrollPanel; import org.apache.commons.lang3.mutable.MutableObject; import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; public class ModMismatchDisconnectedScreen extends Screen { diff --git a/src/client/java/net/neoforged/neoforge/client/gui/PictureInPictureRendererPool.java b/src/client/java/net/neoforged/neoforge/client/gui/PictureInPictureRendererPool.java index 29dd2503a62..b730ed63b50 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/PictureInPictureRendererPool.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/PictureInPictureRendererPool.java @@ -14,7 +14,7 @@ import net.minecraft.client.gui.render.state.pip.PictureInPictureRenderState; import net.minecraft.client.renderer.MultiBufferSource; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Pools {@link PictureInPictureRenderer} for a single type of {@link PictureInPictureRenderState} and tries diff --git a/src/client/java/net/neoforged/neoforge/client/gui/widget/ModsButton.java b/src/client/java/net/neoforged/neoforge/client/gui/widget/ModsButton.java index e8772b572d2..15d64c31705 100644 --- a/src/client/java/net/neoforged/neoforge/client/gui/widget/ModsButton.java +++ b/src/client/java/net/neoforged/neoforge/client/gui/widget/ModsButton.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.client.loading.ClientModLoader; import net.neoforged.neoforge.common.NeoForgeMod; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Custom button subclass to draw an indicator overlay on the button when updates are available. @@ -23,8 +23,7 @@ public class ModsButton extends Button.Plain { private static final Identifier VERSION_CHECK_ICONS = Identifier.fromNamespaceAndPath(NeoForgeMod.MOD_ID, "textures/gui/version_check_icons.png"); - @Nullable - private VersionChecker.Status showNotification; + private VersionChecker.@Nullable Status showNotification; private boolean hasCheckedForUpdates = false; public ModsButton(Builder builder) { diff --git a/src/client/java/net/neoforged/neoforge/client/internal/NeoForgeClientProxy.java b/src/client/java/net/neoforged/neoforge/client/internal/NeoForgeClientProxy.java index 783f81fe657..c7378465318 100644 --- a/src/client/java/net/neoforged/neoforge/client/internal/NeoForgeClientProxy.java +++ b/src/client/java/net/neoforged/neoforge/client/internal/NeoForgeClientProxy.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.TooltipFlag; import net.neoforged.neoforge.internal.NeoForgeProxy; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public class NeoForgeClientProxy extends NeoForgeProxy { @@ -29,8 +29,7 @@ public TooltipFlag getTooltipFlag() { } @Override - @Nullable - public HolderLookup.RegistryLookup resolveLookup(ResourceKey> key) { + public HolderLookup.@Nullable RegistryLookup resolveLookup(ResourceKey> key) { var lookup = super.resolveLookup(key); if (lookup == null) { ClientLevel level = Minecraft.getInstance().level; diff --git a/src/client/java/net/neoforged/neoforge/client/loading/ClientModLoader.java b/src/client/java/net/neoforged/neoforge/client/loading/ClientModLoader.java index 67485e46189..7478c31b442 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/ClientModLoader.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/ClientModLoader.java @@ -33,7 +33,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public class ClientModLoader extends CommonModLoader { diff --git a/src/client/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java b/src/client/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java index c0526dba879..c67cef89a20 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/AbstractUnbakedModel.java @@ -14,7 +14,7 @@ import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.Identifier; import net.minecraft.util.context.ContextMap; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Base unbaked model for custom models which support the standard top-level model parameters diff --git a/src/client/java/net/neoforged/neoforge/client/model/DelegateUnbakedModel.java b/src/client/java/net/neoforged/neoforge/client/model/DelegateUnbakedModel.java index b9711786022..7842672b142 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/DelegateUnbakedModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/DelegateUnbakedModel.java @@ -11,7 +11,7 @@ import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.Identifier; import net.minecraft.util.context.ContextMap; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class DelegateUnbakedModel implements UnbakedModel { protected final UnbakedModel delegate; diff --git a/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java b/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java index 80f5c850af5..8d770be9633 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java +++ b/src/client/java/net/neoforged/neoforge/client/model/ExtraFaceData.java @@ -14,7 +14,7 @@ import java.util.function.Function; import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.BlockElementFace; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Holds extra data that may be injected into a face.

diff --git a/src/client/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java b/src/client/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java index 2edf0af5e8a..8f1de4089c0 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java +++ b/src/client/java/net/neoforged/neoforge/client/model/NeoForgeModelProperties.java @@ -19,7 +19,7 @@ import net.minecraft.util.context.ContextMap; import net.neoforged.neoforge.client.NamedRenderTypeManager; import net.neoforged.neoforge.client.RenderTypeGroup; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Properties that NeoForge adds for {@link BlockModel}s and {@link UnbakedModel}s. diff --git a/src/client/java/net/neoforged/neoforge/client/model/StandardModelParameters.java b/src/client/java/net/neoforged/neoforge/client/model/StandardModelParameters.java index 7a84ff5034d..22cc7653a3d 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/StandardModelParameters.java +++ b/src/client/java/net/neoforged/neoforge/client/model/StandardModelParameters.java @@ -15,7 +15,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.util.GsonHelper; import net.neoforged.neoforge.client.RenderTypeGroup; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Wrapper around all standard top-level model parameters added by vanilla and NeoForge except elements. @@ -28,7 +28,7 @@ public record StandardModelParameters( TextureSlots.Data textures, @Nullable ItemTransforms itemTransforms, @Nullable Boolean ambientOcclusion, - @Nullable UnbakedModel.GuiLight guiLight, + UnbakedModel.@Nullable GuiLight guiLight, @Nullable Transformation rootTransform, RenderTypeGroup renderTypeGroup, Map partVisibility) { diff --git a/src/client/java/net/neoforged/neoforge/client/model/UnbakedElementsHelper.java b/src/client/java/net/neoforged/neoforge/client/model/UnbakedElementsHelper.java index 9a5843adab5..60d13828e82 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/UnbakedElementsHelper.java +++ b/src/client/java/net/neoforged/neoforge/client/model/UnbakedElementsHelper.java @@ -25,8 +25,8 @@ import net.minecraft.client.resources.model.QuadCollection; import net.minecraft.core.Direction; import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; public final class UnbakedElementsHelper { private UnbakedElementsHelper() {} diff --git a/src/client/java/net/neoforged/neoforge/client/model/UnbakedModelParser.java b/src/client/java/net/neoforged/neoforge/client/model/UnbakedModelParser.java index a802920d8d1..b6f5496b25d 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/UnbakedModelParser.java +++ b/src/client/java/net/neoforged/neoforge/client/model/UnbakedModelParser.java @@ -22,7 +22,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.ModelEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class UnbakedModelParser { private static ImmutableMap> LOADERS; diff --git a/src/client/java/net/neoforged/neoforge/client/model/block/CompositeBlockModel.java b/src/client/java/net/neoforged/neoforge/client/model/block/CompositeBlockModel.java index 6ff96cb8ce6..19505274e65 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/block/CompositeBlockModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/block/CompositeBlockModel.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.DynamicBlockStateModel; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class CompositeBlockModel implements DynamicBlockStateModel { private final List models; diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/blockstate/UnbakedMutator.java b/src/client/java/net/neoforged/neoforge/client/model/generators/blockstate/UnbakedMutator.java index fcb600eb75c..73dae8efbb9 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/blockstate/UnbakedMutator.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/blockstate/UnbakedMutator.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.function.UnaryOperator; import net.minecraft.client.renderer.block.model.BlockStateModel; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Implements functionality similar to Vanillas {@link net.minecraft.client.renderer.block.model.VariantMutator}, diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/loaders/ObjModelBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/loaders/ObjModelBuilder.java index 8bcc3183cff..19325bac15c 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/loaders/ObjModelBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/loaders/ObjModelBuilder.java @@ -10,7 +10,7 @@ import net.minecraft.resources.Identifier; import net.neoforged.neoforge.client.model.generators.template.CustomLoaderBuilder; import net.neoforged.neoforge.common.NeoForgeMod; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ObjModelBuilder extends CustomLoaderBuilder { @Nullable diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java index e747af19038..258c371b336 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ElementBuilder.java @@ -18,8 +18,8 @@ import net.minecraft.client.renderer.block.model.BlockElementFace; import net.minecraft.core.Direction; import net.neoforged.neoforge.client.model.ExtraFaceData; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; public final class ElementBuilder { private Vector3f from = new Vector3f(); diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplate.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplate.java index 1c4a8fda908..71859f215a4 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplate.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplate.java @@ -22,8 +22,8 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemDisplayContext; import net.neoforged.neoforge.client.model.ExtraFaceData; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3fc; +import org.jspecify.annotations.Nullable; public final class ExtendedModelTemplate extends ModelTemplate { final Map transforms; @@ -35,8 +35,7 @@ public final class ExtendedModelTemplate extends ModelTemplate { final Identifier renderType; @Nullable final Boolean ambientOcclusion; - @Nullable - final UnbakedModel.GuiLight guiLight; + final UnbakedModel.@Nullable GuiLight guiLight; ExtendedModelTemplate(ExtendedModelTemplateBuilder builder) { super(builder.parent, builder.suffix, builder.requiredSlots.toArray(TextureSlot[]::new)); diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplateBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplateBuilder.java index 7e4c6f89938..d5b80eff25d 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplateBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/ExtendedModelTemplateBuilder.java @@ -22,7 +22,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemDisplayContext; import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ExtendedModelTemplateBuilder { Optional parent = Optional.empty(); @@ -37,8 +37,7 @@ public class ExtendedModelTemplateBuilder { Identifier renderType = null; @Nullable Boolean ambientOcclusion = null; // UnbakedModel.DEFAULT_AMBIENT_OCCLUSION - @Nullable - UnbakedModel.GuiLight guiLight = null; + UnbakedModel.@Nullable GuiLight guiLight = null; public static ExtendedModelTemplateBuilder of(ModelTemplate template) { ExtendedModelTemplateBuilder builder = new ExtendedModelTemplateBuilder(); diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java index 8f22fe9f37f..06fe299548b 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/FaceBuilder.java @@ -12,7 +12,7 @@ import net.minecraft.core.Direction; import net.neoforged.neoforge.client.model.ExtraFaceData; import org.apache.commons.lang3.mutable.MutableObject; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class FaceBuilder { @Nullable @@ -20,8 +20,7 @@ public final class FaceBuilder { private int tintindex = -1; @Nullable private TextureSlot texture = null; - @Nullable - private BlockElementFace.UVs uvs; + private BlockElementFace.@Nullable UVs uvs; private Quadrant rotation = Quadrant.R0; private int color = 0xFFFFFFFF; private int lightEmission = 0; diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/RootTransformsBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/RootTransformsBuilder.java index e5e3b485630..cb0ba76ed23 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/RootTransformsBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/RootTransformsBuilder.java @@ -10,11 +10,11 @@ import com.google.gson.JsonObject; import com.mojang.math.Transformation; import net.neoforged.neoforge.common.util.TransformationHelper; -import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Quaternionfc; import org.joml.Vector3f; import org.joml.Vector3fc; +import org.jspecify.annotations.Nullable; public class RootTransformsBuilder { private static final Vector3f ONE = new Vector3f(1, 1, 1); @@ -23,8 +23,7 @@ public class RootTransformsBuilder { private Quaternionfc leftRotation = new Quaternionf(); private Quaternionfc rightRotation = new Quaternionf(); private Vector3fc scale = ONE; - @Nullable - private TransformationHelper.TransformOrigin origin; + private TransformationHelper.@Nullable TransformOrigin origin; @Nullable private Vector3fc originVec; diff --git a/src/client/java/net/neoforged/neoforge/client/model/generators/template/RotationBuilder.java b/src/client/java/net/neoforged/neoforge/client/model/generators/template/RotationBuilder.java index d9508f09bc0..aa92be85f5b 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/generators/template/RotationBuilder.java +++ b/src/client/java/net/neoforged/neoforge/client/model/generators/template/RotationBuilder.java @@ -8,14 +8,13 @@ import com.google.common.base.Preconditions; import net.minecraft.client.renderer.block.model.BlockElementRotation; import net.minecraft.core.Direction; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; public final class RotationBuilder { @Nullable private Vector3f origin; - @Nullable - private BlockElementRotation.RotationValue value; + private BlockElementRotation.@Nullable RotationValue value; private boolean rescale; /** diff --git a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java index 43d04e22453..0f2d10decb1 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java +++ b/src/client/java/net/neoforged/neoforge/client/model/item/DynamicFluidContainerModel.java @@ -47,9 +47,9 @@ import net.neoforged.neoforge.client.model.ComposedModelState; import net.neoforged.neoforge.client.model.UnbakedElementsHelper; import net.neoforged.neoforge.transfer.fluid.FluidUtil; -import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; /** * A dynamic fluid container model, capable of re-texturing itself at runtime to match the contained fluid. diff --git a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java index f67896d6df0..e9301a48fae 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java +++ b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjGeometry.java @@ -32,9 +32,9 @@ import net.neoforged.neoforge.client.model.NeoForgeModelProperties; import net.neoforged.neoforge.client.model.pipeline.QuadBakingVertexConsumer; import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; public class ObjGeometry implements ExtendedUnbakedGeometry { private static final Vector4f COLOR_WHITE = new Vector4f(1, 1, 1, 1); @@ -451,13 +451,12 @@ protected void addNamesRecursively(Set names) { } private class ModelMesh { - @Nullable - public ObjMaterialLibrary.Material mat; + public ObjMaterialLibrary.@Nullable Material mat; @Nullable public String smoothingGroup; public final List faces = Lists.newArrayList(); - public ModelMesh(@Nullable ObjMaterialLibrary.Material currentMat, @Nullable String currentSmoothingGroup) { + public ModelMesh(ObjMaterialLibrary.@Nullable Material currentMat, @Nullable String currentSmoothingGroup) { this.mat = currentMat; this.smoothingGroup = currentSmoothingGroup; } diff --git a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java index 6ce29921574..d4b5adf7392 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java +++ b/src/client/java/net/neoforged/neoforge/client/model/obj/ObjTokenizer.java @@ -14,7 +14,7 @@ import java.util.Arrays; import java.util.List; import joptsimple.internal.Strings; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A tokenizer for OBJ and MTL files. diff --git a/src/client/java/net/neoforged/neoforge/client/model/standalone/StandaloneModelLoader.java b/src/client/java/net/neoforged/neoforge/client/model/standalone/StandaloneModelLoader.java index 94f344258a0..f37ae54ee9d 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/standalone/StandaloneModelLoader.java +++ b/src/client/java/net/neoforged/neoforge/client/model/standalone/StandaloneModelLoader.java @@ -15,7 +15,7 @@ import net.minecraft.util.thread.ParallelMapTransform; import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.client.event.ModelEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; public final class StandaloneModelLoader { diff --git a/src/client/java/net/neoforged/neoforge/client/renderstate/BaseRenderState.java b/src/client/java/net/neoforged/neoforge/client/renderstate/BaseRenderState.java index cbdd40218de..a8afe68d38d 100644 --- a/src/client/java/net/neoforged/neoforge/client/renderstate/BaseRenderState.java +++ b/src/client/java/net/neoforged/neoforge/client/renderstate/BaseRenderState.java @@ -11,7 +11,7 @@ import net.minecraft.util.context.ContextKey; import net.neoforged.neoforge.client.extensions.IRenderStateExtension; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension class for RenderState objects (ie {@link EntityRenderState}). diff --git a/src/client/java/net/neoforged/neoforge/client/resources/VanillaClientListeners.java b/src/client/java/net/neoforged/neoforge/client/resources/VanillaClientListeners.java index 02b398a9186..f5f9aad6442 100644 --- a/src/client/java/net/neoforged/neoforge/client/resources/VanillaClientListeners.java +++ b/src/client/java/net/neoforged/neoforge/client/resources/VanillaClientListeners.java @@ -33,7 +33,7 @@ import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent; import net.neoforged.neoforge.common.util.VanillaClassToKey; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Keys for vanilla {@link PreparableReloadListener reload listeners}, used to specify dependency ordering in the {@link AddClientReloadListenersEvent}. diff --git a/src/client/java/net/neoforged/neoforge/client/settings/KeyModifier.java b/src/client/java/net/neoforged/neoforge/client/settings/KeyModifier.java index 4df9265b938..2c8525b1661 100644 --- a/src/client/java/net/neoforged/neoforge/client/settings/KeyModifier.java +++ b/src/client/java/net/neoforged/neoforge/client/settings/KeyModifier.java @@ -12,7 +12,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.input.InputQuirks; import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.glfw.GLFW; public enum KeyModifier { diff --git a/src/client/java/net/neoforged/neoforge/client/textures/SpriteContentsConstructor.java b/src/client/java/net/neoforged/neoforge/client/textures/SpriteContentsConstructor.java index e8ce77fa907..442c6fdd9c1 100644 --- a/src/client/java/net/neoforged/neoforge/client/textures/SpriteContentsConstructor.java +++ b/src/client/java/net/neoforged/neoforge/client/textures/SpriteContentsConstructor.java @@ -14,7 +14,7 @@ import net.minecraft.client.resources.metadata.texture.TextureMetadataSection; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.metadata.MetadataSectionType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Functional interface representing the signature of the SpriteContents constructor diff --git a/src/main/java/net/neoforged/neoforge/attachment/AttachmentHolder.java b/src/main/java/net/neoforged/neoforge/attachment/AttachmentHolder.java index bd0a364c77a..5320d2ef4a6 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/AttachmentHolder.java +++ b/src/main/java/net/neoforged/neoforge/attachment/AttachmentHolder.java @@ -16,7 +16,7 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.jetbrains.annotations.MustBeInvokedByOverriders; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/attachment/AttachmentSync.java b/src/main/java/net/neoforged/neoforge/attachment/AttachmentSync.java index 6ec83bcd86b..e37eccf2c2c 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/AttachmentSync.java +++ b/src/main/java/net/neoforged/neoforge/attachment/AttachmentSync.java @@ -35,7 +35,7 @@ import net.neoforged.neoforge.registries.RegistryBuilder; import net.neoforged.neoforge.registries.callback.AddCallback; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal @EventBusSubscriber(modid = NeoForgeMod.MOD_ID) diff --git a/src/main/java/net/neoforged/neoforge/attachment/AttachmentSyncHandler.java b/src/main/java/net/neoforged/neoforge/attachment/AttachmentSyncHandler.java index 7ceb0a0d191..3b502a994c8 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/AttachmentSyncHandler.java +++ b/src/main/java/net/neoforged/neoforge/attachment/AttachmentSyncHandler.java @@ -7,7 +7,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Manages how data attachments are written (on the server) and read (on the client) from packets. diff --git a/src/main/java/net/neoforged/neoforge/attachment/AttachmentType.java b/src/main/java/net/neoforged/neoforge/attachment/AttachmentType.java index 6f7f6583896..b4c8b0a5f2f 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/AttachmentType.java +++ b/src/main/java/net/neoforged/neoforge/attachment/AttachmentType.java @@ -30,7 +30,7 @@ import net.minecraft.world.level.storage.ValueOutput; import net.neoforged.neoforge.common.util.ValueIOSerializable; import net.neoforged.neoforge.registries.NeoForgeRegistries; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Represents a data attachment type: some data that can be added to any object implementing {@link IAttachmentHolder}. diff --git a/src/main/java/net/neoforged/neoforge/attachment/IAttachmentCopyHandler.java b/src/main/java/net/neoforged/neoforge/attachment/IAttachmentCopyHandler.java index 80b47a68420..74e89d270c9 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/IAttachmentCopyHandler.java +++ b/src/main/java/net/neoforged/neoforge/attachment/IAttachmentCopyHandler.java @@ -6,7 +6,7 @@ package net.neoforged.neoforge.attachment; import net.minecraft.core.HolderLookup; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Custom copy handler for data attachments, to improve efficiency compared to the default diff --git a/src/main/java/net/neoforged/neoforge/attachment/IAttachmentHolder.java b/src/main/java/net/neoforged/neoforge/attachment/IAttachmentHolder.java index 8e19ccadd6d..bb99428f51e 100644 --- a/src/main/java/net/neoforged/neoforge/attachment/IAttachmentHolder.java +++ b/src/main/java/net/neoforged/neoforge/attachment/IAttachmentHolder.java @@ -7,7 +7,7 @@ import java.util.Optional; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An object that can hold data attachments. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/BaseCapability.java b/src/main/java/net/neoforged/neoforge/capabilities/BaseCapability.java index 8165de3eef7..95550876360 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/BaseCapability.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/BaseCapability.java @@ -6,7 +6,7 @@ package net.neoforged.neoforge.capabilities; import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Base class to reuse code common between most/all {@code *Capability} implementation. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/BlockCapability.java b/src/main/java/net/neoforged/neoforge/capabilities/BlockCapability.java index c45787d3f0d..dbf40c5153f 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/BlockCapability.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/BlockCapability.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.EventPriority; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A {@code BlockCapability} gives flexible access to objects of type {@code T} located in the world. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/BlockCapabilityCache.java b/src/main/java/net/neoforged/neoforge/capabilities/BlockCapabilityCache.java index a26eee2428d..6337107f0f4 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/BlockCapabilityCache.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/BlockCapabilityCache.java @@ -10,7 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A cache for block capabilities, to be used to track capabilities at a specific position, with a specific context. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/Capabilities.java b/src/main/java/net/neoforged/neoforge/capabilities/Capabilities.java index 360f14c48eb..9d41bf6e670 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/Capabilities.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/Capabilities.java @@ -12,7 +12,7 @@ import net.neoforged.neoforge.transfer.energy.EnergyHandler; import net.neoforged.neoforge.transfer.fluid.FluidResource; import net.neoforged.neoforge.transfer.item.ItemResource; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Capabilities provided by NeoForge itself, for modders to directly reference. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/EntityCapability.java b/src/main/java/net/neoforged/neoforge/capabilities/EntityCapability.java index 62e6885583a..67e05b89cc2 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/EntityCapability.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/EntityCapability.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An {@code EntityCapability} gives flexible access to objects of type {@code T} from entities. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/IBlockCapabilityProvider.java b/src/main/java/net/neoforged/neoforge/capabilities/IBlockCapabilityProvider.java index dfa066fabf7..218148051b8 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/IBlockCapabilityProvider.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/IBlockCapabilityProvider.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @FunctionalInterface public interface IBlockCapabilityProvider { diff --git a/src/main/java/net/neoforged/neoforge/capabilities/ICapabilityProvider.java b/src/main/java/net/neoforged/neoforge/capabilities/ICapabilityProvider.java index a168bb87e7f..147c0e61e6f 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/ICapabilityProvider.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/ICapabilityProvider.java @@ -7,7 +7,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @FunctionalInterface public interface ICapabilityProvider { diff --git a/src/main/java/net/neoforged/neoforge/capabilities/ItemCapability.java b/src/main/java/net/neoforged/neoforge/capabilities/ItemCapability.java index 15c013d2f7d..79558770a76 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/ItemCapability.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/ItemCapability.java @@ -12,7 +12,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An {@code ItemCapability} gives flexible access to objects of type {@code T} from item stacks. diff --git a/src/main/java/net/neoforged/neoforge/capabilities/RegisterCapabilitiesEvent.java b/src/main/java/net/neoforged/neoforge/capabilities/RegisterCapabilitiesEvent.java index 9e22853179e..91587e38cad 100644 --- a/src/main/java/net/neoforged/neoforge/capabilities/RegisterCapabilitiesEvent.java +++ b/src/main/java/net/neoforged/neoforge/capabilities/RegisterCapabilitiesEvent.java @@ -20,7 +20,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.fml.event.IModBusEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired to register capability providers at an appropriate time. diff --git a/src/main/java/net/neoforged/neoforge/common/BasicItemListing.java b/src/main/java/net/neoforged/neoforge/common/BasicItemListing.java index 96587f101ab..36725e7f366 100644 --- a/src/main/java/net/neoforged/neoforge/common/BasicItemListing.java +++ b/src/main/java/net/neoforged/neoforge/common/BasicItemListing.java @@ -15,7 +15,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.trading.ItemCost; import net.minecraft.world.item.trading.MerchantOffer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A default, exposed implementation of ITrade. All of the other implementations of ITrade (in VillagerTrades) are not public. diff --git a/src/main/java/net/neoforged/neoforge/common/BooleanAttribute.java b/src/main/java/net/neoforged/neoforge/common/BooleanAttribute.java index faf7277198f..61e875914d1 100644 --- a/src/main/java/net/neoforged/neoforge/common/BooleanAttribute.java +++ b/src/main/java/net/neoforged/neoforge/common/BooleanAttribute.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.AttributeModifier.Operation; import net.minecraft.world.item.TooltipFlag; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A boolean attribute only has two states, on or off, represented by a value of 0 (false) or 1 (true). diff --git a/src/main/java/net/neoforged/neoforge/common/CommonHooks.java b/src/main/java/net/neoforged/neoforge/common/CommonHooks.java index 19208576440..e7e733b4c30 100644 --- a/src/main/java/net/neoforged/neoforge/common/CommonHooks.java +++ b/src/main/java/net/neoforged/neoforge/common/CommonHooks.java @@ -231,7 +231,7 @@ import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.transformer.meta.MixinMerged; /** @@ -1353,8 +1353,7 @@ public static boolean shouldSuppressEnderManAnger(EnderMan enderMan, Player play /** * @hidden For internal use only. */ - @Nullable - public static StructuresBecomeConfiguredFix.Conversion getStructureConversion(String originalBiome) { + public static StructuresBecomeConfiguredFix.@Nullable Conversion getStructureConversion(String originalBiome) { return FORGE_CONVERSION_MAP.get().get(originalBiome); } diff --git a/src/main/java/net/neoforged/neoforge/common/CreativeModeTabRegistry.java b/src/main/java/net/neoforged/neoforge/common/CreativeModeTabRegistry.java index 7712c3172d0..c7ed28b36f5 100644 --- a/src/main/java/net/neoforged/neoforge/common/CreativeModeTabRegistry.java +++ b/src/main/java/net/neoforged/neoforge/common/CreativeModeTabRegistry.java @@ -41,7 +41,7 @@ import net.neoforged.fml.loading.toposort.TopologicalSort; import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; public final class CreativeModeTabRegistry { diff --git a/src/main/java/net/neoforged/neoforge/common/DataMapHooks.java b/src/main/java/net/neoforged/neoforge/common/DataMapHooks.java index ef644f34151..6134a8423f2 100644 --- a/src/main/java/net/neoforged/neoforge/common/DataMapHooks.java +++ b/src/main/java/net/neoforged/neoforge/common/DataMapHooks.java @@ -25,7 +25,7 @@ import net.neoforged.neoforge.registries.datamaps.builtin.Oxidizable; import net.neoforged.neoforge.registries.datamaps.builtin.Waxable; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; // TODO: 1.21.2 remove fallback to vanilla map for waxing and oxidizing public class DataMapHooks { diff --git a/src/main/java/net/neoforged/neoforge/common/IOUtilities.java b/src/main/java/net/neoforged/neoforge/common/IOUtilities.java index 07d4feb9b0d..7a6583c8a3f 100644 --- a/src/main/java/net/neoforged/neoforge/common/IOUtilities.java +++ b/src/main/java/net/neoforged/neoforge/common/IOUtilities.java @@ -23,7 +23,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import org.apache.commons.io.output.CloseShieldOutputStream; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/net/neoforged/neoforge/common/IShearable.java b/src/main/java/net/neoforged/neoforge/common/IShearable.java index 8fe239636ea..81142386476 100644 --- a/src/main/java/net/neoforged/neoforge/common/IShearable.java +++ b/src/main/java/net/neoforged/neoforge/common/IShearable.java @@ -25,7 +25,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This interfaces allows shears (modded & vanilla) and {@linkplain Entity entities} (modded & vanilla) to cooperate diff --git a/src/main/java/net/neoforged/neoforge/common/ModConfigSpec.java b/src/main/java/net/neoforged/neoforge/common/ModConfigSpec.java index df549a1b5f9..51113fd49ee 100644 --- a/src/main/java/net/neoforged/neoforge/common/ModConfigSpec.java +++ b/src/main/java/net/neoforged/neoforge/common/ModConfigSpec.java @@ -47,7 +47,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /* * Like {@link com.electronwill.nightconfig.core.ConfigSpec} except in builder format, and extended to accept comments, language keys, diff --git a/src/main/java/net/neoforged/neoforge/common/MutableDataComponentHolder.java b/src/main/java/net/neoforged/neoforge/common/MutableDataComponentHolder.java index 195a09efc2b..be2de595c24 100644 --- a/src/main/java/net/neoforged/neoforge/common/MutableDataComponentHolder.java +++ b/src/main/java/net/neoforged/neoforge/common/MutableDataComponentHolder.java @@ -13,7 +13,7 @@ import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponentType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface MutableDataComponentHolder extends DataComponentHolder { /** diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 06c905feba4..ff4402551b1 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -162,7 +162,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @SuppressWarnings("unused") @Mod(NeoForgeMod.MOD_ID) diff --git a/src/main/java/net/neoforged/neoforge/common/SpecialPlantable.java b/src/main/java/net/neoforged/neoforge/common/SpecialPlantable.java index 399bdc0e712..ffff78a8ba3 100644 --- a/src/main/java/net/neoforged/neoforge/common/SpecialPlantable.java +++ b/src/main/java/net/neoforged/neoforge/common/SpecialPlantable.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Intended for mods to help mark if a modded item allows for placing modded plants of any kind or size. diff --git a/src/main/java/net/neoforged/neoforge/common/UsernameCache.java b/src/main/java/net/neoforged/neoforge/common/UsernameCache.java index 35011f0905d..160a76a3324 100644 --- a/src/main/java/net/neoforged/neoforge/common/UsernameCache.java +++ b/src/main/java/net/neoforged/neoforge/common/UsernameCache.java @@ -26,7 +26,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Caches player's last known usernames diff --git a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/PiglinNeutralArmorEntityPredicate.java b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/PiglinNeutralArmorEntityPredicate.java index b1e333a75d0..077c36229cf 100644 --- a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/PiglinNeutralArmorEntityPredicate.java +++ b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/PiglinNeutralArmorEntityPredicate.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class PiglinNeutralArmorEntityPredicate implements EntitySubPredicate { public static final PiglinNeutralArmorEntityPredicate INSTANCE = new PiglinNeutralArmorEntityPredicate(); diff --git a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/SnowBootsEntityPredicate.java b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/SnowBootsEntityPredicate.java index 055c87beff7..2a1e7dd1e0b 100644 --- a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/SnowBootsEntityPredicate.java +++ b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/SnowBootsEntityPredicate.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class SnowBootsEntityPredicate implements EntitySubPredicate { public static final SnowBootsEntityPredicate INSTANCE = new SnowBootsEntityPredicate(); diff --git a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/TridentEntityPredicate.java b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/TridentEntityPredicate.java index c7841d87397..6bb661fb328 100644 --- a/src/main/java/net/neoforged/neoforge/common/advancements/critereon/TridentEntityPredicate.java +++ b/src/main/java/net/neoforged/neoforge/common/advancements/critereon/TridentEntityPredicate.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.arrow.ThrownTrident; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class TridentEntityPredicate implements EntitySubPredicate { public static final TridentEntityPredicate INSTANCE = new TridentEntityPredicate(); diff --git a/src/main/java/net/neoforged/neoforge/common/crafting/BlockTagIngredient.java b/src/main/java/net/neoforged/neoforge/common/crafting/BlockTagIngredient.java index a99a2f17576..6afb6fcc634 100644 --- a/src/main/java/net/neoforged/neoforge/common/crafting/BlockTagIngredient.java +++ b/src/main/java/net/neoforged/neoforge/common/crafting/BlockTagIngredient.java @@ -21,7 +21,7 @@ import net.minecraft.world.item.crafting.display.SlotDisplay; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.common.NeoForgeMod; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * {@link Ingredient} that matches {@link ItemStack}s of {@link Block}s from a {@link TagKey}, useful in cases diff --git a/src/main/java/net/neoforged/neoforge/common/crafting/ConditionalRecipeOutput.java b/src/main/java/net/neoforged/neoforge/common/crafting/ConditionalRecipeOutput.java index ad522261d92..1fbaf7764ee 100644 --- a/src/main/java/net/neoforged/neoforge/common/crafting/ConditionalRecipeOutput.java +++ b/src/main/java/net/neoforged/neoforge/common/crafting/ConditionalRecipeOutput.java @@ -13,7 +13,7 @@ import net.neoforged.neoforge.common.conditions.ICondition; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Wrapper around a {@link RecipeOutput} that adds conditions to all received recipes. diff --git a/src/main/java/net/neoforged/neoforge/common/damagesource/IDeathMessageProvider.java b/src/main/java/net/neoforged/neoforge/common/damagesource/IDeathMessageProvider.java index e655132f419..b5657025a85 100644 --- a/src/main/java/net/neoforged/neoforge/common/damagesource/IDeathMessageProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/damagesource/IDeathMessageProvider.java @@ -12,7 +12,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DeathMessageType; import net.minecraft.world.entity.LivingEntity; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An {@link IDeathMessageProvider} is used by custom {@link DeathMessageType} instances.
diff --git a/src/main/java/net/neoforged/neoforge/common/data/SoundDefinition.java b/src/main/java/net/neoforged/neoforge/common/data/SoundDefinition.java index 446ba7be1bb..f260f066ce3 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/SoundDefinition.java +++ b/src/main/java/net/neoforged/neoforge/common/data/SoundDefinition.java @@ -13,7 +13,7 @@ import java.util.Arrays; import java.util.List; import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Contains all the data to completely define a sound event. diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeAdvancementProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeAdvancementProvider.java index 454cdc4d3a5..f4d00ed293d 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeAdvancementProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeAdvancementProvider.java @@ -67,7 +67,7 @@ import net.neoforged.neoforge.common.advancements.critereon.PiglinNeutralArmorEntityPredicate; import net.neoforged.neoforge.common.advancements.critereon.SnowBootsEntityPredicate; import net.neoforged.neoforge.common.advancements.critereon.TridentEntityPredicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class NeoForgeAdvancementProvider extends AdvancementProvider { public NeoForgeAdvancementProvider(PackOutput output, CompletableFuture registries) { @@ -333,9 +333,8 @@ public Optional> get(TagKey tagKey) { }); } - @Nullable @SuppressWarnings("removal") - private Advancement.Builder findAndReplaceInHolder(AdvancementHolder advancementHolder, HolderLookup.Provider registries) { + private Advancement.@Nullable Builder findAndReplaceInHolder(AdvancementHolder advancementHolder, HolderLookup.Provider registries) { Advancement advancement = advancementHolder.value(); Advancement.Builder builder = Advancement.Builder.advancement(); boolean hasReplaced = false; diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLootTableProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLootTableProvider.java index 37c4645cb56..d2ecac545a4 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLootTableProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLootTableProvider.java @@ -52,7 +52,7 @@ import net.neoforged.fml.util.ObfuscationReflectionHelper; import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.loot.CanItemPerformAbility; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Currently used only for replacing shears item to shears_dig item ability @@ -96,8 +96,7 @@ private void replaceLootItemCondition(Function randomSequence = getPrivateValue(LootTable.class, lootTable, "randomSequence"); diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeRecipeProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeRecipeProvider.java index 4c96523d4ed..905bef9a4c9 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeRecipeProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeRecipeProvider.java @@ -38,7 +38,7 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.conditions.ICondition; import net.neoforged.neoforge.common.crafting.DifferenceIngredient; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class NeoForgeRecipeProvider extends VanillaRecipeProvider { private final InterceptingRecipeOutput output; diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IAttributeExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IAttributeExtension.java index 5236c77f0f2..9cbcf28363d 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IAttributeExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IAttributeExtension.java @@ -26,7 +26,7 @@ import net.neoforged.neoforge.common.NeoForgeMod; import net.neoforged.neoforge.common.config.NeoForgeCommonConfig; import net.neoforged.neoforge.common.util.AttributeUtil; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IAttributeExtension { public static final DecimalFormat FORMAT = Util.make(new DecimalFormat("#.##"), fmt -> fmt.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT)));; diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IBaseRailBlockExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IBaseRailBlockExtension.java index 40e3563ab1a..9d90ada040b 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IBaseRailBlockExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IBaseRailBlockExtension.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.RailShape; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IBaseRailBlockExtension { /** diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java index 5e3ea31036f..3c063b8074b 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockExtension.java @@ -82,7 +82,7 @@ import net.neoforged.neoforge.common.world.AuxiliaryLightManager; import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.model.data.ModelData; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @SuppressWarnings("deprecation") public interface IBlockExtension { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockGetterExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockGetterExtension.java index b7f0be42d14..904e37673db 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockGetterExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockGetterExtension.java @@ -16,7 +16,7 @@ import net.neoforged.neoforge.common.world.AuxiliaryLightManager; import net.neoforged.neoforge.model.data.ModelData; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IBlockGetterExtension { /** diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockStateExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockStateExtension.java index 8400ff2ffc4..096ebcec99c 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IBlockStateExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IBlockStateExtension.java @@ -46,7 +46,7 @@ import net.neoforged.neoforge.common.enums.BubbleColumnDirection; import net.neoforged.neoforge.common.world.AuxiliaryLightManager; import net.neoforged.neoforge.event.EventHooks; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IBlockStateExtension { private BlockState self() { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/ICommandSourceStackExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/ICommandSourceStackExtension.java index b23fc6e922b..4ccfcd07527 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/ICommandSourceStackExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/ICommandSourceStackExtension.java @@ -10,7 +10,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; import net.minecraft.world.scores.Scoreboard; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Additional methods for {@link CommandSourceStack} so that commands and arguments can access various things without directly referencing using server specific classes diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IDataComponentMapBuilderExtensions.java b/src/main/java/net/neoforged/neoforge/common/extensions/IDataComponentMapBuilderExtensions.java index 7fbbfab31d2..cb3ab8f9407 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IDataComponentMapBuilderExtensions.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IDataComponentMapBuilderExtensions.java @@ -8,7 +8,7 @@ import java.util.function.Supplier; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IDataComponentMapBuilderExtensions { private DataComponentMap.Builder self() { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IDispensibleContainerItemExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IDispensibleContainerItemExtension.java index 7860a4d0595..f9eca8bd8e0 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IDispensibleContainerItemExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IDispensibleContainerItemExtension.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IDispensibleContainerItemExtension { private DispensibleContainerItem self() { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IEntityExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IEntityExtension.java index eb506a2132e..b44e6c956a5 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IEntityExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IEntityExtension.java @@ -30,7 +30,7 @@ import net.neoforged.neoforge.entity.PartEntity; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.network.payload.AdvancedAddEntityPayload; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IEntityExtension { private Entity self() { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IFluidExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IFluidExtension.java index 5bb188640cc..e66f06a1167 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IFluidExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IFluidExtension.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.fluids.FluidType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IFluidExtension { private Fluid self() { @@ -100,7 +100,7 @@ default boolean supportsBoating(FluidState state, AbstractBoat boat) { * @return the path type of this fluid */ @Nullable - default PathType getBlockPathType(FluidState state, BlockGetter level, BlockPos pos, @org.jetbrains.annotations.Nullable Mob mob, boolean canFluidLog) { + default PathType getBlockPathType(FluidState state, BlockGetter level, BlockPos pos, @org.jspecify.annotations.Nullable Mob mob, boolean canFluidLog) { return getFluidType().getBlockPathType(state, level, pos, mob, canFluidLog); } @@ -118,7 +118,7 @@ default PathType getBlockPathType(FluidState state, BlockGetter level, BlockPos * @return the path type of this fluid */ @Nullable - default PathType getAdjacentBlockPathType(FluidState state, BlockGetter level, BlockPos pos, @org.jetbrains.annotations.Nullable Mob mob, PathType originalType) { + default PathType getAdjacentBlockPathType(FluidState state, BlockGetter level, BlockPos pos, @org.jspecify.annotations.Nullable Mob mob, PathType originalType) { return getFluidType().getAdjacentBlockPathType(state, level, pos, mob, originalType); } diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IFluidStateExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IFluidStateExtension.java index f78672595b3..c1c7f3cf8d9 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IFluidStateExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IFluidStateExtension.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.fluids.FluidType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IFluidStateExtension { private FluidState self() { @@ -92,7 +92,7 @@ default boolean supportsBoating(AbstractBoat boat) { * @return the path type of this fluid */ @Nullable - default PathType getBlockPathType(BlockGetter level, BlockPos pos, @org.jetbrains.annotations.Nullable Mob mob, boolean canFluidLog) { + default PathType getBlockPathType(BlockGetter level, BlockPos pos, @org.jspecify.annotations.Nullable Mob mob, boolean canFluidLog) { return self().getType().getBlockPathType(self(), level, pos, mob, canFluidLog); } @@ -109,7 +109,7 @@ default PathType getBlockPathType(BlockGetter level, BlockPos pos, @org.jetbrain * @return the path type of this fluid */ @Nullable - default PathType getAdjacentBlockPathType(BlockGetter level, BlockPos pos, @org.jetbrains.annotations.Nullable Mob mob, PathType originalType) { + default PathType getAdjacentBlockPathType(BlockGetter level, BlockPos pos, @org.jspecify.annotations.Nullable Mob mob, PathType originalType) { return self().getType().getAdjacentBlockPathType(self(), level, pos, mob, originalType); } diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IHolderExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IHolderExtension.java index efdb5176155..cfb5863196e 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IHolderExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IHolderExtension.java @@ -10,7 +10,7 @@ import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.datamaps.IWithData; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension for {@link Holder} @@ -30,8 +30,7 @@ default Holder getDelegate() { *

* This will only succeed if the underlying holder is a {@link Holder.Reference}. */ - @Nullable - default HolderLookup.RegistryLookup unwrapLookup() { + default HolderLookup.@Nullable RegistryLookup unwrapLookup() { return null; } diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java index 261af274e0b..477565a6706 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IItemExtension.java @@ -51,7 +51,7 @@ import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IItemExtension { private Item self() { diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java index a8e63b693a4..249d073f3ab 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java @@ -41,7 +41,7 @@ import net.neoforged.neoforge.common.ItemAbility; import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.event.ItemAttributeModifierEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /* * Extension added to ItemStack that bounces to ItemSack sensitive Item methods. Typically this is just for convince. diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/ILevelExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/ILevelExtension.java index 580865cde63..51876e9f685 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/ILevelExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/ILevelExtension.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.model.data.ModelDataManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface ILevelExtension { /** diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IOwnedSpawner.java b/src/main/java/net/neoforged/neoforge/common/extensions/IOwnedSpawner.java index dcc2f986d40..36b2cd64971 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IOwnedSpawner.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IOwnedSpawner.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity; import net.minecraft.world.level.block.entity.trialspawner.TrialSpawner; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface IOwnedSpawner { /** diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IRecipeOutputExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IRecipeOutputExtension.java index 541263baaf0..2989c600770 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IRecipeOutputExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IRecipeOutputExtension.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.crafting.Recipe; import net.neoforged.neoforge.common.conditions.ICondition; import net.neoforged.neoforge.common.crafting.ConditionalRecipeOutput; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extra methods for {@link RecipeOutput}. diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IServerCommonPacketListenerExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IServerCommonPacketListenerExtension.java index 7a6d33e0592..fb2bfbf5c1f 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IServerCommonPacketListenerExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IServerCommonPacketListenerExtension.java @@ -10,7 +10,7 @@ import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.ServerCommonPacketListener; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension interface for {@link ServerCommonPacketListener} diff --git a/src/main/java/net/neoforged/neoforge/common/ticket/SimpleTicket.java b/src/main/java/net/neoforged/neoforge/common/ticket/SimpleTicket.java index fbc9e1b6c77..15aa00d4813 100644 --- a/src/main/java/net/neoforged/neoforge/common/ticket/SimpleTicket.java +++ b/src/main/java/net/neoforged/neoforge/common/ticket/SimpleTicket.java @@ -8,7 +8,7 @@ import com.google.common.base.Preconditions; import java.util.function.Consumer; import net.neoforged.neoforge.common.FarmlandWaterManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Common class for a simple ticket based system. diff --git a/src/main/java/net/neoforged/neoforge/common/util/AttributeTooltipContext.java b/src/main/java/net/neoforged/neoforge/common/util/AttributeTooltipContext.java index fc2ca7ddb8a..5f96b07d268 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/AttributeTooltipContext.java +++ b/src/main/java/net/neoforged/neoforge/common/util/AttributeTooltipContext.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Extended {@link TooltipContext} used when generating attribute tooltips. diff --git a/src/main/java/net/neoforged/neoforge/common/util/BlockSnapshot.java b/src/main/java/net/neoforged/neoforge/common/util/BlockSnapshot.java index 3ec5caa589a..8dd74ca6d01 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/BlockSnapshot.java +++ b/src/main/java/net/neoforged/neoforge/common/util/BlockSnapshot.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.TagValueInput; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java b/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java index 67d95face39..d8b623bc664 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java +++ b/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java @@ -80,7 +80,7 @@ import net.minecraft.world.entity.Relative; import net.minecraft.world.entity.animal.equine.AbstractHorse; import net.minecraft.world.entity.player.Player; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A basic fake server player implementation that can be used to simulate player actions. diff --git a/src/main/java/net/neoforged/neoforge/common/util/JsonUtils.java b/src/main/java/net/neoforged/neoforge/common/util/JsonUtils.java index fdb357d3a68..667b4ea5e0f 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/JsonUtils.java +++ b/src/main/java/net/neoforged/neoforge/common/util/JsonUtils.java @@ -24,7 +24,7 @@ import java.util.Map; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.TagParser; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class JsonUtils { // http://stackoverflow.com/questions/7706772/deserializing-immutablelist-using-gson/21677349#21677349 diff --git a/src/main/java/net/neoforged/neoforge/common/util/Lazy.java b/src/main/java/net/neoforged/neoforge/common/util/Lazy.java index dccc2cc320f..3dfcfe31cc2 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/Lazy.java +++ b/src/main/java/net/neoforged/neoforge/common/util/Lazy.java @@ -6,7 +6,7 @@ package net.neoforged.neoforge.common.util; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Proxy object for a value that is calculated on first access, and can be refreshed as well. diff --git a/src/main/java/net/neoforged/neoforge/common/util/MutableHashedLinkedMap.java b/src/main/java/net/neoforged/neoforge/common/util/MutableHashedLinkedMap.java index 84e6da496a1..33798b88029 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/MutableHashedLinkedMap.java +++ b/src/main/java/net/neoforged/neoforge/common/util/MutableHashedLinkedMap.java @@ -13,7 +13,7 @@ import java.util.NoSuchElementException; import java.util.function.BiPredicate; import net.neoforged.neoforge.common.util.strategy.BasicStrategy; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A mutable linked map with a hashing strategy and a merge function. diff --git a/src/main/java/net/neoforged/neoforge/common/util/RecipeMatcher.java b/src/main/java/net/neoforged/neoforge/common/util/RecipeMatcher.java index dcf2cebaff8..3e130c2705c 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/RecipeMatcher.java +++ b/src/main/java/net/neoforged/neoforge/common/util/RecipeMatcher.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Queue; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class RecipeMatcher { /** diff --git a/src/main/java/net/neoforged/neoforge/common/util/TransformationHelper.java b/src/main/java/net/neoforged/neoforge/common/util/TransformationHelper.java index 8aaab10708c..bc95bab652a 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/TransformationHelper.java +++ b/src/main/java/net/neoforged/neoforge/common/util/TransformationHelper.java @@ -19,13 +19,13 @@ import java.util.Set; import net.minecraft.util.Mth; import net.minecraft.util.StringRepresentable; -import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Quaternionfc; import org.joml.Vector3f; import org.joml.Vector3fc; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; public final class TransformationHelper { public static Quaternionf quatFromXYZ(Vector3f xyz, boolean degrees) { diff --git a/src/main/java/net/neoforged/neoforge/common/world/LevelChunkAuxiliaryLightManager.java b/src/main/java/net/neoforged/neoforge/common/world/LevelChunkAuxiliaryLightManager.java index 96da10511d7..d13aa360a32 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/LevelChunkAuxiliaryLightManager.java +++ b/src/main/java/net/neoforged/neoforge/common/world/LevelChunkAuxiliaryLightManager.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.lighting.LightEngine; import net.neoforged.neoforge.network.payload.AuxiliaryLightDataPayload; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public final class LevelChunkAuxiliaryLightManager implements AuxiliaryLightManager { diff --git a/src/main/java/net/neoforged/neoforge/common/world/MobSpawnSettingsBuilder.java b/src/main/java/net/neoforged/neoforge/common/world/MobSpawnSettingsBuilder.java index c9cb58f9551..f0fbff3cd13 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/MobSpawnSettingsBuilder.java +++ b/src/main/java/net/neoforged/neoforge/common/world/MobSpawnSettingsBuilder.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.MobSpawnSettings; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class MobSpawnSettingsBuilder extends MobSpawnSettings.Builder { private final Set typesView = Collections.unmodifiableSet(this.spawners.keySet()); @@ -35,8 +35,7 @@ public Set> getEntityTypes() { return this.costView; } - @Nullable - public MobSpawnSettings.MobSpawnCost getCost(EntityType type) { + public MobSpawnSettings.@Nullable MobSpawnCost getCost(EntityType type) { return this.mobSpawnCosts.get(type); } diff --git a/src/main/java/net/neoforged/neoforge/common/world/ModifiableBiomeInfo.java b/src/main/java/net/neoforged/neoforge/common/world/ModifiableBiomeInfo.java index 74d844fdbf5..9e257adcbf0 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/ModifiableBiomeInfo.java +++ b/src/main/java/net/neoforged/neoforge/common/world/ModifiableBiomeInfo.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/common/world/ModifiableStructureInfo.java b/src/main/java/net/neoforged/neoforge/common/world/ModifiableStructureInfo.java index 55371a81f97..0bda6b53e18 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/ModifiableStructureInfo.java +++ b/src/main/java/net/neoforged/neoforge/common/world/ModifiableStructureInfo.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.Structure.StructureSettings; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Holds lazy-evaluable modified structure info. diff --git a/src/main/java/net/neoforged/neoforge/common/world/StructureSettingsBuilder.java b/src/main/java/net/neoforged/neoforge/common/world/StructureSettingsBuilder.java index e131e0e9a69..9e61412804e 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/StructureSettingsBuilder.java +++ b/src/main/java/net/neoforged/neoforge/common/world/StructureSettingsBuilder.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.levelgen.structure.Structure.StructureSettings; import net.minecraft.world.level.levelgen.structure.StructureSpawnOverride; import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class StructureSettingsBuilder { private HolderSet biomes; diff --git a/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java b/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java index c9b12b0cf1e..1489e186435 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java +++ b/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java @@ -40,7 +40,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ParametersAreNonnullByDefault public class ForcedChunkManager { diff --git a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java index f69a0c0ab07..477b96273c9 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java +++ b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java @@ -13,7 +13,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.TicketStorage; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A class used to manage chunk loading tickets associated with a specific ID. diff --git a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketHelper.java b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketHelper.java index ddcce4ae9db..3178f216555 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketHelper.java +++ b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketHelper.java @@ -10,7 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.Identifier; import net.minecraft.world.level.TicketStorage; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Class to help mods remove no longer valid tickets before they are activated on load. diff --git a/src/main/java/net/neoforged/neoforge/data/event/GatherDataEvent.java b/src/main/java/net/neoforged/neoforge/data/event/GatherDataEvent.java index c4b34eff0cd..817b09229e5 100644 --- a/src/main/java/net/neoforged/neoforge/data/event/GatherDataEvent.java +++ b/src/main/java/net/neoforged/neoforge/data/event/GatherDataEvent.java @@ -51,7 +51,7 @@ import net.neoforged.neoforge.resource.ResourcePackLoader; import org.apache.commons.lang3.function.Consumers; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class GatherDataEvent extends Event implements IModBusEvent { private final DataGenerator dataGenerator; diff --git a/src/main/java/net/neoforged/neoforge/entity/XpOrbTargetingEvent.java b/src/main/java/net/neoforged/neoforge/entity/XpOrbTargetingEvent.java index 86e8fc01461..9f53e172c09 100644 --- a/src/main/java/net/neoforged/neoforge/entity/XpOrbTargetingEvent.java +++ b/src/main/java/net/neoforged/neoforge/entity/XpOrbTargetingEvent.java @@ -12,7 +12,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.player.PlayerXpEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Event to determine which player an XP Orb should follow. diff --git a/src/main/java/net/neoforged/neoforge/event/AnvilUpdateEvent.java b/src/main/java/net/neoforged/neoforge/event/AnvilUpdateEvent.java index dd81df93bf5..db5116fd914 100644 --- a/src/main/java/net/neoforged/neoforge/event/AnvilUpdateEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/AnvilUpdateEvent.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired when an anvil's left input is not empty, and any of the inputs (left, right, or name) are changed. diff --git a/src/main/java/net/neoforged/neoforge/event/BlockEntityTypeAddBlocksEvent.java b/src/main/java/net/neoforged/neoforge/event/BlockEntityTypeAddBlocksEvent.java index a2ec18b8c60..7d801870054 100644 --- a/src/main/java/net/neoforged/neoforge/event/BlockEntityTypeAddBlocksEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/BlockEntityTypeAddBlocksEvent.java @@ -21,7 +21,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.neoforge.mixins.BlockEntityTypeAccessor; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Allows injecting new blocks into a block entity's {@link BlockEntityType#validBlocks} field in a safe manner. diff --git a/src/main/java/net/neoforged/neoforge/event/CommandEvent.java b/src/main/java/net/neoforged/neoforge/event/CommandEvent.java index 97e58edce1a..c1374293b77 100644 --- a/src/main/java/net/neoforged/neoforge/event/CommandEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/CommandEvent.java @@ -12,7 +12,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * CommandEvent is fired after a command is parsed, but before it is executed. diff --git a/src/main/java/net/neoforged/neoforge/event/EventHooks.java b/src/main/java/net/neoforged/neoforge/event/EventHooks.java index ac81a6e959b..191d4002061 100644 --- a/src/main/java/net/neoforged/neoforge/event/EventHooks.java +++ b/src/main/java/net/neoforged/neoforge/event/EventHooks.java @@ -179,7 +179,7 @@ import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.resource.ReloadListenerSort; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class EventHooks { public static boolean onMultiBlockPlace(@Nullable Entity entity, List blockSnapshots, Direction direction) { @@ -572,7 +572,7 @@ public static void onPlayerFall(Player player, float distance, float multiplier) NeoForge.EVENT_BUS.post(new PlayerFlyableFallEvent(player, distance, multiplier)); } - public static boolean onPlayerSpawnSet(Player player, @Nullable ServerPlayer.RespawnConfig respawnConfig) { + public static boolean onPlayerSpawnSet(Player player, ServerPlayer.@Nullable RespawnConfig respawnConfig) { return NeoForge.EVENT_BUS.post(new PlayerSetSpawnEvent(player, respawnConfig)).isCanceled(); } diff --git a/src/main/java/net/neoforged/neoforge/event/GatherSkippedAttributeTooltipsEvent.java b/src/main/java/net/neoforged/neoforge/event/GatherSkippedAttributeTooltipsEvent.java index bdc658a8e02..bb8a1d27bc8 100644 --- a/src/main/java/net/neoforged/neoforge/event/GatherSkippedAttributeTooltipsEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/GatherSkippedAttributeTooltipsEvent.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.Event; import net.neoforged.neoforge.common.util.AttributeTooltipContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is used to collect the IDs of attribute modifiers that will not be displayed in item tooltips. diff --git a/src/main/java/net/neoforged/neoforge/event/ItemAttributeModifierEvent.java b/src/main/java/net/neoforged/neoforge/event/ItemAttributeModifierEvent.java index a1234ccc49a..81e83e583d7 100644 --- a/src/main/java/net/neoforged/neoforge/event/ItemAttributeModifierEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/ItemAttributeModifierEvent.java @@ -22,7 +22,7 @@ import net.minecraft.world.item.component.ItemAttributeModifiers; import net.neoforged.bus.api.Event; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired when the attributes for an item stack are queried (for any reason) through {@link ItemStack#getAttributeModifiers()}. @@ -211,8 +211,7 @@ boolean removeModifier(Holder attribute, Identifier id) { * * @return the previous modifier, or null if there was no previous modifier with the same id */ - @Nullable - ItemAttributeModifiers.Entry replaceModifier(Holder attribute, AttributeModifier modifier, EquipmentSlotGroup slot) { + ItemAttributeModifiers.@Nullable Entry replaceModifier(Holder attribute, AttributeModifier modifier, EquipmentSlotGroup slot) { Key key = new Key(attribute, modifier.id()); ItemAttributeModifiers.Entry entry = new ItemAttributeModifiers.Entry(attribute, modifier, slot); if (entriesByKey.containsKey(key)) { diff --git a/src/main/java/net/neoforged/neoforge/event/LootTableLoadEvent.java b/src/main/java/net/neoforged/neoforge/event/LootTableLoadEvent.java index 0d056f7bf5d..5537ec518a3 100644 --- a/src/main/java/net/neoforged/neoforge/event/LootTableLoadEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/LootTableLoadEvent.java @@ -16,7 +16,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a {@link LootTable} is loaded from JSON. diff --git a/src/main/java/net/neoforged/neoforge/event/ModMismatchEvent.java b/src/main/java/net/neoforged/neoforge/event/ModMismatchEvent.java index 049d7d6632a..b5275f969b1 100644 --- a/src/main/java/net/neoforged/neoforge/event/ModMismatchEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/ModMismatchEvent.java @@ -21,7 +21,7 @@ import net.neoforged.neoforgespi.language.IModInfo; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fires when the mod loader is in the process of loading a world that was last saved diff --git a/src/main/java/net/neoforged/neoforge/event/OnDatapackSyncEvent.java b/src/main/java/net/neoforged/neoforge/event/OnDatapackSyncEvent.java index b458e08f4b4..fcf66c30831 100644 --- a/src/main/java/net/neoforged/neoforge/event/OnDatapackSyncEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/OnDatapackSyncEvent.java @@ -14,7 +14,7 @@ import net.minecraft.server.players.PlayerList; import net.minecraft.world.item.crafting.RecipeType; import net.neoforged.bus.api.Event; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fires when a player joins the server or when the reload command is ran, diff --git a/src/main/java/net/neoforged/neoforge/event/PlayLevelSoundEvent.java b/src/main/java/net/neoforged/neoforge/event/PlayLevelSoundEvent.java index 37024ec7a3d..fb8d608d5a1 100644 --- a/src/main/java/net/neoforged/neoforge/event/PlayLevelSoundEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/PlayLevelSoundEvent.java @@ -15,7 +15,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * PlayLevelSoundEvent is fired when a sound is played on a {@link Level}. diff --git a/src/main/java/net/neoforged/neoforge/event/VanillaGameEvent.java b/src/main/java/net/neoforged/neoforge/event/VanillaGameEvent.java index b36c2513b2b..8a69b8181b7 100644 --- a/src/main/java/net/neoforged/neoforge/event/VanillaGameEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/VanillaGameEvent.java @@ -13,7 +13,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * VanillaGameEvent is fired on the server whenever one of Vanilla's {@link GameEvent GameEvents} fire.
diff --git a/src/main/java/net/neoforged/neoforge/event/enchanting/GetEnchantmentLevelEvent.java b/src/main/java/net/neoforged/neoforge/event/enchanting/GetEnchantmentLevelEvent.java index f902fce284f..15994cb27f7 100644 --- a/src/main/java/net/neoforged/neoforge/event/enchanting/GetEnchantmentLevelEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/enchanting/GetEnchantmentLevelEvent.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.enchantment.ItemEnchantments; import net.neoforged.bus.api.Event; import net.neoforged.neoforge.common.extensions.IItemStackExtension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired whenever the enchantment level of a particular item is requested for gameplay purposes.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/EntityTeleportEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/EntityTeleportEvent.java index 4f26839a9a3..bfacb3f580f 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/EntityTeleportEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/EntityTeleportEvent.java @@ -17,7 +17,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * EntityTeleportEvent is fired when an event involving any teleportation of an Entity occurs.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/RegisterSpawnPlacementsEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/RegisterSpawnPlacementsEvent.java index e8ddc465a86..665f44b1125 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/RegisterSpawnPlacementsEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/RegisterSpawnPlacementsEvent.java @@ -19,7 +19,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.event.IModBusEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event allows each {@link EntityType} to have a {@link SpawnPlacements.SpawnPredicate} registered or modified. @@ -67,7 +67,7 @@ public void register(EntityType entityType, SpawnPlacement * Use {@code null} for the placement or heightmap to leave them as is (which should be done in almost every case) */ @SuppressWarnings("unchecked") - public void register(EntityType entityType, @Nullable SpawnPlacementType placementType, @Nullable Heightmap.Types heightmap, SpawnPlacements.SpawnPredicate predicate, Operation operation) { + public void register(EntityType entityType, @Nullable SpawnPlacementType placementType, Heightmap.@Nullable Types heightmap, SpawnPlacements.SpawnPredicate predicate, Operation operation) { if (!map.containsKey(entityType)) { if (placementType == null) { throw new NullPointerException("Registering a new Spawn Predicate requires a nonnull placement type! Entity Type: " + BuiltInRegistries.ENTITY_TYPE.getKey(entityType)); @@ -103,8 +103,7 @@ public static class MergedSpawnPredicate { private final SpawnPlacements.SpawnPredicate originalPredicate; private final List> orPredicates; private final List> andPredicates; - @Nullable - private SpawnPlacements.SpawnPredicate replacementPredicate; + private SpawnPlacements.@Nullable SpawnPredicate replacementPredicate; private SpawnPlacementType spawnType; private Heightmap.Types heightmapType; @@ -125,7 +124,7 @@ public Heightmap.Types getHeightmapType() { return heightmapType; } - private void merge(Operation operation, SpawnPlacements.SpawnPredicate predicate, @Nullable SpawnPlacementType spawnType, @Nullable Heightmap.Types heightmapType) { + private void merge(Operation operation, SpawnPlacements.SpawnPredicate predicate, @Nullable SpawnPlacementType spawnType, Heightmap.@Nullable Types heightmapType) { if (operation == Operation.AND) { andPredicates.add(predicate); } else if (operation == Operation.OR) { diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/BabyEntitySpawnEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/BabyEntitySpawnEvent.java index 956a699c93c..54f2df0e032 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/BabyEntitySpawnEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/BabyEntitySpawnEvent.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * BabyEntitySpawnEvent is fired just before a baby entity is about to be spawned.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/EffectParticleModificationEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/EffectParticleModificationEvent.java index cb612cb2fca..f174c6b325d 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/EffectParticleModificationEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/EffectParticleModificationEvent.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.LivingEntity; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fires for each effect to allow modification or replacement of the particle options (you can set it to null to reset it to default). diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/FinalizeSpawnEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/FinalizeSpawnEvent.java index 66722912292..23562ebc11c 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/FinalizeSpawnEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/FinalizeSpawnEvent.java @@ -22,7 +22,7 @@ import net.neoforged.neoforge.common.NeoForgeEventHandler; import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired before {@link Mob#finalizeSpawn} is called.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingChangeTargetEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingChangeTargetEvent.java index e8cde2014c8..411e97c1933 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingChangeTargetEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingChangeTargetEvent.java @@ -12,7 +12,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event allows you to change the target an entity has.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingEvent.java index febd2cd3161..5f52ef9a388 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingEvent.java @@ -12,7 +12,7 @@ import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.EntityEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * LivingEvent is fired whenever an event involving a {@link LivingEntity} occurs.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingExperienceDropEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingExperienceDropEvent.java index 28e9212cab3..18da73402ea 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/LivingExperienceDropEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/LivingExperienceDropEvent.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Event for when an entity drops experience on its death, can be used to change diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/MobEffectEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/MobEffectEvent.java index c1172627092..fbd4eaf6627 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/MobEffectEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/MobEffectEvent.java @@ -13,7 +13,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired when an interaction between a {@link LivingEntity} and {@link MobEffectInstance} happens. diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java index 4c70e9de234..1020e2c2b8a 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java @@ -23,7 +23,7 @@ import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This class holds all events relating to the entire flow of mob spawns.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/BonemealEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/BonemealEvent.java index 33f93e61ca3..35bfe6ffad7 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/BonemealEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/BonemealEvent.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is called when a player attempts to use bone meal on a block. diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/CanContinueSleepingEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/CanContinueSleepingEvent.java index dbf313c4a60..ca4fa675002 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/CanContinueSleepingEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/CanContinueSleepingEvent.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player.BedSleepingProblem; import net.neoforged.neoforge.event.entity.living.LivingEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired when the game checks if a sleeping entity may continue sleeping. diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/CanPlayerSleepEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/CanPlayerSleepEvent.java index fa1e1581246..72c056d2f90 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/CanPlayerSleepEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/CanPlayerSleepEvent.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Player.BedSleepingProblem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Called from {@link ServerPlayer#startSleepInBed(BlockPos)} when a player attempts to sleep. diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/ItemTooltipEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/ItemTooltipEvent.java index d875d68996f..c22cf4f79c2 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/ItemTooltipEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/ItemTooltipEvent.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.Item.TooltipContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ItemTooltipEvent extends PlayerEvent { private final TooltipFlag flags; diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerDestroyItemEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerDestroyItemEvent.java index 90d51d4aae5..679b424195a 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerDestroyItemEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerDestroyItemEvent.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.EventHooks; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * PlayerDestroyItemEvent is fired when a player destroys an item.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerEvent.java index 66c55569e4a..4b64505d302 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerEvent.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.event.entity.living.LivingEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * PlayerEvent is fired whenever an event involving a {@link Player} occurs.
diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerInteractEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerInteractEvent.java index b317103a29b..cdf8a07d07e 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerInteractEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerInteractEvent.java @@ -28,7 +28,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * PlayerInteractEvent is fired when a player interacts in some way. diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerSetSpawnEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerSetSpawnEvent.java index 6110513be6a..252987fd9f8 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerSetSpawnEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/PlayerSetSpawnEvent.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired when a player's spawn point is set or reset.
@@ -23,7 +23,7 @@ public class PlayerSetSpawnEvent extends PlayerEvent implements ICancellableEven @Nullable private final BlockPos newSpawn; - public PlayerSetSpawnEvent(Player player, @Nullable ServerPlayer.RespawnConfig respawnConfig) { + public PlayerSetSpawnEvent(Player player, ServerPlayer.@Nullable RespawnConfig respawnConfig) { super(player); this.spawnLevel = ServerPlayer.RespawnConfig.getDimensionOrDefault(respawnConfig); this.newSpawn = respawnConfig != null ? respawnConfig.respawnData().pos() : null; diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/UseItemOnBlockEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/UseItemOnBlockEvent.java index 99c6172c16b..631299db9b0 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/UseItemOnBlockEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/UseItemOnBlockEvent.java @@ -22,7 +22,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.extensions.IItemExtension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fires on both the client and server thread when a player interacts with a block. diff --git a/src/main/java/net/neoforged/neoforge/event/furnace/FurnaceFuelBurnTimeEvent.java b/src/main/java/net/neoforged/neoforge/event/furnace/FurnaceFuelBurnTimeEvent.java index 1f82354ed05..221c37c7e88 100644 --- a/src/main/java/net/neoforged/neoforge/event/furnace/FurnaceFuelBurnTimeEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/furnace/FurnaceFuelBurnTimeEvent.java @@ -13,7 +13,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.EventHooks; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * {@link FurnaceFuelBurnTimeEvent} is fired when determining the fuel value for an ItemStack.
diff --git a/src/main/java/net/neoforged/neoforge/event/level/BlockDropsEvent.java b/src/main/java/net/neoforged/neoforge/event/level/BlockDropsEvent.java index 609f65f471b..e6d9cac03b4 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/BlockDropsEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/BlockDropsEvent.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.neoforge.common.loot.LootModifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a block is broken and the drops have been determined, but before they have been added to the world. This event can be used to manipulate the dropped items and experience. diff --git a/src/main/java/net/neoforged/neoforge/event/level/BlockEvent.java b/src/main/java/net/neoforged/neoforge/event/level/BlockEvent.java index 4fc517f429d..03309542d08 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/BlockEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/BlockEvent.java @@ -26,7 +26,7 @@ import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; import net.neoforged.neoforge.common.util.BlockSnapshot; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class BlockEvent extends Event { private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("neoforge.debugBlockEvent", "false")); diff --git a/src/main/java/net/neoforged/neoforge/event/level/BlockGrowFeatureEvent.java b/src/main/java/net/neoforged/neoforge/event/level/BlockGrowFeatureEvent.java index ee002c72141..b77518517c2 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/BlockGrowFeatureEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/BlockGrowFeatureEvent.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired whenever a block (like a sapling) grows into a feature (like a tree). diff --git a/src/main/java/net/neoforged/neoforge/event/level/ChunkTicketLevelUpdatedEvent.java b/src/main/java/net/neoforged/neoforge/event/level/ChunkTicketLevelUpdatedEvent.java index ceb9d7fbb48..b6bfb895b60 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/ChunkTicketLevelUpdatedEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/ChunkTicketLevelUpdatedEvent.java @@ -10,7 +10,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired whenever a chunk has its ticket level changed via the server's ChunkMap. diff --git a/src/main/java/net/neoforged/neoforge/event/level/LevelEvent.java b/src/main/java/net/neoforged/neoforge/event/level/LevelEvent.java index 1c1108e93b4..d6fef659636 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/LevelEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/LevelEvent.java @@ -20,7 +20,7 @@ import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This event is fired whenever an event involving a {@link LevelAccessor} occurs. @@ -130,8 +130,7 @@ public ServerLevelData getSettings() { public static class PotentialSpawns extends LevelEvent implements ICancellableEvent { private final MobCategory mobcategory; private final BlockPos pos; - @Nullable - private WeightedList.Builder list; + private WeightedList.@Nullable Builder list; private List> view; public PotentialSpawns(LevelAccessor level, MobCategory category, BlockPos pos, WeightedList oldList) { diff --git a/src/main/java/net/neoforged/neoforge/event/level/PistonEvent.java b/src/main/java/net/neoforged/neoforge/event/level/PistonEvent.java index a3443048864..befab3e7164 100644 --- a/src/main/java/net/neoforged/neoforge/event/level/PistonEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/level/PistonEvent.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.piston.PistonStructureResolver; import net.neoforged.bus.api.ICancellableEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Base piston event, use {@link PistonEvent.Post} and {@link PistonEvent.Pre} diff --git a/src/main/java/net/neoforged/neoforge/fluids/BaseFlowingFluid.java b/src/main/java/net/neoforged/neoforge/fluids/BaseFlowingFluid.java index f956bbec9e5..2e2b6289cfc 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/BaseFlowingFluid.java +++ b/src/main/java/net/neoforged/neoforge/fluids/BaseFlowingFluid.java @@ -26,7 +26,7 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidState; import net.neoforged.neoforge.common.SoundActions; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Base implementation of a {@link FlowingFluid} for mods to use. diff --git a/src/main/java/net/neoforged/neoforge/fluids/CauldronFluidContent.java b/src/main/java/net/neoforged/neoforge/fluids/CauldronFluidContent.java index c386dc984e4..9a08e499a43 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/CauldronFluidContent.java +++ b/src/main/java/net/neoforged/neoforge/fluids/CauldronFluidContent.java @@ -20,7 +20,7 @@ import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.transfer.fluid.CauldronWrapper; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fluid content information for cauldrons. diff --git a/src/main/java/net/neoforged/neoforge/fluids/FluidStack.java b/src/main/java/net/neoforged/neoforge/fluids/FluidStack.java index f4f9e4454d9..0e1e4452f53 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/FluidStack.java +++ b/src/main/java/net/neoforged/neoforge/fluids/FluidStack.java @@ -34,7 +34,7 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; import net.neoforged.neoforge.common.MutableDataComponentHolder; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/fluids/FluidStackLinkedSet.java b/src/main/java/net/neoforged/neoforge/fluids/FluidStackLinkedSet.java index e2f584b5658..cc20f303a5a 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/FluidStackLinkedSet.java +++ b/src/main/java/net/neoforged/neoforge/fluids/FluidStackLinkedSet.java @@ -8,7 +8,7 @@ import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenCustomHashSet; import java.util.Set; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Utility class for creating {@linkplain ObjectLinkedOpenCustomHashSet linked set} for {@link FluidStack} diff --git a/src/main/java/net/neoforged/neoforge/fluids/FluidType.java b/src/main/java/net/neoforged/neoforge/fluids/FluidType.java index ae34ba4a193..4eac8bc4159 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/FluidType.java +++ b/src/main/java/net/neoforged/neoforge/fluids/FluidType.java @@ -46,7 +46,7 @@ import net.neoforged.neoforge.common.SoundActions; import net.neoforged.neoforge.common.util.Lazy; import net.neoforged.neoforge.registries.NeoForgeRegistries; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A definition of common attributes, properties, and methods that is applied diff --git a/src/main/java/net/neoforged/neoforge/fluids/FluidUtil.java b/src/main/java/net/neoforged/neoforge/fluids/FluidUtil.java index 6efdf8152ba..14e60a848b6 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/FluidUtil.java +++ b/src/main/java/net/neoforged/neoforge/fluids/FluidUtil.java @@ -42,7 +42,7 @@ import net.neoforged.neoforge.transfer.access.ItemAccess; import net.neoforged.neoforge.transfer.fluid.FluidResource; import net.neoforged.neoforge.transfer.item.VanillaContainerWrapper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * @deprecated Use {@link ResourceHandler} with a {@link FluidResource} instead of {@link IFluidHandler}. diff --git a/src/main/java/net/neoforged/neoforge/fluids/RegisterCauldronFluidContentEvent.java b/src/main/java/net/neoforged/neoforge/fluids/RegisterCauldronFluidContentEvent.java index 57c5bb38456..6c86244e651 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/RegisterCauldronFluidContentEvent.java +++ b/src/main/java/net/neoforged/neoforge/fluids/RegisterCauldronFluidContentEvent.java @@ -17,7 +17,7 @@ import net.neoforged.bus.api.Event; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.neoforge.capabilities.Capabilities; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Event to register {@link CauldronFluidContent} for modded cauldrons. diff --git a/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java b/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java index c76edc65d90..50977a42532 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java +++ b/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.fluids.crafting.display.FluidSlotDisplay; import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * This class serves as the fluid analogue of an item {@link Ingredient}, diff --git a/src/main/java/net/neoforged/neoforge/internal/BrandingControl.java b/src/main/java/net/neoforged/neoforge/internal/BrandingControl.java index a705c018c14..cdd0ab67dc0 100644 --- a/src/main/java/net/neoforged/neoforge/internal/BrandingControl.java +++ b/src/main/java/net/neoforged/neoforge/internal/BrandingControl.java @@ -16,7 +16,7 @@ import net.neoforged.fml.ModList; import net.neoforged.fml.i18n.FMLTranslations; import net.neoforged.neoforge.common.NeoForgeVersion; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class BrandingControl { public static final String BRANDING_NAME = "NeoForge"; diff --git a/src/main/java/net/neoforged/neoforge/internal/NeoForgeProxy.java b/src/main/java/net/neoforged/neoforge/internal/NeoForgeProxy.java index f7c6993baa4..f909bfbb937 100644 --- a/src/main/java/net/neoforged/neoforge/internal/NeoForgeProxy.java +++ b/src/main/java/net/neoforged/neoforge/internal/NeoForgeProxy.java @@ -14,7 +14,7 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Allows common code to call client-only methods, through {@code NeoForgeClientProxy}. @@ -47,8 +47,7 @@ public TooltipFlag getTooltipFlag() { return TooltipFlag.NORMAL; } - @Nullable - public HolderLookup.RegistryLookup resolveLookup(ResourceKey> key) { + public HolderLookup.@Nullable RegistryLookup resolveLookup(ResourceKey> key) { MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); if (server != null) { return server.registryAccess().lookup(key).orElse(null); diff --git a/src/main/java/net/neoforged/neoforge/internal/NeoForgeVersionCheck.java b/src/main/java/net/neoforged/neoforge/internal/NeoForgeVersionCheck.java index 3de884b2139..1e647a437e4 100644 --- a/src/main/java/net/neoforged/neoforge/internal/NeoForgeVersionCheck.java +++ b/src/main/java/net/neoforged/neoforge/internal/NeoForgeVersionCheck.java @@ -8,7 +8,7 @@ import net.neoforged.fml.ModList; import net.neoforged.fml.VersionChecker; import net.neoforged.neoforge.common.NeoForgeMod; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class NeoForgeVersionCheck { public static VersionChecker.Status getStatus() { diff --git a/src/main/java/net/neoforged/neoforge/items/ItemHandlerHelper.java b/src/main/java/net/neoforged/neoforge/items/ItemHandlerHelper.java index 509b781c11e..b36b8d6c161 100644 --- a/src/main/java/net/neoforged/neoforge/items/ItemHandlerHelper.java +++ b/src/main/java/net/neoforged/neoforge/items/ItemHandlerHelper.java @@ -20,7 +20,7 @@ import net.neoforged.neoforge.transfer.item.ItemUtil; import net.neoforged.neoforge.transfer.resource.Resource; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * @deprecated Use {@link ResourceHandler} with an {@link ItemResource} instead of {@link IItemHandler}. diff --git a/src/main/java/net/neoforged/neoforge/items/wrapper/SidedInvWrapper.java b/src/main/java/net/neoforged/neoforge/items/wrapper/SidedInvWrapper.java index 698d69a2c72..e9fa2c4e6ef 100644 --- a/src/main/java/net/neoforged/neoforge/items/wrapper/SidedInvWrapper.java +++ b/src/main/java/net/neoforged/neoforge/items/wrapper/SidedInvWrapper.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.entity.BrewingStandBlockEntity; import net.neoforged.neoforge.items.IItemHandlerModifiable; import net.neoforged.neoforge.transfer.item.WorldlyContainerWrapper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * @deprecated Use {@link WorldlyContainerWrapper} instead. diff --git a/src/main/java/net/neoforged/neoforge/model/data/ModelData.java b/src/main/java/net/neoforged/neoforge/model/data/ModelData.java index 7a2b0778d22..a394b1bc285 100644 --- a/src/main/java/net/neoforged/neoforge/model/data/ModelData.java +++ b/src/main/java/net/neoforged/neoforge/model/data/ModelData.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A container for data to be passed to {@code BlockStateModel} instances. diff --git a/src/main/java/net/neoforged/neoforge/network/DualStackUtils.java b/src/main/java/net/neoforged/neoforge/network/DualStackUtils.java index 15fc6805d0c..22fccf640f1 100644 --- a/src/main/java/net/neoforged/neoforge/network/DualStackUtils.java +++ b/src/main/java/net/neoforged/neoforge/network/DualStackUtils.java @@ -16,7 +16,7 @@ import net.minecraft.util.HttpUtil; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; public class DualStackUtils { diff --git a/src/main/java/net/neoforged/neoforge/network/PacketDistributor.java b/src/main/java/net/neoforged/neoforge/network/PacketDistributor.java index 642e8985d4f..c4df8d0f287 100644 --- a/src/main/java/net/neoforged/neoforge/network/PacketDistributor.java +++ b/src/main/java/net/neoforged/neoforge/network/PacketDistributor.java @@ -20,7 +20,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; import net.neoforged.neoforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Means to distribute packets in various ways. diff --git a/src/main/java/net/neoforged/neoforge/network/filters/CommandTreeCleaner.java b/src/main/java/net/neoforged/neoforge/network/filters/CommandTreeCleaner.java index 5634727989e..3cf801ab0ce 100644 --- a/src/main/java/net/neoforged/neoforge/network/filters/CommandTreeCleaner.java +++ b/src/main/java/net/neoforged/neoforge/network/filters/CommandTreeCleaner.java @@ -21,7 +21,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.server.permissions.PermissionCheck; import net.minecraft.server.permissions.PermissionProviderCheck; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; // TODO 1.21.6: Investigate whether the NodeBuilder/NodeInspector are actually correctly implemented and whether the filtering can be done directly in the NodeBuilder class CommandTreeCleaner { diff --git a/src/main/java/net/neoforged/neoforge/network/negotiation/NetworkComponentNegotiator.java b/src/main/java/net/neoforged/neoforge/network/negotiation/NetworkComponentNegotiator.java index 00f303b4dc4..986d6ad5d3b 100644 --- a/src/main/java/net/neoforged/neoforge/network/negotiation/NetworkComponentNegotiator.java +++ b/src/main/java/net/neoforged/neoforge/network/negotiation/NetworkComponentNegotiator.java @@ -16,8 +16,8 @@ import net.minecraft.resources.Identifier; import net.neoforged.fml.ModList; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; +import org.jspecify.annotations.Nullable; /** * Negotiates the network components between the server and client. diff --git a/src/main/java/net/neoforged/neoforge/network/payload/CommonRegisterPayload.java b/src/main/java/net/neoforged/neoforge/network/payload/CommonRegisterPayload.java index 6081ea70631..0cace6fec48 100644 --- a/src/main/java/net/neoforged/neoforge/network/payload/CommonRegisterPayload.java +++ b/src/main/java/net/neoforged/neoforge/network/payload/CommonRegisterPayload.java @@ -14,7 +14,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Common Register, used to send play-phase channels during the configuration phase. diff --git a/src/main/java/net/neoforged/neoforge/network/registration/ChannelAttributes.java b/src/main/java/net/neoforged/neoforge/network/registration/ChannelAttributes.java index c746f162d79..9b0c7e533b5 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/ChannelAttributes.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/ChannelAttributes.java @@ -20,7 +20,7 @@ import net.neoforged.neoforge.network.payload.ModdedNetworkPayload; import net.neoforged.neoforge.network.payload.ModdedNetworkQueryPayload; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Utilities for manipulation of Netty {@link Channel} attributes diff --git a/src/main/java/net/neoforged/neoforge/network/registration/NetworkPayloadSetup.java b/src/main/java/net/neoforged/neoforge/network/registration/NetworkPayloadSetup.java index 1bc41a14165..f668e967bdb 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/NetworkPayloadSetup.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/NetworkPayloadSetup.java @@ -17,7 +17,7 @@ import net.minecraft.resources.Identifier; import net.neoforged.neoforge.network.negotiation.NegotiationResult; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Represents a complete negotiated network, which is stored on the client and server. diff --git a/src/main/java/net/neoforged/neoforge/network/registration/NetworkRegistry.java b/src/main/java/net/neoforged/neoforge/network/registration/NetworkRegistry.java index f40596e36a0..93fdbb84a6b 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/NetworkRegistry.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/NetworkRegistry.java @@ -64,8 +64,8 @@ import net.neoforged.neoforge.network.payload.ModdedNetworkQueryPayload; import net.neoforged.neoforge.network.payload.ModdedNetworkSetupFailedPayload; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/network/registration/PayloadRegistrar.java b/src/main/java/net/neoforged/neoforge/network/registration/PayloadRegistrar.java index 0d56264f108..4b20c164054 100644 --- a/src/main/java/net/neoforged/neoforge/network/registration/PayloadRegistrar.java +++ b/src/main/java/net/neoforged/neoforge/network/registration/PayloadRegistrar.java @@ -15,7 +15,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.neoforged.neoforge.network.handling.IPayloadHandler; import net.neoforged.neoforge.network.handling.MainThreadPayloadHandler; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Builder-style helper for registering {@link CustomPacketPayload}s, used for modded networking. diff --git a/src/main/java/net/neoforged/neoforge/registries/BaseMappedRegistry.java b/src/main/java/net/neoforged/neoforge/registries/BaseMappedRegistry.java index d45401cc3e8..c1a78e0e64a 100644 --- a/src/main/java/net/neoforged/neoforge/registries/BaseMappedRegistry.java +++ b/src/main/java/net/neoforged/neoforge/registries/BaseMappedRegistry.java @@ -19,7 +19,7 @@ import net.neoforged.neoforge.registries.callback.RegistryCallback; import net.neoforged.neoforge.registries.datamaps.DataMapType; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public abstract class BaseMappedRegistry implements Registry { diff --git a/src/main/java/net/neoforged/neoforge/registries/DataPackRegistriesHooks.java b/src/main/java/net/neoforged/neoforge/registries/DataPackRegistriesHooks.java index e0366d89254..9464a393a89 100644 --- a/src/main/java/net/neoforged/neoforge/registries/DataPackRegistriesHooks.java +++ b/src/main/java/net/neoforged/neoforge/registries/DataPackRegistriesHooks.java @@ -15,7 +15,7 @@ import net.minecraft.resources.RegistryDataLoader; import net.minecraft.resources.ResourceKey; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public final class DataPackRegistriesHooks { @@ -69,10 +69,9 @@ public static Set>> getSyncedCustomRegistries( return SYNCED_CUSTOM_REGISTRIES_VIEW; } - @Nullable @ApiStatus.Internal @SuppressWarnings("unchecked") - public static RegistryDataLoader.RegistryData getSyncedRegistry(final ResourceKey> registry) { + public static RegistryDataLoader.@Nullable RegistryData getSyncedRegistry(final ResourceKey> registry) { return (RegistryDataLoader.RegistryData) NETWORKABLE_REGISTRIES.stream().filter(data -> data.key().equals(registry)).findFirst().orElse(null); } } diff --git a/src/main/java/net/neoforged/neoforge/registries/DataPackRegistryEvent.java b/src/main/java/net/neoforged/neoforge/registries/DataPackRegistryEvent.java index 76088f32ad8..1a94965a443 100644 --- a/src/main/java/net/neoforged/neoforge/registries/DataPackRegistryEvent.java +++ b/src/main/java/net/neoforged/neoforge/registries/DataPackRegistryEvent.java @@ -17,7 +17,7 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.fml.event.IModBusEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class DataPackRegistryEvent extends Event implements IModBusEvent { @ApiStatus.Internal diff --git a/src/main/java/net/neoforged/neoforge/registries/DeferredHolder.java b/src/main/java/net/neoforged/neoforge/registries/DeferredHolder.java index 71159516ce2..f34acca1644 100644 --- a/src/main/java/net/neoforged/neoforge/registries/DeferredHolder.java +++ b/src/main/java/net/neoforged/neoforge/registries/DeferredHolder.java @@ -20,7 +20,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.neoforged.neoforge.registries.datamaps.DataMapType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A Deferred Holder is a {@link Holder} that is constructed with only a ResourceKey. diff --git a/src/main/java/net/neoforged/neoforge/registries/DeferredRegister.java b/src/main/java/net/neoforged/neoforge/registries/DeferredRegister.java index b82ce487d81..1cc29430323 100644 --- a/src/main/java/net/neoforged/neoforge/registries/DeferredRegister.java +++ b/src/main/java/net/neoforged/neoforge/registries/DeferredRegister.java @@ -33,7 +33,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.neoforged.bus.api.IEventBus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A helper class to aid in registering objects to modded and {@linkplain BuiltInRegistries vanilla registries} and diff --git a/src/main/java/net/neoforged/neoforge/registries/IRegistryExtension.java b/src/main/java/net/neoforged/neoforge/registries/IRegistryExtension.java index e1979909d31..82566459bcb 100644 --- a/src/main/java/net/neoforged/neoforge/registries/IRegistryExtension.java +++ b/src/main/java/net/neoforged/neoforge/registries/IRegistryExtension.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.registries.callback.ClearCallback; import net.neoforged.neoforge.registries.callback.RegistryCallback; import net.neoforged.neoforge.registries.datamaps.DataMapType; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An extension for {@link Registry}, adding some additional functionality to vanilla registries, such as diff --git a/src/main/java/net/neoforged/neoforge/registries/RegisterEvent.java b/src/main/java/net/neoforged/neoforge/registries/RegisterEvent.java index c2afd84358c..179f1daf9ac 100644 --- a/src/main/java/net/neoforged/neoforge/registries/RegisterEvent.java +++ b/src/main/java/net/neoforged/neoforge/registries/RegisterEvent.java @@ -13,7 +13,7 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.bus.api.Event; import net.neoforged.fml.event.IModBusEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired for each registry when it is ready to have modded objects registered. diff --git a/src/main/java/net/neoforged/neoforge/registries/RegistryBuilder.java b/src/main/java/net/neoforged/neoforge/registries/RegistryBuilder.java index 897f7f64ee6..441f5d1e56c 100644 --- a/src/main/java/net/neoforged/neoforge/registries/RegistryBuilder.java +++ b/src/main/java/net/neoforged/neoforge/registries/RegistryBuilder.java @@ -18,7 +18,7 @@ import net.neoforged.neoforge.registries.callback.BakeCallback; import net.neoforged.neoforge.registries.callback.ClearCallback; import net.neoforged.neoforge.registries.callback.RegistryCallback; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class RegistryBuilder { private final ResourceKey> registryKey; diff --git a/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java b/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java index 5a4c6bf5a76..e2a66bd4356 100644 --- a/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java +++ b/src/main/java/net/neoforged/neoforge/registries/RegistryManager.java @@ -32,7 +32,7 @@ import net.neoforged.neoforge.registries.datamaps.DataMapType; import net.neoforged.neoforge.registries.datamaps.RegisterDataMapTypesEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.Marker; import org.slf4j.MarkerFactory; diff --git a/src/main/java/net/neoforged/neoforge/registries/RegistrySnapshot.java b/src/main/java/net/neoforged/neoforge/registries/RegistrySnapshot.java index 3e4b263de8a..cdff2089821 100644 --- a/src/main/java/net/neoforged/neoforge/registries/RegistrySnapshot.java +++ b/src/main/java/net/neoforged/neoforge/registries/RegistrySnapshot.java @@ -20,7 +20,7 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class RegistrySnapshot { private static final Comparator SORTER = Identifier::compareNamespaced; diff --git a/src/main/java/net/neoforged/neoforge/registries/datamaps/AdvancedDataMapType.java b/src/main/java/net/neoforged/neoforge/registries/datamaps/AdvancedDataMapType.java index 390da335cc2..ea22f3df455 100644 --- a/src/main/java/net/neoforged/neoforge/registries/datamaps/AdvancedDataMapType.java +++ b/src/main/java/net/neoforged/neoforge/registries/datamaps/AdvancedDataMapType.java @@ -11,7 +11,7 @@ import net.minecraft.core.Registry; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A version of {@link DataMapType data map types} that has two more features for compatibility and conflict handling: mergers and removers. diff --git a/src/main/java/net/neoforged/neoforge/registries/datamaps/DataMapType.java b/src/main/java/net/neoforged/neoforge/registries/datamaps/DataMapType.java index 34bb076b02c..3a77c82a08d 100644 --- a/src/main/java/net/neoforged/neoforge/registries/datamaps/DataMapType.java +++ b/src/main/java/net/neoforged/neoforge/registries/datamaps/DataMapType.java @@ -12,7 +12,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.common.conditions.ConditionalOps; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A registry data map contains data-driven object that can be attached to a registry object.

diff --git a/src/main/java/net/neoforged/neoforge/registries/datamaps/IWithData.java b/src/main/java/net/neoforged/neoforge/registries/datamaps/IWithData.java index f73544c488c..64362af0b19 100644 --- a/src/main/java/net/neoforged/neoforge/registries/datamaps/IWithData.java +++ b/src/main/java/net/neoforged/neoforge/registries/datamaps/IWithData.java @@ -5,7 +5,7 @@ package net.neoforged.neoforge.registries.datamaps; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Represents a registry object (usually a {@link net.minecraft.core.Holder}) that has data maps. diff --git a/src/main/java/net/neoforged/neoforge/registries/holdersets/CompositeHolderSet.java b/src/main/java/net/neoforged/neoforge/registries/holdersets/CompositeHolderSet.java index 9abe3b56ee5..65479a82f3a 100644 --- a/src/main/java/net/neoforged/neoforge/registries/holdersets/CompositeHolderSet.java +++ b/src/main/java/net/neoforged/neoforge/registries/holdersets/CompositeHolderSet.java @@ -17,7 +17,7 @@ import net.minecraft.core.HolderSet; import net.minecraft.tags.TagKey; import net.minecraft.util.RandomSource; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Composite holdersets have component holdersets and possibly owner holdersets diff --git a/src/main/java/net/neoforged/neoforge/registries/holdersets/NotHolderSet.java b/src/main/java/net/neoforged/neoforge/registries/holdersets/NotHolderSet.java index b2ec016fbb1..18823b2478b 100644 --- a/src/main/java/net/neoforged/neoforge/registries/holdersets/NotHolderSet.java +++ b/src/main/java/net/neoforged/neoforge/registries/holdersets/NotHolderSet.java @@ -28,7 +28,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.util.RandomSource; import net.neoforged.neoforge.common.NeoForgeMod; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** *

Holderset that represents all elements of a registry not present in another holderset. diff --git a/src/main/java/net/neoforged/neoforge/resource/EmptyPackResources.java b/src/main/java/net/neoforged/neoforge/resource/EmptyPackResources.java index 9a0cf5d3e3b..0d5708f4bec 100644 --- a/src/main/java/net/neoforged/neoforge/resource/EmptyPackResources.java +++ b/src/main/java/net/neoforged/neoforge/resource/EmptyPackResources.java @@ -17,7 +17,7 @@ import net.minecraft.server.packs.metadata.pack.PackMetadataSection; import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.resources.IoSupplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class EmptyPackResources extends AbstractPackResources { private final PackMetadataSection packMeta; diff --git a/src/main/java/net/neoforged/neoforge/resource/JarContentsPackResources.java b/src/main/java/net/neoforged/neoforge/resource/JarContentsPackResources.java index 3c6a5032b34..b086e8280f6 100644 --- a/src/main/java/net/neoforged/neoforge/resource/JarContentsPackResources.java +++ b/src/main/java/net/neoforged/neoforge/resource/JarContentsPackResources.java @@ -23,7 +23,7 @@ import net.minecraft.util.FileUtil; import net.neoforged.fml.jarcontents.JarContents; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/resource/VanillaServerListeners.java b/src/main/java/net/neoforged/neoforge/resource/VanillaServerListeners.java index d0db8e9c47b..e5b090f6487 100644 --- a/src/main/java/net/neoforged/neoforge/resource/VanillaServerListeners.java +++ b/src/main/java/net/neoforged/neoforge/resource/VanillaServerListeners.java @@ -15,7 +15,7 @@ import net.neoforged.neoforge.common.util.VanillaClassToKey; import net.neoforged.neoforge.event.AddServerReloadListenersEvent; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Keys for vanilla {@link PreparableReloadListener reload listeners}, used to specify dependency ordering in the {@link AddServerReloadListenersEvent}. diff --git a/src/main/java/net/neoforged/neoforge/server/ServerLifecycleHooks.java b/src/main/java/net/neoforged/neoforge/server/ServerLifecycleHooks.java index 596ec1c845c..21df933bbdf 100644 --- a/src/main/java/net/neoforged/neoforge/server/ServerLifecycleHooks.java +++ b/src/main/java/net/neoforged/neoforge/server/ServerLifecycleHooks.java @@ -51,7 +51,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ServerLifecycleHooks { private static final Logger LOGGER = LogManager.getLogger(); diff --git a/src/main/java/net/neoforged/neoforge/server/command/TPSCommand.java b/src/main/java/net/neoforged/neoforge/server/command/TPSCommand.java index 9406d4125bd..565d401419a 100644 --- a/src/main/java/net/neoforged/neoforge/server/command/TPSCommand.java +++ b/src/main/java/net/neoforged/neoforge/server/command/TPSCommand.java @@ -24,8 +24,8 @@ import net.minecraft.util.Mth; import net.minecraft.util.TimeUtil; import net.minecraft.world.TickRateManager; -import org.jetbrains.annotations.Nullable; import org.joml.Math; +import org.jspecify.annotations.Nullable; class TPSCommand { private static final DecimalFormat TIME_FORMATTER = new DecimalFormat("########0.000"); diff --git a/src/main/java/net/neoforged/neoforge/server/permission/PermissionAPI.java b/src/main/java/net/neoforged/neoforge/server/permission/PermissionAPI.java index ca1902d39a9..ce14da6bb7d 100644 --- a/src/main/java/net/neoforged/neoforge/server/permission/PermissionAPI.java +++ b/src/main/java/net/neoforged/neoforge/server/permission/PermissionAPI.java @@ -24,7 +24,7 @@ import net.neoforged.neoforge.server.permission.nodes.PermissionNode; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class PermissionAPI { private static final Logger LOGGER = LogManager.getLogger(); diff --git a/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionNode.java b/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionNode.java index 61046530cfa..d28ac754af2 100644 --- a/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionNode.java +++ b/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionNode.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.server.permission.PermissionAPI; import net.neoforged.neoforge.server.permission.events.PermissionGatherEvent; import net.neoforged.neoforge.server.permission.handler.IPermissionHandler; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Represents the basic unit at the heart of the permission system. diff --git a/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionTypes.java b/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionTypes.java index 56e4f97301d..c3534e06cea 100644 --- a/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionTypes.java +++ b/src/main/java/net/neoforged/neoforge/server/permission/nodes/PermissionTypes.java @@ -6,7 +6,7 @@ package net.neoforged.neoforge.server.permission.nodes; import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Default PermissionTypes, if you need additional ones, please PR it. diff --git a/src/main/java/net/neoforged/neoforge/transfer/ResourceHandlerUtil.java b/src/main/java/net/neoforged/neoforge/transfer/ResourceHandlerUtil.java index 5e173f1ef79..3833dd9fa3d 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/ResourceHandlerUtil.java +++ b/src/main/java/net/neoforged/neoforge/transfer/ResourceHandlerUtil.java @@ -17,7 +17,7 @@ import net.neoforged.neoforge.transfer.resource.ResourceStack; import net.neoforged.neoforge.transfer.transaction.Transaction; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Utility methods for dealing with {@link ResourceHandler}. diff --git a/src/main/java/net/neoforged/neoforge/transfer/access/ItemAccess.java b/src/main/java/net/neoforged/neoforge/transfer/access/ItemAccess.java index d4408677c5a..c50766d92b9 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/access/ItemAccess.java +++ b/src/main/java/net/neoforged/neoforge/transfer/access/ItemAccess.java @@ -23,7 +23,7 @@ import net.neoforged.neoforge.transfer.transaction.Transaction; import net.neoforged.neoforge.transfer.transaction.TransactionContext; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Provides access to an item storage location, like a slot in an inventory or a player's hand, diff --git a/src/main/java/net/neoforged/neoforge/transfer/energy/EnergyHandlerUtil.java b/src/main/java/net/neoforged/neoforge/transfer/energy/EnergyHandlerUtil.java index 190c9acdda9..0798d3ed12b 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/energy/EnergyHandlerUtil.java +++ b/src/main/java/net/neoforged/neoforge/transfer/energy/EnergyHandlerUtil.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.transfer.TransferPreconditions; import net.neoforged.neoforge.transfer.transaction.Transaction; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Utility class for handling various {@link EnergyHandler} interactions diff --git a/src/main/java/net/neoforged/neoforge/transfer/fluid/FluidUtil.java b/src/main/java/net/neoforged/neoforge/transfer/fluid/FluidUtil.java index f171b5d775a..e7cd17d32a8 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/fluid/FluidUtil.java +++ b/src/main/java/net/neoforged/neoforge/transfer/fluid/FluidUtil.java @@ -36,7 +36,7 @@ import net.neoforged.neoforge.transfer.ResourceHandlerUtil; import net.neoforged.neoforge.transfer.access.ItemAccess; import net.neoforged.neoforge.transfer.transaction.Transaction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/src/main/java/net/neoforged/neoforge/transfer/item/ComposterWrapper.java b/src/main/java/net/neoforged/neoforge/transfer/item/ComposterWrapper.java index ed62fdda6e5..e438dd316ce 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/item/ComposterWrapper.java +++ b/src/main/java/net/neoforged/neoforge/transfer/item/ComposterWrapper.java @@ -23,7 +23,7 @@ import net.neoforged.neoforge.transfer.transaction.SnapshotJournal; import net.neoforged.neoforge.transfer.transaction.TransactionContext; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * {@code ResourceHandler} implementation for the composter block. diff --git a/src/main/java/net/neoforged/neoforge/transfer/item/ContainerOrHandler.java b/src/main/java/net/neoforged/neoforge/transfer/item/ContainerOrHandler.java index d58674e7b34..fc473c8a2e3 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/item/ContainerOrHandler.java +++ b/src/main/java/net/neoforged/neoforge/transfer/item/ContainerOrHandler.java @@ -7,7 +7,7 @@ import net.minecraft.world.Container; import net.neoforged.neoforge.transfer.ResourceHandler; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public record ContainerOrHandler( @Nullable Container container, diff --git a/src/main/java/net/neoforged/neoforge/transfer/item/ItemUtil.java b/src/main/java/net/neoforged/neoforge/transfer/item/ItemUtil.java index 205e52fb3a2..1b34adb572f 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/item/ItemUtil.java +++ b/src/main/java/net/neoforged/neoforge/transfer/item/ItemUtil.java @@ -9,7 +9,7 @@ import net.neoforged.neoforge.transfer.ResourceHandler; import net.neoforged.neoforge.transfer.transaction.Transaction; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Helper functions to work with {@link ResourceHandler}s of {@link ItemResource}s. diff --git a/src/main/java/net/neoforged/neoforge/transfer/item/VanillaInventoryCodeHooks.java b/src/main/java/net/neoforged/neoforge/transfer/item/VanillaInventoryCodeHooks.java index b9383c19594..f903a247f13 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/item/VanillaInventoryCodeHooks.java +++ b/src/main/java/net/neoforged/neoforge/transfer/item/VanillaInventoryCodeHooks.java @@ -19,7 +19,7 @@ import net.neoforged.neoforge.transfer.ResourceHandlerUtil; import net.neoforged.neoforge.transfer.transaction.Transaction; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal public class VanillaInventoryCodeHooks { diff --git a/src/main/java/net/neoforged/neoforge/transfer/item/WorldlyContainerWrapper.java b/src/main/java/net/neoforged/neoforge/transfer/item/WorldlyContainerWrapper.java index 91a04ada992..0e13c784191 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/item/WorldlyContainerWrapper.java +++ b/src/main/java/net/neoforged/neoforge/transfer/item/WorldlyContainerWrapper.java @@ -9,7 +9,7 @@ import net.minecraft.world.WorldlyContainer; import net.neoforged.neoforge.transfer.ResourceHandler; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * An implementation of {@code ResourceHandler} for vanilla's {@link WorldlyContainer} . diff --git a/src/main/java/net/neoforged/neoforge/transfer/transaction/RootCommitJournal.java b/src/main/java/net/neoforged/neoforge/transfer/transaction/RootCommitJournal.java index 9701f8b3c95..babbe5f86a0 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/transaction/RootCommitJournal.java +++ b/src/main/java/net/neoforged/neoforge/transfer/transaction/RootCommitJournal.java @@ -5,7 +5,7 @@ package net.neoforged.neoforge.transfer.transaction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A journal that can be added to a transaction with {@link #updateSnapshots(TransactionContext)}, diff --git a/src/main/java/net/neoforged/neoforge/transfer/transaction/SnapshotJournal.java b/src/main/java/net/neoforged/neoforge/transfer/transaction/SnapshotJournal.java index 893498a428d..546cae99921 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/transaction/SnapshotJournal.java +++ b/src/main/java/net/neoforged/neoforge/transfer/transaction/SnapshotJournal.java @@ -6,7 +6,7 @@ package net.neoforged.neoforge.transfer.transaction; import java.util.ArrayList; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A journal that modifies itself during transactions, diff --git a/src/main/java/net/neoforged/neoforge/transfer/transaction/Transaction.java b/src/main/java/net/neoforged/neoforge/transfer/transaction/Transaction.java index 75e5da72777..5892e2ac512 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/transaction/Transaction.java +++ b/src/main/java/net/neoforged/neoforge/transfer/transaction/Transaction.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A global operation that guarantees either the whole operation succeeds, diff --git a/src/main/java/net/neoforged/neoforge/transfer/transaction/TransactionManager.java b/src/main/java/net/neoforged/neoforge/transfer/transaction/TransactionManager.java index 0262bca7df9..f11a2f55722 100644 --- a/src/main/java/net/neoforged/neoforge/transfer/transaction/TransactionManager.java +++ b/src/main/java/net/neoforged/neoforge/transfer/transaction/TransactionManager.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Queue; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Manager for handling opening new {@link Transaction Transactions} or querying status of a transaction chain in a given thread. diff --git a/src/main/java/net/neoforged/neoforge/world/inventory/StackCopySlot.java b/src/main/java/net/neoforged/neoforge/world/inventory/StackCopySlot.java index 13bc67a4ef1..5924aff3328 100644 --- a/src/main/java/net/neoforged/neoforge/world/inventory/StackCopySlot.java +++ b/src/main/java/net/neoforged/neoforge/world/inventory/StackCopySlot.java @@ -12,7 +12,7 @@ import net.neoforged.neoforge.transfer.ResourceHandler; import net.neoforged.neoforge.transfer.item.ItemAccessItemHandler; import net.neoforged.neoforge.transfer.item.ResourceHandlerSlot; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Slot to handle immutable itemstack storages (Ex: {@link ItemAccessItemHandler}). diff --git a/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java b/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java index 8dc7d2d32bb..654948151ad 100644 --- a/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java @@ -16,8 +16,8 @@ import net.neoforged.testframework.gametest.ExtendedGameTestHelper; import net.neoforged.testframework.gametest.StructureTemplateBuilder; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** * A special type of {@linkplain Test test} which may only be linked to one {@linkplain TestFramework framework} at a time.
diff --git a/testframework/src/main/java/net/neoforged/testframework/Test.java b/testframework/src/main/java/net/neoforged/testframework/Test.java index f985f1502e7..531b3cb63ab 100644 --- a/testframework/src/main/java/net/neoforged/testframework/Test.java +++ b/testframework/src/main/java/net/neoforged/testframework/Test.java @@ -20,8 +20,8 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.testframework.gametest.GameTestData; import net.neoforged.testframework.group.Groupable; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** * The base interface for tests in the TestFramework. diff --git a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java index f67ce2ef822..1789fe6c421 100644 --- a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java +++ b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java @@ -16,9 +16,9 @@ import net.neoforged.testframework.gametest.DynamicStructureTemplates; import net.neoforged.testframework.group.Group; import net.neoforged.testframework.impl.MutableTestFramework; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** diff --git a/testframework/src/main/java/net/neoforged/testframework/TestListener.java b/testframework/src/main/java/net/neoforged/testframework/TestListener.java index e460b7ec1c4..4eedab13ab0 100644 --- a/testframework/src/main/java/net/neoforged/testframework/TestListener.java +++ b/testframework/src/main/java/net/neoforged/testframework/TestListener.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.Entity; import net.neoforged.testframework.impl.ReflectionUtils; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A listener which listens for changes in tests. diff --git a/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java b/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java index fbee815169d..672e52fb8d5 100644 --- a/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java +++ b/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java @@ -19,8 +19,8 @@ import net.neoforged.testframework.impl.TestFrameworkImpl; import net.neoforged.testframework.summary.DefaultLogSummaryDumper; import net.neoforged.testframework.summary.SummaryDumper; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @ParametersAreNonnullByDefault @NullMarked diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/ExtendedGameTestHelper.java b/testframework/src/main/java/net/neoforged/testframework/gametest/ExtendedGameTestHelper.java index d60900a1d5b..431e367e605 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/ExtendedGameTestHelper.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/ExtendedGameTestHelper.java @@ -64,7 +64,7 @@ import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.entity.living.LivingKnockBackEvent; import net.neoforged.neoforge.network.registration.NetworkRegistry; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ExtendedGameTestHelper extends GameTestHelper { public ExtendedGameTestHelper(GameTestInfo info) { diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java b/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java index f6749e7cb51..e4c9eb2b964 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java @@ -9,8 +9,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.level.block.Rotation; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @ParametersAreNonnullByDefault @NullMarked diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java b/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java index c4f65eb4c0f..79d215b376c 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java @@ -27,8 +27,8 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.neoforged.fml.util.ObfuscationReflectionHelper; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @ParametersAreNonnullByDefault @NullMarked diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java b/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java index e71f35e59c3..b2cbdc8d993 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java @@ -11,8 +11,8 @@ import net.minecraft.world.level.block.LeverBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.AttachFace; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @SuppressWarnings("unchecked") @ParametersAreNonnullByDefault diff --git a/testframework/src/main/java/net/neoforged/testframework/group/Group.java b/testframework/src/main/java/net/neoforged/testframework/group/Group.java index 5dcf9c1d215..aaed5b48dbf 100644 --- a/testframework/src/main/java/net/neoforged/testframework/group/Group.java +++ b/testframework/src/main/java/net/neoforged/testframework/group/Group.java @@ -10,7 +10,7 @@ import net.minecraft.network.chat.Component; import net.neoforged.testframework.Test; import net.neoforged.testframework.impl.TestFrameworkImpl; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class Group implements Groupable { private final String id; diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkCollectors.java b/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkCollectors.java index 8edadb8d5d8..1106d58cda1 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkCollectors.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkCollectors.java @@ -45,7 +45,7 @@ import net.neoforged.testframework.impl.test.MethodBasedGameTestTest; import net.neoforged.testframework.impl.test.MethodBasedTest; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.Type; public final class FrameworkCollectors { diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/PlayerTestStore.java b/testframework/src/main/java/net/neoforged/testframework/impl/PlayerTestStore.java index 9898e3f3977..ea5de4200fe 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/PlayerTestStore.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/PlayerTestStore.java @@ -20,7 +20,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.util.ExtraCodecs; import net.minecraft.world.level.saveddata.SavedData; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class PlayerTestStore extends SavedData { public static final Codec FACTORY = ExtraCodecs.converter(NbtOps.INSTANCE) diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java index 406e99cd0e7..fed7d052419 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java @@ -65,9 +65,9 @@ import net.neoforged.testframework.summary.TestSummary; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java index 187b8b1e85f..a60c24db2b9 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java @@ -47,8 +47,8 @@ import net.neoforged.testframework.impl.TestFrameworkImpl; import net.neoforged.testframework.impl.reg.RegistrationHelperImpl; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; @ParametersAreNonnullByDefault diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedEventTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedEventTest.java index 857f563d30b..dca24510f69 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedEventTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedEventTest.java @@ -13,7 +13,7 @@ import net.neoforged.fml.event.IModBusEvent; import net.neoforged.testframework.Test; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class MethodBasedEventTest extends AbstractTest.Dynamic { protected MethodHandle handle; diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedGameTestTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedGameTestTest.java index d752b1088d9..fdc89e44888 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedGameTestTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedGameTestTest.java @@ -14,7 +14,7 @@ import net.neoforged.testframework.gametest.EmptyTemplate; import net.neoforged.testframework.gametest.GameTest; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class MethodBasedGameTestTest extends AbstractTest.Dynamic { protected MethodHandle handle; diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedTest.java index 5697f790056..9b6a8f448d2 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/MethodBasedTest.java @@ -11,7 +11,7 @@ import net.neoforged.testframework.gametest.EmptyTemplate; import net.neoforged.testframework.gametest.GameTest; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class MethodBasedTest extends AbstractTest.Dynamic { protected MethodHandle handle; diff --git a/testframework/src/main/java/net/neoforged/testframework/registration/DeferredBlockBuilder.java b/testframework/src/main/java/net/neoforged/testframework/registration/DeferredBlockBuilder.java index d0a7755b192..e893cd7b8a9 100644 --- a/testframework/src/main/java/net/neoforged/testframework/registration/DeferredBlockBuilder.java +++ b/testframework/src/main/java/net/neoforged/testframework/registration/DeferredBlockBuilder.java @@ -34,7 +34,7 @@ import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder; import net.neoforged.neoforge.common.data.LanguageProvider; import net.neoforged.neoforge.registries.DeferredBlock; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class DeferredBlockBuilder extends DeferredBlock { private final RegistrationHelper helper; diff --git a/testframework/src/main/java/net/neoforged/testframework/summary/JUnitSummaryDumper.java b/testframework/src/main/java/net/neoforged/testframework/summary/JUnitSummaryDumper.java index f213f51561f..4919c847947 100644 --- a/testframework/src/main/java/net/neoforged/testframework/summary/JUnitSummaryDumper.java +++ b/testframework/src/main/java/net/neoforged/testframework/summary/JUnitSummaryDumper.java @@ -23,7 +23,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/tests/src/junit/java/net/neoforged/neoforge/unittest/InsertableLinkedOpenCustomHashSetTest.java b/tests/src/junit/java/net/neoforged/neoforge/unittest/InsertableLinkedOpenCustomHashSetTest.java index e000a30be48..5d643dfd426 100644 --- a/tests/src/junit/java/net/neoforged/neoforge/unittest/InsertableLinkedOpenCustomHashSetTest.java +++ b/tests/src/junit/java/net/neoforged/neoforge/unittest/InsertableLinkedOpenCustomHashSetTest.java @@ -9,7 +9,7 @@ import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; import java.util.stream.IntStream; import net.neoforged.neoforge.common.util.InsertableLinkedOpenCustomHashSet; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/HandlerTestUtil.java b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/HandlerTestUtil.java index b2c48c57665..679c4a10f52 100644 --- a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/HandlerTestUtil.java +++ b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/HandlerTestUtil.java @@ -10,7 +10,7 @@ import net.neoforged.neoforge.transfer.ResourceHandler; import net.neoforged.neoforge.transfer.resource.Resource; import net.neoforged.neoforge.transfer.resource.ResourceStack; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; final class HandlerTestUtil { @Nullable diff --git a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/ItemTests.java b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/ItemTests.java index 4d382b4d499..d27bb86b80c 100644 --- a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/ItemTests.java +++ b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/ItemTests.java @@ -21,7 +21,7 @@ import net.neoforged.neoforge.transfer.item.VanillaContainerWrapper; import net.neoforged.neoforge.transfer.item.WorldlyContainerWrapper; import net.neoforged.neoforge.transfer.transaction.Transaction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; public class ItemTests { diff --git a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/TransactionTests.java b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/TransactionTests.java index 095efef0da4..996cfa2b9f1 100644 --- a/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/TransactionTests.java +++ b/tests/src/junit/java/net/neoforged/neoforge/unittest/transfer/TransactionTests.java @@ -11,7 +11,7 @@ import net.neoforged.neoforge.transfer.transaction.SnapshotJournal; import net.neoforged.neoforge.transfer.transaction.Transaction; import net.neoforged.neoforge.transfer.transaction.TransactionContext; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/attachment/AttachmentSyncTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/attachment/AttachmentSyncTests.java index 1734310fb93..acb56faf40d 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/attachment/AttachmentSyncTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/attachment/AttachmentSyncTests.java @@ -35,7 +35,7 @@ import net.neoforged.testframework.gametest.GameTest; import net.neoforged.testframework.registration.RegistrationHelper; import org.apache.commons.lang3.mutable.MutableInt; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = "attachment.sync") public class AttachmentSyncTests { diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/block/BlockEntityTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/block/BlockEntityTests.java index acbe8e67fd2..3359c8d2a1e 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/block/BlockEntityTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/block/BlockEntityTests.java @@ -23,7 +23,7 @@ import net.neoforged.testframework.annotation.TestHolder; import net.neoforged.testframework.gametest.GameTest; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; @ForEachTest(groups = BlockTests.GROUP + ".entity") diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/chat/CommandTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/chat/CommandTests.java index 218e47a284c..4ef8c53d4f0 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/chat/CommandTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/chat/CommandTests.java @@ -37,7 +37,7 @@ import net.neoforged.testframework.annotation.TestHolder; import net.neoforged.testframework.gametest.EmptyTemplate; import net.neoforged.testframework.gametest.GameTest; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = "chat.command") public class CommandTests { diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/client/GuiTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/client/GuiTests.java index d38c246b6bd..368c139ebad 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/client/GuiTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/client/GuiTests.java @@ -41,7 +41,7 @@ import net.neoforged.testframework.TestListener; import net.neoforged.testframework.annotation.ForEachTest; import net.neoforged.testframework.annotation.TestHolder; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = "client.gui", side = Dist.CLIENT) public class GuiTests { diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/crafting/IngredientTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/crafting/IngredientTests.java index 0a2492bf510..42eb8c8c406 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/crafting/IngredientTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/crafting/IngredientTests.java @@ -62,7 +62,7 @@ import net.neoforged.testframework.gametest.EmptyTemplate; import net.neoforged.testframework.gametest.GameTest; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = "crafting.ingredient") public class IngredientTests { @@ -313,7 +313,7 @@ static class CompressedShapelessRecipeBuilder implements RecipeBuilder { private final ItemStack result; private final List ingredients = new ArrayList<>(); private final Map> criteria = new LinkedHashMap<>(); - @org.jetbrains.annotations.Nullable + @org.jspecify.annotations.Nullable private String group; private CompressedShapelessRecipeBuilder(RecipeCategory p_250837_, ItemStack p_363612_) { diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/registry/BiomeModifierSyncTest.java b/tests/src/main/java/net/neoforged/neoforge/debug/registry/BiomeModifierSyncTest.java index fef31ec08ef..52abfa34a38 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/registry/BiomeModifierSyncTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/registry/BiomeModifierSyncTest.java @@ -36,7 +36,7 @@ import net.neoforged.testframework.annotation.TestHolder; import net.neoforged.testframework.annotation.WithListener; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = BiomeModifierSyncTest.GROUP) public class BiomeModifierSyncTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java b/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java index a5b0e15981f..50431b19116 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java @@ -30,7 +30,7 @@ import net.neoforged.testframework.annotation.ForEachTest; import net.neoforged.testframework.annotation.TestHolder; import net.neoforged.testframework.annotation.WithListener; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ForEachTest(groups = BulkKnownPackTest.GROUP, side = Dist.CLIENT) public class BulkKnownPackTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java index dbd64843c74..2d39f690290 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/DataGeneratorTest.java @@ -101,7 +101,7 @@ import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @EventBusSubscriber @Mod(DataGeneratorTest.MODID) diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/block/RedstoneSidedConnectivityTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/block/RedstoneSidedConnectivityTest.java index 547e889b1ef..3057da49f81 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/block/RedstoneSidedConnectivityTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/block/RedstoneSidedConnectivityTest.java @@ -21,7 +21,7 @@ import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Mod(RedstoneSidedConnectivityTest.MODID) public class RedstoneSidedConnectivityTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CompositeModelTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CompositeModelTest.java index 50bd9e00b7e..bdc7204ec3f 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CompositeModelTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CompositeModelTest.java @@ -28,7 +28,7 @@ import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Mod(CompositeModelTest.MODID) public class CompositeModelTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CustomItemDisplayContextTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CustomItemDisplayContextTest.java index 9403ba647ae..7b56b13f1ca 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CustomItemDisplayContextTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/CustomItemDisplayContextTest.java @@ -68,7 +68,7 @@ import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Test mod for the custom transform types feature. @@ -118,7 +118,7 @@ public ItemHangerRenderState createRenderState() { } @Override - public void extractRenderState(ItemHangerBlockEntity blockEntity, ItemHangerRenderState renderState, float partialTick, Vec3 cameraPos, @Nullable ModelFeatureRenderer.CrumblingOverlay crumblingOverlay) { + public void extractRenderState(ItemHangerBlockEntity blockEntity, ItemHangerRenderState renderState, float partialTick, Vec3 cameraPos, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay) { BlockEntityRenderer.super.extractRenderState(blockEntity, renderState, partialTick, cameraPos, crumblingOverlay); renderState.facing = blockEntity.getBlockState().getValue(ItemHangerBlock.FACING); diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java index 9156e7af229..32c1b89c6bd 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/model/NewModelLoaderTest.java @@ -60,7 +60,7 @@ import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Mod(NewModelLoaderTest.MODID) public class NewModelLoaderTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/rendering/StencilEnableTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/rendering/StencilEnableTest.java index 75dd9bf9c1c..bfc8fe34166 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/client/rendering/StencilEnableTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/client/rendering/StencilEnableTest.java @@ -36,7 +36,7 @@ import net.neoforged.neoforge.client.stencil.StencilOperation; import net.neoforged.neoforge.client.stencil.StencilPerFaceTest; import net.neoforged.neoforge.client.stencil.StencilTest; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Basic test that uses the stencil buffer. diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/FluidTypeTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/FluidTypeTest.java index 9c03c3e7fa4..88925949578 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/FluidTypeTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/FluidTypeTest.java @@ -52,8 +52,8 @@ import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; /** * A test case used to define and test fluid type integration into fluids. diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/NewFluidTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/NewFluidTest.java index 23a3d28141a..ff6967fe16a 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/NewFluidTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/fluid/NewFluidTest.java @@ -48,7 +48,7 @@ import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.transfer.fluid.DispenseFluidContainer; import org.apache.commons.lang3.Validate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Mod(NewFluidTest.MODID) public class NewFluidTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/item/EnderMaskTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/item/EnderMaskTest.java index 99172538b35..3abedf5cea5 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/item/EnderMaskTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/item/EnderMaskTest.java @@ -18,7 +18,7 @@ import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Mod(EnderMaskTest.MODID) public class EnderMaskTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/misc/GameTestTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/misc/GameTestTest.java index cbe29e81ea6..01bf202a863 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/misc/GameTestTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/misc/GameTestTest.java @@ -35,7 +35,7 @@ //import net.neoforged.neoforge.registries.DeferredHolder; //import net.neoforged.neoforge.registries.DeferredItem; //import net.neoforged.neoforge.registries.DeferredRegister; -//import org.jetbrains.annotations.Nullable; +//import org.jspecify.annotations.Nullable; // //@Mod(GameTestTest.MODID) //public class GameTestTest { diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestMenu.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestMenu.java index 3da4395a1e4..e729d0ee242 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestMenu.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestMenu.java @@ -33,7 +33,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.oldtest.recipebook.RecipeBookExtensionTest.RecipeBookTestContainer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class RecipeBookTestMenu extends RecipeBookMenu { private final RecipeBookTestContainer container = new RecipeBookTestContainer(); diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestRecipe.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestRecipe.java index 7ae3bee7be3..4d8da50c285 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestRecipe.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/recipebook/RecipeBookTestRecipe.java @@ -33,7 +33,7 @@ import net.minecraft.world.item.crafting.display.ShapedCraftingRecipeDisplay; import net.minecraft.world.item.crafting.display.SlotDisplay; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class RecipeBookTestRecipe implements Recipe { public final Ingredients ingredients; diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/world/ChunkWatchEventTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/world/ChunkWatchEventTest.java index 110668ccc27..e2266ca7a37 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/world/ChunkWatchEventTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/world/ChunkWatchEventTest.java @@ -15,7 +15,7 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.level.ChunkWatchEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; @Mod(ChunkWatchEventTest.MODID) diff --git a/tests/src/main/java/net/neoforged/neoforge/oldtest/world/LoginPacketSplitTest.java b/tests/src/main/java/net/neoforged/neoforge/oldtest/world/LoginPacketSplitTest.java index d6bd298f672..bc713ea8471 100644 --- a/tests/src/main/java/net/neoforged/neoforge/oldtest/world/LoginPacketSplitTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/oldtest/world/LoginPacketSplitTest.java @@ -58,7 +58,7 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.AddPackFindersEvent; import net.neoforged.neoforge.registries.DataPackRegistryEvent; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; /** From be093bb0b766586a10e783116648fafe88c31e21 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Sat, 22 Nov 2025 01:19:07 +0100 Subject: [PATCH 10/20] Goodbye jsr305 --- coremods/build.gradle | 1 - .../java/net/neoforged/neoforge/coremods/package-info.java | 4 ++-- projects/neoforge/build.gradle | 3 --- .../java/net/neoforged/neoforge/common/util/FakePlayer.java | 2 -- .../neoforge/common/world/chunk/ForcedChunkManager.java | 2 -- .../neoforge/common/world/chunk/TicketController.java | 2 -- testframework/build.gradle | 1 - .../main/java/net/neoforged/testframework/DynamicTest.java | 4 ---- .../src/main/java/net/neoforged/testframework/Test.java | 2 -- .../main/java/net/neoforged/testframework/TestFramework.java | 2 -- .../main/java/net/neoforged/testframework/TestListener.java | 2 -- .../neoforged/testframework/client/AbstractTestScreen.java | 4 ---- .../neoforged/testframework/client/FrameworkClientImpl.java | 4 ---- .../neoforged/testframework/conf/ClientConfiguration.java | 5 ----- .../neoforged/testframework/conf/FrameworkConfiguration.java | 4 ---- .../testframework/gametest/DynamicStructureTemplates.java | 4 ---- .../net/neoforged/testframework/gametest/GameTestData.java | 4 ---- .../testframework/gametest/StructureTemplateBuilder.java | 4 ---- .../testframework/gametest/TemplateBuilderHelper.java | 4 ---- .../java/net/neoforged/testframework/group/Groupable.java | 2 -- .../neoforged/testframework/impl/EventListenerGroupImpl.java | 4 ---- .../net/neoforged/testframework/impl/FrameworkClient.java | 4 ---- .../neoforged/testframework/impl/MutableTestFramework.java | 4 ---- .../net/neoforged/testframework/impl/ReflectionUtils.java | 4 ---- .../net/neoforged/testframework/impl/TestFrameworkImpl.java | 2 -- .../net/neoforged/testframework/impl/test/AbstractTest.java | 3 --- 26 files changed, 2 insertions(+), 79 deletions(-) diff --git a/coremods/build.gradle b/coremods/build.gradle index a7a151690b5..313ab18fa76 100644 --- a/coremods/build.gradle +++ b/coremods/build.gradle @@ -23,7 +23,6 @@ dependencies { compileOnly(platform("net.neoforged:minecraft-dependencies:${project.minecraft_version}")) compileOnly "org.slf4j:slf4j-api" compileOnly "com.google.code.gson:gson" - compileOnly 'com.google.code.findbugs:jsr305:3.0.2' // TODO 1.21.11 compileOnly "org.jetbrains:annotations:${project.jetbrains_annotations_version}" compileOnly "net.neoforged.fancymodloader:loader:${project.fancy_mod_loader_version}" diff --git a/coremods/src/main/java/net/neoforged/neoforge/coremods/package-info.java b/coremods/src/main/java/net/neoforged/neoforge/coremods/package-info.java index 4bf00aa98a0..972f845c4ed 100644 --- a/coremods/src/main/java/net/neoforged/neoforge/coremods/package-info.java +++ b/coremods/src/main/java/net/neoforged/neoforge/coremods/package-info.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: LGPL-2.1-only */ -@ParametersAreNonnullByDefault +@NullMarked @ApiStatus.Internal package net.neoforged.neoforge.coremods; -import javax.annotation.ParametersAreNonnullByDefault; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/projects/neoforge/build.gradle b/projects/neoforge/build.gradle index 1f612e7f255..825749b178b 100644 --- a/projects/neoforge/build.gradle +++ b/projects/neoforge/build.gradle @@ -146,9 +146,6 @@ dependencies { } compileOnly "org.jetbrains:annotations:${project.jetbrains_annotations_version}" - compileOnly 'org.jspecify:jspecify:1.0.0' // TODO 1.21.11 - compileOnly 'com.google.code.findbugs:jsr305:3.0.2' // TODO 1.21.11 - clientCompileOnly 'com.google.code.findbugs:jsr305:3.0.2' // TODO 1.21.11 userdevCompileOnly jarJar("io.github.llamalad7:mixinextras-neoforge:${project.mixin_extras_version}") diff --git a/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java b/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java index d8b623bc664..d31952b4372 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java +++ b/src/main/java/net/neoforged/neoforge/common/util/FakePlayer.java @@ -10,7 +10,6 @@ import java.util.OptionalInt; import java.util.Set; import java.util.function.Consumer; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.network.DisconnectionDetails; import net.minecraft.network.PacketListener; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -130,7 +129,6 @@ public boolean isFakePlayer() { return true; } - @ParametersAreNonnullByDefault private static class FakePlayerNetHandler extends ServerGamePacketListenerImpl { private static final net.minecraft.network.Connection DUMMY_CONNECTION = new FakeConnection(); diff --git a/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java b/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java index 1489e186435..3d9f19c3b3a 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java +++ b/src/main/java/net/neoforged/neoforge/common/world/chunk/ForcedChunkManager.java @@ -24,7 +24,6 @@ import java.util.Set; import java.util.UUID; import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.UUIDUtil; @@ -42,7 +41,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.Nullable; -@ParametersAreNonnullByDefault public class ForcedChunkManager { private static final Logger LOGGER = LogManager.getLogger(); diff --git a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java index 477b96273c9..c5d6db9185b 100644 --- a/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java +++ b/src/main/java/net/neoforged/neoforge/common/world/chunk/TicketController.java @@ -7,7 +7,6 @@ import java.util.Objects; import java.util.UUID; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerLevel; @@ -25,7 +24,6 @@ * @param callback a callback to be called when the tickets are loaded, in order to validate whether they're still active or not. {@code null} should be used when a * callback needn't be provided */ -@ParametersAreNonnullByDefault public record TicketController(Identifier id, @Nullable LoadingValidationCallback callback) { public TicketController { Objects.requireNonNull(id, "id must not be null"); diff --git a/testframework/build.gradle b/testframework/build.gradle index c8bdb7c58b6..44648b32df2 100644 --- a/testframework/build.gradle +++ b/testframework/build.gradle @@ -20,7 +20,6 @@ dependencies { compileOnly "org.junit.jupiter:junit-jupiter-params" compileOnly "org.jetbrains:annotations:${project.jetbrains_annotations_version}" - compileOnly "com.google.code.findbugs:jsr305:3.0.2" } license { diff --git a/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java b/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java index 654948151ad..5a1b938ed77 100644 --- a/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/DynamicTest.java @@ -7,7 +7,6 @@ import java.util.function.Consumer; import java.util.function.Supplier; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; @@ -16,15 +15,12 @@ import net.neoforged.testframework.gametest.ExtendedGameTestHelper; import net.neoforged.testframework.gametest.StructureTemplateBuilder; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; /** * A special type of {@linkplain Test test} which may only be linked to one {@linkplain TestFramework framework} at a time.
* This type of test can have enabled/disabled listeners added dynamically, and is as such, used primarily by method-based tests. */ -@ParametersAreNonnullByDefault -@NullMarked public interface DynamicTest extends Test { /** * {@return the framework this test is linked to} diff --git a/testframework/src/main/java/net/neoforged/testframework/Test.java b/testframework/src/main/java/net/neoforged/testframework/Test.java index 531b3cb63ab..a8501d09e46 100644 --- a/testframework/src/main/java/net/neoforged/testframework/Test.java +++ b/testframework/src/main/java/net/neoforged/testframework/Test.java @@ -26,8 +26,6 @@ /** * The base interface for tests in the TestFramework. */ -@NullMarked -@ParametersAreNonnullByDefault public interface Test extends Groupable { /** * {@return the ID of this test} diff --git a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java index 1789fe6c421..2931c673735 100644 --- a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java +++ b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java @@ -27,8 +27,6 @@ * @see FrameworkConfiguration#create() * @see MutableTestFramework */ -@ParametersAreNonnullByDefault -@NullMarked public interface TestFramework { /** * {@return the ID of this framework instance} diff --git a/testframework/src/main/java/net/neoforged/testframework/TestListener.java b/testframework/src/main/java/net/neoforged/testframework/TestListener.java index 4eedab13ab0..277d061e015 100644 --- a/testframework/src/main/java/net/neoforged/testframework/TestListener.java +++ b/testframework/src/main/java/net/neoforged/testframework/TestListener.java @@ -7,7 +7,6 @@ import java.lang.invoke.MethodType; import java.util.List; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.world.entity.Entity; import net.neoforged.testframework.impl.ReflectionUtils; import org.jetbrains.annotations.ApiStatus; @@ -16,7 +15,6 @@ /** * A listener which listens for changes in tests. */ -@ParametersAreNonnullByDefault public interface TestListener { /** * This method is called when a test changes its status. diff --git a/testframework/src/main/java/net/neoforged/testframework/client/AbstractTestScreen.java b/testframework/src/main/java/net/neoforged/testframework/client/AbstractTestScreen.java index 750ea7cfc55..d3cf7bc6cef 100644 --- a/testframework/src/main/java/net/neoforged/testframework/client/AbstractTestScreen.java +++ b/testframework/src/main/java/net/neoforged/testframework/client/AbstractTestScreen.java @@ -20,7 +20,6 @@ import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -37,11 +36,8 @@ import net.neoforged.testframework.Test; import net.neoforged.testframework.group.Group; import net.neoforged.testframework.impl.MutableTestFramework; -import org.jspecify.annotations.NullMarked; import org.lwjgl.glfw.GLFW; -@NullMarked -@ParametersAreNonnullByDefault public abstract class AbstractTestScreen extends Screen { protected final MutableTestFramework framework; private final Screen outer = this; diff --git a/testframework/src/main/java/net/neoforged/testframework/client/FrameworkClientImpl.java b/testframework/src/main/java/net/neoforged/testframework/client/FrameworkClientImpl.java index 726affc2d74..5026d1655eb 100644 --- a/testframework/src/main/java/net/neoforged/testframework/client/FrameworkClientImpl.java +++ b/testframework/src/main/java/net/neoforged/testframework/client/FrameworkClientImpl.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.function.BooleanSupplier; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.ToggleKeyMapping; @@ -19,10 +18,7 @@ import net.neoforged.testframework.conf.ClientConfiguration; import net.neoforged.testframework.impl.FrameworkClient; import net.neoforged.testframework.impl.MutableTestFramework; -import org.jspecify.annotations.NullMarked; -@ParametersAreNonnullByDefault -@NullMarked public class FrameworkClientImpl implements FrameworkClient { private final MutableTestFramework impl; private final ClientConfiguration configuration; diff --git a/testframework/src/main/java/net/neoforged/testframework/conf/ClientConfiguration.java b/testframework/src/main/java/net/neoforged/testframework/conf/ClientConfiguration.java index 4972b7b78a6..2db6b38bb6d 100644 --- a/testframework/src/main/java/net/neoforged/testframework/conf/ClientConfiguration.java +++ b/testframework/src/main/java/net/neoforged/testframework/conf/ClientConfiguration.java @@ -5,11 +5,6 @@ package net.neoforged.testframework.conf; -import javax.annotation.ParametersAreNonnullByDefault; -import org.jspecify.annotations.NullMarked; - -@ParametersAreNonnullByDefault -@NullMarked public record ClientConfiguration(int toggleOverlayKey, int openManagerKey) { public static Builder builder() { return new Builder(); diff --git a/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java b/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java index 672e52fb8d5..b68bc2e5b30 100644 --- a/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java +++ b/testframework/src/main/java/net/neoforged/testframework/conf/FrameworkConfiguration.java @@ -10,7 +10,6 @@ import java.util.EnumSet; import java.util.List; import java.util.function.Supplier; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.resources.Identifier; import net.minecraft.server.permissions.Permission; import net.minecraft.server.permissions.Permissions; @@ -19,11 +18,8 @@ import net.neoforged.testframework.impl.TestFrameworkImpl; import net.neoforged.testframework.summary.DefaultLogSummaryDumper; import net.neoforged.testframework.summary.SummaryDumper; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -@ParametersAreNonnullByDefault -@NullMarked public record FrameworkConfiguration( Identifier id, Collection enabledFeatures, diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/DynamicStructureTemplates.java b/testframework/src/main/java/net/neoforged/testframework/gametest/DynamicStructureTemplates.java index 65abcaa52de..a48aff60a53 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/DynamicStructureTemplates.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/DynamicStructureTemplates.java @@ -16,16 +16,12 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.resources.Identifier; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; import net.neoforged.fml.util.ObfuscationReflectionHelper; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jspecify.annotations.NullMarked; -@ParametersAreNonnullByDefault -@NullMarked public class DynamicStructureTemplates { // StructureTemplateManager#sources private static final String SOURCES_FIELD = "sources"; diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java b/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java index e4c9eb2b964..4cd5d60577c 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/GameTestData.java @@ -6,14 +6,10 @@ package net.neoforged.testframework.gametest; import java.util.function.Consumer; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.level.block.Rotation; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -@ParametersAreNonnullByDefault -@NullMarked public record GameTestData( @Nullable String batchName, String structureName, boolean required, int maxAttempts, int requiredSuccesses, Consumer function, int maxTicks, diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java b/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java index 79d215b376c..b9da41b1019 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/StructureTemplateBuilder.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.function.Supplier; import java.util.function.UnaryOperator; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; @@ -27,11 +26,8 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.neoforged.fml.util.ObfuscationReflectionHelper; import net.neoforged.testframework.impl.ReflectionUtils; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; -@ParametersAreNonnullByDefault -@NullMarked public class StructureTemplateBuilder implements TemplateBuilderHelper { private static final FieldHandle> PALETTES = FieldHandle.getFor(StructureTemplate.class, "palettes"); private static final FieldHandle> ENTITY_INFO_LIST = FieldHandle.getFor(StructureTemplate.class, "entityInfoList"); diff --git a/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java b/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java index b2cbdc8d993..ef363dd6692 100644 --- a/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java +++ b/testframework/src/main/java/net/neoforged/testframework/gametest/TemplateBuilderHelper.java @@ -5,18 +5,14 @@ package net.neoforged.testframework.gametest; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeverBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.AttachFace; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @SuppressWarnings("unchecked") -@ParametersAreNonnullByDefault -@NullMarked public interface TemplateBuilderHelper> { T set(int x, int y, int z, BlockState state, @Nullable CompoundTag nbt); diff --git a/testframework/src/main/java/net/neoforged/testframework/group/Groupable.java b/testframework/src/main/java/net/neoforged/testframework/group/Groupable.java index 8b79526c72f..e21d9d3b4b8 100644 --- a/testframework/src/main/java/net/neoforged/testframework/group/Groupable.java +++ b/testframework/src/main/java/net/neoforged/testframework/group/Groupable.java @@ -8,9 +8,7 @@ import java.util.List; import java.util.stream.Stream; import net.neoforged.testframework.Test; -import org.jspecify.annotations.NullMarked; -@NullMarked public interface Groupable { /** * Resolves all tests in this groupable element. diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/EventListenerGroupImpl.java b/testframework/src/main/java/net/neoforged/testframework/impl/EventListenerGroupImpl.java index 6502bbb8142..46b2408da10 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/EventListenerGroupImpl.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/EventListenerGroupImpl.java @@ -8,17 +8,13 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -import javax.annotation.ParametersAreNonnullByDefault; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; import net.neoforged.testframework.Test; import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; @ApiStatus.Internal -@ParametersAreNonnullByDefault -@NullMarked public class EventListenerGroupImpl implements Test.EventListenerGroup { private final EventListenerCollectorImpl mod = new EventListenerCollectorImpl(), game = new EventListenerCollectorImpl(); diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkClient.java b/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkClient.java index 24f1673fca1..1fa4fe936ab 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkClient.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/FrameworkClient.java @@ -6,15 +6,11 @@ package net.neoforged.testframework.impl; import java.util.Optional; -import javax.annotation.ParametersAreNonnullByDefault; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.testframework.client.FrameworkClientImpl; import net.neoforged.testframework.conf.ClientConfiguration; -import org.jspecify.annotations.NullMarked; -@ParametersAreNonnullByDefault -@NullMarked public interface FrameworkClient { void init(IEventBus modBus, ModContainer container); diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/MutableTestFramework.java b/testframework/src/main/java/net/neoforged/testframework/impl/MutableTestFramework.java index c52fb9a89da..c5858fcdc33 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/MutableTestFramework.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/MutableTestFramework.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.ClickEvent; import net.minecraft.resources.Identifier; @@ -20,7 +19,6 @@ import net.neoforged.testframework.TestFramework; import net.neoforged.testframework.conf.FrameworkConfiguration; import net.neoforged.testframework.group.Group; -import org.jspecify.annotations.NullMarked; /** * Interface with directly mutating methods for {@link TestFramework TestFrameworks}. @@ -28,8 +26,6 @@ * @see FrameworkConfiguration#create() * @see TestFrameworkImpl */ -@ParametersAreNonnullByDefault -@NullMarked public interface MutableTestFramework extends TestFramework { Codec REFERENCE_CODEC = Identifier.CODEC.xmap( rl -> TestFrameworkImpl.FRAMEWORKS.stream() diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/ReflectionUtils.java b/testframework/src/main/java/net/neoforged/testframework/impl/ReflectionUtils.java index 760e8b57fb1..557dce2ee40 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/ReflectionUtils.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/ReflectionUtils.java @@ -12,14 +12,10 @@ import java.lang.reflect.Method; import java.util.function.Predicate; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.gametest.framework.GameTestListener; -import org.jspecify.annotations.NullMarked; @SuppressWarnings("unchecked") -@ParametersAreNonnullByDefault -@NullMarked public final class ReflectionUtils { public static T getInstanceField(Object instance, String name) { try { diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java index fed7d052419..db7856531c1 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java @@ -72,8 +72,6 @@ import org.slf4j.LoggerFactory; @ApiStatus.Internal -@ParametersAreNonnullByDefault -@NullMarked public class TestFrameworkImpl implements MutableTestFramework { static final Set FRAMEWORKS = Collections.synchronizedSet(new HashSet<>()); diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java index a60c24db2b9..7b6d25d0204 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java @@ -47,12 +47,9 @@ import net.neoforged.testframework.impl.TestFrameworkImpl; import net.neoforged.testframework.impl.reg.RegistrationHelperImpl; import net.neoforged.testframework.registration.RegistrationHelper; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; -@ParametersAreNonnullByDefault -@NullMarked public abstract class AbstractTest implements Test { protected TestFramework framework; protected String id; From ae23705e2a95bcf47dd2c156996f9403e123590f Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Sat, 22 Nov 2025 01:23:54 +0100 Subject: [PATCH 11/20] Remove a few leftover jsr305 annotations --- src/main/java/net/neoforged/neoforge/common/util/Size2i.java | 5 +---- .../neoforge/event/entity/player/ItemFishedEvent.java | 3 +-- .../src/main/java/net/neoforged/testframework/Test.java | 2 -- .../main/java/net/neoforged/testframework/TestFramework.java | 2 -- .../net/neoforged/testframework/impl/TestFrameworkImpl.java | 4 ---- .../net/neoforged/testframework/impl/test/AbstractTest.java | 2 -- 6 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/common/util/Size2i.java b/src/main/java/net/neoforged/neoforge/common/util/Size2i.java index 863378508b8..0c4d35a51d9 100644 --- a/src/main/java/net/neoforged/neoforge/common/util/Size2i.java +++ b/src/main/java/net/neoforged/neoforge/common/util/Size2i.java @@ -7,16 +7,13 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import javax.annotation.Nonnegative; public final class Size2i { - @Nonnegative public final int width; - @Nonnegative public final int height; @SuppressWarnings("ConstantConditions") - public Size2i(@Nonnegative int width, @Nonnegative int height) { + public Size2i(int width, int height) { Preconditions.checkArgument(width >= 0, "width must be greater or equal 0"); Preconditions.checkArgument(height >= 0, "height must be greater or equal 0"); this.width = width; diff --git a/src/main/java/net/neoforged/neoforge/event/entity/player/ItemFishedEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/player/ItemFishedEvent.java index b81bac728fe..fd1e3b289cf 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/player/ItemFishedEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/player/ItemFishedEvent.java @@ -7,7 +7,6 @@ import com.google.common.base.Preconditions; import java.util.List; -import javax.annotation.Nonnegative; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; @@ -47,7 +46,7 @@ public int getRodDamage() { * * @param rodDamage The damage the rod will take. Must be nonnegative */ - public void damageRodBy(@Nonnegative int rodDamage) { + public void damageRodBy(int rodDamage) { Preconditions.checkArgument(rodDamage >= 0); this.rodDamage = rodDamage; } diff --git a/testframework/src/main/java/net/neoforged/testframework/Test.java b/testframework/src/main/java/net/neoforged/testframework/Test.java index a8501d09e46..29a1e063bd7 100644 --- a/testframework/src/main/java/net/neoforged/testframework/Test.java +++ b/testframework/src/main/java/net/neoforged/testframework/Test.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.function.Consumer; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.neoforged.bus.api.Event; @@ -107,7 +106,6 @@ default Collection listeners() { /** * A group of collectors by bus. */ - @ParametersAreNonnullByDefault @NullMarked interface EventListenerGroup { /** diff --git a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java index 2931c673735..e81235c2803 100644 --- a/testframework/src/main/java/net/neoforged/testframework/TestFramework.java +++ b/testframework/src/main/java/net/neoforged/testframework/TestFramework.java @@ -7,7 +7,6 @@ import java.util.Collection; import java.util.Optional; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.neoforged.bus.api.IEventBus; @@ -85,7 +84,6 @@ public interface TestFramework { /** * Interface used for accessing a framework's tests. */ - @ParametersAreNonnullByDefault @NullMarked interface Tests { /** diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java index db7856531c1..6c74d03e809 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/TestFrameworkImpl.java @@ -26,7 +26,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.gametest.framework.GameTestServer; @@ -66,7 +65,6 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.UnknownNullability; -import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -366,8 +364,6 @@ private void sendPacketIfOn(@Nullable Runnable onServer, @Nullable Runnable remo } } - @ParametersAreNonnullByDefault - @NullMarked public final class TestsImpl implements MutableTests { private final Map tests = Collections.synchronizedMap(new LinkedHashMap<>()); private final Map groups = Collections.synchronizedMap(new LinkedHashMap<>()); diff --git a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java index 7b6d25d0204..93bc883fc96 100644 --- a/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java +++ b/testframework/src/main/java/net/neoforged/testframework/impl/test/AbstractTest.java @@ -16,7 +16,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.ChatFormatting; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.gametest.framework.GameTestInfo; @@ -211,7 +210,6 @@ public final void requestConfirmation(Player player, Component message) { } } - @ParametersAreNonnullByDefault public static abstract class Dynamic extends AbstractTest implements DynamicTest { @Override public TestFramework framework() { From 9f8c8c9e6fa98d1157753fc001cae46513f9caf7 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 22 Nov 2025 14:41:42 +0100 Subject: [PATCH 12/20] Remove last remaining obsolete nullability annotation Remove erroneous comment in SplashManager --- .../minecraft/client/resources/SplashManager.java.patch | 9 +-------- .../src/main/java/net/neoforged/testframework/Test.java | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/patches/net/minecraft/client/resources/SplashManager.java.patch b/patches/net/minecraft/client/resources/SplashManager.java.patch index 44844f9aadf..30d1113d3be 100644 --- a/patches/net/minecraft/client/resources/SplashManager.java.patch +++ b/patches/net/minecraft/client/resources/SplashManager.java.patch @@ -1,13 +1,6 @@ --- a/net/minecraft/client/resources/SplashManager.java +++ b/net/minecraft/client/resources/SplashManager.java -@@ -35,14 +_,19 @@ - this.user = p_118866_; - } - -+ // TODO 1.21.11: replace with AT - public static Component literalSplash(String p_457628_) { - return Component.literal(p_457628_).setStyle(DEFAULT_STYLE); - } +@@ -41,8 +_,12 @@ protected List prepare(ResourceManager p_118869_, ProfilerFiller p_118870_) { try { diff --git a/testframework/src/main/java/net/neoforged/testframework/Test.java b/testframework/src/main/java/net/neoforged/testframework/Test.java index 29a1e063bd7..88bf0f3bd9d 100644 --- a/testframework/src/main/java/net/neoforged/testframework/Test.java +++ b/testframework/src/main/java/net/neoforged/testframework/Test.java @@ -121,7 +121,6 @@ interface EventListenerGroup { /** * A collector of event listeners which automatically unregisters listeners when a test is disabled. */ - @ParametersAreNonnullByDefault @NullMarked interface EventListenerCollector { /** From e5a883f779c27422e96f50dcae1d81a17e3df8c9 Mon Sep 17 00:00:00 2001 From: TelepathicGrunt <40846040+TelepathicGrunt@users.noreply.github.com> Date: Sat, 22 Nov 2025 13:00:00 -0500 Subject: [PATCH 13/20] Revamp c:armor tags with subtags Closes https://github.com/neoforged/NeoForge/issues/2713 Matches fabric mostly. Fabric is missing netherite horse armor and order is a bit odd for some armors. Will be fix in a fabric pr https://github.com/FabricMC/fabric/pull/4918 --- .../resources/assets/c/lang/en_us.json | 4 +++ .../resources/data/c/tags/item/armors.json | 20 ++++++++++--- .../data/c/tags/item/armors/horse.json | 10 +++++++ .../data/c/tags/item/armors/humanoid.json | 8 ++++++ .../data/c/tags/item/armors/nautilus.json | 9 ++++++ .../data/c/tags/item/armors/wolf.json | 5 ++++ .../net/neoforged/neoforge/common/Tags.java | 19 ++++++++++++- .../internal/NeoForgeItemTagsProvider.java | 28 ++++++++++++++++++- .../internal/NeoForgeLanguageProvider.java | 4 +++ 9 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 src/generated/resources/data/c/tags/item/armors/horse.json create mode 100644 src/generated/resources/data/c/tags/item/armors/humanoid.json create mode 100644 src/generated/resources/data/c/tags/item/armors/nautilus.json create mode 100644 src/generated/resources/data/c/tags/item/armors/wolf.json diff --git a/src/generated/resources/assets/c/lang/en_us.json b/src/generated/resources/assets/c/lang/en_us.json index 1ad4b7f5c97..2c0cf103808 100644 --- a/src/generated/resources/assets/c/lang/en_us.json +++ b/src/generated/resources/assets/c/lang/en_us.json @@ -155,6 +155,10 @@ "tag.fluid.c.water": "Water", "tag.item.c.animal_foods": "Animal Foods", "tag.item.c.armors": "Armors", + "tag.item.c.armors.horse": "Horse Armors", + "tag.item.c.armors.humanoid": "Humanoid Armors", + "tag.item.c.armors.nautilus": "Nautilus Armors", + "tag.item.c.armors.wolf": "Wolf Armors", "tag.item.c.barrels": "Barrels", "tag.item.c.barrels.wooden": "Wooden Barrels", "tag.item.c.bones": "Bones", diff --git a/src/generated/resources/data/c/tags/item/armors.json b/src/generated/resources/data/c/tags/item/armors.json index a1f3ac1ce17..14a7f19912b 100644 --- a/src/generated/resources/data/c/tags/item/armors.json +++ b/src/generated/resources/data/c/tags/item/armors.json @@ -1,9 +1,21 @@ { "values": [ - "#minecraft:head_armor", - "#minecraft:chest_armor", - "#minecraft:leg_armor", - "#minecraft:foot_armor", + { + "id": "#c:armors/humanoid", + "required": false + }, + { + "id": "#c:armors/horse", + "required": false + }, + { + "id": "#c:armors/nautilus", + "required": false + }, + { + "id": "#c:armors/wolf", + "required": false + }, { "id": "#forge:armors", "required": false diff --git a/src/generated/resources/data/c/tags/item/armors/horse.json b/src/generated/resources/data/c/tags/item/armors/horse.json new file mode 100644 index 00000000000..fc121e93aec --- /dev/null +++ b/src/generated/resources/data/c/tags/item/armors/horse.json @@ -0,0 +1,10 @@ +{ + "values": [ + "minecraft:leather_horse_armor", + "minecraft:copper_horse_armor", + "minecraft:iron_horse_armor", + "minecraft:golden_horse_armor", + "minecraft:diamond_horse_armor", + "minecraft:netherite_horse_armor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/armors/humanoid.json b/src/generated/resources/data/c/tags/item/armors/humanoid.json new file mode 100644 index 00000000000..ce638700682 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/armors/humanoid.json @@ -0,0 +1,8 @@ +{ + "values": [ + "#minecraft:head_armor", + "#minecraft:chest_armor", + "#minecraft:leg_armor", + "#minecraft:foot_armor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/armors/nautilus.json b/src/generated/resources/data/c/tags/item/armors/nautilus.json new file mode 100644 index 00000000000..5188c418ae8 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/armors/nautilus.json @@ -0,0 +1,9 @@ +{ + "values": [ + "minecraft:copper_nautilus_armor", + "minecraft:iron_nautilus_armor", + "minecraft:golden_nautilus_armor", + "minecraft:diamond_nautilus_armor", + "minecraft:netherite_nautilus_armor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/armors/wolf.json b/src/generated/resources/data/c/tags/item/armors/wolf.json new file mode 100644 index 00000000000..1aed8bde945 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/armors/wolf.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:wolf_armor" + ] +} \ No newline at end of file diff --git a/src/main/java/net/neoforged/neoforge/common/Tags.java b/src/main/java/net/neoforged/neoforge/common/Tags.java index 152eea5791b..9decc5bd60d 100644 --- a/src/main/java/net/neoforged/neoforge/common/Tags.java +++ b/src/main/java/net/neoforged/neoforge/common/Tags.java @@ -983,9 +983,26 @@ public static class Items { */ public static final TagKey MINING_TOOL_TOOLS = tag("tools/mining_tool"); /** - * Collects the 4 vanilla armor tags into one parent collection for ease. + * A tag containing all conventional armor tags. + * Note that this can contain armor that does not necessarily fit on a player. For that, see {@link Tags.Items#ARMORS_HUMANOID} */ public static final TagKey ARMORS = tag("armors"); + /** + * Armor that can fit on a humanoid mob like the Player. This tag collects the 4 vanilla armor tags into one parent collection for ease. + */ + public static final TagKey ARMORS_HUMANOID = tag("armors/humanoid"); + /** + * A tag containing armor that can fit on a Horse. + */ + public static final TagKey ARMORS_HORSE = tag("armors/horse"); + /** + * A tag containing armor that can fit on a Nautilus. + */ + public static final TagKey ARMORS_NAUTILUS = tag("armors/nautilus"); + /** + * A tag containing armor that can fit on a Wolf. + */ + public static final TagKeyARMORS_WOLF = tag("armors/wolf"); /** * Collects the many enchantable tags into one parent collection for ease. */ diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeItemTagsProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeItemTagsProvider.java index aa861fbc0fd..0fcd96eaec9 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeItemTagsProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeItemTagsProvider.java @@ -314,7 +314,33 @@ public void addTags(HolderLookup.Provider lookupProvider) { Tags.Items.TOOLS_IGNITER, Tags.Items.TOOLS_SHEAR, Tags.Items.TOOLS_SHIELD, Tags.Items.TOOLS_SPEAR, Tags.Items.TOOLS_MACE, Tags.Items.TOOLS_WRENCH, Tags.Items.MINING_TOOL_TOOLS, Tags.Items.MELEE_WEAPON_TOOLS, Tags.Items.RANGED_WEAPON_TOOLS); - tag(Tags.Items.ARMORS).addTags(ItemTags.HEAD_ARMOR, ItemTags.CHEST_ARMOR, ItemTags.LEG_ARMOR, ItemTags.FOOT_ARMOR); + tag(Tags.Items.ARMORS) + .addOptionalTag(Tags.Items.ARMORS_HUMANOID) + .addOptionalTag(Tags.Items.ARMORS_HORSE) + .addOptionalTag(Tags.Items.ARMORS_NAUTILUS) + .addOptionalTag(Tags.Items.ARMORS_WOLF); + + tag(Tags.Items.ARMORS_HORSE) + .add(Items.LEATHER_HORSE_ARMOR) + .add(Items.COPPER_HORSE_ARMOR) + .add(Items.IRON_HORSE_ARMOR) + .add(Items.GOLDEN_HORSE_ARMOR) + .add(Items.DIAMOND_HORSE_ARMOR) + .add(Items.NETHERITE_HORSE_ARMOR); + + tag(Tags.Items.ARMORS_NAUTILUS) + .add(Items.COPPER_NAUTILUS_ARMOR) + .add(Items.IRON_NAUTILUS_ARMOR) + .add(Items.GOLDEN_NAUTILUS_ARMOR) + .add(Items.DIAMOND_NAUTILUS_ARMOR) + .add(Items.NETHERITE_NAUTILUS_ARMOR); + + tag(Tags.Items.ARMORS_WOLF) + .add(Items.WOLF_ARMOR); + + tag(Tags.Items.ARMORS_HUMANOID) + .addTags(ItemTags.HEAD_ARMOR, ItemTags.CHEST_ARMOR, ItemTags.LEG_ARMOR, ItemTags.FOOT_ARMOR); + tag(Tags.Items.ENCHANTABLES).addTags(ItemTags.ARMOR_ENCHANTABLE, ItemTags.EQUIPPABLE_ENCHANTABLE, ItemTags.WEAPON_ENCHANTABLE, ItemTags.MELEE_WEAPON_ENCHANTABLE, ItemTags.SHARP_WEAPON_ENCHANTABLE, ItemTags.SWEEPING_ENCHANTABLE, ItemTags.MINING_ENCHANTABLE, ItemTags.MINING_LOOT_ENCHANTABLE, ItemTags.FISHING_ENCHANTABLE, ItemTags.TRIDENT_ENCHANTABLE, ItemTags.BOW_ENCHANTABLE, ItemTags.CROSSBOW_ENCHANTABLE, ItemTags.MACE_ENCHANTABLE, ItemTags.FIRE_ASPECT_ENCHANTABLE, ItemTags.DURABILITY_ENCHANTABLE, ItemTags.VANISHING_ENCHANTABLE); // Backwards compat with pre-1.21 tags. Done after so optional tag is last for better readability. diff --git a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLanguageProvider.java b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLanguageProvider.java index d37c8acd999..097661b8d0c 100644 --- a/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLanguageProvider.java +++ b/src/main/java/net/neoforged/neoforge/common/data/internal/NeoForgeLanguageProvider.java @@ -386,6 +386,10 @@ protected void addTranslations() { add(Tags.Items.MINING_TOOL_TOOLS, "Mining Tools"); add(Tags.Items.TOOLS, "Tools"); add(Tags.Items.ARMORS, "Armors"); + add(Tags.Items.ARMORS_HUMANOID, "Humanoid Armors"); + add(Tags.Items.ARMORS_HORSE, "Horse Armors"); + add(Tags.Items.ARMORS_NAUTILUS, "Nautilus Armors"); + add(Tags.Items.ARMORS_WOLF, "Wolf Armors"); add(Tags.Items.ENCHANTABLES, "Enchantables"); // Fluids From fd99398485c5c2530859a4c0647a26471369e695 Mon Sep 17 00:00:00 2001 From: TelepathicGrunt <40846040+TelepathicGrunt@users.noreply.github.com> Date: Sat, 22 Nov 2025 13:05:53 -0500 Subject: [PATCH 14/20] Fixed formatting from the previous armor tag pr --- src/main/java/net/neoforged/neoforge/common/Tags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/neoforged/neoforge/common/Tags.java b/src/main/java/net/neoforged/neoforge/common/Tags.java index 9decc5bd60d..435758cc08f 100644 --- a/src/main/java/net/neoforged/neoforge/common/Tags.java +++ b/src/main/java/net/neoforged/neoforge/common/Tags.java @@ -1002,7 +1002,7 @@ public static class Items { /** * A tag containing armor that can fit on a Wolf. */ - public static final TagKeyARMORS_WOLF = tag("armors/wolf"); + public static final TagKey ARMORS_WOLF = tag("armors/wolf"); /** * Collects the many enchantable tags into one parent collection for ease. */ From 5650807783d8e8fa9ee5b2135c431161ef31ea8e Mon Sep 17 00:00:00 2001 From: shartte Date: Sun, 23 Nov 2025 23:18:45 +0100 Subject: [PATCH 15/20] Replacement System for DimensionSpecialEffects (#2821) --- .../client/renderer/LevelRenderer.java.patch | 9 +- .../renderer/WeatherEffectRenderer.java.patch | 13 ++- .../state/LevelRenderState.java.patch | 12 ++- .../DimensionSpecialEffects.java.patch | 12 --- .../WeatherEffectRenderer.java.patch.rej | 11 --- .../neoforge/client/ClientHooks.java | 2 +- .../neoforge/client/CustomCloudsRenderer.java | 34 +++++++ ...stomEnvironmentEffectsRendererManager.java | 98 +++++++++++++++++++ .../neoforge/client/CustomSkyboxRenderer.java | 33 +++++++ ....java => CustomWeatherEffectRenderer.java} | 34 ++----- .../DimensionSpecialEffectsManager.java | 45 --------- .../event/ExtractLevelRenderStateEvent.java | 4 +- ...rCustomEnvironmentEffectRendererEvent.java | 77 +++++++++++++++ .../RegisterDimensionSpecialEffectsEvent.java | 38 ------- .../neoforge/common/NeoForgeMod.java | 14 +++ .../common/world/NeoForgeAttributeTypes.java | 19 ++++ .../world/NeoForgeEnvironmentAttributes.java | 34 +++++++ .../META-INF/injected-interfaces.json | 3 - .../worldgen/biome/test_biome.json | 28 ++++++ .../CustomEnvironmentalEffectsTests.java | 93 ++++++++++++++++++ 20 files changed, 468 insertions(+), 145 deletions(-) delete mode 100644 rejects_25w45a/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch delete mode 100644 rejects_25w45a/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch.rej create mode 100644 src/client/java/net/neoforged/neoforge/client/CustomCloudsRenderer.java create mode 100644 src/client/java/net/neoforged/neoforge/client/CustomEnvironmentEffectsRendererManager.java create mode 100644 src/client/java/net/neoforged/neoforge/client/CustomSkyboxRenderer.java rename src/client/java/net/neoforged/neoforge/client/{extensions/IDimensionSpecialEffectsExtension.java => CustomWeatherEffectRenderer.java} (55%) delete mode 100644 src/client/java/net/neoforged/neoforge/client/DimensionSpecialEffectsManager.java create mode 100644 src/client/java/net/neoforged/neoforge/client/event/RegisterCustomEnvironmentEffectRendererEvent.java delete mode 100644 src/client/java/net/neoforged/neoforge/client/event/RegisterDimensionSpecialEffectsEvent.java create mode 100644 src/main/java/net/neoforged/neoforge/common/world/NeoForgeAttributeTypes.java create mode 100644 src/main/java/net/neoforged/neoforge/common/world/NeoForgeEnvironmentAttributes.java create mode 100644 tests/src/generated/resources/data/neotests_env_effects/worldgen/biome/test_biome.json create mode 100644 tests/src/main/java/net/neoforged/neoforge/debug/registry/CustomEnvironmentalEffectsTests.java diff --git a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch index 2c57e7fd5a2..03b130550d2 100644 --- a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch @@ -9,11 +9,14 @@ profilerfiller.popPush("blockOutline"); this.extractBlockOutline(p_109604_, this.levelRenderState); profilerfiller.popPush("blockBreaking"); -@@ -504,6 +_,10 @@ +@@ -504,6 +_,13 @@ .extract( this.level.getWorldBorder(), f, vec3, this.minecraft.options.getEffectiveRenderDistance() * 16, this.levelRenderState.worldBorderRenderState ); + profilerfiller.popPush("neoforge_custom"); ++ this.levelRenderState.customWeatherEffectRenderer = net.neoforged.neoforge.client.CustomEnvironmentEffectsRendererManager.getCustomWeatherEffectRenderer(this.level, p_109604_.position()); ++ this.levelRenderState.customSkyboxRenderer = net.neoforged.neoforge.client.CustomEnvironmentEffectsRendererManager.getCustomSkyboxRenderer(this.level, p_109604_.position()); ++ this.levelRenderState.customCloudsRenderer = net.neoforged.neoforge.client.CustomEnvironmentEffectsRendererManager.getCustomCloudsRenderer(this.level, p_109604_.position()); + net.neoforged.neoforge.common.NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.client.event.ExtractLevelRenderStateEvent( + this, this.levelRenderState, this.level, p_109604_, frustum, p_348530_, this.ticks + )); @@ -148,7 +151,7 @@ - framepass.executes(() -> this.cloudRenderer.render(p_362342_, p_364196_, p_362337_, p_362985_, p_469097_, p_365209_)); + framepass.executes(() -> { -+ if (!this.levelRenderState.dimensionSpecialEffects.renderClouds(this.levelRenderState, p_362985_, p_364196_, p_362342_, p_362337_, modelViewMatrix)) { ++ if (this.levelRenderState.customCloudsRenderer == null || !this.levelRenderState.customCloudsRenderer.renderClouds(this.levelRenderState, p_362985_, p_364196_, p_362342_, p_362337_, modelViewMatrix)) { + this.cloudRenderer.render(p_362342_, p_364196_, p_362337_, p_362985_, p_469097_, p_365209_); + } + }); @@ -307,7 +310,7 @@ this.targets.main = framepass.readsAndWrites(this.targets.main); framepass.executes( () -> { -+ if (!this.levelRenderState.dimensionSpecialEffects.renderSky(levelRenderState, skyrenderstate, modelViewMatrix, () -> RenderSystem.setShaderFog(p_418294_))) { ++ if (this.levelRenderState.customSkyboxRenderer == null || !this.levelRenderState.customSkyboxRenderer.renderSky(levelRenderState, skyrenderstate, modelViewMatrix, () -> RenderSystem.setShaderFog(p_418294_))) { RenderSystem.setShaderFog(p_418294_); if (skyrenderstate.skybox == DimensionType.Skybox.END) { skyrenderer.renderEndSky(); diff --git a/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch b/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch index 7337b9ddaef..bf53e9bd57e 100644 --- a/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch @@ -13,10 +13,21 @@ + } + + public void render(MultiBufferSource p_382792_, Vec3 p_360652_, WeatherRenderState p_451561_, net.minecraft.client.renderer.state.@org.jspecify.annotations.Nullable LevelRenderState levelRenderState) { -+ if (levelRenderState != null && levelRenderState.dimensionSpecialEffects.renderSnowAndRain(levelRenderState, p_451561_, p_382792_, p_360652_)) { ++ if (levelRenderState != null && levelRenderState.customWeatherEffectRenderer != null && levelRenderState.customWeatherEffectRenderer.renderSnowAndRain(levelRenderState, p_451561_, p_382792_, p_360652_)) { + return; + } + if (!p_451561_.rainColumns.isEmpty()) { RenderType rendertype = RenderTypes.weather(RAIN_LOCATION, Minecraft.useShaderTransparency()); this.renderInstances(p_382792_.getBuffer(rendertype), p_451561_.rainColumns, p_360652_, 1.0F, p_451561_.radius, p_451561_.intensity); +@@ -160,6 +_,10 @@ + } + + public void tickRainParticles(ClientLevel p_361823_, Camera p_364990_, int p_361788_, ParticleStatus p_363302_, int p_455026_) { ++ var customWeatherEffectRenderer = net.neoforged.neoforge.client.CustomEnvironmentEffectsRendererManager.getCustomWeatherEffectRenderer(p_361823_, p_364990_.position()); ++ if (customWeatherEffectRenderer != null && customWeatherEffectRenderer.tickRain(p_361823_, p_361788_, p_364990_)) ++ return; ++ + float f = p_361823_.getRainLevel(1.0F); + if (!(f <= 0.0F)) { + RandomSource randomsource = RandomSource.create(p_361788_ * 312987231L); diff --git a/patches/net/minecraft/client/renderer/state/LevelRenderState.java.patch b/patches/net/minecraft/client/renderer/state/LevelRenderState.java.patch index 47715a1f1a8..fd1000b1771 100644 --- a/patches/net/minecraft/client/renderer/state/LevelRenderState.java.patch +++ b/patches/net/minecraft/client/renderer/state/LevelRenderState.java.patch @@ -9,19 +9,23 @@ public CameraRenderState cameraRenderState = new CameraRenderState(); public final List entityRenderStates = new ArrayList<>(); public final List blockEntityRenderStates = new ArrayList<>(); -@@ -20,6 +_,7 @@ +@@ -20,6 +_,9 @@ public final WorldBorderRenderState worldBorderRenderState = new WorldBorderRenderState(); public final SkyRenderState skyRenderState = new SkyRenderState(); public long gameTime; -+ public net.neoforged.neoforge.client.extensions.IDimensionSpecialEffectsExtension dimensionSpecialEffects = net.neoforged.neoforge.client.DimensionSpecialEffectsManager.getDefaultEffects(); ++ public net.neoforged.neoforge.client.@Nullable CustomSkyboxRenderer customSkyboxRenderer; ++ public net.neoforged.neoforge.client.@Nullable CustomCloudsRenderer customCloudsRenderer; ++ public net.neoforged.neoforge.client.@Nullable CustomWeatherEffectRenderer customWeatherEffectRenderer; public void reset() { this.entityRenderStates.clear(); -@@ -31,5 +_,7 @@ +@@ -31,5 +_,9 @@ this.worldBorderRenderState.reset(); this.skyRenderState.reset(); this.gameTime = 0L; -+ this.dimensionSpecialEffects = net.neoforged.neoforge.client.DimensionSpecialEffectsManager.getDefaultEffects(); ++ this.customSkyboxRenderer = null; ++ this.customCloudsRenderer = null; ++ this.customWeatherEffectRenderer = null; + this.resetRenderData(); } } diff --git a/rejects_25w45a/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch b/rejects_25w45a/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch deleted file mode 100644 index 6313279e57a..00000000000 --- a/rejects_25w45a/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch +++ /dev/null @@ -1,12 +0,0 @@ -++++ Target missing ---- a/net/minecraft/client/renderer/DimensionSpecialEffects.java -+++ b/net/minecraft/client/renderer/DimensionSpecialEffects.java -@@ -32,7 +32,7 @@ - } - - public static DimensionSpecialEffects forType(DimensionType p_108877_) { -- return EFFECTS.get(p_108877_.effectsLocation()); -+ return net.neoforged.neoforge.client.DimensionSpecialEffectsManager.getForType(p_108877_.effectsLocation()); - } - - public boolean isSunriseOrSunset(float p_365312_) { diff --git a/rejects_25w45a/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch.rej b/rejects_25w45a/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch.rej deleted file mode 100644 index 534a6f4de7a..00000000000 --- a/rejects_25w45a/net/minecraft/client/renderer/WeatherEffectRenderer.java.patch.rej +++ /dev/null @@ -1,11 +0,0 @@ -++++ REJECTED HUNK: 2 -@@ -156,6 +168,8 @@ - } - - public void tickRainParticles(ClientLevel p_361823_, Camera p_364990_, int p_361788_, ParticleStatus p_363302_) { -+ if (p_361823_.effects().tickRain(p_361823_, p_361788_, p_364990_)) -+ return; - float f = p_361823_.getRainLevel(1.0F) / (Minecraft.useFancyGraphics() ? 1.0F : 2.0F); - if (!(f <= 0.0F)) { - RandomSource randomsource = RandomSource.create(p_361788_ * 312987231L); -++++ END HUNK diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index 9ee355f291d..b529d623478 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -906,7 +906,7 @@ public static void initClientHooks(Minecraft mc, ReloadableResourceManager resou EntitySpectatorShaderManager.init(); RecipeBookManager.init(); mc.gui.initModdedOverlays(); - DimensionSpecialEffectsManager.init(); + CustomEnvironmentEffectsRendererManager.init(); NamedRenderTypeManager.init(); ColorResolverManager.init(); ItemDecoratorHandler.init(); diff --git a/src/client/java/net/neoforged/neoforge/client/CustomCloudsRenderer.java b/src/client/java/net/neoforged/neoforge/client/CustomCloudsRenderer.java new file mode 100644 index 00000000000..f3223bd4ee6 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/CustomCloudsRenderer.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client; + +import net.minecraft.client.CloudStatus; +import net.minecraft.client.renderer.state.LevelRenderState; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.event.ExtractLevelRenderStateEvent; +import net.neoforged.neoforge.client.event.RegisterCustomEnvironmentEffectRendererEvent; +import org.joml.Matrix4f; + +/** + * A custom cloud renderer that can be registered using {@link RegisterCustomEnvironmentEffectRendererEvent#registerCloudRenderer)} + * and used with {@link net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_CLOUDS}. + *

+ * Custom render state needed for the various render methods must be extracted via {@link ExtractLevelRenderStateEvent} + * and stored in the provided {@link LevelRenderState}. + * + * @see RegisterCustomEnvironmentEffectRendererEvent#registerCloudRenderer + * @see net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_CLOUDS + */ +public interface CustomCloudsRenderer { + /** + * Renders the clouds of this dimension. + * + * @return true to prevent vanilla cloud rendering + */ + default boolean renderClouds(LevelRenderState levelRenderState, Vec3 camPos, CloudStatus cloudStatus, int cloudColor, float cloudHeight, Matrix4f modelViewMatrix) { + return false; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/CustomEnvironmentEffectsRendererManager.java b/src/client/java/net/neoforged/neoforge/client/CustomEnvironmentEffectsRendererManager.java new file mode 100644 index 00000000000..e9730aac0a9 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/CustomEnvironmentEffectsRendererManager.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.neoforged.fml.ModLoader; +import net.neoforged.neoforge.client.event.RegisterCustomEnvironmentEffectRendererEvent; +import net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.Nullable; + +/** + * Manager for custom renderers referred to by {@link net.minecraft.world.attribute.EnvironmentAttribute}. + */ +public final class CustomEnvironmentEffectsRendererManager { + private static @Nullable Map CUSTOM_CLOUD_RENDERERS; + private static @Nullable Map CUSTOM_SKYBOX_RENDERERS; + private static @Nullable Map CUSTOM_WEATHER_EFFECT_RENDERERS; + + /** + * Finds the {@link CustomCloudsRenderer} for a given identifier, or null if none is registered. + */ + public static @Nullable CustomCloudsRenderer getCustomCloudsRenderer(Identifier id) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_CLOUDS.equals(id)) { + return null; + } + return Objects.requireNonNull(CUSTOM_CLOUD_RENDERERS).get(id); + } + + /** + * Finds the {@link CustomCloudsRenderer} to use for the given position in the given level. + */ + public static @Nullable CustomCloudsRenderer getCustomCloudsRenderer(Level level, Vec3 position) { + var id = level.environmentAttributes().getValue(NeoForgeEnvironmentAttributes.CUSTOM_CLOUDS, position); + return getCustomCloudsRenderer(id); + } + + /** + * Finds the {@link CustomSkyboxRenderer} for a given identifier, or null if none is registered. + */ + public static @Nullable CustomSkyboxRenderer getCustomSkyboxRenderer(Identifier id) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_SKYBOX.equals(id)) { + return null; + } + return Objects.requireNonNull(CUSTOM_SKYBOX_RENDERERS).get(id); + } + + /** + * Finds the {@link CustomSkyboxRenderer} to use for the given position in the given level. + */ + public static @Nullable CustomSkyboxRenderer getCustomSkyboxRenderer(Level level, Vec3 position) { + var id = level.environmentAttributes().getValue(NeoForgeEnvironmentAttributes.CUSTOM_SKYBOX, position); + return getCustomSkyboxRenderer(id); + } + + /** + * Finds the {@link CustomWeatherEffectRenderer} for a given identifier, or null if none is registered. + */ + public static @Nullable CustomWeatherEffectRenderer getCustomWeatherEffectRenderer(Identifier id) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_WEATHER_EFFECTS.equals(id)) { + return null; + } + return Objects.requireNonNull(CUSTOM_WEATHER_EFFECT_RENDERERS).get(id); + } + + /** + * Finds the {@link CustomWeatherEffectRenderer} to use for the given position in the given level. + */ + public static @Nullable CustomWeatherEffectRenderer getCustomWeatherEffectRenderer(Level level, Vec3 position) { + var id = level.environmentAttributes().getValue(NeoForgeEnvironmentAttributes.CUSTOM_WEATHER_EFFECTS, position); + return getCustomWeatherEffectRenderer(id); + } + + @ApiStatus.Internal + public static void init() { + if (CUSTOM_CLOUD_RENDERERS != null) { + throw new IllegalStateException("Already initialized."); + } + + var customCloudRenderers = new HashMap(); + var customSkyboxRenderers = new HashMap(); + var customWeatherEffectRenderers = new HashMap(); + ModLoader.postEventWrapContainerInModOrder(new RegisterCustomEnvironmentEffectRendererEvent(customCloudRenderers, customSkyboxRenderers, customWeatherEffectRenderers)); + CUSTOM_CLOUD_RENDERERS = Map.copyOf(customCloudRenderers); + CUSTOM_SKYBOX_RENDERERS = Map.copyOf(customSkyboxRenderers); + CUSTOM_WEATHER_EFFECT_RENDERERS = Map.copyOf(customWeatherEffectRenderers); + } + + private CustomEnvironmentEffectsRendererManager() {} +} diff --git a/src/client/java/net/neoforged/neoforge/client/CustomSkyboxRenderer.java b/src/client/java/net/neoforged/neoforge/client/CustomSkyboxRenderer.java new file mode 100644 index 00000000000..3ff0546a790 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/CustomSkyboxRenderer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client; + +import net.minecraft.client.renderer.state.LevelRenderState; +import net.minecraft.client.renderer.state.SkyRenderState; +import net.neoforged.neoforge.client.event.ExtractLevelRenderStateEvent; +import net.neoforged.neoforge.client.event.RegisterCustomEnvironmentEffectRendererEvent; +import org.joml.Matrix4f; + +/** + * A custom skybox renderer that can be registered using {@link RegisterCustomEnvironmentEffectRendererEvent#registerSkyboxRenderer} + * and used with {@link net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_SKYBOX}. + *

+ * Custom render state needed for the various render methods must be extracted via {@link ExtractLevelRenderStateEvent} + * and stored in the provided {@link LevelRenderState}. + * + * @see RegisterCustomEnvironmentEffectRendererEvent#registerSkyboxRenderer + * @see net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_SKYBOX + */ +public interface CustomSkyboxRenderer { + /** + * Renders the sky of this dimension. + * + * @return true to prevent vanilla sky rendering + */ + default boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRenderState, Matrix4f modelViewMatrix, Runnable setupFog) { + return false; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/IDimensionSpecialEffectsExtension.java b/src/client/java/net/neoforged/neoforge/client/CustomWeatherEffectRenderer.java similarity index 55% rename from src/client/java/net/neoforged/neoforge/client/extensions/IDimensionSpecialEffectsExtension.java rename to src/client/java/net/neoforged/neoforge/client/CustomWeatherEffectRenderer.java index 6efa5e17980..ec1d685b83a 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/IDimensionSpecialEffectsExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/CustomWeatherEffectRenderer.java @@ -1,46 +1,30 @@ /* - * Copyright (c) Forge Development LLC and contributors + * Copyright (c) NeoForged and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.neoforged.neoforge.client.extensions; +package net.neoforged.neoforge.client; import net.minecraft.client.Camera; -import net.minecraft.client.CloudStatus; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.state.LevelRenderState; -import net.minecraft.client.renderer.state.SkyRenderState; import net.minecraft.client.renderer.state.WeatherRenderState; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.event.ExtractLevelRenderStateEvent; -import org.joml.Matrix4f; +import net.neoforged.neoforge.client.event.RegisterCustomEnvironmentEffectRendererEvent; /** - * Extension interface for {@link DimensionSpecialEffects}. + * A custom renderer for snow and rain that can be registered using {@link RegisterCustomEnvironmentEffectRendererEvent#registerWeatherEffectRenderer} + * and used with {@link net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_WEATHER_EFFECTS}. *

* Custom render state needed for the various render methods must be extracted via {@link ExtractLevelRenderStateEvent} * and stored in the provided {@link LevelRenderState}. + * + * @see RegisterCustomEnvironmentEffectRendererEvent#registerWeatherEffectRenderer + * @see net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_WEATHER_EFFECTS */ -public interface IDimensionSpecialEffectsExtension { - /** - * Renders the clouds of this dimension. - * - * @return true to prevent vanilla cloud rendering - */ - default boolean renderClouds(LevelRenderState levelRenderState, Vec3 camPos, CloudStatus cloudStatus, int cloudColor, float cloudHeight, Matrix4f modelViewMatrix) { - return false; - } - - /** - * Renders the sky of this dimension. - * - * @return true to prevent vanilla sky rendering - */ - default boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRenderState, Matrix4f modelViewMatrix, Runnable setupFog) { - return false; - } - +public interface CustomWeatherEffectRenderer { /** * Renders the snow and rain effects of this dimension. * diff --git a/src/client/java/net/neoforged/neoforge/client/DimensionSpecialEffectsManager.java b/src/client/java/net/neoforged/neoforge/client/DimensionSpecialEffectsManager.java deleted file mode 100644 index 9ed869e7307..00000000000 --- a/src/client/java/net/neoforged/neoforge/client/DimensionSpecialEffectsManager.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.client; - -import com.google.common.collect.ImmutableMap; -import java.util.HashMap; -import net.minecraft.resources.Identifier; -import net.neoforged.fml.ModLoader; -import net.neoforged.neoforge.client.event.RegisterDimensionSpecialEffectsEvent; -import net.neoforged.neoforge.client.extensions.IDimensionSpecialEffectsExtension; -import org.jetbrains.annotations.ApiStatus; - -/** - * Manager for {@link DimensionSpecialEffects} instances. - *

- * Provides a lookup by dimension type. - */ -public final class DimensionSpecialEffectsManager { - private static ImmutableMap EFFECTS; - private static IDimensionSpecialEffectsExtension DEFAULT_EFFECTS = new IDimensionSpecialEffectsExtension() {}; - - /** - * Finds the {@link DimensionSpecialEffects} for a given dimension type, or the default if none is registered. - */ - public static IDimensionSpecialEffectsExtension getForType(Identifier type) { - return EFFECTS.getOrDefault(type, DEFAULT_EFFECTS); - } - - @ApiStatus.Internal - public static void init() { - var effects = new HashMap(); - var event = new RegisterDimensionSpecialEffectsEvent(effects); - ModLoader.postEventWrapContainerInModOrder(event); - EFFECTS = ImmutableMap.copyOf(effects); - } - - public static IDimensionSpecialEffectsExtension getDefaultEffects() { - return DEFAULT_EFFECTS; - } - - private DimensionSpecialEffectsManager() {} -} diff --git a/src/client/java/net/neoforged/neoforge/client/event/ExtractLevelRenderStateEvent.java b/src/client/java/net/neoforged/neoforge/client/event/ExtractLevelRenderStateEvent.java index 00cfceec36e..30047da0c43 100644 --- a/src/client/java/net/neoforged/neoforge/client/event/ExtractLevelRenderStateEvent.java +++ b/src/client/java/net/neoforged/neoforge/client/event/ExtractLevelRenderStateEvent.java @@ -15,13 +15,13 @@ import net.neoforged.bus.api.Event; import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.client.extensions.IDimensionSpecialEffectsExtension; +import net.neoforged.neoforge.client.CustomEnvironmentEffectsRendererManager; import net.neoforged.neoforge.common.NeoForge; import org.jetbrains.annotations.ApiStatus; /** * Fired when the {@link LevelRenderer} extracts level render state, after all vanilla states have been extracted. - * Use this event to extract custom render state for use in {@link RenderLevelStageEvent} or {@link IDimensionSpecialEffectsExtension}. + * Use this event to extract custom render state for use in {@link RenderLevelStageEvent} or {@linkplain CustomEnvironmentEffectsRendererManager custom environmental effects}. * Custom data can be stored on and retrieved from the provided {@link LevelRenderState} via {@link LevelRenderState#setRenderData(ContextKey, Object)} * and {@link LevelRenderState#getRenderData(ContextKey)} respectively. *

diff --git a/src/client/java/net/neoforged/neoforge/client/event/RegisterCustomEnvironmentEffectRendererEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RegisterCustomEnvironmentEffectRendererEvent.java new file mode 100644 index 00000000000..f985f371f8b --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/event/RegisterCustomEnvironmentEffectRendererEvent.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.event; + +import java.util.Map; +import net.minecraft.resources.Identifier; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; +import net.neoforged.fml.LogicalSide; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.neoforge.client.CustomCloudsRenderer; +import net.neoforged.neoforge.client.CustomSkyboxRenderer; +import net.neoforged.neoforge.client.CustomWeatherEffectRenderer; +import net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes; +import org.jetbrains.annotations.ApiStatus; + +/** + * Allows users to register custom environmental effect renderers, such as {@link CustomCloudsRenderer}, + * {@link CustomSkyboxRenderer} or {@link CustomWeatherEffectRenderer}. + * + *

This event is not {@linkplain ICancellableEvent cancellable}. + * + *

This event is fired on the mod-specific event bus, only on the {@linkplain LogicalSide#CLIENT logical client}.

+ */ +public class RegisterCustomEnvironmentEffectRendererEvent extends Event implements IModBusEvent { + private final Map cloudRenderers; + private final Map skyboxRenderers; + private final Map weatherEffectsRenderers; + + @ApiStatus.Internal + public RegisterCustomEnvironmentEffectRendererEvent(Map cloudRenderers, + Map skyboxRenderers, + Map weatherEffectsRenderers) { + this.cloudRenderers = cloudRenderers; + this.skyboxRenderers = skyboxRenderers; + this.weatherEffectsRenderers = weatherEffectsRenderers; + } + + /** + * Registers the renderer for a given custom clouds type. + * + * @see net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes#CUSTOM_CLOUDS + */ + public void registerCloudRenderer(Identifier id, CustomCloudsRenderer effects) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_CLOUDS.equals(id)) { + throw new IllegalArgumentException("You cannot register a renderer for the default clouds"); + } + this.cloudRenderers.put(id, effects); + } + + /** + * Registers the renderer for a given custom skybox type. + * + * @see NeoForgeEnvironmentAttributes#CUSTOM_SKYBOX + */ + public void registerSkyboxRenderer(Identifier id, CustomSkyboxRenderer effects) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_SKYBOX.equals(id)) { + throw new IllegalArgumentException("You cannot register a renderer for the default skybox"); + } + this.skyboxRenderers.put(id, effects); + } + + /** + * Registers the renderer for a given custom weather effects type. + * + * @see NeoForgeEnvironmentAttributes#CUSTOM_WEATHER_EFFECTS + */ + public void registerWeatherEffectRenderer(Identifier id, CustomWeatherEffectRenderer effects) { + if (NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_WEATHER_EFFECTS.equals(id)) { + throw new IllegalArgumentException("You cannot register a renderer for the default weather effects"); + } + this.weatherEffectsRenderers.put(id, effects); + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/event/RegisterDimensionSpecialEffectsEvent.java b/src/client/java/net/neoforged/neoforge/client/event/RegisterDimensionSpecialEffectsEvent.java deleted file mode 100644 index b953c9244a0..00000000000 --- a/src/client/java/net/neoforged/neoforge/client/event/RegisterDimensionSpecialEffectsEvent.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.client.event; - -import java.util.Map; -import net.minecraft.resources.Identifier; -import net.neoforged.bus.api.Event; -import net.neoforged.bus.api.ICancellableEvent; -import net.neoforged.fml.LogicalSide; -import net.neoforged.fml.event.IModBusEvent; -import net.neoforged.neoforge.client.extensions.IDimensionSpecialEffectsExtension; -import org.jetbrains.annotations.ApiStatus; - -/** - * Allows users to register custom {@link DimensionSpecialEffects} for their dimensions. - * - *

This event is not {@linkplain ICancellableEvent cancellable}, and does not {@linkplain HasResult have a result}. - * - *

This event is fired on the mod-specific event bus, only on the {@linkplain LogicalSide#CLIENT logical client}.

- */ -public class RegisterDimensionSpecialEffectsEvent extends Event implements IModBusEvent { - private final Map effects; - - @ApiStatus.Internal - public RegisterDimensionSpecialEffectsEvent(Map effects) { - this.effects = effects; - } - - /** - * Registers the effects for a given dimension type. - */ - public void register(Identifier dimensionType, IDimensionSpecialEffectsExtension effects) { - this.effects.put(dimensionType, effects); - } -} diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index ff4402551b1..70f3ec36646 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -34,6 +34,8 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.util.random.Weighted; import net.minecraft.util.random.WeightedList; +import net.minecraft.world.attribute.AttributeType; +import net.minecraft.world.attribute.EnvironmentAttribute; import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.damagesource.DamageSources; import net.minecraft.world.damagesource.DamageType; @@ -119,6 +121,8 @@ import net.neoforged.neoforge.common.world.BiomeModifiers.AddSpawnsBiomeModifier; import net.neoforged.neoforge.common.world.BiomeModifiers.RemoveFeaturesBiomeModifier; import net.neoforged.neoforge.common.world.BiomeModifiers.RemoveSpawnsBiomeModifier; +import net.neoforged.neoforge.common.world.NeoForgeAttributeTypes; +import net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes; import net.neoforged.neoforge.common.world.NoneBiomeModifier; import net.neoforged.neoforge.common.world.NoneStructureModifier; import net.neoforged.neoforge.common.world.StructureModifier; @@ -182,6 +186,8 @@ public class NeoForgeMod { private static final DeferredRegister> BIOME_MODIFIER_SERIALIZERS = DeferredRegister.create(NeoForgeRegistries.Keys.BIOME_MODIFIER_SERIALIZERS, MOD_ID); private static final DeferredRegister> STRUCTURE_MODIFIER_SERIALIZERS = DeferredRegister.create(NeoForgeRegistries.Keys.STRUCTURE_MODIFIER_SERIALIZERS, MOD_ID); private static final DeferredRegister HOLDER_SET_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.HOLDER_SET_TYPES, MOD_ID); + private static final DeferredRegister> ATTRIBUTE_TYPES = DeferredRegister.create(Registries.ATTRIBUTE_TYPE, MOD_ID); + private static final DeferredRegister> ENVIRONMENT_ATTRIBUTES = DeferredRegister.create(Registries.ENVIRONMENT_ATTRIBUTE, MOD_ID); @SuppressWarnings({ "unchecked", "rawtypes" }) // Uses Holder instead of DeferredHolder as the type due to weirdness between ECJ and javac. private static final Holder> ENUM_COMMAND_ARGUMENT_TYPE = COMMAND_ARGUMENT_TYPES.register("enum", () -> ArgumentTypeInfos.registerByClass(EnumArgument.class, new EnumArgument.Info())); @@ -545,6 +551,12 @@ public NeoForgeMod(IEventBus modEventBus, Dist dist, ModContainer container) { CrashReportCallables.registerCrashCallable("FML", FMLVersion::getVersion); CrashReportCallables.registerCrashCallable("NeoForge", NeoForgeVersion::getVersion); + // Register environment attributes and types + ATTRIBUTE_TYPES.register("identifier", () -> NeoForgeAttributeTypes.IDENTIFIER); + ENVIRONMENT_ATTRIBUTES.register("custom_weather_effects", () -> NeoForgeEnvironmentAttributes.CUSTOM_WEATHER_EFFECTS); + ENVIRONMENT_ATTRIBUTES.register("custom_clouds", () -> NeoForgeEnvironmentAttributes.CUSTOM_CLOUDS); + ENVIRONMENT_ATTRIBUTES.register("custom_skybox", () -> NeoForgeEnvironmentAttributes.CUSTOM_SKYBOX); + // Forge-provided datapack registries modEventBus.addListener((DataPackRegistryEvent.NewRegistry event) -> { event.dataPackRegistry(NeoForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifier.DIRECT_CODEC); @@ -570,6 +582,8 @@ public NeoForgeMod(IEventBus modEventBus, Dist dist, ModContainer container) { FLUID_INGREDIENT_TYPES.register(modEventBus); CONDITION_CODECS.register(modEventBus); GLOBAL_LOOT_MODIFIER_SERIALIZERS.register(modEventBus); + ATTRIBUTE_TYPES.register(modEventBus); + ENVIRONMENT_ATTRIBUTES.register(modEventBus); NeoForge.EVENT_BUS.addListener(this::serverStopping); ConfigSync.registerEventListeners(); container.registerConfig(ModConfig.Type.SERVER, NeoForgeServerConfig.SPEC); diff --git a/src/main/java/net/neoforged/neoforge/common/world/NeoForgeAttributeTypes.java b/src/main/java/net/neoforged/neoforge/common/world/NeoForgeAttributeTypes.java new file mode 100644 index 00000000000..37f41dd2550 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/world/NeoForgeAttributeTypes.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.world; + +import net.minecraft.resources.Identifier; +import net.minecraft.world.attribute.AttributeType; +import net.minecraft.world.attribute.EnvironmentAttribute; + +public final class NeoForgeAttributeTypes { + /** + * Allows {@link Identifier} to be used as the type of {@link EnvironmentAttribute}. + */ + public static final AttributeType IDENTIFIER = AttributeType.ofNotInterpolated(Identifier.CODEC); + + private NeoForgeAttributeTypes() {} +} diff --git a/src/main/java/net/neoforged/neoforge/common/world/NeoForgeEnvironmentAttributes.java b/src/main/java/net/neoforged/neoforge/common/world/NeoForgeEnvironmentAttributes.java new file mode 100644 index 00000000000..6fcb19528c2 --- /dev/null +++ b/src/main/java/net/neoforged/neoforge/common/world/NeoForgeEnvironmentAttributes.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.world; + +import net.minecraft.resources.Identifier; +import net.minecraft.world.attribute.EnvironmentAttribute; + +/** + * NeoForge specific {@link net.minecraft.world.attribute.EnvironmentAttributes}. + *

+ * These will be filtered out when syncing to vanilla clients. + */ +public final class NeoForgeEnvironmentAttributes { + public static Identifier DEFAULT_CUSTOM_CLOUDS = Identifier.withDefaultNamespace("default"); + public static EnvironmentAttribute CUSTOM_CLOUDS = EnvironmentAttribute.builder(NeoForgeAttributeTypes.IDENTIFIER) + .defaultValue(DEFAULT_CUSTOM_CLOUDS) + .syncable() + .build(); + public static Identifier DEFAULT_CUSTOM_SKYBOX = Identifier.withDefaultNamespace("default"); + public static EnvironmentAttribute CUSTOM_SKYBOX = EnvironmentAttribute.builder(NeoForgeAttributeTypes.IDENTIFIER) + .defaultValue(DEFAULT_CUSTOM_SKYBOX) + .syncable() + .build(); + public static Identifier DEFAULT_CUSTOM_WEATHER_EFFECTS = Identifier.withDefaultNamespace("default"); + public static EnvironmentAttribute CUSTOM_WEATHER_EFFECTS = EnvironmentAttribute.builder(NeoForgeAttributeTypes.IDENTIFIER) + .defaultValue(DEFAULT_CUSTOM_WEATHER_EFFECTS) + .syncable() + .build(); + + private NeoForgeEnvironmentAttributes() {} +} diff --git a/src/main/resources/META-INF/injected-interfaces.json b/src/main/resources/META-INF/injected-interfaces.json index 13a8eb72be5..1d160454149 100644 --- a/src/main/resources/META-INF/injected-interfaces.json +++ b/src/main/resources/META-INF/injected-interfaces.json @@ -26,9 +26,6 @@ "net/minecraft/client/gui/GuiGraphics": [ "net/neoforged/neoforge/client/extensions/IGuiGraphicsExtension" ], - "net/minecraft/client/renderer/DimensionSpecialEffects": [ - "net/neoforged/neoforge/client/extensions/IDimensionSpecialEffectsExtension" - ], "net/minecraft/client/renderer/block/model/BlockModelPart": [ "net/neoforged/neoforge/client/extensions/BlockModelPartExtension" ], diff --git a/tests/src/generated/resources/data/neotests_env_effects/worldgen/biome/test_biome.json b/tests/src/generated/resources/data/neotests_env_effects/worldgen/biome/test_biome.json new file mode 100644 index 00000000000..0caa9d9c387 --- /dev/null +++ b/tests/src/generated/resources/data/neotests_env_effects/worldgen/biome/test_biome.json @@ -0,0 +1,28 @@ +{ + "attributes": { + "neoforge:custom_clouds": "x:custom_clouds", + "neoforge:custom_skybox": "x:custom_skybox", + "neoforge:custom_weather_effects": "x:custom_weather_effects" + }, + "carvers": [], + "creature_spawn_probability": 0.0, + "downfall": 0.5, + "effects": { + "water_color": "#3f76e4" + }, + "features": [], + "has_precipitation": false, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [], + "neotests:test": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/registry/CustomEnvironmentalEffectsTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/registry/CustomEnvironmentalEffectsTests.java new file mode 100644 index 00000000000..08d6b51e69c --- /dev/null +++ b/tests/src/main/java/net/neoforged/neoforge/debug/registry/CustomEnvironmentalEffectsTests.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.debug.registry; + +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.common.world.NeoForgeEnvironmentAttributes; +import net.neoforged.testframework.DynamicTest; +import net.neoforged.testframework.TestFramework; +import net.neoforged.testframework.annotation.ForEachTest; +import net.neoforged.testframework.annotation.OnInit; +import net.neoforged.testframework.annotation.TestHolder; +import net.neoforged.testframework.gametest.EmptyTemplate; +import net.neoforged.testframework.gametest.GameTest; +import net.neoforged.testframework.registration.RegistrationHelper; + +@ForEachTest(groups = "registry") +public class CustomEnvironmentalEffectsTests { + public static final RegistrationHelper HELPER = RegistrationHelper.create("neotests_env_effects"); + private static final ResourceKey BIOME_KEY = ResourceKey.create(Registries.BIOME, + Identifier.fromNamespaceAndPath(HELPER.modId(), "test_biome")); + static final Identifier CUSTOM_CLOUDS_ID = Identifier.parse("x:custom_clouds"); + static final Identifier CUSTOM_SKYBOX_ID = Identifier.parse("x:custom_skybox"); + static final Identifier CUSTOM_WEATHER_EFFECTS_ID = Identifier.parse("x:custom_weather_effects"); + + @OnInit + static void init(final TestFramework framework) { + HELPER.register(framework.modEventBus(), framework.container()); + } + + @GameTest + @EmptyTemplate(floor = true) + @TestHolder(description = "Tests a biome using the NeoForge environment attributes") + static void customBiomeAttributeTest(final DynamicTest test) { + HELPER.addClientProvider(event -> new DatapackBuiltinEntriesProvider(event.getGenerator().getPackOutput(), event.getLookupProvider(), createDatapackEntriesBuilder(), Set.of(HELPER.modId()))); + + test.onGameTest(helper -> helper.startSequence() + .thenExecute(() -> { + helper.setBiome(BIOME_KEY); + var pos = helper.absolutePos(BlockPos.ZERO); + + var attributes = helper.getLevel().environmentAttributes(); + var customSkybox = attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_SKYBOX, pos); + helper.assertValueEqual(CUSTOM_SKYBOX_ID, customSkybox, "custom skybox"); + var customWeatherEffects = attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_WEATHER_EFFECTS, pos); + helper.assertValueEqual(CUSTOM_WEATHER_EFFECTS_ID, customWeatherEffects, "custom weather effects"); + var customClouds = attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_CLOUDS, pos); + helper.assertValueEqual(CUSTOM_CLOUDS_ID, customClouds, "custom clouds"); + + // check that for an arbitrary location it returns the defaults + helper.assertValueEqual(NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_SKYBOX, attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_SKYBOX, BlockPos.ZERO), "default skybox"); + helper.assertValueEqual(NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_WEATHER_EFFECTS, attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_WEATHER_EFFECTS, BlockPos.ZERO), "default weather effects"); + helper.assertValueEqual(NeoForgeEnvironmentAttributes.DEFAULT_CUSTOM_CLOUDS, attributes.getValue(NeoForgeEnvironmentAttributes.CUSTOM_CLOUDS, BlockPos.ZERO), "default clouds"); + }) + .thenSucceed()); + } + + /** + * Builds a biome that actually references the custom effects + */ + private static RegistrySetBuilder createDatapackEntriesBuilder() { + return new RegistrySetBuilder() + .add(Registries.BIOME, context -> { + var placedFeatures = context.lookup(Registries.PLACED_FEATURE); + var configuredCarvers = context.lookup(Registries.CONFIGURED_CARVER); + + Biome biome = new Biome.BiomeBuilder() + .setAttribute(NeoForgeEnvironmentAttributes.CUSTOM_CLOUDS, CUSTOM_CLOUDS_ID) + .setAttribute(NeoForgeEnvironmentAttributes.CUSTOM_SKYBOX, CUSTOM_SKYBOX_ID) + .setAttribute(NeoForgeEnvironmentAttributes.CUSTOM_WEATHER_EFFECTS, CUSTOM_WEATHER_EFFECTS_ID) + .generationSettings(new BiomeGenerationSettings.Builder(placedFeatures, configuredCarvers).build()) + .hasPrecipitation(false) + // Copied from the vanilla void biome + .temperature(0.5F).downfall(0.5F) + .specialEffects(new BiomeSpecialEffects.Builder().waterColor(4159204).build()) + .mobSpawnSettings(new MobSpawnSettings.Builder().creatureGenerationProbability(0).build()).build(); + + context.register(BIOME_KEY, biome); + }); + } +} From abe5072604a3342e9d5591c6644f075f8c04bf30 Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 25 Nov 2025 20:56:40 +0100 Subject: [PATCH 16/20] Refactor BakedNormals (#2829) --- .../block/model/FaceBakery.java.patch | 2 +- .../neoforge/client/ClientHooks.java | 36 ---- .../extensions/IVertexConsumerExtension.java | 9 +- .../model/ao/EnhancedAoRenderStorage.java | 32 ++-- .../pipeline/QuadBakingVertexConsumer.java | 4 +- .../client/model/quad/BakedNormals.java | 162 ++++++++++++++++-- .../client/model/quad/QuadTransforms.java | 12 +- 7 files changed, 164 insertions(+), 93 deletions(-) diff --git a/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch b/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch index edf6e0a9bfd..9676f61691f 100644 --- a/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch +++ b/patches/net/minecraft/client/renderer/block/model/FaceBakery.java.patch @@ -15,7 +15,7 @@ p_111608_, - p_364857_ + Math.max(p_364857_, p_111603_.faceData().lightEmission()), -+ net.neoforged.neoforge.client.ClientHooks.fillNormal(p_470769_, avector3fc[0], avector3fc[1], avector3fc[2], avector3fc[3]), ++ p_470769_.normals(net.neoforged.neoforge.client.model.quad.BakedNormals.of(net.neoforged.neoforge.client.model.quad.BakedNormals.computeQuadNormal(avector3fc[0], avector3fc[1], avector3fc[2], avector3fc[3]))), + p_470769_.colors(net.neoforged.neoforge.client.model.quad.BakedColors.of(p_111603_.faceData().color())), + p_111603_.faceData().ambientOcclusion() ); diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index b529d623478..40970cb4998 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -109,7 +109,6 @@ import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.MaterialSet; -import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.sounds.SoundInstance; @@ -203,7 +202,6 @@ import net.neoforged.neoforge.client.gui.map.MapDecorationRendererManager; import net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay; import net.neoforged.neoforge.client.model.block.BlockStateModelHooks; -import net.neoforged.neoforge.client.model.quad.BakedNormals; import net.neoforged.neoforge.client.pipeline.PipelineModifiers; import net.neoforged.neoforge.client.renderstate.RegisterRenderStateModifiersEvent; import net.neoforged.neoforge.common.CommonHooks; @@ -220,7 +218,6 @@ import org.apache.logging.log4j.MarkerManager; import org.jetbrains.annotations.ApiStatus; import org.joml.Matrix4f; -import org.joml.Vector3fc; import org.joml.Vector4f; import org.jspecify.annotations.Nullable; @@ -475,39 +472,6 @@ public static Material getBlockMaterial(Identifier loc) { return new Material(TextureAtlas.LOCATION_BLOCKS, loc); } - /** - * Computes the packed normal of a quad based on the stored vertex positions. - */ - public static int computeQuadNormal(Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3) { - float dx0 = position3.x() - position1.x(); - float dy0 = position3.y() - position1.y(); - float dz0 = position3.z() - position1.z(); - float dx1 = position2.x() - position0.x(); - float dy1 = position2.y() - position0.y(); - float dz1 = position2.z() - position0.z(); - - float nx = dy1 * dz0 - dz1 * dy0; - float ny = dz1 * dx0 - dx1 * dz0; - float nz = dx1 * dy0 - dy1 * dx0; - - float length = Mth.sqrt(nx * nx + ny * ny + nz * nz); - if (length > 0) { - nx /= length; - ny /= length; - nz /= length; - } - - int packedx = ((byte) Math.round(nx * 127)) & 0xFF; - int packedy = ((byte) Math.round(ny * 127)) & 0xFF; - int packedz = ((byte) Math.round(nz * 127)) & 0xFF; - - return packedx | (packedy << 8) | (packedz << 16); - } - - public static BakedNormals fillNormal(ModelBaker.PartCache partCache, Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3) { - return partCache.normals(BakedNormals.of(computeQuadNormal(position0, position1, position2, position3))); - } - public static boolean loadEntityShader(@Nullable Entity entity, GameRenderer gameRenderer) { if (entity != null) { Identifier shader = EntitySpectatorShaderManager.get(entity.getType()); diff --git a/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java b/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java index 0f2b9254b2a..b542aefeed3 100644 --- a/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java +++ b/src/client/java/net/neoforged/neoforge/client/extensions/IVertexConsumerExtension.java @@ -29,12 +29,9 @@ default VertexConsumer misc(VertexFormatElement element, int... rawData) { } default void applyBakedNormals(Vector3f generated, BakedNormals data, int vertex, Matrix3f normalTransform) { - int packed = data.normals(vertex); - if ((packed & 0x00FFFFFF) != 0) { - byte nx = (byte) (packed & 0xFF); - byte ny = (byte) (packed >> 8 & 0xFF); - byte nz = (byte) (packed >> 16 & 0xFF); - generated.set(nx / 127f, ny / 127f, nz / 127f); + int packed = data.normal(vertex); + if (!BakedNormals.isUnspecified(packed)) { + BakedNormals.unpack(packed, generated); generated.mul(normalTransform); } } diff --git a/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java b/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java index 34c4ba603ce..de54f52c0f5 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java +++ b/src/client/java/net/neoforged/neoforge/client/model/ao/EnhancedAoRenderStorage.java @@ -14,8 +14,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.config.NeoForgeClientConfig; +import net.neoforged.neoforge.client.model.quad.BakedNormals; import org.joml.Vector3fc; import org.slf4j.Logger; @@ -48,20 +48,20 @@ public static void applyFlatQuadBrightness(BlockAndTintGetter level, BakedQuad q for (int vertex = 0; vertex < 4; ++vertex) { // Handle each vertex separately to apply vertex normals. - int normal = quad.bakedNormals().normals(vertex); + int normal = quad.bakedNormals().normal(vertex); // The ignored byte is padding and may be filled with user data - if ((normal & 0x00FFFFFF) == 0) { + if (BakedNormals.isUnspecified(normal)) { // No normal! Try to use the quad normal. if (quadNormal == -1) { - quadNormal = ClientHooks.computeQuadNormal(quad.position0(), quad.position1(), quad.position2(), quad.position3()); + quadNormal = BakedNormals.computeQuadNormal(quad.position0(), quad.position1(), quad.position2(), quad.position3()); } normal = quadNormal; } storage.brightness[vertex] = level.getShade( - normalComponent(normal, 0), - normalComponent(normal, 1), - normalComponent(normal, 2), + BakedNormals.unpackX(normal), + BakedNormals.unpackY(normal), + BakedNormals.unpackZ(normal), quad.shade()); } } else { @@ -193,12 +193,12 @@ private void calculateIrregular(BlockAndTintGetter level, BlockState state, Bloc for (int vertex = 0; vertex < 4; ++vertex) { // Handle each vertex separately to apply vertex normals. - int normal = currentQuad.bakedNormals().normals(vertex); + int normal = currentQuad.bakedNormals().normal(vertex); // The ignored byte is padding and may be filled with user data - if ((normal & 0x00FFFFFF) == 0) { + if (BakedNormals.isUnspecified(normal)) { // No normal! Try to use the quad normal. if (quadNormal == -1) { - quadNormal = ClientHooks.computeQuadNormal(currentQuad.position0(), currentQuad.position1(), currentQuad.position2(), currentQuad.position3()); + quadNormal = BakedNormals.computeQuadNormal(currentQuad.position0(), currentQuad.position1(), currentQuad.position2(), currentQuad.position3()); } normal = quadNormal; } @@ -209,7 +209,7 @@ private void calculateIrregular(BlockAndTintGetter level, BlockState state, Bloc int maxLightmap = 0; for (int axis = 0; axis < 3; ++axis) { - float normalComponent = normalComponent(normal, axis); + float normalComponent = BakedNormals.unpackComponent(normal, axis); if (normalComponent == 0) { continue; } @@ -254,16 +254,6 @@ private void calculateIrregular(BlockAndTintGetter level, BlockState state, Bloc } } - /** - * Unpacks a normal component. - */ - private static float normalComponent(int normal, int axis) { - int encodedNormalComponent = (normal >> (axis * 8)) & 0xFF; - // Casting to byte will cast to a signed int. - // This is really important, otherwise negative values will lead to above 1.0 normal components. - return ((byte) encodedNormalComponent) / 127.0f; - } - /** * Interpolates brightness from the 4 corners of a face. */ diff --git a/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java b/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java index 2763c05f5db..c00da9c91ee 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java +++ b/src/client/java/net/neoforged/neoforge/client/model/pipeline/QuadBakingVertexConsumer.java @@ -60,9 +60,7 @@ public VertexConsumer addVertex(float x, float y, float z) { @Override public VertexConsumer setNormal(float x, float y, float z) { - normals[vertexIndex] = ((int) (x * 127.0f) & 0xFF) | - (((int) (y * 127.0f) & 0xFF) << 8) | - (((int) (z * 127.0f) & 0xFF) << 16); + normals[vertexIndex] = BakedNormals.pack(x, y, z); return this; } diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java index 1ee56de42cf..5df4afa66bf 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/BakedNormals.java @@ -5,45 +5,175 @@ package net.neoforged.neoforge.client.model.quad; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import org.joml.Vector3fc; +import org.jspecify.annotations.Nullable; + /** * Holds pre-computed normals, either for the entire quad or for each vertex. *

* The normal values are quantized to an integer between -127 and 127, truncated to a byte * and packed into an int, leaving the MSB unused. + *

+ * Normals can also be {@linkplain #isUnspecified(int) unspecified}. In that case, rendering will use the normal implied by {@link BakedQuad#direction()}, + * while a face normal will be computed for the purposes of AO calculations. */ public sealed interface BakedNormals { BakedNormals UNSPECIFIED = new PerQuad(0); - int normals(int vertex); + /** + * {@return The packed normal of the given vertex} + * It can also be {@linkplain #isUnspecified(int) unspecified}. + * + * @see #unpack(int, Vector3f) + */ + int normal(int vertex); - record PerQuad(int normals) implements BakedNormals { + record PerQuad(int normal) implements BakedNormals { @Override - public int normals(int vertex) { - return normals; + public int normal(int vertex) { + return normal; } } - record PerVertex(int normals0, int normals1, int normals2, int normals3) implements BakedNormals { + record PerVertex(int normal0, int normal1, int normal2, int normal3) implements BakedNormals { @Override - public int normals(int vertex) { + public int normal(int vertex) { return switch (vertex) { - case 0 -> normals0; - case 1 -> normals1; - case 2 -> normals2; - case 3 -> normals3; + case 0 -> normal0; + case 1 -> normal1; + case 2 -> normal2; + case 3 -> normal3; default -> throw new IndexOutOfBoundsException(vertex); }; } } - static BakedNormals of(int normals0, int normals1, int normals2, int normals3) { - if (normals0 == normals1 && normals0 == normals2 && normals0 == normals3) { - return of(normals0); + /** + * @param normal0 The normal of the first vertex, packed using {@link #pack}. + * @param normal1 The normal of the second vertex, packed using {@link #pack}. + * @param normal2 The normal of the third vertex, packed using {@link #pack}. + * @param normal3 The normal of the fourth vertex, packed using {@link #pack}. + */ + static BakedNormals of(int normal0, int normal1, int normal2, int normal3) { + if (normal0 == normal1 && normal0 == normal2 && normal0 == normal3) { + return of(normal0); + } + return new PerVertex(normal0, normal1, normal2, normal3); + } + + /** + * @param normal The face normal, packed using {@link #pack}. + */ + static BakedNormals of(int normal) { + return isUnspecified(normal) ? UNSPECIFIED : new PerQuad(normal); + } + + /** + * {@return a packed representation of the given normal} + */ + static int pack(float x, float y, float z) { + int packedx = ((byte) Math.round(x * 127)) & 0xFF; + int packedy = ((byte) Math.round(y * 127)) & 0xFF; + int packedz = ((byte) Math.round(z * 127)) & 0xFF; + + return packedx | (packedy << 8) | (packedz << 16); + } + + /** + * {@return a packed representation of the given normal} + */ + static int pack(Vector3fc normal) { + return pack(normal.x(), normal.y(), normal.z()); + } + + /** + * {@return the component of the given packed normal} + * + * @param axis Pass 0 to extract the x component, 1 for y and 2 for z. + * + * @see #unpackX(int) + * @see #unpackY(int) + * @see #unpackZ(int) + */ + static float unpackComponent(int packedNormal, int axis) { + int encodedNormalComponent = (packedNormal >> (axis * 8)) & 0xFF; + // Casting to byte will cast to a signed int. + // This is really important, otherwise negative values will lead to above 1.0 normal components. + return ((byte) encodedNormalComponent) / 127.0f; + } + + /** + * {@return the x component of the given packed normal} + * + * @see #unpackComponent(int, int) + */ + static float unpackX(int packedNormal) { + return ((byte) (packedNormal & 0xFF)) / 127.0f; + } + + /** + * {@return the y component of the given packed normal} + * + * @see #unpackComponent(int, int) + */ + static float unpackY(int packedNormal) { + return ((byte) ((packedNormal >> 8) & 0xFF)) / 127.0f; + } + + /** + * {@return the z component of the given packed normal} + * + * @see #unpackComponent(int, int) + */ + static float unpackZ(int packedNormal) { + return ((byte) ((packedNormal >> 16) & 0xFF)) / 127.0f; + } + + /** + * @param destination The vector to unpack the packed normal into, if {@code null}, a new vector will be allocated. + * @return The vector that the normal was unpacked into. + */ + static Vector3fc unpack(int packedNormal, @Nullable Vector3f destination) { + if (destination == null) { + destination = new Vector3f(); } - return new PerVertex(normals0, normals1, normals2, normals3); + return destination.set(unpackX(packedNormal), unpackY(packedNormal), unpackZ(packedNormal)); } - static BakedNormals of(int normals) { - return normals == 0 ? UNSPECIFIED : new PerQuad(normals); + /** + * {@return true if the packed normal represents an unspecified normal} + */ + static boolean isUnspecified(int packedNormal) { + return (packedNormal & 0x00FFFFFF) == 0; + } + + /** + * Computes the packed normal of a quad based on the given vertex positions. + * + * @return The packed representation of the computed normal. + */ + static int computeQuadNormal(Vector3fc position0, Vector3fc position1, Vector3fc position2, Vector3fc position3) { + float dx0 = position3.x() - position1.x(); + float dy0 = position3.y() - position1.y(); + float dz0 = position3.z() - position1.z(); + float dx1 = position2.x() - position0.x(); + float dy1 = position2.y() - position0.y(); + float dz1 = position2.z() - position0.z(); + + float nx = dy1 * dz0 - dz1 * dy0; + float ny = dz1 * dx0 - dx1 * dz0; + float nz = dx1 * dy0 - dy1 * dx0; + + float length = Mth.sqrt(nx * nx + ny * ny + nz * nz); + if (length > 0) { + nx /= length; + ny /= length; + nz /= length; + } + + return pack(nx, ny, nz); } } diff --git a/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java b/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java index 7cb0c02cf48..9ed1d214c15 100644 --- a/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java +++ b/src/client/java/net/neoforged/neoforge/client/model/quad/QuadTransforms.java @@ -65,16 +65,8 @@ private static Vector3fc transformPosition(Vector4f temp, Vector3fc pos, Transfo } private static int transformNormal(Vector3f temp, int packedNormal, Transformation transformation) { - float x = ((byte) (packedNormal & 0xFF)) / 127.0f; - float y = ((byte) ((packedNormal >> 8) & 0xFF)) / 127.0f; - float z = ((byte) ((packedNormal >> 16) & 0xFF)) / 127.0f; - - temp.set(x, y, z); + BakedNormals.unpack(packedNormal, temp); transformation.transformNormal(temp); - - return (((byte) (temp.x() * 127.0f)) & 0xFF) | - ((((byte) (temp.y() * 127.0f)) & 0xFF) << 8) | - ((((byte) (temp.z() * 127.0f)) & 0xFF) << 16) | - (packedNormal & 0xFF000000); // Restore padding, just in case + return BakedNormals.pack(temp); } } From f60334638035072021cca8f5dbc23dd8b4f1ebc5 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Wed, 26 Nov 2025 00:27:10 +0100 Subject: [PATCH 17/20] Port to 1.21.11-pre3 --- gradle.properties | 4 +- .../blaze3d/buffers/GpuBuffer.java.patch | 2 +- .../opengl/GlCommandEncoder.java.patch | 6 +- .../net/minecraft/client/Minecraft.java.patch | 34 ++--- .../net/minecraft/client/Options.java.patch | 12 +- .../entity/LivingEntityRenderer.java.patch | 2 +- .../renderer/texture/SpriteLoader.java.patch | 4 +- .../world/entity/LivingEntity.java.patch | 118 +++++++++--------- .../world/entity/player/Player.java.patch | 74 +++++------ .../validation/ValidationCommandEncoder.java | 4 +- .../validation/ValidationGpuDevice.java | 2 +- 11 files changed, 131 insertions(+), 131 deletions(-) diff --git a/gradle.properties b/gradle.properties index e825b72a384..1e032de191e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,8 +16,8 @@ diffpatch_version=2.0.0.35 java_version=21 -minecraft_version=1.21.11-pre2 -neoform_version=20251121.153702 +minecraft_version=1.21.11-pre3 +neoform_version=20251125.161933 # on snapshot versions, used to prefix the version neoforge_snapshot_next_stable=21.11 diff --git a/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch b/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch index d82928854bf..75d5ffcd197 100644 --- a/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch +++ b/patches/com/mojang/blaze3d/buffers/GpuBuffer.java.patch @@ -10,4 +10,4 @@ + public static final int RESERVED_USAGE_BITS = 0xFF << 24; @GpuBuffer.Usage private final int usage; - private final int size; + private final long size; diff --git a/patches/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch b/patches/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch index 218d546f85b..a9d93d3e8f4 100644 --- a/patches/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch +++ b/patches/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch @@ -34,7 +34,7 @@ private void verifyColorTexture(GpuTexture p_416690_) { if (!p_416690_.getFormat().hasColorAspect()) { throw new IllegalStateException("Trying to clear a non-color texture as color"); -@@ -664,8 +_,19 @@ +@@ -672,8 +_,19 @@ boolean flag = p_410700_.getFormat().hasDepthAspect(); int i = ((GlTexture)p_410700_).glId(); int j = ((GlTexture)p_410735_).glId(); @@ -56,7 +56,7 @@ this.device .directStateAccess() .blitFrameBuffers( -@@ -679,7 +_,7 @@ +@@ -687,7 +_,7 @@ p_410236_, p_409870_, p_409949_, @@ -65,7 +65,7 @@ 9728 ); int k = GlStateManager._getError(); -@@ -1000,6 +_,26 @@ +@@ -1008,6 +_,26 @@ GlStateManager._scissorBox(p_410853_.getScissorX(), p_410853_.getScissorY(), p_410853_.getScissorWidth(), p_410853_.getScissorHeight()); } else { GlStateManager._disableScissorTest(); diff --git a/patches/net/minecraft/client/Minecraft.java.patch b/patches/net/minecraft/client/Minecraft.java.patch index 6f94b3e6e92..664b78f35b8 100644 --- a/patches/net/minecraft/client/Minecraft.java.patch +++ b/patches/net/minecraft/client/Minecraft.java.patch @@ -291,16 +291,16 @@ ItemStack itemstack = this.player.getItemInHand(interactionhand); if (!itemstack.isItemEnabled(this.level.enabledFeatures())) { return; -@@ -1697,7 +_,7 @@ - } - - if (interactionresult instanceof InteractionResult.Success interactionresult$success2) { -- if (interactionresult$success2.swingSource() == InteractionResult.SwingSource.CLIENT) { -+ if (interactionresult$success2.swingSource() == InteractionResult.SwingSource.CLIENT && inputEvent.shouldSwingHand()) { - this.player.swing(interactionhand); +@@ -1694,7 +_,7 @@ } -@@ -1709,7 +_,7 @@ + if (interactionresult instanceof InteractionResult.Success interactionresult$success2) { +- if (interactionresult$success2.swingSource() == InteractionResult.SwingSource.CLIENT) { ++ if (interactionresult$success2.swingSource() == InteractionResult.SwingSource.CLIENT && inputEvent.shouldSwingHand()) { + this.player.swing(interactionhand); + } + +@@ -1707,7 +_,7 @@ int i = itemstack.getCount(); InteractionResult interactionresult1 = this.gameMode.useItemOn(this.player, interactionhand, blockhitresult); if (interactionresult1 instanceof InteractionResult.Success interactionresult$success) { @@ -309,7 +309,7 @@ this.player.swing(interactionhand); if (!itemstack.isEmpty() && (itemstack.getCount() != i || this.player.hasInfiniteMaterials())) { this.gameRenderer.itemInHandRenderer.itemUsed(interactionhand); -@@ -1725,6 +_,9 @@ +@@ -1723,6 +_,9 @@ } } @@ -319,7 +319,7 @@ if (!itemstack.isEmpty() && this.gameMode.useItem(this.player, interactionhand) instanceof InteractionResult.Success interactionresult$success1) { if (interactionresult$success1.swingSource() == InteractionResult.SwingSource.CLIENT) { -@@ -1745,6 +_,10 @@ +@@ -1743,6 +_,10 @@ public void tick() { this.clientTickCount++; @@ -330,7 +330,7 @@ if (this.level != null && !this.pause) { this.level.tickRateManager().tick(); } -@@ -1835,6 +_,7 @@ +@@ -1833,6 +_,7 @@ this.tutorial.tick(); @@ -338,7 +338,7 @@ try { this.level.tick(() -> true); } catch (Throwable throwable1) { -@@ -1848,6 +_,7 @@ +@@ -1846,6 +_,7 @@ throw new ReportedException(crashreport1); } @@ -346,7 +346,7 @@ } profilerfiller.popPush("animateTick"); -@@ -1872,6 +_,10 @@ +@@ -1870,6 +_,10 @@ profilerfiller.popPush("keyboard"); this.keyboardHandler.tick(); profilerfiller.pop(); @@ -357,7 +357,7 @@ } private boolean isLevelRunningNormally() { -@@ -2088,6 +_,7 @@ +@@ -2086,6 +_,7 @@ } public void setLevel(ClientLevel p_91157_) { @@ -365,7 +365,7 @@ this.level = p_91157_; this.updateLevelInEngines(p_91157_); } -@@ -2141,13 +_,16 @@ +@@ -2139,13 +_,16 @@ IntegratedServer integratedserver = this.singleplayerServer; this.singleplayerServer = null; this.gameRenderer.resetData(); @@ -382,7 +382,7 @@ } if (integratedserver != null) { -@@ -2170,6 +_,7 @@ +@@ -2168,6 +_,7 @@ } finally { this.clientLevelTeardownInProgress = false; } @@ -390,7 +390,7 @@ } public void clearDownloadedResourcePacks() { -@@ -2295,6 +_,7 @@ +@@ -2293,6 +_,7 @@ private void pickBlock() { if (this.hitResult != null && this.hitResult.getType() != HitResult.Type.MISS) { diff --git a/patches/net/minecraft/client/Options.java.patch b/patches/net/minecraft/client/Options.java.patch index 9eff349f19b..25299256d68 100644 --- a/patches/net/minecraft/client/Options.java.patch +++ b/patches/net/minecraft/client/Options.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/Options.java +++ b/net/minecraft/client/Options.java -@@ -907,9 +_,10 @@ +@@ -898,9 +_,10 @@ } }, new OptionInstance.LazyEnum<>( @@ -12,7 +12,7 @@ && !Minecraft.getInstance().getSoundManager().getAvailableSoundDevices().contains(p_232011_) ? Optional.empty() : Optional.of(p_232011_), -@@ -1031,7 +_,7 @@ +@@ -1029,7 +_,7 @@ this.incompatibleResourcePacks.clear(); for (Pack pack : p_275268_.getSelectedPacks()) { @@ -21,7 +21,7 @@ this.resourcePacks.add(pack.getId()); if (!pack.getCompatibility().isCompatible()) { this.incompatibleResourcePacks.add(pack.getId()); -@@ -1404,6 +_,7 @@ +@@ -1402,6 +_,7 @@ } public Options(Minecraft p_92138_, File p_92139_) { @@ -29,7 +29,7 @@ this.minecraft = p_92138_; this.optionsFile = new File(p_92139_, "options.txt"); boolean flag = Runtime.getRuntime().maxMemory() >= 1000000000L; -@@ -1431,6 +_,7 @@ +@@ -1425,6 +_,7 @@ p_461224_ -> this.setGraphicsPresetToCustom() ); this.syncWrites = Util.getPlatform() == Util.OS.WINDOWS; @@ -37,7 +37,7 @@ this.load(); } -@@ -1562,10 +_,14 @@ +@@ -1556,10 +_,14 @@ p_168428_.process("musicFrequency", this.musicFrequency); for (KeyMapping keymapping : this.keyMappings) { @@ -54,7 +54,7 @@ } } -@@ -1855,6 +_,23 @@ +@@ -1849,6 +_,23 @@ } p_92146_.setSelected(set); diff --git a/patches/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch b/patches/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch index 76bf756cf01..e9d572091db 100644 --- a/patches/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch @@ -32,5 +32,5 @@ - p_360515_.isInWater = p_362733_.isInWater(); + p_360515_.isInWater = p_362733_.isInWater() || p_362733_.isInFluidType((fluidType, height) -> p_362733_.canSwimInFluidType(fluidType)); p_360515_.isAutoSpinAttack = p_362733_.isAutoSpinAttack(); - p_360515_.ticksSinceEnemyHit = p_362733_.getTicksSinceEnemyHit(p_361157_); + p_360515_.ticksSinceKineticHitFeedback = p_362733_.getTicksSinceLastKineticHitFeedback(p_361157_); p_360515_.hasRedOverlay = p_362733_.hurtTime > 0 || p_362733_.deathTime > 0; diff --git a/patches/net/minecraft/client/renderer/texture/SpriteLoader.java.patch b/patches/net/minecraft/client/renderer/texture/SpriteLoader.java.patch index 1bed0ccb02b..afc0603e0fb 100644 --- a/patches/net/minecraft/client/renderer/texture/SpriteLoader.java.patch +++ b/patches/net/minecraft/client/renderer/texture/SpriteLoader.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/texture/SpriteLoader.java +++ b/net/minecraft/client/renderer/texture/SpriteLoader.java -@@ -76,7 +_,7 @@ +@@ -72,7 +_,7 @@ int j1 = Math.min(j, k); int k1 = Mth.log2(j1); int l1; @@ -9,7 +9,7 @@ LOGGER.warn("{}: dropping miplevel from {} to {}, because of minimum power of two: {}", this.location, p_261919_, k1, j1); l1 = k1; } else { -@@ -133,7 +_,7 @@ +@@ -129,7 +_,7 @@ ResourceManager p_295469_, Identifier p_469435_, int p_294855_, Executor p_294720_, Set> p_432812_ ) { SpriteResourceLoader spriteresourceloader = SpriteResourceLoader.create(p_432812_); diff --git a/patches/net/minecraft/world/entity/LivingEntity.java.patch b/patches/net/minecraft/world/entity/LivingEntity.java.patch index f0897a23479..84f218298d3 100644 --- a/patches/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/net/minecraft/world/entity/LivingEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -194,13 +_,19 @@ +@@ -195,13 +_,19 @@ public static final float EXTRA_RENDER_CULLING_SIZE_WITH_BIG_HAT = 0.5F; public static final float DEFAULT_BABY_SCALE = 0.5F; private static final float WATER_FLOAT_IMPULSE = 0.04F; @@ -22,7 +22,7 @@ }; private static final Dynamic EMPTY_BRAIN = new Dynamic<>(JavaOps.INSTANCE, Map.of("memories", Map.of())); private final AttributeMap attributes; -@@ -267,6 +_,13 @@ +@@ -268,6 +_,13 @@ ); protected final EntityEquipment equipment; private Waypoint.Icon locatorBarIcon = new Waypoint.Icon(); @@ -36,7 +36,7 @@ protected LivingEntity(EntityType p_20966_, Level p_20967_) { super(p_20966_, p_20967_); -@@ -343,13 +_,15 @@ +@@ -344,13 +_,15 @@ .add(Attributes.MOVEMENT_EFFICIENCY) .add(Attributes.ATTACK_KNOCKBACK) .add(Attributes.CAMERA_DISTANCE) @@ -54,7 +54,7 @@ } if (this.level() instanceof ServerLevel serverlevel && p_20991_ && this.fallDistance > 0.0) { -@@ -370,7 +_,8 @@ +@@ -371,7 +_,8 @@ double d7 = Math.min(0.2F + d6 / 15.0, 2.5); int i = (int)(150.0 * d7); @@ -64,7 +64,7 @@ } } -@@ -380,6 +_,7 @@ +@@ -381,6 +_,7 @@ } } @@ -72,7 +72,7 @@ public boolean canBreatheUnderwater() { return this.getType().is(EntityTypeTags.CAN_BREATHE_UNDER_WATER); } -@@ -420,6 +_,9 @@ +@@ -421,6 +_,9 @@ } } @@ -82,7 +82,7 @@ if (this.isEyeInFluid(FluidTags.WATER) && !serverlevel1.getBlockState(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())).is(Blocks.BUBBLE_COLUMN)) { boolean flag1 = !this.canBreatheUnderwater() -@@ -768,7 +_,11 @@ +@@ -769,7 +_,11 @@ } else { ItemEntity itementity = this.createItemStackToDrop(p_401947_, p_401861_, p_401913_); if (itementity != null) { @@ -95,7 +95,7 @@ } return itementity; -@@ -834,8 +_,10 @@ +@@ -835,8 +_,10 @@ Holder holder = iterator.next(); MobEffectInstance mobeffectinstance = this.activeEffects.get(holder); if (!mobeffectinstance.tickServer(serverlevel, this, () -> this.onEffectUpdated(mobeffectinstance, true, null))) { @@ -106,7 +106,7 @@ } else if (mobeffectinstance.getDuration() % 600 == 0) { this.onEffectUpdated(mobeffectinstance, false, null); } -@@ -881,8 +_,9 @@ +@@ -882,8 +_,9 @@ List list = this.activeEffects .values() .stream() @@ -118,7 +118,7 @@ .toList(); this.entityData.set(DATA_EFFECT_PARTICLES, list); this.entityData.set(DATA_EFFECT_AMBIENCE_ID, areAllEffectsAmbient(this.activeEffects.values())); -@@ -922,6 +_,7 @@ +@@ -923,6 +_,7 @@ } } @@ -126,7 +126,7 @@ return d0; } -@@ -957,8 +_,13 @@ +@@ -958,8 +_,13 @@ } else if (this.activeEffects.isEmpty()) { return false; } else { @@ -142,7 +142,7 @@ this.onEffectsRemoved(map.values()); return true; } -@@ -990,11 +_,12 @@ +@@ -991,11 +_,12 @@ } public boolean addEffect(MobEffectInstance p_147208_, @Nullable Entity p_147209_) { @@ -156,7 +156,7 @@ if (mobeffectinstance == null) { this.activeEffects.put(p_147208_.getEffect(), p_147208_); this.onEffectAdded(p_147208_, p_147209_); -@@ -1010,6 +_,14 @@ +@@ -1011,6 +_,14 @@ } } @@ -171,7 +171,7 @@ public boolean canBeAffected(MobEffectInstance p_21197_) { if (this.getType().is(EntityTypeTags.IMMUNE_TO_INFESTED)) { return !p_21197_.is(MobEffects.INFESTED); -@@ -1023,7 +_,7 @@ +@@ -1024,7 +_,7 @@ } public void forceAddEffect(MobEffectInstance p_147216_, @Nullable Entity p_147217_) { @@ -180,7 +180,7 @@ MobEffectInstance mobeffectinstance = this.activeEffects.put(p_147216_.getEffect(), p_147216_); if (mobeffectinstance == null) { this.onEffectAdded(p_147216_, p_147217_); -@@ -1043,6 +_,7 @@ +@@ -1044,6 +_,7 @@ } public boolean removeEffect(Holder p_316570_) { @@ -188,7 +188,7 @@ MobEffectInstance mobeffectinstance = this.removeEffectNoUpdate(p_316570_); if (mobeffectinstance != null) { this.onEffectsRemoved(List.of(mobeffectinstance)); -@@ -1134,6 +_,8 @@ +@@ -1135,6 +_,8 @@ } public void heal(float p_21116_) { @@ -197,7 +197,7 @@ float f = this.getHealth(); if (f > 0.0F) { this.setHealth(f + p_21116_); -@@ -1161,11 +_,14 @@ +@@ -1162,11 +_,14 @@ } else if (p_376460_.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { return false; } else { @@ -212,7 +212,7 @@ if (p_376610_ < 0.0F) { p_376610_ = 0.0F; } -@@ -1186,24 +_,28 @@ +@@ -1187,24 +_,28 @@ if (Float.isNaN(p_376610_) || Float.isInfinite(p_376610_)) { p_376610_ = Float.MAX_VALUE; } @@ -242,7 +242,7 @@ this.resolveMobResponsibleForDamage(p_376460_); this.resolvePlayerResponsibleForDamage(p_376460_); if (flag1) { -@@ -1272,6 +_,7 @@ +@@ -1273,6 +_,7 @@ CriteriaTriggers.PLAYER_HURT_ENTITY.trigger(serverplayer1, this, p_376460_, p_376610_, p_376610_, flag); } @@ -250,7 +250,7 @@ return flag2; } } -@@ -1285,7 +_,7 @@ +@@ -1286,7 +_,7 @@ return 0.0F; } else { BlocksAttacks blocksattacks = itemstack.get(DataComponents.BLOCKS_ATTACKS); @@ -259,7 +259,7 @@ if (p_401067_.getDirectEntity() instanceof AbstractArrow abstractarrow && abstractarrow.getPierceLevel() > 0) { return 0.0F; } else { -@@ -1301,7 +_,14 @@ +@@ -1302,7 +_,14 @@ } float f = blocksattacks.resolveBlockedDamage(p_401067_, p_401377_, d0); @@ -275,7 +275,7 @@ if (f > 0.0F && !p_401067_.is(DamageTypeTags.IS_PROJECTILE) && p_401067_.getDirectEntity() instanceof LivingEntity livingentity) { this.blockUsingItem(p_401171_, livingentity); } -@@ -1334,9 +_,9 @@ +@@ -1335,9 +_,9 @@ Entity entity = p_388609_.getEntity(); if (entity instanceof Player player) { this.setLastHurtByPlayer(player, 100); @@ -288,7 +288,7 @@ } else { this.lastHurtByPlayer = null; this.lastHurtByPlayerMemoryTime = 0; -@@ -1364,7 +_,7 @@ +@@ -1365,7 +_,7 @@ for (InteractionHand interactionhand : InteractionHand.values()) { ItemStack itemstack1 = this.getItemInHand(interactionhand); deathprotection = itemstack1.get(DataComponents.DEATH_PROTECTION); @@ -297,7 +297,7 @@ itemstack = itemstack1.copy(); itemstack1.shrink(1); break; -@@ -1427,6 +_,7 @@ +@@ -1428,6 +_,7 @@ } public void die(DamageSource p_21014_) { @@ -305,7 +305,7 @@ if (!this.isRemoved() && !this.dead) { Entity entity = p_21014_.getEntity(); LivingEntity livingentity = this.getKillCredit(); -@@ -1463,7 +_,7 @@ +@@ -1464,7 +_,7 @@ if (this.level() instanceof ServerLevel serverlevel) { boolean flag = false; if (p_21269_ instanceof WitherBoss) { @@ -314,7 +314,7 @@ BlockPos blockpos = this.blockPosition(); BlockState blockstate = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockpos).isAir() && blockstate.canSurvive(this.level(), blockpos)) { -@@ -1481,6 +_,7 @@ +@@ -1482,6 +_,7 @@ } protected void dropAllDeathLoot(ServerLevel p_348524_, DamageSource p_21192_) { @@ -322,7 +322,7 @@ boolean flag = this.lastHurtByPlayerMemoryTime > 0; if (this.shouldDropLoot(p_348524_)) { this.dropFromLootTable(p_348524_, p_21192_, flag); -@@ -1489,6 +_,10 @@ +@@ -1490,6 +_,10 @@ this.dropEquipment(p_348524_); this.dropExperience(p_348524_, p_21192_.getEntity()); @@ -333,7 +333,7 @@ } protected void dropEquipment(ServerLevel p_376330_) { -@@ -1500,7 +_,8 @@ +@@ -1501,7 +_,8 @@ this.isAlwaysExperienceDropper() || this.lastHurtByPlayerMemoryTime > 0 && this.shouldDropExperience() && p_376909_.getGameRules().get(GameRules.MOB_DROPS) )) { @@ -343,7 +343,7 @@ } } -@@ -1605,6 +_,11 @@ +@@ -1606,6 +_,11 @@ } public void knockback(double p_147241_, double p_147242_, double p_147243_) { @@ -355,7 +355,7 @@ p_147241_ *= 1.0 - this.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE); if (!(p_147241_ <= 0.0)) { this.needsSync = true; -@@ -1682,17 +_,11 @@ +@@ -1683,17 +_,11 @@ } else { BlockPos blockpos = this.blockPosition(); BlockState blockstate = this.getInBlockState(); @@ -378,7 +378,7 @@ } } -@@ -1738,6 +_,11 @@ +@@ -1739,6 +_,11 @@ @Override public boolean causeFallDamage(double p_397597_, float p_147187_, DamageSource p_147189_) { @@ -390,7 +390,7 @@ boolean flag = super.causeFallDamage(p_397597_, p_147187_, p_147189_); int i = this.calculateFallDamage(p_397597_, p_147187_); if (i > 0) { -@@ -1768,10 +_,10 @@ +@@ -1769,10 +_,10 @@ int i = Mth.floor(this.getX()); int j = Mth.floor(this.getY() - 0.2F); int k = Mth.floor(this.getZ()); @@ -404,7 +404,7 @@ } } } -@@ -1796,6 +_,8 @@ +@@ -1797,6 +_,8 @@ if (!(p_330394_ <= 0.0F)) { int i = (int)Math.max(1.0F, p_330394_ / 4.0F); @@ -413,7 +413,7 @@ for (EquipmentSlot equipmentslot : p_331314_) { ItemStack itemstack = this.getItemBySlot(equipmentslot); Equippable equippable = itemstack.get(DataComponents.EQUIPPABLE); -@@ -1829,6 +_,7 @@ +@@ -1830,6 +_,7 @@ p_21194_ = Math.max(f / 25.0F, 0.0F); float f2 = f1 - p_21194_; if (f2 > 0.0F && f2 < 3.4028235E37F) { @@ -421,7 +421,7 @@ if (this instanceof ServerPlayer) { ((ServerPlayer)this).awardStat(Stats.DAMAGE_RESISTED, Math.round(f2 * 10.0F)); } else if (p_21193_.getEntity() instanceof ServerPlayer) { -@@ -1851,6 +_,7 @@ +@@ -1852,6 +_,7 @@ if (f3 > 0.0F) { p_21194_ = CombatRules.getDamageAfterMagicAbsorb(p_21194_, f3); @@ -429,7 +429,7 @@ } return p_21194_; -@@ -1860,11 +_,14 @@ +@@ -1861,11 +_,14 @@ protected void actuallyHurt(ServerLevel p_376745_, DamageSource p_21240_, float p_21241_) { if (!this.isInvulnerableTo(p_376745_, p_21240_)) { @@ -449,7 +449,7 @@ if (f > 0.0F && f < 3.4028235E37F && p_21240_.getEntity() instanceof ServerPlayer serverplayer) { serverplayer.awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f * 10.0F)); } -@@ -1872,9 +_,10 @@ +@@ -1873,9 +_,10 @@ if (f1 != 0.0F) { this.getCombatTracker().recordDamage(p_21240_, f1); this.setHealth(this.getHealth() - f1); @@ -461,7 +461,7 @@ } } -@@ -1929,6 +_,8 @@ +@@ -1930,6 +_,8 @@ } public void swing(InteractionHand p_21012_, boolean p_21013_) { @@ -470,7 +470,7 @@ if (!this.swinging || this.swingTime >= this.getCurrentSwingDuration() / 2 || this.swingTime < 0) { this.swingTime = -1; this.swinging = true; -@@ -2060,8 +_,10 @@ +@@ -2071,8 +_,10 @@ private void swapHandItems() { ItemStack itemstack = this.getItemBySlot(EquipmentSlot.OFFHAND); @@ -483,7 +483,7 @@ } @Override -@@ -2169,7 +_,13 @@ +@@ -2180,7 +_,13 @@ } public void setItemSlot(EquipmentSlot p_21036_, ItemStack p_21037_) { @@ -498,7 +498,7 @@ } public float getArmorCoverPercentage() { -@@ -2274,15 +_,18 @@ +@@ -2285,15 +_,18 @@ } this.needsSync = true; @@ -519,7 +519,7 @@ } protected float getWaterSlowDown() { -@@ -2339,7 +_,7 @@ +@@ -2350,7 +_,7 @@ private void travelInAir(Vec3 p_362457_) { BlockPos blockpos = this.getBlockPosBelowThatAffectsMyMovement(); @@ -528,7 +528,7 @@ float f1 = f * 0.91F; Vec3 vec3 = this.handleRelativeFrictionAndCalculateMovement(p_362457_, f); double d0 = vec3.y; -@@ -2362,11 +_,20 @@ +@@ -2373,11 +_,20 @@ } } @@ -550,7 +550,7 @@ this.travelInWater(p_365480_, d1, flag, d0); this.floatInWaterWhileRidden(); } else { -@@ -2391,6 +_,7 @@ +@@ -2402,6 +_,7 @@ f = 0.96F; } @@ -558,7 +558,7 @@ this.moveRelative(f1, p_460666_); this.move(MoverType.SELF, this.getDeltaMovement()); Vec3 vec3 = this.getDeltaMovement(); -@@ -2562,7 +_,7 @@ +@@ -2573,7 +_,7 @@ double d0 = Mth.clamp(p_21298_.x, -0.15F, 0.15F); double d1 = Mth.clamp(p_21298_.z, -0.15F, 0.15F); double d2 = Math.max(p_21298_.y, -0.15F); @@ -567,7 +567,7 @@ d2 = 0.0; } -@@ -2795,6 +_,7 @@ +@@ -2806,6 +_,7 @@ ItemStack itemstack = this.lastEquipmentItems.get(equipmentslot); ItemStack itemstack1 = this.getItemBySlot(equipmentslot); if (this.equipmentHasChanged(itemstack, itemstack1)) { @@ -575,7 +575,7 @@ if (map == null) { map = Maps.newEnumMap(EquipmentSlot.class); } -@@ -2930,6 +_,9 @@ +@@ -2941,6 +_,9 @@ profilerfiller.push("jump"); if (this.jumping && this.isAffectedByFluids()) { double d3; @@ -585,7 +585,7 @@ if (this.isInLava()) { d3 = this.getFluidHeight(FluidTags.LAVA); } else { -@@ -2940,15 +_,17 @@ +@@ -2951,15 +_,17 @@ double d4 = this.getFluidJumpThreshold(); if (!flag || this.onGround() && !(d3 > d4)) { if (!this.isInLava() || this.onGround() && !(d3 > d4)) { @@ -605,7 +605,7 @@ } } else { this.noJumpDelay = 0; -@@ -3269,8 +_,11 @@ +@@ -3280,8 +_,11 @@ private void updatingUsingItem() { if (this.isUsingItem()) { @@ -619,7 +619,7 @@ this.updateUsingItem(this.useItem); } else { this.stopUsingItem(); -@@ -3313,8 +_,11 @@ +@@ -3324,8 +_,11 @@ } protected void updateUsingItem(ItemStack p_147201_) { @@ -632,7 +632,7 @@ this.completeUsingItem(); } } -@@ -3342,8 +_,10 @@ +@@ -3353,8 +_,10 @@ public void startUsingItem(InteractionHand p_21159_) { ItemStack itemstack = this.getItemInHand(p_21159_); if (!itemstack.isEmpty() && !this.isUsingItem()) { @@ -644,7 +644,7 @@ if (!this.level().isClientSide()) { this.setLivingEntityFlag(1, true); this.setLivingEntityFlag(2, p_21159_ == InteractionHand.OFF_HAND); -@@ -3409,7 +_,8 @@ +@@ -3420,7 +_,8 @@ this.releaseUsingItem(); } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { @@ -654,7 +654,7 @@ if (itemstack != this.useItem) { this.setItemInHand(interactionhand, itemstack); } -@@ -3443,7 +_,11 @@ +@@ -3454,7 +_,11 @@ ItemStack itemstack = this.getItemInHand(this.getUsedItemHand()); if (!this.useItem.isEmpty() && ItemStack.isSameItem(itemstack, this.useItem)) { this.useItem = itemstack; @@ -666,7 +666,7 @@ if (this.useItem.useOnRelease()) { this.updatingUsingItem(); } -@@ -3453,6 +_,7 @@ +@@ -3464,6 +_,7 @@ } public void stopUsingItem() { @@ -674,7 +674,7 @@ if (!this.level().isClientSide()) { boolean flag = this.isUsingItem(); this.recentKineticEnemies = null; -@@ -3621,8 +_,8 @@ +@@ -3632,8 +_,8 @@ } BlockState blockstate = this.level().getBlockState(p_21141_); @@ -685,7 +685,7 @@ } this.setPose(Pose.SLEEPING); -@@ -3637,15 +_,17 @@ +@@ -3648,15 +_,17 @@ } private boolean checkBedExists() { @@ -706,7 +706,7 @@ Vec3 vec31 = BedBlock.findStandUpPosition(this.getType(), this.level(), p_261435_, direction, this.getYRot()).orElseGet(() -> { BlockPos blockpos = p_261435_.above(); return new Vec3(blockpos.getX() + 0.5, blockpos.getY() + 0.1, blockpos.getZ() + 0.5); -@@ -3665,7 +_,9 @@ +@@ -3676,7 +_,9 @@ public @Nullable Direction getBedOrientation() { BlockPos blockpos = this.getSleepingPos().orElse(null); @@ -717,7 +717,7 @@ } @Override -@@ -3674,7 +_,7 @@ +@@ -3685,7 +_,7 @@ } public ItemStack getProjectile(ItemStack p_21272_) { @@ -726,7 +726,7 @@ } private static byte entityEventForEquipmentBreak(EquipmentSlot p_21267_) { -@@ -3726,6 +_,8 @@ +@@ -3737,6 +_,8 @@ } public final EquipmentSlot getEquipmentSlotForItem(ItemStack p_147234_) { diff --git a/patches/net/minecraft/world/entity/player/Player.java.patch b/patches/net/minecraft/world/entity/player/Player.java.patch index 0c8063235fb..49f6c8186cb 100644 --- a/patches/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/net/minecraft/world/entity/player/Player.java.patch @@ -8,7 +8,7 @@ public static final int MAX_HEALTH = 20; public static final int SLEEP_DURATION = 100; public static final int WAKE_UP_DURATION = 10; -@@ -176,6 +_,10 @@ +@@ -177,6 +_,10 @@ public @Nullable Entity currentExplosionCause; private boolean ignoreFallDamageFromCurrentImpulse = false; private int currentImpulseContextResetGraceTime = 0; @@ -19,7 +19,7 @@ public Player(Level p_250508_, GameProfile p_252153_) { super(EntityType.PLAYER, p_250508_); -@@ -218,7 +_,8 @@ +@@ -219,7 +_,8 @@ .add(Attributes.MINING_EFFICIENCY) .add(Attributes.SWEEPING_DAMAGE_RATIO) .add(Attributes.WAYPOINT_TRANSMIT_RANGE, 6.0E7) @@ -29,7 +29,7 @@ } @Override -@@ -232,6 +_,7 @@ +@@ -233,6 +_,7 @@ @Override public void tick() { @@ -37,7 +37,7 @@ this.noPhysics = this.isSpectator(); if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -248,7 +_,7 @@ +@@ -249,7 +_,7 @@ } if (!this.level().isClientSide() @@ -46,7 +46,7 @@ this.stopSleepInBed(false, true); } } else if (this.sleepCounter > 0) { -@@ -287,6 +_,7 @@ +@@ -288,6 +_,7 @@ if (this.currentImpulseContextResetGraceTime > 0) { this.currentImpulseContextResetGraceTime--; } @@ -54,7 +54,7 @@ } @Override -@@ -307,7 +_,7 @@ +@@ -308,7 +_,7 @@ } protected boolean updateIsUnderwater() { @@ -63,7 +63,7 @@ return this.wasUnderwater; } -@@ -346,6 +_,10 @@ +@@ -347,6 +_,10 @@ } protected void updatePlayerPose() { @@ -74,7 +74,7 @@ if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose pose = this.getDesiredPose(); Pose pose1; -@@ -530,6 +_,7 @@ +@@ -531,6 +_,7 @@ @Override public void die(DamageSource p_36152_) { @@ -82,7 +82,7 @@ super.die(p_36152_); this.reapplyPosition(); if (!this.isSpectator() && this.level() instanceof ServerLevel serverlevel) { -@@ -586,10 +_,18 @@ +@@ -587,10 +_,18 @@ } public @Nullable ItemEntity drop(ItemStack p_36177_, boolean p_36178_) { @@ -102,7 +102,7 @@ float f = this.inventory.getSelectedItem().getDestroySpeed(p_36282_); if (f > 1.0F) { f += (float)this.getAttributeValue(Attributes.MINING_EFFICIENCY); -@@ -618,13 +_,19 @@ +@@ -619,13 +_,19 @@ f /= 5.0F; } @@ -122,7 +122,7 @@ @Override protected void readAdditionalSaveData(ValueInput p_422427_) { super.readAdditionalSaveData(p_422427_); -@@ -699,7 +_,8 @@ +@@ -700,7 +_,8 @@ return false; } else { this.removeEntitiesOnShoulder(); @@ -132,7 +132,7 @@ if (p_376451_.getDifficulty() == Difficulty.PEACEFUL) { p_376389_ = 0.0F; } -@@ -757,11 +_,14 @@ +@@ -758,11 +_,14 @@ @Override protected void actuallyHurt(ServerLevel p_376500_, DamageSource p_36312_, float p_36313_) { if (!this.isInvulnerableTo(p_376500_, p_36312_)) { @@ -152,7 +152,7 @@ if (f > 0.0F && f < 3.4028235E37F) { this.awardStat(Stats.DAMAGE_ABSORBED, Math.round(f * 10.0F)); } -@@ -775,7 +_,9 @@ +@@ -776,7 +_,9 @@ } this.gameEvent(GameEvent.ENTITY_DAMAGE); @@ -162,7 +162,7 @@ } } -@@ -831,6 +_,8 @@ +@@ -832,6 +_,8 @@ return InteractionResult.PASS; } else { @@ -171,7 +171,7 @@ ItemStack itemstack = this.getItemInHand(p_36159_); ItemStack itemstack1 = itemstack.copy(); InteractionResult interactionresult = p_36158_.interact(this, p_36159_); -@@ -839,6 +_,9 @@ +@@ -840,6 +_,9 @@ itemstack.setCount(itemstack1.getCount()); } @@ -181,7 +181,7 @@ return interactionresult; } else { if (!itemstack.isEmpty() && p_36158_ instanceof LivingEntity) { -@@ -850,6 +_,7 @@ +@@ -851,6 +_,7 @@ if (interactionresult1.consumesAction()) { this.level().gameEvent(GameEvent.ENTITY_INTERACT, p_36158_.position(), GameEvent.Context.of(this)); if (itemstack.isEmpty() && !this.hasInfiniteMaterials()) { @@ -189,7 +189,7 @@ this.setItemInHand(p_36159_, ItemStack.EMPTY); } -@@ -879,6 +_,7 @@ +@@ -880,6 +_,7 @@ } @Override @@ -197,7 +197,7 @@ protected Vec3 maybeBackOffFromEdge(Vec3 p_36201_, MoverType p_36202_) { float f = this.maxUpStep(); if (!this.abilities.flying -@@ -928,6 +_,7 @@ +@@ -929,6 +_,7 @@ } } @@ -205,7 +205,7 @@ private boolean isAboveGround(float p_341626_) { return this.onGround() || this.fallDistance < p_341626_ && !this.canFallAtLeast(0.0, 0.0, p_341626_ - this.fallDistance); } -@@ -949,6 +_,7 @@ +@@ -950,6 +_,7 @@ } public void attack(Entity p_36347_) { @@ -213,7 +213,7 @@ if (!this.cannotAttack(p_36347_)) { float f = this.isAutoSpinAttack() ? this.autoSpinAttackDmg : (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); ItemStack itemstack = this.getWeaponItem(); -@@ -970,12 +_,22 @@ +@@ -971,12 +_,22 @@ f += itemstack.getItem().getAttackDamageBonus(p_36347_, f, damagesource); boolean flag2 = flag && this.canCriticalAttack(p_36347_); @@ -238,7 +238,7 @@ float f4 = 0.0F; if (p_36347_ instanceof LivingEntity livingentity) { f4 = livingentity.getHealth(); -@@ -986,7 +_,8 @@ +@@ -987,7 +_,8 @@ if (flag4) { this.causeExtraKnockback(p_36347_, this.getKnockback(p_36347_, damagesource) + (flag1 ? 0.5F : 0.0F), vec3); if (flag3) { @@ -247,8 +247,8 @@ + this.doSweepAttack(p_36347_, f, damagesource, f1, sweepHitBox); } - this.attackVisualEffects(p_36347_, flag2, flag3, flag, f2); -@@ -1043,7 +_,8 @@ + this.attackVisualEffects(p_36347_, flag2, flag3, flag, false, f2); +@@ -1044,7 +_,8 @@ double d0 = this.getKnownMovement().horizontalDistanceSqr(); double d1 = this.getSpeed() * 2.5; if (d0 < Mth.square(d1)) { @@ -258,7 +258,7 @@ } } -@@ -1079,11 +_,12 @@ +@@ -1080,11 +_,12 @@ private void itemAttackInteraction(Entity p_455471_, ItemStack p_456074_, DamageSource p_455954_, boolean p_458145_) { Entity entity = p_455471_; @@ -273,7 +273,7 @@ if (this.level() instanceof ServerLevel serverlevel) { if (entity instanceof LivingEntity livingentity) { flag = p_456074_.hurtEnemy(livingentity, this); -@@ -1100,6 +_,7 @@ +@@ -1101,6 +_,7 @@ } if (p_456074_.isEmpty()) { @@ -281,7 +281,7 @@ if (p_456074_ == this.getMainHandItem()) { this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } else { -@@ -1136,17 +_,24 @@ +@@ -1137,17 +_,24 @@ return 1.0F; } @@ -308,7 +308,7 @@ float f1 = this.getEnchantedDamage(livingentity, f, p_455188_) * p_455105_; if (livingentity.hurtServer(serverlevel, p_455188_, f1)) { livingentity.knockback(0.4F, Mth.sin(this.getYRot() * (float) (Math.PI / 180.0)), -Mth.cos(this.getYRot() * (float) (Math.PI / 180.0))); -@@ -1305,6 +_,7 @@ +@@ -1306,6 +_,7 @@ } public void stopSleepInBed(boolean p_36226_, boolean p_36227_) { @@ -316,7 +316,7 @@ super.stopSleeping(); if (this.level() instanceof ServerLevel && p_36227_) { ((ServerLevel)this.level()).updateSleepingPlayerList(); -@@ -1410,7 +_,8 @@ +@@ -1411,7 +_,8 @@ @Override public boolean causeFallDamage(double p_397701_, float p_150093_, DamageSource p_150095_) { @@ -326,7 +326,7 @@ return false; } else { if (p_397701_ >= 2.0) { -@@ -1465,13 +_,13 @@ +@@ -1466,13 +_,13 @@ protected void playStepSound(BlockPos p_282121_, BlockState p_282194_) { if (this.isInWater()) { this.waterSwimSound(); @@ -342,7 +342,7 @@ } else { super.playStepSound(blockpos, blockstate); } -@@ -1502,6 +_,10 @@ +@@ -1503,6 +_,10 @@ } public void giveExperiencePoints(int p_36291_) { @@ -353,7 +353,7 @@ this.increaseScore(p_36291_); this.experienceProgress = this.experienceProgress + (float)p_36291_ / this.getXpNeededForNextLevel(); this.totalExperience = Mth.clamp(this.totalExperience + p_36291_, 0, Integer.MAX_VALUE); -@@ -1529,7 +_,7 @@ +@@ -1530,7 +_,7 @@ } public void onEnchantmentPerformed(ItemStack p_36172_, int p_36173_) { @@ -362,7 +362,7 @@ if (this.experienceLevel < 0) { this.experienceLevel = 0; this.experienceProgress = 0.0F; -@@ -1540,6 +_,10 @@ +@@ -1541,6 +_,10 @@ } public void giveExperienceLevels(int p_36276_) { @@ -373,7 +373,7 @@ this.experienceLevel = IntMath.saturatedAdd(this.experienceLevel, p_36276_); if (this.experienceLevel < 0) { this.experienceLevel = 0; -@@ -1578,7 +_,7 @@ +@@ -1579,7 +_,7 @@ } protected boolean hasEnoughFoodToDoExhaustiveManoeuvres() { @@ -382,7 +382,7 @@ } public Optional getWardenSpawnTracker() { -@@ -1685,7 +_,11 @@ +@@ -1686,7 +_,11 @@ @Override public Component getDisplayName() { @@ -395,7 +395,7 @@ return this.decorateDisplayNameComponent(mutablecomponent); } -@@ -1864,21 +_,21 @@ +@@ -1865,21 +_,21 @@ if (!(p_36349_.getItem() instanceof ProjectileWeaponItem)) { return ItemStack.EMPTY; } else { @@ -422,7 +422,7 @@ } } } -@@ -1918,7 +_,7 @@ +@@ -1919,7 +_,7 @@ } public boolean isScoping() { @@ -431,7 +431,7 @@ } @Override -@@ -2058,5 +_,41 @@ +@@ -2059,5 +_,41 @@ public static final Player.BedSleepingProblem OBSTRUCTED = new Player.BedSleepingProblem(Component.translatable("block.minecraft.bed.obstructed")); public static final Player.BedSleepingProblem OTHER_PROBLEM = new Player.BedSleepingProblem(null); public static final Player.BedSleepingProblem NOT_SAFE = new Player.BedSleepingProblem(Component.translatable("block.minecraft.bed.not_safe")); diff --git a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java index 042eddf7b0b..20e5651ac23 100644 --- a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java +++ b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationCommandEncoder.java @@ -152,7 +152,7 @@ public void writeToTexture(GpuTexture texture, ByteBuffer imageData, NativeImage } @Override - public void copyTextureToBuffer(GpuTexture texture, GpuBuffer buffer, int bufferOffset, Runnable callback, int mipLevel) { + public void copyTextureToBuffer(GpuTexture texture, GpuBuffer buffer, long bufferOffset, Runnable callback, int mipLevel) { if (!(texture instanceof ValidationGpuTexture validationTexture)) { throw new IllegalArgumentException(); } @@ -160,7 +160,7 @@ public void copyTextureToBuffer(GpuTexture texture, GpuBuffer buffer, int buffer } @Override - public void copyTextureToBuffer(GpuTexture texture, GpuBuffer buffer, int bufferOffset, Runnable callback, int mipLevel, int x, int y, int width, int height) { + public void copyTextureToBuffer(GpuTexture texture, GpuBuffer buffer, long bufferOffset, Runnable callback, int mipLevel, int x, int y, int width, int height) { if (!(texture instanceof ValidationGpuTexture validationTexture)) { throw new IllegalArgumentException(); } diff --git a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java index 02e88acb7ed..c1add833dc9 100644 --- a/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java +++ b/src/client/java/net/neoforged/neoforge/client/blaze3d/validation/ValidationGpuDevice.java @@ -103,7 +103,7 @@ public GpuTextureView createTextureView(GpuTexture texture, int baseMipLevel, in } @Override - public GpuBuffer createBuffer(@Nullable Supplier label, int usage, int size) { + public GpuBuffer createBuffer(@Nullable Supplier label, int usage, long size) { validator.validateBufferUsage(usage); return realDevice.createBuffer(label, usage, size); } From 553f111ff95913ca7f1fb4179a6b123aaed35420 Mon Sep 17 00:00:00 2001 From: XFactHD Date: Wed, 26 Nov 2025 17:27:12 +0100 Subject: [PATCH 18/20] Fix Q dropping items twice and remove redundant fix for MC-231097 --- .../net/minecraft/client/player/LocalPlayer.java.patch | 8 -------- .../net/minecraft/server/level/ServerPlayer.java.patch | 8 ++++---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/patches/net/minecraft/client/player/LocalPlayer.java.patch b/patches/net/minecraft/client/player/LocalPlayer.java.patch index 163eb367726..a3ea9e709db 100644 --- a/patches/net/minecraft/client/player/LocalPlayer.java.patch +++ b/patches/net/minecraft/client/player/LocalPlayer.java.patch @@ -1,13 +1,5 @@ --- a/net/minecraft/client/player/LocalPlayer.java +++ b/net/minecraft/client/player/LocalPlayer.java -@@ -318,6 +_,7 @@ - ServerboundPlayerActionPacket.Action serverboundplayeractionpacket$action = p_108701_ - ? ServerboundPlayerActionPacket.Action.DROP_ALL_ITEMS - : ServerboundPlayerActionPacket.Action.DROP_ITEM; -+ if (isUsingItem() && getUsedItemHand() == InteractionHand.MAIN_HAND && (p_108701_ || getUseItem().getCount() == 1)) stopUsingItem(); // Forge: fix MC-231097 on the clientside - ItemStack itemstack = this.getInventory().removeFromSelected(p_108701_); - this.connection.send(new ServerboundPlayerActionPacket(serverboundplayeractionpacket$action, BlockPos.ZERO, Direction.DOWN)); - return !itemstack.isEmpty(); @@ -526,7 +_,14 @@ @Override diff --git a/patches/net/minecraft/server/level/ServerPlayer.java.patch b/patches/net/minecraft/server/level/ServerPlayer.java.patch index ca64d9ca8a3..7d325de2322 100644 --- a/patches/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/net/minecraft/server/level/ServerPlayer.java.patch @@ -372,20 +372,20 @@ GameType gametype = this.server.getForcedGameType(); if (gametype != null) { return gametype; -@@ -2066,6 +_,9 @@ +@@ -2066,6 +_,8 @@ public void drop(boolean p_182295_) { Inventory inventory = this.getInventory(); + ItemStack selected = inventory.getSelectedItem(); + if (selected.isEmpty() || !selected.onDroppedByPlayer(this)) return; -+ if (isUsingItem() && getUsedItemHand() == InteractionHand.MAIN_HAND && (p_182295_ || selected.getCount() == 1)) stopUsingItem(); // Forge: fix MC-231097 on the serverside ItemStack itemstack = inventory.removeFromSelected(p_182295_); this.containerMenu .findSlot(inventory, inventory.getSelectedSlot()) -@@ -2075,6 +_,7 @@ +@@ -2074,7 +_,7 @@ + this.stopUsingItem(); } - this.drop(itemstack, false, true); +- this.drop(itemstack, false, true); + net.neoforged.neoforge.common.CommonHooks.onPlayerTossEvent(this, itemstack, false, true); } From 1a73d89162a1602129be4a989784f1c6a6a6e1d6 Mon Sep 17 00:00:00 2001 From: XFactHD Date: Wed, 26 Nov 2025 22:02:43 +0100 Subject: [PATCH 19/20] Update FML to fix loading screen rendering --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1e032de191e..a92fe419101 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,7 +41,7 @@ nightconfig_version=3.8.3 jetbrains_annotations_version=24.0.1 apache_maven_artifact_version=3.9.9 jarjar_version=0.4.1 -fancy_mod_loader_version=10.0.29 +fancy_mod_loader_version=10.0.34 typetools_version=0.6.3 mixin_extras_version=0.5.0 From be1d9ebf616f023799e30287fdfe261fd1512503 Mon Sep 17 00:00:00 2001 From: shartte Date: Wed, 26 Nov 2025 23:03:42 +0100 Subject: [PATCH 20/20] New Binpatching Tooling (#2809) Co-authored-by: Marc Hermans --- .../neodev/CreateCleanArtifacts.java | 7 +- .../net/neoforged/neodev/GenerateBaseJar.java | 58 +++++ .../neodev/GenerateBinaryPatches.java | 82 ++++--- .../neoforged/neodev/ListBinaryPatches.java | 47 ++++ .../net/neoforged/neodev/NeoDevPlugin.java | 213 +++++++++++------- .../java/net/neoforged/neodev/RemapJar.java | 52 ----- .../main/java/net/neoforged/neodev/Tools.java | 2 - .../installer/CreateInstallerProfile.java | 2 +- gradle.properties | 4 +- 9 files changed, 287 insertions(+), 180 deletions(-) create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/GenerateBaseJar.java create mode 100644 buildSrc/src/main/java/net/neoforged/neodev/ListBinaryPatches.java delete mode 100644 buildSrc/src/main/java/net/neoforged/neodev/RemapJar.java diff --git a/buildSrc/src/main/java/net/neoforged/neodev/CreateCleanArtifacts.java b/buildSrc/src/main/java/net/neoforged/neodev/CreateCleanArtifacts.java index 9ee5c90be78..3bad8f6d991 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/CreateCleanArtifacts.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/CreateCleanArtifacts.java @@ -30,6 +30,9 @@ abstract class CreateCleanArtifacts extends CreateMinecraftArtifacts { @OutputFile abstract RegularFileProperty getMergedMappings(); + @OutputFile + abstract RegularFileProperty getClientMappings(); + @Inject public CreateCleanArtifacts() { getAdditionalResults().put("node.downloadClient.output.output", getRawClientJar().getAsFile()); @@ -38,8 +41,6 @@ public CreateCleanArtifacts() { getAdditionalResults().put("node.stripServer.output.output", getCleanServerJar().getAsFile()); getAdditionalResults().put("node.rename.output.output", getCleanJoinedJar().getAsFile()); getAdditionalResults().put("node.mergeMappings.output.output", getMergedMappings().getAsFile()); - - // TODO: does anyone care about this? they should be contained in the client mappings - //"--write-result", "node.downloadServerMappings.output.output:" + getServerMappings().get().getAsFile().getAbsolutePath() + getAdditionalResults().put("node.downloadClientMappings.output.output", getClientMappings().getAsFile()); } } diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateBaseJar.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateBaseJar.java new file mode 100644 index 00000000000..90a76eb77fa --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateBaseJar.java @@ -0,0 +1,58 @@ +package net.neoforged.neodev; + +import javax.inject.Inject; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; + +/** + * Create the base jar file that will be diffed against the modified jar to create binary patch files. + */ +abstract class GenerateBaseJar extends JavaExec { + @Inject + public GenerateBaseJar() {} + + @InputFiles + @PathSensitive(PathSensitivity.NONE) + abstract ConfigurableFileCollection getMinecraft(); + + /** + * The official Mojang mappings file. + */ + @InputFile + @PathSensitive(PathSensitivity.NONE) + @Optional + abstract RegularFileProperty getMappings(); + + /** + * The NeoForm mappings (either LZMA or ZIP data file), this can be empty to not apply NeoForm mappings. + */ + @InputFiles + @PathSensitive(PathSensitivity.NONE) + abstract ConfigurableFileCollection getNeoFormMappings(); + + @OutputFile + abstract RegularFileProperty getOutput(); + + @Override + public void exec() { + args("--task", "PROCESS_MINECRAFT_JAR"); + for (var file : getMinecraft().getFiles()) { + args("--input", file.getAbsolutePath()); + } + if (getMappings().isPresent()) { + args("--input-mappings", getMappings().get().getAsFile().getAbsolutePath()); + } + args("--output", getOutput().get().getAsFile().getAbsolutePath()); + if (!getNeoFormMappings().isEmpty()) { + args("--neoform-data", getNeoFormMappings().getSingleFile().getAbsolutePath()); + } + super.exec(); + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/GenerateBinaryPatches.java b/buildSrc/src/main/java/net/neoforged/neodev/GenerateBinaryPatches.java index 4ef8e4e113a..e5efd98d107 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/GenerateBinaryPatches.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/GenerateBinaryPatches.java @@ -6,12 +6,11 @@ import java.io.IOException; import javax.inject.Inject; import org.gradle.api.GradleException; -import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.JavaExec; -import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputFile; abstract class GenerateBinaryPatches extends JavaExec { @@ -19,61 +18,78 @@ abstract class GenerateBinaryPatches extends JavaExec { public GenerateBinaryPatches() {} /** - * The jar file containing classes in the base state. + * The base against which the patches should be created for the client distribution. */ @InputFile - abstract RegularFileProperty getCleanJar(); + abstract RegularFileProperty getBaseClientJar(); /** - * The jar file containing classes in the desired target state. + * The target jar that will be diffed against {@link #getBaseClientJar()} to create the patches for the + * client distribution. */ @InputFile - abstract RegularFileProperty getPatchedJar(); + abstract RegularFileProperty getModifiedClientJar(); + /** + * The base against which the patches should be created for the server distribution. + */ @InputFile - abstract RegularFileProperty getMappings(); + abstract RegularFileProperty getBaseServerJar(); /** - * The files in this optional directory are used to filter which binary patches should be created. - *

A binary patch is only created for a file from {@link #getPatchedJar()}, if a source patch (A corresponding file - * with {@code .java.patch} extension) is present in this directory, or if a class with the same path is present in - * {@link #getIncludeClassesJar()} (if set). - *

For inner classes, only the outermost class is checked against the filters. - *

If neither this nor {@link #getIncludeClassesJar()} are set, no filtering is applied. + * The target jar that will be diffed against {@link #getBaseServerJar()} to create the patches for the + * server distribution. */ - @InputDirectory - @Optional - abstract DirectoryProperty getSourcePatchesFolder(); + @InputFile + abstract RegularFileProperty getModifiedServerJar(); + + /** + * The base against which the patches should be created for the combined client+server distribution. + */ + @InputFile + abstract RegularFileProperty getBaseJoinedJar(); /** - * The list of files included in this optional Jar file is used to filter for which files binary patches should be created. - *

A binary patch is only created for a file from {@link #getPatchedJar()}, if a file with the same path is - * either present in this jar, or if a corresponding source patch is present in {@link #getSourcePatchesFolder()} (if set). - *

For inner classes, only the outermost class is checked against the filters. - *

If neither this nor {@link #getSourcePatchesFolder()} are set, no filtering is applied. + * The target jar that will be diffed against {@link #getBaseServerJar()} to create the patches for the + * combined client+server distribution. */ @InputFile - @Optional - abstract RegularFileProperty getIncludeClassesJar(); + abstract RegularFileProperty getModifiedJoinedJar(); + + /** + * Ant-Style path patterns for paths to include in diffing. + */ + @Input + abstract ListProperty getInclude(); + + /** + * Ant-Style path patterns for paths to exclude from diffing. + */ + @Input + abstract ListProperty getExclude(); /** - * The location where the LZMA compressed binary patches are written to. + * Where the created patch bundle should be written to. */ @OutputFile abstract RegularFileProperty getOutputFile(); @Override public void exec() { - args("--clean", getCleanJar().get().getAsFile().getAbsolutePath()); - args("--dirty", getPatchedJar().get().getAsFile().getAbsolutePath()); - args("--srg", getMappings().get().getAsFile().getAbsolutePath()); - args("--minimize"); - if (getSourcePatchesFolder().isPresent()) { - args("--patches", getSourcePatchesFolder().get().getAsFile().getAbsolutePath()); + args("--diff"); + args("--base-client", getBaseClientJar().get().getAsFile().getAbsolutePath()); + args("--base-server", getBaseServerJar().get().getAsFile().getAbsolutePath()); + args("--base-joined", getBaseJoinedJar().get().getAsFile().getAbsolutePath()); + args("--modified-client", getModifiedClientJar().get().getAsFile().getAbsolutePath()); + args("--modified-server", getModifiedServerJar().get().getAsFile().getAbsolutePath()); + args("--modified-joined", getModifiedJoinedJar().get().getAsFile().getAbsolutePath()); + for (String pattern : getInclude().get()) { + args("--include", pattern); } - if (getIncludeClassesJar().isPresent()) { - args("--include-classes", getIncludeClassesJar().get().getAsFile().getAbsolutePath()); + for (String pattern : getExclude().get()) { + args("--exclude", pattern); } + args("--optimize-constantpool"); args("--output", getOutputFile().get().getAsFile().getAbsolutePath()); var logFile = new File(getTemporaryDir(), "console.log"); diff --git a/buildSrc/src/main/java/net/neoforged/neodev/ListBinaryPatches.java b/buildSrc/src/main/java/net/neoforged/neodev/ListBinaryPatches.java new file mode 100644 index 00000000000..078aef7387b --- /dev/null +++ b/buildSrc/src/main/java/net/neoforged/neodev/ListBinaryPatches.java @@ -0,0 +1,47 @@ +package net.neoforged.neodev; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import javax.inject.Inject; +import org.gradle.api.GradleException; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.OutputFile; + +/** + * A debugging task for helping with analyzing how the patches were de-duped, and what is being patched. + */ +abstract class ListBinaryPatches extends JavaExec { + @Inject + public ListBinaryPatches() {} + + /** + * The patch bundle to report on. + */ + @InputFile + public abstract RegularFileProperty getPatchBundle(); + + /** + * Where the created patch bundle report should be written to. + */ + @OutputFile + abstract RegularFileProperty getOutputFile(); + + @Override + public void exec() { + args("--list", "--patches", getPatchBundle().get().getAsFile().getAbsolutePath()); + + File reportFile = getOutputFile().getAsFile().get(); + try (var out = new BufferedOutputStream(new FileOutputStream(reportFile))) { + setStandardOutput(out); + super.exec(); + } catch (IOException e) { + throw new GradleException("Failed to list binary patches.", e); + } + + getLogger().lifecycle("Wrote contents of patch bundle to " + reportFile.getAbsolutePath()); + } +} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java index bc753362698..0662458d8c7 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/NeoDevPlugin.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.function.Consumer; import net.neoforged.minecraftdependencies.MinecraftDependenciesPlugin; @@ -36,6 +37,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.Sync; import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.bundling.AbstractArchiveTask; @@ -62,6 +64,9 @@ public void apply(Project project) { var extension = project.getExtensions().create(NeoDevExtension.NAME, NeoDevExtension.class); var configurations = NeoDevConfigurations.createAndSetup(project); + // Pre-create the "client" source set + project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets().create("client"); + /* * MINECRAFT SOURCES SETUP */ @@ -70,7 +75,7 @@ public void apply(Project project) { // Task must run on sync to have MC resources available for IDEA nondelegated builds. NeoDevFacade.runTaskOnProjectSync(project, createSourceArtifacts); - // Obtain clean binary artifacts, needed to be able to generate ATs + // Obtain clean binary artifacts, needed to be able to generate ATs and binary patches var createCleanArtifacts = tasks.register("createCleanArtifacts", CreateCleanArtifacts.class, task -> { task.setGroup(INTERNAL_GROUP); task.setDescription("This task retrieves various files for the Minecraft version without applying NeoForge patches to them"); @@ -81,6 +86,7 @@ public void apply(Project project) { task.getCleanServerJar().set(cleanArtifactsDir.map(dir -> dir.file("server.jar"))); task.getCleanJoinedJar().set(cleanArtifactsDir.map(dir -> dir.file("joined.jar"))); task.getMergedMappings().set(cleanArtifactsDir.map(dir -> dir.file("merged-mappings.txt"))); + task.getClientMappings().set(cleanArtifactsDir.map(dir -> dir.file("client-mappings.txt"))); task.getNeoFormArtifact().set(mcAndNeoFormVersion.map(version -> "net.neoforged:neoform:" + version + "@zip")); }); @@ -246,13 +252,6 @@ public void apply(Project project) { task.getPatchesFolder().set(neoDevBuildDir.map(dir -> dir.dir("production-source-patches"))); }); - var genCommonProductionPatches = tasks.register("generateCommonProductionSourcePatches", GenerateSourcePatches.class, task -> { - task.setGroup(INTERNAL_GROUP); - task.getOriginalJar().set(splitUnpatchedSources.flatMap(SplitMergedSources::getCommonJar)); - task.getModifiedSources().set(commonSources.flatMap(AbstractArchiveTask::getArchiveFile)); - task.getPatchesFolder().set(neoDevBuildDir.map(dir -> dir.dir("production-source-patches-common"))); - }); - // Update the patch/ folder with the current patches. tasks.register("genPatches", Sync.class, task -> { task.setGroup(GROUP); @@ -310,10 +309,7 @@ public void apply(Project project) { project, configurations, createCleanArtifacts, - joinedJar, - neoDevBuildDir, - genProductionPatches.flatMap(GenerateSourcePatches::getPatchesFolder), - genCommonProductionPatches.flatMap(GenerateSourcePatches::getPatchesFolder)); + neoDevBuildDir); var installerRepositoryUrls = getInstallerRepositoryUrls(project); // Launcher profile = the version.json file used by the Minecraft launcher. @@ -412,13 +408,9 @@ public void apply(Project project) { spec.into("data"); spec.rename(s -> "win_args.txt"); }); - task.from(binaryPatchOutputs.binaryPatchesForClient(), spec -> { - spec.into("data"); - spec.rename(s -> "client.lzma"); - }); - task.from(binaryPatchOutputs.binaryPatchesForServer(), spec -> { + task.from(binaryPatchOutputs, spec -> { spec.into("data"); - spec.rename(s -> "server.lzma"); + spec.rename(s -> "patches.lzma"); }); var mavenPath = neoForgeVersion.map(v -> "net/neoforged/neoforge/" + v); task.getInputs().property("mavenPath", mavenPath); @@ -450,8 +442,8 @@ public void apply(Project project) { task.from(atFiles, spec -> { spec.into("ats/"); }); - task.from(binaryPatchOutputs.binaryPatchesForMerged(), spec -> { - spec.rename(s -> "joined.lzma"); + task.from(binaryPatchOutputs, spec -> { + spec.rename(s -> "patches.lzma"); }); task.from(project.fileTree(genProductionPatches.flatMap(GenerateSourcePatches::getPatchesFolder)), spec -> { spec.into("patches/"); @@ -524,78 +516,49 @@ private static TaskProvider configureAccessTransformer( }); } - private static BinaryPatchOutputs configureBinaryPatchCreation(Project project, - NeoDevConfigurations configurations, + private static Provider configureBinaryPatchCreation( + Project project, + NeoDevConfigurations neoDevConfigurations, TaskProvider createCleanArtifacts, - TaskProvider joinedJar, - Provider neoDevBuildDir, - Provider sourcesPatchesFolder, - Provider sourcesServerPatchesFolder) { + Provider neoDevBuildDir) { var tasks = project.getTasks(); - var artConfig = configurations.getExecutableTool(Tools.AUTO_RENAMING_TOOL); - var remapClientJar = tasks.register("remapClientJar", RemapJar.class, task -> { - task.setDescription("Creates a Minecraft client jar with the official mappings applied. Used as the base for generating binary patches for the client."); - task.getInputJar().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanClientJar)); - task.getOutputJar().set(neoDevBuildDir.map(dir -> dir.file("remapped-client.jar"))); - }); - var remapServerJar = tasks.register("remapServerJar", RemapJar.class, task -> { - task.setDescription("Creates a Minecraft dedicated server jar with the official mappings applied. Used as the base for generating binary patches for the client."); - task.getInputJar().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanServerJar)); - task.getOutputJar().set(neoDevBuildDir.map(dir -> dir.file("remapped-server.jar"))); + var clientBaseJar = setupBinaryPatchBaseJar(project, neoDevBuildDir, BinaryPatchBaseType.CLIENT, neoDevConfigurations, createCleanArtifacts); + var serverBaseJar = setupBinaryPatchBaseJar(project, neoDevBuildDir, BinaryPatchBaseType.SERVER, neoDevConfigurations, createCleanArtifacts); + var joinedBaseJar = setupBinaryPatchBaseJar(project, neoDevBuildDir, BinaryPatchBaseType.JOINED, neoDevConfigurations, createCleanArtifacts); + var clientModifiedJar = setupBinaryPatchModifiedJar(project, neoDevBuildDir, BinaryPatchBaseType.CLIENT); + var serverModifiedJar = setupBinaryPatchModifiedJar(project, neoDevBuildDir, BinaryPatchBaseType.SERVER); + + var binpatcherConfig = neoDevConfigurations.getExecutableTool(Tools.BINPATCHER); + var generatePatchBundles = tasks.register("generatePatchBundle", GenerateBinaryPatches.class, task -> { + task.setDescription("Generates the binary patches."); + task.setGroup(INTERNAL_GROUP); + task.classpath(binpatcherConfig); + + task.getBaseClientJar().set(clientBaseJar); + task.getModifiedClientJar().set(clientModifiedJar); + task.getBaseServerJar().set(serverBaseJar); + task.getModifiedServerJar().set(serverModifiedJar); + task.getBaseJoinedJar().set(joinedBaseJar); + // Since we're filtering by *.class, the modified jar for client and joined is identical. They differ in manifest only. + task.getModifiedJoinedJar().set(clientModifiedJar); + task.getInclude().add("**/*.class"); + + task.getOutputFile().set(neoDevBuildDir.map(dir -> dir.file("patches.lzma"))); }); - for (var remapTask : List.of(remapClientJar, remapServerJar)) { - remapTask.configure(task -> { - task.setGroup(INTERNAL_GROUP); - task.classpath(artConfig); - task.getMappings().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getMergedMappings)); - }); - } - var binpatcherConfig = configurations.getExecutableTool(Tools.BINPATCHER); - var generateMergedBinPatches = tasks.register("generateMergedBinPatches", GenerateBinaryPatches.class, task -> { - task.setDescription("Creates binary patch files by diffing a merged client/server jar-file and the compiled Minecraft classes in this project."); - task.getCleanJar().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanJoinedJar)); - // Included so that lambda names are correct in production - task.getIncludeClassesJar().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getCleanJoinedJar)); - task.getSourcePatchesFolder().set(sourcesPatchesFolder); - task.getOutputFile().set(neoDevBuildDir.map(dir -> dir.file("merged-binpatches.lzma"))); - }); - var generateClientBinPatches = tasks.register("generateClientBinPatches", GenerateBinaryPatches.class, task -> { - task.setDescription("Creates binary patch files by diffing a merged client jar-file and the compiled Minecraft classes in this project."); - task.getCleanJar().set(remapClientJar.flatMap(RemapJar::getOutputJar)); - // Included so that lambda names are correct in production - task.getIncludeClassesJar().set(remapClientJar.flatMap(RemapJar::getOutputJar)); - task.getSourcePatchesFolder().set(sourcesPatchesFolder); - task.getOutputFile().set(neoDevBuildDir.map(dir -> dir.file("client-binpatches.lzma"))); - }); - var generateServerBinPatches = tasks.register("generateServerBinPatches", GenerateBinaryPatches.class, task -> { - task.setDescription("Creates binary patch files by diffing a merged server jar-file and the compiled Minecraft classes in this project."); - task.getCleanJar().set(remapServerJar.flatMap(RemapJar::getOutputJar)); - // Included so that lambda names are correct in production - task.getIncludeClassesJar().set(remapServerJar.flatMap(RemapJar::getOutputJar)); - task.getSourcePatchesFolder().set(sourcesServerPatchesFolder); - task.getOutputFile().set(neoDevBuildDir.map(dir -> dir.file("server-binpatches.lzma"))); - }); - for (var generateBinPatchesTask : List.of(generateMergedBinPatches, generateClientBinPatches, generateServerBinPatches)) { - generateBinPatchesTask.configure(task -> { - task.setGroup(INTERNAL_GROUP); - task.classpath(binpatcherConfig); - task.getPatchedJar().set(joinedJar.flatMap(Jar::getArchiveFile)); - task.getMappings().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getMergedMappings)); - }); - } + var patchBundle = generatePatchBundles.flatMap(GenerateBinaryPatches::getOutputFile); - return new BinaryPatchOutputs( - generateMergedBinPatches.flatMap(GenerateBinaryPatches::getOutputFile), - generateClientBinPatches.flatMap(GenerateBinaryPatches::getOutputFile), - generateServerBinPatches.flatMap(GenerateBinaryPatches::getOutputFile)); - } + tasks.register("listPatchBundleContent", ListBinaryPatches.class, task -> { + task.setDescription("Lists the content of the created binary patch bundle."); + task.setGroup(INTERNAL_GROUP); + task.classpath(binpatcherConfig); + task.getPatchBundle().set(patchBundle); + task.getOutputFile().set(neoDevBuildDir.map(dir -> dir.file("patches-content.txt"))); + }); - private record BinaryPatchOutputs( - Provider binaryPatchesForMerged, - Provider binaryPatchesForClient, - Provider binaryPatchesForServer) {} + return patchBundle; + } /** * Sets up NFRT, and creates the sources and resources artifacts. @@ -647,7 +610,85 @@ static TaskProvider configureMinecraftDecompilation(Pr }); } - private void setupProductionClientTest(Project project, + enum BinaryPatchBaseType { + CLIENT, + SERVER, + JOINED; + + public String taskName(String prefix) { + return prefix + Character.toUpperCase(toString().charAt(0)) + toString().substring(1); + } + + @Override + public String toString() { + return name().toLowerCase(Locale.ROOT); + } + } + + private static Provider setupBinaryPatchBaseJar( + Project project, + Provider neoDevBuildDir, + BinaryPatchBaseType type, + NeoDevConfigurations neoDevConfigurations, + TaskProvider createCleanArtifacts) { + var tasks = project.getTasks(); + + var binpatchesDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/binpatches")); + + var installerToolsConfig = neoDevConfigurations.getExecutableTool(Tools.INSTALLERTOOLS); + var baseJar = tasks.register(type.taskName("createBaseJar"), GenerateBaseJar.class, task -> { + task.setDescription("Generates the base jar for creating binary patches of the " + type + " distribution"); + task.setGroup(INTERNAL_GROUP); + if (type == BinaryPatchBaseType.CLIENT || type == BinaryPatchBaseType.JOINED) { + task.getMinecraft().from(createCleanArtifacts.flatMap(CreateCleanArtifacts::getRawClientJar)); + } + if (type == BinaryPatchBaseType.SERVER || type == BinaryPatchBaseType.JOINED) { + task.getMinecraft().from(createCleanArtifacts.flatMap(CreateCleanArtifacts::getRawServerJar)); + } + // The client mappings are a superset of the server mappings and can be used to remap the server too. + task.getMappings().set(createCleanArtifacts.flatMap(CreateCleanArtifacts::getClientMappings)); + task.getOutput().set(binpatchesDir.map(dir -> dir.file(type + "-base.jar"))); + task.getNeoFormMappings().from(neoDevConfigurations.neoFormMappingsFiles); + task.classpath(installerToolsConfig); + }); + + return baseJar.flatMap(GenerateBaseJar::getOutput); + } + + private static Provider setupBinaryPatchModifiedJar( + Project project, + Provider neoDevBuildDir, + BinaryPatchBaseType type) { + var tasks = project.getTasks(); + + var binpatchesDir = neoDevBuildDir.map(dir -> dir.dir("artifacts/binpatches")); + + // Create the jar file in its target state. We will create binary patches to convert the base-jar to this jar. + var sourceSets = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets(); + var modifiedJar = tasks.register(type.taskName("createModifiedJar"), Jar.class, task -> { + task.setDescription("Create the jar file for " + type + " in the state that we want to create binpatches from. This jar only contains classes since we don't modify original resources at the moment."); + task.setGroup(INTERNAL_GROUP); + task.getDestinationDirectory().set(binpatchesDir); + task.getArchiveFileName().set(type + "-modified-classes.jar"); + + // Copy only the unmodified+modified Minecraft classes, excluding NeoForges own classes + var mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME); + task.from(mainSourceSet.getJava().getClassesDirectory(), spec -> { + spec.exclude("net/neoforged/**"); + }); + if (type == BinaryPatchBaseType.CLIENT || type == BinaryPatchBaseType.JOINED) { + var clientSourceSet = sourceSets.getByName("client"); + task.from(clientSourceSet.getJava().getClassesDirectory(), spec -> { + spec.exclude("net/neoforged/**"); + }); + } + }); + + return modifiedJar.flatMap(AbstractArchiveTask::getArchiveFile); + } + + private void setupProductionClientTest( + Project project, NeoDevConfigurations configurations, TaskProvider downloadAssets, TaskProvider installer, diff --git a/buildSrc/src/main/java/net/neoforged/neodev/RemapJar.java b/buildSrc/src/main/java/net/neoforged/neodev/RemapJar.java deleted file mode 100644 index a4bf5fa8961..00000000000 --- a/buildSrc/src/main/java/net/neoforged/neodev/RemapJar.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.neoforged.neodev; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import javax.inject.Inject; -import org.gradle.api.GradleException; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.JavaExec; -import org.gradle.api.tasks.OutputFile; - -/** - * Produces a remapped jar-file that has almost no other changes applied with the intent of being - * the base against which we {@link GenerateBinaryPatches generate binary patches}. - *

- * The installer produces the same Jar file as this task does and then applies the patches against that. - *

- * Any changes to the options used here have to be reflected in the {@link net.neoforged.neodev.installer.CreateInstallerProfile installer profile} - * and vice versa, to ensure the patches are generated against the same binary files as they are applied to later. - */ -abstract class RemapJar extends JavaExec { - @Inject - public RemapJar() {} - - @InputFile - abstract RegularFileProperty getInputJar(); - - @InputFile - abstract RegularFileProperty getMappings(); - - @OutputFile - abstract RegularFileProperty getOutputJar(); - - @Override - public void exec() { - args("--input", getInputJar().get().getAsFile().getAbsolutePath()); - args("--output", getOutputJar().get().getAsFile().getAbsolutePath()); - args("--names", getMappings().get().getAsFile().getAbsolutePath()); - args("--ann-fix", "--ids-fix", "--src-fix", "--record-fix"); - - var logFile = new File(getTemporaryDir(), "console.log"); - try (var out = new BufferedOutputStream(new FileOutputStream(logFile))) { - getLogger().info("Logging ART console output to {}", logFile.getAbsolutePath()); - setStandardOutput(out); - super.exec(); - } catch (IOException e) { - throw new GradleException("Failed to remap jar.", e); - } - } -} diff --git a/buildSrc/src/main/java/net/neoforged/neodev/Tools.java b/buildSrc/src/main/java/net/neoforged/neodev/Tools.java index be4c31e5871..a96a11db606 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/Tools.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/Tools.java @@ -8,8 +8,6 @@ public enum Tools { JST("net.neoforged.jst:jst-cli-bundle:%s", "jst_version", "toolJstClasspath", true), // Fatjar because the contents are copy/pasted into the installer jar which must be standalone. LEGACYINSTALLER("net.neoforged:legacyinstaller:%s:shrunk", "legacyinstaller_version", "toolLegacyinstallerClasspath", true), - // Fatjar because the slim jar currently does not have the main class set in its manifest. - AUTO_RENAMING_TOOL("net.neoforged:AutoRenamingTool:%s:all", "art_version", "toolAutoRenamingToolClasspath", true), INSTALLERTOOLS("net.neoforged.installertools:installertools:%s:fatjar", "installertools_version", "toolInstallertoolsClasspath", true), // Fatjar because it was like that in the userdev json in the past. // To reconsider, we need to get in touch with 3rd party plugin developers or wait for a BC window. diff --git a/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java b/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java index 714a366070f..51a31a6299c 100644 --- a/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java +++ b/buildSrc/src/main/java/net/neoforged/neodev/installer/CreateInstallerProfile.java @@ -112,7 +112,7 @@ public void createInstallerProfile() throws IOException { var data = new LinkedHashMap(); var neoFormVersion = getMcAndNeoFormVersion().get(); data.put("MOJMAPS", new LauncherDataEntry(clientMappingsCoordinate, serverMappingsCoordinate)); - data.put("BINPATCH", new LauncherDataEntry("/data/client.lzma", "/data/server.lzma")); + data.put("BINPATCH", new LauncherDataEntry("/data/patches.lzma", "/data/patches.lzma")); var patchedClientCoordinate = new MavenIdentifier("net.neoforged", "minecraft-client-patched", getNeoForgeVersion().get(), "", "jar"); var patchedServerCoordinate = new MavenIdentifier("net.neoforged", "minecraft-server-patched", getNeoForgeVersion().get(), "", "jar"); diff --git a/gradle.properties b/gradle.properties index a92fe419101..1f9956f3f1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,10 +24,8 @@ neoforge_snapshot_next_stable=21.11 # renovate: net.neoforged.jst:jst-cli-bundle jst_version=1.0.67 legacyinstaller_version=3.0.+ -# renovate: net.neoforged:AutoRenamingTool -art_version=2.0.11 # renovate: net.neoforged.installertools:installertools -installertools_version=3.0.14 +installertools_version=4.0.6 # renovate: org.ow2.asm:asm asm_version=9.8