From 98e9faa2629f5fa50ed118bfa486a00c5b1bf07c Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 30 Jul 2020 22:08:19 +0200 Subject: [PATCH 1/5] Ported model dependency changes from Fabric 1.16. Made IChestLid sided. --- .../java/appeng/block/qnb/QnbFormedModel.java | 20 +++++---- .../client/render/BasicUnbakedModel.java | 42 +++++++++++++++++++ .../appeng/client/render/FacadeItemModel.java | 14 ++----- .../client/render/cablebus/CableBusModel.java | 26 ++++++------ .../cablebus/P2PTunnelFrequencyModel.java | 16 +++---- .../render/crafting/CraftingCubeModel.java | 16 +++---- .../render/model/BiometricCardModel.java | 21 +++++----- .../render/model/ColorApplicatorModel.java | 21 +++++----- .../client/render/model/DriveModel.java | 17 ++++---- .../client/render/model/GlassModel.java | 15 +++---- .../client/render/model/MemoryCardModel.java | 21 +++++----- .../client/render/model/SkyCompassModel.java | 19 +++------ .../render/spatial/SpatialPylonModel.java | 17 +++----- src/main/java/appeng/core/Registration.java | 8 ---- .../core/api/client/ApiCellModelRegistry.java | 8 ++-- .../appeng/parts/automation/PlaneModel.java | 17 +++----- .../tile/storage/SkyChestTileEntity.java | 3 ++ 17 files changed, 152 insertions(+), 149 deletions(-) create mode 100644 src/main/java/appeng/client/render/BasicUnbakedModel.java diff --git a/src/main/java/appeng/block/qnb/QnbFormedModel.java b/src/main/java/appeng/block/qnb/QnbFormedModel.java index d18e7c79f..ae8e60d38 100644 --- a/src/main/java/appeng/block/qnb/QnbFormedModel.java +++ b/src/main/java/appeng/block/qnb/QnbFormedModel.java @@ -1,26 +1,24 @@ - package appeng.block.qnb; import java.util.Collection; -import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; -import com.mojang.datafixers.util.Pair; +import com.google.common.collect.ImmutableSet; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; -public class QnbFormedModel implements IModelGeometry { +public class QnbFormedModel implements BasicUnbakedModel { private static final ResourceLocation MODEL_RING = new ResourceLocation(AppEng.MOD_ID, "block/qnb/ring"); @@ -33,9 +31,13 @@ public class QnbFormedModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return QnbFormedBakedModel.getRequiredTextures(); + public Collection getModelDependencies() { + return ImmutableSet.of(MODEL_RING); + } + + @Override + public Stream getAdditionalTextures() { + return QnbFormedBakedModel.getRequiredTextures().stream(); } } diff --git a/src/main/java/appeng/client/render/BasicUnbakedModel.java b/src/main/java/appeng/client/render/BasicUnbakedModel.java new file mode 100644 index 000000000..a5258b15a --- /dev/null +++ b/src/main/java/appeng/client/render/BasicUnbakedModel.java @@ -0,0 +1,42 @@ +package appeng.client.render; + +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.mojang.datafixers.util.Pair; + +import net.minecraft.client.renderer.model.IUnbakedModel; +import net.minecraft.client.renderer.model.RenderMaterial; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelConfiguration; +import net.minecraftforge.client.model.geometry.IModelGeometry; + +/** + * An unbaked model that has standard models as a dependency and produces a + * custom baked model as a result. + */ +public interface BasicUnbakedModel> extends IModelGeometry { + + default Collection getModelDependencies() { + return Collections.emptyList(); + } + + default Stream getAdditionalTextures() { + return Stream.empty(); + } + + @Override + default Collection getTextures(IModelConfiguration owner, + Function unbakedModelGetter, + Set> unresolvedTextureReferences) { + return Stream.concat( + getModelDependencies().stream().map(unbakedModelGetter) + .flatMap(ubm -> ubm.getTextures(unbakedModelGetter, unresolvedTextureReferences).stream()), + getAdditionalTextures()).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/appeng/client/render/FacadeItemModel.java b/src/main/java/appeng/client/render/FacadeItemModel.java index b07a9d75a..b73a56a9a 100644 --- a/src/main/java/appeng/client/render/FacadeItemModel.java +++ b/src/main/java/appeng/client/render/FacadeItemModel.java @@ -19,21 +19,17 @@ package appeng.client.render; import java.util.Collection; -import java.util.Set; +import java.util.Collections; import java.util.function.Function; -import com.mojang.datafixers.util.Pair; - import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; import appeng.client.render.cablebus.FacadeBuilder; import appeng.core.AppEng; @@ -42,7 +38,7 @@ import appeng.core.AppEng; * The model class for facades. Since facades wrap existing models, they don't * declare any dependencies here other than the cable anchor. */ -public class FacadeItemModel implements IModelGeometry { +public class FacadeItemModel implements BasicUnbakedModel { // We use this to get the default item transforms and make our lives easier private static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/facade_base"); @@ -58,9 +54,7 @@ public class FacadeItemModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return modelGetter.apply(MODEL_BASE).getTextures(modelGetter, missingTextureErrors); + public Collection getModelDependencies() { + return Collections.singleton(MODEL_BASE); } - } diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModel.java b/src/main/java/appeng/client/render/cablebus/CableBusModel.java index e0bc1f10c..77ffad447 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModel.java @@ -19,33 +19,30 @@ package appeng.client.render.cablebus; import java.util.Collection; -import java.util.Collections; import java.util.Map; -import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; import com.google.common.collect.ImmutableMap; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; import appeng.api.util.AEColor; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AELog; import appeng.core.features.registries.PartModels; /** * The built-in model for the cable bus block. */ -public class CableBusModel implements IModelGeometry { +public class CableBusModel implements BasicUnbakedModel { private final PartModels partModels; @@ -53,6 +50,17 @@ public class CableBusModel implements IModelGeometry { this.partModels = partModels; } + @Override + public Collection getModelDependencies() { + partModels.setInitialized(true); + return partModels.getModels(); + } + + @Override + public Stream getAdditionalTextures() { + return CableBuilder.getTextures().stream(); + } + @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, @@ -70,12 +78,6 @@ public class CableBusModel implements IModelGeometry { return new CableBusBakedModel(cableBuilder, facadeBuilder, partModels, particleTexture); } - @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.unmodifiableList(CableBuilder.getTextures()); - } - private Map loadPartModels(ModelBakery bakery, Function spriteGetterIn, IModelTransform transformIn) { ImmutableMap.Builder result = ImmutableMap.builder(); diff --git a/src/main/java/appeng/client/render/cablebus/P2PTunnelFrequencyModel.java b/src/main/java/appeng/client/render/cablebus/P2PTunnelFrequencyModel.java index e5b03715d..1d45d9a80 100644 --- a/src/main/java/appeng/client/render/cablebus/P2PTunnelFrequencyModel.java +++ b/src/main/java/appeng/client/render/cablebus/P2PTunnelFrequencyModel.java @@ -1,15 +1,10 @@ package appeng.client.render.cablebus; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; import java.util.function.Function; - -import com.mojang.datafixers.util.Pair; +import java.util.stream.Stream; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -17,11 +12,11 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; -public class P2PTunnelFrequencyModel implements IModelGeometry { +public class P2PTunnelFrequencyModel implements BasicUnbakedModel { private static final RenderMaterial TEXTURE = new RenderMaterial(AtlasTexture.LOCATION_BLOCKS_TEXTURE, new ResourceLocation(AppEng.MOD_ID, "part/p2p_tunnel_frequency")); @@ -38,9 +33,8 @@ public class P2PTunnelFrequencyModel implements IModelGeometry getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.singleton(TEXTURE); + public Stream getAdditionalTextures() { + return Stream.of(TEXTURE); } } diff --git a/src/main/java/appeng/client/render/crafting/CraftingCubeModel.java b/src/main/java/appeng/client/render/crafting/CraftingCubeModel.java index 4d9df844e..f02055180 100644 --- a/src/main/java/appeng/client/render/crafting/CraftingCubeModel.java +++ b/src/main/java/appeng/client/render/crafting/CraftingCubeModel.java @@ -18,16 +18,11 @@ package appeng.client.render.crafting; -import java.util.Collection; -import java.util.Set; import java.util.function.Function; - -import com.google.common.collect.ImmutableList; -import com.mojang.datafixers.util.Pair; +import java.util.stream.Stream; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -35,15 +30,15 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; import appeng.block.crafting.AbstractCraftingUnitBlock; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; /** * The built-in model for the connected texture crafting cube. */ -class CraftingCubeModel implements IModelGeometry { +class CraftingCubeModel implements BasicUnbakedModel { private final static RenderMaterial RING_CORNER = texture("ring_corner"); private final static RenderMaterial RING_SIDE_HOR = texture("ring_side_hor"); @@ -67,9 +62,8 @@ class CraftingCubeModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return ImmutableList.of(RING_CORNER, RING_SIDE_HOR, RING_SIDE_VER, UNIT_BASE, LIGHT_BASE, ACCELERATOR_LIGHT, + public Stream getAdditionalTextures() { + return Stream.of(RING_CORNER, RING_SIDE_HOR, RING_SIDE_VER, UNIT_BASE, LIGHT_BASE, ACCELERATOR_LIGHT, STORAGE_1K_LIGHT, STORAGE_4K_LIGHT, STORAGE_16K_LIGHT, STORAGE_64K_LIGHT, MONITOR_BASE, MONITOR_LIGHT_DARK, MONITOR_LIGHT_MEDIUM, MONITOR_LIGHT_BRIGHT); } diff --git a/src/main/java/appeng/client/render/model/BiometricCardModel.java b/src/main/java/appeng/client/render/model/BiometricCardModel.java index 18a9e1cac..76366df4e 100644 --- a/src/main/java/appeng/client/render/model/BiometricCardModel.java +++ b/src/main/java/appeng/client/render/model/BiometricCardModel.java @@ -2,16 +2,13 @@ package appeng.client.render.model; import java.util.Collection; import java.util.Collections; -import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; import javax.annotation.Nullable; -import com.mojang.datafixers.util.Pair; - import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -19,24 +16,28 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; /** * Model wrapper for the biometric card item model, which combines a base card * layer with a "visual hash" of the player name */ -public class BiometricCardModel implements IModelGeometry { +public class BiometricCardModel implements BasicUnbakedModel { - public static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/biometric_card_base"); + private static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/biometric_card_base"); private static final RenderMaterial TEXTURE = new RenderMaterial(AtlasTexture.LOCATION_BLOCKS_TEXTURE, new ResourceLocation(AppEng.MOD_ID, "item/biometric_card_hash")); @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.singleton(TEXTURE); + public Collection getModelDependencies() { + return Collections.singleton(MODEL_BASE); + } + + @Override + public Stream getAdditionalTextures() { + return Stream.of(TEXTURE); } @Nullable diff --git a/src/main/java/appeng/client/render/model/ColorApplicatorModel.java b/src/main/java/appeng/client/render/model/ColorApplicatorModel.java index 22e730afc..d9087eea8 100644 --- a/src/main/java/appeng/client/render/model/ColorApplicatorModel.java +++ b/src/main/java/appeng/client/render/model/ColorApplicatorModel.java @@ -1,15 +1,12 @@ package appeng.client.render.model; -import java.util.Arrays; import java.util.Collection; -import java.util.Set; +import java.util.Collections; import java.util.function.Function; - -import com.mojang.datafixers.util.Pair; +import java.util.stream.Stream; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -17,15 +14,15 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; /** * A color applicator uses the base model, and extends it with additional layers * that are colored according to the selected color of the applicator. */ -public class ColorApplicatorModel implements IModelGeometry { +public class ColorApplicatorModel implements BasicUnbakedModel { private static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/color_applicator_colored"); @@ -38,9 +35,13 @@ public class ColorApplicatorModel implements IModelGeometry getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Arrays.asList(TEXTURE_DARK, TEXTURE_MEDIUM, TEXTURE_DARK); + public Collection getModelDependencies() { + return Collections.singleton(MODEL_BASE); + } + + @Override + public Stream getAdditionalTextures() { + return Stream.of(TEXTURE_DARK, TEXTURE_MEDIUM, TEXTURE_DARK); } @Override diff --git a/src/main/java/appeng/client/render/model/DriveModel.java b/src/main/java/appeng/client/render/model/DriveModel.java index c43555078..5dfdc1bca 100644 --- a/src/main/java/appeng/client/render/model/DriveModel.java +++ b/src/main/java/appeng/client/render/model/DriveModel.java @@ -19,18 +19,15 @@ package appeng.client.render.model; import java.util.Collection; -import java.util.Collections; import java.util.IdentityHashMap; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.function.Function; -import com.mojang.datafixers.util.Pair; +import com.google.common.collect.ImmutableSet; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -39,12 +36,13 @@ import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; import appeng.api.client.ICellModelRegistry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.Api; +import appeng.core.api.client.ApiCellModelRegistry; -public class DriveModel implements IModelGeometry { +public class DriveModel implements BasicUnbakedModel { private static final ResourceLocation MODEL_BASE = new ResourceLocation( "appliedenergistics2:block/drive/drive_base"); @@ -73,9 +71,10 @@ public class DriveModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.emptyList(); + public Collection getModelDependencies() { + ICellModelRegistry cells = Api.instance().client().cells(); + return ImmutableSet.builder().add(cells.getDefaultModel()) + .addAll(ApiCellModelRegistry.getModels()).addAll(cells.models().values()).build(); } } diff --git a/src/main/java/appeng/client/render/model/GlassModel.java b/src/main/java/appeng/client/render/model/GlassModel.java index 503c51a7d..ee24c74e1 100644 --- a/src/main/java/appeng/client/render/model/GlassModel.java +++ b/src/main/java/appeng/client/render/model/GlassModel.java @@ -18,28 +18,26 @@ package appeng.client.render.model; -import java.util.Collection; -import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; import com.google.common.collect.ImmutableSet; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; + +import appeng.client.render.BasicUnbakedModel; /** * Model class for the connected texture glass model. */ -public class GlassModel implements IModelGeometry { +public class GlassModel implements BasicUnbakedModel { @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, @@ -49,12 +47,11 @@ public class GlassModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { + public Stream getAdditionalTextures() { return ImmutableSet .builder().add(GlassBakedModel.TEXTURE_A, GlassBakedModel.TEXTURE_B, GlassBakedModel.TEXTURE_C, GlassBakedModel.TEXTURE_D) - .add(GlassBakedModel.TEXTURES_FRAME).build(); + .add(GlassBakedModel.TEXTURES_FRAME).build().stream(); } } diff --git a/src/main/java/appeng/client/render/model/MemoryCardModel.java b/src/main/java/appeng/client/render/model/MemoryCardModel.java index 98cdb2115..f7140996b 100644 --- a/src/main/java/appeng/client/render/model/MemoryCardModel.java +++ b/src/main/java/appeng/client/render/model/MemoryCardModel.java @@ -2,16 +2,13 @@ package appeng.client.render.model; import java.util.Collection; import java.util.Collections; -import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; import javax.annotation.Nullable; -import com.mojang.datafixers.util.Pair; - import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -19,24 +16,23 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; /** * Model wrapper for the memory card item model, which combines a base card * layer with a "visual hash" of the part/tile. */ -public class MemoryCardModel implements IModelGeometry { +public class MemoryCardModel implements BasicUnbakedModel { - public static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/memory_card_base"); + private static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/memory_card_base"); private static final RenderMaterial TEXTURE = new RenderMaterial(AtlasTexture.LOCATION_BLOCKS_TEXTURE, new ResourceLocation(AppEng.MOD_ID, "item/memory_card_hash")); @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.singleton(TEXTURE); + public Collection getModelDependencies() { + return Collections.singleton(MODEL_BASE); } @Nullable @@ -51,4 +47,9 @@ public class MemoryCardModel implements IModelGeometry { return new MemoryCardBakedModel(baseModel, texture); } + @Override + public Stream getAdditionalTextures() { + return Stream.of(TEXTURE); + } + } diff --git a/src/main/java/appeng/client/render/model/SkyCompassModel.java b/src/main/java/appeng/client/render/model/SkyCompassModel.java index 8d3dc4ec7..af49fc423 100644 --- a/src/main/java/appeng/client/render/model/SkyCompassModel.java +++ b/src/main/java/appeng/client/render/model/SkyCompassModel.java @@ -19,30 +19,26 @@ package appeng.client.render.model; import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; import java.util.function.Function; -import com.google.common.collect.ImmutableList; -import com.mojang.datafixers.util.Pair; +import com.google.common.collect.ImmutableSet; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; + +import appeng.client.render.BasicUnbakedModel; /** * The parent model for the compass baked model. Declares the dependencies for * the base and pointer submodels mostly. */ -public class SkyCompassModel implements IModelGeometry { +public class SkyCompassModel implements BasicUnbakedModel { private static final ResourceLocation MODEL_BASE = new ResourceLocation( "appliedenergistics2:block/sky_compass_base"); @@ -50,8 +46,6 @@ public class SkyCompassModel implements IModelGeometry { private static final ResourceLocation MODEL_POINTER = new ResourceLocation( "appliedenergistics2:block/sky_compass_pointer"); - public static final List DEPENDENCIES = ImmutableList.of(MODEL_BASE, MODEL_POINTER); - @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, @@ -62,9 +56,8 @@ public class SkyCompassModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Collections.emptyList(); + public Collection getModelDependencies() { + return ImmutableSet.of(MODEL_BASE, MODEL_POINTER); } } diff --git a/src/main/java/appeng/client/render/spatial/SpatialPylonModel.java b/src/main/java/appeng/client/render/spatial/SpatialPylonModel.java index 8581a4517..f999f6ebd 100644 --- a/src/main/java/appeng/client/render/spatial/SpatialPylonModel.java +++ b/src/main/java/appeng/client/render/spatial/SpatialPylonModel.java @@ -19,18 +19,13 @@ package appeng.client.render.spatial; import java.util.Arrays; -import java.util.Collection; import java.util.EnumMap; import java.util.Map; -import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; - -import com.mojang.datafixers.util.Pair; +import java.util.stream.Stream; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -38,11 +33,11 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; +import appeng.client.render.BasicUnbakedModel; import appeng.core.AppEng; -public class SpatialPylonModel implements IModelGeometry { +public class SpatialPylonModel implements BasicUnbakedModel { @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, @@ -58,10 +53,8 @@ public class SpatialPylonModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Arrays.stream(SpatialPylonTextureType.values()).map(SpatialPylonModel::getTexturePath) - .collect(Collectors.toList()); + public Stream getAdditionalTextures() { + return Arrays.stream(SpatialPylonTextureType.values()).map(SpatialPylonModel::getTexturePath); } private static RenderMaterial getTexturePath(SpatialPylonTextureType type) { diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index d178b9a51..8bddf70e9 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -126,9 +126,6 @@ import appeng.client.render.effects.LightningFX; import appeng.client.render.effects.MatterCannonFX; import appeng.client.render.effects.ParticleTypes; import appeng.client.render.effects.VibrantFX; -import appeng.client.render.model.BiometricCardModel; -import appeng.client.render.model.MemoryCardModel; -import appeng.client.render.model.SkyCompassModel; import appeng.client.render.tesr.InscriberTESR; import appeng.client.render.tesr.SkyChestTESR; import appeng.container.AEBaseContainer; @@ -166,7 +163,6 @@ import appeng.container.implementations.UpgradeableContainer; import appeng.container.implementations.VibrationChamberContainer; import appeng.container.implementations.WirelessContainer; import appeng.container.implementations.WirelessTermContainer; -import appeng.core.api.client.ApiCellModelRegistry; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.PartModels; import appeng.core.features.registries.cell.BasicCellHandler; @@ -251,10 +247,6 @@ final class Registration { */ @OnlyIn(Dist.CLIENT) private void registerSpecialModels() { - SkyCompassModel.DEPENDENCIES.forEach(ModelLoader::addSpecialModel); - ModelLoader.addSpecialModel(BiometricCardModel.MODEL_BASE); - ModelLoader.addSpecialModel(MemoryCardModel.MODEL_BASE); - ApiCellModelRegistry.registerModels(); ModelLoader.addSpecialModel(MolecularAssemblerRenderer.LIGHTS_MODEL); PartModels partModels = (PartModels) Api.INSTANCE.registries().partModels(); diff --git a/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java index 837b61970..3178bb457 100644 --- a/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java +++ b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java @@ -1,6 +1,6 @@ /* * This file is part of Applied Energistics 2. - * + * * Copyright (c) 2020, TeamAppliedEnergistics, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify @@ -20,6 +20,7 @@ package appeng.core.api.client; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.IdentityHashMap; import java.util.Map; @@ -31,7 +32,6 @@ import com.google.common.base.Preconditions; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; import appeng.api.client.ICellModelRegistry; import appeng.core.ApiDefinitions; @@ -67,8 +67,8 @@ public class ApiCellModelRegistry implements ICellModelRegistry { MODEL_CELL_ITEMS_1K, MODEL_CELL_ITEMS_4K, MODEL_CELL_ITEMS_16K, MODEL_CELL_ITEMS_64K, MODEL_CELL_FLUIDS_1K, MODEL_CELL_FLUIDS_4K, MODEL_CELL_FLUIDS_16K, MODEL_CELL_FLUIDS_64K, MODEL_CELL_CREATIVE }; - public static void registerModels() { - Arrays.stream(MODELS).forEach(ModelLoader::addSpecialModel); + public static Collection getModels() { + return Arrays.asList(MODELS); } private final Map registry; diff --git a/src/main/java/appeng/parts/automation/PlaneModel.java b/src/main/java/appeng/parts/automation/PlaneModel.java index a4819f482..790945bf6 100644 --- a/src/main/java/appeng/parts/automation/PlaneModel.java +++ b/src/main/java/appeng/parts/automation/PlaneModel.java @@ -18,16 +18,11 @@ package appeng.parts.automation; -import java.util.Arrays; -import java.util.Collection; -import java.util.Set; import java.util.function.Function; - -import com.mojang.datafixers.util.Pair; +import java.util.stream.Stream; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IModelTransform; -import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.RenderMaterial; @@ -35,12 +30,13 @@ import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; + +import appeng.client.render.BasicUnbakedModel; /** * Built-in model for annihilation planes that supports connected textures. */ -public class PlaneModel implements IModelGeometry { +public class PlaneModel implements BasicUnbakedModel { private final RenderMaterial frontTexture; private final RenderMaterial sidesTexture; @@ -64,9 +60,8 @@ public class PlaneModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, - Function modelGetter, Set> missingTextureErrors) { - return Arrays.asList(frontTexture, sidesTexture, backTexture); + public Stream getAdditionalTextures() { + return Stream.of(frontTexture, sidesTexture, backTexture); } } diff --git a/src/main/java/appeng/tile/storage/SkyChestTileEntity.java b/src/main/java/appeng/tile/storage/SkyChestTileEntity.java index be8ed037e..b427275f7 100644 --- a/src/main/java/appeng/tile/storage/SkyChestTileEntity.java +++ b/src/main/java/appeng/tile/storage/SkyChestTileEntity.java @@ -30,6 +30,8 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; import net.minecraft.util.math.MathHelper; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.IItemHandler; import appeng.block.storage.SkyChestBlock; @@ -37,6 +39,7 @@ import appeng.tile.AEBaseInvTileEntity; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.inv.InvOperation; +@OnlyIn(value = Dist.CLIENT, _interface = IChestLid.class) public class SkyChestTileEntity extends AEBaseInvTileEntity implements ITickableTileEntity, IChestLid { private final AppEngInternalInventory inv = new AppEngInternalInventory(this, 9 * 4); From 4fa78a2add494dbbeeaa63c7c40b313a50021f0c Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 31 Jul 2020 17:22:44 +0200 Subject: [PATCH 2/5] Fix #4521: Register RecipeTypes. (#4523) --- src/main/java/appeng/core/AERecipeType.java | 18 ------------------ src/main/java/appeng/core/Registration.java | 3 --- .../appeng/recipes/handlers/GrinderRecipe.java | 6 +++++- .../handlers/GrinderRecipeSerializer.java | 2 +- .../recipes/handlers/InscriberRecipe.java | 5 ++++- .../handlers/InscriberRecipeSerializer.java | 2 +- 6 files changed, 11 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/appeng/core/AERecipeType.java diff --git a/src/main/java/appeng/core/AERecipeType.java b/src/main/java/appeng/core/AERecipeType.java deleted file mode 100644 index 8d7a572df..000000000 --- a/src/main/java/appeng/core/AERecipeType.java +++ /dev/null @@ -1,18 +0,0 @@ -package appeng.core; - -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.util.ResourceLocation; - -public class AERecipeType> implements IRecipeType { - private final String id; - - public AERecipeType(ResourceLocation registryName) { - this.id = registryName.toString(); - } - - @Override - public String toString() { - return id; - } -} diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 8bddf70e9..ffcc9d015 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -418,9 +418,6 @@ final class Registration { public void registerRecipeSerializers(RegistryEvent.Register> event) { IForgeRegistry> r = event.getRegistry(); - GrinderRecipe.TYPE = new AERecipeType<>(GrinderRecipeSerializer.INSTANCE.getRegistryName()); - InscriberRecipe.TYPE = new AERecipeType<>(InscriberRecipeSerializer.INSTANCE.getRegistryName()); - FacadeItem facadeItem = (FacadeItem) Api.INSTANCE.definitions().items().facade().item(); r.registerAll(DisassembleRecipe.SERIALIZER, GrinderRecipeSerializer.INSTANCE, InscriberRecipeSerializer.INSTANCE, FacadeRecipe.getSerializer(facadeItem)); diff --git a/src/main/java/appeng/recipes/handlers/GrinderRecipe.java b/src/main/java/appeng/recipes/handlers/GrinderRecipe.java index dcbfa8ce5..777e53cb3 100644 --- a/src/main/java/appeng/recipes/handlers/GrinderRecipe.java +++ b/src/main/java/appeng/recipes/handlers/GrinderRecipe.java @@ -14,9 +14,13 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; +import appeng.core.AppEng; + public class GrinderRecipe implements IRecipe { - public static IRecipeType TYPE; + public static final ResourceLocation TYPE_ID = AppEng.makeId("grinder"); + + public static final IRecipeType TYPE = IRecipeType.register(TYPE_ID.toString()); private final ResourceLocation id; private final String group; diff --git a/src/main/java/appeng/recipes/handlers/GrinderRecipeSerializer.java b/src/main/java/appeng/recipes/handlers/GrinderRecipeSerializer.java index 38d5b8c08..434dd71b3 100644 --- a/src/main/java/appeng/recipes/handlers/GrinderRecipeSerializer.java +++ b/src/main/java/appeng/recipes/handlers/GrinderRecipeSerializer.java @@ -29,7 +29,7 @@ public class GrinderRecipeSerializer extends ForgeRegistryEntry { - public static IRecipeType TYPE; + public static final ResourceLocation TYPE_ID = AppEng.makeId("inscriber"); + + public static final IRecipeType TYPE = IRecipeType.register(TYPE_ID.toString()); private final ResourceLocation id; private final String group; diff --git a/src/main/java/appeng/recipes/handlers/InscriberRecipeSerializer.java b/src/main/java/appeng/recipes/handlers/InscriberRecipeSerializer.java index f25c0d513..8e46d9072 100644 --- a/src/main/java/appeng/recipes/handlers/InscriberRecipeSerializer.java +++ b/src/main/java/appeng/recipes/handlers/InscriberRecipeSerializer.java @@ -23,7 +23,7 @@ public class InscriberRecipeSerializer extends ForgeRegistryEntry Date: Sat, 1 Aug 2020 12:59:05 +0200 Subject: [PATCH 3/5] Fix cell models not being loaded. (#4528) --- .../client/render/BakedModelUnwrapper.java | 31 ++++++++++++++ .../render/model/AutoRotatingBakedModel.java | 40 ++----------------- .../client/render/model/DriveBakedModel.java | 2 +- .../render/tesr/ChestTileEntityRenderer.java | 25 +++++++----- 4 files changed, 50 insertions(+), 48 deletions(-) create mode 100644 src/main/java/appeng/client/render/BakedModelUnwrapper.java diff --git a/src/main/java/appeng/client/render/BakedModelUnwrapper.java b/src/main/java/appeng/client/render/BakedModelUnwrapper.java new file mode 100644 index 000000000..e85132954 --- /dev/null +++ b/src/main/java/appeng/client/render/BakedModelUnwrapper.java @@ -0,0 +1,31 @@ +package appeng.client.render; + +import net.minecraft.client.renderer.model.IBakedModel; + +/** + * Helper to get a specific baked model class out of a chain of delegating baked + * models. + */ +public final class BakedModelUnwrapper { + + private BakedModelUnwrapper() { + } + + public static T unwrap(IBakedModel model, Class targetClass) { + if (targetClass.isInstance(model)) { + return targetClass.cast(model); + } + + if (model instanceof DelegateBakedModel) { + model = ((DelegateBakedModel) model).getBaseModel(); + if (targetClass.isInstance(model)) { + return targetClass.cast(model); + } else { + return unwrap(model, targetClass); + } + } + + return null; + } + +} diff --git a/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java b/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java index 6bf0a4d17..f60d638c9 100644 --- a/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java +++ b/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java @@ -50,14 +50,16 @@ import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; import net.minecraftforge.client.model.pipeline.IVertexConsumer; import net.minecraftforge.client.model.pipeline.QuadGatheringTransformer; +import appeng.client.render.DelegateBakedModel; import appeng.client.render.FacingToRotation; -public class AutoRotatingBakedModel implements IBakedModel { +public class AutoRotatingBakedModel extends DelegateBakedModel { private final IBakedModel parent; private final LoadingCache> quadCache; public AutoRotatingBakedModel(IBakedModel parent) { + super(parent); this.parent = parent; // 6 (DUNSWE) * 6 (DUNSWE) * 7 (DUNSWE + null) = 252 this.quadCache = CacheBuilder.newBuilder().maximumSize(252) @@ -113,42 +115,6 @@ public class AutoRotatingBakedModel implements IBakedModel { return rotated; } - @Override - public boolean isAmbientOcclusion() { - return this.parent.isAmbientOcclusion(); - } - - @Override - public boolean isGui3d() { - return this.parent.isGui3d(); - } - - @Override - public boolean func_230044_c_() { - return parent.func_230044_c_(); - } - - @Override - public boolean isBuiltInRenderer() { - return this.parent.isBuiltInRenderer(); - } - - @Override - public TextureAtlasSprite getParticleTexture() { - return this.parent.getParticleTexture(); - } - - @Override - @Deprecated - public ItemCameraTransforms getItemCameraTransforms() { - return parent.getItemCameraTransforms(); - } - - @Override - public ItemOverrideList getOverrides() { - return parent.getOverrides(); - } - @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) { return getQuads(state, side, rand, EmptyModelData.INSTANCE); diff --git a/src/main/java/appeng/client/render/model/DriveBakedModel.java b/src/main/java/appeng/client/render/model/DriveBakedModel.java index ff749855a..982abde4d 100644 --- a/src/main/java/appeng/client/render/model/DriveBakedModel.java +++ b/src/main/java/appeng/client/render/model/DriveBakedModel.java @@ -108,7 +108,7 @@ public class DriveBakedModel extends DelegateBakedModel { } // Determine which drive chassis to show based on the used cell - private IBakedModel getCellChassisModel(Item cell) { + public IBakedModel getCellChassisModel(Item cell) { if (cell == null) { return bakedCells.get(Items.AIR); } diff --git a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java index 0f74a89d8..981a3ae10 100644 --- a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java @@ -41,15 +41,15 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; -import appeng.api.client.ICellModelRegistry; import appeng.block.storage.DriveSlotsState; +import appeng.client.render.BakedModelUnwrapper; import appeng.client.render.DelegateBakedModel; import appeng.client.render.FacingToRotation; +import appeng.client.render.model.DriveBakedModel; import appeng.core.Api; import appeng.tile.storage.ChestTileEntity; @@ -59,8 +59,6 @@ import appeng.tile.storage.ChestTileEntity; */ public class ChestTileEntityRenderer extends TileEntityRenderer { - private final ICellModelRegistry cellModelRegistry = Api.instance().client().cells(); - private final ModelManager modelManager; private final BlockModelRenderer blockRenderer; @@ -88,12 +86,13 @@ public class ChestTileEntityRenderer extends TileEntityRenderer return; // No cell inserted into chest } - ResourceLocation cellModelLocation = cellModelRegistry.model(cellItem); - if (cellModelLocation == null) { - cellModelLocation = cellModelRegistry.getDefaultModel(); + // Try to get the right cell chassis model from the drive model since it already + // loads them all + DriveBakedModel driveModel = getDriveModel(); + if (driveModel == null) { + return; } - - IBakedModel model = modelManager.getModel(cellModelLocation); + IBakedModel cellModel = driveModel.getCellChassisModel(cellItem); matrices.push(); matrices.translate(0.5, 0.5, 0.5); @@ -109,7 +108,7 @@ public class ChestTileEntityRenderer extends TileEntityRenderer IVertexBuilder buffer = buffers.getBuffer(RenderType.getCutout()); // We "fake" the position here to make it use the light-value in front of the // drive - FaceRotatingModel rotatedModel = new FaceRotatingModel(model, rotation); + FaceRotatingModel rotatedModel = new FaceRotatingModel(cellModel, rotation); blockRenderer.renderModel(world, rotatedModel, chest.getBlockState(), chest.getPos(), matrices, buffer, false, new Random(), 0L, combinedOverlay, EmptyModelData.INSTANCE); @@ -119,6 +118,12 @@ public class ChestTileEntityRenderer extends TileEntityRenderer matrices.pop(); } + private DriveBakedModel getDriveModel() { + IBakedModel driveModel = modelManager.getBlockModelShapes() + .getModel(Api.instance().definitions().blocks().drive().block().getDefaultState()); + return BakedModelUnwrapper.unwrap(driveModel, DriveBakedModel.class); + } + /** * The actual vertex data will be transformed using the matrix stack, but the * faces will not be correctly rotated so the incorrect lighting data would be From 259d93294605e4aea6f3830b98313c3df2e5ccda Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 1 Aug 2020 21:01:19 +0200 Subject: [PATCH 4/5] Fixes 4529: Updated IPart to match new ICapabilityProvider (#4534) --- src/api/java/appeng/api/parts/IPart.java | 7 +++++-- .../java/appeng/fluids/helper/DualityFluidInterface.java | 2 +- .../java/appeng/tile/networking/CableBusTileEntity.java | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/api/java/appeng/api/parts/IPart.java b/src/api/java/appeng/api/parts/IPart.java index c6c0c2607..0f578b3c4 100644 --- a/src/api/java/appeng/api/parts/IPart.java +++ b/src/api/java/appeng/api/parts/IPart.java @@ -50,6 +50,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityProvider; import net.minecraftforge.common.util.LazyOptional; import appeng.api.networking.IGridNode; @@ -346,10 +347,12 @@ public interface IPart extends ICustomCableConnection { * capabilities on the cable bus will be forwarded to parts on the appropriate * side. * - * @see TileEntity#getCapability(Capability, net.minecraft.util.Direction) + * @see CapabilityProvider#getCapability(Capability, + * net.minecraft.util.Direction) * - * @return The capability or null. + * @return The capability */ + @Nonnull default LazyOptional getCapability(Capability capabilityClass) { return LazyOptional.empty(); } diff --git a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java index ae8b30903..a37983362 100644 --- a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java +++ b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java @@ -210,7 +210,7 @@ public class DualityFluidInterface } else if (capabilityClass == Capabilities.STORAGE_MONITORABLE_ACCESSOR) { return (LazyOptional) LazyOptional.of(() -> this.accessor); } - return null; + return LazyOptional.empty(); } private boolean hasConfig() { diff --git a/src/main/java/appeng/tile/networking/CableBusTileEntity.java b/src/main/java/appeng/tile/networking/CableBusTileEntity.java index 9d5554cbf..fce77ba2b 100644 --- a/src/main/java/appeng/tile/networking/CableBusTileEntity.java +++ b/src/main/java/appeng/tile/networking/CableBusTileEntity.java @@ -311,7 +311,7 @@ public class CableBusTileEntity extends AEBaseTileEntity implements AEMultiTile IPart part = this.getPart(partLocation); LazyOptional result = part == null ? LazyOptional.empty() : part.getCapability(capabilityClass); - if (result != null) { + if (result.isPresent()) { return result; } From c8d08f972661bf2306259db78e75eb17540e7da8 Mon Sep 17 00:00:00 2001 From: shartte Date: Sat, 1 Aug 2020 22:16:57 +0200 Subject: [PATCH 5/5] Fixes sidedness issues that cropped up with 1.16 (#4533) --- .../block/AEBaseBlockItemChargeable.java | 8 ----- .../bootstrap/BlockDefinitionBuilder.java | 22 ++++++++++++ .../bootstrap/ItemDefinitionBuilder.java | 4 +++ src/main/java/appeng/core/AppEng.java | 2 +- .../appeng/core/api/definitions/ApiItems.java | 33 ++++++++++++++++-- .../appeng/items/misc/CrystalSeedItem.java | 7 ++-- .../tools/powered/ColorApplicatorItem.java | 9 ----- .../appeng/mixins/SkyPropertiesMixin.java | 3 +- .../spatial/SpatialDimensionManager.java | 23 ------------- .../appeng/spatial/StorageSkyProperties.java | 34 +++++++++++++++++++ 10 files changed, 96 insertions(+), 49 deletions(-) create mode 100644 src/main/java/appeng/spatial/StorageSkyProperties.java diff --git a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java index 1bb71940a..79927fa14 100644 --- a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java +++ b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java @@ -45,14 +45,6 @@ public class AEBaseBlockItemChargeable extends AEBaseBlockItem implements IAEIte public AEBaseBlockItemChargeable(Block id, Properties props) { super(id, props); - - ItemModelsProperties.func_239418_a_(this, new ResourceLocation("appliedenergistics2:fill_level"), - (is, world, entity) -> { - double curPower = getAECurrentPower(is); - double maxPower = getAEMaxPower(is); - - return (int) Math.round(100 * curPower / maxPower); - }); } @Override diff --git a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java index 0779207e1..484090ce6 100644 --- a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java @@ -31,6 +31,8 @@ import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -38,8 +40,10 @@ import appeng.api.definitions.IBlockDefinition; import appeng.api.features.AEFeature; import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlockItem; +import appeng.block.AEBaseBlockItemChargeable; import appeng.block.AEBaseTileBlock; import appeng.bootstrap.components.IBlockRegistrationComponent; +import appeng.bootstrap.components.IClientSetupComponent; import appeng.bootstrap.components.IItemRegistrationComponent; import appeng.bootstrap.definitions.TileEntityDefinition; import appeng.core.AEItemGroup; @@ -149,6 +153,24 @@ class BlockDefinitionBuilder implements IBlockBuilder { item.setRegistryName(AppEng.MOD_ID, this.registryName); } + // Register the client-only item model property for chargeable items + if (item instanceof AEBaseBlockItemChargeable) { + AEBaseBlockItemChargeable chargeable = (AEBaseBlockItemChargeable) item; + this.factory.addBootstrapComponent(new IClientSetupComponent() { + @Override + @OnlyIn(Dist.CLIENT) + public void setup() { + ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:fill_level"), + (is, world, entity) -> { + double curPower = chargeable.getAECurrentPower(is); + double maxPower = chargeable.getAEMaxPower(is); + + return (int) Math.round(100 * curPower / maxPower); + }); + } + }); + } + // Register the item and block with the game this.factory.addBootstrapComponent((IBlockRegistrationComponent) (side, registry) -> registry.register(block)); if (item != null) { diff --git a/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java index cd4f37a6d..d7ee453a1 100644 --- a/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java @@ -30,10 +30,14 @@ import net.minecraft.block.DispenserBlock; import net.minecraft.dispenser.IDispenseItemBehavior; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import appeng.api.features.AEFeature; +import appeng.block.AEBaseBlockItemChargeable; +import appeng.bootstrap.components.IClientSetupComponent; import appeng.bootstrap.components.IInitComponent; import appeng.bootstrap.components.IItemRegistrationComponent; import appeng.core.AEItemGroup; diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index f3be46f62..661d19d63 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -117,7 +117,7 @@ public final class AppEng { ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, AEConfig.CLIENT_SPEC); ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AEConfig.COMMON_SPEC); - proxy = DistExecutor.safeRunForDist(() -> ClientHelper::new, () -> ServerHelper::new); + proxy = DistExecutor.unsafeRunForDist(() -> ClientHelper::new, () -> ServerHelper::new); CreativeTab.init(); new FacadeItemGroup(); // This call has a side-effect (adding it to the creative screen) diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 019318434..9aac0c4a5 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -18,11 +18,14 @@ package appeng.core.api.definitions; +import java.awt.*; import java.util.function.Consumer; import net.minecraft.entity.EntityClassification; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ToolType; @@ -35,6 +38,8 @@ import appeng.api.util.AEColoredItemDefinition; import appeng.bootstrap.FeatureFactory; import appeng.bootstrap.IItemRendering; import appeng.bootstrap.ItemRenderingCustomizer; +import appeng.bootstrap.components.IClientSetupComponent; +import appeng.core.AppEng; import appeng.core.features.ActivityState; import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ItemStackSrc; @@ -210,7 +215,22 @@ public final class ApiItems implements IItems { .addFeatures(AEFeature.PORTABLE_CELL, AEFeature.STORAGE_CELLS).build(); this.colorApplicator = powerTools.item("color_applicator", ColorApplicatorItem::new).props(chargedDefaults) .addFeatures(AEFeature.COLOR_APPLICATOR).dispenserBehavior(BlockToolDispenseItemBehavior::new) - .rendering(new ColorApplicatorItemRendering()).build(); + .bootstrap(item -> new IClientSetupComponent() { + @Override + @OnlyIn(Dist.CLIENT) + public void setup() { + ColorApplicatorItem colorApplicatorItem = (ColorApplicatorItem) item; + ItemModelsProperties.func_239418_a_(item, new ResourceLocation(AppEng.MOD_ID, "colored"), + (itemStack, world, entity) -> { + // If the stack has no color, don't use the colored model since the impact of + // calling getColor for every quad is extremely high, if the stack tries to + // re-search its + // inventory for a new paintball everytime + AEColor col = colorApplicatorItem.getActiveColor(itemStack); + return (col != null) ? 1 : 0; + }); + } + }).rendering(new ColorApplicatorItemRendering()).build(); this.biometricCard = registry.item("biometric_card", BiometricCardItem::new) .props(props -> props.maxStackSize(1)).features(AEFeature.SECURITY).build(); @@ -278,7 +298,16 @@ public final class ApiItems implements IItems { this.certusCrystalSeed = registry .item("certus_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedCertusQuartzCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(item -> new IClientSetupComponent() { + @Override + @OnlyIn(Dist.CLIENT) + public void setup() { + // Expose the growth of the seed to the model system + ItemModelsProperties.func_239418_a_(item, new ResourceLocation("appliedenergistics2:growth"), + (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) + / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); + } + }).features(AEFeature.CRYSTAL_SEEDS).build(); this.fluixCrystalSeed = registry .item("fluix_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedFluixCrystal().item())) diff --git a/src/main/java/appeng/items/misc/CrystalSeedItem.java b/src/main/java/appeng/items/misc/CrystalSeedItem.java index 66e45ae1a..5be256996 100644 --- a/src/main/java/appeng/items/misc/CrystalSeedItem.java +++ b/src/main/java/appeng/items/misc/CrystalSeedItem.java @@ -61,7 +61,7 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { /** * The number of growth ticks required to finish growing. */ - private static final int GROWTH_TICKS_REQUIRED = 600; + public static final int GROWTH_TICKS_REQUIRED = 600; /** * The item to convert to, when growth finishes. @@ -71,9 +71,6 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { public CrystalSeedItem(Properties properties, IItemProvider grownItem) { super(properties); this.grownItem = Preconditions.checkNotNull(grownItem); - // Expose the growth of the seed to the model system - ItemModelsProperties.func_239418_a_(this, new ResourceLocation("appliedenergistics2:growth"), - (is, w, p) -> getGrowthTicks(is) / (float) GROWTH_TICKS_REQUIRED); } @Nullable @@ -88,7 +85,7 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { } } - private static int getGrowthTicks(final ItemStack is) { + public static int getGrowthTicks(final ItemStack is) { CompoundNBT tag = is.getTag(); return tag != null ? tag.getInt(TAG_GROWTH_TICKS) : 0; } diff --git a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java index e533fc654..01f9406f9 100644 --- a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java +++ b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java @@ -107,15 +107,6 @@ public class ColorApplicatorItem extends AEBasePoweredItem public ColorApplicatorItem(Item.Properties props) { super(AEConfig.instance().getColorApplicatorBattery(), props); - ItemModelsProperties.func_239418_a_(this, new ResourceLocation(AppEng.MOD_ID, "colored"), - (itemStack, world, entity) -> { - // If the stack has no color, don't use the colored model since the impact of - // calling getColor for every quad is extremely high, if the stack tries to - // re-search its - // inventory for a new paintball everytime - AEColor col = getActiveColor(itemStack); - return (col != null) ? 1 : 0; - }); } @Override diff --git a/src/main/java/appeng/mixins/SkyPropertiesMixin.java b/src/main/java/appeng/mixins/SkyPropertiesMixin.java index 0fca89599..42c293a1b 100644 --- a/src/main/java/appeng/mixins/SkyPropertiesMixin.java +++ b/src/main/java/appeng/mixins/SkyPropertiesMixin.java @@ -12,6 +12,7 @@ import net.minecraft.util.RegistryKey; import net.minecraft.world.DimensionType; import appeng.spatial.SpatialDimensionManager; +import appeng.spatial.StorageSkyProperties; @Mixin(DimensionRenderInfo.class) public class SkyPropertiesMixin { @@ -20,7 +21,7 @@ public class SkyPropertiesMixin { private static void byDimensionType(Optional> optional, CallbackInfoReturnable ci) { if (optional.orElse(null) == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) { - ci.setReturnValue(SpatialDimensionManager.STORAGE_SKY); + ci.setReturnValue(StorageSkyProperties.INSTANCE); } } diff --git a/src/main/java/appeng/spatial/SpatialDimensionManager.java b/src/main/java/appeng/spatial/SpatialDimensionManager.java index cdad38c6b..cf07f84ce 100644 --- a/src/main/java/appeng/spatial/SpatialDimensionManager.java +++ b/src/main/java/appeng/spatial/SpatialDimensionManager.java @@ -23,12 +23,10 @@ import java.util.Locale; import javax.annotation.Nullable; -import net.minecraft.client.world.DimensionRenderInfo; import net.minecraft.server.MinecraftServer; import net.minecraft.util.RegistryKey; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.DimensionType; @@ -52,27 +50,6 @@ public final class SpatialDimensionManager implements ISpatialDimension { public static final RegistryKey STORAGE_DIMENSION_TYPE = RegistryKey .func_240903_a_(Registry.DIMENSION_TYPE_KEY, AppEng.makeId("storage_cell")); - // See the fabric version of this to get any idea what its doing - public static final DimensionRenderInfo STORAGE_SKY = new DimensionRenderInfo(Float.NaN /* disables clouds */, - false, DimensionRenderInfo.FogType.NONE /* we use a custom render mixin */, true, false) { - - @Override - public Vector3d func_230494_a_(Vector3d p_230494_1_, float p_230494_2_) { - return Vector3d.ZERO; - } - - @Override - public boolean func_230493_a_(int p_230493_1_, int p_230493_2_) { - return false; - } - - @Nullable - @Override - public float[] func_230492_a_(float p_230492_1_, float p_230492_2_) { - return null; - } - }; - public static final ISpatialDimension INSTANCE = new SpatialDimensionManager(); private static final String DIM_ID_PREFIX = "spatial_"; diff --git a/src/main/java/appeng/spatial/StorageSkyProperties.java b/src/main/java/appeng/spatial/StorageSkyProperties.java new file mode 100644 index 000000000..45a1ed9bb --- /dev/null +++ b/src/main/java/appeng/spatial/StorageSkyProperties.java @@ -0,0 +1,34 @@ +package appeng.spatial; + +import javax.annotation.Nullable; + +import net.minecraft.client.world.DimensionRenderInfo; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class StorageSkyProperties { + + // See the fabric version of this to get any idea what its doing + public static final DimensionRenderInfo INSTANCE = new DimensionRenderInfo(Float.NaN /* disables clouds */, false, + DimensionRenderInfo.FogType.NONE /* we use a custom render mixin */, true, false) { + + @Override + public Vector3d func_230494_a_(Vector3d p_230494_1_, float p_230494_2_) { + return Vector3d.ZERO; + } + + @Override + public boolean func_230493_a_(int p_230493_1_, int p_230493_2_) { + return false; + } + + @Nullable + @Override + public float[] func_230492_a_(float p_230492_1_, float p_230492_2_) { + return null; + } + }; + +}