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