diff --git a/build.gradle b/build.gradle index 74c7479ac..81a797cbc 100644 --- a/build.gradle +++ b/build.gradle @@ -140,7 +140,6 @@ jar { from "LICENSE" } -apply from: 'gradle/scripts/artifacts.gradle' apply from: 'gradle/scripts/curseforge.gradle' publishing { diff --git a/src/api/java/appeng/api/IAEAddon.java b/src/api/java/appeng/api/IAEAddon.java index 4a7759370..15299e48e 100644 --- a/src/api/java/appeng/api/IAEAddon.java +++ b/src/api/java/appeng/api/IAEAddon.java @@ -23,8 +23,6 @@ package appeng.api; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; - /** * Every AE2 addon requiring access to {@link IAppEngApi}, needs to provide at * least one class implementing this interface. @@ -37,9 +35,7 @@ public interface IAEAddon { /** * This gets called once the API is successfully constructed and ready to be * used. - * - * For now this happens during {@link FMLCommonSetupEvent}. - * + * * Each addon is responsible to maintain a reference to {@link IAppEngApi} for * future use. Otherwise there is no alternative to access it later. * diff --git a/src/api/java/appeng/api/client/ICellModelRegistry.java b/src/api/java/appeng/api/client/ICellModelRegistry.java index 0fbab4332..371f06089 100644 --- a/src/api/java/appeng/api/client/ICellModelRegistry.java +++ b/src/api/java/appeng/api/client/ICellModelRegistry.java @@ -28,9 +28,8 @@ import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Identifier; /** * A registry for 3D models used to render storage cells in the world, when they @@ -46,8 +45,8 @@ public interface ICellModelRegistry { * the game. See * {@see net.minecraftforge.client.model.ModelLoader#addSpecialModel}. * - * This method only maps an {@link Item} to a {@link ResourceLocation} which can - * be looked up from the {@link ModelBakery}. No validation about missing models + * This method only maps an {@link Item} to a {@link Identifier} which can + * be looked up from the {@link net.minecraft.client.render.model.BakedModelManager}. No validation about missing models * will be done. * * Will throw an exception in case a model is already registered for an item. @@ -55,20 +54,20 @@ public interface ICellModelRegistry { * For examples look at our cell part models within the drive model directory. * * @param item The cell item - * @param model The {@link ResourceLocation} representing the model. + * @param model The {@link net.minecraft.util.Identifier} representing the model. * @return */ - void registerModel(@Nonnull Item item, @Nonnull ResourceLocation model); + void registerModel(@Nonnull Item item, @Nonnull Identifier model); /** - * The {@link ResourceLocation} of the model used to render the given storage + * The {@link Identifier} of the model used to render the given storage * cell {@link Item} when inserted into a drive or similar. * * @param item * @return null, if no model is registered. */ @Nullable - ResourceLocation model(@Nonnull Item item); + Identifier model(@Nonnull Item item); /** * An unmodifiable map of all registered mappings. @@ -76,13 +75,13 @@ public interface ICellModelRegistry { * @return */ @Nonnull - Map models(); + Map models(); /** * Returns the default model, which can be used when no explicit model is * registered. */ @Nonnull - ResourceLocation getDefaultModel(); + Identifier getDefaultModel(); } diff --git a/src/api/java/appeng/api/config/Upgrades.java b/src/api/java/appeng/api/config/Upgrades.java index 9f6326248..458d89bfc 100644 --- a/src/api/java/appeng/api/config/Upgrades.java +++ b/src/api/java/appeng/api/config/Upgrades.java @@ -40,7 +40,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.text.Text; -import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.text.TranslatableText; public enum Upgrades { /** @@ -167,8 +167,8 @@ public enum Upgrades { return item != null && this.item == item; } - public ITextComponent getTooltipGroup() { - return this.tooltipGroup != null ? new TranslationTextComponent(this.tooltipGroup) : null; + public Text getTooltipGroup() { + return this.tooltipGroup != null ? new TranslatableText(this.tooltipGroup) : null; } } diff --git a/src/api/java/appeng/api/crafting/ICraftingHelper.java b/src/api/java/appeng/api/crafting/ICraftingHelper.java index 909f26353..b55f2a68e 100644 --- a/src/api/java/appeng/api/crafting/ICraftingHelper.java +++ b/src/api/java/appeng/api/crafting/ICraftingHelper.java @@ -27,7 +27,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.recipe.CraftingRecipe; import net.minecraft.world.World; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -74,8 +74,8 @@ public interface ICraftingHelper { * @param allowSubstitutes Controls whether the ME system will allow the use of * equivalent items to craft this recipe. */ - ItemStack encodeCraftingPattern(@Nullable ItemStack stack, ICraftingRecipe recipe, ItemStack[] in, ItemStack out, - boolean allowSubstitutes); + ItemStack encodeCraftingPattern(@Nullable ItemStack stack, CraftingRecipe recipe, ItemStack[] in, ItemStack out, + boolean allowSubstitutes); /** * Same as {@link #decodePattern(ItemStack, World, boolean)} with no auto @@ -94,7 +94,7 @@ public interface ICraftingHelper { * * @param itemStack pattern * @param world world used to access the - * {@link net.minecraft.item.crafting.RecipeManager}. + * {@link net.minecraft.recipe.RecipeManager}. * @param autoRecovery If true, the method will try to recover from changed * recipe ids by searching the entire recipe manager for a * recipe matching the inputs. If this is successful, the diff --git a/src/main/java/appeng/client/AppEngClient.java b/src/main/java/appeng/client/AppEngClient.java index 549b15b3b..b4ca52026 100644 --- a/src/main/java/appeng/client/AppEngClient.java +++ b/src/main/java/appeng/client/AppEngClient.java @@ -9,6 +9,7 @@ import appeng.client.gui.implementations.*; import appeng.client.render.SimpleModelLoader; import appeng.client.render.cablebus.CableBusModelLoader; import appeng.client.render.effects.*; +import appeng.client.render.model.DriveModel; import appeng.client.render.model.SkyCompassModel; import appeng.client.render.spatial.SpatialPylonModel; import appeng.client.render.tesr.InscriberTESR; @@ -241,10 +242,10 @@ public final class AppEngClient extends AppEngBase { // FIXME FABRIC addBuiltInModel("glass", GlassModel::new); addBuiltInModel("block/sky_compass", SkyCompassModel::new); addBuiltInModel("item/sky_compass", SkyCompassModel::new); -// FIXME FABRIC addBuiltInModel("dummy_fluid_item", DummyFluidItemModel::new); +// FIXME FABRIC addBuiltInModel("item/dummy_fluid_item", DummyFluidItemModel::new); // FIXME FABRIC addBuiltInModel("memory_card", MemoryCardModel::new); // FIXME FABRIC addBuiltInModel("biometric_card", BiometricCardModel::new); -// FIXME FABRIC addBuiltInModel("drive", DriveModel::new); + addBuiltInModel("block/drive", DriveModel::new); // FIXME FABRIC addBuiltInModel("color_applicator", ColorApplicatorModel::new); addBuiltInModel("block/spatial_pylon", SpatialPylonModel::new); // FIXME FABRIC addBuiltInModel("paint_splotches", PaintSplotchesModel::new); diff --git a/src/main/java/appeng/client/render/cablebus/QuadRotator.java b/src/main/java/appeng/client/render/cablebus/QuadRotator.java index 217cbf05b..37413bf77 100644 --- a/src/main/java/appeng/client/render/cablebus/QuadRotator.java +++ b/src/main/java/appeng/client/render/cablebus/QuadRotator.java @@ -23,6 +23,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MutableQuadViewImpl; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Quaternion; diff --git a/src/main/java/appeng/client/render/effects/EnergyFx.java b/src/main/java/appeng/client/render/effects/EnergyFx.java index 1f7136cd0..d9fc1918d 100644 --- a/src/main/java/appeng/client/render/effects/EnergyFx.java +++ b/src/main/java/appeng/client/render/effects/EnergyFx.java @@ -18,15 +18,11 @@ package appeng.client.render.effects; +import net.minecraft.client.particle.*; import net.minecraft.client.render.VertexConsumer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.IAnimatedSprite; -import net.minecraft.client.particle.IParticleFactory; -import net.minecraft.client.particle.IParticleRenderType; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.SpriteTexturedParticle; import net.minecraft.client.render.Camera; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/appeng/client/render/model/DriveBakedModel.java b/src/main/java/appeng/client/render/model/DriveBakedModel.java new file mode 100644 index 000000000..ca8cc899e --- /dev/null +++ b/src/main/java/appeng/client/render/model/DriveBakedModel.java @@ -0,0 +1,217 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.client.render.model; + +import appeng.block.storage.DriveSlotsState; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; +import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.function.Supplier; + +public class DriveBakedModel extends ForwardingBakedModel implements FabricBakedModel { + private final Map cellModels; + private final Map bakedCells; + private final BakedModel defaultCellModel; + private final Mesh defaultCell; + + private final RenderContext.QuadTransform[] slotTransforms; + + public DriveBakedModel(BakedModel bakedBase, Map cellModels, BakedModel defaultCell) { + this.wrapped = bakedBase; + this.defaultCellModel = defaultCell; + this.defaultCell = convertCellModel(defaultCell); + this.slotTransforms = buildSlotTransforms(); + this.bakedCells = convertCellModels(cellModels); + this.cellModels = cellModels; + } + + /** + * Calculates the origin of a drive slot for positioning a cell model into it. + */ + public static void getSlotOrigin(int row, int col, Vector3f translation) { + // Position this drive model copy at the correct slot. The transform is based on + // the cell-model being in slot 0,0,0 while the upper left slot's origin is at + // 9,13,1 + float xOffset = (9 - col * 8) / 16.0f; + float yOffset = (13 - row * 3) / 16.0f; + float zOffset = 1 / 16.0f; + translation.set(xOffset, yOffset, zOffset); + } + + @Override + public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { + + super.emitBlockQuads(blockView, state, pos, randomSupplier, context); + + // Add cell models on top of the base model, if possible + DriveSlotsState slotsState = getDriveSlotsState(blockView, pos); + if (slotsState != null) { + for (int row = 0; row < 5; row++) { + for (int col = 0; col < 2; col++) { + int slot = getSlotIndex(row, col); + + // Add the cell chassis + Item cell = slotsState.getCell(slot); + BakedModel cellChassisModel = getCellChassisModel(cell); + + context.pushTransform(slotTransforms[slot]); + context.fallbackConsumer().accept(cellChassisModel); + context.meshConsumer().accept(getCellChassisMesh(cell)); + context.popTransform(); + } + } + } + + } + + private static DriveSlotsState getDriveSlotsState(BlockRenderView blockView, BlockPos pos) { + if (!(blockView instanceof RenderAttachedBlockView)) { + return null; + } + Object attachedData = ((RenderAttachedBlockView) blockView).getBlockEntityRenderAttachment(pos); + if (!(attachedData instanceof DriveModelData)) { + return null; + } + + return ((DriveModelData) attachedData).getSlotsState(); + } + + @Override + public boolean useAmbientOcclusion() { + // We have faces inside the chassis that are facing east, but should not receive + // ambient occlusion from the east-side, but sadly this cannot be fine-tuned on + // a face-by-face basis. + return false; + } + + // Determine which drive chassis to show based on the used cell + public Mesh getCellChassisMesh(Item cell) { + if (cell == null) { + return bakedCells.get(Items.AIR); + } + final Mesh model = bakedCells.get(cell); + + return model != null ? model : defaultCell; + } + + public BakedModel getCellChassisModel(Item cell) { + if (cell == null) { + return cellModels.get(Items.AIR); + } + final BakedModel model = cellModels.get(cell); + + return model != null ? model : defaultCellModel; + } + + private RenderContext.QuadTransform[] buildSlotTransforms() { + RenderContext.QuadTransform[] result = new RenderContext.QuadTransform[5 * 2]; + + for (int row = 0; row < 5; row++) { + for (int col = 0; col < 2; col++) { + + Vector3f translation = new Vector3f(); + getSlotOrigin(row, col, translation); + + result[getSlotIndex(row, col)] = new QuadTranslator(translation.getX(), translation.getY(), translation.getZ()); + } + } + + return result; + } + + private static int getSlotIndex(int row, int col) { + return row * 2 + col; + } + + private static class QuadTranslator implements RenderContext.QuadTransform { + private final float x; + private final float y; + private final float z; + + public QuadTranslator(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public boolean transform(MutableQuadView quad) { + Vector3f target = new Vector3f(); + for (int i = 0; i < 4; i++) { + quad.copyPos(i, target); + target.add(x, y, z); + quad.pos(i, target); + } + return true; + } + } + + private Map convertCellModels(Map cellModels) { + Map result = new IdentityHashMap<>(); + + for (Map.Entry entry : cellModels.entrySet()) { + result.put(entry.getKey(), convertCellModel(entry.getValue())); + } + + return result; + } + + private Mesh convertCellModel(BakedModel bakedModel) { + Renderer renderer = RendererAccess.INSTANCE.getRenderer(); + Random random = new Random(); + MeshBuilder meshBuilder = renderer.meshBuilder(); + QuadEmitter emitter = meshBuilder.getEmitter(); + emitter.material(renderer.materialFinder().disableDiffuse(0, false).disableAo(0, true).find()); + + for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) { + Direction face = ModelHelper.faceFromIndex(i); + List quads = bakedModel.getQuads(null, face, random); + for (BakedQuad quad : quads) { + emitter.fromVanilla(quad.getVertexData(), 0, false); + emitter.cullFace(face); + emitter.nominalFace(face); + emitter.emit(); + } + } + return meshBuilder.build(); + } + +} diff --git a/src/unported/java/appeng/client/render/model/DriveModel.java b/src/main/java/appeng/client/render/model/DriveModel.java similarity index 55% rename from src/unported/java/appeng/client/render/model/DriveModel.java rename to src/main/java/appeng/client/render/model/DriveModel.java index 672870e86..83cc1ef1d 100644 --- a/src/unported/java/appeng/client/render/model/DriveModel.java +++ b/src/main/java/appeng/client/render/model/DriveModel.java @@ -18,64 +18,61 @@ 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 appeng.api.client.ICellModelRegistry; +import appeng.client.render.BasicUnbakedModel; +import appeng.core.Api; +import appeng.core.api.client.ApiCellModelRegistry; +import com.google.common.collect.ImmutableSet; import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.IModelTransform; -import net.minecraft.client.render.model.IUnbakedModel; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.client.render.model.ModelBakeSettings; import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.texture.Sprite; +import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.util.Identifier; -import net.minecraftforge.client.model.IModelConfiguration; -import net.minecraftforge.client.model.geometry.IModelGeometry; -import appeng.api.client.ICellModelRegistry; -import appeng.core.Api; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Function; -public class DriveModel implements IModelGeometry { +public class DriveModel implements BasicUnbakedModel { private static final Identifier MODEL_BASE = new Identifier( "appliedenergistics2:block/drive/drive_base"); - private static final ResourceLocation MODEL_CELL_EMPTY = new ResourceLocation( + private static final Identifier MODEL_CELL_EMPTY = new Identifier( "appliedenergistics2:block/drive/drive_cell_empty"); + @Nullable @Override - public BakedModel bake(IModelConfiguration owner, ModelLoader bakery, - Function spriteGetter, IModelTransform modelTransform, - ModelOverrideList overrides, Identifier modelLocation) { + public BakedModel bake(ModelLoader loader, Function textureGetter, ModelBakeSettings rotationContainer, Identifier modelId) { final ICellModelRegistry cellRegistry = Api.instance().client().cells(); final Map cellModels = new IdentityHashMap<>(); // Load the base model and the model for each cell model. - for (Entry entry : cellRegistry.models().entrySet()) { - BakedModel cellModel = bakery.getBakedModel(entry.getValue(), modelTransform, spriteGetter); + for (Entry entry : cellRegistry.models().entrySet()) { + BakedModel cellModel = loader.bake(entry.getValue(), rotationContainer); cellModels.put(entry.getKey(), cellModel); } - final BakedModel baseModel = bakery.getBakedModel(MODEL_BASE, modelTransform, spriteGetter); - final BakedModel defaultCell = bakery.getBakedModel(cellRegistry.getDefaultModel(), modelTransform, - spriteGetter); - cellModels.put(Items.AIR, bakery.getBakedModel(MODEL_CELL_EMPTY, modelTransform, spriteGetter)); + final BakedModel baseModel = loader.bake(MODEL_BASE, rotationContainer); + final BakedModel defaultCell = loader.bake(cellRegistry.getDefaultModel(), rotationContainer); + cellModels.put(Items.AIR, loader.bake(MODEL_CELL_EMPTY, rotationContainer)); return new DriveBakedModel(baseModel, cellModels, defaultCell); } @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/tesr/CellLedRenderer.java b/src/main/java/appeng/client/render/tesr/CellLedRenderer.java index ab47d6332..1067d715e 100644 --- a/src/main/java/appeng/client/render/tesr/CellLedRenderer.java +++ b/src/main/java/appeng/client/render/tesr/CellLedRenderer.java @@ -2,15 +2,13 @@ package appeng.client.render.tesr; import java.util.EnumMap; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; - import appeng.api.implementations.tiles.IChestOrDrive; import appeng.block.storage.DriveSlotState; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; /** * Utility class to render LEDs for storage cells from a Tile Entity Renderer. @@ -53,11 +51,11 @@ class CellLedRenderer { // Bottom Face R, B, FR, L, B, FR, L, B, BA, R, B, BA, }; - public static final RenderType RENDER_LAYER = RenderType.makeType("ae_drive_leds", - DefaultVertexFormats.POSITION_COLOR, 7, 32565, false, true, RenderType.State.getBuilder().build(false)); + public static final RenderLayer RENDER_LAYER = RenderLayer.of("ae_drive_leds", + VertexFormats.POSITION_COLOR, 7, 32565, false, true, RenderLayer.MultiPhaseParameters.builder().build(false)); - public static void renderLed(IChestOrDrive drive, int slot, IVertexBuilder buffer, MatrixStack ms, - float partialTicks) { + public static void renderLed(IChestOrDrive drive, int slot, VertexConsumer buffer, MatrixStack ms, + float partialTicks) { Vector3f color = getColorForSlot(drive, slot, partialTicks); if (color == null) { @@ -68,8 +66,8 @@ class CellLedRenderer { float x = LED_QUADS[i]; float y = LED_QUADS[i + 1]; float z = LED_QUADS[i + 2]; - buffer.pos(ms.getLast().getMatrix(), x, y, z).color(color.getX(), color.getY(), color.getZ(), 1.f) - .endVertex(); + buffer.vertex(ms.peek().getModel(), x, y, z).color(color.getX(), color.getY(), color.getZ(), 1.f) + .next(); } } diff --git a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java index 667fe91ac..7e0c6a324 100644 --- a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java @@ -25,56 +25,57 @@ import java.util.Random; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; +import appeng.client.render.BakedModelUnwrapper; +import appeng.client.render.model.AutoRotatingBakedModel; +import appeng.client.render.model.DriveBakedModel; +import appeng.tile.storage.ChestBlockEntity; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockModelRenderer; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.model.BakedQuad; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ModelManager; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.BlockModelRenderer; +import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Item; import net.minecraft.item.Items; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Direction; 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.DelegateBakedModel; import appeng.client.render.FacingToRotation; import appeng.core.Api; -import appeng.tile.storage.ChestTileEntity; /** * The tile entity renderer for ME chests takes care of rendering the right * model for the inserted cell, as well as the LED. */ -public class ChestTileEntityRenderer extends TileEntityRenderer { +public class ChestTileEntityRenderer extends BlockEntityRenderer { private final ICellModelRegistry cellModelRegistry = Api.instance().client().cells(); - private final ModelManager modelManager; + private final BakedModelManager modelManager; private final BlockModelRenderer blockRenderer; - public ChestTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { - super(rendererDispatcherIn); - Minecraft client = Minecraft.getInstance(); - modelManager = client.getModelManager(); - blockRenderer = client.getBlockRendererDispatcher().getBlockModelRenderer(); + public ChestTileEntityRenderer(BlockEntityRenderDispatcher renderDispatcher) { + super(renderDispatcher); + MinecraftClient client = MinecraftClient.getInstance(); + modelManager = client.getBakedModelManager(); + blockRenderer = client.getBlockRenderManager().getModelRenderer(); } @Override - public void render(ChestTileEntity chest, float partialTicks, MatrixStack matrices, IRenderTypeBuffer buffers, - int combinedLight, int combinedOverlay) { + public void render(ChestBlockEntity chest, float partialTicks, MatrixStack matrices, VertexConsumerProvider buffers, + int combinedLight, int combinedOverlay) { World world = chest.getWorld(); if (world == null) { @@ -88,12 +89,12 @@ 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); + BakedModel cellModel = driveModel.getCellChassisModel(cellItem); matrices.push(); matrices.translate(0.5, 0.5, 0.5); @@ -106,45 +107,49 @@ public class ChestTileEntityRenderer extends TileEntityRenderer matrices.translate(5 / 16.0, 4 / 16.0, 0); // Render the cell model as-if it was a block model - IVertexBuilder buffer = buffers.getBuffer(RenderType.getCutout()); + VertexConsumer buffer = buffers.getBuffer(RenderLayer.getCutout()); // We "fake" the position here to make it use the light-value in front of the // drive - FaceRotatingModel rotatedModel = new FaceRotatingModel(model, rotation); - blockRenderer.renderModel(world, rotatedModel, chest.getBlockState(), chest.getPos(), matrices, buffer, false, - new Random(), 0L, combinedOverlay, EmptyModelData.INSTANCE); + BakedModel rotatedModel = new FaceRotatingModel(cellModel, rotation); + blockRenderer.render(world, rotatedModel, chest.getCachedState(), chest.getPos(), matrices, buffer, false, + new Random(), 0L, combinedOverlay); - IVertexBuilder ledBuffer = buffers.getBuffer(CellLedRenderer.RENDER_LAYER); + VertexConsumer ledBuffer = buffers.getBuffer(CellLedRenderer.RENDER_LAYER); CellLedRenderer.renderLed(chest, 0, ledBuffer, matrices, partialTicks); matrices.pop(); } + private DriveBakedModel getDriveModel() { + BakedModel driveModel = modelManager.getBlockModels().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 * used to apply diffuse lighting and the lightmap texture. */ - private static class FaceRotatingModel extends DelegateBakedModel { + private static class FaceRotatingModel extends ForwardingBakedModel { private final FacingToRotation r; - protected FaceRotatingModel(IBakedModel base, FacingToRotation r) { - super(base); + protected FaceRotatingModel(BakedModel base, FacingToRotation r) { + this.wrapped = base; this.r = r; } @Nonnull @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, - @Nonnull IModelData extraData) { + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand) { if (side != null) { - side = r.rotate(side); // This fixes the incorrect lightmap position + side = r.resultingRotate(side); // This fixes the incorrect lightmap position } - List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData)); + List quads = new ArrayList<>(super.getQuads(state, side, rand)); for (int i = 0; i < quads.size(); i++) { BakedQuad quad = quads.get(i); - quads.set(i, new BakedQuad(quad.getVertexData(), quad.getTintIndex(), r.rotate(quad.getFace()), - quad.func_187508_a(), quad.shouldApplyDiffuseLighting())); + quads.set(i, new BakedQuad(quad.getVertexData(), quad.getColorIndex(), r.rotate(quad.getFace()), + /* FIXME FABRIC: sprite is protected but unused?? */ null, quad.hasShade())); } return quads; diff --git a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java index b81fe6b19..8bdc7ec1c 100644 --- a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java @@ -1,8 +1,7 @@ package appeng.client.render.tesr; -import net.minecraft.client.render.RenderLayer; +import appeng.client.render.model.DriveBakedModel; import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.util.math.MatrixStack; @@ -13,7 +12,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import appeng.client.render.FacingToRotation; -import appeng.client.render.model.DriveBakedModel; import appeng.tile.storage.DriveBlockEntity; /** @@ -22,8 +20,8 @@ import appeng.tile.storage.DriveBlockEntity; @Environment(EnvType.CLIENT) public class DriveLedTileEntityRenderer extends BlockEntityRenderer { - public DriveLedTileEntityRenderer(BlockEntityRendererDispatcher rendererDispatcher) { - super(rendererDispatcher); + public DriveLedTileEntityRenderer(BlockEntityRenderDispatcher renderDispatcher) { + super(renderDispatcher); } @Override diff --git a/src/main/java/appeng/container/implementations/PatternTermContainer.java b/src/main/java/appeng/container/implementations/PatternTermContainer.java index 4bb0ea76e..bb9fc3c00 100644 --- a/src/main/java/appeng/container/implementations/PatternTermContainer.java +++ b/src/main/java/appeng/container/implementations/PatternTermContainer.java @@ -28,6 +28,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.CraftingResultInventory; import net.minecraft.nbt.Tag; +import net.minecraft.recipe.CraftingRecipe; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeType; import net.minecraft.screen.slot.CraftingResultSlot; @@ -101,7 +102,7 @@ public class PatternTermContainer extends MEMonitorableContainer private final RestrictedInputSlot patternSlotOUT; private final ICraftingHelper craftingHelper = Api.INSTANCE.crafting(); - private Recipe currentRecipe; + private CraftingRecipe currentRecipe; @GuiSync(97) public boolean craftingMode = true; @GuiSync(96) @@ -242,7 +243,7 @@ public class PatternTermContainer extends MEMonitorableContainer } else { output = craftingHelper.encodeProcessingPattern(output, in, out); } - this.patternSlotOUT.putStack(output); + this.patternSlotOUT.setStack(output); } diff --git a/src/main/java/appeng/core/AddonLoader.java b/src/main/java/appeng/core/AddonLoader.java deleted file mode 100644 index 5b1bdd662..000000000 --- a/src/main/java/appeng/core/AddonLoader.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2020, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core; - -import java.util.Collection; -import java.util.Objects; -import java.util.Set; - -import org.objectweb.asm.Type; - -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData; -import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; - -import appeng.api.AEAddon; -import appeng.api.IAEAddon; -import appeng.api.IAppEngApi; - -/** - * Loads AE addons on startup and provides them with an {@link IAppEngApi} - * instance. - */ -class AddonLoader { - - public static void loadAddons(IAppEngApi api) { - final Type annotationType = Type.getType(AEAddon.class); - final Collection allScanData = ModList.get().getAllScanData(); - - allScanData.stream().map(ModFileScanData::getAnnotations).flatMap(Set::stream) - .filter(a -> Objects.equals(a.getAnnotationType(), annotationType)).map(AnnotationData::getMemberName) - .forEach(className -> { - try { - final Class clazz = Class.forName(className); - final Class instanceClass = clazz.asSubclass(IAEAddon.class); - final IAEAddon instance = instanceClass.newInstance(); - - instance.onAPIAvailable(api); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException - | LinkageError e) { - AELog.error("Failed to load: %s", className, e); - throw new RuntimeException(e); - } - }); - } -} diff --git a/src/main/java/appeng/core/AppEngBase.java b/src/main/java/appeng/core/AppEngBase.java index c15c6f36b..b8ef1de99 100644 --- a/src/main/java/appeng/core/AppEngBase.java +++ b/src/main/java/appeng/core/AppEngBase.java @@ -1,6 +1,6 @@ package appeng.core; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.features.AEFeature; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridCacheRegistry; @@ -348,7 +348,7 @@ public abstract class AppEngBase implements AppEng { return; } - BlockState quartzOre = AEApi.instance().definitions().blocks().quartzOre().block().getDefaultState(); + BlockState quartzOre = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); b.addFeature(GenerationStep.Feature.UNDERGROUND_ORES, Feature.ORE .configure(new OreFeatureConfig(OreFeatureConfig.Target.NATURAL_STONE, @@ -358,7 +358,7 @@ public abstract class AppEngBase implements AppEng { if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) { - BlockState chargedQuartzOre = AEApi.instance().definitions().blocks().quartzOreCharged().block() + BlockState chargedQuartzOre = Api.instance().definitions().blocks().quartzOreCharged().block() .getDefaultState(); b.addFeature(GenerationStep.Feature.UNDERGROUND_DECORATION, ChargedQuartzOreFeature.INSTANCE diff --git a/src/main/java/appeng/core/CreativeTab.java b/src/main/java/appeng/core/CreativeTab.java index b32b82234..bdd8e4cec 100644 --- a/src/main/java/appeng/core/CreativeTab.java +++ b/src/main/java/appeng/core/CreativeTab.java @@ -18,7 +18,7 @@ package appeng.core; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; @@ -39,7 +39,7 @@ public final class CreativeTab { public static void init() { INSTANCE = FabricItemGroupBuilder.create(AppEng.makeId("main")) .icon(() -> { - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IBlocks blocks = definitions.blocks(); return blocks.quartzOre().stack(1); // FIXME FABRIC blocks.controller().stack(1); }) diff --git a/src/main/java/appeng/core/api/ApiCrafting.java b/src/main/java/appeng/core/api/ApiCrafting.java index e4f710bc2..bee445985 100644 --- a/src/main/java/appeng/core/api/ApiCrafting.java +++ b/src/main/java/appeng/core/api/ApiCrafting.java @@ -26,11 +26,11 @@ import com.google.common.base.Preconditions; import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.ICraftingRecipe; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.item.crafting.RecipeManager; -import net.minecraft.util.ResourceLocation; +import net.minecraft.recipe.CraftingRecipe; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeManager; +import net.minecraft.recipe.RecipeType; +import net.minecraft.util.Identifier; import net.minecraft.world.World; import appeng.api.crafting.ICraftingHelper; @@ -64,8 +64,8 @@ public class ApiCrafting implements ICraftingHelper { } @Override - public ItemStack encodeCraftingPattern(@Nullable ItemStack stack, ICraftingRecipe recipe, ItemStack[] in, - ItemStack out, boolean allowSubstitutes) { + public ItemStack encodeCraftingPattern(@Nullable ItemStack stack, CraftingRecipe recipe, ItemStack[] in, + ItemStack out, boolean allowSubstitutes) { if (stack == null) { stack = encodedPattern.stack(1); } else { @@ -102,10 +102,10 @@ public class ApiCrafting implements ICraftingHelper { // The recipe ids encoded in a pattern can go stale. This code attempts to find // the new id // based on the stored inputs/outputs if that happens. - ResourceLocation recipeId = patternItem.getCraftingRecipeId(is); + Identifier recipeId = patternItem.getCraftingRecipeId(is); if (recipeId != null) { - IRecipe recipe = world.getRecipeManager().getRecipes(IRecipeType.CRAFTING).get(recipeId); - if (!(recipe instanceof ICraftingRecipe)) { + Recipe recipe = world.getRecipeManager().getAllOfType(RecipeType.CRAFTING).get(recipeId); + if (!(recipe instanceof CraftingRecipe)) { if (!autoRecovery || !attemptRecovery(patternItem, is, world)) { return null; } @@ -128,22 +128,22 @@ public class ApiCrafting implements ICraftingHelper { return false; } - ResourceLocation currentRecipeId = patternItem.getCraftingRecipeId(itemStack); + Identifier currentRecipeId = patternItem.getCraftingRecipeId(itemStack); // Fill a crafting inventory with the ingredients to find a suitable recipe CraftingInventory testInventory = new CraftingInventory(new ContainerNull(), 3, 3); for (int x = 0; x < 9; x++) { final IAEItemStack ais = ingredients.get(x); final ItemStack gs = ais != null ? ais.createItemStack() : ItemStack.EMPTY; - testInventory.setInventorySlotContents(x, gs); + testInventory.setStack(x, gs); } - ICraftingRecipe potentialRecipe = recipeManager.getRecipe(IRecipeType.CRAFTING, testInventory, world) + CraftingRecipe potentialRecipe = recipeManager.getFirstMatch(RecipeType.CRAFTING, testInventory, world) .orElse(null); if (potentialRecipe != null) { // Check that it matches the expected output - if (products.get(0).isSameType(potentialRecipe.getCraftingResult(testInventory))) { + if (products.get(0).isSameType(potentialRecipe.craft(testInventory))) { // Yay we found a match, reencode the pattern AELog.debug("Re-Encoding pattern from %s -> %s", currentRecipeId, potentialRecipe.getId()); ItemStack[] in = ingredients.stream().map(ais -> ais != null ? ais.createItemStack() : ItemStack.EMPTY) diff --git a/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java index 837b61970..5463251b2 100644 --- a/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java +++ b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java @@ -19,10 +19,9 @@ package appeng.core.api.client; -import java.util.Arrays; -import java.util.Collections; -import java.util.IdentityHashMap; -import java.util.Map; +import java.lang.reflect.Array; +import java.util.*; +import java.util.stream.Stream; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -30,48 +29,47 @@ import javax.annotation.Nullable; 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; +import net.minecraft.util.Identifier; public class ApiCellModelRegistry implements ICellModelRegistry { - private static final ResourceLocation MODEL_BASE = new ResourceLocation( + private static final Identifier MODEL_BASE = new Identifier( "appliedenergistics2:block/drive/drive_base"); - private static final ResourceLocation MODEL_CELL_EMPTY = new ResourceLocation( + private static final Identifier MODEL_CELL_EMPTY = new Identifier( "appliedenergistics2:block/drive/drive_cell_empty"); - private static final ResourceLocation MODEL_CELL_DEFAULT = new ResourceLocation( + private static final Identifier MODEL_CELL_DEFAULT = new Identifier( "appliedenergistics2:block/drive/drive_cell"); - private static final ResourceLocation MODEL_CELL_ITEMS_1K = new ResourceLocation( + private static final Identifier MODEL_CELL_ITEMS_1K = new Identifier( "appliedenergistics2:block/drive/cells/1k_item_cell"); - private static final ResourceLocation MODEL_CELL_ITEMS_4K = new ResourceLocation( + private static final Identifier MODEL_CELL_ITEMS_4K = new Identifier( "appliedenergistics2:block/drive/cells/4k_item_cell"); - private static final ResourceLocation MODEL_CELL_ITEMS_16K = new ResourceLocation( + private static final Identifier MODEL_CELL_ITEMS_16K = new Identifier( "appliedenergistics2:block/drive/cells/16k_item_cell"); - private static final ResourceLocation MODEL_CELL_ITEMS_64K = new ResourceLocation( + private static final Identifier MODEL_CELL_ITEMS_64K = new Identifier( "appliedenergistics2:block/drive/cells/64k_item_cell"); - private static final ResourceLocation MODEL_CELL_FLUIDS_1K = new ResourceLocation( + private static final Identifier MODEL_CELL_FLUIDS_1K = new Identifier( "appliedenergistics2:block/drive/cells/1k_fluid_cell"); - private static final ResourceLocation MODEL_CELL_FLUIDS_4K = new ResourceLocation( + private static final Identifier MODEL_CELL_FLUIDS_4K = new Identifier( "appliedenergistics2:block/drive/cells/4k_fluid_cell"); - private static final ResourceLocation MODEL_CELL_FLUIDS_16K = new ResourceLocation( + private static final Identifier MODEL_CELL_FLUIDS_16K = new Identifier( "appliedenergistics2:block/drive/cells/16k_fluid_cell"); - private static final ResourceLocation MODEL_CELL_FLUIDS_64K = new ResourceLocation( + private static final Identifier MODEL_CELL_FLUIDS_64K = new Identifier( "appliedenergistics2:block/drive/cells/64k_fluid_cell"); - private static final ResourceLocation MODEL_CELL_CREATIVE = new ResourceLocation( + private static final Identifier MODEL_CELL_CREATIVE = new Identifier( "appliedenergistics2:block/drive/cells/creative_cell"); - private static final ResourceLocation[] MODELS = { MODEL_BASE, MODEL_CELL_EMPTY, MODEL_CELL_DEFAULT, + private static final Identifier[] MODELS = { MODEL_BASE, MODEL_CELL_EMPTY, MODEL_CELL_DEFAULT, 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; + private final Map registry; public ApiCellModelRegistry(ApiDefinitions definitions) { this.registry = new IdentityHashMap<>(); @@ -88,7 +86,7 @@ public class ApiCellModelRegistry implements ICellModelRegistry { } @Override - public void registerModel(Item item, ResourceLocation model) { + public void registerModel(Item item, Identifier model) { Preconditions.checkNotNull(item); Preconditions.checkNotNull(model); Preconditions.checkArgument(!this.registry.containsKey(item), "Cannot register an item twice."); @@ -98,7 +96,7 @@ public class ApiCellModelRegistry implements ICellModelRegistry { @Override @Nullable - public ResourceLocation model(@Nonnull Item item) { + public Identifier model(@Nonnull Item item) { Preconditions.checkNotNull(item); return this.registry.get(item); @@ -106,13 +104,13 @@ public class ApiCellModelRegistry implements ICellModelRegistry { @Override @Nonnull - public Map models() { + public Map models() { return Collections.unmodifiableMap(this.registry); } @Override @Nonnull - public ResourceLocation getDefaultModel() { + public Identifier getDefaultModel() { return MODEL_CELL_DEFAULT; } diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index 694f756bf..8c963708c 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -364,10 +364,10 @@ public final class ApiBlocks implements IBlocks { .rendering(new DriveRendering()).build(); this.chest = registry.block("chest", ChestBlock::new).features(AEFeature.STORAGE_CELLS, AEFeature.ME_CHEST) .tileEntity(registry.tileEntity("chest", ChestBlockEntity.class, ChestBlockEntity::new) - .rendering(new TileEntityRenderingCustomizer() { + .rendering(new TileEntityRenderingCustomizer() { @Override - @OnlyIn(Dist.CLIENT) - public void customize(TileEntityRendering rendering) { + @Environment(EnvType.CLIENT) + public void customize(TileEntityRendering rendering) { rendering.tileEntityRenderer(ChestTileEntityRenderer::new); } }).build()) diff --git a/src/main/java/appeng/core/api/definitions/ApiParts.java b/src/main/java/appeng/core/api/definitions/ApiParts.java index 625fd39f3..8e7790781 100644 --- a/src/main/java/appeng/core/api/definitions/ApiParts.java +++ b/src/main/java/appeng/core/api/definitions/ApiParts.java @@ -65,7 +65,6 @@ import appeng.parts.networking.GlassCablePart; import appeng.parts.networking.QuartzFiberPart; import appeng.parts.networking.SmartCablePart; import appeng.parts.networking.SmartDenseCablePart; -import appeng.parts.p2p.FEP2PTunnelPart; import appeng.parts.p2p.FluidP2PTunnelPart; import appeng.parts.p2p.ItemP2PTunnelPart; import appeng.parts.p2p.LightP2PTunnelPart; diff --git a/src/main/java/appeng/core/features/registries/MovableTileRegistry.java b/src/main/java/appeng/core/features/registries/MovableTileRegistry.java index 1e81c015d..fa73ef330 100644 --- a/src/main/java/appeng/core/features/registries/MovableTileRegistry.java +++ b/src/main/java/appeng/core/features/registries/MovableTileRegistry.java @@ -26,10 +26,7 @@ import java.util.Map; import java.util.Set; import net.minecraft.block.Block; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag; import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.ResourceLocation; import appeng.api.exceptions.AppEngException; import appeng.api.movable.IMovableHandler; @@ -38,11 +35,14 @@ import appeng.api.movable.IMovableTile; import appeng.core.AEConfig; import appeng.core.AppEng; import appeng.spatial.DefaultSpatialHandler; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; public class MovableTileRegistry implements IMovableRegistry { - private static final ResourceLocation TAG_WHITELIST = new ResourceLocation(AppEng.MOD_ID, "spatial/whitelist"); - private static final ResourceLocation TAG_BLACKLIST = new ResourceLocation(AppEng.MOD_ID, "spatial/blacklist"); + private static final Identifier TAG_WHITELIST = new Identifier(AppEng.MOD_ID, "spatial/whitelist"); + private static final Identifier TAG_BLACKLIST = new Identifier(AppEng.MOD_ID, "spatial/blacklist"); private final Set blacklisted = new HashSet<>(); @@ -55,8 +55,8 @@ public class MovableTileRegistry implements IMovableRegistry { private final Tag blockTagBlackList; public MovableTileRegistry() { - this.blockTagWhiteList = BlockTags.getCollection().getOrCreate(TAG_WHITELIST); - this.blockTagBlackList = BlockTags.getCollection().getOrCreate(TAG_BLACKLIST); + this.blockTagWhiteList = BlockTags.getContainer().getOrCreate(TAG_WHITELIST); + this.blockTagBlackList = BlockTags.getContainer().getOrCreate(TAG_BLACKLIST); } @Override @@ -120,7 +120,7 @@ public class MovableTileRegistry implements IMovableRegistry { // if the block itself is via block tags if (AEConfig.instance().getSpatialBlockTags() - && this.blockTagWhiteList.contains(te.getBlockState().getBlock())) { + && this.blockTagWhiteList.contains(te.getCachedState().getBlock())) { this.valid.put(myClass, this.dsh); return this.dsh; } diff --git a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java index 8fa3a85ab..8bad27302 100644 --- a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java +++ b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java @@ -20,10 +20,6 @@ package appeng.core.features.registries; import java.util.HashSet; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.IWorld; -import net.minecraft.world.dimension.Dimension; - import appeng.api.features.IWorldGen; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; diff --git a/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java b/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java index 46861f89e..2c3470eec 100644 --- a/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java +++ b/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java @@ -101,7 +101,7 @@ public class BlockTransitionEffectPacket extends BasePacket { playBreakOrPickupSound(); } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void spawnParticles() { EnergyParticleData data = new EnergyParticleData(false, direction); @@ -120,7 +120,7 @@ public class BlockTransitionEffectPacket extends BasePacket { } } - @OnlyIn(Dist.CLIENT) + @Environment(EnvType.CLIENT) private void playBreakOrPickupSound() { SoundEvent soundEvent; diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 87495be59..fabcc92fa 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -18,7 +18,7 @@ package appeng.crafting; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.Actionable; import appeng.api.networking.crafting.ICraftingGrid; import appeng.api.networking.crafting.ICraftingPatternDetails; diff --git a/src/main/java/appeng/debug/ReplicatorCardItem.java b/src/main/java/appeng/debug/ReplicatorCardItem.java index 07fc51d8b..4f68578c4 100644 --- a/src/main/java/appeng/debug/ReplicatorCardItem.java +++ b/src/main/java/appeng/debug/ReplicatorCardItem.java @@ -30,14 +30,12 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.block.entity.BlockEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.*; import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; import net.minecraft.util.math.Direction; -import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.text.LiteralText; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; @@ -58,9 +56,9 @@ public class ReplicatorCardItem extends AEBaseItem implements AEToolItem { } @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - if (!worldIn.isRemote()) { - final CompoundNBT tag = playerIn.getHeldItem(handIn).getOrCreateTag(); + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + if (!world.isClient()) { + final CompoundTag tag = user.getStackInHand(hand).getOrCreateTag(); final int replications; if (tag.contains("r")) { @@ -71,10 +69,10 @@ public class ReplicatorCardItem extends AEBaseItem implements AEToolItem { tag.putInt("r", replications); - playerIn.sendMessage(new StringTextComponent((replications + 1) + "³ Replications")); + user.sendMessage(new LiteralText((replications + 1) + "³ Replications"), true); } - return super.onItemRightClick(worldIn, playerIn, handIn); + return super.use(world, user, hand); } @Override @@ -154,9 +152,9 @@ public class ReplicatorCardItem extends AEBaseItem implements AEToolItem { final int min_z = min.z; // Invert to maintain correct sign for west/east - final int x_rot = (int) -Math.signum(MathHelper.wrapDegrees(player.rotationYaw)); + final int x_rot = (int) -Math.signum(MathHelper.wrapDegrees(player.yaw)); // Rotate by 90 degree, so north/south are negative/positive - final int z_rot = (int) Math.signum(MathHelper.wrapDegrees(player.rotationYaw + 90)); + final int z_rot = (int) Math.signum(MathHelper.wrapDegrees(player.yaw + 90)); // Loops for replication in each direction for (int r_x = 0; r_x < replications; r_x++) { diff --git a/src/main/java/appeng/entity/SingularityEntity.java b/src/main/java/appeng/entity/SingularityEntity.java index 6cd54bbf0..cd406f55c 100644 --- a/src/main/java/appeng/entity/SingularityEntity.java +++ b/src/main/java/appeng/entity/SingularityEntity.java @@ -25,9 +25,12 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.ResourceLocation; +import net.minecraft.tag.ItemTags; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; import net.minecraft.util.math.Box; import net.minecraft.world.World; @@ -39,7 +42,7 @@ import appeng.util.Platform; public final class SingularityEntity extends AEBaseItemEntity { - private static final ResourceLocation TAG_ENDER_PEARL = new ResourceLocation("forge:ender_pearls"); + private static final Identifier TAG_ENDER_PEARL = new Identifier("c:ender_pearls"); public static EntityType TYPE; @@ -93,7 +96,8 @@ public final class SingularityEntity extends AEBaseItemEntity { // check... other name. if (!matches) { - if (other.getItem().getTags().contains(TAG_ENDER_PEARL)) { + Tag tag = ItemTags.getContainer().get(TAG_ENDER_PEARL); + if (tag != null && other.getItem().isIn(tag)) { matches = true; } } diff --git a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java index 4ce255f95..0eca1aec3 100644 --- a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java +++ b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java @@ -18,7 +18,7 @@ package appeng.entity; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.features.AEFeature; import appeng.core.AEConfig; import appeng.core.sync.packets.ICustomEntity; @@ -100,7 +100,7 @@ public final class TinyTNTPrimedEntity extends TntEntity implements ICustomEntit this.updateWaterState(); if (this.isSubmergedInWater() && Platform.isServer()) // put out the fuse. { - AEApi.instance().definitions().blocks().tinyTNT().maybeStack(1).ifPresent(tntStack -> { + Api.instance().definitions().blocks().tinyTNT().maybeStack(1).ifPresent(tntStack -> { final ItemEntity item = new ItemEntity(this.world, this.getX(), this.getY(), this.getZ(), tntStack); diff --git a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java index 56119f51b..3fc69b63b 100644 --- a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java +++ b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java @@ -52,7 +52,6 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; -import appeng.capabilities.Capabilities; import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.fluids.util.AEFluidInventory; diff --git a/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java b/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java index dd4f3cae3..15cce92c0 100644 --- a/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java +++ b/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java @@ -4,7 +4,7 @@ package appeng.fluids.parts; import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.IncludeExclude; diff --git a/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java b/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java index 126a57a56..1056d5ce6 100644 --- a/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java +++ b/src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java @@ -23,7 +23,7 @@ import alexiil.mc.lib.attributes.fluid.GroupedFluidInv; import alexiil.mc.lib.attributes.fluid.filter.ExactFluidFilter; import alexiil.mc.lib.attributes.fluid.filter.FluidFilter; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; import appeng.api.networking.storage.IBaseMonitor; diff --git a/src/main/java/appeng/helpers/CraftingPatternDetails.java b/src/main/java/appeng/helpers/CraftingPatternDetails.java index e1cc6ef8e..d9dc95d28 100644 --- a/src/main/java/appeng/helpers/CraftingPatternDetails.java +++ b/src/main/java/appeng/helpers/CraftingPatternDetails.java @@ -31,9 +31,9 @@ import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.CraftingRecipe; +import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeType; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; +import net.minecraft.util.Identifier; import net.minecraft.world.World; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -70,7 +70,7 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab final List ingredients = templateItem.getIngredients(itemStack); final List products = templateItem.getProducts(itemStack); - final ResourceLocation recipeId = templateItem.getCraftingRecipeId(itemStack); + final Identifier recipeId = templateItem.getCraftingRecipeId(itemStack); this.pattern = is.copy(); this.isCraftable = recipeId != null; @@ -94,13 +94,13 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab } if (this.isCraftable) { - IRecipe recipe = w.getRecipeManager().getRecipes(IRecipeType.CRAFTING).get(recipeId); + Recipe recipe = w.getRecipeManager().getAllOfType(RecipeType.CRAFTING).get(recipeId); - if (recipe == null || recipe.getType() != IRecipeType.CRAFTING) { + if (recipe == null || recipe.getType() != RecipeType.CRAFTING) { throw new IllegalStateException("recipe id is not a crafting recipe"); } - this.standardRecipe = (ICraftingRecipe) recipe; + this.standardRecipe = (CraftingRecipe) recipe; this.correctOutput = this.standardRecipe.craft(this.crafting); out.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class) diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index b6cb9e242..8ab68d1c2 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -87,7 +87,6 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; -import appeng.capabilities.Capabilities; import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.me.GridAccessException; diff --git a/src/main/java/appeng/hooks/ClientTickHandler.java b/src/main/java/appeng/hooks/ClientTickHandler.java index b82dce988..ad3e2c71a 100644 --- a/src/main/java/appeng/hooks/ClientTickHandler.java +++ b/src/main/java/appeng/hooks/ClientTickHandler.java @@ -1,6 +1,6 @@ package appeng.hooks; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.parts.CableRenderMode; import appeng.client.AppEngClient; import appeng.util.Platform; @@ -31,7 +31,7 @@ public class ClientTickHandler extends TickHandler { private void onBeforeClientTick(MinecraftClient client) { this.tickColors(this.cliPlayerColors); - final CableRenderMode currentMode = AEApi.instance().partHelper().getCableRenderMode(); + final CableRenderMode currentMode = Api.instance().partHelper().getCableRenderMode(); if (currentMode != this.crm) { this.crm = currentMode; AppEngClient.instance().triggerUpdates(); diff --git a/src/main/java/appeng/integration/modules/jei/CondenserOutputDisplay.java b/src/main/java/appeng/integration/modules/jei/CondenserOutputDisplay.java index 5efd85cc0..173f656ff 100644 --- a/src/main/java/appeng/integration/modules/jei/CondenserOutputDisplay.java +++ b/src/main/java/appeng/integration/modules/jei/CondenserOutputDisplay.java @@ -1,6 +1,6 @@ package appeng.integration.modules.jei; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.CondenserOutput; import appeng.api.definitions.IMaterials; import appeng.api.implementations.items.IStorageComponent; @@ -62,7 +62,7 @@ public class CondenserOutputDisplay implements RecipeDisplay { } private List getViableStorageComponents(CondenserOutput condenserOutput) { - IMaterials materials = AEApi.instance().definitions().materials(); + IMaterials materials = Api.instance().definitions().materials(); List viableComponents = new ArrayList<>(); this.addViableComponent(condenserOutput, viableComponents, materials.cell1kPart().stack(1)); this.addViableComponent(condenserOutput, viableComponents, materials.cell4kPart().stack(1)); diff --git a/src/main/java/appeng/integration/modules/jei/ReiPlugin.java b/src/main/java/appeng/integration/modules/jei/ReiPlugin.java index c40d41a4e..b48f5aeba 100644 --- a/src/main/java/appeng/integration/modules/jei/ReiPlugin.java +++ b/src/main/java/appeng/integration/modules/jei/ReiPlugin.java @@ -18,7 +18,7 @@ package appeng.integration.modules.jei; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.CondenserOutput; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; @@ -92,14 +92,14 @@ public class ReiPlugin implements REIPluginV0 { @Override public void postRegister() { - IDefinitions definitions = AEApi.instance().definitions(); + IDefinitions definitions = Api.instance().definitions(); registerDescriptions(definitions); ReiFacade.setInstance(new ReiRuntimeAdapter()); } private void registerWorkingStations(RecipeHelper registration) { - IDefinitions definitions = AEApi.instance().definitions(); + IDefinitions definitions = Api.instance().definitions(); ItemStack grindstone = definitions.blocks().grindstone().stack(1); registration.registerWorkingStations(GrinderRecipeCategory.UID, EntryStack.create(grindstone)); diff --git a/src/main/java/appeng/items/misc/EncodedPatternItem.java b/src/main/java/appeng/items/misc/EncodedPatternItem.java index c24b9ca55..dcf84ed00 100644 --- a/src/main/java/appeng/items/misc/EncodedPatternItem.java +++ b/src/main/java/appeng/items/misc/EncodedPatternItem.java @@ -23,30 +23,26 @@ import java.util.List; import java.util.Map; import java.util.WeakHashMap; +import appeng.core.Api; import appeng.hooks.AEToolItem; +import net.fabricmc.fabric.api.util.NbtType; import net.minecraft.client.item.TooltipContext; import com.google.common.base.Preconditions; -import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.text.LiteralText; import net.minecraft.text.MutableText; -import net.minecraft.util.TypedActionResult; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; +import net.minecraft.util.*; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import net.minecraft.world.World; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraftforge.common.util.Constants; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.channels.IItemStorageChannel; @@ -56,7 +52,7 @@ import appeng.helpers.InvalidPatternHelper; import appeng.items.AEBaseItem; import appeng.util.Platform; -public class EncodedPatternItem extends AEBaseItem, AEToolItem { +public class EncodedPatternItem extends AEBaseItem implements AEToolItem { public static final String NBT_INGREDIENTS = "in"; public static final String NBT_PRODUCTS = "out"; @@ -212,32 +208,32 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { public boolean isEncodedPattern(ItemStack itemStack) { return itemStack != null && !itemStack.isEmpty() && itemStack.getItem() == this && itemStack.getTag() != null - && itemStack.getTag().contains(NBT_INGREDIENTS, Constants.NBT.TAG_LIST) - && itemStack.getTag().contains(NBT_PRODUCTS, Constants.NBT.TAG_LIST); + && itemStack.getTag().contains(NBT_INGREDIENTS, NbtType.LIST) + && itemStack.getTag().contains(NBT_PRODUCTS, NbtType.LIST); } - public ResourceLocation getCraftingRecipeId(ItemStack itemStack) { + public Identifier getCraftingRecipeId(ItemStack itemStack) { Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", itemStack); - final CompoundNBT tag = itemStack.getTag(); + final CompoundTag tag = itemStack.getTag(); Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); - return new ResourceLocation(tag.getString(NBT_RECIPE_ID)); + return new Identifier(tag.getString(NBT_RECIPE_ID)); } public List getIngredients(ItemStack itemStack) { Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", itemStack); - final CompoundNBT tag = itemStack.getTag(); + final CompoundTag tag = itemStack.getTag(); Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); - final ListNBT inTag = tag.getList(NBT_INGREDIENTS, 10); + final ListTag inTag = tag.getList(NBT_INGREDIENTS, 10); Preconditions.checkArgument(inTag.size() < 10, "Cannot use more than 9 ingredients"); final List in = new ArrayList<>(inTag.size()); for (int x = 0; x < inTag.size(); x++) { - CompoundNBT ingredient = inTag.getCompound(x); - final ItemStack gs = ItemStack.read(ingredient); + CompoundTag ingredient = inTag.getCompound(x); + final ItemStack gs = ItemStack.fromTag(ingredient); Preconditions.checkArgument(!(!ingredient.isEmpty() && gs.isEmpty()), "invalid itemStack in slot", x); @@ -250,16 +246,16 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { public List getProducts(ItemStack itemStack) { Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", itemStack); - final CompoundNBT tag = itemStack.getTag(); + final CompoundTag tag = itemStack.getTag(); Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); - final ListNBT outTag = tag.getList(NBT_PRODUCTS, 10); + final ListTag outTag = tag.getList(NBT_PRODUCTS, 10); Preconditions.checkArgument(outTag.size() < 4, "Cannot use more than 3 ingredients"); final List out = new ArrayList<>(outTag.size()); for (int x = 0; x < outTag.size(); x++) { - CompoundNBT ingredient = outTag.getCompound(x); - final ItemStack gs = ItemStack.read(ingredient); + CompoundTag ingredient = outTag.getCompound(x); + final ItemStack gs = ItemStack.fromTag(ingredient); Preconditions.checkArgument(!(!ingredient.isEmpty() && gs.isEmpty()), "invalid itemStack in slot", x); @@ -271,7 +267,7 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { } public boolean allowsSubstitution(ItemStack itemStack) { - final CompoundNBT tag = itemStack.getTag(); + final CompoundTag tag = itemStack.getTag(); Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); @@ -282,8 +278,8 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { * Use the public API instead {@link appeng.core.api.ApiCrafting} */ public static void encodeCraftingPattern(ItemStack stack, ItemStack[] in, ItemStack[] out, - ResourceLocation recipeId, boolean allowSubstitutes) { - CompoundNBT encodedValue = encodeInputsAndOutputs(in, out); + Identifier recipeId, boolean allowSubstitutes) { + CompoundTag encodedValue = encodeInputsAndOutputs(in, out); encodedValue.putString(EncodedPatternItem.NBT_RECIPE_ID, recipeId.toString()); encodedValue.putBoolean(EncodedPatternItem.NBT_SUBSITUTE, allowSubstitutes); stack.setTag(encodedValue); @@ -296,11 +292,11 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { stack.setTag(encodeInputsAndOutputs(in, out)); } - private static CompoundNBT encodeInputsAndOutputs(ItemStack[] in, ItemStack[] out) { - final CompoundNBT encodedValue = new CompoundNBT(); + private static CompoundTag encodeInputsAndOutputs(ItemStack[] in, ItemStack[] out) { + final CompoundTag encodedValue = new CompoundTag(); - final ListNBT tagIn = new ListNBT(); - final ListNBT tagOut = new ListNBT(); + final ListTag tagIn = new ListTag(); + final ListTag tagOut = new ListTag(); for (final ItemStack i : in) { tagIn.add(createItemTag(i)); @@ -315,11 +311,11 @@ public class EncodedPatternItem extends AEBaseItem, AEToolItem { return encodedValue; } - private static INBT createItemTag(final ItemStack i) { - final CompoundNBT c = new CompoundNBT(); + private static Tag createItemTag(final ItemStack i) { + final CompoundTag c = new CompoundTag(); if (!i.isEmpty()) { - i.write(c); + i.toTag(c); } return c; diff --git a/src/main/java/appeng/items/parts/FacadeItem.java b/src/main/java/appeng/items/parts/FacadeItem.java index fce701555..691582a46 100644 --- a/src/main/java/appeng/items/parts/FacadeItem.java +++ b/src/main/java/appeng/items/parts/FacadeItem.java @@ -28,12 +28,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayers; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.tag.BlockTags; import net.minecraft.tag.Tag; diff --git a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java index 2f3ff1e5d..3b5e1af45 100644 --- a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java +++ b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java @@ -19,7 +19,7 @@ package appeng.items.tools.powered; import alexiil.mc.lib.attributes.item.FixedItemInv; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.implementations.items.IStorageCell; diff --git a/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java b/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java index 141a23a37..033de6ca0 100644 --- a/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java +++ b/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java @@ -33,11 +33,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.recipe.RecipeType; import net.minecraft.particle.ParticleTypes; import net.minecraft.recipe.SmeltingRecipe; @@ -45,11 +41,8 @@ import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.state.property.Properties; import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; import net.minecraft.util.Hand; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; +import net.minecraft.util.TypedActionResult; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; diff --git a/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java b/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java index fd753d2ca..e11832c70 100644 --- a/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java +++ b/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java @@ -35,7 +35,7 @@ import net.minecraft.util.Hand; import net.minecraft.text.Text; import net.minecraft.world.World; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.Actionable; import appeng.api.config.Settings; import appeng.api.config.SortDir; diff --git a/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java b/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java index 5232fab68..9cae93b36 100644 --- a/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java +++ b/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java @@ -25,7 +25,7 @@ import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; import alexiil.mc.lib.attributes.fluid.filter.ExactFluidFilter; import alexiil.mc.lib.attributes.fluid.volume.FluidKey; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.StorageFilter; diff --git a/src/main/java/appeng/mixins/BakedModelManagerAccessor.java b/src/main/java/appeng/mixins/BakedModelManagerAccessor.java new file mode 100644 index 000000000..f3efbbda1 --- /dev/null +++ b/src/main/java/appeng/mixins/BakedModelManagerAccessor.java @@ -0,0 +1,17 @@ +package appeng.mixins; + +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(BakedModelManager.class) +public interface BakedModelManagerAccessor { + + @Accessor + Map getModels(); + +} diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index 78747b900..8e19feab6 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -18,7 +18,7 @@ package appeng.parts; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.definitions.IBlockDefinition; import appeng.api.parts.*; import appeng.api.util.AEPartLocation; diff --git a/src/main/java/appeng/spatial/CachedPlane.java b/src/main/java/appeng/spatial/CachedPlane.java index 9169f94b1..9dfe90a69 100644 --- a/src/main/java/appeng/spatial/CachedPlane.java +++ b/src/main/java/appeng/spatial/CachedPlane.java @@ -18,7 +18,7 @@ package appeng.spatial; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.movable.IMovableHandler; import appeng.api.movable.IMovableRegistry; import appeng.api.util.AEPartLocation; diff --git a/src/main/java/appeng/spatial/StorageChunkGenerator.java b/src/main/java/appeng/spatial/StorageChunkGenerator.java index a98f91527..485463083 100644 --- a/src/main/java/appeng/spatial/StorageChunkGenerator.java +++ b/src/main/java/appeng/spatial/StorageChunkGenerator.java @@ -18,7 +18,7 @@ package appeng.spatial; -import appeng.api.AEApi; +import appeng.core.Api; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; diff --git a/src/main/java/appeng/spatial/StorageHelper.java b/src/main/java/appeng/spatial/StorageHelper.java index 846cb27fb..92bf6dbca 100644 --- a/src/main/java/appeng/spatial/StorageHelper.java +++ b/src/main/java/appeng/spatial/StorageHelper.java @@ -18,7 +18,7 @@ package appeng.spatial; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.util.WorldCoord; import appeng.core.AppEng; import net.minecraft.block.Block; diff --git a/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java b/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java index dda4e412b..396b62087 100644 --- a/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingBlockEntity.java @@ -246,7 +246,7 @@ public class CraftingBlockEntity extends AENetworkBlockEntity implements IAEMult // Since breaking the cluster will most likely also update the TE's state, // it's essential that we're not working with outdated block-state information, // since this particular TE's block might already have been removed (state=air) - updateContainingBlockInfo(); + resetBlock(); if (this.cluster != null) { this.cluster.cancel(); diff --git a/src/main/java/appeng/tile/inventory/AppEngCellInventory.java b/src/main/java/appeng/tile/inventory/AppEngCellInventory.java index f27870a74..0d50525df 100644 --- a/src/main/java/appeng/tile/inventory/AppEngCellInventory.java +++ b/src/main/java/appeng/tile/inventory/AppEngCellInventory.java @@ -4,7 +4,7 @@ package appeng.tile.inventory; import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.item.filter.ItemFilter; import alexiil.mc.lib.attributes.item.impl.DelegatingFixedItemInv; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.storage.cells.ICellInventory; import appeng.api.storage.cells.ICellInventoryHandler; import appeng.util.inv.IAEAppEngInventory; @@ -12,7 +12,7 @@ import net.minecraft.item.ItemStack; public class AppEngCellInventory extends DelegatingFixedItemInv { private static final ItemFilter CELL_FILTER = stack -> !stack.isEmpty() - && AEApi.instance().registries().cell().isCellHandled(stack); + && Api.instance().registries().cell().isCellHandled(stack); private final ICellInventoryHandler[] handlerForSlot; diff --git a/src/main/java/appeng/tile/misc/InscriberRecipes.java b/src/main/java/appeng/tile/misc/InscriberRecipes.java index 67f9a0f80..8df908d55 100644 --- a/src/main/java/appeng/tile/misc/InscriberRecipes.java +++ b/src/main/java/appeng/tile/misc/InscriberRecipes.java @@ -1,6 +1,6 @@ package appeng.tile.misc; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.definitions.IComparableDefinition; import appeng.api.features.InscriberProcessType; import appeng.core.Api; diff --git a/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java b/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java index 27ef2ed87..85ac5f5d7 100644 --- a/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java +++ b/src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java @@ -286,7 +286,7 @@ public class QuantumBridgeBlockEntity extends AENetworkInvBlockEntity implements // Since breaking the cluster will most likely also update the TE's state, // it's essential that we're not working with outdated block-state information, // since this particular TE's block might already have been removed (state=air) - updateContainingBlockInfo(); + resetBlock(); if (this.cluster != null) { this.cluster.destroy(); diff --git a/src/main/java/appeng/tile/storage/ChestBlockEntity.java b/src/main/java/appeng/tile/storage/ChestBlockEntity.java index d635ae2d9..d811ea610 100644 --- a/src/main/java/appeng/tile/storage/ChestBlockEntity.java +++ b/src/main/java/appeng/tile/storage/ChestBlockEntity.java @@ -27,7 +27,7 @@ import alexiil.mc.lib.attributes.fluid.filter.ConstantFluidFilter; import alexiil.mc.lib.attributes.fluid.filter.FluidFilter; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; import alexiil.mc.lib.attributes.item.FixedItemInv; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.*; import appeng.api.implementations.tiles.IColorableTile; import appeng.api.implementations.tiles.IMEChest; @@ -74,6 +74,7 @@ import net.minecraft.block.entity.BlockEntityType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.PacketByteBuf; import net.minecraft.screen.ScreenHandlerType; @@ -258,7 +259,7 @@ public class ChestBlockEntity extends AENetworkPowerBlockEntity return null; } // Client-side we'll need to actually use the synced state - if (world == null || world.isRemote) { + if (world == null || world.isClient) { return cellItem; } ItemStack cell = getCell(); @@ -357,7 +358,7 @@ public class ChestBlockEntity extends AENetworkPowerBlockEntity // when it changes from // empty->non-empty, so when the cell is changed, it should re-send the state // because of that - data.writeRegistryIdUnsafe(ForgeRegistries.ITEMS, getCell().getItem().getRegistryName()); + data.writeVarInt(Item.getRawId(getCell().getItem())); } @Override @@ -369,7 +370,7 @@ public class ChestBlockEntity extends AENetworkPowerBlockEntity this.state = data.readByte(); final AEColor oldPaintedColor = this.paintedColor; this.paintedColor = AEColor.values()[data.readByte()]; - this.cellItem = data.readRegistryIdUnsafe(ForgeRegistries.ITEMS); + this.cellItem = Item.byRawId(data.readVarInt()); this.lastStateChange = this.world.getTime(); diff --git a/src/main/java/appeng/tile/storage/DriveBlockEntity.java b/src/main/java/appeng/tile/storage/DriveBlockEntity.java index 7e0cf71c7..b5be38e32 100644 --- a/src/main/java/appeng/tile/storage/DriveBlockEntity.java +++ b/src/main/java/appeng/tile/storage/DriveBlockEntity.java @@ -30,6 +30,7 @@ import java.util.Map; import javax.annotation.Nullable; import alexiil.mc.lib.attributes.item.FixedItemInv; +import appeng.client.render.model.DriveModelData; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.screen.ScreenHandlerType; @@ -37,7 +38,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.Identifier; import appeng.api.implementations.tiles.IChestOrDrive; import appeng.api.networking.GridFlags; @@ -59,7 +59,6 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.block.storage.DriveSlotsState; -import appeng.client.render.model.DriveModelData; import appeng.container.implementations.DriveContainer; import appeng.core.Api; import appeng.helpers.IPriorityHost; @@ -70,9 +69,7 @@ import appeng.tile.grid.AENetworkInvBlockEntity; import appeng.tile.inventory.AppEngCellInventory; import appeng.util.Platform; import appeng.util.inv.InvOperation; -import appeng.util.inv.filter.IAEItemFilter; import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; public class DriveBlockEntity extends AENetworkInvBlockEntity implements IChestOrDrive, IPriorityHost { diff --git a/src/main/java/appeng/util/Platform.java b/src/main/java/appeng/util/Platform.java index 594a1277c..12d63b294 100644 --- a/src/main/java/appeng/util/Platform.java +++ b/src/main/java/appeng/util/Platform.java @@ -19,7 +19,7 @@ package appeng.util; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.*; import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IMaterials; diff --git a/src/main/resources/appliedenergistics2.accesswidener b/src/main/resources/appliedenergistics2.accesswidener index 46f1851fc..6b586257b 100644 --- a/src/main/resources/appliedenergistics2.accesswidener +++ b/src/main/resources/appliedenergistics2.accesswidener @@ -18,3 +18,5 @@ accessible method net/minecraft/data/server/BlockLootTableGenerator dropsWithSil accessible method net/minecraft/data/server/BlockLootTableGenerator applyExplosionDecay (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/loot/function/LootFunctionConsumingBuilder;)Ljava/lang/Object; accessible method net/minecraft/world/dimension/DimensionType (Ljava/util/OptionalLong;ZZZZZZZZZILnet/minecraft/util/Identifier;F)V + +accessible method net/minecraft/recipe/RecipeManager getAllOfType (Lnet/minecraft/recipe/RecipeType;)Ljava/util/Map; diff --git a/src/main/resources/appliedenergistics2.mixins.json b/src/main/resources/appliedenergistics2.mixins.json index 2083755e3..b721ea096 100644 --- a/src/main/resources/appliedenergistics2.mixins.json +++ b/src/main/resources/appliedenergistics2.mixins.json @@ -16,7 +16,8 @@ ], "client": [ "ModelsReloadMixin", - "RenderPhaseMixin" + "RenderPhaseMixin", + "BakedModelManagerAccessor" ], "server": [], "injectors": { diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive.json b/src/main/resources/assets/appliedenergistics2/models/block/drive.json deleted file mode 100644 index 33651b72b..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "loader": "appliedenergistics2:drive" -} diff --git a/src/unported/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json similarity index 100% rename from src/unported/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json rename to src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json diff --git a/src/unported/java/appeng/client/render/model/DriveBakedModel.java b/src/unported/java/appeng/client/render/model/DriveBakedModel.java deleted file mode 100644 index 73f95f00b..000000000 --- a/src/unported/java/appeng/client/render/model/DriveBakedModel.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.client.render.model; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.util.math.Direction; -import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; - -import appeng.block.storage.DriveSlotsState; -import appeng.client.render.DelegateBakedModel; - -public class DriveBakedModel extends DelegateBakedModel { - private final Map bakedCells; - private final IBakedModel defaultCell; - - public DriveBakedModel(BakedModel bakedBase, Map cellModels, IBakedModel defaultCell) { - super(bakedBase); - this.bakedCells = cellModels; - this.defaultCell = defaultCell; - } - - /** - * Calculates the origin of a drive slot for positioning a cell model into it. - */ - public static void getSlotOrigin(int row, int col, Vector3f translation) { - // Position this drive model copy at the correct slot. The transform is based on - // the cell-model being in slot 0,0,0 while the upper left slot's origin is at - // 9,13,1 - float xOffset = (9 - col * 8) / 16.0f; - float yOffset = (13 - row * 3) / 16.0f; - float zOffset = 1 / 16.0f; - translation.set(xOffset, yOffset, zOffset); - } - - @Nonnull - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, - @Nonnull IModelData extraData) { - - List result = new ArrayList<>(super.getQuads(state, side, rand, extraData)); - - if (!(extraData instanceof DriveModelData)) { - return result; - } - DriveModelData driveModelData = (DriveModelData) extraData; - - DriveSlotsState slotsState = driveModelData.getSlotsState(); - - Vector3f slotTranslation = new Vector3f(); - if (slotsState != null) { - for (int row = 0; row < 5; row++) { - for (int col = 0; col < 2; col++) { - Matrix4f transform = new Matrix4f(); - - getSlotOrigin(row, col, slotTranslation); - transform.addToLastColumn(new Vector3f(slotTranslation.getX(), slotTranslation.getY(), slotTranslation.getZ())); - - int slot = row * 2 + col; - - // Add the drive chassis - Item cell = slotsState.getCell(slot); - BakedModel cellChassisModel = getCellChassisModel(cell); - addModel(state, rand, extraData, result, side, cellChassisModel, transform); - } - } - } - - return result; - } - - @Override - public boolean useAmbientOcclusion() { - // We have faces inside the chassis that are facing east, but should not receive - // ambient occlusion from the east-side, but sadly this cannot be fine-tuned on - // a face-by-face basis. - return false; - } - - // Determine which drive chassis to show based on the used cell - private BakedModel getCellChassisModel(Item cell) { - if (cell == null) { - return bakedCells.get(Items.AIR); - } - final IBakedModel model = bakedCells.get(cell); - - return model != null ? model : defaultCell; - } - - private static void addModel(@Nullable BlockState state, @Nonnull Random rand, @Nonnull IModelData extraData, - List result, Direction side, IBakedModel bakedCell, Matrix4f transform) { - MatrixVertexTransformer transformer = new MatrixVertexTransformer(transform); - for (BakedQuad bakedQuad : bakedCell.getQuads(state, side, rand, extraData)) { - BakedQuadBuilder builder = new BakedQuadBuilder(); - transformer.setParent(builder); - transformer.setVertexFormat(builder.getVertexFormat()); - bakedQuad.pipe(transformer); - result.add(builder.build()); - } - } - -} diff --git a/src/unported/java/appeng/core/Registration.java b/src/unported/java/appeng/core/Registration.java index 2eea0c3c3..d6d5577e3 100644 --- a/src/unported/java/appeng/core/Registration.java +++ b/src/unported/java/appeng/core/Registration.java @@ -38,7 +38,7 @@ import net.minecraft.world.gen.placement.CountRangeConfig; import net.minecraft.world.gen.placement.IPlacementConfig; import net.minecraft.world.gen.placement.Placement; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IItems; diff --git a/src/unported/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json b/src/unported/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json deleted file mode 100644 index 5c062247d..000000000 --- a/src/unported/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "loader": "appliedenergistics2:dummy_fluid_item" -}