diff --git a/build.gradle b/build.gradle
index 81a797cbc..dfac3d2a6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -101,7 +101,7 @@ dependencies {
modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}"
- modImplementation "alexiil.mc.lib:libblockattributes-all:0.7.0"
+ modImplementation "alexiil.mc.lib:libblockattributes-all:0.7.1-pre.4"
modImplementation "me.shedaniel:RoughlyEnoughItems:4.6.6"
modImplementation "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75"
diff --git a/src/api/java/appeng/api/parts/IDynamicPartBakedModel.java b/src/api/java/appeng/api/parts/IDynamicPartBakedModel.java
new file mode 100644
index 000000000..1a8313abc
--- /dev/null
+++ b/src/api/java/appeng/api/parts/IDynamicPartBakedModel.java
@@ -0,0 +1,48 @@
+package appeng.api.parts;
+
+import appeng.api.util.AEPartLocation;
+import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
+import net.minecraft.block.BlockState;
+import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.render.model.BakedQuad;
+import net.minecraft.client.render.model.json.ModelOverrideList;
+import net.minecraft.client.render.model.json.ModelTransformation;
+import net.minecraft.client.texture.Sprite;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Direction;
+import net.minecraft.world.BlockRenderView;
+
+import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Supplier;
+
+/**
+ * This interface can be implemented by baked models returned by {@link IPart#getStaticModels()} to indicate that
+ * they would like to use the model data returned by {@link IPart#getModelData()}.
+ */
+public interface IDynamicPartBakedModel extends BakedModel {
+
+ /**
+ * See {@link net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel#emitBlockQuads(BlockRenderView, BlockState, BlockPos, Supplier, RenderContext)}
+ * for context.
+ *
+ * The given context will already have been transformed so that the model renders from the
+ * rotated location the part is attached to.
+ *
+ * @param partSide The side of the cable bus that the part is attached to.
+ * @param modelData The model data returned by {@link IPart#getModelData()}
+ */
+ void emitQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context,
+ Direction partSide, @Nullable Object modelData);
+
+ /**
+ * Unless you use your dynamic model for other purposes, this method will not be called.
+ */
+ @Override
+ default List getQuads(@Nullable BlockState state, @Nullable Direction face, Random random) {
+ return Collections.emptyList();
+ }
+
+}
diff --git a/src/main/java/appeng/block/AEBaseBlockItem.java b/src/main/java/appeng/block/AEBaseBlockItem.java
index 1aec3390d..5151673dc 100644
--- a/src/main/java/appeng/block/AEBaseBlockItem.java
+++ b/src/main/java/appeng/block/AEBaseBlockItem.java
@@ -141,7 +141,7 @@ public class AEBaseBlockItem extends BlockItem {
}
if (tile instanceof IGridProxyable) {
- // FIXME FABRIC ((IGridProxyable) tile).getProxy().setOwner(player);
+ ((IGridProxyable) tile).getProxy().setOwner(player);
}
tile.onPlacement(context);
diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java
index 20f75f1b0..8d2b7482a 100644
--- a/src/main/java/appeng/block/AEBaseTileBlock.java
+++ b/src/main/java/appeng/block/AEBaseTileBlock.java
@@ -28,6 +28,8 @@ import javax.annotation.Nullable;
import alexiil.mc.lib.attributes.AttributeList;
import alexiil.mc.lib.attributes.AttributeProvider;
import alexiil.mc.lib.attributes.item.FixedItemInv;
+import appeng.block.networking.CableBusBlock;
+import appeng.tile.networking.CableBusBlockEntity;
import com.google.common.collect.Lists;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
@@ -206,7 +208,7 @@ public abstract class AEBaseTileBlock extends AEBas
return ActionResult.FAIL;
}
- if (/* FIXME FABRIC tile instanceof CableBusBlockEntity || */ tile instanceof SkyChestBlockEntity) {
+ if (tile instanceof CableBusBlockEntity || tile instanceof SkyChestBlockEntity) {
return ActionResult.FAIL;
}
@@ -233,7 +235,7 @@ public abstract class AEBaseTileBlock extends AEBas
return ActionResult.FAIL;
}
- if (heldItem.getItem() instanceof IMemoryCard /* FIXME FABRIC && !(this instanceof CableBusBlock)*/) {
+ if (heldItem.getItem() instanceof IMemoryCard && !(this instanceof CableBusBlock)) {
final IMemoryCard memoryCard = (IMemoryCard) heldItem.getItem();
final AEBaseBlockEntity tileEntity = this.getBlockEntity(world, pos);
diff --git a/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java b/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java
index 1a800c5d6..bc7f643b7 100644
--- a/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java
+++ b/src/main/java/appeng/block/crafting/AbstractCraftingUnitBlock.java
@@ -18,25 +18,21 @@
package appeng.block.crafting;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockState;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.state.property.BooleanProperty;
-import net.minecraft.state.StateManager;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.ActionResult;
-import net.minecraft.util.Direction;
-import net.minecraft.util.Hand;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.hit.BlockHitResult;
-import net.minecraft.world.IWorld;
-import net.minecraft.world.World;
-
import appeng.block.AEBaseTileBlock;
import appeng.container.ContainerLocator;
import appeng.container.ContainerOpener;
import appeng.container.implementations.CraftingCPUContainer;
import appeng.tile.crafting.CraftingBlockEntity;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.state.StateManager;
+import net.minecraft.state.property.BooleanProperty;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.Hand;
+import net.minecraft.util.hit.BlockHitResult;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
public abstract class AbstractCraftingUnitBlock extends AEBaseTileBlock {
public static final BooleanProperty FORMED = BooleanProperty.of("formed");
@@ -57,16 +53,6 @@ public abstract class AbstractCraftingUnitBlock e
builder.add(FORMED);
}
- @Override
- public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn,
- BlockPos currentPos, BlockPos facingPos) {
- TileEntity te = worldIn.getTileEntity(currentPos);
- if (te != null) {
- te.requestModelDataUpdate();
- }
- return super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos);
- }
-
@Override
public void neighborUpdate(final BlockState state, final World worldIn, final BlockPos pos, final Block blockIn,
final BlockPos fromPos, boolean isMoving) {
diff --git a/src/main/java/appeng/block/misc/ChargerBlock.java b/src/main/java/appeng/block/misc/ChargerBlock.java
index 690116f76..5c4efd5f4 100644
--- a/src/main/java/appeng/block/misc/ChargerBlock.java
+++ b/src/main/java/appeng/block/misc/ChargerBlock.java
@@ -64,7 +64,7 @@ import appeng.util.Platform;
public class ChargerBlock extends AEBaseTileBlock {
public ChargerBlock() {
- super(defaultProps(Material.METAL).solidBlock((state, world, pos) -> false));
+ super(defaultProps(Material.METAL).nonOpaque());
}
@Override
diff --git a/src/main/java/appeng/block/networking/CableBusBlock.java b/src/main/java/appeng/block/networking/CableBusBlock.java
index 0993f2b56..211c9d544 100644
--- a/src/main/java/appeng/block/networking/CableBusBlock.java
+++ b/src/main/java/appeng/block/networking/CableBusBlock.java
@@ -29,6 +29,8 @@ import appeng.client.render.cablebus.CableBusBakedModel;
import appeng.client.render.cablebus.CableBusBreakingParticle;
import appeng.client.render.cablebus.CableBusRenderState;
import appeng.core.AppEng;
+import appeng.core.sync.network.NetworkHandler;
+import appeng.core.sync.packets.ClickPacket;
import appeng.helpers.AEMaterials;
import appeng.integration.abstraction.IAEFacade;
import appeng.parts.ICableBusContainer;
@@ -331,9 +333,8 @@ public class CableBusBlock extends AEBaseTileBlock implemen
final Vec3d hitVec = rtr.getPos().subtract(new Vec3d(pos.getX(), pos.getY(), pos.getZ()));
if (this.cb(worldIn, pos).clicked(player, Hand.MAIN_HAND, hitVec)) {
- throw new IllegalStateException();
- // FIXME FABRIC NetworkHandler.instance().sendToServer(new ClickPacket(pos, brtr.getSide(), (float) hitVec.x,
- // FIXME FABRIC (float) hitVec.y, (float) hitVec.z, Hand.MAIN_HAND, true));
+ NetworkHandler.instance().sendToServer(new ClickPacket(pos, brtr.getSide(), (float) hitVec.x,
+ (float) hitVec.y, (float) hitVec.z, Hand.MAIN_HAND, true));
}
}
}
diff --git a/src/main/java/appeng/block/networking/WirelessBlock.java b/src/main/java/appeng/block/networking/WirelessBlock.java
index 905b30cbb..9e4da6b5d 100644
--- a/src/main/java/appeng/block/networking/WirelessBlock.java
+++ b/src/main/java/appeng/block/networking/WirelessBlock.java
@@ -58,10 +58,7 @@ public class WirelessBlock extends AEBaseTileBlock {
public static final EnumProperty STATE = EnumProperty.of("state", State.class);
public WirelessBlock() {
- super(defaultProps(AEMaterials.GLASS)
- .nonOpaque()
- .solidBlock((state, world, pos) -> false)
- );
+ super(defaultProps(AEMaterials.GLASS).nonOpaque());
this.setDefaultState(this.getDefaultState().with(STATE, State.OFF));
}
diff --git a/src/main/java/appeng/block/paint/PaintSplotchesBlock.java b/src/main/java/appeng/block/paint/PaintSplotchesBlock.java
index 10606289c..d01fdf3c8 100644
--- a/src/main/java/appeng/block/paint/PaintSplotchesBlock.java
+++ b/src/main/java/appeng/block/paint/PaintSplotchesBlock.java
@@ -42,8 +42,7 @@ import appeng.util.Platform;
public class PaintSplotchesBlock extends AEBaseTileBlock {
public PaintSplotchesBlock() {
- super(defaultProps(Material.WATER, MaterialColor.CLEAR).solidBlock((state, world, pos) -> false)
- .air());
+ super(defaultProps(Material.WATER, MaterialColor.CLEAR).nonOpaque().air());
}
@Override
diff --git a/src/main/java/appeng/block/spatial/MatrixFrameBlock.java b/src/main/java/appeng/block/spatial/MatrixFrameBlock.java
index a012e4aa5..e484188cd 100644
--- a/src/main/java/appeng/block/spatial/MatrixFrameBlock.java
+++ b/src/main/java/appeng/block/spatial/MatrixFrameBlock.java
@@ -41,7 +41,7 @@ public class MatrixFrameBlock extends AEBaseBlock {
private static final Material MATERIAL = new Material(MaterialColor.CLEAR, false, true, true, false, false, false, PistonBehavior.PUSH_ONLY);
public MatrixFrameBlock() {
- super(Settings.of(MATERIAL).strength(-1.0F, 6000000.0F).solidBlock((state, world, pos) -> false).dropsNothing());
+ super(Settings.of(MATERIAL).strength(-1.0F, 6000000.0F).nonOpaque().dropsNothing());
}
@Override
diff --git a/src/main/java/appeng/client/AppEngClient.java b/src/main/java/appeng/client/AppEngClient.java
index 0fd12830e..085c1eee8 100644
--- a/src/main/java/appeng/client/AppEngClient.java
+++ b/src/main/java/appeng/client/AppEngClient.java
@@ -8,16 +8,94 @@ import appeng.bootstrap.ModelsReloadCallback;
import appeng.bootstrap.components.IClientSetupComponent;
import appeng.bootstrap.components.IItemColorRegistrationComponent;
import appeng.bootstrap.components.IModelBakeComponent;
-import appeng.client.gui.implementations.*;
+import appeng.client.gui.implementations.CellWorkbenchScreen;
+import appeng.client.gui.implementations.ChestScreen;
+import appeng.client.gui.implementations.CondenserScreen;
+import appeng.client.gui.implementations.CraftAmountScreen;
+import appeng.client.gui.implementations.CraftConfirmScreen;
+import appeng.client.gui.implementations.CraftingCPUScreen;
+import appeng.client.gui.implementations.CraftingStatusScreen;
+import appeng.client.gui.implementations.CraftingTermScreen;
+import appeng.client.gui.implementations.DriveScreen;
+import appeng.client.gui.implementations.FormationPlaneScreen;
+import appeng.client.gui.implementations.GrinderScreen;
+import appeng.client.gui.implementations.IOPortScreen;
+import appeng.client.gui.implementations.InscriberScreen;
+import appeng.client.gui.implementations.InterfaceScreen;
+import appeng.client.gui.implementations.InterfaceTerminalScreen;
+import appeng.client.gui.implementations.LevelEmitterScreen;
+import appeng.client.gui.implementations.MEMonitorableScreen;
+import appeng.client.gui.implementations.MEPortableCellScreen;
+import appeng.client.gui.implementations.MolecularAssemblerScreen;
+import appeng.client.gui.implementations.NetworkStatusScreen;
+import appeng.client.gui.implementations.NetworkToolScreen;
+import appeng.client.gui.implementations.PatternTermScreen;
+import appeng.client.gui.implementations.PriorityScreen;
+import appeng.client.gui.implementations.QNBScreen;
+import appeng.client.gui.implementations.QuartzKnifeScreen;
+import appeng.client.gui.implementations.SecurityStationScreen;
+import appeng.client.gui.implementations.SkyChestScreen;
+import appeng.client.gui.implementations.SpatialIOPortScreen;
+import appeng.client.gui.implementations.StorageBusScreen;
+import appeng.client.gui.implementations.UpgradeableScreen;
+import appeng.client.gui.implementations.VibrationChamberScreen;
+import appeng.client.gui.implementations.WirelessScreen;
+import appeng.client.gui.implementations.WirelessTermScreen;
+import appeng.client.render.FacadeItemModel;
import appeng.client.render.SimpleModelLoader;
import appeng.client.render.cablebus.CableBusModelLoader;
+import appeng.client.render.cablebus.P2PTunnelFrequencyModel;
import appeng.client.render.crafting.CraftingCubeModel;
-import appeng.client.render.effects.*;
-import appeng.client.render.model.*;
+import appeng.client.render.effects.ChargedOreFX;
+import appeng.client.render.effects.CraftingFx;
+import appeng.client.render.effects.EnergyFx;
+import appeng.client.render.effects.LightningArcFX;
+import appeng.client.render.effects.LightningFX;
+import appeng.client.render.effects.MatterCannonFX;
+import appeng.client.render.effects.ParticleTypes;
+import appeng.client.render.effects.VibrantFX;
+import appeng.client.render.model.BiometricCardModel;
+import appeng.client.render.model.ColorApplicatorModel;
+import appeng.client.render.model.DriveModel;
+import appeng.client.render.model.GlassModel;
+import appeng.client.render.model.MemoryCardModel;
+import appeng.client.render.model.SkyCompassModel;
import appeng.client.render.spatial.SpatialPylonModel;
import appeng.client.render.tesr.InscriberTESR;
import appeng.client.render.tesr.SkyChestTESR;
-import appeng.container.implementations.*;
+import appeng.container.implementations.CellWorkbenchContainer;
+import appeng.container.implementations.ChestContainer;
+import appeng.container.implementations.CondenserContainer;
+import appeng.container.implementations.CraftAmountContainer;
+import appeng.container.implementations.CraftConfirmContainer;
+import appeng.container.implementations.CraftingCPUContainer;
+import appeng.container.implementations.CraftingStatusContainer;
+import appeng.container.implementations.CraftingTermContainer;
+import appeng.container.implementations.DriveContainer;
+import appeng.container.implementations.FormationPlaneContainer;
+import appeng.container.implementations.GrinderContainer;
+import appeng.container.implementations.IOPortContainer;
+import appeng.container.implementations.InscriberContainer;
+import appeng.container.implementations.InterfaceContainer;
+import appeng.container.implementations.InterfaceTerminalContainer;
+import appeng.container.implementations.LevelEmitterContainer;
+import appeng.container.implementations.MEMonitorableContainer;
+import appeng.container.implementations.MEPortableCellContainer;
+import appeng.container.implementations.MolecularAssemblerContainer;
+import appeng.container.implementations.NetworkStatusContainer;
+import appeng.container.implementations.NetworkToolContainer;
+import appeng.container.implementations.PatternTermContainer;
+import appeng.container.implementations.PriorityContainer;
+import appeng.container.implementations.QNBContainer;
+import appeng.container.implementations.QuartzKnifeContainer;
+import appeng.container.implementations.SecurityStationContainer;
+import appeng.container.implementations.SkyChestContainer;
+import appeng.container.implementations.SpatialIOPortContainer;
+import appeng.container.implementations.StorageBusContainer;
+import appeng.container.implementations.UpgradeableContainer;
+import appeng.container.implementations.VibrationChamberContainer;
+import appeng.container.implementations.WirelessContainer;
+import appeng.container.implementations.WirelessTermContainer;
import appeng.core.Api;
import appeng.core.ApiDefinitions;
import appeng.core.AppEng;
@@ -25,10 +103,26 @@ import appeng.core.AppEngBase;
import appeng.core.features.registries.PartModels;
import appeng.core.sync.network.ClientNetworkHandler;
import appeng.core.worlddata.WorldData;
-import appeng.entity.*;
-import appeng.fluids.client.gui.*;
-import appeng.fluids.container.*;
+import appeng.entity.ChargedQuartzEntity;
+import appeng.entity.GrowingCrystalEntity;
+import appeng.entity.SingularityEntity;
+import appeng.entity.TinyTNTPrimedEntity;
+import appeng.entity.TinyTNTPrimedRenderer;
+import appeng.fluids.client.gui.FluidFormationPlaneScreen;
+import appeng.fluids.client.gui.FluidIOScreen;
+import appeng.fluids.client.gui.FluidInterfaceScreen;
+import appeng.fluids.client.gui.FluidLevelEmitterScreen;
+import appeng.fluids.client.gui.FluidStorageBusScreen;
+import appeng.fluids.client.gui.FluidTerminalScreen;
+import appeng.fluids.container.FluidFormationPlaneContainer;
+import appeng.fluids.container.FluidIOContainer;
+import appeng.fluids.container.FluidInterfaceContainer;
+import appeng.fluids.container.FluidLevelEmitterContainer;
+import appeng.fluids.container.FluidStorageBusContainer;
+import appeng.fluids.container.FluidTerminalContainer;
import appeng.hooks.ClientTickHandler;
+import appeng.parts.automation.PlaneModel;
+import appeng.tile.crafting.MolecularAssemblerRenderer;
import appeng.util.Platform;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -53,7 +147,11 @@ import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
-import java.util.*;
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -240,6 +338,18 @@ public final class AppEngClient extends AppEngBase {
private void registerModelProviders() {
+ ModelLoadingRegistry.INSTANCE.registerAppender((resourceManager, consumer) -> {
+ consumer.accept(MolecularAssemblerRenderer.LIGHTS_MODEL);
+ });
+ ModelLoadingRegistry.INSTANCE.registerVariantProvider((resourceManager) -> {
+ return (modelIdentifier, modelProviderContext) -> {
+ if (MolecularAssemblerRenderer.LIGHTS_MODEL.equals(modelIdentifier)) {
+ return modelProviderContext.loadModel(new Identifier(modelIdentifier.getNamespace(), modelIdentifier.getPath()));
+ }
+ return null;
+ };
+ });
+
ModelLoadingRegistry.INSTANCE.registerResourceProvider(rm -> new CableBusModelLoader((PartModels) Api.INSTANCE.registries().partModels()));
addBuiltInModel("block/quartz_glass", GlassModel::new);
@@ -249,14 +359,24 @@ public final class AppEngClient extends AppEngBase {
addBuiltInModel("item/memory_card", MemoryCardModel::new);
addBuiltInModel("item/biometric_card", BiometricCardModel::new);
addBuiltInModel("block/drive", DriveModel::new);
- addBuiltInModel("color_applicator", ColorApplicatorModel::new); // FIXME need to wire this up
+ addBuiltInModel("color_applicator", ColorApplicatorModel::new); // FIXME need to wire this up (this might just not be needed)
addBuiltInModel("block/spatial_pylon", SpatialPylonModel::new);
addBuiltInModel("block/paint", PaintSplotchesModel::new);
- addBuiltInModel("block/qnb/qnb_formed", QnbFormedModel::new);
-// FIXME FABRIC addBuiltInModel("p2p_tunnel_frequency", P2PTunnelFrequencyModel::new);
-// FIXME FABRIC addBuiltInModel("facade", FacadeItemModel::new);
-// FIXME FABRIC ModelLoaderRegistry.registerLoader(new Identifier(AppEng.MOD_ID, "part_plane"),
-// FIXME FABRIC PlaneModelLoader.INSTANCE);
+ addBuiltInModel("block/qnb/qnb_formed", QnbFormedModel::new);
+ addBuiltInModel("part/p2p/p2p_tunnel_frequency", P2PTunnelFrequencyModel::new);
+ addBuiltInModel("item/facade", FacadeItemModel::new);
+
+ addPlaneModel("part/annihilation_plane", "part/annihilation_plane");
+ addPlaneModel("part/annihilation_plane_on", "part/annihilation_plane_on");
+ addPlaneModel("part/identity_annihilation_plane", "part/identity_annihilation_plane");
+ addPlaneModel("part/identity_annihilation_plane_on", "part/identity_annihilation_plane_on");
+ addPlaneModel("part/fluid_annihilation_plane", "part/fluid_annihilation_plane");
+ addPlaneModel("part/fluid_annihilation_plane_on", "part/fluid_annihilation_plane_on");
+ addPlaneModel("part/fluid_formation_plane", "part/fluid_formation_plane");
+ addPlaneModel("part/fluid_formation_plane_on", "part/fluid_formation_plane_on");
+ addPlaneModel("part/formation_plane", "part/formation_plane");
+ addPlaneModel("part/formation_plane_on", "part/formation_plane_on");
+
addBuiltInModel("block/crafting/1k_storage_formed", () -> new CraftingCubeModel(AbstractCraftingUnitBlock.CraftingUnitType.STORAGE_1K));
addBuiltInModel("block/crafting/4k_storage_formed", () -> new CraftingCubeModel(AbstractCraftingUnitBlock.CraftingUnitType.STORAGE_4K));
addBuiltInModel("block/crafting/16k_storage_formed", () -> new CraftingCubeModel(AbstractCraftingUnitBlock.CraftingUnitType.STORAGE_16K));
@@ -267,9 +387,16 @@ public final class AppEngClient extends AppEngBase {
// FIXME FABRIC ModelLoaderRegistry.registerLoader(new Identifier(AppEng.MOD_ID, "uvlightmap"), UVLModelLoader.INSTANCE);
}
+ private static void addPlaneModel(String planeName, String frontTexture) {
+ Identifier frontTextureId = AppEng.makeId(frontTexture);
+ Identifier sidesTextureId = AppEng.makeId("part/plane_sides");
+ Identifier backTextureId = AppEng.makeId("part/transition_plane_back");
+ addBuiltInModel(planeName, () -> new PlaneModel(frontTextureId, sidesTextureId, backTextureId));
+ }
+
private static void addBuiltInModel(String id, Supplier modelFactory) {
ModelLoadingRegistry.INSTANCE.registerResourceProvider(
- resourceManager -> new SimpleModelLoader(AppEng.makeId(id), modelFactory)
+ resourceManager -> new SimpleModelLoader<>(AppEng.makeId(id), modelFactory)
);
}
diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java
index 85d3cc858..f0e34bd8e 100644
--- a/src/main/java/appeng/client/gui/AEBaseScreen.java
+++ b/src/main/java/appeng/client/gui/AEBaseScreen.java
@@ -18,43 +18,9 @@
package appeng.client.gui;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import appeng.mixins.SlotMixin;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Stopwatch;
-import com.mojang.blaze3d.systems.RenderSystem;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.Tessellator;
-import net.minecraft.client.render.VertexFormats;
-import net.minecraft.client.util.InputUtil;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.screen.slot.Slot;
-import net.minecraft.text.LiteralText;
-import net.minecraft.text.Style;
-import net.minecraft.util.Formatting;
-import org.lwjgl.glfw.GLFW;
-import org.lwjgl.opengl.GL11;
-
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.entity.player.PlayerInventory;
-import net.minecraft.screen.slot.SlotActionType;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.Identifier;
-import net.minecraft.text.Text;
-
+import alexiil.mc.lib.attributes.fluid.render.FluidRenderFace;
+import alexiil.mc.lib.attributes.fluid.render.FluidVolumeRenderer;
+import alexiil.mc.lib.attributes.fluid.volume.FluidVolume;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.client.gui.widgets.CustomSlotWidget;
@@ -85,6 +51,41 @@ import appeng.core.sync.packets.SwapSlotsPacket;
import appeng.fluids.client.render.FluidStackSizeRenderer;
import appeng.fluids.container.slots.IMEFluidSlot;
import appeng.helpers.InventoryAction;
+import appeng.mixins.SlotMixin;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Stopwatch;
+import com.mojang.blaze3d.systems.RenderSystem;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Element;
+import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.client.gui.widget.AbstractButtonWidget;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexFormats;
+import net.minecraft.client.util.InputUtil;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.slot.Slot;
+import net.minecraft.screen.slot.SlotActionType;
+import net.minecraft.text.LiteralText;
+import net.minecraft.text.Style;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.Identifier;
+import org.lwjgl.glfw.GLFW;
+import org.lwjgl.opengl.GL11;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
public abstract class AEBaseScreen extends HandledScreen {
@@ -189,7 +190,7 @@ public abstract class AEBaseScreen extends HandledScr
}
final Text msg = tooltip.getMessage();
- if (msg != null && !msg.isEmpty()) {
+ if (msg != null && !msg.getString().isEmpty()) {
this.drawTooltip(matrices, x + 11, y + 4, msg);
}
}
@@ -328,7 +329,7 @@ public abstract class AEBaseScreen extends HandledScr
// TODO 1.9.4 aftermath - Whole SlotActionType thing, to be checked.
@Override
protected void onMouseClick(final Slot slot, final int slotIdx, final int mouseButton,
- final SlotActionType clickType) {
+ final SlotActionType clickType) {
final PlayerEntity player = getPlayer();
if (slot instanceof FakeSlot) {
@@ -510,7 +511,7 @@ public abstract class AEBaseScreen extends HandledScr
}
protected int getSlotIndex(Slot slot) {
- return ((SlotMixin)slot).getIndex();
+ return ((SlotMixin) slot).getIndex();
}
protected boolean checkHotbarKeys(int keyCode, int scanCode) {
@@ -652,7 +653,16 @@ public abstract class AEBaseScreen extends HandledScr
final IAEFluidStack fs = slot.getAEFluidStack();
if (fs != null && this.isPowered()) {
- fs.getFluidStack().renderGuiRect(s.x, s.y, s.x + 16, s.y + 16);
+ List faces = new ArrayList<>();
+ faces.add(FluidRenderFace.createFlatFaceZ(0, 0, 0, 16, 16, 0, 1 / 16., false, false));
+
+ matrices.push();
+ matrices.translate(s.x, s.y, 0);
+
+ FluidVolume fluidStack = fs.getFluidStack();
+ fluidStack.render(faces, FluidVolumeRenderer.VCPS, matrices);
+ RenderSystem.runAsFancy(FluidVolumeRenderer.VCPS::draw);
+ matrices.pop();
this.fluidStackSizeRenderer.renderStackSize(this.textRenderer, fs, s.x, s.y);
} else if (!this.isPowered()) {
@@ -786,7 +796,7 @@ public abstract class AEBaseScreen extends HandledScr
public void tick() {
super.tick();
- for (IGuiEventListener child : children) {
+ for (Element child : children) {
if (child instanceof ITickingWidget) {
((ITickingWidget) child).tick();
}
diff --git a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java
index dd1d95246..cae418983 100644
--- a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java
+++ b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java
@@ -20,9 +20,7 @@ package appeng.client.gui.implementations;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.entity.player.PlayerInventory;
-import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
diff --git a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java
index 33688879e..461c8e887 100644
--- a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java
+++ b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java
@@ -57,7 +57,7 @@ public class LevelEmitterScreen extends UpgradeableScreen
this::onLevelChange);
this.level.setTextFieldBounds(25, 44, 75);
this.level.addButtons(children::add, this::addButton);
- container.setTextField(this.level);
+ handler.setTextField(this.level);
}
private void onLevelChange(long level) {
@@ -100,7 +100,7 @@ public class LevelEmitterScreen extends UpgradeableScreen
if (notCraftingMode) {
if (currentLevelMode == LevelType.ENERGY_LEVEL) {
- this.font.drawString(PowerUnits.AE.textComponent().getString(), 110, 44, COLOR_DARK_GRAY);
+ this.textRenderer.draw(matrices, PowerUnits.AE.textComponent().getString(), 110, 44, COLOR_DARK_GRAY);
}
}
}
diff --git a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java
index ccabecad7..26b8ccd80 100644
--- a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java
+++ b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java
@@ -3,15 +3,17 @@ package appeng.client.gui.implementations;
import java.util.function.Consumer;
import java.util.function.LongConsumer;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.IGuiEventListener;
-import net.minecraft.client.gui.widget.button.Button;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.Element;
+import net.minecraft.client.gui.widget.ButtonWidget;
import appeng.client.gui.AEBaseScreen;
import appeng.client.gui.NumberEntryType;
import appeng.client.gui.widgets.ITickingWidget;
import appeng.client.gui.widgets.NumberBox;
import appeng.core.AEConfig;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.LiteralText;
/**
* A utility widget that consists of a text-field to enter a number with
@@ -26,14 +28,14 @@ public class NumberEntryWidget implements ITickingWidget {
private final NumberBox level;
private final NumberEntryType type;
- private Button plus1;
- private Button plus10;
- private Button plus100;
- private Button plus1000;
- private Button minus1;
- private Button minus10;
- private Button minus100;
- private Button minus1000;
+ private ButtonWidget plus1;
+ private ButtonWidget plus10;
+ private ButtonWidget plus100;
+ private ButtonWidget plus1000;
+ private ButtonWidget minus1;
+ private ButtonWidget minus10;
+ private ButtonWidget minus100;
+ private ButtonWidget minus1000;
public NumberEntryWidget(AEBaseScreen> parent, int x, int y, int width, int height, NumberEntryType type,
LongConsumer changeListener) {
@@ -42,20 +44,19 @@ public class NumberEntryWidget implements ITickingWidget {
this.y = y;
this.type = type;
- FontRenderer font = parent.getMinecraft().fontRenderer;
- int inputX = parent.getGuiLeft() + x;
- int inputY = parent.getGuiTop() + y;
- this.level = new NumberBox(font, inputX, inputY, width, font.FONT_HEIGHT, type.getInputType(), changeListener);
- this.level.setEnableBackgroundDrawing(false);
- this.level.setMaxStringLength(16);
- this.level.setTextColor(0xFFFFFF);
+ TextRenderer font = parent.getClient().textRenderer;
+ int inputX = parent.getX() + x;
+ int inputY = parent.getY() + y;
+ this.level = new NumberBox(font, inputX, inputY, width, font.fontHeight, type.getInputType(), changeListener);
+ this.level.setHasBorder(false);
+ this.level.setMaxLength(16);
+ this.level.setEditableColor(0xFFFFFF);
this.level.setVisible(true);
- this.level.setFocused2(true);
- parent.setFocusedDefault(this.level);
+ parent.setInitialFocus(this.level);
}
public void setActive(boolean active) {
- this.level.setEnabled(active);
+ this.level.active = active;
this.plus1.active = active;
this.plus10.active = active;
this.plus100.active = active;
@@ -67,8 +68,8 @@ public class NumberEntryWidget implements ITickingWidget {
}
public void setTextFieldBounds(int x, int y, int width) {
- this.level.x = parent.getGuiLeft() + x;
- this.level.y = parent.getGuiTop() + y;
+ this.level.x = parent.getX() + x;
+ this.level.y = parent.getY() + y;
this.level.setWidth(width);
}
@@ -76,28 +77,28 @@ public class NumberEntryWidget implements ITickingWidget {
this.level.setMinValue(minValue);
}
- public void addButtons(Consumer addChildren, Consumer