diff --git a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java index 011ca6577..ce8ea9ae2 100644 --- a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java +++ b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java @@ -23,14 +23,12 @@ import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.minecraft.block.Block; import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; import net.minecraft.world.World; import appeng.api.config.AccessRestriction; @@ -39,21 +37,12 @@ import appeng.api.config.PowerUnits; import appeng.api.definitions.IBlockDefinition; import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.core.Api; -import appeng.core.AppEng; import appeng.core.localization.GuiText; public class AEBaseBlockItemChargeable extends AEBaseBlockItem implements IAEItemPowerStorage { public AEBaseBlockItemChargeable(Block id, Settings props) { super(id, props); - - FabricModelPredicateProviderRegistry.register(this, new Identifier(AppEng.MOD_ID, "fill_level"), - (is, world, entity) -> { - double curPower = getAECurrentPower(is); - double maxPower = getAEMaxPower(is); - - return (int) Math.round(100 * curPower / maxPower); - }); } @Override diff --git a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java index 02b3efebd..6dcf6d62e 100644 --- a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java @@ -29,6 +29,7 @@ import javax.annotation.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.minecraft.block.Block; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; @@ -40,7 +41,9 @@ import appeng.api.definitions.IBlockDefinition; import appeng.api.features.AEFeature; import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlockItem; +import appeng.block.AEBaseBlockItemChargeable; import appeng.block.AEBaseTileBlock; +import appeng.bootstrap.components.IClientSetupComponent; import appeng.bootstrap.definitions.TileEntityDefinition; import appeng.core.AppEng; import appeng.core.CreativeTab; @@ -149,6 +152,24 @@ class BlockDefinitionBuilder implements IBlockBuilder { Registry.register(Registry.ITEM, id, item); } + // Register the client-only item model property for chargeable items + if (item instanceof AEBaseBlockItemChargeable) { + AEBaseBlockItemChargeable chargeable = (AEBaseBlockItemChargeable) item; + this.factory.addBootstrapComponent(new IClientSetupComponent() { + @Override + @Environment(EnvType.CLIENT) + public void setup() { + FabricModelPredicateProviderRegistry.register(item, AppEng.makeId("fill_level"), + (is, world, entity) -> { + double curPower = chargeable.getAECurrentPower(is); + double maxPower = chargeable.getAEMaxPower(is); + + return (int) Math.round(100 * curPower / maxPower); + }); + } + }); + } + // Register all extra handlers this.bootstrapComponents.forEach(component -> this.factory.addBootstrapComponent(component.apply(block, item))); diff --git a/src/main/java/appeng/bootstrap/components/IClientSetupComponent.java b/src/main/java/appeng/bootstrap/components/IClientSetupComponent.java index 6f37e9989..951ca85a9 100644 --- a/src/main/java/appeng/bootstrap/components/IClientSetupComponent.java +++ b/src/main/java/appeng/bootstrap/components/IClientSetupComponent.java @@ -3,8 +3,7 @@ package appeng.bootstrap.components; import appeng.bootstrap.IBootstrapComponent; /** - * Will be run during - * {@link net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent}. + * Will be run on the client-side only. */ public interface IClientSetupComponent extends IBootstrapComponent { diff --git a/src/main/java/appeng/core/AERecipeType.java b/src/main/java/appeng/core/AERecipeType.java deleted file mode 100644 index 6c71d44cd..000000000 --- a/src/main/java/appeng/core/AERecipeType.java +++ /dev/null @@ -1,18 +0,0 @@ -package appeng.core; - -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeType; -import net.minecraft.util.Identifier; - -public class AERecipeType> implements RecipeType { - private final String id; - - public AERecipeType(Identifier registryName) { - this.id = registryName.toString(); - } - - @Override - public String toString() { - return id; - } -} diff --git a/src/main/java/appeng/core/AppEngBase.java b/src/main/java/appeng/core/AppEngBase.java index bf675503d..7386c2776 100644 --- a/src/main/java/appeng/core/AppEngBase.java +++ b/src/main/java/appeng/core/AppEngBase.java @@ -31,8 +31,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeType; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; import net.minecraft.util.Identifier; @@ -181,7 +179,6 @@ public abstract class AppEngBase implements AppEng { registerScreenHandlerTypes(); registerParticleTypes(); - registerRecipeTypes(); registerRecipeSerializers(); registerWorldGen(); registerServerCommands(); @@ -400,21 +397,11 @@ public abstract class AppEngBase implements AppEng { ITileEntityRegistrationComponent::register); } - private static > RecipeType registerRecipeType(String id) { - Identifier fullId = AppEng.makeId(id); - return Registry.register(Registry.RECIPE_TYPE, fullId, new AERecipeType<>(fullId)); - } - - private void registerRecipeTypes() { - GrinderRecipe.TYPE = registerRecipeType("grinder"); - InscriberRecipe.TYPE = registerRecipeType("inscriber"); - } - private void registerRecipeSerializers() { Registry.register(Registry.RECIPE_SERIALIZER, AppEng.makeId("quartz_knife"), QuartzKnifeRecipeSerializer.INSTANCE); - Registry.register(Registry.RECIPE_SERIALIZER, AppEng.makeId("grinder"), GrinderRecipeSerializer.INSTANCE); - Registry.register(Registry.RECIPE_SERIALIZER, AppEng.makeId("inscriber"), InscriberRecipeSerializer.INSTANCE); + Registry.register(Registry.RECIPE_SERIALIZER, GrinderRecipe.TYPE_ID, GrinderRecipeSerializer.INSTANCE); + Registry.register(Registry.RECIPE_SERIALIZER, InscriberRecipe.TYPE_ID, InscriberRecipeSerializer.INSTANCE); Registry.register(Registry.RECIPE_SERIALIZER, AppEng.makeId("disassemble"), DisassembleRecipe.SERIALIZER); FacadeItem facadeItem = (FacadeItem) Api.INSTANCE.definitions().items().facade().item(); Registry.register(Registry.RECIPE_SERIALIZER, AppEng.makeId("facade"), FacadeRecipe.getSerializer(facadeItem)); diff --git a/src/main/java/appeng/core/AppEngServerStartup.java b/src/main/java/appeng/core/AppEngServerStartup.java index 581cfc13c..020f2d820 100644 --- a/src/main/java/appeng/core/AppEngServerStartup.java +++ b/src/main/java/appeng/core/AppEngServerStartup.java @@ -1,8 +1,9 @@ package appeng.core; -import appeng.server.AppEngServer; import net.fabricmc.api.DedicatedServerModInitializer; +import appeng.server.AppEngServer; + @SuppressWarnings("unused") public class AppEngServerStartup implements DedicatedServerModInitializer { @Override diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index cfd6dca6a..97bb3fa22 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -22,6 +22,7 @@ import java.util.function.Consumer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.SpawnGroup; import net.minecraft.item.Item; @@ -35,6 +36,8 @@ import appeng.api.util.AEColoredItemDefinition; import appeng.bootstrap.FeatureFactory; import appeng.bootstrap.IItemRendering; import appeng.bootstrap.ItemRenderingCustomizer; +import appeng.bootstrap.components.IClientSetupComponent; +import appeng.core.AppEng; import appeng.core.features.ActivityState; import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ItemStackSrc; @@ -62,8 +65,20 @@ import appeng.items.storage.ViewCellItem; import appeng.items.tools.BiometricCardItem; import appeng.items.tools.MemoryCardItem; import appeng.items.tools.NetworkToolItem; -import appeng.items.tools.powered.*; -import appeng.items.tools.quartz.*; +import appeng.items.tools.powered.ChargedStaffItem; +import appeng.items.tools.powered.ColorApplicatorItem; +import appeng.items.tools.powered.ColorApplicatorItemRendering; +import appeng.items.tools.powered.EntropyManipulatorItem; +import appeng.items.tools.powered.MatterCannonItem; +import appeng.items.tools.powered.PortableCellItem; +import appeng.items.tools.powered.WirelessTerminalItem; +import appeng.items.tools.quartz.QuartzAxeItem; +import appeng.items.tools.quartz.QuartzCuttingKnifeItem; +import appeng.items.tools.quartz.QuartzHoeItem; +import appeng.items.tools.quartz.QuartzPickaxeItem; +import appeng.items.tools.quartz.QuartzSpadeItem; +import appeng.items.tools.quartz.QuartzSwordItem; +import appeng.items.tools.quartz.QuartzWrenchItem; /** * Internal implementation for the API items @@ -198,7 +213,22 @@ public final class ApiItems implements IItems { .addFeatures(AEFeature.PORTABLE_CELL, AEFeature.STORAGE_CELLS).build(); this.colorApplicator = powerTools.item("color_applicator", ColorApplicatorItem::new).props(chargedDefaults) .addFeatures(AEFeature.COLOR_APPLICATOR).dispenserBehavior(BlockToolDispenseItemBehavior::new) - .rendering(new ColorApplicatorItemRendering()).build(); + .bootstrap(item -> new IClientSetupComponent() { + @Override + @Environment(EnvType.CLIENT) + public void setup() { + ColorApplicatorItem colorApplicatorItem = (ColorApplicatorItem) item; + FabricModelPredicateProviderRegistry.register(item, AppEng.makeId("colored"), + (itemStack, world, entity) -> { + // If the stack has no color, don't use the colored model since the impact of + // calling getColor for every quad is extremely high, if the stack tries to + // re-search its + // inventory for a new paintball everytime + AEColor col = colorApplicatorItem.getActiveColor(itemStack); + return (col != null) ? 1 : 0; + }); + } + }).rendering(new ColorApplicatorItemRendering()).build(); this.biometricCard = registry.item("biometric_card", BiometricCardItem::new).props(props -> props.maxCount(1)) .features(AEFeature.SECURITY).build(); @@ -273,7 +303,16 @@ public final class ApiItems implements IItems { this.certusCrystalSeed = registry .item("certus_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedCertusQuartzCrystal().item())) - .features(AEFeature.CRYSTAL_SEEDS).build(); + .bootstrap(item -> new IClientSetupComponent() { + @Override + @Environment(EnvType.CLIENT) + public void setup() { + // Expose the growth of the seed to the model system + FabricModelPredicateProviderRegistry.register(item, AppEng.makeId("growth"), + (is, w, p) -> CrystalSeedItem.getGrowthTicks(is) + / (float) CrystalSeedItem.GROWTH_TICKS_REQUIRED); + } + }).features(AEFeature.CRYSTAL_SEEDS).build(); this.fluixCrystalSeed = registry .item("fluix_crystal_seed", props -> new CrystalSeedItem(props, materials.purifiedFluixCrystal().item())) diff --git a/src/main/java/appeng/items/misc/CrystalSeedItem.java b/src/main/java/appeng/items/misc/CrystalSeedItem.java index 0a5c0d383..06c2936af 100644 --- a/src/main/java/appeng/items/misc/CrystalSeedItem.java +++ b/src/main/java/appeng/items/misc/CrystalSeedItem.java @@ -26,26 +26,21 @@ import com.google.common.base.Preconditions; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.minecraft.block.Block; import net.minecraft.block.Material; import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.Entity; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import appeng.api.implementations.items.IGrowableCrystal; -import appeng.core.AppEng; import appeng.core.localization.ButtonToolTips; -import appeng.entity.GrowingCrystalEntity; import appeng.items.AEBaseItem; /** @@ -62,7 +57,7 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { /** * The number of growth ticks required to finish growing. */ - private static final int GROWTH_TICKS_REQUIRED = 600; + public static final int GROWTH_TICKS_REQUIRED = 600; /** * The item to convert to, when growth finishes. @@ -72,9 +67,6 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { public CrystalSeedItem(Settings properties, ItemConvertible grownItem) { super(properties); this.grownItem = Preconditions.checkNotNull(grownItem); - // Expose the growth of the seed to the model system - FabricModelPredicateProviderRegistry.register(this, new Identifier(AppEng.MOD_ID, "growth"), - (is, w, p) -> getGrowthTicks(is) / (float) GROWTH_TICKS_REQUIRED); } @Nullable @@ -89,7 +81,7 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { } } - private static int getGrowthTicks(final ItemStack is) { + public static int getGrowthTicks(final ItemStack is) { CompoundTag tag = is.getTag(); return tag != null ? tag.getInt(TAG_GROWTH_TICKS) : 0; } diff --git a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java index 194528bba..c619c3e5b 100644 --- a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java +++ b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java @@ -18,7 +18,10 @@ package appeng.items.tools.powered; -import java.util.*; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import javax.annotation.Nullable; @@ -26,7 +29,6 @@ import com.google.common.collect.ImmutableMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; @@ -67,7 +69,6 @@ import appeng.block.networking.CableBusBlock; import appeng.block.paint.PaintSplotchesBlock; import appeng.core.AEConfig; import appeng.core.Api; -import appeng.core.AppEng; import appeng.core.localization.GuiText; import appeng.helpers.IMouseWheelItem; import appeng.hooks.IBlockTool; @@ -100,15 +101,6 @@ public class ColorApplicatorItem extends AEBasePoweredItem public ColorApplicatorItem(Item.Settings props) { super(AEConfig.instance().getColorApplicatorBattery(), props); - FabricModelPredicateProviderRegistry.register(this, new Identifier(AppEng.MOD_ID, "colored"), - (itemStack, world, entity) -> { - // If the stack has no color, don't use the colored model since the impact of - // calling getColor for every quad is extremely high, if the stack tries to - // re-search its - // inventory for a new paintball everytime - AEColor col = getActiveColor(itemStack); - return (col != null) ? 1 : 0; - }); } @Override diff --git a/src/main/java/appeng/mixins/SkyPropertiesMixin.java b/src/main/java/appeng/mixins/SkyPropertiesMixin.java index 70dd07b0f..b74da5665 100644 --- a/src/main/java/appeng/mixins/SkyPropertiesMixin.java +++ b/src/main/java/appeng/mixins/SkyPropertiesMixin.java @@ -12,6 +12,7 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.dimension.DimensionType; import appeng.spatial.SpatialDimensionManager; +import appeng.spatial.StorageSkyProperties; @Mixin(SkyProperties.class) public class SkyPropertiesMixin { @@ -20,7 +21,7 @@ public class SkyPropertiesMixin { private static void byDimensionType(Optional> optional, CallbackInfoReturnable ci) { if (optional.orElse(null) == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) { - ci.setReturnValue(SpatialDimensionManager.STORAGE_SKY); + ci.setReturnValue(StorageSkyProperties.INSTANCE); } } diff --git a/src/main/java/appeng/recipes/handlers/GrinderRecipe.java b/src/main/java/appeng/recipes/handlers/GrinderRecipe.java index 929330c0d..78255aa7d 100644 --- a/src/main/java/appeng/recipes/handlers/GrinderRecipe.java +++ b/src/main/java/appeng/recipes/handlers/GrinderRecipe.java @@ -14,9 +14,13 @@ import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; +import appeng.core.AppEng; + public class GrinderRecipe implements Recipe { - public static RecipeType TYPE; + public static final Identifier TYPE_ID = AppEng.makeId("grinder"); + + public static final RecipeType TYPE = RecipeType.register(TYPE_ID.toString()); private final Identifier id; private final String group; diff --git a/src/main/java/appeng/recipes/handlers/InscriberRecipe.java b/src/main/java/appeng/recipes/handlers/InscriberRecipe.java index bc6f0562f..8fbd19bc1 100644 --- a/src/main/java/appeng/recipes/handlers/InscriberRecipe.java +++ b/src/main/java/appeng/recipes/handlers/InscriberRecipe.java @@ -2,16 +2,22 @@ package appeng.recipes.handlers; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; -import net.minecraft.recipe.*; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import appeng.api.features.InscriberProcessType; +import appeng.core.AppEng; public class InscriberRecipe implements Recipe { - public static RecipeType TYPE; + public static final Identifier TYPE_ID = AppEng.makeId("inscriber"); + + public static final RecipeType TYPE = RecipeType.register(TYPE_ID.toString()); private final Identifier id; private final String group; diff --git a/src/main/java/appeng/spatial/SpatialDimensionManager.java b/src/main/java/appeng/spatial/SpatialDimensionManager.java index 1b18a212b..e87ba7d0b 100644 --- a/src/main/java/appeng/spatial/SpatialDimensionManager.java +++ b/src/main/java/appeng/spatial/SpatialDimensionManager.java @@ -23,13 +23,11 @@ import java.util.Locale; import javax.annotation.Nullable; -import net.minecraft.client.render.SkyProperties; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; @@ -51,25 +49,6 @@ public final class SpatialDimensionManager implements ISpatialDimension { public static final RegistryKey STORAGE_DIMENSION_TYPE = RegistryKey.of(Registry.DIMENSION_TYPE_KEY, AppEng.makeId("storage_cell")); - public static final SkyProperties STORAGE_SKY = new SkyProperties(Float.NaN /* disables clouds */, false, - SkyProperties.SkyType.NONE /* we use a custom render mixin */, true, false) { - @Override - public Vec3d adjustSkyColor(Vec3d color, float sunHeight) { - return Vec3d.ZERO; - } - - @Override - public boolean useThickFog(int camX, int camY) { - return false; - } - - @Nullable - @Override - public float[] getSkyColor(float skyAngle, float tickDelta) { - return null; - } - }; - public static final ISpatialDimension INSTANCE = new SpatialDimensionManager(); private static final String DIM_ID_PREFIX = "spatial_"; diff --git a/src/main/java/appeng/spatial/StorageSkyProperties.java b/src/main/java/appeng/spatial/StorageSkyProperties.java new file mode 100644 index 000000000..cb7a6a6a2 --- /dev/null +++ b/src/main/java/appeng/spatial/StorageSkyProperties.java @@ -0,0 +1,33 @@ +package appeng.spatial; + +import javax.annotation.Nullable; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.SkyProperties; +import net.minecraft.util.math.Vec3d; + +@Environment(EnvType.CLIENT) +public class StorageSkyProperties { + + // See the fabric version of this to get any idea what its doing + public static final SkyProperties INSTANCE = new SkyProperties(Float.NaN /* disables clouds */, false, + SkyProperties.SkyType.NONE /* we use a custom render mixin */, true, false) { + @Override + public Vec3d adjustSkyColor(Vec3d color, float sunHeight) { + return Vec3d.ZERO; + } + + @Override + public boolean useThickFog(int camX, int camY) { + return false; + } + + @Nullable + @Override + public float[] getSkyColor(float skyAngle, float tickDelta) { + return null; + } + }; + +} diff --git a/src/main/java/appeng/tile/storage/SkyChestBlockEntity.java b/src/main/java/appeng/tile/storage/SkyChestBlockEntity.java index a3a841640..e8d9c19bf 100644 --- a/src/main/java/appeng/tile/storage/SkyChestBlockEntity.java +++ b/src/main/java/appeng/tile/storage/SkyChestBlockEntity.java @@ -20,6 +20,8 @@ package appeng.tile.storage; import java.io.IOException; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.EnvironmentInterface; import net.minecraft.block.Block; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.client.block.ChestAnimationProgress; @@ -38,6 +40,7 @@ import appeng.tile.AEBaseInvBlockEntity; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.inv.InvOperation; +@EnvironmentInterface(value = EnvType.CLIENT, itf = ChestAnimationProgress.class) public class SkyChestBlockEntity extends AEBaseInvBlockEntity implements Tickable, ChestAnimationProgress { private final AppEngInternalInventory inv = new AppEngInternalInventory(this, 9 * 4);