diff --git a/src/api/java/appeng/api/features/AEFeature.java b/src/api/java/appeng/api/features/AEFeature.java index c2b5c5f05..8b0e62322 100644 --- a/src/api/java/appeng/api/features/AEFeature.java +++ b/src/api/java/appeng/api/features/AEFeature.java @@ -119,6 +119,8 @@ public enum AEFeature { TINY_TNT_BLOCK_DAMAGE("TinyTNTBlockDamage", Constants.CATEGORY_BLOCK_FEATURES), FACADES("Facades", Constants.CATEGORY_FACADES), + TILE_ENTITY_FACADES("TileEntityFacades", Constants.CATEGORY_FACADES, false, + "Unsupported: Allows whitelisting TileEntity as facades. Could work, have render issues, or corrupt your world. USE AT YOUR OWN RISK."), UNSUPPORTED_DEVELOPER_TOOLS("UnsupportedDeveloperTools", Constants.CATEGORY_MISC, false), CREATIVE("Creative", Constants.CATEGORY_MISC), GRINDER_LOGGING("GrinderLogging", Constants.CATEGORY_MISC, false), diff --git a/src/api/java/appeng/api/parts/IFacadePart.java b/src/api/java/appeng/api/parts/IFacadePart.java index f70ea3726..364a8264a 100644 --- a/src/api/java/appeng/api/parts/IFacadePart.java +++ b/src/api/java/appeng/api/parts/IFacadePart.java @@ -23,13 +23,12 @@ package appeng.api.parts; +import appeng.api.util.AEPartLocation; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import appeng.api.util.AEPartLocation; - /** * Used Internally. * @@ -59,8 +58,6 @@ public interface IFacadePart { boolean notAEFacade(); - boolean isTransparent(); - /** * The item that this facade masquerades as. */ diff --git a/src/main/java/appeng/block/misc/BlockQuartzFixture.java b/src/main/java/appeng/block/misc/BlockQuartzFixture.java index f7c2b32df..81dcb6996 100644 --- a/src/main/java/appeng/block/misc/BlockQuartzFixture.java +++ b/src/main/java/appeng/block/misc/BlockQuartzFixture.java @@ -18,12 +18,13 @@ package appeng.block.misc; -import java.util.EnumMap; -import java.util.Map; -import java.util.Random; - -import javax.annotation.Nullable; - +import appeng.api.util.IOrientable; +import appeng.api.util.IOrientableBlock; +import appeng.block.AEBaseBlock; +import appeng.client.render.effects.ParticleTypes; +import appeng.core.AEConfig; +import appeng.core.AppEng; +import appeng.helpers.MetaRotation; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -47,13 +48,10 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.util.IOrientable; -import appeng.api.util.IOrientableBlock; -import appeng.block.AEBaseBlock; -import appeng.client.render.effects.ParticleTypes; -import appeng.core.AEConfig; -import appeng.core.AppEng; -import appeng.helpers.MetaRotation; +import javax.annotation.Nullable; +import java.util.EnumMap; +import java.util.Map; +import java.util.Random; public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock { @@ -84,8 +82,6 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock .sound(SoundType.GLASS)); this.setDefaultState(getDefaultState().with(FACING, Direction.UP).with(ODD, false)); - this.setFullSize(false); - this.setOpaque(false); } @Override diff --git a/src/main/java/appeng/block/misc/BlockTinyTNT.java b/src/main/java/appeng/block/misc/BlockTinyTNT.java index f0c8ad1be..e03e49bcc 100644 --- a/src/main/java/appeng/block/misc/BlockTinyTNT.java +++ b/src/main/java/appeng/block/misc/BlockTinyTNT.java @@ -18,8 +18,8 @@ package appeng.block.misc; -import javax.annotation.Nullable; - +import appeng.block.AEBaseBlock; +import appeng.entity.EntityTinyTNTPrimed; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -43,8 +43,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -import appeng.block.AEBaseBlock; -import appeng.entity.EntityTinyTNTPrimed; +import javax.annotation.Nullable; public class BlockTinyTNT extends AEBaseBlock { @@ -53,6 +52,7 @@ public class BlockTinyTNT extends AEBaseBlock { public BlockTinyTNT(Block.Properties props) { super(props); + setFullSize(setOpaque(false)); } @Override diff --git a/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java b/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java index ac5ef9bad..fe5ae088f 100644 --- a/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java +++ b/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java @@ -18,28 +18,17 @@ package appeng.client.render; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Random; - -import javax.annotation.Nullable; - -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.model.BakedQuad; +import appeng.client.render.cablebus.FacadeBuilder; +import appeng.items.parts.ItemFacade; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; import net.minecraft.world.World; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; - -import appeng.client.render.cablebus.FacadeBuilder; -import appeng.items.parts.ItemFacade; -import net.minecraftforge.client.model.data.IModelData; +import java.util.Objects; /** * This baked model class is used as a dispatcher to redirect the renderer to diff --git a/src/main/java/appeng/client/render/FacadeItemModel.java b/src/main/java/appeng/client/render/FacadeItemModel.java index b9e45bb09..281fdc545 100644 --- a/src/main/java/appeng/client/render/FacadeItemModel.java +++ b/src/main/java/appeng/client/render/FacadeItemModel.java @@ -41,7 +41,9 @@ public class FacadeItemModel implements IModelGeometry { private static final ResourceLocation MODEL_BASE = new ResourceLocation(AppEng.MOD_ID, "item/facade_base"); @Override - public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation) { + public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, + Function spriteGetter, IModelTransform modelTransform, + ItemOverrideList overrides, ResourceLocation modelLocation) { IBakedModel bakedBaseModel = bakery.getBakedModel(MODEL_BASE, modelTransform, spriteGetter); FacadeBuilder facadeBuilder = new FacadeBuilder(); @@ -49,7 +51,8 @@ public class FacadeItemModel implements IModelGeometry { } @Override - public Collection getTextures(IModelConfiguration owner, Function modelGetter, Set> missingTextureErrors) { + public Collection getTextures(IModelConfiguration owner, + Function modelGetter, Set> missingTextureErrors) { return modelGetter.apply(MODEL_BASE).getTextures(modelGetter, missingTextureErrors); } diff --git a/src/main/java/appeng/core/AEItemGroup.java b/src/main/java/appeng/core/AEItemGroup.java index d76e2fdcc..3d1ab891d 100644 --- a/src/main/java/appeng/core/AEItemGroup.java +++ b/src/main/java/appeng/core/AEItemGroup.java @@ -1,16 +1,15 @@ package appeng.core; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - import appeng.api.AEApi; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; + +import java.util.ArrayList; +import java.util.List; public class AEItemGroup extends ItemGroup { diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index f2e5a49f2..21d6ec5d9 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -18,14 +18,34 @@ package appeng.core; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; - +import appeng.block.paint.PaintSplotchesModel; +import appeng.block.qnb.QnbFormedModel; +import appeng.bootstrap.components.IClientSetupComponent; +import appeng.bootstrap.components.IInitComponent; +import appeng.bootstrap.components.IPostInitComponent; +import appeng.capabilities.Capabilities; +import appeng.client.ClientHelper; +import appeng.client.render.DummyFluidItemModel; 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.CraftingCubeModelLoader; +import appeng.client.render.crafting.EncodedPatternModelLoader; +import appeng.client.render.model.*; +import appeng.client.render.spatial.SpatialPylonModel; +import appeng.core.crash.ModCrashEnhancement; +import appeng.core.features.registries.PartModels; +import appeng.core.stats.AdvancementTriggers; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.worlddata.WorldData; +import appeng.entity.*; +import appeng.hooks.TickHandler; +import appeng.integration.Integrations; +import appeng.parts.PartPlacement; +import appeng.parts.automation.PlaneModelLoader; +import appeng.server.ServerHelper; import com.google.common.base.Stopwatch; - import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; @@ -58,42 +78,9 @@ import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import appeng.block.paint.PaintSplotchesModel; -import appeng.block.qnb.QnbFormedModel; -import appeng.bootstrap.components.IClientSetupComponent; -import appeng.bootstrap.components.IInitComponent; -import appeng.bootstrap.components.IPostInitComponent; -import appeng.capabilities.Capabilities; -import appeng.client.ClientHelper; -import appeng.client.render.DummyFluidItemModel; -import appeng.client.render.SimpleModelLoader; -import appeng.client.render.cablebus.CableBusModelLoader; -import appeng.client.render.cablebus.P2PTunnelFrequencyModel; -import appeng.client.render.crafting.CraftingCubeModelLoader; -import appeng.client.render.crafting.EncodedPatternModelLoader; -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.model.UVLModelLoader; -import appeng.client.render.spatial.SpatialPylonModel; -import appeng.core.crash.ModCrashEnhancement; -import appeng.core.features.registries.PartModels; -import appeng.core.stats.AdvancementTriggers; -import appeng.core.sync.network.NetworkHandler; -import appeng.core.worlddata.WorldData; -import appeng.entity.EntityChargedQuartz; -import appeng.entity.EntityGrowingCrystal; -import appeng.entity.EntitySingularity; -import appeng.entity.EntityTinyTNTPrimed; -import appeng.entity.RenderTinyTNTPrimed; -import appeng.hooks.TickHandler; -import appeng.integration.Integrations; -import appeng.parts.PartPlacement; -import appeng.parts.automation.PlaneModelLoader; -import appeng.server.ServerHelper; +import javax.annotation.Nonnull; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; @Mod(AppEng.MOD_ID) public final class AppEng { @@ -132,11 +119,8 @@ public final class AppEng { CrashReportExtender.registerCrashCallable(new ModCrashEnhancement()); - // FIXMEthis.registration = new Registration(); - // FIXMEMinecraftForge.EVENT_BUS.register( this.registration ); - CreativeTab.init(); - CreativeTabFacade.init(); + new FacadeItemGroup(); // This call has a side-effect (adding it to the creative screen) IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); registration = new Registration(); @@ -241,21 +225,6 @@ public final class AppEng { return INSTANCE; } -// public Biome getStorageBiome() -// { -// return this.registration.storageBiome; -// } -// -// public DimensionType getStorageDimensionType() -// { -// return this.registration.storageDimensionType; -// } -// -// public int getStorageDimensionID() -// { -// return this.registration.storageDimensionID; -// } - public AdvancementTriggers getAdvancementTriggers() { return this.registration.advancementTriggers; } diff --git a/src/main/java/appeng/core/CreativeTabFacade.java b/src/main/java/appeng/core/CreativeTabFacade.java deleted file mode 100644 index 7ea1cf381..000000000 --- a/src/main/java/appeng/core/CreativeTabFacade.java +++ /dev/null @@ -1,46 +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.core; - -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; - -public final class CreativeTabFacade { - public static ItemGroup instance = null; - - static void init() { - instance = new ItemGroup("appliedenergistics2.facades") { - - @Override - public ItemStack createIcon() { - - // FIXME final Optional maybeFacade = - // AEApi.instance().definitions().items().facade().maybeItem(); - // FIXME if( maybeFacade.isPresent() ) - { - // FIXME return ( (ItemFacade) maybeFacade.get() ).getCreativeTabIcon(); - } - - return new ItemStack(Blocks.OAK_PLANKS); - } - }; - } - -} \ No newline at end of file diff --git a/src/main/java/appeng/core/FacadeConfig.java b/src/main/java/appeng/core/FacadeConfig.java deleted file mode 100644 index 7f503d553..000000000 --- a/src/main/java/appeng/core/FacadeConfig.java +++ /dev/null @@ -1,148 +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.core; - -import java.io.File; - -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; - -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; - -public class FacadeConfig { - - private static final String CONFIG_VERSION = "1"; - private static final String CONFIG_COMMON_KEY = "common"; - private static final String CONFIG_COMMON_COMMENT = "Settings applied to all facades.\n\n" // - + "By default full blocks with no tile entity and a model do not need whitelisting.\n"// - + "This will only be read once during client startup."; - private static final String CONFIG_COMMON_ALLOW_TILEENTITIES_KEY = "allowTileEntityFacades"; - private static final String CONFIG_COMMON_ALLOW_TILEENTITIES_COMMENT = "Unsupported: Allows whitelisting TileEntity as facades. Could work, have render issues, or corrupt your world. USE AT YOUR OWN RISK."; - private static final String CONFIG_FACADES_KEY = "facades"; - private static final String CONFIG_FACADES_COMMENT = "A way to explicitly handle certain blocks as facades.\n\n" // - + "Blocks can be added by their resource location under the following rules.\n" // - + " - One category per domain like minecraft or appliedenergistics2\n" // - + " - One key per id. E.g. glass in case of minecraft:glass\n" // - + " - An integer value ranging from 0 to 16 representing the metadata 0-15 and 16 as wildcard for all" // - + " - Multiple entries for the same id but different metadata are possible when needed"; - - private static FacadeConfig instance; - - private final boolean allowTileEntityFacades; - private final Object2IntMap whiteList; - - private FacadeConfig(boolean allowTileEntityFacades, Object2IntMap whiteList) { - this.allowTileEntityFacades = allowTileEntityFacades; - this.whiteList = whiteList; - } - - /** - * Creates a custom confuration based on a {@link Configuration}, but ultimately - * throws it away after reading it once to save a couple MB of memory. - * - * @param configFile - */ - public static void init(final File configFile) { -// FIXME final Configuration configurartion = migrate( new Configuration( configFile, CONFIG_VERSION ) ); -// FIXME -// FIXME final boolean allowTileEntityFacades = configurartion -// FIXME .get( CONFIG_COMMON_KEY, CONFIG_COMMON_ALLOW_TILEENTITIES_KEY, false, CONFIG_COMMON_ALLOW_TILEENTITIES_COMMENT ) -// FIXME .setRequiresMcRestart( true ) -// FIXME .setShowInGui( false ) -// FIXME .getBoolean(); -// FIXME -// FIXME final Object2IntMap configWhiteList = new Object2IntArrayMap<>(); -// FIXME -// FIXME final Set whitelist = configurartion.getCategory( CONFIG_FACADES_KEY ).getChildren(); -// FIXME for( ConfigCategory configCategory : whitelist ) -// FIXME { -// FIXME final String domain = configCategory.getName(); -// FIXME final Map values = configCategory.getValues(); -// FIXME -// FIXME for( Entry entry : values.entrySet() ) -// FIXME { -// FIXME configWhiteList.put( new ResourceLocation( domain, entry.getKey() ), entry.getValue().getInt() ); -// FIXME } -// FIXME } -// FIXME -// FIXME if( configurartion.hasChanged() ) -// FIXME { -// FIXME configurartion.save(); -// FIXME } - - instance = new FacadeConfig(false, new Object2IntArrayMap<>()); // FIXME - } - -// FIXME private static Configuration migrate( Configuration configurartion ) -// FIXME { -// FIXME // Clear pre rv6 configs. -// FIXME if( configurartion.getLoadedConfigVersion() == null ) -// FIXME { -// FIXME for( String category : configurartion.getCategoryNames() ) -// FIXME { -// FIXME final ConfigCategory c = configurartion.getCategory( category ); -// FIXME configurartion.removeCategory( c ); -// FIXME } -// FIXME } -// FIXME -// FIXME // Create general category, if missing -// FIXME if( !configurartion.hasCategory( CONFIG_COMMON_KEY ) ) -// FIXME { -// FIXME configurartion.getCategory( CONFIG_COMMON_KEY ).setComment( CONFIG_COMMON_COMMENT ); -// FIXME } -// FIXME -// FIXME // Create whitelist, if missing -// FIXME if( !configurartion.hasCategory( CONFIG_FACADES_KEY ) ) -// FIXME { -// FIXME final ConfigCategory category = configurartion.getCategory( CONFIG_FACADES_KEY ); -// FIXME category.setComment( CONFIG_FACADES_COMMENT ); -// FIXME -// FIXME // Whitelist some vanilla blocks like glass -// FIXME final ConfigCategory minecraft = new ConfigCategory( "minecraft", category ); -// FIXME minecraft.put( "glass", new Property( "glass", "16", Type.INTEGER ) ); -// FIXME minecraft.put( "stained_glass", new Property( "stained_glass", "16", Type.INTEGER ) ); -// FIXME -// FIXME // Whitelist some AE2 blocks like quartz glass -// FIXME final ConfigCategory appliedenergistics = new ConfigCategory( "appliedenergistics2", category ); -// FIXME appliedenergistics.put( "quartz_glass", new Property( "quartz_glass", "16", Type.INTEGER ) ); -// FIXME appliedenergistics.put( "quartz_vibrant_glass", new Property( "quartz_vibrant_glass", "16", Type.INTEGER ) ); -// FIXME } -// FIXME -// FIXME return configurartion; -// FIXME } - - public static FacadeConfig instance() { - return instance; - } - - public boolean allowTileEntityFacades() { - return this.allowTileEntityFacades; - } - - public boolean isWhiteListed(final Block block, final int metadata) { - final Integer entry = this.whiteList.get(block.getRegistryName()); - - if (entry != null) { - return entry == metadata || entry == 16; - } - - return false; - } -} diff --git a/src/main/java/appeng/core/FacadeItemGroup.java b/src/main/java/appeng/core/FacadeItemGroup.java new file mode 100644 index 000000000..b9a67312e --- /dev/null +++ b/src/main/java/appeng/core/FacadeItemGroup.java @@ -0,0 +1,90 @@ +/* + * 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.core; + +import appeng.items.parts.ItemFacade; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.NonNullList; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; + +public final class FacadeItemGroup extends ItemGroup { + + private final ItemFacade itemFacade; + + private List subTypes = null; + + public FacadeItemGroup() { + super("appliedenergistics2.facades"); + + itemFacade = (ItemFacade) Api.INSTANCE.definitions().items().facade().item(); + } + + @Override + public ItemStack createIcon() { + this.calculateSubTypes(); + if (this.subTypes.isEmpty()) { + return new ItemStack(Items.CAKE); + } + return this.subTypes.get(0); + } + + @Override + public void fill(NonNullList items) { + this.calculateSubTypes(); + items.addAll(subTypes); + } + + private void calculateSubTypes() { + if (this.subTypes != null) { + return; + } + this.subTypes = new ArrayList<>(1000); + + for (final Block b : ForgeRegistries.BLOCKS) { + try { + final Item item = Item.getItemFromBlock(b); + if (item == Items.AIR) { + continue; + } + + Item blockItem = b.asItem(); + if (blockItem != Items.AIR && blockItem.getGroup() != null) { + final NonNullList tmpList = NonNullList.create(); + b.fillItemGroup(blockItem.getGroup(), tmpList); + for (final ItemStack l : tmpList) { + final ItemStack facade = itemFacade.createFacadeForItem(l, false); + if (!facade.isEmpty()) { + this.subTypes.add(facade); + } + } + } + } catch (final Throwable t) { + // just absorb.. + } + } + } + +} diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 7d54972bc..b6c5d79a6 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -18,49 +18,6 @@ package appeng.core; -import appeng.items.parts.ItemFacade; -import appeng.recipes.game.FacadeRecipe; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScreenManager; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.entity.EntityType; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.Item; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.particles.ParticleType; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.gen.GenerationStage; -import net.minecraft.world.gen.feature.*; -import net.minecraft.world.gen.placement.CountRangeConfig; -import net.minecraft.world.gen.placement.IPlacementConfig; -import net.minecraft.world.gen.placement.Placement; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.ColorHandlerEvent; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; -import net.minecraftforge.client.event.TextureStitchEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.common.ModDimension; -import net.minecraftforge.common.crafting.CraftingHelper; -import net.minecraftforge.common.extensions.IForgeContainerType; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.event.server.FMLServerStartingEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLEnvironment; -import net.minecraftforge.fml.network.IContainerFactory; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; - import appeng.api.AEApi; import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; @@ -79,45 +36,8 @@ import appeng.api.networking.security.ISecurityGrid; import appeng.api.networking.spatial.ISpatialCache; import appeng.api.networking.storage.IStorageGrid; import appeng.api.networking.ticking.ITickManager; -import appeng.bootstrap.components.IBlockRegistrationComponent; -import appeng.bootstrap.components.IEntityRegistrationComponent; -import appeng.bootstrap.components.IItemColorRegistrationComponent; -import appeng.bootstrap.components.IItemRegistrationComponent; -import appeng.bootstrap.components.IModelBakeComponent; -import appeng.bootstrap.components.ITileEntityRegistrationComponent; -import appeng.client.gui.implementations.GuiCellWorkbench; -import appeng.client.gui.implementations.GuiChest; -import appeng.client.gui.implementations.GuiCondenser; -import appeng.client.gui.implementations.GuiCraftAmount; -import appeng.client.gui.implementations.GuiCraftConfirm; -import appeng.client.gui.implementations.GuiCraftingCPU; -import appeng.client.gui.implementations.GuiCraftingStatus; -import appeng.client.gui.implementations.GuiCraftingTerm; -import appeng.client.gui.implementations.GuiDrive; -import appeng.client.gui.implementations.GuiFormationPlane; -import appeng.client.gui.implementations.GuiGrinder; -import appeng.client.gui.implementations.GuiIOPort; -import appeng.client.gui.implementations.GuiInscriber; -import appeng.client.gui.implementations.GuiInterface; -import appeng.client.gui.implementations.GuiInterfaceTerminal; -import appeng.client.gui.implementations.GuiLevelEmitter; -import appeng.client.gui.implementations.GuiMEMonitorable; -import appeng.client.gui.implementations.GuiMEPortableCell; -import appeng.client.gui.implementations.GuiMolecularAssembler; -import appeng.client.gui.implementations.GuiNetworkStatus; -import appeng.client.gui.implementations.GuiNetworkTool; -import appeng.client.gui.implementations.GuiPatternTerm; -import appeng.client.gui.implementations.GuiPriority; -import appeng.client.gui.implementations.GuiQNB; -import appeng.client.gui.implementations.GuiQuartzKnife; -import appeng.client.gui.implementations.GuiSecurityStation; -import appeng.client.gui.implementations.GuiSkyChest; -import appeng.client.gui.implementations.GuiSpatialIOPort; -import appeng.client.gui.implementations.GuiStorageBus; -import appeng.client.gui.implementations.GuiUpgradeable; -import appeng.client.gui.implementations.GuiVibrationChamber; -import appeng.client.gui.implementations.GuiWireless; -import appeng.client.gui.implementations.GuiWirelessTerm; +import appeng.bootstrap.components.*; +import appeng.client.gui.implementations.*; import appeng.client.render.effects.*; import appeng.client.render.model.BiometricCardModel; import appeng.client.render.model.DriveModel; @@ -127,39 +47,7 @@ import appeng.client.render.tesr.InscriberTESR; import appeng.client.render.tesr.SkyChestTESR; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpener; -import appeng.container.implementations.ContainerCellWorkbench; -import appeng.container.implementations.ContainerChest; -import appeng.container.implementations.ContainerCondenser; -import appeng.container.implementations.ContainerCraftAmount; -import appeng.container.implementations.ContainerCraftConfirm; -import appeng.container.implementations.ContainerCraftingCPU; -import appeng.container.implementations.ContainerCraftingStatus; -import appeng.container.implementations.ContainerCraftingTerm; -import appeng.container.implementations.ContainerDrive; -import appeng.container.implementations.ContainerFormationPlane; -import appeng.container.implementations.ContainerGrinder; -import appeng.container.implementations.ContainerIOPort; -import appeng.container.implementations.ContainerInscriber; -import appeng.container.implementations.ContainerInterface; -import appeng.container.implementations.ContainerInterfaceTerminal; -import appeng.container.implementations.ContainerLevelEmitter; -import appeng.container.implementations.ContainerMEMonitorable; -import appeng.container.implementations.ContainerMEPortableCell; -import appeng.container.implementations.ContainerMolecularAssembler; -import appeng.container.implementations.ContainerNetworkStatus; -import appeng.container.implementations.ContainerNetworkTool; -import appeng.container.implementations.ContainerPatternTerm; -import appeng.container.implementations.ContainerPriority; -import appeng.container.implementations.ContainerQNB; -import appeng.container.implementations.ContainerQuartzKnife; -import appeng.container.implementations.ContainerSecurityStation; -import appeng.container.implementations.ContainerSkyChest; -import appeng.container.implementations.ContainerSpatialIOPort; -import appeng.container.implementations.ContainerStorageBus; -import appeng.container.implementations.ContainerUpgradeable; -import appeng.container.implementations.ContainerVibrationChamber; -import appeng.container.implementations.ContainerWireless; -import appeng.container.implementations.ContainerWirelessTerm; +import appeng.container.implementations.*; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.PartModels; import appeng.core.features.registries.cell.BasicCellHandler; @@ -168,29 +56,14 @@ import appeng.core.features.registries.cell.CreativeCellHandler; import appeng.core.stats.AdvancementTriggers; import appeng.core.stats.AeStats; import appeng.core.stats.PartItemPredicate; -import appeng.fluids.client.gui.GuiFluidFormationPlane; -import appeng.fluids.client.gui.GuiFluidIO; -import appeng.fluids.client.gui.GuiFluidInterface; -import appeng.fluids.client.gui.GuiFluidLevelEmitter; -import appeng.fluids.client.gui.GuiFluidStorageBus; -import appeng.fluids.client.gui.GuiFluidTerminal; -import appeng.fluids.container.ContainerFluidFormationPlane; -import appeng.fluids.container.ContainerFluidIO; -import appeng.fluids.container.ContainerFluidInterface; -import appeng.fluids.container.ContainerFluidLevelEmitter; -import appeng.fluids.container.ContainerFluidStorageBus; -import appeng.fluids.container.ContainerFluidTerminal; +import appeng.fluids.client.gui.*; +import appeng.fluids.container.*; import appeng.fluids.registries.BasicFluidCellGuiHandler; -import appeng.me.cache.CraftingGridCache; -import appeng.me.cache.EnergyGridCache; -import appeng.me.cache.GridStorageCache; -import appeng.me.cache.P2PCache; -import appeng.me.cache.PathGridCache; -import appeng.me.cache.SecurityCache; -import appeng.me.cache.SpatialPylonCache; -import appeng.me.cache.TickManagerCache; +import appeng.items.parts.ItemFacade; +import appeng.me.cache.*; import appeng.recipes.conditions.FeaturesEnabled; import appeng.recipes.game.DisassembleRecipe; +import appeng.recipes.game.FacadeRecipe; import appeng.recipes.handlers.GrinderRecipe; import appeng.recipes.handlers.GrinderRecipeSerializer; import appeng.recipes.handlers.InscriberRecipe; @@ -203,6 +76,44 @@ import appeng.tile.crafting.MolecularAssemblerRenderer; import appeng.worldgen.ChargedQuartzOreConfig; import appeng.worldgen.ChargedQuartzOreFeature; import appeng.worldgen.MeteoriteStructure; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScreenManager; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.entity.EntityType; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.particles.ParticleType; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.placement.CountRangeConfig; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.placement.Placement; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.*; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.ModDimension; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.extensions.IForgeContainerType; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.network.IContainerFactory; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.IForgeRegistry; final class Registration { @@ -428,12 +339,8 @@ final class Registration { InscriberRecipe.TYPE = new AERecipeType<>(InscriberRecipeSerializer.INSTANCE.getRegistryName()); ItemFacade facadeItem = (ItemFacade) Api.INSTANCE.definitions().items().facade().item(); - r.registerAll( - DisassembleRecipe.SERIALIZER, - GrinderRecipeSerializer.INSTANCE, - InscriberRecipeSerializer.INSTANCE, - FacadeRecipe.getSerializer(facadeItem) - ); + r.registerAll(DisassembleRecipe.SERIALIZER, GrinderRecipeSerializer.INSTANCE, + InscriberRecipeSerializer.INSTANCE, FacadeRecipe.getSerializer(facadeItem)); CraftingHelper.register(FeaturesEnabled.Serializer.INSTANCE); } diff --git a/src/main/java/appeng/facade/FacadePart.java b/src/main/java/appeng/facade/FacadePart.java index c5b9ac397..7653a4af2 100644 --- a/src/main/java/appeng/facade/FacadePart.java +++ b/src/main/java/appeng/facade/FacadePart.java @@ -18,6 +18,10 @@ package appeng.facade; +import appeng.api.parts.IBoxProvider; +import appeng.api.parts.IFacadePart; +import appeng.api.parts.IPartCollisionHelper; +import appeng.api.util.AEPartLocation; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; @@ -26,12 +30,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import appeng.api.AEApi; -import appeng.api.parts.IBoxProvider; -import appeng.api.parts.IFacadePart; -import appeng.api.parts.IPartCollisionHelper; -import appeng.api.util.AEPartLocation; - public class FacadePart implements IFacadePart, IBoxProvider { private final ItemStack facade; @@ -46,10 +44,6 @@ public class FacadePart implements IFacadePart, IBoxProvider { this.side = side; } - public static boolean isFacade(final ItemStack is) { - return is.getItem() instanceof IFacadeItem; - } - @Override public ItemStack getItemStack() { return this.facade; @@ -85,15 +79,6 @@ public class FacadePart implements IFacadePart, IBoxProvider { return !(this.facade.getItem() instanceof IFacadeItem); } - @Override - public boolean isTransparent() { - if (AEApi.instance().partHelper().getCableRenderMode().transparentFacades) { - return true; - } - - return false; // FIXME this.getBlockState().isOpaqueCube(); - } - @Override public ItemStack getTextureItem() { final Item maybeFacade = this.facade.getItem(); diff --git a/src/main/java/appeng/items/parts/ItemFacade.java b/src/main/java/appeng/items/parts/ItemFacade.java index 901d5916e..ec1937a39 100644 --- a/src/main/java/appeng/items/parts/ItemFacade.java +++ b/src/main/java/appeng/items/parts/ItemFacade.java @@ -18,9 +18,16 @@ package appeng.items.parts; -import java.util.ArrayList; -import java.util.List; - +import appeng.api.AEApi; +import appeng.api.exceptions.MissingDefinitionException; +import appeng.api.features.AEFeature; +import appeng.api.parts.IAlphaPassItem; +import appeng.api.util.AEPartLocation; +import appeng.core.AEConfig; +import appeng.core.AppEng; +import appeng.facade.FacadePart; +import appeng.facade.IFacadeItem; +import appeng.items.AEBaseItem; import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -29,29 +36,25 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.item.*; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.Tag; import net.minecraft.util.ActionResultType; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.EmptyBlockReader; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; -import appeng.api.exceptions.MissingDefinitionException; -import appeng.api.parts.IAlphaPassItem; -import appeng.api.util.AEPartLocation; -import appeng.core.AELog; -import appeng.core.FacadeConfig; -import appeng.facade.FacadePart; -import appeng.facade.IFacadeItem; -import appeng.items.AEBaseItem; - public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassItem { - private static final String TAG_ITEM_ID = "item"; + /** + * Block tag used to explicitly whitelist blocks for use in facades. + */ + private static final ResourceLocation TAG_WHITELISTED = new ResourceLocation(AppEng.MOD_ID, "whitelisted/facades"); - private List subTypes = null; + private static final String NBT_ITEM_ID = "item"; public ItemFacade(Properties properties) { super(properties); @@ -79,36 +82,6 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte @Override public void fillItemGroup(ItemGroup group, NonNullList items) { - this.calculateSubTypes(); - items.addAll(this.subTypes); - } - - private void calculateSubTypes() { - if (this.subTypes == null) { - this.subTypes = new ArrayList<>(1000); - for (final Block b : ForgeRegistries.BLOCKS) { - try { - final Item item = Item.getItemFromBlock(b); - if (item == Items.AIR) { - continue; - } - - Item blockItem = b.asItem(); - if (blockItem != Items.AIR && blockItem.getGroup() != null) { - final NonNullList tmpList = NonNullList.create(); - b.fillItemGroup(blockItem.getGroup(), tmpList); - for (final ItemStack l : tmpList) { - final ItemStack facade = this.createFacadeForItem(l, false); - if (!facade.isEmpty()) { - this.subTypes.add(facade); - } - } - } - } catch (final Throwable t) { - // just absorb.. - } - } - } } public ItemStack createFacadeForItem(final ItemStack itemStack, final boolean returnItem) { @@ -125,13 +98,14 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte // We only support the default state for facades. Sorry. BlockState blockState = block.getDefaultState(); - final boolean areTileEntitiesEnabled = false; // FacadeConfig.instance().allowTileEntityFacades(); - final boolean isWhiteListed = true; // FIXME FacadeConfig.instance().isWhiteListed(block); + final boolean areTileEntitiesEnabled = AEConfig.instance().isFeatureEnabled(AEFeature.TILE_ENTITY_FACADES); + Tag whitelistTag = BlockTags.getCollection().getOrCreate(TAG_WHITELISTED); + final boolean isWhiteListed = block.isIn(whitelistTag); final boolean isModel = blockState.getRenderType() == BlockRenderType.MODEL; final BlockState defaultState = block.getDefaultState(); final boolean isTileEntity = block.hasTileEntity(defaultState); - final boolean isFullCube = true; // FIXME defaultState.isFullCube( defaultState ); + final boolean isFullCube = defaultState.isNormalCube(EmptyBlockReader.INSTANCE, BlockPos.ZERO); final boolean isTileEntityAllowed = !isTileEntity || (areTileEntitiesEnabled && isWhiteListed); final boolean isBlockAllowed = isFullCube || isWhiteListed; @@ -143,7 +117,7 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte final ItemStack is = new ItemStack(this); final CompoundNBT data = new CompoundNBT(); - data.putString(TAG_ITEM_ID, itemStack.getItem().getRegistryName().toString()); + data.putString(NBT_ITEM_ID, itemStack.getItem().getRegistryName().toString()); is.setTag(data); return is; } @@ -161,33 +135,13 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte @Override public ItemStack getTextureItem(ItemStack is) { - CompoundNBT nbt = is.getTag(); if (nbt == null) { return ItemStack.EMPTY; } - ResourceLocation itemId; - - // Handle legacy facades - if (nbt.contains("x")) { - int[] data = nbt.getIntArray("x"); - if (data.length != 2) { - return ItemStack.EMPTY; - } - - Item item = Registry.ITEM.getByValue(data[0]); - if (item == null) { - return ItemStack.EMPTY; - } - - itemId = item.getRegistryName(); - } else { - // First item is numeric item id - itemId = new ResourceLocation(nbt.getString(TAG_ITEM_ID)); - } - + ResourceLocation itemId = new ResourceLocation(nbt.getString(NBT_ITEM_ID)); Item baseItem = ForgeRegistries.ITEMS.getValue(itemId); if (baseItem == null) { @@ -215,31 +169,18 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte return block.getDefaultState(); } - public List getFacades() { - this.calculateSubTypes(); - return this.subTypes; - } - - public ItemStack getCreativeTabIcon() { - this.calculateSubTypes(); - if (this.subTypes.isEmpty()) { - return new ItemStack(Items.CAKE); - } - return this.subTypes.get(0); - } - public ItemStack createFromID(final int id) { ItemStack facadeStack = AEApi.instance().definitions().items().facade().maybeStack(1).orElseThrow( () -> new MissingDefinitionException("Tried to create a facade, while facades are being deactivated.")); // Convert back to a registry name... Item item = Registry.ITEM.getByValue(id); - if (item == null) { + if (item == Items.AIR) { return ItemStack.EMPTY; } final CompoundNBT facadeTag = new CompoundNBT(); - facadeTag.putString(TAG_ITEM_ID, item.getRegistryName().toString()); + facadeTag.putString(NBT_ITEM_ID, item.getRegistryName().toString()); facadeStack.setTag(facadeTag); return facadeStack; diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 1d5a7a717..0c2c645ed 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -18,15 +18,26 @@ package appeng.parts; -import java.io.IOException; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; -import java.util.Set; - -import javax.annotation.Nullable; - +import appeng.api.AEApi; +import appeng.api.config.YesNo; +import appeng.api.exceptions.FailedConnectionException; +import appeng.api.implementations.parts.IPartCable; +import appeng.api.networking.IGridHost; +import appeng.api.networking.IGridNode; +import appeng.api.parts.*; +import appeng.api.util.AECableType; +import appeng.api.util.AEColor; +import appeng.api.util.AEPartLocation; +import appeng.api.util.DimensionalCoord; +import appeng.client.render.cablebus.CableBusRenderState; +import appeng.client.render.cablebus.CableCoreType; +import appeng.client.render.cablebus.FacadeRenderState; +import appeng.core.AELog; +import appeng.facade.FacadeContainer; +import appeng.helpers.AEMultiTile; +import appeng.me.GridConnection; +import appeng.parts.networking.PartCable; +import appeng.util.Platform; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -43,35 +54,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; -import appeng.api.AEApi; -import appeng.api.config.YesNo; -import appeng.api.exceptions.FailedConnectionException; -import appeng.api.implementations.parts.IPartCable; -import appeng.api.networking.IGridHost; -import appeng.api.networking.IGridNode; -import appeng.api.parts.IFacadeContainer; -import appeng.api.parts.IFacadePart; -import appeng.api.parts.IPart; -import appeng.api.parts.IPartCollisionHelper; -import appeng.api.parts.IPartHost; -import appeng.api.parts.IPartItem; -import appeng.api.parts.LayerFlags; -import appeng.api.parts.PartItemStack; -import appeng.api.parts.SelectedPart; -import appeng.api.util.AECableType; -import appeng.api.util.AEColor; -import appeng.api.util.AEPartLocation; -import appeng.api.util.DimensionalCoord; -import appeng.client.render.cablebus.CableBusRenderState; -import appeng.client.render.cablebus.CableCoreType; -import appeng.client.render.cablebus.FacadeRenderState; -import appeng.core.AELog; -import appeng.facade.FacadeContainer; -import appeng.helpers.AEMultiTile; -import appeng.me.GridConnection; -import appeng.parts.networking.PartCable; -import appeng.util.Platform; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.*; public class CableBusContainer extends CableBusStorage implements AEMultiTile, ICableBusContainer { @@ -876,9 +863,12 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I for (int x = 0; x < 7; x++) { AEPartLocation side = AEPartLocation.fromOrdinal(x); - final CompoundNBT def = data.getCompound("def:" + side.ordinal()); - final CompoundNBT extra = data.getCompound("extra:" + side.ordinal()); - if (def != null && extra != null) { + String defKey = "def:" + side.ordinal(); + String extraKey = "extra:" + side.ordinal(); + if (data.contains(defKey, Constants.NBT.TAG_COMPOUND) + && data.contains(extraKey, Constants.NBT.TAG_COMPOUND)) { + final CompoundNBT def = data.getCompound(defKey); + final CompoundNBT extra = data.getCompound(extraKey); IPart p = this.getPart(side); final ItemStack iss = ItemStack.read(def); if (iss.isEmpty()) { diff --git a/src/main/resources/assets/appliedenergistics2/models/item/facade.json b/src/main/resources/assets/appliedenergistics2/models/item/facade.json index b264e8022..6af2a9b88 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/facade.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/facade.json @@ -1,3 +1,3 @@ { "loader": "appliedenergistics2:facade" -} \ No newline at end of file +} diff --git a/src/main/resources/data/appliedenergistics2/recipes/misc/facade.json b/src/main/resources/data/appliedenergistics2/recipes/misc/facade.json index fcf3cf1f9..bda66d438 100644 --- a/src/main/resources/data/appliedenergistics2/recipes/misc/facade.json +++ b/src/main/resources/data/appliedenergistics2/recipes/misc/facade.json @@ -1,3 +1,3 @@ { "type": "appliedenergistics2:facade" -} \ No newline at end of file +} diff --git a/src/main/resources/data/appliedenergistics2/tags/blocks/whitelisted/facades.json b/src/main/resources/data/appliedenergistics2/tags/blocks/whitelisted/facades.json new file mode 100644 index 000000000..3ce0609a4 --- /dev/null +++ b/src/main/resources/data/appliedenergistics2/tags/blocks/whitelisted/facades.json @@ -0,0 +1,8 @@ +{ + "values": [ + "minecraft:glass", + "#forge:stained_glass", + "appliedenergistics2:quartz_glass", + "appliedenergistics2:quartz_vibrant_glass" + ] +}