From 6f2bbfab4c77bd6f255c3a8940e5aec57ad352b2 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 22 Aug 2016 14:25:10 +0200 Subject: [PATCH] Major Refactoring of Bootstrap Code (#75) - Refactored boostrap code: * Completely reworked item/block/tile registration. * Fixed server side startup. * Fixed server side startup. * More documentation. * More heavy cleanup * More cleanups. * Major refactoring of state mapping and fixes a lot of other issue related to item rendering. * Fixes sky chest item models (no item TESR). * Only use CachingRotatingBakedModel for tile entities automatically. Fix default rotation of quartz pillar for item model. * Used method reference instead of lambda for ItemMeshDefinition for multiparts. * Removed unnecessary IHasSpecialItemModel * Removed unused IconReg class. * Updated resource pack version. --- src/main/java/appeng/block/AEBaseBlock.java | 86 +------ .../java/appeng/block/AEBaseStairBlock.java | 25 +- .../java/appeng/block/AEBaseTileBlock.java | 69 ++---- .../appeng/block/IHasSpecialItemModel.java | 8 - .../java/appeng/block/UnlistedDirection.java | 42 ++++ .../block/crafting/BlockCraftingStorage.java | 6 - .../block/crafting/BlockCraftingUnit.java | 18 +- .../crafting/BlockMolecularAssembler.java | 5 - .../appeng/block/grindstone/BlockCrank.java | 5 - .../appeng/block/grindstone/BlockGrinder.java | 5 - .../appeng/block/misc/BlockCellWorkbench.java | 5 - .../java/appeng/block/misc/BlockCharger.java | 19 +- .../appeng/block/misc/BlockCondenser.java | 4 - .../appeng/block/misc/BlockInscriber.java | 5 - .../appeng/block/misc/BlockInterface.java | 4 - .../appeng/block/misc/BlockLightDetector.java | 14 -- .../java/appeng/block/misc/BlockPaint.java | 4 - .../misc/BlockQuartzGrowthAccelerator.java | 8 +- .../appeng/block/misc/BlockQuartzTorch.java | 4 - .../java/appeng/block/misc/BlockSecurity.java | 5 - .../appeng/block/misc/BlockSkyCompass.java | 4 - .../java/appeng/block/misc/BlockTinyTNT.java | 15 -- .../block/misc/BlockVibrationChamber.java | 6 +- .../block/networking/BlockCableBus.java | 21 +- .../block/networking/BlockController.java | 54 ++-- .../networking/BlockCreativeEnergyCell.java | 5 - .../networking/BlockDenseEnergyCell.java | 5 - .../block/networking/BlockEnergyAcceptor.java | 4 - .../block/networking/BlockEnergyCell.java | 51 +--- .../networking/BlockEnergyCellRendering.java | 62 +++++ .../block/networking/BlockWireless.java | 5 - .../block/networking/CableBusColor.java | 39 +++ .../networking/CableModelCustomizer.java | 29 +++ .../appeng/block/qnb/BlockQuantumBase.java | 5 - .../block/spatial/BlockMatrixFrame.java | 4 - .../block/spatial/BlockSpatialIOPort.java | 5 - .../block/spatial/BlockSpatialPylon.java | 5 - .../java/appeng/block/storage/BlockChest.java | 4 - .../java/appeng/block/storage/BlockDrive.java | 4 - .../appeng/block/storage/BlockIOPort.java | 4 - .../appeng/block/storage/BlockSkyChest.java | 31 +-- .../storage/SkyChestRenderingCustomizer.java | 50 ++++ .../bootstrap/BlockDefinitionBuilder.java | 216 ++++++++++++++++ .../java/appeng/bootstrap/BlockRendering.java | 99 ++++++++ .../bootstrap/BlockRenderingCustomizer.java | 18 ++ .../java/appeng/bootstrap/FeatureFactory.java | 116 +++++++++ .../java/appeng/bootstrap/IBlockBuilder.java | 34 +++ .../appeng/bootstrap/IBlockRendering.java | 34 +++ .../appeng/bootstrap/IBootstrapComponent.java | 24 ++ .../java/appeng/bootstrap/IItemBuilder.java | 28 +++ .../java/appeng/bootstrap/IItemRendering.java | 69 ++++++ .../bootstrap/ItemDefinitionBuilder.java | 112 +++++++++ .../java/appeng/bootstrap/ItemRendering.java | 140 +++++++++++ .../bootstrap/ItemRenderingCustomizer.java | 17 ++ .../components/BlockColorComponent.java | 29 +++ .../bootstrap/components/InitComponent.java | 16 ++ .../components/ItemColorComponent.java | 28 +++ .../ItemMeshDefinitionComponent.java | 34 +++ .../components/ItemModelComponent.java | 42 ++++ .../components/ItemVariantsComponent.java | 33 +++ .../components/ModelOverrideComponent.java | 65 +++++ .../components/PostInitComponent.java | 15 ++ .../components/PreInitComponent.java | 15 ++ .../components/StateMapperComponent.java | 38 +++ .../bootstrap/components/TesrComponent.java | 34 +++ src/main/java/appeng/client/ClientHelper.java | 73 ------ .../render/model/AEIgnoringStateMapper.java | 68 ------ .../pipeline/DoubleFacingQuadRotator.java | 9 +- .../client/render/tesr/ModularTESR.java | 4 +- .../client/render/tesr/SkyChestTESR.java | 4 +- src/main/java/appeng/core/AEConfig.java | 6 + src/main/java/appeng/core/ApiDefinitions.java | 27 +- src/main/java/appeng/core/AppEng.java | 1 - .../appeng/core/FeatureHandlerRegistry.java | 41 ---- .../java/appeng/core/FeatureRegistry.java | 41 ---- src/main/java/appeng/core/Registration.java | 37 ++- .../core/api/definitions/ApiBlocks.java | 231 ++++++++++++------ .../appeng/core/api/definitions/ApiItems.java | 105 ++++---- .../core/api/definitions/ApiMaterials.java | 29 ++- .../appeng/core/api/definitions/ApiParts.java | 33 ++- .../definitions/DefinitionConstructor.java | 120 --------- .../core/features/AEBlockFeatureHandler.java | 151 ------------ .../features/AECableBusFeatureHandler.java | 176 ------------- .../features/AETileBlockFeatureHandler.java | 172 ------------- .../appeng/core/features/BlockDefinition.java | 126 +--------- .../core/features/FeatureNameExtractor.java | 96 -------- .../core/features/FeaturedActiveChecker.java | 48 ---- .../java/appeng/core/features/IAEFeature.java | 27 -- .../appeng/core/features/IFeatureHandler.java | 47 ---- .../appeng/core/features/ItemDefinition.java | 19 +- .../core/features/ItemFeatureHandler.java | 153 ------------ .../appeng/core/features/TileDefinition.java | 34 +-- .../java/appeng/debug/BlockChunkloader.java | 3 - .../java/appeng/debug/BlockCubeGenerator.java | 4 - src/main/java/appeng/debug/BlockItemGen.java | 4 - .../java/appeng/debug/BlockPhantomNode.java | 4 - src/main/java/appeng/debug/ToolDebugCard.java | 7 - src/main/java/appeng/debug/ToolEraser.java | 7 - .../appeng/debug/ToolMeteoritePlacer.java | 8 - .../java/appeng/debug/ToolReplicatorCard.java | 8 - .../solid/BlockChargedQuartzOre.java | 3 + .../decorative/solid/BlockChiseledQuartz.java | 5 - .../appeng/decorative/solid/BlockFluix.java | 5 - .../appeng/decorative/solid/BlockQuartz.java | 5 - .../decorative/solid/BlockQuartzGlass.java | 4 - .../decorative/solid/BlockQuartzLamp.java | 6 +- .../decorative/solid/BlockQuartzOre.java | 10 - .../decorative/solid/BlockQuartzPillar.java | 7 +- .../decorative/solid/BlockSkyStone.java | 8 +- .../decorative/stair/BlockStairCommon.java | 5 +- src/main/java/appeng/items/AEBaseItem.java | 64 +---- .../appeng/items/materials/ItemMultiItem.java | 27 +- .../appeng/items/materials/MaterialType.java | 136 +++++------ .../appeng/items/misc/ItemCrystalSeed.java | 84 +------ .../items/misc/ItemCrystalSeedRendering.java | 85 +++++++ .../appeng/items/misc/ItemEncodedPattern.java | 9 - .../java/appeng/items/misc/ItemPaintBall.java | 51 +--- .../items/misc/ItemPaintBallRendering.java | 46 ++++ .../java/appeng/items/parts/ItemFacade.java | 3 - .../appeng/items/parts/ItemMultiPart.java | 13 +- .../items/parts/ItemMultipartRendering.java | 33 +++ .../items/storage/ItemBasicStorageCell.java | 6 - .../storage/ItemCreativeStorageCell.java | 4 - .../items/storage/ItemSpatialStorageCell.java | 6 - .../appeng/items/storage/ItemViewCell.java | 4 - .../appeng/items/tools/ToolBiometricCard.java | 2 - .../appeng/items/tools/ToolMemoryCard.java | 3 - .../appeng/items/tools/ToolNetworkTool.java | 8 - .../items/tools/powered/ToolChargedStaff.java | 8 +- .../tools/powered/ToolColorApplicator.java | 10 +- .../tools/powered/ToolEntropyManipulator.java | 11 +- .../items/tools/powered/ToolMassCannon.java | 10 +- .../items/tools/powered/ToolPortableCell.java | 7 +- .../tools/powered/ToolWirelessTerminal.java | 7 +- .../powered/powersink/AEBasePoweredItem.java | 7 +- .../powered/powersink/AERootPoweredItem.java | 5 +- .../items/tools/quartz/ToolQuartzAxe.java | 24 +- .../tools/quartz/ToolQuartzCuttingKnife.java | 7 - .../items/tools/quartz/ToolQuartzHoe.java | 33 +-- .../items/tools/quartz/ToolQuartzPickaxe.java | 24 +- .../items/tools/quartz/ToolQuartzSpade.java | 25 +- .../items/tools/quartz/ToolQuartzSword.java | 26 +- .../items/tools/quartz/ToolQuartzWrench.java | 10 +- .../blockstates/creative_energy_cell.json | 2 +- .../blockstates/dense_energy_cell.json | 16 +- .../blockstates/energy_cell.json | 16 +- .../blockstates/quartz_lamp.json | 34 ++- .../creative_energy_cell.json | 0 .../dense_energy_cell0.json | 0 .../dense_energy_cell1.json | 0 .../dense_energy_cell2.json | 0 .../dense_energy_cell3.json | 0 .../dense_energy_cell4.json | 0 .../dense_energy_cell5.json | 0 .../dense_energy_cell6.json | 0 .../dense_energy_cell7.json | 0 .../energy_cell0.json | 0 .../energy_cell1.json | 0 .../energy_cell2.json | 0 .../energy_cell3.json | 0 .../energy_cell4.json | 0 .../energy_cell5.json | 0 .../energy_cell6.json | 0 .../energy_cell7.json | 0 .../models/item/creative_energy_cell.json | 3 - .../models/item/fluix.json | 22 -- .../models/item/quartz_lamp.json | 2 +- .../models/item/quartz_pillar.json | 3 - .../models/item/sky_chest_block.json | 110 +-------- .../models/item/sky_chest_stone.json | 151 ++++-------- .../models/item/tiny_tnt.json | 3 - src/main/resources/pack.mcmeta | 2 +- 172 files changed, 2289 insertions(+), 2863 deletions(-) delete mode 100644 src/main/java/appeng/block/IHasSpecialItemModel.java create mode 100644 src/main/java/appeng/block/UnlistedDirection.java create mode 100644 src/main/java/appeng/block/networking/BlockEnergyCellRendering.java create mode 100644 src/main/java/appeng/block/networking/CableBusColor.java create mode 100644 src/main/java/appeng/block/networking/CableModelCustomizer.java create mode 100644 src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java create mode 100644 src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java create mode 100644 src/main/java/appeng/bootstrap/BlockRendering.java create mode 100644 src/main/java/appeng/bootstrap/BlockRenderingCustomizer.java create mode 100644 src/main/java/appeng/bootstrap/FeatureFactory.java create mode 100644 src/main/java/appeng/bootstrap/IBlockBuilder.java create mode 100644 src/main/java/appeng/bootstrap/IBlockRendering.java create mode 100644 src/main/java/appeng/bootstrap/IBootstrapComponent.java create mode 100644 src/main/java/appeng/bootstrap/IItemBuilder.java create mode 100644 src/main/java/appeng/bootstrap/IItemRendering.java create mode 100644 src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java create mode 100644 src/main/java/appeng/bootstrap/ItemRendering.java create mode 100644 src/main/java/appeng/bootstrap/ItemRenderingCustomizer.java create mode 100644 src/main/java/appeng/bootstrap/components/BlockColorComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/InitComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/ItemColorComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/ItemMeshDefinitionComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/ItemModelComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/ItemVariantsComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/ModelOverrideComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/PostInitComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/PreInitComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/StateMapperComponent.java create mode 100644 src/main/java/appeng/bootstrap/components/TesrComponent.java delete mode 100644 src/main/java/appeng/client/render/model/AEIgnoringStateMapper.java delete mode 100644 src/main/java/appeng/core/FeatureHandlerRegistry.java delete mode 100644 src/main/java/appeng/core/FeatureRegistry.java delete mode 100644 src/main/java/appeng/core/api/definitions/DefinitionConstructor.java delete mode 100644 src/main/java/appeng/core/features/AEBlockFeatureHandler.java delete mode 100644 src/main/java/appeng/core/features/AECableBusFeatureHandler.java delete mode 100644 src/main/java/appeng/core/features/AETileBlockFeatureHandler.java delete mode 100644 src/main/java/appeng/core/features/FeatureNameExtractor.java delete mode 100644 src/main/java/appeng/core/features/FeaturedActiveChecker.java delete mode 100644 src/main/java/appeng/core/features/IAEFeature.java delete mode 100644 src/main/java/appeng/core/features/IFeatureHandler.java delete mode 100644 src/main/java/appeng/core/features/ItemFeatureHandler.java create mode 100644 src/main/java/appeng/items/misc/ItemCrystalSeedRendering.java create mode 100644 src/main/java/appeng/items/misc/ItemPaintBallRendering.java create mode 100644 src/main/java/appeng/items/parts/ItemMultipartRendering.java rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/creative_energy_cell.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell0.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell1.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell2.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell3.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell4.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell5.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell6.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/dense_energy_cell7.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell0.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell1.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell2.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell3.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell4.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell5.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell6.json (100%) rename src/main/resources/assets/appliedenergistics2/models/block/{EnergyCell => energy_cell}/energy_cell7.json (100%) delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/creative_energy_cell.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/fluix.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/quartz_pillar.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/tiny_tnt.json diff --git a/src/main/java/appeng/block/AEBaseBlock.java b/src/main/java/appeng/block/AEBaseBlock.java index bf923f0c8..01e0acaf6 100644 --- a/src/main/java/appeng/block/AEBaseBlock.java +++ b/src/main/java/appeng/block/AEBaseBlock.java @@ -20,21 +20,16 @@ package appeng.block; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; import javax.annotation.Nullable; -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; -import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -53,27 +48,19 @@ import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; -import appeng.core.features.AEBlockFeatureHandler; -import appeng.core.features.AEFeature; -import appeng.core.features.FeatureNameExtractor; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; import appeng.helpers.AEGlassMaterial; import appeng.helpers.ICustomCollision; import appeng.util.LookDirection; import appeng.util.Platform; -public abstract class AEBaseBlock extends Block implements IAEFeature +public abstract class AEBaseBlock extends Block { - private final String featureFullName; - private final Optional featureSubName; private boolean isOpaque = true; private boolean isFullSize = true; private boolean hasSubtypes = false; private boolean isInventory = false; - private IFeatureHandler handler; protected AxisAlignedBB boundingBox = FULL_BLOCK_AABB; @@ -84,15 +71,6 @@ public abstract class AEBaseBlock extends Block implements IAEFeature } protected AEBaseBlock( final Material mat ) - { - this( mat, Optional.absent() ); - this.setLightOpacity( 255 ); - this.setLightLevel( 0 ); - this.setHardness( 2.2F ); - this.setHarvestLevel( "pickaxe", 0 ); - } - - protected AEBaseBlock( final Material mat, final Optional subName ) { super( mat ); @@ -113,14 +91,17 @@ public abstract class AEBaseBlock extends Block implements IAEFeature this.setSoundType( SoundType.METAL ); } - this.featureFullName = new FeatureNameExtractor( this.getClass(), subName ).get(); - this.featureSubName = subName; + this.setLightOpacity( 255 ); + this.setLightLevel( 0 ); + this.setHardness( 2.2F ); + this.setHarvestLevel( "pickaxe", 0 ); } @Override public String toString() { - return this.featureFullName; + String regName = getRegistryName() != null ? getRegistryName().getResourcePath() : "unregistered"; + return getClass().getSimpleName() + "[" + regName + "]"; } @Override @@ -134,29 +115,6 @@ public abstract class AEBaseBlock extends Block implements IAEFeature return new IProperty[0]; } - protected void setFeature( final EnumSet f ) - { - final AEBlockFeatureHandler featureHandler = new AEBlockFeatureHandler( f, this, this.getFeatureSubName() ); - this.setHandler( featureHandler ); - } - - @Override - public final IFeatureHandler handler() - { - return this.handler; - } - - protected final void setHandler( final IFeatureHandler handler ) - { - this.handler = handler; - } - - @Override - public void postInit() - { - // override! - } - public boolean isOpaque() { return this.isOpaque; @@ -379,7 +337,8 @@ public abstract class AEBaseBlock extends Block implements IAEFeature { if( this instanceof IOrientableBlock ) { - return ( (IOrientableBlock) this ).getOrientable( w, pos ); + IOrientableBlock orientable = (IOrientableBlock) this; + return orientable.getOrientable( w, pos ); } return null; } @@ -445,12 +404,6 @@ public abstract class AEBaseBlock extends Block implements IAEFeature super.getSubBlocks( item, tabs, itemStacks ); } - @SideOnly( Side.CLIENT ) - public void setRenderStateByMeta( final int itemDamage ) - { - - } - public String getUnlocalizedName( final ItemStack is ) { return this.getUnlocalizedName(); @@ -461,11 +414,6 @@ public abstract class AEBaseBlock extends Block implements IAEFeature } - public Class getItemBlockClass() - { - return AEBaseItemBlock.class; - } - public boolean hasSubtypes() { return this.hasSubtypes; @@ -553,11 +501,6 @@ public abstract class AEBaseBlock extends Block implements IAEFeature return isOpaque; } - public Optional getFeatureSubName() - { - return this.featureSubName; - } - public boolean isInventory() { return this.isInventory; @@ -573,15 +516,4 @@ public abstract class AEBaseBlock extends Block implements IAEFeature this.hasSubtypes = hasSubtypes; } - /** - * Return the item mesh definition that should be used to determine the item model of an item stack, - * instead of the default model. Return null if your Block doesn't use a custom ItemMeshDefinition (the default). - * The returned ItemMeshDefinition will automatically be registered with the ItemModelMesher during the registration of the block. - */ - @SideOnly( Side.CLIENT ) - public ItemMeshDefinition getItemMeshDefinition() - { - return null; - } - } diff --git a/src/main/java/appeng/block/AEBaseStairBlock.java b/src/main/java/appeng/block/AEBaseStairBlock.java index 4ec2d29bf..009ee5a83 100644 --- a/src/main/java/appeng/block/AEBaseStairBlock.java +++ b/src/main/java/appeng/block/AEBaseStairBlock.java @@ -19,25 +19,16 @@ package appeng.block; -import java.util.EnumSet; - -import com.google.common.base.Optional; import com.google.common.base.Preconditions; import net.minecraft.block.Block; import net.minecraft.block.BlockStairs; -import appeng.core.features.AEBlockFeatureHandler; -import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; - -public abstract class AEBaseStairBlock extends BlockStairs implements IAEFeature, IHasSpecialItemModel +public abstract class AEBaseStairBlock extends BlockStairs { - private final IFeatureHandler features; - protected AEBaseStairBlock( final Block block, final EnumSet features, final String type ) + protected AEBaseStairBlock( final Block block, final String type ) { super( block.getDefaultState() ); @@ -45,21 +36,15 @@ public abstract class AEBaseStairBlock extends BlockStairs implements IAEFeature Preconditions.checkNotNull( block.getUnlocalizedName() ); Preconditions.checkArgument( block.getUnlocalizedName().length() > 0 ); - this.features = new AEBlockFeatureHandler( features, this, Optional.of( type ) ); - this.setUnlocalizedName( "stair." + type ); this.setLightOpacity( 0 ); } @Override - public IFeatureHandler handler() + public String toString() { - return this.features; + String regName = getRegistryName() != null ? getRegistryName().getResourcePath() : "unregistered"; + return getClass().getSimpleName() + "[" + regName + "]"; } - @Override - public void postInit() - { - // Override to do stuff - } } diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java index 212e386e3..eb5012a3a 100644 --- a/src/main/java/appeng/block/AEBaseTileBlock.java +++ b/src/main/java/appeng/block/AEBaseTileBlock.java @@ -20,22 +20,17 @@ package appeng.block; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; - import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.google.common.base.Optional; import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -49,8 +44,9 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; import appeng.api.implementations.items.IMemoryCard; import appeng.api.implementations.items.MemoryCardMessages; @@ -58,9 +54,6 @@ import appeng.api.implementations.tiles.IColorableTile; import appeng.api.util.AEColor; import appeng.api.util.IOrientable; import appeng.block.networking.BlockCableBus; -import appeng.core.features.AEFeature; -import appeng.core.features.AETileBlockFeatureHandler; -import appeng.core.features.IAEFeature; import appeng.helpers.ICustomCollision; import appeng.tile.AEBaseTile; import appeng.tile.networking.TileCableBus; @@ -69,7 +62,7 @@ import appeng.util.Platform; import appeng.util.SettingsFrom; -public abstract class AEBaseTileBlock extends AEBaseBlock implements IAEFeature, ITileEntityProvider +public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider { @Nonnull @@ -80,25 +73,35 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements IAEFeature, super( mat ); } - protected AEBaseTileBlock( final Material mat, final Optional subName ) - { - super( mat, subName ); - } - - public static final PropertyDirection AE_BLOCK_FORWARD = PropertyDirection.create( "forward" ); - public static final PropertyDirection AE_BLOCK_UP = PropertyDirection.create( "up" ); + public static final UnlistedDirection FORWARD = new UnlistedDirection( "forward" ); + public static final UnlistedDirection UP = new UnlistedDirection( "up" ); @Override - protected IProperty[] getAEStates() + public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos ) { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP }; + // A subclass may decide it doesn't want extended block state for whatever reason + if( !( state instanceof IExtendedBlockState ) ) + { + return state; + } + + AEBaseTile tile = getTileEntity( world, pos ); + if( tile == null ) + { + return state; // No info available + } + + IExtendedBlockState extState = (IExtendedBlockState) state; + return extState.withProperty( FORWARD, tile.getForward() ).withProperty( UP, tile.getUp() ); } @Override - public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos ) + protected BlockStateContainer createBlockState() { - AEBaseTile tile = (AEBaseTile) world.getTileEntity( pos ); - return super.getActualState( state, world, pos ).withProperty( AE_BLOCK_FORWARD, tile.getForward() ).withProperty( AE_BLOCK_UP, tile.getUp() ); + return new ExtendedBlockState( this, getAEStates(), new IUnlistedProperty[] { + FORWARD, + UP + } ); } @Override @@ -107,24 +110,6 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements IAEFeature, return 0; } - @SideOnly( Side.CLIENT ) - public TileEntitySpecialRenderer getTESR() - { - return null; - } - - public boolean hasItemTESR() - { - return false; - } - - @Override - protected void setFeature( final EnumSet f ) - { - final AETileBlockFeatureHandler featureHandler = new AETileBlockFeatureHandler( f, this, this.getFeatureSubName() ); - this.setHandler( featureHandler ); - } - protected void setTileEntity( final Class c ) { this.tileEntityType = c; diff --git a/src/main/java/appeng/block/IHasSpecialItemModel.java b/src/main/java/appeng/block/IHasSpecialItemModel.java deleted file mode 100644 index 848608ec6..000000000 --- a/src/main/java/appeng/block/IHasSpecialItemModel.java +++ /dev/null @@ -1,8 +0,0 @@ - -package appeng.block; - - -public interface IHasSpecialItemModel -{ - -} diff --git a/src/main/java/appeng/block/UnlistedDirection.java b/src/main/java/appeng/block/UnlistedDirection.java new file mode 100644 index 000000000..f43c8c8da --- /dev/null +++ b/src/main/java/appeng/block/UnlistedDirection.java @@ -0,0 +1,42 @@ +package appeng.block; + + +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.property.IUnlistedProperty; + + +public class UnlistedDirection implements IUnlistedProperty +{ + + private final String name; + + public UnlistedDirection( String name ) + { + this.name = name; + } + + @Override + public String getName() + { + return name; + } + + @Override + public boolean isValid( EnumFacing value ) + { + return value != null; + } + + @Override + public Class getType() + { + return EnumFacing.class; + } + + @Override + public String valueToString( EnumFacing value ) + { + return value.getName(); + } + +} diff --git a/src/main/java/appeng/block/crafting/BlockCraftingStorage.java b/src/main/java/appeng/block/crafting/BlockCraftingStorage.java index 5eec519f6..bb1f356b3 100644 --- a/src/main/java/appeng/block/crafting/BlockCraftingStorage.java +++ b/src/main/java/appeng/block/crafting/BlockCraftingStorage.java @@ -31,10 +31,4 @@ public class BlockCraftingStorage extends BlockCraftingUnit this.setTileEntity( TileCraftingStorageTile.class ); } - @Override - public Class getItemBlockClass() - { - return ItemCraftingStorage.class; - } - } diff --git a/src/main/java/appeng/block/crafting/BlockCraftingUnit.java b/src/main/java/appeng/block/crafting/BlockCraftingUnit.java index 40aeee83e..b198b0c4e 100644 --- a/src/main/java/appeng/block/crafting/BlockCraftingUnit.java +++ b/src/main/java/appeng/block/crafting/BlockCraftingUnit.java @@ -19,41 +19,28 @@ package appeng.block.crafting; -import java.util.EnumSet; -import java.util.List; - import javax.annotation.Nullable; -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.IBlockState; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.crafting.TileCraftingTile; import appeng.util.Platform; -/** - * - */ public class BlockCraftingUnit extends AEBaseTileBlock { public static final PropertyBool POWERED = PropertyBool.create( "powered" ); @@ -63,17 +50,16 @@ public class BlockCraftingUnit extends AEBaseTileBlock public BlockCraftingUnit( final CraftingUnitType type ) { - super( Material.IRON, Optional.of( type.name() ) ); + super( Material.IRON ); this.type = type; this.setTileEntity( TileCraftingTile.class ); - this.setFeature( EnumSet.of( AEFeature.CraftingCPU ) ); } @Override protected IProperty[] getAEStates() { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP, POWERED, FORMED }; + return new IProperty[] { POWERED, FORMED }; } @Override diff --git a/src/main/java/appeng/block/crafting/BlockMolecularAssembler.java b/src/main/java/appeng/block/crafting/BlockMolecularAssembler.java index ee9f5cb8f..df816dfc6 100644 --- a/src/main/java/appeng/block/crafting/BlockMolecularAssembler.java +++ b/src/main/java/appeng/block/crafting/BlockMolecularAssembler.java @@ -19,8 +19,6 @@ package appeng.block.crafting; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -35,12 +33,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.crafting.TileMolecularAssembler; import appeng.util.Platform; - public class BlockMolecularAssembler extends AEBaseTileBlock { @@ -51,7 +47,6 @@ public class BlockMolecularAssembler extends AEBaseTileBlock this.setTileEntity( TileMolecularAssembler.class ); this.setOpaque( false ); this.lightOpacity = 1; - this.setFeature( EnumSet.of( AEFeature.MolecularAssembler ) ); } @Override diff --git a/src/main/java/appeng/block/grindstone/BlockCrank.java b/src/main/java/appeng/block/grindstone/BlockCrank.java index b25c73471..08e1f5f2a 100644 --- a/src/main/java/appeng/block/grindstone/BlockCrank.java +++ b/src/main/java/appeng/block/grindstone/BlockCrank.java @@ -19,8 +19,6 @@ package appeng.block.grindstone; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.Block; @@ -38,12 +36,10 @@ import net.minecraftforge.common.util.FakePlayer; import appeng.api.implementations.tiles.ICrankable; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.stats.Stats; import appeng.tile.AEBaseTile; import appeng.tile.grindstone.TileCrank; - public class BlockCrank extends AEBaseTileBlock { @@ -55,7 +51,6 @@ public class BlockCrank extends AEBaseTileBlock this.setLightOpacity( 0 ); this.setHarvestLevel( "axe", 0 ); this.setFullSize( this.setOpaque( false ) ); - this.setFeature( EnumSet.of( AEFeature.GrindStone ) ); } @Override diff --git a/src/main/java/appeng/block/grindstone/BlockGrinder.java b/src/main/java/appeng/block/grindstone/BlockGrinder.java index f3ad20eb5..1e2f2316e 100644 --- a/src/main/java/appeng/block/grindstone/BlockGrinder.java +++ b/src/main/java/appeng/block/grindstone/BlockGrinder.java @@ -19,8 +19,6 @@ package appeng.block.grindstone; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -33,12 +31,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.grindstone.TileGrinder; import appeng.util.Platform; - public class BlockGrinder extends AEBaseTileBlock { @@ -48,7 +44,6 @@ public class BlockGrinder extends AEBaseTileBlock this.setTileEntity( TileGrinder.class ); this.setHardness( 3.2F ); - this.setFeature( EnumSet.of( AEFeature.GrindStone ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockCellWorkbench.java b/src/main/java/appeng/block/misc/BlockCellWorkbench.java index 0b8ca7821..52d20bf21 100644 --- a/src/main/java/appeng/block/misc/BlockCellWorkbench.java +++ b/src/main/java/appeng/block/misc/BlockCellWorkbench.java @@ -19,8 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -33,12 +31,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.misc.TileCellWorkbench; import appeng.util.Platform; - public class BlockCellWorkbench extends AEBaseTileBlock { @@ -47,7 +43,6 @@ public class BlockCellWorkbench extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileCellWorkbench.class ); - this.setFeature( EnumSet.of( AEFeature.StorageCells ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockCharger.java b/src/main/java/appeng/block/misc/BlockCharger.java index 73a230146..88c84ecd5 100644 --- a/src/main/java/appeng/block/misc/BlockCharger.java +++ b/src/main/java/appeng/block/misc/BlockCharger.java @@ -20,19 +20,17 @@ package appeng.block.misc; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import java.util.Random; - import javax.annotation.Nullable; import org.apache.commons.lang3.tuple.ImmutablePair; -import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector3f; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -53,7 +51,6 @@ import appeng.client.render.renderable.ItemRenderable; import appeng.client.render.tesr.ModularTESR; import appeng.core.AEConfig; import appeng.core.CommonHelper; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; import appeng.tile.AEBaseTile; import appeng.tile.misc.TileCharger; @@ -70,7 +67,6 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision this.setTileEntity( TileCharger.class ); this.setLightOpacity( 2 ); this.setFullSize( this.setOpaque( false ) ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } @Override @@ -130,13 +126,6 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision } } - @Override - @SideOnly( Side.CLIENT ) - public TileEntitySpecialRenderer getTESR() - { - return new ModularTESR( new ItemRenderable( tile -> new ImmutablePair( tile.getStackInSlot( 0 ), new Matrix4f().translate( new Vector3f( 0.5f, 0.4f, 0.5f ) ) ) ) ); - } - @Override public Iterable getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b ) { @@ -198,4 +187,10 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision { out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) ); } + + @SideOnly( Side.CLIENT ) + public static TileEntitySpecialRenderer createTesr() + { + return new ModularTESR<>( new ItemRenderable( tile -> new ImmutablePair<>( tile.getStackInSlot( 0 ), new Matrix4f().translate( new Vector3f( 0.5f, 0.4f, 0.5f ) ) ) ) ); + } } diff --git a/src/main/java/appeng/block/misc/BlockCondenser.java b/src/main/java/appeng/block/misc/BlockCondenser.java index fac2e557f..355c82c1f 100644 --- a/src/main/java/appeng/block/misc/BlockCondenser.java +++ b/src/main/java/appeng/block/misc/BlockCondenser.java @@ -19,8 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -33,7 +31,6 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.misc.TileCondenser; import appeng.util.Platform; @@ -47,7 +44,6 @@ public class BlockCondenser extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileCondenser.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockInscriber.java b/src/main/java/appeng/block/misc/BlockInscriber.java index 5e3c3db2a..25676b3d3 100644 --- a/src/main/java/appeng/block/misc/BlockInscriber.java +++ b/src/main/java/appeng/block/misc/BlockInscriber.java @@ -19,8 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -33,12 +31,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.misc.TileInscriber; import appeng.util.Platform; - public class BlockInscriber extends AEBaseTileBlock { @@ -49,7 +45,6 @@ public class BlockInscriber extends AEBaseTileBlock this.setTileEntity( TileInscriber.class ); this.setLightOpacity( 2 ); this.setFullSize( this.setOpaque( false ) ); - this.setFeature( EnumSet.of( AEFeature.Inscriber ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockInterface.java b/src/main/java/appeng/block/misc/BlockInterface.java index 8f963a3cd..52046cff9 100644 --- a/src/main/java/appeng/block/misc/BlockInterface.java +++ b/src/main/java/appeng/block/misc/BlockInterface.java @@ -19,7 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -37,12 +36,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.api.util.IOrientable; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.misc.TileInterface; import appeng.util.Platform; - public class BlockInterface extends AEBaseTileBlock { @@ -53,7 +50,6 @@ public class BlockInterface extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileInterface.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockLightDetector.java b/src/main/java/appeng/block/misc/BlockLightDetector.java index 85e142cb8..9cbd914b9 100644 --- a/src/main/java/appeng/block/misc/BlockLightDetector.java +++ b/src/main/java/appeng/block/misc/BlockLightDetector.java @@ -20,14 +20,11 @@ package appeng.block.misc; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockTorch; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.util.EnumFacing; @@ -36,15 +33,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; -import appeng.helpers.MetaRotation; import appeng.tile.misc.TileLightDetector; - public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBlock, ICustomCollision { @@ -57,13 +50,6 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl this.setOpaque( false ); this.setTileEntity( TileLightDetector.class ); - this.setFeature( EnumSet.of( AEFeature.LightDetector ) ); - } - - @Override - protected IProperty[] getAEStates() - { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP }; } @Override diff --git a/src/main/java/appeng/block/misc/BlockPaint.java b/src/main/java/appeng/block/misc/BlockPaint.java index 9af46808d..9ef1deb9a 100644 --- a/src/main/java/appeng/block/misc/BlockPaint.java +++ b/src/main/java/appeng/block/misc/BlockPaint.java @@ -19,7 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; import java.util.List; import java.util.Random; @@ -39,11 +38,9 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.tile.misc.TilePaint; import appeng.util.Platform; - public class BlockPaint extends AEBaseTileBlock { @@ -55,7 +52,6 @@ public class BlockPaint extends AEBaseTileBlock this.setLightOpacity( 0 ); this.setFullSize( false ); this.setOpaque( false ); - this.setFeature( EnumSet.of( AEFeature.PaintBalls ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java b/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java index 3f1dbd7f3..5f4b34efa 100644 --- a/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java +++ b/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java @@ -19,7 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; import java.util.Random; import net.minecraft.block.SoundType; @@ -32,12 +31,13 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.block.AEBaseTileBlock; import appeng.client.render.effects.LightningFX; import appeng.core.AEConfig; import appeng.core.CommonHelper; -import appeng.core.features.AEFeature; import appeng.tile.misc.TileQuartzGrowthAccelerator; import appeng.util.Platform; @@ -52,7 +52,6 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock super( Material.ROCK ); this.setSoundType( SoundType.METAL ); this.setTileEntity( TileQuartzGrowthAccelerator.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.setDefaultState( getDefaultState().withProperty( POWERED, false ) ); } @@ -69,9 +68,10 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock @Override protected IProperty[] getAEStates() { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP, POWERED }; + return new IProperty[] { POWERED }; } + @SideOnly( Side.CLIENT ) @Override public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r ) { diff --git a/src/main/java/appeng/block/misc/BlockQuartzTorch.java b/src/main/java/appeng/block/misc/BlockQuartzTorch.java index 6621efc34..562a0c137 100644 --- a/src/main/java/appeng/block/misc/BlockQuartzTorch.java +++ b/src/main/java/appeng/block/misc/BlockQuartzTorch.java @@ -20,7 +20,6 @@ package appeng.block.misc; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import java.util.Random; @@ -47,11 +46,9 @@ import appeng.block.AEBaseBlock; import appeng.client.render.effects.LightningFX; import appeng.core.AEConfig; import appeng.core.CommonHelper; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; import appeng.helpers.MetaRotation; - public class BlockQuartzTorch extends AEBaseBlock implements IOrientableBlock, ICustomCollision { @@ -66,7 +63,6 @@ public class BlockQuartzTorch extends AEBaseBlock implements IOrientableBlock, I super( Material.CIRCUITS ); this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) ); - this.setFeature( EnumSet.of( AEFeature.DecorativeLights ) ); this.setLightLevel( 0.9375F ); this.setLightOpacity( 0 ); this.setFullSize( false ); diff --git a/src/main/java/appeng/block/misc/BlockSecurity.java b/src/main/java/appeng/block/misc/BlockSecurity.java index 22d97ac13..5df06d7ec 100644 --- a/src/main/java/appeng/block/misc/BlockSecurity.java +++ b/src/main/java/appeng/block/misc/BlockSecurity.java @@ -19,8 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -34,12 +32,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.misc.TileSecurity; import appeng.util.Platform; - public class BlockSecurity extends AEBaseTileBlock { @@ -48,7 +44,6 @@ public class BlockSecurity extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileSecurity.class ); - this.setFeature( EnumSet.of( AEFeature.Security ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockSkyCompass.java b/src/main/java/appeng/block/misc/BlockSkyCompass.java index 5522518be..f3d84b610 100644 --- a/src/main/java/appeng/block/misc/BlockSkyCompass.java +++ b/src/main/java/appeng/block/misc/BlockSkyCompass.java @@ -20,7 +20,6 @@ package appeng.block.misc; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import net.minecraft.block.Block; @@ -33,11 +32,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; import appeng.tile.misc.TileSkyCompass; - public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision { @@ -47,7 +44,6 @@ public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision this.setTileEntity( TileSkyCompass.class ); this.setOpaque( this.setFullSize( false ) ); this.lightOpacity = 0; - this.setFeature( EnumSet.of( AEFeature.MeteoriteCompass ) ); } @Override diff --git a/src/main/java/appeng/block/misc/BlockTinyTNT.java b/src/main/java/appeng/block/misc/BlockTinyTNT.java index 69192b5eb..ac72db58b 100644 --- a/src/main/java/appeng/block/misc/BlockTinyTNT.java +++ b/src/main/java/appeng/block/misc/BlockTinyTNT.java @@ -20,13 +20,10 @@ package appeng.block.misc; import java.util.Collections; -import java.util.EnumSet; import java.util.List; - import javax.annotation.Nullable; import net.minecraft.block.Block; -import net.minecraft.block.BlockDispenser; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -36,7 +33,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; @@ -49,12 +45,9 @@ import net.minecraftforge.fml.common.registry.EntityRegistry; import appeng.block.AEBaseBlock; import appeng.core.AppEng; -import appeng.core.features.AEFeature; import appeng.entity.EntityIds; import appeng.entity.EntityTinyTNTPrimed; import appeng.helpers.ICustomCollision; -import appeng.hooks.DispenserBehaviorTinyTNT; - public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision { @@ -67,18 +60,10 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision this.setFullSize( this.setOpaque( false ) ); this.setSoundType( SoundType.GROUND ); this.setHardness( 0F ); - this.setFeature( EnumSet.of( AEFeature.TinyTNT ) ); EntityRegistry.registerModEntity( EntityTinyTNTPrimed.class, "EntityTinyTNTPrimed", EntityIds.get( EntityTinyTNTPrimed.class ), AppEng.instance(), 16, 4, true ); } - @Override - public void postInit() - { - super.postInit(); - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( Item.getItemFromBlock( this ), new DispenserBehaviorTinyTNT() ); - } - @Override public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ ) { diff --git a/src/main/java/appeng/block/misc/BlockVibrationChamber.java b/src/main/java/appeng/block/misc/BlockVibrationChamber.java index 9dacb715d..4f0e41483 100644 --- a/src/main/java/appeng/block/misc/BlockVibrationChamber.java +++ b/src/main/java/appeng/block/misc/BlockVibrationChamber.java @@ -19,7 +19,6 @@ package appeng.block.misc; -import java.util.EnumSet; import java.util.Random; import javax.annotation.Nullable; @@ -39,13 +38,11 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.AEBaseTile; import appeng.tile.misc.TileVibrationChamber; import appeng.util.Platform; - public final class BlockVibrationChamber extends AEBaseTileBlock { @@ -57,7 +54,6 @@ public final class BlockVibrationChamber extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileVibrationChamber.class ); this.setHardness( 4.2F ); - this.setFeature( EnumSet.of( AEFeature.PowerGen ) ); this.setDefaultState( getDefaultState().withProperty( ACTIVE, false ) ); } @@ -74,7 +70,7 @@ public final class BlockVibrationChamber extends AEBaseTileBlock @Override protected IProperty[] getAEStates() { - return new IProperty[]{ AE_BLOCK_FORWARD, AE_BLOCK_UP, ACTIVE }; + return new IProperty[]{ ACTIVE }; } @Override diff --git a/src/main/java/appeng/block/networking/BlockCableBus.java b/src/main/java/appeng/block/networking/BlockCableBus.java index e3232f342..ccec0af42 100644 --- a/src/main/java/appeng/block/networking/BlockCableBus.java +++ b/src/main/java/appeng/block/networking/BlockCableBus.java @@ -22,7 +22,6 @@ package appeng.block.networking; import java.util.EnumSet; import java.util.List; import java.util.Random; - import javax.annotation.Nullable; import net.minecraft.block.Block; @@ -60,7 +59,6 @@ import appeng.api.util.AEColor; import appeng.block.AEBaseTileBlock; import appeng.core.AEConfig; import appeng.core.Api; -import appeng.core.features.AECableBusFeatureHandler; import appeng.core.features.AEFeature; import appeng.helpers.AEGlassMaterial; import appeng.integration.IntegrationRegistry; @@ -88,7 +86,6 @@ public class BlockCableBus extends AEBaseTileBlock // this will actually be overwritten later through setupTile and the // combined layers this.setTileEntity( TileCableBus.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } public static final CableBusContainerUnlistedProperty cableBus = new CableBusContainerUnlistedProperty(); @@ -96,19 +93,14 @@ public class BlockCableBus extends AEBaseTileBlock @Override protected BlockStateContainer createBlockState() { - return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { cableBus } ); - } - - @Override - public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos ) - { - return state; + return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { FORWARD, UP, cableBus } ); } @Override public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos ) { - return ( (IExtendedBlockState) state ).withProperty( cableBus, ( (TileCableBus) world.getTileEntity( pos ) ).getCableBus() ); + return ( (IExtendedBlockState) super.getExtendedState( state, world, pos ) ) + .withProperty( cableBus, ( (TileCableBus) world.getTileEntity( pos ) ).getCableBus() ); } @Override @@ -359,13 +351,6 @@ public class BlockCableBus extends AEBaseTileBlock // do nothing } - @Override - protected void setFeature( final EnumSet f ) - { - final AECableBusFeatureHandler featureHandler = new AECableBusFeatureHandler( f, this, this.getFeatureSubName() ); - this.setHandler( featureHandler ); - } - public void setupTile() { noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBus.class.getName() ); diff --git a/src/main/java/appeng/block/networking/BlockController.java b/src/main/java/appeng/block/networking/BlockController.java index 6ff2c899b..5a4c3c21c 100644 --- a/src/main/java/appeng/block/networking/BlockController.java +++ b/src/main/java/appeng/block/networking/BlockController.java @@ -19,8 +19,6 @@ package appeng.block.networking; -import java.util.EnumSet; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; @@ -32,12 +30,11 @@ import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.property.IExtendedBlockState; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.tile.networking.TileController; - public class BlockController extends AEBaseTileBlock { @@ -77,7 +74,7 @@ public class BlockController extends AEBaseTileBlock @Override protected IProperty[] getAEStates() { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP, CONTROLLER_STATE, CONTROLLER_TYPE }; + return new IProperty[] { CONTROLLER_STATE, CONTROLLER_TYPE }; } /** @@ -90,8 +87,6 @@ public class BlockController extends AEBaseTileBlock { // Only used for columns, really - EnumFacing up = EnumFacing.UP; - EnumFacing forward = EnumFacing.NORTH; ControllerRenderType type = ControllerRenderType.block; int x = pos.getX(); @@ -105,20 +100,14 @@ public class BlockController extends AEBaseTileBlock if( xx && !yy && !zz ) { - up = EnumFacing.EAST; - forward = EnumFacing.UP; type = ControllerRenderType.column; } else if( !xx && yy && !zz ) { - up = EnumFacing.UP; - forward = EnumFacing.NORTH; type = ControllerRenderType.column; } else if( !xx && !yy && zz ) { - up = EnumFacing.NORTH; - forward = EnumFacing.UP; type = ControllerRenderType.column; } else if( ( xx ? 1 : 0 ) + ( yy ? 1 : 0 ) + ( zz ? 1 : 0 ) >= 2 ) @@ -137,7 +126,43 @@ public class BlockController extends AEBaseTileBlock } } - return state.withProperty( AE_BLOCK_FORWARD, forward ).withProperty( AE_BLOCK_UP, up ).withProperty( CONTROLLER_TYPE, type ); + return state.withProperty( CONTROLLER_TYPE, type ); + } + + @Override + public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos ) + { + // Only used for columns, really + EnumFacing up = EnumFacing.UP; + EnumFacing forward = EnumFacing.NORTH; + + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + // Detect whether controllers are on both sides of the x, y, and z axes + final boolean xx = this.getTileEntity( world, x - 1, y, z ) instanceof TileController && this.getTileEntity( world, x + 1, y, z ) instanceof TileController; + final boolean yy = this.getTileEntity( world, x, y - 1, z ) instanceof TileController && this.getTileEntity( world, x, y + 1, z ) instanceof TileController; + final boolean zz = this.getTileEntity( world, x, y, z - 1 ) instanceof TileController && this.getTileEntity( world, x, y, z + 1 ) instanceof TileController; + + if( xx && !yy && !zz ) + { + up = EnumFacing.EAST; + forward = EnumFacing.UP; + } + else if( !xx && yy && !zz ) + { + up = EnumFacing.UP; + forward = EnumFacing.NORTH; + } + else if( !xx && !yy && zz ) + { + up = EnumFacing.NORTH; + forward = EnumFacing.UP; + } + + IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState( state, world, pos ); + return extState.withProperty( FORWARD, forward ).withProperty( UP, up ); } @Override @@ -164,7 +189,6 @@ public class BlockController extends AEBaseTileBlock super( Material.IRON ); this.setTileEntity( TileController.class ); this.setHardness( 6 ); - this.setFeature( EnumSet.of( AEFeature.Channels ) ); this.setDefaultState( getDefaultState().withProperty( CONTROLLER_STATE, ControllerBlockState.offline ).withProperty( CONTROLLER_TYPE, ControllerRenderType.block ) ); } diff --git a/src/main/java/appeng/block/networking/BlockCreativeEnergyCell.java b/src/main/java/appeng/block/networking/BlockCreativeEnergyCell.java index 47e18db92..eef8cfad1 100644 --- a/src/main/java/appeng/block/networking/BlockCreativeEnergyCell.java +++ b/src/main/java/appeng/block/networking/BlockCreativeEnergyCell.java @@ -19,14 +19,10 @@ package appeng.block.networking; -import java.util.EnumSet; - import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.AEGlassMaterial; import appeng.tile.networking.TileCreativeEnergyCell; - public class BlockCreativeEnergyCell extends AEBaseTileBlock { @@ -34,6 +30,5 @@ public class BlockCreativeEnergyCell extends AEBaseTileBlock { super( AEGlassMaterial.INSTANCE ); this.setTileEntity( TileCreativeEnergyCell.class ); - this.setFeature( EnumSet.of( AEFeature.Creative ) ); } } diff --git a/src/main/java/appeng/block/networking/BlockDenseEnergyCell.java b/src/main/java/appeng/block/networking/BlockDenseEnergyCell.java index afac9c476..fca52b115 100644 --- a/src/main/java/appeng/block/networking/BlockDenseEnergyCell.java +++ b/src/main/java/appeng/block/networking/BlockDenseEnergyCell.java @@ -19,19 +19,14 @@ package appeng.block.networking; -import java.util.EnumSet; - -import appeng.core.features.AEFeature; import appeng.tile.networking.TileDenseEnergyCell; - public class BlockDenseEnergyCell extends BlockEnergyCell { public BlockDenseEnergyCell() { this.setTileEntity( TileDenseEnergyCell.class ); - this.setFeature( EnumSet.of( AEFeature.DenseEnergyCells ) ); } @Override diff --git a/src/main/java/appeng/block/networking/BlockEnergyAcceptor.java b/src/main/java/appeng/block/networking/BlockEnergyAcceptor.java index 2aebd20e9..8258c7d64 100644 --- a/src/main/java/appeng/block/networking/BlockEnergyAcceptor.java +++ b/src/main/java/appeng/block/networking/BlockEnergyAcceptor.java @@ -19,12 +19,9 @@ package appeng.block.networking; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.tile.networking.TileEnergyAcceptor; @@ -35,6 +32,5 @@ public class BlockEnergyAcceptor extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileEnergyAcceptor.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } } diff --git a/src/main/java/appeng/block/networking/BlockEnergyCell.java b/src/main/java/appeng/block/networking/BlockEnergyCell.java index 017fbd3e2..3da021fde 100644 --- a/src/main/java/appeng/block/networking/BlockEnergyCell.java +++ b/src/main/java/appeng/block/networking/BlockEnergyCell.java @@ -19,14 +19,11 @@ package appeng.block.networking; -import java.util.EnumSet; import java.util.List; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -34,11 +31,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import appeng.api.implementations.items.IAEItemPowerStorage; -import appeng.block.AEBaseItemBlock; -import appeng.block.AEBaseItemBlockChargeable; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.AEGlassMaterial; import appeng.tile.networking.TileEnergyCell; import appeng.util.Platform; @@ -66,7 +59,6 @@ public class BlockEnergyCell extends AEBaseTileBlock super( AEGlassMaterial.INSTANCE ); this.setTileEntity( TileEnergyCell.class ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); } @Override @@ -91,48 +83,7 @@ public class BlockEnergyCell extends AEBaseTileBlock @Override protected IProperty[] getAEStates() { - return new IProperty[] { AE_BLOCK_FORWARD, AE_BLOCK_UP, ENERGY_STORAGE }; - } - - @Override - public Class getItemBlockClass() - { - return AEBaseItemBlockChargeable.class; - } - - /** - * Helper method that returns the energy fill factor (between 0 and 1) of a given item stack. - * Returns 0 if the item stack has no fill factor. - */ - private static double getFillFactor( ItemStack is ) { - if( !( is.getItem() instanceof IAEItemPowerStorage ) ) - { - return 0; - } - - AEBaseItemBlockChargeable itemChargeable = (AEBaseItemBlockChargeable) is.getItem(); - double curPower = itemChargeable.getAECurrentPower( is ); - double maxPower = itemChargeable.getAEMaxPower( is ); - - return curPower / maxPower; - } - - /** - * Determines which version of the energy cell model should be used depending on the fill factor - * of the item stack. - */ - @SideOnly( Side.CLIENT ) - @Override - public ItemMeshDefinition getItemMeshDefinition() - { - return is -> { - double fillFactor = getFillFactor( is ); - - int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor(fillFactor); - - return new ModelResourceLocation( "appliedenergistics2:tile.BlockEnergyCell", "fullness=" + storageLevel ); - - }; + return new IProperty[] { ENERGY_STORAGE }; } } diff --git a/src/main/java/appeng/block/networking/BlockEnergyCellRendering.java b/src/main/java/appeng/block/networking/BlockEnergyCellRendering.java new file mode 100644 index 000000000..9ebd17dd2 --- /dev/null +++ b/src/main/java/appeng/block/networking/BlockEnergyCellRendering.java @@ -0,0 +1,62 @@ +package appeng.block.networking; + + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.block.AEBaseItemBlockChargeable; +import appeng.bootstrap.BlockRenderingCustomizer; +import appeng.bootstrap.IBlockRendering; +import appeng.bootstrap.IItemRendering; +import appeng.tile.networking.TileEnergyCell; + + +public class BlockEnergyCellRendering extends BlockRenderingCustomizer +{ + + private final ResourceLocation baseModel; + + public BlockEnergyCellRendering( ResourceLocation baseModel ) + { + this.baseModel = baseModel; + } + + @Override + public void customize( IBlockRendering rendering, IItemRendering itemRendering ) + { + itemRendering.meshDefinition( this::getItemModel ); + // Note: Since we use the block models, we dont need to register custom variants + } + + /** + * Determines which version of the energy cell model should be used depending on the fill factor + * of the item stack. + */ + private ModelResourceLocation getItemModel( ItemStack is ) + { + double fillFactor = getFillFactor( is ); + + int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor( fillFactor ); + return new ModelResourceLocation( baseModel, "fullness=" + storageLevel ); + } + + /** + * Helper method that returns the energy fill factor (between 0 and 1) of a given item stack. + * Returns 0 if the item stack has no fill factor. + */ + private static double getFillFactor( ItemStack is ) + { + if( !( is.getItem() instanceof IAEItemPowerStorage ) ) + { + return 0; + } + + AEBaseItemBlockChargeable itemChargeable = (AEBaseItemBlockChargeable) is.getItem(); + double curPower = itemChargeable.getAECurrentPower( is ); + double maxPower = itemChargeable.getAEMaxPower( is ); + + return curPower / maxPower; + } +} diff --git a/src/main/java/appeng/block/networking/BlockWireless.java b/src/main/java/appeng/block/networking/BlockWireless.java index 98ca1222b..08d466436 100644 --- a/src/main/java/appeng/block/networking/BlockWireless.java +++ b/src/main/java/appeng/block/networking/BlockWireless.java @@ -20,9 +20,7 @@ package appeng.block.networking; import java.util.Collections; -import java.util.EnumSet; import java.util.List; - import javax.annotation.Nullable; import net.minecraft.block.state.IBlockState; @@ -38,14 +36,12 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.helpers.AEGlassMaterial; import appeng.helpers.ICustomCollision; import appeng.tile.networking.TileWireless; import appeng.util.Platform; - public class BlockWireless extends AEBaseTileBlock implements ICustomCollision { @@ -56,7 +52,6 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision this.setLightOpacity( 0 ); this.setFullSize( false ); this.setOpaque( false ); - this.setFeature( EnumSet.of( AEFeature.Core, AEFeature.WirelessAccessTerminal ) ); } @Override diff --git a/src/main/java/appeng/block/networking/CableBusColor.java b/src/main/java/appeng/block/networking/CableBusColor.java new file mode 100644 index 000000000..d9ed31d10 --- /dev/null +++ b/src/main/java/appeng/block/networking/CableBusColor.java @@ -0,0 +1,39 @@ +package appeng.block.networking; + + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.util.AEPartLocation; +import appeng.parts.CableBusContainer; + + +@SideOnly( Side.CLIENT ) +public class CableBusColor implements IBlockColor +{ + + @Override + public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int color ) + { + AEPartLocation side = AEPartLocation.fromOrdinal( ( color >> 2 ) & 7 ); + CableBusContainer bus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); + switch( color & 3 ) + { + case 0: + return bus.getGridNode( side ) != null && bus.getGridNode( side ).isActive() ? 0xffffff : 0; + case 1: + return bus.getColor().blackVariant; + case 2: + return bus.getColor().mediumVariant; + case 3: + return bus.getColor().whiteVariant; + default: + return color; + } + } +} diff --git a/src/main/java/appeng/block/networking/CableModelCustomizer.java b/src/main/java/appeng/block/networking/CableModelCustomizer.java new file mode 100644 index 000000000..df564aea6 --- /dev/null +++ b/src/main/java/appeng/block/networking/CableModelCustomizer.java @@ -0,0 +1,29 @@ +package appeng.block.networking; + + +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; + +import appeng.api.client.BakingPipeline; +import appeng.client.render.model.pipeline.BakingPipelineBakedModel; +import appeng.client.render.model.pipeline.FacingQuadRotator; +import appeng.client.render.model.pipeline.Merge; +import appeng.client.render.model.pipeline.TintIndexModifier; +import appeng.client.render.model.pipeline.TypeTransformer; +import appeng.client.render.model.pipeline.cable.CableAndConnections; +import appeng.client.render.model.pipeline.cable.Facades; +import appeng.client.render.model.pipeline.cable.Parts; + + +public class CableModelCustomizer +{ + + private final BakingPipeline rotatingPipeline = new BakingPipeline( TypeTransformer.quads2vecs, new FacingQuadRotator(), TypeTransformer.vecs2quads ); + private final TintIndexModifier tintIndexModifier = new TintIndexModifier( tint -> tint ); + private final BakingPipeline tintIndexFixPipeline = new BakingPipeline( TypeTransformer.quads2vecs, tintIndexModifier, TypeTransformer.vecs2quads ); + + public IBakedModel customizeModel( ModelResourceLocation location, IBakedModel model ) + { + return new BakingPipelineBakedModel( model, new Merge( new CableAndConnections( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Facades( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Parts( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ) ) ); + } +} diff --git a/src/main/java/appeng/block/qnb/BlockQuantumBase.java b/src/main/java/appeng/block/qnb/BlockQuantumBase.java index 0a229b9f6..df3ef0806 100644 --- a/src/main/java/appeng/block/qnb/BlockQuantumBase.java +++ b/src/main/java/appeng/block/qnb/BlockQuantumBase.java @@ -19,8 +19,6 @@ package appeng.block.qnb; -import java.util.EnumSet; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -30,11 +28,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; import appeng.tile.qnb.TileQuantumBridge; - public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICustomCollision { @@ -46,7 +42,6 @@ public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICusto this.boundingBox = new AxisAlignedBB( shave, shave, shave, 1.0f - shave, 1.0f - shave, 1.0f - shave ); this.setLightOpacity( 0 ); this.setFullSize( this.setOpaque( false ) ); - this.setFeature( EnumSet.of( AEFeature.QuantumNetworkBridge ) ); } @Override diff --git a/src/main/java/appeng/block/spatial/BlockMatrixFrame.java b/src/main/java/appeng/block/spatial/BlockMatrixFrame.java index 87e666aac..96c5c49f9 100644 --- a/src/main/java/appeng/block/spatial/BlockMatrixFrame.java +++ b/src/main/java/appeng/block/spatial/BlockMatrixFrame.java @@ -20,7 +20,6 @@ package appeng.block.spatial; import java.util.Arrays; -import java.util.EnumSet; import java.util.List; import net.minecraft.block.material.Material; @@ -38,10 +37,8 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; - public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision { @@ -52,7 +49,6 @@ public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision this.setBlockUnbreakable(); this.setLightOpacity( 0 ); this.setOpaque( false ); - this.setFeature( EnumSet.of( AEFeature.SpatialIO ) ); } @Override diff --git a/src/main/java/appeng/block/spatial/BlockSpatialIOPort.java b/src/main/java/appeng/block/spatial/BlockSpatialIOPort.java index 49e75791d..b4edaf5c1 100644 --- a/src/main/java/appeng/block/spatial/BlockSpatialIOPort.java +++ b/src/main/java/appeng/block/spatial/BlockSpatialIOPort.java @@ -19,8 +19,6 @@ package appeng.block.spatial; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.Block; @@ -35,12 +33,10 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.spatial.TileSpatialIOPort; import appeng.util.Platform; - public class BlockSpatialIOPort extends AEBaseTileBlock { @@ -48,7 +44,6 @@ public class BlockSpatialIOPort extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileSpatialIOPort.class ); - this.setFeature( EnumSet.of( AEFeature.SpatialIO ) ); } @Override diff --git a/src/main/java/appeng/block/spatial/BlockSpatialPylon.java b/src/main/java/appeng/block/spatial/BlockSpatialPylon.java index 64c4c4e16..b4fd9a114 100644 --- a/src/main/java/appeng/block/spatial/BlockSpatialPylon.java +++ b/src/main/java/appeng/block/spatial/BlockSpatialPylon.java @@ -19,8 +19,6 @@ package appeng.block.spatial; -import java.util.EnumSet; - import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; @@ -28,11 +26,9 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.helpers.AEGlassMaterial; import appeng.tile.spatial.TileSpatialPylon; - public class BlockSpatialPylon extends AEBaseTileBlock { @@ -40,7 +36,6 @@ public class BlockSpatialPylon extends AEBaseTileBlock { super( AEGlassMaterial.INSTANCE ); this.setTileEntity( TileSpatialPylon.class ); - this.setFeature( EnumSet.of( AEFeature.SpatialIO ) ); } @Override diff --git a/src/main/java/appeng/block/storage/BlockChest.java b/src/main/java/appeng/block/storage/BlockChest.java index d73782d3f..62e1bd805 100644 --- a/src/main/java/appeng/block/storage/BlockChest.java +++ b/src/main/java/appeng/block/storage/BlockChest.java @@ -19,8 +19,6 @@ package appeng.block.storage; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -36,7 +34,6 @@ import appeng.api.AEApi; import appeng.api.storage.ICellHandler; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.localization.PlayerMessages; import appeng.core.sync.GuiBridge; import appeng.tile.storage.TileChest; @@ -50,7 +47,6 @@ public class BlockChest extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileChest.class ); - this.setFeature( EnumSet.of( AEFeature.StorageCells, AEFeature.MEChest ) ); } @Override diff --git a/src/main/java/appeng/block/storage/BlockDrive.java b/src/main/java/appeng/block/storage/BlockDrive.java index 48e1dd341..221a3e660 100644 --- a/src/main/java/appeng/block/storage/BlockDrive.java +++ b/src/main/java/appeng/block/storage/BlockDrive.java @@ -19,8 +19,6 @@ package appeng.block.storage; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -34,7 +32,6 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.storage.TileDrive; import appeng.util.Platform; @@ -47,7 +44,6 @@ public class BlockDrive extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileDrive.class ); - this.setFeature( EnumSet.of( AEFeature.StorageCells, AEFeature.MEDrive ) ); } @Override diff --git a/src/main/java/appeng/block/storage/BlockIOPort.java b/src/main/java/appeng/block/storage/BlockIOPort.java index 671d4db00..96beae757 100644 --- a/src/main/java/appeng/block/storage/BlockIOPort.java +++ b/src/main/java/appeng/block/storage/BlockIOPort.java @@ -19,8 +19,6 @@ package appeng.block.storage; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.Block; @@ -35,7 +33,6 @@ import net.minecraft.world.World; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.tile.storage.TileIOPort; import appeng.util.Platform; @@ -48,7 +45,6 @@ public class BlockIOPort extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileIOPort.class ); - this.setFeature( EnumSet.of( AEFeature.StorageCells, AEFeature.IOPort ) ); } @Override diff --git a/src/main/java/appeng/block/storage/BlockSkyChest.java b/src/main/java/appeng/block/storage/BlockSkyChest.java index bf6aa95bf..245e2b146 100644 --- a/src/main/java/appeng/block/storage/BlockSkyChest.java +++ b/src/main/java/appeng/block/storage/BlockSkyChest.java @@ -20,16 +20,11 @@ package appeng.block.storage; import java.util.Collections; -import java.util.EnumSet; import java.util.List; - import javax.annotation.Nullable; -import com.google.common.base.Optional; - import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -39,24 +34,19 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.block.IHasSpecialItemModel; -import appeng.client.render.tesr.SkyChestTESR; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.helpers.ICustomCollision; import appeng.tile.storage.TileSkyChest; import appeng.util.Platform; -public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision, IHasSpecialItemModel +public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision { - public static enum SkyChestType + public enum SkyChestType { STONE, BLOCK }; @@ -65,7 +55,7 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision, public BlockSkyChest( final SkyChestType type ) { - super( Material.ROCK, Optional.of( type.name() ) ); + super( Material.ROCK ); this.setTileEntity( TileSkyChest.class ); this.setOpaque( this.setFullSize( false ) ); this.lightOpacity = 0; @@ -73,7 +63,6 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision, this.setHardness( 50 ); this.blockResistance = 150.0f; this.type = type; - this.setFeature( EnumSet.of( AEFeature.Core, AEFeature.SkyStoneChests ) ); } @Override @@ -81,20 +70,8 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision, { return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; } - - @Override - @SideOnly( Side.CLIENT ) - public TileEntitySpecialRenderer getTESR() - { - return new SkyChestTESR(); - } - @Override - public boolean hasItemTESR() - { - return true; - } - + @Override public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ ) { diff --git a/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java b/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java new file mode 100644 index 000000000..9ae030112 --- /dev/null +++ b/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java @@ -0,0 +1,50 @@ +package appeng.block.storage; + + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.bootstrap.BlockRenderingCustomizer; +import appeng.bootstrap.IBlockRendering; +import appeng.bootstrap.IItemRendering; +import appeng.client.render.tesr.SkyChestTESR; + + +public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer +{ + + private final BlockSkyChest.SkyChestType type; + + public SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType type ) + { + this.type = type; + } + + @SideOnly( Side.CLIENT ) + @Override + public void customize( IBlockRendering rendering, IItemRendering itemRendering ) + { + rendering.tesr( new SkyChestTESR() ); + + // Register a custom non-tesr item model + String modelName = getModelFromType(); + itemRendering.model( new ModelResourceLocation( "appliedenergistics2:" + modelName, "inventory" ) ); + } + + private String getModelFromType() + { + final String modelName; + switch( type ) + { + default: + case STONE: + modelName = "sky_chest_stone"; + break; + case BLOCK: + modelName = "sky_chest_block"; + break; + } + return modelName; + } +} diff --git a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java new file mode 100644 index 000000000..69f702498 --- /dev/null +++ b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java @@ -0,0 +1,216 @@ +package appeng.bootstrap; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.definitions.IBlockDefinition; +import appeng.block.AEBaseBlock; +import appeng.block.AEBaseItemBlock; +import appeng.block.AEBaseTileBlock; +import appeng.core.AEConfig; +import appeng.core.AppEng; +import appeng.core.CreativeTab; +import appeng.core.features.AEFeature; +import appeng.core.features.ActivityState; +import appeng.core.features.BlockDefinition; +import appeng.core.features.BlockStackSrc; +import appeng.core.features.TileDefinition; +import appeng.tile.AEBaseTile; +import appeng.util.Platform; + + +class BlockDefinitionBuilder implements IBlockBuilder +{ + + private final FeatureFactory factory; + + private final String registryName; + + private final Supplier blockSupplier; + + private final List> preInitCallbacks = new ArrayList<>(); + + private final List> initCallbacks = new ArrayList<>(); + + private final List> postInitCallbacks = new ArrayList<>(); + + private final EnumSet features = EnumSet.noneOf( AEFeature.class ); + + private CreativeTabs creativeTab = CreativeTab.instance; + + private Function itemFactory; + + @SideOnly( Side.CLIENT ) + private BlockRendering blockRendering; + + @SideOnly( Side.CLIENT ) + private ItemRendering itemRendering; + + BlockDefinitionBuilder( FeatureFactory factory, String id, Supplier blockSupplier ) + { + this.factory = factory; + this.registryName = id; + this.blockSupplier = blockSupplier; + + if( Platform.isClient() ) + { + blockRendering = new BlockRendering(); + itemRendering = new ItemRendering(); + } + } + + @Override + public BlockDefinitionBuilder preInit( BiConsumer callback ) + { + preInitCallbacks.add( callback ); + return this; + } + + @Override + public BlockDefinitionBuilder init( BiConsumer callback ) + { + initCallbacks.add( callback ); + return this; + } + + @Override + public BlockDefinitionBuilder postInit( BiConsumer callback ) + { + postInitCallbacks.add( callback ); + return this; + } + + @Override + public IBlockBuilder features( AEFeature... features ) + { + this.features.clear(); + addFeatures( features ); + return this; + } + + @Override + public IBlockBuilder addFeatures( AEFeature... features ) + { + Collections.addAll( this.features, features ); + return this; + } + + public BlockDefinitionBuilder rendering( BlockRenderingCustomizer callback ) + { + if( Platform.isClient() ) + { + customizeForClient( callback ); + } + + return this; + } + + @Override + public IBlockBuilder item( Function factory ) + { + this.itemFactory = factory; + return this; + } + + @SideOnly( Side.CLIENT ) + private void customizeForClient( BlockRenderingCustomizer callback ) + { + callback.customize( blockRendering, itemRendering ); + } + + @SuppressWarnings( "unchecked" ) + @Override + public T build() + { + if( !AEConfig.instance.areFeaturesEnabled( features ) ) + { + return (T) new TileDefinition( registryName, null, null ); + } + + // Create block and matching item, and set factory name of both + Block block = blockSupplier.get(); + block.setRegistryName( AppEng.MOD_ID, registryName ); + + ItemBlock item = constructItemFromBlock( block ); + item.setRegistryName( AppEng.MOD_ID, registryName ); + + // Register the item and block with the game + factory.addPreInit( side -> + { + GameRegistry.register( block ); + GameRegistry.register( item ); + } ); + + block.setCreativeTab( creativeTab ); + block.setUnlocalizedName( "appliedenergistics2." + registryName ); + + // Register all extra handlers + preInitCallbacks.forEach( consumer -> factory.addPreInit( side -> consumer.accept( block, item ) ) ); + initCallbacks.forEach( consumer -> factory.addInit( side -> consumer.accept( block, item ) ) ); + postInitCallbacks.forEach( consumer -> factory.addPostInit( side -> consumer.accept( block, item ) ) ); + + if( Platform.isClient() ) + { + if( block instanceof AEBaseTileBlock ) + { + AEBaseTileBlock tileBlock = (AEBaseTileBlock) block; + blockRendering.apply( factory, block, tileBlock.getTileEntityClass() ); + } + else + { + blockRendering.apply( factory, block, null ); + } + + itemRendering.apply( factory, item ); + } + + if( block instanceof AEBaseTileBlock ) + { + AEBaseTileBlock tileBlock = (AEBaseTileBlock) block; + + factory.addPreInit( side -> + { + Class tileEntityClass = tileBlock.getTileEntityClass(); + AEBaseTile.registerTileItem( tileEntityClass, new BlockStackSrc( block, 0, ActivityState.Enabled ) ); + + GameRegistry.registerTileEntity( tileEntityClass, registryName ); + } ); + + return (T) new TileDefinition( registryName, (AEBaseTileBlock) block, item ); + } + else + { + return (T) new BlockDefinition( registryName, block, item ); + } + } + + private ItemBlock constructItemFromBlock( Block block ) + { + if( itemFactory != null ) + { + return itemFactory.apply( block ); + } + else if( block instanceof AEBaseBlock ) + { + return new AEBaseItemBlock( block ); + } + else + { + return new ItemBlock( block ); + } + } +} diff --git a/src/main/java/appeng/bootstrap/BlockRendering.java b/src/main/java/appeng/bootstrap/BlockRendering.java new file mode 100644 index 000000000..0cefd0dde --- /dev/null +++ b/src/main/java/appeng/bootstrap/BlockRendering.java @@ -0,0 +1,99 @@ +package appeng.bootstrap; + + +import java.util.function.BiFunction; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.IStateMapper; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.block.AEBaseTileBlock; +import appeng.bootstrap.components.BlockColorComponent; +import appeng.bootstrap.components.StateMapperComponent; +import appeng.bootstrap.components.TesrComponent; +import appeng.client.render.model.CachingRotatingBakedModel; + + +class BlockRendering implements IBlockRendering +{ + + @SideOnly( Side.CLIENT ) + private BiFunction modelCustomizer; + + @SideOnly( Side.CLIENT ) + private IBlockColor blockColor; + + @SideOnly( Side.CLIENT ) + private TileEntitySpecialRenderer tesr; + + @SideOnly( Side.CLIENT ) + private IStateMapper stateMapper; + + @SideOnly( Side.CLIENT ) + public IBlockRendering modelCustomizer( BiFunction customizer ) + { + modelCustomizer = customizer; + return this; + } + + @SideOnly( Side.CLIENT ) + @Override + public IBlockRendering blockColor( IBlockColor blockColor ) + { + this.blockColor = blockColor; + return this; + } + + @SideOnly( Side.CLIENT ) + @Override + public IBlockRendering tesr( TileEntitySpecialRenderer tesr ) + { + this.tesr = tesr; + return this; + } + + @SideOnly( Side.CLIENT ) + @Override + public IBlockRendering stateMapper( IStateMapper mapper ) + { + this.stateMapper = mapper; + return this; + } + + void apply( FeatureFactory registry, Block block, Class tileEntityClass ) + { + if( tesr != null ) + { + if( tileEntityClass == null ) + { + throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." ); + } + registry.addBootstrapComponent( new TesrComponent( tileEntityClass, tesr ) ); + } + + if( modelCustomizer != null ) + { + registry.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), modelCustomizer ); + } + else if ( block instanceof AEBaseTileBlock ) + { + // This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as extended props + registry.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), ( l, m ) -> new CachingRotatingBakedModel( m ) ); + } + + if( blockColor != null ) + { + registry.addBootstrapComponent( new BlockColorComponent( block, blockColor ) ); + } + + if( stateMapper != null ) + { + registry.addBootstrapComponent( new StateMapperComponent( block, stateMapper ) ); + } + } +} diff --git a/src/main/java/appeng/bootstrap/BlockRenderingCustomizer.java b/src/main/java/appeng/bootstrap/BlockRenderingCustomizer.java new file mode 100644 index 000000000..147071b4d --- /dev/null +++ b/src/main/java/appeng/bootstrap/BlockRenderingCustomizer.java @@ -0,0 +1,18 @@ +package appeng.bootstrap; + + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + +/** + * A callback that allows the rendering of a block to be customized. Sadly this class is required and no lambdas can be used + * due to them not being able to be annotated with @SideOnly(CLIENT). + */ +public abstract class BlockRenderingCustomizer +{ + + @SideOnly( Side.CLIENT ) + public abstract void customize( IBlockRendering rendering, IItemRendering itemRendering ); + +} diff --git a/src/main/java/appeng/bootstrap/FeatureFactory.java b/src/main/java/appeng/bootstrap/FeatureFactory.java new file mode 100644 index 000000000..f34545724 --- /dev/null +++ b/src/main/java/appeng/bootstrap/FeatureFactory.java @@ -0,0 +1,116 @@ +package appeng.bootstrap; + + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.definitions.IItemDefinition; +import appeng.api.util.AEColor; +import appeng.api.util.AEColoredItemDefinition; +import appeng.bootstrap.components.InitComponent; +import appeng.bootstrap.components.ModelOverrideComponent; +import appeng.bootstrap.components.PostInitComponent; +import appeng.bootstrap.components.PreInitComponent; +import appeng.core.features.AEFeature; +import appeng.core.features.ActivityState; +import appeng.core.features.ColoredItemDefinition; +import appeng.core.features.ItemStackSrc; +import appeng.util.Platform; + + +public class FeatureFactory +{ + + private final AEFeature[] defaultFeatures; + + private final List bootstrapComponents; + + @SideOnly( Side.CLIENT ) + ModelOverrideComponent modelOverrideComponent; + + public FeatureFactory() + { + this.defaultFeatures = new AEFeature[] { AEFeature.Core }; + this.bootstrapComponents = new ArrayList<>(); + + if( Platform.isClient() ) + { + modelOverrideComponent = new ModelOverrideComponent(); + this.bootstrapComponents.add( modelOverrideComponent ); + } + } + + private FeatureFactory( FeatureFactory parent, AEFeature... defaultFeatures ) + { + this.defaultFeatures = defaultFeatures.clone(); + this.bootstrapComponents = parent.bootstrapComponents; + if( Platform.isClient() ) + { + this.modelOverrideComponent = parent.modelOverrideComponent; + } + } + + public IBlockBuilder block( String id, Supplier block ) + { + return new BlockDefinitionBuilder( this, id, block ).features( defaultFeatures ); + } + + public IItemBuilder item( String id, Supplier item ) + { + return new ItemDefinitionBuilder( this, id, item ).features( defaultFeatures ); + } + + public AEColoredItemDefinition colored( IItemDefinition target, int offset ) + { + final ColoredItemDefinition definition = new ColoredItemDefinition(); + + for( final Item targetItem : target.maybeItem().asSet() ) + { + for( final AEColor color : AEColor.VALID_COLORS ) + { + final ActivityState state = ActivityState.from( target.isEnabled() ); + + definition.add( color, new ItemStackSrc( targetItem, offset + color.ordinal(), state ) ); + } + } + + return definition; + } + + public FeatureFactory features( AEFeature... features ) + { + return new FeatureFactory( this, features ); + } + + void addBootstrapComponent( IBootstrapComponent component ) + { + this.bootstrapComponents.add( component ); + } + + void addPreInit( PreInitComponent component ) + { + this.bootstrapComponents.add( component ); + } + + void addInit( InitComponent component ) + { + this.bootstrapComponents.add( component ); + } + + void addPostInit( PostInitComponent component ) + { + this.bootstrapComponents.add( component ); + } + + public List getBootstrapComponents() + { + return bootstrapComponents; + } + +} diff --git a/src/main/java/appeng/bootstrap/IBlockBuilder.java b/src/main/java/appeng/bootstrap/IBlockBuilder.java new file mode 100644 index 000000000..d6455329e --- /dev/null +++ b/src/main/java/appeng/bootstrap/IBlockBuilder.java @@ -0,0 +1,34 @@ +package appeng.bootstrap; + + +import java.util.function.BiConsumer; +import java.util.function.Function; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; + +import appeng.api.definitions.IBlockDefinition; +import appeng.core.features.AEFeature; + + +public interface IBlockBuilder +{ + + IBlockBuilder preInit( BiConsumer callback ); + + IBlockBuilder init( BiConsumer callback ); + + IBlockBuilder postInit( BiConsumer callback ); + + IBlockBuilder features( AEFeature... features ); + + IBlockBuilder addFeatures( AEFeature... features ); + + IBlockBuilder rendering( BlockRenderingCustomizer callback ); + + IBlockBuilder item( Function factory ); + + T build(); + +} diff --git a/src/main/java/appeng/bootstrap/IBlockRendering.java b/src/main/java/appeng/bootstrap/IBlockRendering.java new file mode 100644 index 000000000..6aaeed12f --- /dev/null +++ b/src/main/java/appeng/bootstrap/IBlockRendering.java @@ -0,0 +1,34 @@ +package appeng.bootstrap; + + +import java.util.function.BiFunction; + +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.IStateMapper; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + +/** + * Allows for client-side rendering to be customized in the context of block/item registration. + */ +public interface IBlockRendering +{ + + @SideOnly( Side.CLIENT ) + IBlockRendering modelCustomizer( BiFunction customizer ); + + @SideOnly( Side.CLIENT ) + IBlockRendering blockColor( IBlockColor blockColor ); + + @SideOnly( Side.CLIENT ) + IBlockRendering stateMapper( IStateMapper mapper ); + + @SideOnly( Side.CLIENT ) + IBlockRendering tesr( TileEntitySpecialRenderer tesr ); + +} diff --git a/src/main/java/appeng/bootstrap/IBootstrapComponent.java b/src/main/java/appeng/bootstrap/IBootstrapComponent.java new file mode 100644 index 000000000..3280986c4 --- /dev/null +++ b/src/main/java/appeng/bootstrap/IBootstrapComponent.java @@ -0,0 +1,24 @@ +package appeng.bootstrap; + + +import net.minecraftforge.fml.relauncher.Side; + + +/** + * Bootstrap components can be registered to take part in the various initialization phases of Forge. + */ +public interface IBootstrapComponent +{ + + default void preInitialize( Side side ) + { + } + + default void initialize( Side side ) + { + } + + default void postInitialize( Side side ) + { + } +} diff --git a/src/main/java/appeng/bootstrap/IItemBuilder.java b/src/main/java/appeng/bootstrap/IItemBuilder.java new file mode 100644 index 000000000..e46b37697 --- /dev/null +++ b/src/main/java/appeng/bootstrap/IItemBuilder.java @@ -0,0 +1,28 @@ +package appeng.bootstrap; + + +import net.minecraft.creativetab.CreativeTabs; + +import appeng.core.features.AEFeature; +import appeng.core.features.ItemDefinition; +import appeng.util.Platform; + + +/** + * Allows an item to be defined and registered with the game. + * The item is only registered once build is called. + */ +public interface IItemBuilder +{ + + IItemBuilder features( AEFeature... features ); + + IItemBuilder addFeatures( AEFeature... features ); + + IItemBuilder creativeTab( CreativeTabs tab ); + + IItemBuilder rendering( ItemRenderingCustomizer callback ); + + ItemDefinition build(); + +} diff --git a/src/main/java/appeng/bootstrap/IItemRendering.java b/src/main/java/appeng/bootstrap/IItemRendering.java new file mode 100644 index 000000000..fb4dd8ee3 --- /dev/null +++ b/src/main/java/appeng/bootstrap/IItemRendering.java @@ -0,0 +1,69 @@ +package appeng.bootstrap; + + +import java.util.Arrays; +import java.util.Collection; + +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + +/** + * Allows the rendering of an item to be customized. + */ +public interface IItemRendering +{ + + /** + * Registers a custom item mesh definition that will be used to dynamically determine the + * item model to be used for rendering by inspecting the item stack (i.e. for NBT data). + * Please + */ + @SideOnly( Side.CLIENT ) + IItemRendering meshDefinition( ItemMeshDefinition meshDefinition ); + + /** + * Registers an item model for meta=0, see {@link #model(int, ModelResourceLocation)}. + */ + @SideOnly( Side.CLIENT ) + default IItemRendering model( ModelResourceLocation model ) + { + return model( 0, model ); + } + + /** + * Registers an item model for a given meta. + */ + @SideOnly( Side.CLIENT ) + IItemRendering model( int meta, ModelResourceLocation model ); + + /** + * Convenient override for {@link #variants(Collection)}. + */ + @SideOnly( Side.CLIENT ) + default IItemRendering variants( ResourceLocation... resources ) + { + return variants( Arrays.asList( resources ) ); + } + + /** + * Registers the item variants of this item. This are all models that need to be loaded for this item. + * This has no direct effect on rendering, but is used to load models that are used for example by + * the ItemMeshDefinition. + * + * Models registered via {@link #model(int, ModelResourceLocation)} are automatically added here. + */ + @SideOnly( Side.CLIENT ) + IItemRendering variants( Collection resources ); + + /** + * Registers a custom item color definition that inspects an item stack and tint and + * returns a color multiplier. + */ + @SideOnly( Side.CLIENT ) + IItemRendering color( IItemColor itemColor ); +} diff --git a/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java new file mode 100644 index 000000000..fb9306540 --- /dev/null +++ b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java @@ -0,0 +1,112 @@ +package appeng.bootstrap; + + +import java.util.Collections; +import java.util.EnumSet; +import java.util.function.Supplier; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.core.AEConfig; +import appeng.core.AppEng; +import appeng.core.CreativeTab; +import appeng.core.features.AEFeature; +import appeng.core.features.ItemDefinition; +import appeng.util.Platform; + + +class ItemDefinitionBuilder implements IItemBuilder +{ + + private final FeatureFactory factory; + + private final String registryName; + + private final Supplier itemSupplier; + + private final EnumSet features = EnumSet.noneOf( AEFeature.class ); + + @SideOnly( Side.CLIENT ) + private ItemRendering itemRendering; + + private CreativeTabs creativeTab = CreativeTab.instance; + + ItemDefinitionBuilder( FeatureFactory factory, String registryName, Supplier itemSupplier ) + { + this.factory = factory; + this.registryName = registryName; + this.itemSupplier = itemSupplier; + if( Platform.isClient() ) + { + itemRendering = new ItemRendering(); + } + } + + @Override + public IItemBuilder features( AEFeature... features ) + { + this.features.clear(); + addFeatures( features ); + return this; + } + + @Override + public IItemBuilder addFeatures( AEFeature... features ) + { + Collections.addAll( this.features, features ); + return this; + } + + @Override + public IItemBuilder creativeTab( CreativeTabs tab ) + { + this.creativeTab = tab; + return this; + } + + @Override + public IItemBuilder rendering( ItemRenderingCustomizer callback ) + { + if( Platform.isClient() ) + { + customizeForClient( callback ); + } + + return this; + } + + @SideOnly( Side.CLIENT ) + private void customizeForClient( ItemRenderingCustomizer callback ) + { + callback.customize( itemRendering ); + } + + public ItemDefinition build() + { + if( !AEConfig.instance.areFeaturesEnabled( features ) ) + { + return new ItemDefinition( registryName, null ); + } + + Item item = itemSupplier.get(); + item.setRegistryName( AppEng.MOD_ID, registryName ); + + ItemDefinition definition = new ItemDefinition( registryName, item ); + + item.setUnlocalizedName( "appliedenergistics2." + registryName ); + item.setCreativeTab( creativeTab ); + + factory.addPreInit( side -> GameRegistry.register( item ) ); + + if( Platform.isClient() ) + { + itemRendering.apply( factory, item ); + } + + return definition; + } +} diff --git a/src/main/java/appeng/bootstrap/ItemRendering.java b/src/main/java/appeng/bootstrap/ItemRendering.java new file mode 100644 index 000000000..8a2ed04b2 --- /dev/null +++ b/src/main/java/appeng/bootstrap/ItemRendering.java @@ -0,0 +1,140 @@ +package appeng.bootstrap; + + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.ImmutableMap; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.StateMapperBase; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.bootstrap.components.ItemColorComponent; +import appeng.bootstrap.components.ItemMeshDefinitionComponent; +import appeng.bootstrap.components.ItemModelComponent; +import appeng.bootstrap.components.ItemVariantsComponent; + + +class ItemRendering implements IItemRendering +{ + + @SideOnly( Side.CLIENT ) + private IItemColor itemColor; + + @SideOnly( Side.CLIENT ) + private ItemMeshDefinition itemMeshDefinition; + + @SideOnly( Side.CLIENT ) + private Map itemModels = new HashMap<>(); + + @SideOnly( Side.CLIENT ) + private Set variants = new HashSet<>(); + + @Override + @SideOnly( Side.CLIENT ) + public IItemRendering meshDefinition( ItemMeshDefinition meshDefinition ) + { + this.itemMeshDefinition = meshDefinition; + return this; + } + + @Override + @SideOnly( Side.CLIENT ) + public IItemRendering model( int meta, ModelResourceLocation model ) + { + this.itemModels.put( meta, model ); + return this; + } + + @Override + public IItemRendering variants( Collection resources ) + { + this.variants.addAll( resources ); + return this; + } + + @Override + @SideOnly( Side.CLIENT ) + public IItemRendering color( IItemColor itemColor ) + { + this.itemColor = itemColor; + return this; + } + + void apply( FeatureFactory factory, Item item ) + { + if( this.itemMeshDefinition != null ) + { + factory.addBootstrapComponent( new ItemMeshDefinitionComponent( item, itemMeshDefinition ) ); + } + + if( !this.itemModels.isEmpty() ) + { + factory.addBootstrapComponent( new ItemModelComponent( item, this.itemModels ) ); + } + + Set resources = new HashSet<>( variants ); + + // Register a default item model if neither items by meta nor an item mesh definition exist + if( this.itemMeshDefinition == null && this.itemModels.isEmpty() ) + { + ModelResourceLocation model; + + // For block items, the default will try to use the default state of the associated block + if( item instanceof ItemBlock ) + { + Block block = ( (ItemBlock) item ).getBlock(); + + // We can only do this once the blocks are actually registered... + StateMapperHelper helper = new StateMapperHelper( block.getRegistryName() ); + model = helper.getModelResourceLocation( block.getDefaultState() ); + } + else + { + model = new ModelResourceLocation( item.getRegistryName(), "inventory" ); + } + + factory.addBootstrapComponent( new ItemModelComponent( item, ImmutableMap.of( 0, model ) ) ); + resources.add( model ); + } + + if( !resources.isEmpty() ) + { + factory.addBootstrapComponent( new ItemVariantsComponent( item, resources ) ); + } + + if( itemColor != null ) + { + factory.addBootstrapComponent( new ItemColorComponent( item, itemColor ) ); + } + } + + private static class StateMapperHelper extends StateMapperBase + { + + private final ResourceLocation registryName; + + public StateMapperHelper( ResourceLocation registryName ) + { + this.registryName = registryName; + } + + @Override + protected ModelResourceLocation getModelResourceLocation( IBlockState state ) + { + return new ModelResourceLocation( registryName, getPropertyString( state.getProperties() ) ); + } + } +} diff --git a/src/main/java/appeng/bootstrap/ItemRenderingCustomizer.java b/src/main/java/appeng/bootstrap/ItemRenderingCustomizer.java new file mode 100644 index 000000000..18737e204 --- /dev/null +++ b/src/main/java/appeng/bootstrap/ItemRenderingCustomizer.java @@ -0,0 +1,17 @@ +package appeng.bootstrap; + + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + +/** + * A callback that allows the rendering of a item to be customized. Sadly this class is required and no lambdas can be used + * due to them not being able to be annotated with @SideOnly(CLIENT). + */ +public abstract class ItemRenderingCustomizer +{ + + @SideOnly( Side.CLIENT ) + public abstract void customize( IItemRendering rendering ); +} diff --git a/src/main/java/appeng/bootstrap/components/BlockColorComponent.java b/src/main/java/appeng/bootstrap/components/BlockColorComponent.java new file mode 100644 index 000000000..ab846420b --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/BlockColorComponent.java @@ -0,0 +1,29 @@ +package appeng.bootstrap.components; + + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraftforge.fml.relauncher.Side; + + +public class BlockColorComponent implements InitComponent +{ + + private final Block block; + + private final IBlockColor blockColor; + + public BlockColorComponent( Block block, IBlockColor blockColor ) + { + this.block = block; + this.blockColor = blockColor; + } + + @Override + public void initialize( Side side ) + { + Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( blockColor, block ); + } + +} diff --git a/src/main/java/appeng/bootstrap/components/InitComponent.java b/src/main/java/appeng/bootstrap/components/InitComponent.java new file mode 100644 index 000000000..c081990c2 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/InitComponent.java @@ -0,0 +1,16 @@ +package appeng.bootstrap.components; + + +import net.minecraftforge.fml.relauncher.Side; + +import appeng.bootstrap.IBootstrapComponent; + + +@FunctionalInterface +public interface InitComponent extends IBootstrapComponent +{ + + @Override + void initialize( Side side ); + +} diff --git a/src/main/java/appeng/bootstrap/components/ItemColorComponent.java b/src/main/java/appeng/bootstrap/components/ItemColorComponent.java new file mode 100644 index 000000000..98778fa45 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ItemColorComponent.java @@ -0,0 +1,28 @@ +package appeng.bootstrap.components; + + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.item.Item; +import net.minecraftforge.fml.relauncher.Side; + + +public class ItemColorComponent implements InitComponent +{ + + private final Item item; + + private final IItemColor itemColor; + + public ItemColorComponent( Item item, IItemColor itemColor ) + { + this.item = item; + this.itemColor = itemColor; + } + + @Override + public void initialize( Side side ) + { + Minecraft.getMinecraft().getItemColors().registerItemColorHandler( itemColor, item ); + } +} diff --git a/src/main/java/appeng/bootstrap/components/ItemMeshDefinitionComponent.java b/src/main/java/appeng/bootstrap/components/ItemMeshDefinitionComponent.java new file mode 100644 index 000000000..355c3a2f5 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ItemMeshDefinitionComponent.java @@ -0,0 +1,34 @@ +package appeng.bootstrap.components; + + +import javax.annotation.Nonnull; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.item.Item; +import net.minecraftforge.fml.relauncher.Side; + + +/** + * Registers a custom item mesh definition that can be used to dynamically determine the item model based on + * item stack properties. + */ +public class ItemMeshDefinitionComponent implements InitComponent +{ + + private final Item item; + + private final ItemMeshDefinition meshDefinition; + + public ItemMeshDefinitionComponent( @Nonnull Item item, @Nonnull ItemMeshDefinition meshDefinition ) + { + this.item = item; + this.meshDefinition = meshDefinition; + } + + @Override + public void initialize( Side side ) + { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, meshDefinition ); + } +} diff --git a/src/main/java/appeng/bootstrap/components/ItemModelComponent.java b/src/main/java/appeng/bootstrap/components/ItemModelComponent.java new file mode 100644 index 000000000..4494ee21d --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ItemModelComponent.java @@ -0,0 +1,42 @@ +package appeng.bootstrap.components; + + +import java.util.Map; +import javax.annotation.Nonnull; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemModelMesher; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.Item; +import net.minecraftforge.fml.relauncher.Side; + + +/** + * Registers the models that should by used for an item, including the ability to + * distinguish by meta. + */ +public class ItemModelComponent implements InitComponent +{ + + private final Item item; + + private final Map modelsByMeta; + + public ItemModelComponent( @Nonnull Item item, @Nonnull Map modelsByMeta ) + { + this.item = item; + this.modelsByMeta = modelsByMeta; + } + + @Override + public void initialize( Side side ) + { + ItemModelMesher itemMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); + + modelsByMeta.forEach( ( meta, model ) -> + { + itemMesher.register( item, meta, model ); + } ); + } + +} diff --git a/src/main/java/appeng/bootstrap/components/ItemVariantsComponent.java b/src/main/java/appeng/bootstrap/components/ItemVariantsComponent.java new file mode 100644 index 000000000..d92ed793f --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ItemVariantsComponent.java @@ -0,0 +1,33 @@ +package appeng.bootstrap.components; + + +import java.util.Collection; + +import net.minecraft.client.renderer.block.model.ModelBakery; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; + +import appeng.bootstrap.IBootstrapComponent; + + +public class ItemVariantsComponent implements IBootstrapComponent +{ + + private final Item item; + + private final Collection resources; + + public ItemVariantsComponent( Item item, Collection resources ) + { + this.item = item; + this.resources = resources; + } + + @Override + public void preInitialize( Side side ) + { + ResourceLocation[] resourceArr = resources.toArray( new ResourceLocation[0] ); + ModelBakery.registerItemVariants( item, resourceArr ); + } +} diff --git a/src/main/java/appeng/bootstrap/components/ModelOverrideComponent.java b/src/main/java/appeng/bootstrap/components/ModelOverrideComponent.java new file mode 100644 index 000000000..2da8c8cf2 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ModelOverrideComponent.java @@ -0,0 +1,65 @@ +package appeng.bootstrap.components; + + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.BiFunction; + +import com.google.common.collect.Sets; + +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.util.registry.IRegistry; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; + +import appeng.core.AppEng; + + +public class ModelOverrideComponent implements PreInitComponent +{ + + // Maps from resource path to customizer + private final Map> customizer = new HashMap<>(); + + public void addOverride( String resourcePath, BiFunction customizer ) + { + this.customizer.put( resourcePath, customizer ); + } + + @Override + public void preInitialize( Side side ) + { + MinecraftForge.EVENT_BUS.register( this ); + } + + @SubscribeEvent + public void onModelBakeEvent( final ModelBakeEvent event ) + { + IRegistry modelRegistry = event.getModelRegistry(); + Set keys = Sets.newHashSet( modelRegistry.getKeys() ); + + for( ModelResourceLocation location : keys ) + { + if( !location.getResourceDomain().equals( AppEng.MOD_ID ) ) + { + continue; + } + + BiFunction customizer = this.customizer.get( location.getResourcePath() ); + if( customizer != null ) + { + IBakedModel orgModel = modelRegistry.getObject( location ); + IBakedModel newModel = customizer.apply( location, orgModel ); + + if( newModel != orgModel ) + { + modelRegistry.putObject( location, newModel ); + } + } + } + } +} diff --git a/src/main/java/appeng/bootstrap/components/PostInitComponent.java b/src/main/java/appeng/bootstrap/components/PostInitComponent.java new file mode 100644 index 000000000..5ff280279 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/PostInitComponent.java @@ -0,0 +1,15 @@ +package appeng.bootstrap.components; + + +import net.minecraftforge.fml.relauncher.Side; + +import appeng.bootstrap.IBootstrapComponent; + + +@FunctionalInterface +public interface PostInitComponent extends IBootstrapComponent +{ + + @Override + void postInitialize( Side side ); +} diff --git a/src/main/java/appeng/bootstrap/components/PreInitComponent.java b/src/main/java/appeng/bootstrap/components/PreInitComponent.java new file mode 100644 index 000000000..56a94562a --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/PreInitComponent.java @@ -0,0 +1,15 @@ +package appeng.bootstrap.components; + + +import net.minecraftforge.fml.relauncher.Side; + +import appeng.bootstrap.IBootstrapComponent; + +@FunctionalInterface +public interface PreInitComponent extends IBootstrapComponent +{ + + @Override + void preInitialize( Side side ); + +} diff --git a/src/main/java/appeng/bootstrap/components/StateMapperComponent.java b/src/main/java/appeng/bootstrap/components/StateMapperComponent.java new file mode 100644 index 000000000..d33e5e064 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/StateMapperComponent.java @@ -0,0 +1,38 @@ +package appeng.bootstrap.components; + + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.statemap.IStateMapper; +import net.minecraft.client.resources.IReloadableResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.relauncher.Side; + + +/** + * Registers a custom state mapper for a given block. + */ +public class StateMapperComponent implements InitComponent +{ + + private final Block block; + + private final IStateMapper stateMapper; + + public StateMapperComponent( Block block, IStateMapper stateMapper ) + { + this.block = block; + this.stateMapper = stateMapper; + } + + @Override + public void initialize( Side side ) + { + ModelLoader.setCustomStateMapper( block, stateMapper ); + if( stateMapper instanceof IResourceManagerReloadListener ) + { + ( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( (IResourceManagerReloadListener) stateMapper ); + } + } +} diff --git a/src/main/java/appeng/bootstrap/components/TesrComponent.java b/src/main/java/appeng/bootstrap/components/TesrComponent.java new file mode 100644 index 000000000..6501d08b8 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/TesrComponent.java @@ -0,0 +1,34 @@ +package appeng.bootstrap.components; + + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.relauncher.Side; + +import appeng.tile.AEBaseTile; + + +/** + * Registers a TESR for a given tile entity class. + * + * @param + */ +public class TesrComponent implements PreInitComponent +{ + + private final Class tileEntityClass; + + private final TileEntitySpecialRenderer tesr; + + public TesrComponent( Class tileEntityClass, TileEntitySpecialRenderer tesr ) + { + this.tileEntityClass = tileEntityClass; + this.tesr = tesr; + } + + @Override + public void preInitialize( Side side ) + { + ClientRegistry.bindTileEntitySpecialRenderer( tileEntityClass, tesr ); + } +} diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 9b694bdb3..387255050 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -29,15 +29,11 @@ import com.google.common.collect.ImmutableMap; import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.color.IItemColor; -import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.resources.IReloadableResourceManager; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; @@ -69,10 +65,8 @@ import appeng.client.render.model.UVLModelLoader; import appeng.client.render.textures.ParticleTextures; import appeng.core.AEConfig; import appeng.core.AELog; -import appeng.core.Api; import appeng.core.AppEng; import appeng.core.CommonHelper; -import appeng.core.features.IAEFeature; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketAssemblerAnimation; import appeng.core.sync.packets.PacketValueConfig; @@ -83,7 +77,6 @@ import appeng.entity.RenderTinyTNTPrimed; import appeng.helpers.IMouseWheelItem; import appeng.hooks.TickHandler; import appeng.hooks.TickHandler.PlayerColor; -import appeng.items.misc.ItemPaintBall; import appeng.items.parts.PartType; import appeng.parts.AEBasePart; import appeng.server.ServerHelper; @@ -100,10 +93,6 @@ public class ClientHelper extends ServerHelper MinecraftForge.EVENT_BUS.register( this ); ModelLoaderRegistry.registerLoader( UVLModelLoader.INSTANCE ); ( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( ModelsCache.INSTANCE ); - for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) - { - feature.handler().registerStateMapper(); - } } @Override @@ -127,15 +116,7 @@ public class ClientHelper extends ServerHelper // AELog.info( "Registering with %s with unlocalized %s", item, item.getUnlocalizedName() ); // mesher.register( item, DEFAULT_ITEM_SUBTYPE, fluixStairModel ); // } - for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) - { - feature.handler().registerModel(); - } - // Register color handling for paintball items - ItemColors itemColors = Minecraft.getMinecraft().getItemColors(); - Item paintballItem = Api.INSTANCE.definitions().items().paintBall().maybeItem().get(); - itemColors.registerItemColorHandler( ItemPaintBall::getColorFromItemstack, paintballItem ); } @Override @@ -379,10 +360,6 @@ public class ClientHelper extends ServerHelper public void onModelBakeEvent( final ModelBakeEvent event ) { UVLModelLoader.INSTANCE.setLoader( event.getModelLoader() ); - for( IAEFeature feature : Api.INSTANCE.definitions().getFeatureRegistry().getRegisteredFeatures() ) - { - feature.handler().registerCustomModelOverride( event.getModelRegistry() ); - } } @SubscribeEvent @@ -471,54 +448,4 @@ public class ClientHelper extends ServerHelper event.getMap().registerSprite( location ); } } - - private static class IconReg - { - public final String name; - public final Object item; - public final int meta; - public final ModelResourceLocation loc; - - public IconReg( final Object item2, final int meta2, final String name2 ) - { - this.meta = meta2; - this.name = name2; - this.item = item2; - this.loc = null; - } - - public IconReg( final Item item2, final int meta2, final String name2, final ModelResourceLocation res ) - { - this.meta = meta2; - this.name = name2; - this.item = item2; - this.loc = res; - } - } - - public class ItemPaintBallColor implements IItemColor - { - - @Override - public int getColorFromItemstack( ItemStack stack, int tintIndex ) - { - final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); - - final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; - final int r = ( colorValue >> 16 ) & 0xff; - final int g = ( colorValue >> 8 ) & 0xff; - final int b = ( colorValue ) & 0xff; - - if( stack.getItemDamage() >= 20 ) - { - final float fail = 0.7f; - final int full = (int) ( 255 * 0.3 ); - return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; - } - else - { - return r << 16 | g << 8 | b | 0xff << 24; - } - } - } } \ No newline at end of file diff --git a/src/main/java/appeng/client/render/model/AEIgnoringStateMapper.java b/src/main/java/appeng/client/render/model/AEIgnoringStateMapper.java deleted file mode 100644 index c2a346c8f..000000000 --- a/src/main/java/appeng/client/render/model/AEIgnoringStateMapper.java +++ /dev/null @@ -1,68 +0,0 @@ - -package appeng.client.render.model; - - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import com.google.common.collect.Maps; - -import org.apache.commons.io.IOUtils; - -import net.minecraft.block.Block; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.block.statemap.StateMapperBase; -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.client.resources.IResourceManagerReloadListener; -import net.minecraft.util.ResourceLocation; - - -public class AEIgnoringStateMapper extends StateMapperBase implements IResourceManagerReloadListener -{ - - private final ResourceLocation ignoredRL; - private final List ignored = new ArrayList<>(); - - public AEIgnoringStateMapper( ResourceLocation ignoredRL ) - { - this.ignoredRL = new ResourceLocation( ignoredRL.getResourceDomain(), "blockstates/" + ignoredRL.getResourcePath() + ".ignore.json" ); - } - - @Override - public void onResourceManagerReload( IResourceManager resourceManager ) - { - try - { - ignored.clear(); - ignored.add( "forward" ); - ignored.add( "up" ); - ignored.addAll( IOUtils.readLines( resourceManager.getResource( ignoredRL ).getInputStream() ) ); - } - catch( IOException e ) - { - // There's no ignore file, so everything is ok. - } - } - - @Override - protected ModelResourceLocation getModelResourceLocation( IBlockState state ) - { - Map, Comparable> map = Maps., Comparable>newLinkedHashMap( state.getProperties() ); - Iterator, Comparable>> it = map.entrySet().iterator(); - while( it.hasNext() ) - { - if( ignored.contains( it.next().getKey().getName() ) ) - { - it.remove(); - } - } - return new ModelResourceLocation( (ResourceLocation) Block.REGISTRY.getNameForObject( state.getBlock() ), this.getPropertyString( map ) ); - } - -} diff --git a/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java b/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java index 7a3a79fe0..1d9427626 100644 --- a/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java +++ b/src/main/java/appeng/client/render/model/pipeline/DoubleFacingQuadRotator.java @@ -12,6 +12,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.property.IExtendedBlockState; import appeng.api.client.BakingPipelineElement; import appeng.block.AEBaseTileBlock; @@ -26,10 +27,12 @@ public class DoubleFacingQuadRotator implements BakingPipelineElement rotated = new ArrayList(); + List rotated = new ArrayList<>(); for( QuadVertexData data : elements ) { data.setFace( f2r.rotate( data.getFace() ) ); diff --git a/src/main/java/appeng/client/render/tesr/ModularTESR.java b/src/main/java/appeng/client/render/tesr/ModularTESR.java index d9540edb5..a46831f81 100644 --- a/src/main/java/appeng/client/render/tesr/ModularTESR.java +++ b/src/main/java/appeng/client/render/tesr/ModularTESR.java @@ -5,12 +5,14 @@ package appeng.client.render.tesr; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.client.render.FacingToRotation; import appeng.client.render.renderable.Renderable; import appeng.tile.AEBaseTile; - +@SideOnly( Side.CLIENT ) public class ModularTESR extends TileEntitySpecialRenderer { diff --git a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java index 1b863aeac..76c96314b 100644 --- a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java +++ b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java @@ -6,6 +6,8 @@ import net.minecraft.client.model.ModelChest; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.block.storage.BlockSkyChest; import appeng.block.storage.BlockSkyChest.SkyChestType; @@ -13,7 +15,7 @@ import appeng.client.render.FacingToRotation; import appeng.core.AppEng; import appeng.tile.storage.TileSkyChest; - +@SideOnly( Side.CLIENT ) public class SkyChestTESR extends TileEntitySpecialRenderer { diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index d6a4b978c..5ef018c33 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -21,6 +21,7 @@ package appeng.core; import java.io.File; import java.util.Arrays; +import java.util.Collection; import java.util.EnumSet; import java.util.List; @@ -302,6 +303,11 @@ public final class AEConfig extends Configuration implements IConfigurableObject return this.featureFlags.contains( f ); } + public boolean areFeaturesEnabled( Collection features ) + { + return this.featureFlags.containsAll( features ); + } + public double wireless_getDrainRate( final double range ) { return this.WirelessTerminalDrainMultiplier * range; diff --git a/src/main/java/appeng/core/ApiDefinitions.java b/src/main/java/appeng/core/ApiDefinitions.java index 069e54872..21000f06c 100644 --- a/src/main/java/appeng/core/ApiDefinitions.java +++ b/src/main/java/appeng/core/ApiDefinitions.java @@ -21,11 +21,11 @@ package appeng.core; import appeng.api.definitions.IDefinitions; import appeng.api.parts.IPartHelper; +import appeng.bootstrap.FeatureFactory; import appeng.core.api.definitions.ApiBlocks; import appeng.core.api.definitions.ApiItems; import appeng.core.api.definitions.ApiMaterials; import appeng.core.api.definitions.ApiParts; -import appeng.core.api.definitions.DefinitionConstructor; /** @@ -37,31 +37,22 @@ public final class ApiDefinitions implements IDefinitions private final ApiItems items; private final ApiMaterials materials; private final ApiParts parts; - private final FeatureHandlerRegistry handlers; - private final FeatureRegistry features; + + private final FeatureFactory registry = new FeatureFactory(); public ApiDefinitions( final IPartHelper partHelper ) { - this.features = new FeatureRegistry(); - this.handlers = new FeatureHandlerRegistry(); - - final DefinitionConstructor constructor = new DefinitionConstructor( this.features, this.handlers ); - - this.blocks = new ApiBlocks( constructor ); - this.items = new ApiItems( constructor ); - this.materials = new ApiMaterials( constructor ); - this.parts = new ApiParts( constructor, partHelper ); + this.blocks = new ApiBlocks( registry ); + this.items = new ApiItems( registry ); + this.materials = new ApiMaterials( registry ); + this.parts = new ApiParts( registry, partHelper ); } - FeatureHandlerRegistry getFeatureHandlerRegistry() + public FeatureFactory getRegistry() { - return this.handlers; + return registry; } - public FeatureRegistry getFeatureRegistry() - { - return this.features; - } @Override public ApiBlocks blocks() diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index cda02f8f8..fab12bca1 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -196,7 +196,6 @@ public final class AppEng this.registration.initialize( event, this.recipeDirectory, this.customRecipeConfig ); IntegrationRegistry.INSTANCE.init(); - CommonHelper.proxy.init(); AELog.info( "Initialization ( ended after " + start.elapsed( TimeUnit.MILLISECONDS ) + "ms )" ); } diff --git a/src/main/java/appeng/core/FeatureHandlerRegistry.java b/src/main/java/appeng/core/FeatureHandlerRegistry.java deleted file mode 100644 index e52cb8ac6..000000000 --- a/src/main/java/appeng/core/FeatureHandlerRegistry.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core; - - -import java.util.LinkedHashSet; -import java.util.Set; - -import appeng.core.features.IFeatureHandler; - - -public final class FeatureHandlerRegistry -{ - private final Set registry = new LinkedHashSet(); - - public void addFeatureHandler( final IFeatureHandler feature ) - { - this.registry.add( feature ); - } - - Set getRegisteredFeatureHandlers() - { - return this.registry; - } -} diff --git a/src/main/java/appeng/core/FeatureRegistry.java b/src/main/java/appeng/core/FeatureRegistry.java deleted file mode 100644 index 4991f1d7a..000000000 --- a/src/main/java/appeng/core/FeatureRegistry.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core; - - -import java.util.LinkedHashSet; -import java.util.Set; - -import appeng.core.features.IAEFeature; - - -public final class FeatureRegistry -{ - private final Set registry = new LinkedHashSet(); - - public void addFeature( final IAEFeature feature ) - { - this.registry.add( feature ); - } - - public Set getRegisteredFeatures() - { - return this.registry; - } -} diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 934b9a14e..e89c9fe65 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -22,7 +22,6 @@ package appeng.core; import java.io.File; import java.util.HashSet; import java.util.Set; - import javax.annotation.Nonnull; import com.google.common.base.Preconditions; @@ -32,7 +31,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.DimensionType; import net.minecraft.world.biome.Biome; -import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @@ -42,11 +40,8 @@ import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.RecipeSorter.Category; -import appeng.api.AEApi; -import appeng.api.IAppEngApi; import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; -import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItems; import appeng.api.definitions.IParts; import appeng.api.features.IRecipeHandlerRegistry; @@ -65,8 +60,6 @@ import appeng.api.networking.ticking.ITickManager; import appeng.api.parts.IPartHelper; import appeng.block.networking.BlockCableBus; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.entries.BasicCellHandler; import appeng.core.features.registries.entries.CreativeCellHandler; @@ -150,18 +143,11 @@ public final class Registration MinecraftForge.EVENT_BUS.register( OreDictionaryHandler.INSTANCE ); - final ApiDefinitions definitions = api.definitions(); + ApiDefinitions definitions = api.definitions(); // Register all detected handlers and features (items, blocks) in pre-init - for( final IFeatureHandler handler : definitions.getFeatureHandlerRegistry().getRegisteredFeatureHandlers() ) - { - handler.register( event.getSide() ); - } + definitions.getRegistry().getBootstrapComponents().forEach( b -> b.preInitialize( event.getSide() ) ); - for( final IAEFeature feature : definitions.getFeatureRegistry().getRegisteredFeatures() ) - { - feature.postInit(); - } } private void registerSpatial( final boolean force ) @@ -247,10 +233,13 @@ public final class Registration Preconditions.checkArgument( !recipeDirectory.isFile() ); Preconditions.checkNotNull( customRecipeConfig ); - final IAppEngApi api = AEApi.instance(); + final Api api = Api.INSTANCE; final IPartHelper partHelper = api.partHelper(); final IRegistryContainer registries = api.registries(); + ApiDefinitions definitions = api.definitions(); + definitions.getRegistry().getBootstrapComponents().forEach( b -> b.initialize( event.getSide() ) ); + // Perform ore camouflage! ItemMultiItem.instance.makeUnique(); @@ -338,9 +327,9 @@ public final class Registration { this.registerSpatial( true ); - final IAppEngApi api = AEApi.instance(); + final Api api = Api.INSTANCE; final IRegistryContainer registries = api.registries(); - final IDefinitions definitions = api.definitions(); + ApiDefinitions definitions = api.definitions(); final IParts parts = definitions.parts(); final IBlocks blocks = definitions.blocks(); final IItems items = definitions.items(); @@ -358,6 +347,8 @@ public final class Registration ( (BlockCableBus) block ).setupTile(); } + definitions.getRegistry().getBootstrapComponents().forEach( b -> b.postInitialize( event.getSide() ) ); + // Interface Upgrades.CRAFTING.registerItem( parts.iface(), 1 ); Upgrades.CRAFTING.registerItem( blocks.iface(), 1 ); @@ -447,7 +438,7 @@ public final class Registration final IMovableRegistry mr = registries.movable(); - /** + /* * You can't move bed rock. */ mr.blacklistBlock( net.minecraft.init.Blocks.BEDROCK ); @@ -475,12 +466,12 @@ public final class Registration mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityNote.class ); mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityHopper.class ); - /** + /* * Whitelist AE2 */ mr.whiteListTileEntity( AEBaseTile.class ); - /** + /* * world gen */ for( final WorldGenType type : WorldGenType.values() ) @@ -500,7 +491,7 @@ public final class Registration registries.worldgen().enableWorldGenForDimension( WorldGenType.Meteorites, dimension ); } - /** + /* * initial recipe bake, if ore dictionary changes after this it re-bakes. */ OreDictionaryHandler.INSTANCE.bakeRecipes(); diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index f1a0b0389..8dc5d4cb5 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -19,16 +19,23 @@ package appeng.core.api.definitions; -import net.minecraft.block.Block; +import net.minecraft.block.BlockDispenser; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.oredict.OreDictionary; import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlocks; import appeng.api.definitions.ITileDefinition; +import appeng.block.AEBaseItemBlockChargeable; import appeng.block.crafting.BlockCraftingMonitor; import appeng.block.crafting.BlockCraftingStorage; import appeng.block.crafting.BlockCraftingUnit; import appeng.block.crafting.BlockCraftingUnit.CraftingUnitType; import appeng.block.crafting.BlockMolecularAssembler; +import appeng.block.crafting.ItemCraftingStorage; import appeng.block.grindstone.BlockCrank; import appeng.block.grindstone.BlockGrinder; import appeng.block.misc.BlockCellWorkbench; @@ -50,7 +57,10 @@ import appeng.block.networking.BlockCreativeEnergyCell; import appeng.block.networking.BlockDenseEnergyCell; import appeng.block.networking.BlockEnergyAcceptor; import appeng.block.networking.BlockEnergyCell; +import appeng.block.networking.BlockEnergyCellRendering; import appeng.block.networking.BlockWireless; +import appeng.block.networking.CableBusColor; +import appeng.block.networking.CableModelCustomizer; import appeng.block.qnb.BlockQuantumLinkChamber; import appeng.block.qnb.BlockQuantumRing; import appeng.block.spatial.BlockMatrixFrame; @@ -61,6 +71,13 @@ import appeng.block.storage.BlockDrive; import appeng.block.storage.BlockIOPort; import appeng.block.storage.BlockSkyChest; import appeng.block.storage.BlockSkyChest.SkyChestType; +import appeng.block.storage.SkyChestRenderingCustomizer; +import appeng.bootstrap.BlockRenderingCustomizer; +import appeng.bootstrap.FeatureFactory; +import appeng.bootstrap.IBlockRendering; +import appeng.bootstrap.IItemRendering; +import appeng.core.AppEng; +import appeng.core.features.AEFeature; import appeng.debug.BlockChunkloader; import appeng.debug.BlockCubeGenerator; import appeng.debug.BlockItemGen; @@ -76,6 +93,7 @@ import appeng.decorative.solid.BlockQuartzPillar; import appeng.decorative.solid.BlockSkyStone; import appeng.decorative.solid.BlockSkyStone.SkystoneType; import appeng.decorative.stair.BlockStairCommon; +import appeng.hooks.DispenserBehaviorTinyTNT; /** @@ -159,70 +177,138 @@ public final class ApiBlocks implements IBlocks private final IBlockDefinition phantomNode; private final IBlockDefinition cubeGenerator; - public ApiBlocks( final DefinitionConstructor constructor ) + public ApiBlocks( FeatureFactory registry ) { // this.quartzOre = new BlockDefinition( "ore.quartz", new OreQuartz() ); - this.quartzOre = constructor.registerBlockDefinition( new BlockQuartzOre() ); - this.quartzOreCharged = constructor.registerBlockDefinition( new BlockChargedQuartzOre() ); - this.matrixFrame = constructor.registerBlockDefinition( new BlockMatrixFrame() ); - this.quartz = constructor.registerBlockDefinition( new BlockQuartz() ); - this.quartzPillar = constructor.registerBlockDefinition( new BlockQuartzPillar() ); - this.quartzChiseled = constructor.registerBlockDefinition( new BlockChiseledQuartz() ); - this.quartzGlass = constructor.registerBlockDefinition( new BlockQuartzGlass() ); - this.quartzVibrantGlass = constructor.registerBlockDefinition( new BlockQuartzLamp() ); - this.quartzTorch = constructor.registerBlockDefinition( new BlockQuartzTorch() ); - this.fluix = constructor.registerBlockDefinition( new BlockFluix() ); - this.skyStone_stone = constructor.registerBlockDefinition( new BlockSkyStone( SkystoneType.STONE ) ); - this.skyStone_block = constructor.registerBlockDefinition( new BlockSkyStone( SkystoneType.BLOCK ) ); - this.skyStone_brick = constructor.registerBlockDefinition( new BlockSkyStone( SkystoneType.BRICK ) ); - this.skyStone_smallbrick = constructor.registerBlockDefinition( new BlockSkyStone( SkystoneType.SMALL_BRICK ) ); - this.skyChest = constructor.registerBlockDefinition( new BlockSkyChest( SkyChestType.STONE ) ); - this.skyChestBlock = constructor.registerBlockDefinition( new BlockSkyChest( SkyChestType.BLOCK ) ); - this.skyCompass = constructor.registerBlockDefinition( new BlockSkyCompass() ); - this.grindStone = constructor.registerTileDefinition( new BlockGrinder() ); - this.crankHandle = constructor.registerTileDefinition( new BlockCrank() ); - this.inscriber = constructor.registerTileDefinition( new BlockInscriber() ); - this.wireless = constructor.registerTileDefinition( new BlockWireless() ); - this.charger = constructor.registerTileDefinition( new BlockCharger() ); - this.tinyTNT = constructor.registerBlockDefinition( new BlockTinyTNT() ); - this.security = constructor.registerTileDefinition( new BlockSecurity() ); - this.quantumRing = constructor.registerTileDefinition( new BlockQuantumRing() ); - this.quantumLink = constructor.registerTileDefinition( new BlockQuantumLinkChamber() ); - this.spatialPylon = constructor.registerTileDefinition( new BlockSpatialPylon() ); - this.spatialIOPort = constructor.registerTileDefinition( new BlockSpatialIOPort() ); - this.multiPart = constructor.registerTileDefinition( new BlockCableBus() ); - this.controller = constructor.registerTileDefinition( new BlockController() ); - this.drive = constructor.registerTileDefinition( new BlockDrive() ); - this.chest = constructor.registerTileDefinition( new BlockChest() ); - this.iface = constructor.registerTileDefinition( new BlockInterface() ); - this.cellWorkbench = constructor.registerTileDefinition( new BlockCellWorkbench() ); - this.iOPort = constructor.registerTileDefinition( new BlockIOPort() ); - this.condenser = constructor.registerTileDefinition( new BlockCondenser() ); - this.energyAcceptor = constructor.registerTileDefinition( new BlockEnergyAcceptor() ); - this.vibrationChamber = constructor.registerTileDefinition( new BlockVibrationChamber() ); - this.quartzGrowthAccelerator = constructor.registerTileDefinition( new BlockQuartzGrowthAccelerator() ); - this.energyCell = constructor.registerTileDefinition( new BlockEnergyCell() ); - this.energyCellDense = constructor.registerTileDefinition( new BlockDenseEnergyCell() ); - this.energyCellCreative = constructor.registerTileDefinition( new BlockCreativeEnergyCell() ); - this.craftingUnit = constructor.registerTileDefinition( new BlockCraftingUnit( CraftingUnitType.UNIT ) ); - this.craftingAccelerator = constructor.registerTileDefinition( new BlockCraftingUnit( CraftingUnitType.ACCELERATOR ) ); - this.craftingStorage1k = constructor.registerTileDefinition( new BlockCraftingStorage( CraftingUnitType.STORAGE_1K ) ); - this.craftingStorage4k = constructor.registerTileDefinition( new BlockCraftingStorage( CraftingUnitType.STORAGE_4K ) ); - this.craftingStorage16k = constructor.registerTileDefinition( new BlockCraftingStorage( CraftingUnitType.STORAGE_16K ) ); - this.craftingStorage64k = constructor.registerTileDefinition( new BlockCraftingStorage( CraftingUnitType.STORAGE_64K ) ); - this.craftingMonitor = constructor.registerTileDefinition( new BlockCraftingMonitor() ); - this.molecularAssembler = constructor.registerTileDefinition( new BlockMolecularAssembler() ); - this.lightDetector = constructor.registerTileDefinition( new BlockLightDetector() ); - this.paint = constructor.registerTileDefinition( new BlockPaint() ); + this.quartzOre = registry.block( "quartz_ore", BlockQuartzOre::new ) + .postInit( ( block, item ) -> + { + OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( block ) ); + } ) + .build(); + this.quartzOreCharged = registry.block( "charged_quartz_ore", BlockChargedQuartzOre::new ) + .postInit( ( block, item ) -> + { + OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( block ) ); + } ) + .build(); + this.matrixFrame = registry.block( "matrix_frame", BlockMatrixFrame::new ).features( AEFeature.SpatialIO ).build(); - this.skyStoneStair = this.makeStairs( constructor, this.skyStone_stone, "skystone.stone" ); - this.skyStoneBlockStair = this.makeStairs( constructor, this.skyStone_block, "skystone.block" ); - this.skyStoneBrickStair = this.makeStairs( constructor, this.skyStone_brick, "skystone.brick" ); - this.skyStoneSmallBrickStair = this.makeStairs( constructor, this.skyStone_smallbrick, "skystone.brick.small" ); - this.fluixStair = this.makeStairs( constructor, this.fluix, "fluix" ); - this.quartzStair = this.makeStairs( constructor, this.quartz, "quartz.certus" ); - this.chiseledQuartzStair = this.makeStairs( constructor, this.quartzChiseled, "quartz.certus.chiseled" ); - this.quartzPillarStair = this.makeStairs( constructor, this.quartzPillar, "quartz.certus.pillar" ); + FeatureFactory deco = registry.features( AEFeature.DecorativeQuartzBlocks ); + this.quartz = deco.block( "quartz", BlockQuartz::new ).build(); + this.quartzPillar = deco.block( "quartz_pillar", BlockQuartzPillar::new ).build(); + this.quartzChiseled = deco.block( "chiseled_quartz", BlockChiseledQuartz::new ).build(); + this.quartzGlass = deco.block( "quartz_glass", BlockQuartzGlass::new ).build(); + this.quartzVibrantGlass = deco.block( "quartz_lamp", BlockQuartzLamp::new ).addFeatures( AEFeature.DecorativeLights ).build(); + this.quartzTorch = registry.block( "quartz_torch", BlockQuartzTorch::new ).features( AEFeature.DecorativeLights ).build(); + + this.fluix = deco.block( "fluix", BlockFluix::new ).build(); + this.skyStone_stone = deco.block( "sky_stone_block_stone", () -> new BlockSkyStone( SkystoneType.STONE ) ).build(); + this.skyStone_block = deco.block( "sky_stone_block_block", () -> new BlockSkyStone( SkystoneType.BLOCK ) ).build(); + this.skyStone_brick = deco.block( "sky_stone_block_brick", () -> new BlockSkyStone( SkystoneType.BRICK ) ).build(); + this.skyStone_smallbrick = deco.block( "sky_stone_block_small_brick", () -> new BlockSkyStone( SkystoneType.SMALL_BRICK ) ).build(); + + this.skyChest = registry.block( "sky_chest_stone", () -> new BlockSkyChest( SkyChestType.STONE ) ) + .features( AEFeature.SkyStoneChests ) + .rendering( new SkyChestRenderingCustomizer( SkyChestType.STONE ) ) + .build(); + this.skyChestBlock = registry.block( "sky_chest_block", () -> new BlockSkyChest( SkyChestType.BLOCK ) ) + .features( AEFeature.SkyStoneChests ) + .rendering( new SkyChestRenderingCustomizer( SkyChestType.BLOCK ) ) + .build(); + + this.skyCompass = registry.block( "sky_compass", BlockSkyCompass::new ).features( AEFeature.MeteoriteCompass ).build(); + this.grindStone = registry.block( "grinder", BlockGrinder::new ).features( AEFeature.GrindStone ).build(); + this.crankHandle = registry.block( "crank", BlockCrank::new ).features( AEFeature.GrindStone ).build(); + this.inscriber = registry.block( "inscriber", BlockInscriber::new ).features( AEFeature.Inscriber ).build(); + this.wireless = registry.block( "wireless", BlockWireless::new ).features( AEFeature.WirelessAccessTerminal ).build(); + this.charger = registry.block( "charger", BlockCharger::new ) + .rendering( new BlockRenderingCustomizer() + { + @Override + public void customize( IBlockRendering rendering, IItemRendering itemRendering ) + { + rendering.tesr( BlockCharger.createTesr() ); + } + } ) + .build(); + this.tinyTNT = registry.block( "tiny_tnt", BlockTinyTNT::new ).features( AEFeature.TinyTNT ) + .postInit( ( block, item ) -> + { + BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( item, new DispenserBehaviorTinyTNT() ); + } ) + .build(); + this.security = registry.block( "security", BlockSecurity::new ).features( AEFeature.Security ).build(); + this.quantumRing = registry.block( "quantum_ring", BlockQuantumRing::new ).features( AEFeature.QuantumNetworkBridge ).build(); + this.quantumLink = registry.block( "quantum_link", BlockQuantumLinkChamber::new ).features( AEFeature.QuantumNetworkBridge ).build(); + this.spatialPylon = registry.block( "spatial_pylon", BlockSpatialPylon::new ).features( AEFeature.SpatialIO ).build(); + this.spatialIOPort = registry.block( "spatial_ioport", BlockSpatialIOPort::new ).features( AEFeature.SpatialIO ).build(); + this.controller = registry.block( "controller", BlockController::new ).features( AEFeature.Channels ).build(); + this.drive = registry.block( "drive", BlockDrive::new ).features( AEFeature.StorageCells, AEFeature.MEDrive ).build(); + this.chest = registry.block( "chest", BlockChest::new ).features( AEFeature.StorageCells, AEFeature.MEChest ).build(); + this.iface = registry.block( "interface", BlockInterface::new ).build(); + this.cellWorkbench = registry.block( "cell_work_bench", BlockCellWorkbench::new ).features( AEFeature.StorageCells ).build(); + this.iOPort = registry.block( "ioport", BlockIOPort::new ).features( AEFeature.StorageCells, AEFeature.IOPort ).build(); + this.condenser = registry.block( "condenser", BlockCondenser::new ).build(); + this.energyAcceptor = registry.block( "energy_acceptor", BlockEnergyAcceptor::new ).build(); + this.vibrationChamber = registry.block( "vibration_chamber", BlockVibrationChamber::new ).features( AEFeature.PowerGen ).build(); + this.quartzGrowthAccelerator = registry.block( "quartz_growth_accelerator", BlockQuartzGrowthAccelerator::new ).build(); + this.energyCell = registry.block( "energy_cell", BlockEnergyCell::new ) + .item( AEBaseItemBlockChargeable::new ) + .rendering( new BlockEnergyCellRendering( new ResourceLocation( AppEng.MOD_ID, "energy_cell" ) ) ) + .build(); + this.energyCellDense = registry.block( "dense_energy_cell", BlockDenseEnergyCell::new ) + .features( AEFeature.DenseEnergyCells ) + .item( AEBaseItemBlockChargeable::new ) + .rendering( new BlockEnergyCellRendering( new ResourceLocation( AppEng.MOD_ID, "dense_energy_cell" ) ) ) + .build(); + this.energyCellCreative = registry.block( "creative_energy_cell", BlockCreativeEnergyCell::new ) + .features( AEFeature.Creative ) + .item( AEBaseItemBlockChargeable::new ) + .build(); + + FeatureFactory crafting = registry.features( AEFeature.CraftingCPU ); + this.craftingUnit = crafting.block( "crafting_unit", () -> new BlockCraftingUnit( CraftingUnitType.UNIT ) ).build(); + this.craftingAccelerator = crafting.block( "crafting_accelerator", () -> new BlockCraftingUnit( CraftingUnitType.ACCELERATOR ) ).build(); + this.craftingStorage1k = crafting.block( "crafting_storage_1k", () -> new BlockCraftingStorage( CraftingUnitType.STORAGE_1K ) ) + .item( ItemCraftingStorage::new ) + .build(); + this.craftingStorage4k = crafting.block( "crafting_storage_4k", () -> new BlockCraftingStorage( CraftingUnitType.STORAGE_4K ) ) + .item( ItemCraftingStorage::new ) + .build(); + this.craftingStorage16k = crafting.block( "crafting_storage_16k", () -> new BlockCraftingStorage( CraftingUnitType.STORAGE_16K ) ) + .item( ItemCraftingStorage::new ) + .build(); + this.craftingStorage64k = crafting.block( "crafting_storage_64k", () -> new BlockCraftingStorage( CraftingUnitType.STORAGE_64K ) ) + .item( ItemCraftingStorage::new ) + .build(); + this.craftingMonitor = crafting.block( "crafting_monitor", BlockCraftingMonitor::new ).build(); + + this.molecularAssembler = registry.block( "molecular_assembler", BlockMolecularAssembler::new ).features( AEFeature.MolecularAssembler ).build(); + this.lightDetector = registry.block( "light_detector", BlockLightDetector::new ).features( AEFeature.LightDetector ).build(); + this.paint = registry.block( "paint", BlockPaint::new ).features( AEFeature.PaintBalls ).build(); + + this.skyStoneStair = makeStairs( "stair_skystone_stone", registry, this.skyStone() ); + this.skyStoneBlockStair = makeStairs( "stair_skystone_block", registry, this.skyStoneBlock() ); + this.skyStoneBrickStair = makeStairs( "stair_skystone_brick", registry, this.skyStoneBrick() ); + this.skyStoneSmallBrickStair = makeStairs( "stair_skystone_brick_small", registry, this.skyStoneSmallBrick() ); + this.fluixStair = makeStairs( "stair_fluix", registry, this.fluix() ); + this.quartzStair = makeStairs( "stair_quartz_certus", registry, this.quartz() ); + this.chiseledQuartzStair = makeStairs( "stair_quartz_certus_chiseled", registry, this.quartzChiseled() ); + this.quartzPillarStair = makeStairs( "stair_quartz_certus_pillar", registry, this.quartzPillar() ); + + this.multiPart = registry.block( "multipart_block", BlockCableBus::new ) + .rendering( new BlockRenderingCustomizer() + { + @Override + @SideOnly( Side.CLIENT ) + public void customize( IBlockRendering rendering, IItemRendering itemRendering ) + { + rendering.modelCustomizer( new CableModelCustomizer()::customizeModel ) + .blockColor( new CableBusColor() ); + } + } ) + .build(); // TODO Re-Add Slabs... /* @@ -239,25 +325,22 @@ public final class ApiBlocks implements IBlocks * this.quartzSlab = constructor.registerBlockDefinition( new AEBaseSlabBlock( quartzBlock, * EnumSet.of(AEFeature.DecorativeQuartzBlocks), false, "QuartzSlabBlock" ) ); * this.chiseledQuartzSlab = constructor.registerBlockDefinition( new AEBaseSlabBlock( chiseledQuartz, - * EnumSet.of(AEFeature.DecorativeQuartzBlocks), false, "ChiseledQuartzSlabBlock" ) );; + * EnumSet.of(AEFeature.DecorativeQuartzBlocks), false, "ChiseledQuartzSlabBlock" ) ); * this.quartzPillarSlab = constructor.registerBlockDefinition( new AEBaseSlabBlock( quartzPillar, * EnumSet.of(AEFeature.DecorativeQuartzBlocks), false, "QuartzPillarSlabBlock" ) ) */ - this.itemGen = constructor.registerBlockDefinition( new BlockItemGen() ); - this.chunkLoader = constructor.registerBlockDefinition( new BlockChunkloader() ); - this.phantomNode = constructor.registerBlockDefinition( new BlockPhantomNode() ); - this.cubeGenerator = constructor.registerBlockDefinition( new BlockCubeGenerator() ); + this.itemGen = registry.block( "debug_item_gen", BlockItemGen::new ).features( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ).build(); + this.chunkLoader = registry.block( "debug_chunk_loader", BlockChunkloader::new ).features( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ).build(); + this.phantomNode = registry.block( "debug_phantom_node", BlockPhantomNode::new ).features( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ).build(); + this.cubeGenerator = registry.block( "debug_cube_gen", BlockCubeGenerator::new ).features( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ).build(); } - private IBlockDefinition makeStairs( final DefinitionConstructor constructor, final IBlockDefinition definition, final String name ) + private static IBlockDefinition makeStairs( String registryName, FeatureFactory registry, IBlockDefinition block ) { - for( final Block block : definition.maybeBlock().asSet() ) - { - return constructor.registerBlockDefinition( new BlockStairCommon( block, name ) ); - } - - return null; + return registry.block( registryName, () -> new BlockStairCommon( block.maybeBlock().get(), block.identifier() ) ) + .features( AEFeature.DecorativeQuartzBlocks ) + .build(); } @Override diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 566fb3ebd..92568bf02 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -22,6 +22,8 @@ package appeng.core.api.definitions; import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItems; import appeng.api.util.AEColoredItemDefinition; +import appeng.bootstrap.FeatureFactory; +import appeng.core.CreativeTabFacade; import appeng.core.features.AEFeature; import appeng.debug.ToolDebugCard; import appeng.debug.ToolEraser; @@ -29,8 +31,10 @@ import appeng.debug.ToolMeteoritePlacer; import appeng.debug.ToolReplicatorCard; import appeng.items.materials.MaterialType; import appeng.items.misc.ItemCrystalSeed; +import appeng.items.misc.ItemCrystalSeedRendering; import appeng.items.misc.ItemEncodedPattern; import appeng.items.misc.ItemPaintBall; +import appeng.items.misc.ItemPaintBallRendering; import appeng.items.parts.ItemFacade; import appeng.items.storage.ItemBasicStorageCell; import appeng.items.storage.ItemCreativeStorageCell; @@ -113,60 +117,75 @@ public final class ApiItems implements IItems private final IItemDefinition toolDebugCard; private final IItemDefinition toolReplicatorCard; - public ApiItems( final DefinitionConstructor constructor ) + public ApiItems( FeatureFactory registry ) { - this.certusQuartzAxe = constructor.registerItemDefinition( new ToolQuartzAxe( AEFeature.CertusQuartzTools ) ); - this.certusQuartzHoe = constructor.registerItemDefinition( new ToolQuartzHoe( AEFeature.CertusQuartzTools ) ); - this.certusQuartzShovel = constructor.registerItemDefinition( new ToolQuartzSpade( AEFeature.CertusQuartzTools ) ); - this.certusQuartzPick = constructor.registerItemDefinition( new ToolQuartzPickaxe( AEFeature.CertusQuartzTools ) ); - this.certusQuartzSword = constructor.registerItemDefinition( new ToolQuartzSword( AEFeature.CertusQuartzTools ) ); - this.certusQuartzWrench = constructor.registerItemDefinition( new ToolQuartzWrench( AEFeature.CertusQuartzTools ) ); - this.certusQuartzKnife = constructor.registerItemDefinition( new ToolQuartzCuttingKnife( AEFeature.CertusQuartzTools ) ); + FeatureFactory certusTools = registry.features( AEFeature.CertusQuartzTools ); + this.certusQuartzAxe = certusTools.item( "certus_quartz_axe", () -> new ToolQuartzAxe( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzAxe ).build(); + this.certusQuartzHoe = certusTools.item( "certus_quartz_hoe", () -> new ToolQuartzHoe( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzHoe ).build(); + this.certusQuartzShovel = certusTools.item( "certus_quartz_spade", () -> new ToolQuartzSpade( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzSpade ).build(); + this.certusQuartzPick = certusTools.item( "certus_quartz_pickaxe", () -> new ToolQuartzPickaxe( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzPickaxe ).build(); + this.certusQuartzSword = certusTools.item( "certus_quartz_sword", () -> new ToolQuartzSword( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzSword ).build(); + this.certusQuartzWrench = certusTools.item( "certus_quartz_wrench", ToolQuartzWrench::new ).addFeatures( AEFeature.QuartzWrench ).build(); + this.certusQuartzKnife = certusTools.item( "certus_quartz_cutting_knife", () -> new ToolQuartzCuttingKnife( AEFeature.CertusQuartzTools ) ).addFeatures( AEFeature.QuartzKnife ).build(); - this.netherQuartzAxe = constructor.registerItemDefinition( new ToolQuartzAxe( AEFeature.NetherQuartzTools ) ); - this.netherQuartzHoe = constructor.registerItemDefinition( new ToolQuartzHoe( AEFeature.NetherQuartzTools ) ); - this.netherQuartzShovel = constructor.registerItemDefinition( new ToolQuartzSpade( AEFeature.NetherQuartzTools ) ); - this.netherQuartzPick = constructor.registerItemDefinition( new ToolQuartzPickaxe( AEFeature.NetherQuartzTools ) ); - this.netherQuartzSword = constructor.registerItemDefinition( new ToolQuartzSword( AEFeature.NetherQuartzTools ) ); - this.netherQuartzWrench = constructor.registerItemDefinition( new ToolQuartzWrench( AEFeature.NetherQuartzTools ) ); - this.netherQuartzKnife = constructor.registerItemDefinition( new ToolQuartzCuttingKnife( AEFeature.NetherQuartzTools ) ); + FeatureFactory netherTools = registry.features( AEFeature.NetherQuartzTools ); + this.netherQuartzAxe = netherTools.item( "nether_quartz_axe", () -> new ToolQuartzAxe( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzAxe ).build(); + this.netherQuartzHoe = netherTools.item( "nether_quartz_hoe", () -> new ToolQuartzHoe( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzHoe ).build(); + this.netherQuartzShovel = netherTools.item( "nether_quartz_spade", () -> new ToolQuartzSpade( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzSpade ).build(); + this.netherQuartzPick = netherTools.item( "nether_quartz_pickaxe", () -> new ToolQuartzPickaxe( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzPickaxe ).build(); + this.netherQuartzSword = netherTools.item( "nether_quartz_sword", () -> new ToolQuartzSword( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzSword ).build(); + this.netherQuartzWrench = netherTools.item( "nether_quartz_wrench", ToolQuartzWrench::new ).addFeatures( AEFeature.QuartzWrench ).build(); + this.netherQuartzKnife = netherTools.item( "nether_quartz_cutting_knife", () -> new ToolQuartzCuttingKnife( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzKnife ).build(); - this.entropyManipulator = constructor.registerItemDefinition( new ToolEntropyManipulator() ); - this.wirelessTerminal = constructor.registerItemDefinition( new ToolWirelessTerminal() ); - this.biometricCard = constructor.registerItemDefinition( new ToolBiometricCard() ); - this.chargedStaff = constructor.registerItemDefinition( new ToolChargedStaff() ); - this.massCannon = constructor.registerItemDefinition( new ToolMassCannon() ); - this.memoryCard = constructor.registerItemDefinition( new ToolMemoryCard() ); - this.networkTool = constructor.registerItemDefinition( new ToolNetworkTool() ); - this.portableCell = constructor.registerItemDefinition( new ToolPortableCell() ); + FeatureFactory powerTools = registry.features( AEFeature.PoweredTools ); + this.entropyManipulator = powerTools.item( "entropy_manipulator", ToolEntropyManipulator::new ).addFeatures( AEFeature.EntropyManipulator ).build(); + this.wirelessTerminal = powerTools.item( "wireless_terminal", ToolWirelessTerminal::new ).addFeatures( AEFeature.WirelessAccessTerminal ).build(); + this.chargedStaff = powerTools.item( "charged_staff", ToolChargedStaff::new ).addFeatures( AEFeature.ChargedStaff ).build(); + this.massCannon = powerTools.item( "mass_cannon", ToolMassCannon::new ).addFeatures( AEFeature.MatterCannon ).build(); + this.portableCell = powerTools.item( "portable_cell", ToolPortableCell::new ).addFeatures( AEFeature.PortableCell, AEFeature.StorageCells ).build(); + this.colorApplicator = powerTools.item( "color_applicator", ToolColorApplicator::new ).addFeatures( AEFeature.ColorApplicator ).build(); - this.cellCreative = constructor.registerItemDefinition( new ItemCreativeStorageCell() ); - this.viewCell = constructor.registerItemDefinition( new ItemViewCell() ); + this.biometricCard = registry.item( "biometric_card", ToolBiometricCard::new ).features( AEFeature.Security ).build(); + this.memoryCard = registry.item( "memory_card", ToolMemoryCard::new ).build(); + this.networkTool = registry.item( "network_tool", ToolNetworkTool::new ).features( AEFeature.NetworkTool ).build(); - this.cell1k = constructor.registerItemDefinition( new ItemBasicStorageCell( MaterialType.Cell1kPart, 1 ) ); - this.cell4k = constructor.registerItemDefinition( new ItemBasicStorageCell( MaterialType.Cell4kPart, 4 ) ); - this.cell16k = constructor.registerItemDefinition( new ItemBasicStorageCell( MaterialType.Cell16kPart, 16 ) ); - this.cell64k = constructor.registerItemDefinition( new ItemBasicStorageCell( MaterialType.Cell64kPart, 64 ) ); + this.cellCreative = registry.item( "creative_storage_cell", ItemCreativeStorageCell::new ).features( AEFeature.StorageCells, AEFeature.Creative ).build(); + this.viewCell = registry.item( "view_cell", ItemViewCell::new ).build(); - this.spatialCell2 = constructor.registerItemDefinition( new ItemSpatialStorageCell( 2 ) ); - this.spatialCell16 = constructor.registerItemDefinition( new ItemSpatialStorageCell( 16 ) ); - this.spatialCell128 = constructor.registerItemDefinition( new ItemSpatialStorageCell( 128 ) ); + FeatureFactory storageCells = registry.features( AEFeature.StorageCells ); + this.cell1k = storageCells.item( "basic_storage_cell_1k", () -> new ItemBasicStorageCell( MaterialType.Cell1kPart, 1 ) ).build(); + this.cell4k = storageCells.item( "basic_storage_cell_4k", () -> new ItemBasicStorageCell( MaterialType.Cell4kPart, 4 ) ).build(); + this.cell16k = storageCells.item( "basic_storage_cell_16k", () -> new ItemBasicStorageCell( MaterialType.Cell16kPart, 16 ) ).build(); + this.cell64k = storageCells.item( "basic_storage_cell_64k", () -> new ItemBasicStorageCell( MaterialType.Cell64kPart, 64 ) ).build(); - this.facade = constructor.registerItemDefinition( new ItemFacade() ); - this.crystalSeed = constructor.registerItemDefinition( new ItemCrystalSeed() ); + FeatureFactory spatialCells = registry.features( AEFeature.SpatialIO ); + this.spatialCell2 = spatialCells.item( "spatial_storage_cell_2_cubed", () -> new ItemSpatialStorageCell( 2 ) ).build(); + this.spatialCell16 = spatialCells.item( "spatial_storage_cell_16_cubed", () -> new ItemSpatialStorageCell( 16 ) ).build(); + this.spatialCell128 = spatialCells.item( "spatial_storage_cell_128_cubed", () -> new ItemSpatialStorageCell( 128 ) ).build(); + + this.facade = registry.item( "facade", ItemFacade::new ) + .features( AEFeature.Facades ) + .creativeTab( CreativeTabFacade.instance ) + .build(); + this.crystalSeed = registry.item( "crystal_seed", ItemCrystalSeed::new ) + .rendering( new ItemCrystalSeedRendering() ) + .build(); // rv1 - this.encodedPattern = constructor.registerItemDefinition( new ItemEncodedPattern() ); - this.colorApplicator = constructor.registerItemDefinition( new ToolColorApplicator() ); + this.encodedPattern = registry.item( "encoded_pattern", ItemEncodedPattern::new ).features( AEFeature.Patterns ).build(); - this.paintBall = constructor.registerItemDefinition( new ItemPaintBall() ); - this.coloredPaintBall = constructor.constructColoredDefinition( this.paintBall, 0 ); - this.coloredLumenPaintBall = constructor.constructColoredDefinition( this.paintBall, 20 ); + this.paintBall = registry.item( "paint_ball", ItemPaintBall::new ) + .features( AEFeature.PaintBalls ) + .rendering( new ItemPaintBallRendering() ) + .build(); + this.coloredPaintBall = registry.colored( this.paintBall, 0 ); + this.coloredLumenPaintBall = registry.colored( this.paintBall, 20 ); - this.toolEraser = constructor.registerItemDefinition( new ToolEraser() ); - this.toolMeteoritePlacer = constructor.registerItemDefinition( new ToolMeteoritePlacer() ); - this.toolDebugCard = constructor.registerItemDefinition( new ToolDebugCard() ); - this.toolReplicatorCard = constructor.registerItemDefinition( new ToolReplicatorCard() ); + FeatureFactory debugTools = registry.features( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ); + this.toolEraser = debugTools.item( "debug_eraser", ToolEraser::new ).build(); + this.toolMeteoritePlacer = debugTools.item( "debug_meteorite_placer", ToolMeteoritePlacer::new ).build(); + this.toolDebugCard = debugTools.item( "debug_card", ToolDebugCard::new ).build(); + this.toolReplicatorCard = debugTools.item( "debug_replicator_card", ToolReplicatorCard::new ).build(); } @Override diff --git a/src/main/java/appeng/core/api/definitions/ApiMaterials.java b/src/main/java/appeng/core/api/definitions/ApiMaterials.java index 038cf29c5..29b03c01f 100644 --- a/src/main/java/appeng/core/api/definitions/ApiMaterials.java +++ b/src/main/java/appeng/core/api/definitions/ApiMaterials.java @@ -19,11 +19,20 @@ package appeng.core.api.definitions; +import java.util.Arrays; +import java.util.stream.Collectors; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IMaterials; +import appeng.bootstrap.FeatureFactory; +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; import appeng.core.features.DamagedItemDefinition; -import appeng.items.materials.MaterialType; import appeng.items.materials.ItemMultiItem; +import appeng.items.materials.MaterialType; /** @@ -103,10 +112,24 @@ public final class ApiMaterials implements IMaterials private final IItemDefinition qESingularity; private final IItemDefinition blankPattern; - public ApiMaterials( final DefinitionConstructor constructor ) + public ApiMaterials( FeatureFactory registry ) { final ItemMultiItem materials = new ItemMultiItem(); - constructor.registerItemDefinition( materials ); + registry.item( "multi_material", () -> materials ) + .rendering( new ItemRenderingCustomizer() + { + @Override + @SideOnly( Side.CLIENT ) + public void customize( IItemRendering rendering ) + { + rendering.meshDefinition( is -> materials.getTypeByStack( is ).getModel() ); + // Register a resource location for every material type + rendering.variants( Arrays.stream( MaterialType.values() ) + .map( MaterialType::getModel ) + .collect( Collectors.toList() ) ); + } + } ) + .build(); this.cell2SpatialPart = new DamagedItemDefinition( "material.cell.spatial.2", materials.createMaterial( MaterialType.Cell2SpatialPart ) ); this.cell16SpatialPart = new DamagedItemDefinition( "material.cell.spatial.16", materials.createMaterial( MaterialType.Cell16SpatialPart ) ); diff --git a/src/main/java/appeng/core/api/definitions/ApiParts.java b/src/main/java/appeng/core/api/definitions/ApiParts.java index 4d54a82bf..fc4026ba9 100644 --- a/src/main/java/appeng/core/api/definitions/ApiParts.java +++ b/src/main/java/appeng/core/api/definitions/ApiParts.java @@ -23,9 +23,14 @@ import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IParts; import appeng.api.exceptions.MissingDefinition; import appeng.api.parts.IPartHelper; +import appeng.api.util.AEColor; import appeng.api.util.AEColoredItemDefinition; +import appeng.bootstrap.FeatureFactory; +import appeng.core.features.ColoredItemDefinition; import appeng.core.features.DamagedItemDefinition; +import appeng.core.features.ItemStackSrc; import appeng.items.parts.ItemMultiPart; +import appeng.items.parts.ItemMultipartRendering; import appeng.items.parts.PartType; @@ -73,15 +78,17 @@ public final class ApiParts implements IParts private final IItemDefinition storageMonitor; private final IItemDefinition conversionMonitor; - public ApiParts( final DefinitionConstructor constructor, final IPartHelper partHelper ) + public ApiParts( FeatureFactory registry, IPartHelper partHelper ) { final ItemMultiPart itemMultiPart = new ItemMultiPart( partHelper ); - constructor.registerItemDefinition( itemMultiPart ); + registry.item( "multipart", () -> itemMultiPart ) + .rendering( new ItemMultipartRendering( itemMultiPart ) ) + .build(); - this.cableSmart = constructor.constructColoredDefinition( itemMultiPart, PartType.CableSmart ); - this.cableCovered = constructor.constructColoredDefinition( itemMultiPart, PartType.CableCovered ); - this.cableGlass = constructor.constructColoredDefinition( itemMultiPart, PartType.CableGlass ); - this.cableDense = constructor.constructColoredDefinition( itemMultiPart, PartType.CableDense ); + this.cableSmart = constructColoredDefinition( itemMultiPart, PartType.CableSmart ); + this.cableCovered = constructColoredDefinition( itemMultiPart, PartType.CableCovered ); + this.cableGlass = constructColoredDefinition( itemMultiPart, PartType.CableGlass ); + this.cableDense = constructColoredDefinition( itemMultiPart, PartType.CableDense ); // this.lumenCableSmart = Optional.absent(); // has yet to be implemented, no PartType defined for it yet // this.lumenCableCovered = Optional.absent(); // has yet to be implemented, no PartType defined for it yet // this.lumenCableGlass = Optional.absent(); // has yet to be implemented, no PartType defined for it yet @@ -120,6 +127,20 @@ public final class ApiParts implements IParts this.conversionMonitor = new DamagedItemDefinition( "part.monitor.conversion", itemMultiPart.createPart( PartType.ConversionMonitor ) ); } + private static AEColoredItemDefinition constructColoredDefinition( final ItemMultiPart target, final PartType type ) + { + final ColoredItemDefinition definition = new ColoredItemDefinition(); + + for( final AEColor color : AEColor.values() ) + { + final ItemStackSrc multiPartSource = target.createPart( type, color ); + + definition.add( color, multiPartSource ); + } + + return definition; + } + @Override public AEColoredItemDefinition cableSmart() { diff --git a/src/main/java/appeng/core/api/definitions/DefinitionConstructor.java b/src/main/java/appeng/core/api/definitions/DefinitionConstructor.java deleted file mode 100644 index c7170fb5c..000000000 --- a/src/main/java/appeng/core/api/definitions/DefinitionConstructor.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, 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.api.definitions; - - -import net.minecraft.item.Item; - -import appeng.api.definitions.IBlockDefinition; -import appeng.api.definitions.IItemDefinition; -import appeng.api.definitions.ITileDefinition; -import appeng.api.util.AEColor; -import appeng.api.util.AEColoredItemDefinition; -import appeng.core.FeatureHandlerRegistry; -import appeng.core.FeatureRegistry; -import appeng.core.features.ActivityState; -import appeng.core.features.ColoredItemDefinition; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemStackSrc; -import appeng.items.parts.ItemMultiPart; -import appeng.items.parts.PartType; - - -public class DefinitionConstructor -{ - private final FeatureRegistry features; - private final FeatureHandlerRegistry handlers; - - public DefinitionConstructor( final FeatureRegistry features, final FeatureHandlerRegistry handlers ) - { - this.features = features; - this.handlers = handlers; - } - - final ITileDefinition registerTileDefinition( final IAEFeature feature ) - { - final IBlockDefinition definition = this.registerBlockDefinition( feature ); - - if( definition instanceof ITileDefinition ) - { - return( (ITileDefinition) definition ); - } - - throw new IllegalStateException( "No tile definition for " + feature ); - } - - final IBlockDefinition registerBlockDefinition( final IAEFeature feature ) - { - final IItemDefinition definition = this.registerItemDefinition( feature ); - - if( definition instanceof IBlockDefinition ) - { - return( (IBlockDefinition) definition ); - } - - throw new IllegalStateException( "No block definition for " + feature ); - } - - final IItemDefinition registerItemDefinition( final IAEFeature feature ) - { - final IFeatureHandler handler = feature.handler(); - - if( handler.isFeatureAvailable() ) - { - this.handlers.addFeatureHandler( handler ); - this.features.addFeature( feature ); - } - - final IItemDefinition definition = handler.getDefinition(); - - return definition; - } - - final AEColoredItemDefinition constructColoredDefinition( final IItemDefinition target, final int offset ) - { - final ColoredItemDefinition definition = new ColoredItemDefinition(); - - for( final Item targetItem : target.maybeItem().asSet() ) - { - for( final AEColor color : AEColor.VALID_COLORS ) - { - final ActivityState state = ActivityState.from( target.isEnabled() ); - - definition.add( color, new ItemStackSrc( targetItem, offset + color.ordinal(), state ) ); - } - } - - return definition; - } - - final AEColoredItemDefinition constructColoredDefinition( final ItemMultiPart target, final PartType type ) - { - final ColoredItemDefinition definition = new ColoredItemDefinition(); - - for( final AEColor color : AEColor.values() ) - { - final ItemStackSrc multiPartSource = target.createPart( type, color ); - - definition.add( color, multiPartSource ); - } - - return definition; - } -} diff --git a/src/main/java/appeng/core/features/AEBlockFeatureHandler.java b/src/main/java/appeng/core/features/AEBlockFeatureHandler.java deleted file mode 100644 index bf9389897..000000000 --- a/src/main/java/appeng/core/features/AEBlockFeatureHandler.java +++ /dev/null @@ -1,151 +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.features; - - -import java.util.EnumSet; - -import com.google.common.base.Optional; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.ItemModelMesher; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.resources.IReloadableResourceManager; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.IRegistry; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; - -import appeng.api.definitions.IBlockDefinition; -import appeng.block.AEBaseBlock; -import appeng.block.IHasSpecialItemModel; -import appeng.client.render.model.AEIgnoringStateMapper; -import appeng.core.AppEng; -import appeng.core.CreativeTab; - - -public final class AEBlockFeatureHandler implements IFeatureHandler -{ - private final Block featured; - private final FeatureNameExtractor extractor; - private final boolean enabled; - private final BlockDefinition definition; - - private ResourceLocation registryName; - - public AEBlockFeatureHandler( final EnumSet features, final Block featured, final Optional subName ) - { - final ActivityState state = new FeaturedActiveChecker( features ).getActivityState(); - - this.featured = featured; - this.extractor = new FeatureNameExtractor( featured.getClass(), subName ); - this.enabled = state == ActivityState.Enabled; - // TODO use real identifier - this.definition = new BlockDefinition( featured.getClass().getSimpleName(), featured, state ); - } - - @Override - public boolean isFeatureAvailable() - { - return this.enabled; - } - - @Override - public IBlockDefinition getDefinition() - { - return this.definition; - } - - @Override - public void register( final Side side ) - { - if( this.enabled ) - { - String name = this.extractor.get(); - if( Item.REGISTRY.containsKey( new ResourceLocation( AppEng.MOD_ID, name ) ) ) - { - name += "_block"; - } - this.featured.setCreativeTab( CreativeTab.instance ); - this.featured.setUnlocalizedName( "appliedenergistics2." + name ); - - registryName = new ResourceLocation( AppEng.MOD_ID, name ); - GameRegistry.register( this.featured.setRegistryName( registryName ) ); - - // register the block/item conversion... - if( this.definition.maybeItem().isPresent() ) - { - GameRegistry.register( this.definition.maybeItem().get().setRegistryName( registryName ) ); - - if( side == Side.CLIENT ) - { - ModelBakery.registerItemVariants( this.definition.maybeItem().get(), registryName ); - } - } - } - } - - @Override - public void registerModel() - { - ItemModelMesher itemModelMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); - Item item = this.definition.maybeItem().get(); - - // Retrieve a custom item mesh definition, if the block defines one - ItemMeshDefinition itemMeshDefinition = null; - if( featured instanceof AEBaseBlock ) - { - itemMeshDefinition = ( (AEBaseBlock) featured ).getItemMeshDefinition(); - } - - if ( itemMeshDefinition != null ) - { - // This block has a custom item mesh definition, so register it instead of the resource location - itemModelMesher.register( item, itemMeshDefinition ); - } - else if( !featured.getBlockState().getProperties().isEmpty() || featured instanceof IHasSpecialItemModel ) - { - itemModelMesher.register( item, 0, new ModelResourceLocation( registryName, "inventory" ) ); - } - else - { - itemModelMesher.register( item, 0, new ModelResourceLocation( registryName, "normal" ) ); - } - } - - @Override - public void registerStateMapper() - { - AEIgnoringStateMapper mapper = new AEIgnoringStateMapper( registryName ); - ModelLoader.setCustomStateMapper( this.featured, mapper ); - ( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( mapper ); - } - - @Override - public void registerCustomModelOverride( IRegistry modelRegistry ) - { - - } -} diff --git a/src/main/java/appeng/core/features/AECableBusFeatureHandler.java b/src/main/java/appeng/core/features/AECableBusFeatureHandler.java deleted file mode 100644 index f89247969..000000000 --- a/src/main/java/appeng/core/features/AECableBusFeatureHandler.java +++ /dev/null @@ -1,176 +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.features; - - -import java.util.EnumSet; -import java.util.Set; - -import com.google.common.base.Optional; -import com.google.common.collect.Sets; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.IRegistry; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.property.IExtendedBlockState; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; - -import appeng.api.client.BakingPipeline; -import appeng.api.definitions.ITileDefinition; -import appeng.api.util.AEPartLocation; -import appeng.block.AEBaseTileBlock; -import appeng.block.networking.BlockCableBus; -import appeng.client.render.model.pipeline.BakingPipelineBakedModel; -import appeng.client.render.model.pipeline.FacingQuadRotator; -import appeng.client.render.model.pipeline.Merge; -import appeng.client.render.model.pipeline.TintIndexModifier; -import appeng.client.render.model.pipeline.TypeTransformer; -import appeng.client.render.model.pipeline.cable.CableAndConnections; -import appeng.client.render.model.pipeline.cable.Facades; -import appeng.client.render.model.pipeline.cable.Parts; -import appeng.core.AppEng; -import appeng.core.CommonHelper; -import appeng.core.CreativeTab; -import appeng.parts.CableBusContainer; -import appeng.util.Platform; - - -public final class AECableBusFeatureHandler implements IFeatureHandler -{ - private final AEBaseTileBlock featured; - private final FeatureNameExtractor extractor; - private final boolean enabled; - private final TileDefinition definition; - - private ResourceLocation registryName; - - public AECableBusFeatureHandler( final EnumSet features, final BlockCableBus featured, final Optional subName ) - { - final ActivityState state = new FeaturedActiveChecker( features ).getActivityState(); - - this.featured = featured; - this.extractor = new FeatureNameExtractor( featured.getClass(), subName ); - this.enabled = state == ActivityState.Enabled; - this.definition = new TileDefinition( featured.getClass().getSimpleName(), featured, state ); - } - - @Override - public boolean isFeatureAvailable() - { - return this.enabled; - } - - @Override - public ITileDefinition getDefinition() - { - return this.definition; - } - - /** - * Registration of the {@link TileEntity} will actually be handled by {@link BlockCableBus#setupTile()}. - */ - @Override - public void register( final Side side ) - { - if( this.enabled ) - { - final String name = this.extractor.get(); - this.featured.setCreativeTab( CreativeTab.instance ); - this.featured.setUnlocalizedName( "appliedenergistics2." + name ); - - if( Platform.isClient() ) - { - CommonHelper.proxy.bindTileEntitySpecialRenderer( this.featured.getTileEntityClass(), this.featured ); - } - - registryName = new ResourceLocation( AppEng.MOD_ID, name ); - - // Bypass the forge magic with null to register our own itemblock later. - GameRegistry.register( this.featured.setRegistryName( registryName ) ); - GameRegistry.register( this.definition.maybeItem().get().setRegistryName( registryName ) ); - - if( side == Side.CLIENT ) - { - ModelBakery.registerItemVariants( this.definition.maybeItem().get(), registryName ); - } - } - } - - @Override - public void registerModel() - { - Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( new CableBusColor(), this.featured ); - Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( this.definition.maybeItem().get(), 0, new ModelResourceLocation( registryName, "normal" ) ); - } - - @Override - public void registerStateMapper() - { - - } - - @Override - public void registerCustomModelOverride( IRegistry modelRegistry ) - { - final BakingPipeline rotatingPipeline = new BakingPipeline( TypeTransformer.quads2vecs, new FacingQuadRotator(), TypeTransformer.vecs2quads ); - final TintIndexModifier tintIndexModifier = new TintIndexModifier( tint -> tint ); - final BakingPipeline tintIndexFixPipeline = new BakingPipeline( TypeTransformer.quads2vecs, tintIndexModifier, TypeTransformer.vecs2quads ); - Set keys = Sets.newHashSet( modelRegistry.getKeys() ); - for( ModelResourceLocation model : keys ) - { - if( model.getResourceDomain().equals( registryName.getResourceDomain() ) && model.getResourcePath().equals( registryName.getResourcePath() ) ) - { - modelRegistry.putObject( model, new BakingPipelineBakedModel( modelRegistry.getObject( model ), new Merge( new CableAndConnections( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Facades( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ), new Parts( rotatingPipeline, tintIndexModifier, tintIndexFixPipeline ) ) ) ); - } - } - } - - public static class CableBusColor implements IBlockColor - { - - @Override - public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int color ) - { - AEPartLocation side = AEPartLocation.fromOrdinal( ( color >> 2 ) & 7 ); - CableBusContainer bus = ( (IExtendedBlockState) state ).getValue( BlockCableBus.cableBus ); - switch( color & 3 ) - { - case 0: - return bus.getGridNode( side ) != null && bus.getGridNode( side ).isActive() ? 0xffffff : 0; - case 1: - return bus.getColor().blackVariant; - case 2: - return bus.getColor().mediumVariant; - case 3: - return bus.getColor().whiteVariant; - default: - return color; - } - } - } -} diff --git a/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java b/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java deleted file mode 100644 index 396e09c87..000000000 --- a/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java +++ /dev/null @@ -1,172 +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.features; - - -import java.util.EnumSet; -import java.util.Set; - -import com.google.common.base.Optional; -import com.google.common.collect.Sets; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.ItemModelMesher; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.client.resources.IReloadableResourceManager; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.IRegistry; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; - -import appeng.api.definitions.ITileDefinition; -import appeng.block.AEBaseTileBlock; -import appeng.block.IHasSpecialItemModel; -import appeng.client.render.model.AEIgnoringStateMapper; -import appeng.client.render.model.CachingRotatingBakedModel; -import appeng.core.AppEng; -import appeng.core.CommonHelper; -import appeng.core.CreativeTab; -import appeng.tile.AEBaseTile; -import appeng.util.Platform; - - -public final class AETileBlockFeatureHandler implements IFeatureHandler -{ - private final AEBaseTileBlock featured; - private final FeatureNameExtractor extractor; - private final boolean enabled; - private final TileDefinition definition; - - private ResourceLocation registryName; - - public AETileBlockFeatureHandler( final EnumSet features, final AEBaseTileBlock featured, final Optional subName ) - { - final ActivityState state = new FeaturedActiveChecker( features ).getActivityState(); - - this.featured = featured; - this.extractor = new FeatureNameExtractor( featured.getClass(), subName ); - this.enabled = state == ActivityState.Enabled; - this.definition = new TileDefinition( featured.getClass().getSimpleName(), featured, state ); - } - - @Override - public boolean isFeatureAvailable() - { - return this.enabled; - } - - @Override - public ITileDefinition getDefinition() - { - return this.definition; - } - - @Override - public void register( final Side side ) - { - if( this.enabled ) - { - String name = this.extractor.get(); - if( Item.REGISTRY.containsKey( new ResourceLocation( AppEng.MOD_ID, name ) ) ) - { - name += "_block"; - } - this.featured.setCreativeTab( CreativeTab.instance ); - this.featured.setUnlocalizedName( "appliedenergistics2." + name ); - - if( Platform.isClient() ) - { - CommonHelper.proxy.bindTileEntitySpecialRenderer( this.featured.getTileEntityClass(), this.featured ); - } - - registryName = new ResourceLocation( AppEng.MOD_ID, name ); - - GameRegistry.register( this.featured.setRegistryName( registryName ) ); - GameRegistry.register( this.definition.maybeItem().get().setRegistryName( registryName ) ); - AEBaseTile.registerTileItem( this.featured.getTileEntityClass(), new BlockStackSrc( this.featured, 0, ActivityState.from( this.isFeatureAvailable() ) ) ); - - GameRegistry.registerTileEntityWithAlternatives( this.featured.getTileEntityClass(), this.featured.toString() ); - - if( side == Side.CLIENT ) - { - TileEntitySpecialRenderer tesr = this.featured.getTESR(); - ModelBakery.registerItemVariants( this.definition.maybeItem().get(), registryName ); - if( tesr != null ) - { - ClientRegistry.bindTileEntitySpecialRenderer( this.featured.getTileEntityClass(), tesr ); - if( this.featured.hasItemTESR() ) - { - ForgeHooksClient.registerTESRItemStack( this.definition.maybeItem().get(), 0, this.featured.getTileEntityClass() ); - } - } - } - } - } - - @Override - public void registerModel() - { - ItemModelMesher itemModelMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); - Item item = this.definition.maybeItem().get(); - ItemMeshDefinition itemMeshDefinition = featured.getItemMeshDefinition(); - - if( itemMeshDefinition != null ) - { - // This block has a custom item mesh definition, so register it instead of the resource location - itemModelMesher.register( item, itemMeshDefinition ); - } - else if( !featured.getBlockState().getProperties().isEmpty() || featured instanceof IHasSpecialItemModel ) - { - itemModelMesher.register( item, 0, new ModelResourceLocation( registryName, "inventory" ) ); - } - else - { - itemModelMesher.register( item, 0, new ModelResourceLocation( registryName, "normal" ) ); - } - } - - @Override - public void registerStateMapper() - { - AEIgnoringStateMapper mapper = new AEIgnoringStateMapper( registryName ); - ModelLoader.setCustomStateMapper( this.featured, mapper ); - ( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( mapper ); - } - - @Override - public void registerCustomModelOverride( IRegistry modelRegistry ) - { - Set keys = Sets.newHashSet( modelRegistry.getKeys() ); - for( ModelResourceLocation model : keys ) - { - if( model.getResourceDomain().equals( registryName.getResourceDomain() ) && model.getResourcePath().equals( registryName.getResourcePath() ) ) - { - modelRegistry.putObject( model, new CachingRotatingBakedModel( modelRegistry.getObject( model ) ) ); - } - } - } -} diff --git a/src/main/java/appeng/core/features/BlockDefinition.java b/src/main/java/appeng/core/features/BlockDefinition.java index 4a8be1b43..b4b7a03dd 100644 --- a/src/main/java/appeng/core/features/BlockDefinition.java +++ b/src/main/java/appeng/core/features/BlockDefinition.java @@ -19,111 +19,26 @@ package appeng.core.features; -import java.lang.reflect.Constructor; - -import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.collect.ObjectArrays; import net.minecraft.block.Block; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import appeng.api.definitions.IBlockDefinition; -import appeng.block.AEBaseBlock; public class BlockDefinition extends ItemDefinition implements IBlockDefinition { - private static final ItemBlockTransformer ITEMBLOCK_TRANSFORMER = new ItemBlockTransformer(); private final Optional block; - public BlockDefinition( final String identifier, final Block block, final ActivityState state ) + public BlockDefinition( String registryName, Block block, ItemBlock item ) { - super( identifier, constructItemFromBlock( block ), state ); - - Preconditions.checkNotNull( block ); - Preconditions.checkNotNull( state ); - - if( state == ActivityState.Enabled ) - { - this.block = Optional.of( block ); - } - else - { - this.block = Optional.absent(); - } - } - - /** - * Create an {@link ItemBlock} from a {@link Block} to register it later as {@link Item} - * - * @param block source block - * - * @return item from block - */ - private static Item constructItemFromBlock( final Block block ) - { - final Class itemclass = getItemBlockConstructor( block ); - return constructItemBlock( block, itemclass ); - } - - /** - * Returns the constructor to use. - * - * Either {@link ItemBlock} or in case of an {@link AEBaseBlock} the class returned by - * AEBaseBlock.getItemBlockClass(). - * - * @param block the block used to determine the used constructor. - * - * @return a {@link Class} extending ItemBlock - */ - private static Class getItemBlockConstructor( final Block block ) - { - if( block instanceof AEBaseBlock ) - { - final AEBaseBlock aeBaseBlock = (AEBaseBlock) block; - return aeBaseBlock.getItemBlockClass(); - } - - return ItemBlock.class; - } - - /** - * Actually construct an instance of {@link Item} with the block and earlier determined constructor. - * - * Shamelessly stolen from the forge magic. - * - * TODO: throw an exception instead of returning null? As this could cause issue later on. - * - * @param block the block to create the {@link ItemBlock} from - * @param itemclass the class used to construct it. - * - * @return an {@link Item} for the block. Actually always a sub type of {@link ItemBlock} - */ - private static Item constructItemBlock( final Block block, final Class itemclass ) - { - try - { - final Object[] itemCtorArgs = {}; - final Class[] ctorArgClasses = new Class[itemCtorArgs.length + 1]; - ctorArgClasses[0] = Block.class; - for( int idx = 1; idx < ctorArgClasses.length; idx++ ) - { - ctorArgClasses[idx] = itemCtorArgs[idx - 1].getClass(); - } - - final Constructor itemCtor = itemclass.getConstructor( ctorArgClasses ); - return itemCtor.newInstance( ObjectArrays.concat( block, itemCtorArgs ) ); - } - catch( final Throwable t ) - { - return null; - } + super( registryName, item ); + this.block = Optional.fromNullable( block ); } @Override @@ -135,13 +50,15 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition @Override public final Optional maybeItemBlock() { - return this.block.transform( ITEMBLOCK_TRANSFORMER ); + return this.block.transform( ItemBlock::new ); } @Override - public final Optional maybeStack( final int stackSize ) + public final Optional maybeStack( int stackSize ) { - return this.block.transform( new ItemStackTransformer( stackSize ) ); + Preconditions.checkArgument( stackSize > 0 ); + + return this.block.transform( b -> new ItemStack( b, stackSize ) ); } @Override @@ -149,31 +66,4 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition { return this.isEnabled() && world.getBlockState( pos ).getBlock() == this.block.get(); } - - private static class ItemBlockTransformer implements Function - { - @Override - public ItemBlock apply( final Block input ) - { - return new ItemBlock( input ); - } - } - - private static class ItemStackTransformer implements Function - { - private final int stackSize; - - public ItemStackTransformer( final int stackSize ) - { - Preconditions.checkArgument( stackSize > 0 ); - - this.stackSize = stackSize; - } - - @Override - public ItemStack apply( final Block input ) - { - return new ItemStack( input, this.stackSize ); - } - } } diff --git a/src/main/java/appeng/core/features/FeatureNameExtractor.java b/src/main/java/appeng/core/features/FeatureNameExtractor.java deleted file mode 100644 index f0664a1c2..000000000 --- a/src/main/java/appeng/core/features/FeatureNameExtractor.java +++ /dev/null @@ -1,96 +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.features; - - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.google.common.base.Optional; - - -public class FeatureNameExtractor -{ - private static final Pattern PATTERN_ITEM_MULTI_PART = Pattern.compile( "ItemMultiPart", Pattern.LITERAL ); - private static final Pattern PATTERN_ITEM_MULTI_MATERIAL = Pattern.compile( "ItemMultiMaterial", Pattern.LITERAL ); - private static final Pattern PATTERN_QUARTZ = Pattern.compile( "Quartz", Pattern.LITERAL ); - - private static final Pattern PATTERN_LOWERCASE = Pattern.compile( "([\\p{Upper}])([\\p{Upper}]+)" ); - private static final Pattern PATTERN_LOWERCASER = Pattern.compile( "(.)?([\\p{Upper}])" ); - - private final Class clazz; - private final Optional subName; - - public FeatureNameExtractor( final Class clazz, final Optional subName ) - { - this.clazz = clazz; - this.subName = subName; - } - - public String get() - { - String ret; - String name = this.clazz.getSimpleName().replaceFirst( "\\p{Upper}[\\p{Lower}]*(\\p{Upper})", "$1" ); - - if( this.subName.isPresent() ) - { - final String subName = this.subName.get(); - // simple hack to allow me to do get nice names for these without - // mode code outside of AEBaseItem - if( subName.startsWith( "P2PTunnel" ) ) - { - ret = "p2ptunnel"; - } - else if( subName.equals( "CertusQuartzTools" ) ) - { - ret = PATTERN_QUARTZ.matcher( name ).replaceAll( "CertusQuartz" ); - } - else if( subName.equals( "NetherQuartzTools" ) ) - { - ret = PATTERN_QUARTZ.matcher( name ).replaceAll( "NetherQuartz" ); - } - else - { - ret = name + '_' + subName; - } - } - else - { - ret = name; - } - - StringBuffer buffer = new StringBuffer(); - Matcher m = PATTERN_LOWERCASE.matcher( ret ); - while( m.find() ) - { - m.appendReplacement( buffer, m.group( 1 ) + m.group( 2 ).toLowerCase() ); - } - m.appendTail( buffer ); - m = PATTERN_LOWERCASER.matcher( buffer.toString() ); - buffer = new StringBuffer(); - while( m.find() ) - { - m.appendReplacement( buffer, ( m.group( 1 ) != null ? m.group( 1 ) + '_' : "" ) + m.group( 2 ).toLowerCase() ); - } - m.appendTail( buffer ); - ret = buffer.toString().replace( '.', '_' ).replaceAll( "_+", "_" ); - return ret; - } - -} diff --git a/src/main/java/appeng/core/features/FeaturedActiveChecker.java b/src/main/java/appeng/core/features/FeaturedActiveChecker.java deleted file mode 100644 index 623af56fa..000000000 --- a/src/main/java/appeng/core/features/FeaturedActiveChecker.java +++ /dev/null @@ -1,48 +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.features; - - -import java.util.Set; - -import appeng.core.AEConfig; - - -public final class FeaturedActiveChecker -{ - private final Set features; - - public FeaturedActiveChecker( final Set features ) - { - this.features = features; - } - - ActivityState getActivityState() - { - for( final AEFeature f : this.features ) - { - if( !AEConfig.instance.isFeatureEnabled( f ) ) - { - return ActivityState.Disabled; - } - } - - return ActivityState.Enabled; - } -} diff --git a/src/main/java/appeng/core/features/IAEFeature.java b/src/main/java/appeng/core/features/IAEFeature.java deleted file mode 100644 index c819f1e76..000000000 --- a/src/main/java/appeng/core/features/IAEFeature.java +++ /dev/null @@ -1,27 +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.features; - - -public interface IAEFeature -{ - IFeatureHandler handler(); - - void postInit(); -} diff --git a/src/main/java/appeng/core/features/IFeatureHandler.java b/src/main/java/appeng/core/features/IFeatureHandler.java deleted file mode 100644 index 555429af7..000000000 --- a/src/main/java/appeng/core/features/IFeatureHandler.java +++ /dev/null @@ -1,47 +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.features; - - -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.util.registry.IRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import appeng.api.definitions.IItemDefinition; - - -public interface IFeatureHandler -{ - boolean isFeatureAvailable(); - - IItemDefinition getDefinition(); - - void register( Side side ); - - @SideOnly( Side.CLIENT ) - void registerModel(); - - @SideOnly( Side.CLIENT ) - void registerStateMapper(); - - @SideOnly( Side.CLIENT ) - void registerCustomModelOverride( IRegistry modelRegistry ); -} diff --git a/src/main/java/appeng/core/features/ItemDefinition.java b/src/main/java/appeng/core/features/ItemDefinition.java index d1f7f15b9..842d2ca3a 100644 --- a/src/main/java/appeng/core/features/ItemDefinition.java +++ b/src/main/java/appeng/core/features/ItemDefinition.java @@ -24,6 +24,7 @@ import javax.annotation.Nonnull; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -37,21 +38,11 @@ public class ItemDefinition implements IItemDefinition private final String identifier; private final Optional item; - public ItemDefinition( final String identifier, final Item item, final ActivityState state ) + public ItemDefinition( String registryName, Item item ) { - this.identifier = Preconditions.checkNotNull( identifier ); - Preconditions.checkArgument( !identifier.isEmpty() ); - Preconditions.checkNotNull( item ); - Preconditions.checkNotNull( state ); - - if( state == ActivityState.Enabled ) - { - this.item = Optional.of( item ); - } - else - { - this.item = Optional.absent(); - } + Preconditions.checkArgument( !Strings.isNullOrEmpty( registryName ), "registryName" ); + this.identifier = registryName; + this.item = Optional.fromNullable( item ); } @Nonnull diff --git a/src/main/java/appeng/core/features/ItemFeatureHandler.java b/src/main/java/appeng/core/features/ItemFeatureHandler.java deleted file mode 100644 index 56a0d96a6..000000000 --- a/src/main/java/appeng/core/features/ItemFeatureHandler.java +++ /dev/null @@ -1,153 +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.features; - - -import java.util.EnumSet; - -import com.google.common.base.Optional; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ModelBakery; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.IRegistry; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; - -import appeng.api.definitions.IItemDefinition; -import appeng.core.AppEng; -import appeng.core.CreativeTab; -import appeng.core.CreativeTabFacade; -import appeng.items.AEBaseItem; -import appeng.items.parts.ItemFacade; - - -public final class ItemFeatureHandler implements IFeatureHandler -{ - private final Item item; - private final FeatureNameExtractor extractor; - private final boolean enabled; - private final ItemDefinition definition; - - private ResourceLocation registryName; - - public ItemFeatureHandler( final EnumSet features, final Item item, final IAEFeature featured, final Optional subName ) - { - final ActivityState state = new FeaturedActiveChecker( features ).getActivityState(); - - this.item = item; - this.extractor = new FeatureNameExtractor( featured.getClass(), subName ); - this.enabled = state == ActivityState.Enabled; - this.definition = new ItemDefinition( item.getClass().getSimpleName(), item, state ); - } - - @Override - public boolean isFeatureAvailable() - { - return this.enabled; - } - - @Override - public IItemDefinition getDefinition() - { - return this.definition; - } - - @Override - public void register( final Side side ) - { - if( this.enabled ) - { - String name = this.extractor.get(); - if( Item.REGISTRY.containsKey( new ResourceLocation( AppEng.MOD_ID, name ) ) ) - { - name += "_item"; - } - - // this.item.setTextureName( "appliedenergistics2:" + name ); - this.item.setUnlocalizedName( "appliedenergistics2." + name ); - - if( this.item instanceof ItemFacade ) - { - this.item.setCreativeTab( CreativeTabFacade.instance ); - } - else - { - this.item.setCreativeTab( CreativeTab.instance ); - } - - registryName = new ResourceLocation( AppEng.MOD_ID, name ); - GameRegistry.register( this.item.setRegistryName( registryName ) ); - - if( side == Side.CLIENT ) - { - if( item instanceof AEBaseItem ) - { - AEBaseItem baseItem = (AEBaseItem) item; - - // Handle registration of item variants - ResourceLocation[] variants = baseItem.getItemVariants().toArray( new ResourceLocation[0] ); - ModelBakery.registerItemVariants( item, variants ); - } - else - { - ModelBakery.registerItemVariants( item, registryName ); - } - } - } - } - - @Override - public void registerModel() - { - ItemMeshDefinition meshDefinition = null; - - // Register a custom item model handler if the item wants one - if( item instanceof AEBaseItem ) - { - AEBaseItem baseItem = (AEBaseItem) item; - meshDefinition = baseItem.getItemMeshDefinition(); - } - - if( meshDefinition != null ) - { - Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, meshDefinition ); - } - else - { - Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, 0, new ModelResourceLocation( registryName, "inventory" ) ); - } - } - - @Override - public void registerStateMapper() - { - - } - - @Override - public void registerCustomModelOverride( IRegistry modelRegistry ) - { - - } -} diff --git a/src/main/java/appeng/core/features/TileDefinition.java b/src/main/java/appeng/core/features/TileDefinition.java index 23c15169e..9afa4aac8 100644 --- a/src/main/java/appeng/core/features/TileDefinition.java +++ b/src/main/java/appeng/core/features/TileDefinition.java @@ -21,10 +21,9 @@ package appeng.core.features; import javax.annotation.Nonnull; -import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.base.Preconditions; +import net.minecraft.item.ItemBlock; import net.minecraft.tileentity.TileEntity; import appeng.api.definitions.ITileDefinition; @@ -33,39 +32,18 @@ import appeng.block.AEBaseTileBlock; public final class TileDefinition extends BlockDefinition implements ITileDefinition { - private static final TileEntityTransformer TILEENTITY_TRANSFORMER = new TileEntityTransformer(); + private final Optional block; - public TileDefinition( @Nonnull final String identifier, final AEBaseTileBlock block, final ActivityState state ) + public TileDefinition( @Nonnull String registryName, AEBaseTileBlock block, ItemBlock item ) { - super( identifier, block, state ); - - Preconditions.checkNotNull( block ); - - if( state == ActivityState.Enabled ) - { - this.block = Optional.of( block ); - } - else - { - this.block = Optional.absent(); - } + super( registryName, block, item ); + this.block = Optional.fromNullable( block ); } @Override public Optional> maybeEntity() { - return this.block.transform( TILEENTITY_TRANSFORMER ); - } - - private static class TileEntityTransformer implements Function> - { - @Override - public Class apply( final AEBaseTileBlock input ) - { - final Class entity = input.getTileEntityClass(); - - return entity; - } + return this.block.transform( AEBaseTileBlock::getTileEntityClass ); } } diff --git a/src/main/java/appeng/debug/BlockChunkloader.java b/src/main/java/appeng/debug/BlockChunkloader.java index c00910ab9..71c490b75 100644 --- a/src/main/java/appeng/debug/BlockChunkloader.java +++ b/src/main/java/appeng/debug/BlockChunkloader.java @@ -19,7 +19,6 @@ package appeng.debug; -import java.util.EnumSet; import java.util.List; import net.minecraft.block.material.Material; @@ -30,7 +29,6 @@ import net.minecraftforge.common.ForgeChunkManager.Ticket; import appeng.block.AEBaseTileBlock; import appeng.core.AppEng; -import appeng.core.features.AEFeature; public class BlockChunkloader extends AEBaseTileBlock implements LoadingCallback @@ -41,7 +39,6 @@ public class BlockChunkloader extends AEBaseTileBlock implements LoadingCallback super( Material.IRON ); this.setTileEntity( TileChunkLoader.class ); ForgeChunkManager.setForcedChunkLoadingCallback( AppEng.instance(), this ); - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); } @Override diff --git a/src/main/java/appeng/debug/BlockCubeGenerator.java b/src/main/java/appeng/debug/BlockCubeGenerator.java index ec3a56ec2..e292d58eb 100644 --- a/src/main/java/appeng/debug/BlockCubeGenerator.java +++ b/src/main/java/appeng/debug/BlockCubeGenerator.java @@ -19,8 +19,6 @@ package appeng.debug; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -32,7 +30,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; public class BlockCubeGenerator extends AEBaseTileBlock @@ -42,7 +39,6 @@ public class BlockCubeGenerator extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileCubeGenerator.class ); - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); } @Override diff --git a/src/main/java/appeng/debug/BlockItemGen.java b/src/main/java/appeng/debug/BlockItemGen.java index f2f5f0d91..251032aa7 100644 --- a/src/main/java/appeng/debug/BlockItemGen.java +++ b/src/main/java/appeng/debug/BlockItemGen.java @@ -19,12 +19,9 @@ package appeng.debug; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; public class BlockItemGen extends AEBaseTileBlock @@ -34,7 +31,6 @@ public class BlockItemGen extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TileItemGen.class ); - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); } } diff --git a/src/main/java/appeng/debug/BlockPhantomNode.java b/src/main/java/appeng/debug/BlockPhantomNode.java index 1f3fe5736..a60dc6419 100644 --- a/src/main/java/appeng/debug/BlockPhantomNode.java +++ b/src/main/java/appeng/debug/BlockPhantomNode.java @@ -19,8 +19,6 @@ package appeng.debug; -import java.util.EnumSet; - import javax.annotation.Nullable; import net.minecraft.block.material.Material; @@ -32,7 +30,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.block.AEBaseTileBlock; -import appeng.core.features.AEFeature; public class BlockPhantomNode extends AEBaseTileBlock @@ -42,7 +39,6 @@ public class BlockPhantomNode extends AEBaseTileBlock { super( Material.IRON ); this.setTileEntity( TilePhantomNode.class ); - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); } @Override diff --git a/src/main/java/appeng/debug/ToolDebugCard.java b/src/main/java/appeng/debug/ToolDebugCard.java index 7dc48fa56..ebcae52bf 100644 --- a/src/main/java/appeng/debug/ToolDebugCard.java +++ b/src/main/java/appeng/debug/ToolDebugCard.java @@ -19,7 +19,6 @@ package appeng.debug; -import java.util.EnumSet; import java.util.HashSet; import java.util.Set; @@ -45,7 +44,6 @@ import appeng.api.networking.ticking.ITickManager; import appeng.api.parts.IPart; import appeng.api.parts.IPartHost; import appeng.api.util.AEPartLocation; -import appeng.core.features.AEFeature; import appeng.hooks.TickHandler; import appeng.items.AEBaseItem; import appeng.me.Grid; @@ -58,11 +56,6 @@ import appeng.util.Platform; public class ToolDebugCard extends AEBaseItem { - public ToolDebugCard() - { - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); - } - @Override public EnumActionResult onItemUseFirst( final ItemStack heldItem, final EntityPlayer player, final World world, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final EnumHand hand ) { diff --git a/src/main/java/appeng/debug/ToolEraser.java b/src/main/java/appeng/debug/ToolEraser.java index 048db3ebe..51f48ec19 100644 --- a/src/main/java/appeng/debug/ToolEraser.java +++ b/src/main/java/appeng/debug/ToolEraser.java @@ -19,7 +19,6 @@ package appeng.debug; -import java.util.EnumSet; import java.util.LinkedList; import java.util.List; @@ -33,7 +32,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.core.AELog; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.util.Platform; @@ -43,11 +41,6 @@ public class ToolEraser extends AEBaseItem private static final int BLOCK_ERASE_LIMIT = 90000; - public ToolEraser() - { - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); - } - @Override public EnumActionResult onItemUseFirst( final ItemStack heldItem, final EntityPlayer player, final World world, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final EnumHand hand ) { diff --git a/src/main/java/appeng/debug/ToolMeteoritePlacer.java b/src/main/java/appeng/debug/ToolMeteoritePlacer.java index 4cc6f40b0..2422c213b 100644 --- a/src/main/java/appeng/debug/ToolMeteoritePlacer.java +++ b/src/main/java/appeng/debug/ToolMeteoritePlacer.java @@ -19,8 +19,6 @@ package appeng.debug; -import java.util.EnumSet; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; @@ -30,7 +28,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.util.Platform; import appeng.worldgen.MeteoritePlacer; @@ -39,11 +36,6 @@ import appeng.worldgen.meteorite.StandardWorld; public class ToolMeteoritePlacer extends AEBaseItem { - public ToolMeteoritePlacer() - { - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); - } - @Override public EnumActionResult onItemUseFirst( final ItemStack heldItem, final EntityPlayer player, final World world, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final EnumHand hand ) { diff --git a/src/main/java/appeng/debug/ToolReplicatorCard.java b/src/main/java/appeng/debug/ToolReplicatorCard.java index b2c0f578b..1144c9fe0 100644 --- a/src/main/java/appeng/debug/ToolReplicatorCard.java +++ b/src/main/java/appeng/debug/ToolReplicatorCard.java @@ -19,8 +19,6 @@ package appeng.debug; -import java.util.EnumSet; - import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.command.ICommandSender; @@ -42,18 +40,12 @@ import appeng.api.networking.IGridNode; import appeng.api.networking.spatial.ISpatialCache; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.util.Platform; public class ToolReplicatorCard extends AEBaseItem { - public ToolReplicatorCard() - { - this.setFeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); - } - @Override public EnumActionResult onItemUseFirst( final ItemStack heldItem, final EntityPlayer player, final World world, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final EnumHand hand ) { diff --git a/src/main/java/appeng/decorative/solid/BlockChargedQuartzOre.java b/src/main/java/appeng/decorative/solid/BlockChargedQuartzOre.java index 852fbb868..104f2b939 100644 --- a/src/main/java/appeng/decorative/solid/BlockChargedQuartzOre.java +++ b/src/main/java/appeng/decorative/solid/BlockChargedQuartzOre.java @@ -27,6 +27,8 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; import appeng.api.exceptions.MissingDefinition; @@ -67,6 +69,7 @@ public final class BlockChargedQuartzOre extends BlockQuartzOre } @Override + @SideOnly( Side.CLIENT) public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r ) { if( !AEConfig.instance.enableEffects ) diff --git a/src/main/java/appeng/decorative/solid/BlockChiseledQuartz.java b/src/main/java/appeng/decorative/solid/BlockChiseledQuartz.java index 87dd5d08a..23860df01 100644 --- a/src/main/java/appeng/decorative/solid/BlockChiseledQuartz.java +++ b/src/main/java/appeng/decorative/solid/BlockChiseledQuartz.java @@ -19,12 +19,9 @@ package appeng.decorative.solid; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import appeng.block.AEDecorativeBlock; -import appeng.core.features.AEFeature; public final class BlockChiseledQuartz extends AEDecorativeBlock @@ -32,7 +29,5 @@ public final class BlockChiseledQuartz extends AEDecorativeBlock public BlockChiseledQuartz() { super( Material.ROCK ); - - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); } } diff --git a/src/main/java/appeng/decorative/solid/BlockFluix.java b/src/main/java/appeng/decorative/solid/BlockFluix.java index ada311fa7..bf063ed0c 100644 --- a/src/main/java/appeng/decorative/solid/BlockFluix.java +++ b/src/main/java/appeng/decorative/solid/BlockFluix.java @@ -19,12 +19,9 @@ package appeng.decorative.solid; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import appeng.block.AEDecorativeBlock; -import appeng.core.features.AEFeature; public final class BlockFluix extends AEDecorativeBlock @@ -32,7 +29,5 @@ public final class BlockFluix extends AEDecorativeBlock public BlockFluix() { super( Material.ROCK ); - - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); } } diff --git a/src/main/java/appeng/decorative/solid/BlockQuartz.java b/src/main/java/appeng/decorative/solid/BlockQuartz.java index 51c3ff556..aab29e92d 100644 --- a/src/main/java/appeng/decorative/solid/BlockQuartz.java +++ b/src/main/java/appeng/decorative/solid/BlockQuartz.java @@ -19,12 +19,9 @@ package appeng.decorative.solid; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import appeng.block.AEDecorativeBlock; -import appeng.core.features.AEFeature; public final class BlockQuartz extends AEDecorativeBlock @@ -32,7 +29,5 @@ public final class BlockQuartz extends AEDecorativeBlock public BlockQuartz() { super( Material.ROCK ); - - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); } } diff --git a/src/main/java/appeng/decorative/solid/BlockQuartzGlass.java b/src/main/java/appeng/decorative/solid/BlockQuartzGlass.java index bb3a47290..63c187bf2 100644 --- a/src/main/java/appeng/decorative/solid/BlockQuartzGlass.java +++ b/src/main/java/appeng/decorative/solid/BlockQuartzGlass.java @@ -19,8 +19,6 @@ package appeng.decorative.solid; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; @@ -31,7 +29,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; public class BlockQuartzGlass extends AEBaseBlock @@ -49,7 +46,6 @@ public class BlockQuartzGlass extends AEBaseBlock super( Material.GLASS ); this.setLightOpacity( 0 ); this.setOpaque( false ); - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); } @Override diff --git a/src/main/java/appeng/decorative/solid/BlockQuartzLamp.java b/src/main/java/appeng/decorative/solid/BlockQuartzLamp.java index 96f6afc7a..3daa1dee1 100644 --- a/src/main/java/appeng/decorative/solid/BlockQuartzLamp.java +++ b/src/main/java/appeng/decorative/solid/BlockQuartzLamp.java @@ -19,18 +19,18 @@ package appeng.decorative.solid; -import java.util.EnumSet; import java.util.Random; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.client.render.effects.VibrantFX; import appeng.core.AEConfig; import appeng.core.CommonHelper; -import appeng.core.features.AEFeature; public class BlockQuartzLamp extends BlockQuartzGlass @@ -39,10 +39,10 @@ public class BlockQuartzLamp extends BlockQuartzGlass public BlockQuartzLamp() { this.setLightLevel( 1.0f ); - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks, AEFeature.DecorativeLights ) ); } @Override + @SideOnly( Side.CLIENT ) public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r ) { if( !AEConfig.instance.enableEffects ) diff --git a/src/main/java/appeng/decorative/solid/BlockQuartzOre.java b/src/main/java/appeng/decorative/solid/BlockQuartzOre.java index 43ea169d4..5484af4c7 100644 --- a/src/main/java/appeng/decorative/solid/BlockQuartzOre.java +++ b/src/main/java/appeng/decorative/solid/BlockQuartzOre.java @@ -19,7 +19,6 @@ package appeng.decorative.solid; -import java.util.EnumSet; import java.util.Random; import net.minecraft.block.material.Material; @@ -31,12 +30,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; import appeng.api.AEApi; import appeng.api.exceptions.MissingDefinition; import appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; public class BlockQuartzOre extends AEBaseBlock @@ -53,7 +50,6 @@ public class BlockQuartzOre extends AEBaseBlock this.boostBrightnessLow = 0; this.boostBrightnessHigh = 1; this.enhanceBrightness = false; - this.setFeature( EnumSet.of( AEFeature.Core ) ); } @Override @@ -62,12 +58,6 @@ public class BlockQuartzOre extends AEBaseBlock return BlockRenderLayer.CUTOUT; } - @Override - public void postInit() - { - OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( this ) ); - } - @Override public int getLightValue( final IBlockState state, final IBlockAccess worldIn, final BlockPos pos ) { diff --git a/src/main/java/appeng/decorative/solid/BlockQuartzPillar.java b/src/main/java/appeng/decorative/solid/BlockQuartzPillar.java index 14151269e..4cd509d5b 100644 --- a/src/main/java/appeng/decorative/solid/BlockQuartzPillar.java +++ b/src/main/java/appeng/decorative/solid/BlockQuartzPillar.java @@ -19,8 +19,6 @@ package appeng.decorative.solid; -import java.util.EnumSet; - import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; @@ -32,10 +30,8 @@ import net.minecraft.world.IBlockAccess; import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; import appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; import appeng.helpers.MetaRotation; - public class BlockQuartzPillar extends AEBaseBlock implements IOrientableBlock { public static final PropertyEnum AXIS_ORIENTATION = PropertyEnum.create( "axis", EnumFacing.Axis.class ); @@ -43,7 +39,8 @@ public class BlockQuartzPillar extends AEBaseBlock implements IOrientableBlock public BlockQuartzPillar() { super( Material.ROCK ); - this.setFeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); + // The upwards facing pillar is the default (i.e. for the item model) + setDefaultState( getDefaultState().withProperty( AXIS_ORIENTATION, EnumFacing.Axis.Y ) ); } @Override diff --git a/src/main/java/appeng/decorative/solid/BlockSkyStone.java b/src/main/java/appeng/decorative/solid/BlockSkyStone.java index 1662a7e7e..b28ca010e 100644 --- a/src/main/java/appeng/decorative/solid/BlockSkyStone.java +++ b/src/main/java/appeng/decorative/solid/BlockSkyStone.java @@ -19,10 +19,6 @@ package appeng.decorative.solid; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.EntityEquipmentSlot; @@ -34,7 +30,6 @@ import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; import appeng.core.worlddata.WorldData; import appeng.util.Platform; @@ -48,7 +43,7 @@ public class BlockSkyStone extends AEBaseBlock public BlockSkyStone( final SkystoneType type ) { - super( Material.ROCK, Optional.of( type.name() ) ); + super( Material.ROCK ); this.setHardness( 50 ); this.setHasSubtypes( true ); this.blockResistance = BLOCK_RESISTANCE; @@ -56,7 +51,6 @@ public class BlockSkyStone extends AEBaseBlock { this.setHarvestLevel( "pickaxe", 3 ); } - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.type = type; diff --git a/src/main/java/appeng/decorative/stair/BlockStairCommon.java b/src/main/java/appeng/decorative/stair/BlockStairCommon.java index a2f596ca7..976424662 100644 --- a/src/main/java/appeng/decorative/stair/BlockStairCommon.java +++ b/src/main/java/appeng/decorative/stair/BlockStairCommon.java @@ -19,18 +19,15 @@ package appeng.decorative.stair; -import java.util.EnumSet; - import net.minecraft.block.Block; import appeng.block.AEBaseStairBlock; -import appeng.core.features.AEFeature; public class BlockStairCommon extends AEBaseStairBlock { public BlockStairCommon( final Block block, final String type ) { - super( block, EnumSet.of( AEFeature.DecorativeQuartzBlocks ), type ); + super( block, type ); } } diff --git a/src/main/java/appeng/items/AEBaseItem.java b/src/main/java/appeng/items/AEBaseItem.java index d2996cd37..bfafa5ec5 100644 --- a/src/main/java/appeng/items/AEBaseItem.java +++ b/src/main/java/appeng/items/AEBaseItem.java @@ -19,67 +19,27 @@ package appeng.items; -import java.util.EnumSet; import java.util.List; -import com.google.common.base.Optional; -import com.google.common.collect.Lists; - -import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import appeng.core.features.AEFeature; -import appeng.core.features.FeatureNameExtractor; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; -public abstract class AEBaseItem extends Item implements IAEFeature +public abstract class AEBaseItem extends Item { - private final String fullName; - private final Optional subName; - private IFeatureHandler feature; public AEBaseItem() { - this( Optional.absent() ); this.setNoRepair(); } - public AEBaseItem( final Optional subName ) - { - this.subName = subName; - this.fullName = new FeatureNameExtractor( this.getClass(), subName ).get(); - } - @Override public String toString() { - return this.fullName; - } - - @Override - public IFeatureHandler handler() - { - return this.feature; - } - - @Override - public void postInit() - { - // override! - } - - public void setFeature( final EnumSet f ) - { - this.feature = new ItemFeatureHandler( f, this, this, this.subName ); + String regName = getRegistryName() != null ? getRegistryName().getResourcePath() : "unregistered"; + return getClass().getSimpleName() + "[" + regName + "]"; } @Override @@ -112,22 +72,4 @@ public abstract class AEBaseItem extends Item implements IAEFeature super.getSubItems( sameItem, creativeTab, itemStacks ); } - /** - * During registration of the item in the registry, this method is used to determine which models need to be registered for the item to be - * rendered. If your item subclass requires more than just the default, override this method and add them to the list, or replace it entirely. - */ - @SideOnly( Side.CLIENT ) - public List getItemVariants() { - return Lists.newArrayList( getRegistryName() ); - } - - /** - * If this item requires special logic to select the model for rendering, this method can be overriden to return that selection logic. - * Return null to use the standard logic. - */ - @SideOnly( Side.CLIENT ) - public ItemMeshDefinition getItemMeshDefinition() { - return null; - } - } diff --git a/src/main/java/appeng/items/materials/ItemMultiItem.java b/src/main/java/appeng/items/materials/ItemMultiItem.java index 180f5317c..c01b97cf6 100644 --- a/src/main/java/appeng/items/materials/ItemMultiItem.java +++ b/src/main/java/appeng/items/materials/ItemMultiItem.java @@ -22,7 +22,6 @@ package appeng.items.materials; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.EnumSet; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -30,12 +29,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; -import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; @@ -48,12 +45,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.oredict.OreDictionary; import appeng.api.config.Upgrades; @@ -79,11 +73,10 @@ public final class ItemMultiItem extends AEBaseItem implements IStorageComponent private static final int KILO_SCALAR = 1024; - private final Map dmgToMaterial = new HashMap(); + private final Map dmgToMaterial = new HashMap<>(); public ItemMultiItem() { - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.setHasSubtypes( true ); instance = this; } @@ -446,22 +439,4 @@ public final class ItemMultiItem extends AEBaseItem implements IStorageComponent } } - @Override - @SideOnly( Side.CLIENT ) - public List getItemVariants() - { - // Register a resource location for every material type - return Arrays.stream( MaterialType.values() ) - .map( MaterialType::getModel ) - .collect( Collectors.toList() ); - - } - - @Override - @SideOnly( Side.CLIENT ) - public ItemMeshDefinition getItemMeshDefinition() - { - return is -> getTypeByStack( is ).getModel(); - } - } diff --git a/src/main/java/appeng/items/materials/MaterialType.java b/src/main/java/appeng/items/materials/MaterialType.java index c5119e078..7ffdca8c0 100644 --- a/src/main/java/appeng/items/materials/MaterialType.java +++ b/src/main/java/appeng/items/materials/MaterialType.java @@ -25,6 +25,7 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.EntityRegistry; import appeng.core.AppEng; @@ -37,86 +38,86 @@ import appeng.entity.EntitySingularity; public enum MaterialType { - InvalidType( -1, AEFeature.Core ), + InvalidType( -1, "material_invalid_type", AEFeature.Core ), - CertusQuartzCrystal( 0, AEFeature.Core, "crystalCertusQuartz" ), - CertusQuartzCrystalCharged( 1, AEFeature.Core, EntityChargedQuartz.class ), + CertusQuartzCrystal( 0, "material_certus_quartz_crystal", AEFeature.Core, "crystalCertusQuartz" ), + CertusQuartzCrystalCharged( 1, "material_certus_quartz_crystal_charged", AEFeature.Core, EntityChargedQuartz.class ), - CertusQuartzDust( 2, AEFeature.Core, "dustCertusQuartz" ), - NetherQuartzDust( 3, AEFeature.Core, "dustNetherQuartz" ), - Flour( 4, AEFeature.Flour, "dustWheat" ), - GoldDust( 51, AEFeature.Core, "dustGold" ), - IronDust( 49, AEFeature.Core, "dustIron" ), - IronNugget( 50, AEFeature.Core, "nuggetIron" ), + CertusQuartzDust( 2, "material_certus_quartz_dust", AEFeature.Core, "dustCertusQuartz" ), + NetherQuartzDust( 3, "material_nether_quartz_dust", AEFeature.Core, "dustNetherQuartz" ), + Flour( 4, "material_flour", AEFeature.Flour, "dustWheat" ), + GoldDust( 51, "material_gold_dust", AEFeature.Core, "dustGold" ), + IronDust( 49, "material_iron_dust", AEFeature.Core, "dustIron" ), + IronNugget( 50, "material_iron_nugget", AEFeature.Core, "nuggetIron" ), - Silicon( 5, AEFeature.Core, "itemSilicon" ), - MatterBall( 6 ), + Silicon( 5, "material_silicon", AEFeature.Core, "itemSilicon" ), + MatterBall( 6, "material_matter_ball" ), - FluixCrystal( 7, AEFeature.Core, "crystalFluix" ), - FluixDust( 8, AEFeature.Core, "dustFluix" ), - FluixPearl( 9, AEFeature.Core, "pearlFluix" ), + FluixCrystal( 7, "material_fluix_crystal", AEFeature.Core, "crystalFluix" ), + FluixDust( 8, "material_fluix_dust", AEFeature.Core, "dustFluix" ), + FluixPearl( 9, "material_fluix_pearl", AEFeature.Core, "pearlFluix" ), - PurifiedCertusQuartzCrystal( 10 ), - PurifiedNetherQuartzCrystal( 11 ), - PurifiedFluixCrystal( 12 ), + PurifiedCertusQuartzCrystal( 10, "material_purified_certus_quartz_crystal" ), + PurifiedNetherQuartzCrystal( 11, "material_purified_nether_quartz_crystal" ), + PurifiedFluixCrystal( 12, "material_purified_fluix_crystal" ), - CalcProcessorPress( 13 ), - EngProcessorPress( 14 ), - LogicProcessorPress( 15 ), + CalcProcessorPress( 13, "material_calc_processor_press" ), + EngProcessorPress( 14, "material_eng_processor_press" ), + LogicProcessorPress( 15, "material_logic_processor_press" ), - CalcProcessorPrint( 16 ), - EngProcessorPrint( 17 ), - LogicProcessorPrint( 18 ), + CalcProcessorPrint( 16, "material_calc_processor_print" ), + EngProcessorPrint( 17, "material_eng_processor_print" ), + LogicProcessorPrint( 18, "material_logic_processor_print" ), - SiliconPress( 19 ), - SiliconPrint( 20 ), + SiliconPress( 19, "material_silicon_press" ), + SiliconPrint( 20, "material_silicon_print" ), - NamePress( 21 ), + NamePress( 21, "material_name_press" ), - LogicProcessor( 22 ), - CalcProcessor( 23 ), - EngProcessor( 24 ), + LogicProcessor( 22, "material_logic_processor" ), + CalcProcessor( 23, "material_calc_processor" ), + EngProcessor( 24, "material_eng_processor" ), // Basic Cards - BasicCard( 25 ), - CardRedstone( 26 ), - CardCapacity( 27 ), + BasicCard( 25, "material_basic_card" ), + CardRedstone( 26, "material_card_redstone" ), + CardCapacity( 27, "material_card_capacity" ), // Adv Cards - AdvCard( 28 ), - CardFuzzy( 29 ), - CardSpeed( 30 ), - CardInverter( 31 ), + AdvCard( 28, "material_adv_card" ), + CardFuzzy( 29, "material_card_fuzzy" ), + CardSpeed( 30, "material_card_speed" ), + CardInverter( 31, "material_card_inverter" ), - Cell2SpatialPart( 32, AEFeature.SpatialIO ), - Cell16SpatialPart( 33, AEFeature.SpatialIO ), - Cell128SpatialPart( 34, AEFeature.SpatialIO ), + Cell2SpatialPart( 32, "material_cell2_spatial_part", AEFeature.SpatialIO ), + Cell16SpatialPart( 33, "material_cell16_spatial_part", AEFeature.SpatialIO ), + Cell128SpatialPart( 34, "material_cell128_spatial_part", AEFeature.SpatialIO ), - Cell1kPart( 35, AEFeature.StorageCells ), - Cell4kPart( 36, AEFeature.StorageCells ), - Cell16kPart( 37, AEFeature.StorageCells ), - Cell64kPart( 38, AEFeature.StorageCells ), - EmptyStorageCell( 39, AEFeature.StorageCells ), + Cell1kPart( 35, "material_cell1k_part", AEFeature.StorageCells ), + Cell4kPart( 36, "material_cell4k_part", AEFeature.StorageCells ), + Cell16kPart( 37, "material_cell16k_part", AEFeature.StorageCells ), + Cell64kPart( 38, "material_cell64k_part", AEFeature.StorageCells ), + EmptyStorageCell( 39, "material_empty_storage_cell", AEFeature.StorageCells ), - WoodenGear( 40, AEFeature.GrindStone, "gearWood" ), + WoodenGear( 40, "material_wooden_gear", AEFeature.GrindStone, "gearWood" ), - Wireless( 41, AEFeature.WirelessAccessTerminal ), - WirelessBooster( 42, AEFeature.WirelessAccessTerminal ), + Wireless( 41, "material_wireless", AEFeature.WirelessAccessTerminal ), + WirelessBooster( 42, "material_wireless_booster", AEFeature.WirelessAccessTerminal ), - FormationCore( 43 ), - AnnihilationCore( 44 ), + FormationCore( 43, "material_formation_core" ), + AnnihilationCore( 44, "material_annihilation_core" ), - SkyDust( 45, AEFeature.Core ), + SkyDust( 45, "material_sky_dust", AEFeature.Core ), - EnderDust( 46, AEFeature.QuantumNetworkBridge, "dustEnder,dustEnderPearl", EntitySingularity.class ), - Singularity( 47, AEFeature.QuantumNetworkBridge, EntitySingularity.class ), - QESingularity( 48, AEFeature.QuantumNetworkBridge, EntitySingularity.class ), + EnderDust( 46, "material_ender_dust", AEFeature.QuantumNetworkBridge, "dustEnder,dustEnderPearl", EntitySingularity.class ), + Singularity( 47, "material_singularity", AEFeature.QuantumNetworkBridge, EntitySingularity.class ), + QESingularity( 48, "material_qesingularity", AEFeature.QuantumNetworkBridge, EntitySingularity.class ), - BlankPattern( 52 ), - CardCrafting( 53 ); + BlankPattern( 52, "material_blank_pattern" ), + CardCrafting( 53, "material_card_crafting" ); private final EnumSet features; - private final ModelResourceLocation model = new ModelResourceLocation( "appliedenergistics2:ItemMaterial." + name() ); + private final ModelResourceLocation model; private Item itemInstance; private int damageValue; // stack! @@ -125,40 +126,37 @@ public enum MaterialType private Class droppedEntity; private boolean isRegistered = false; - MaterialType( final int metaValue ) + MaterialType( final int metaValue, String modelName ) { - this.setDamageValue( metaValue ); - this.features = EnumSet.of( AEFeature.Core ); + this( metaValue, modelName, AEFeature.Core ); } - MaterialType( final int metaValue, final AEFeature part ) + MaterialType( final int metaValue, String modelName, final AEFeature part ) { this.setDamageValue( metaValue ); this.features = EnumSet.of( part ); + this.model = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, modelName ), "inventory" ); } - MaterialType( final int metaValue, final AEFeature part, final Class c ) + MaterialType( final int metaValue, String modelName, final AEFeature part, final Class c ) { - this.features = EnumSet.of( part ); - this.setDamageValue( metaValue ); + this( metaValue, modelName, part ); this.droppedEntity = c; EntityRegistry.registerModEntity( this.droppedEntity, this.droppedEntity.getSimpleName(), EntityIds.get( this.droppedEntity ), AppEng.instance(), 16, 4, true ); } - MaterialType( final int metaValue, final AEFeature part, final String oreDictionary, final Class c ) + MaterialType( final int metaValue, String modelName, final AEFeature part, final String oreDictionary, final Class c ) { - this.features = EnumSet.of( part ); - this.setDamageValue( metaValue ); + this( metaValue, modelName, part ); this.oreName = oreDictionary; this.droppedEntity = c; EntityRegistry.registerModEntity( this.droppedEntity, this.droppedEntity.getSimpleName(), EntityIds.get( this.droppedEntity ), AppEng.instance(), 16, 4, true ); } - MaterialType( final int metaValue, final AEFeature part, final String oreDictionary ) + MaterialType( final int metaValue, String modelName, final AEFeature part, final String oreDictionary ) { - this.features = EnumSet.of( part ); - this.setDamageValue( metaValue ); + this( metaValue, modelName, part ); this.oreName = oreDictionary; } diff --git a/src/main/java/appeng/items/misc/ItemCrystalSeed.java b/src/main/java/appeng/items/misc/ItemCrystalSeed.java index 2c15110f3..2e9e04a29 100644 --- a/src/main/java/appeng/items/misc/ItemCrystalSeed.java +++ b/src/main/java/appeng/items/misc/ItemCrystalSeed.java @@ -19,34 +19,25 @@ package appeng.items.misc; -import java.util.EnumSet; import java.util.List; import javax.annotation.Nullable; -import com.google.common.collect.ImmutableList; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.EntityRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; import appeng.api.definitions.IMaterials; import appeng.api.implementations.items.IGrowableCrystal; import appeng.api.recipes.ResolverResult; import appeng.core.AppEng; -import appeng.core.features.AEFeature; import appeng.core.localization.ButtonToolTips; import appeng.entity.EntityGrowingCrystal; import appeng.entity.EntityIds; @@ -57,8 +48,8 @@ import appeng.util.Platform; public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal { - private static final int LEVEL_OFFSET = 200; - private static final int SINGLE_OFFSET = LEVEL_OFFSET * 3; + static final int LEVEL_OFFSET = 200; + static final int SINGLE_OFFSET = LEVEL_OFFSET * 3; public static final int CERTUS = 0; public static final int NETHER = SINGLE_OFFSET; @@ -68,7 +59,6 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal public ItemCrystalSeed() { this.setHasSubtypes( true ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); EntityRegistry.registerModEntity( EntityGrowingCrystal.class, EntityGrowingCrystal.class.getSimpleName(), EntityIds.get( EntityGrowingCrystal.class ), AppEng.instance(), 16, 4, true ); } @@ -94,7 +84,7 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal return itemStack; } - private static int getProgress( final ItemStack is ) + static int getProgress( final ItemStack is ) { if( is.hasTagCompound() ) { @@ -259,72 +249,4 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal itemStacks.add( newStyle( new ItemStack( this, 1, LEVEL_OFFSET * 2 + FLUIX ) ) ); } - private static final ModelResourceLocation[] MODELS_CERTUS = { - new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus2" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus3" ) - }; - private static final ModelResourceLocation[] MODELS_FLUIX = { - new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix2" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix3" ) - }; - private static final ModelResourceLocation[] MODELS_NETHER = { - new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether2" ), - new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether3" ) - }; - - @Override - @SideOnly( Side.CLIENT ) - public List getItemVariants() - { - return ImmutableList.builder().add( MODELS_CERTUS ).add( MODELS_FLUIX ).add( MODELS_NETHER ).build(); - } - - @Override - @SideOnly( Side.CLIENT ) - public ItemMeshDefinition getItemMeshDefinition() - { - return is -> { - int damage = getProgress( is ); - - // Split the damage value into crystal type and growth level - int type = damage / SINGLE_OFFSET; - int level = ( damage % SINGLE_OFFSET ) / LEVEL_OFFSET; - - // Determine which list of models to use based on the type of crystal - ModelResourceLocation[] models; - switch( type ) - { - case 0: - models = MODELS_CERTUS; - break; - case 1: - models = MODELS_NETHER; - break; - case 2: - models = MODELS_FLUIX; - break; - default: - // We use this as the fallback for broken items - models = MODELS_CERTUS; - break; - } - - // Return one of the 3 models based on the level - if( level < 0 ) - { - level = 0; - } - else if( level >= models.length ) - { - level = models.length - 1; - } - - return models[level]; - - }; - } - } diff --git a/src/main/java/appeng/items/misc/ItemCrystalSeedRendering.java b/src/main/java/appeng/items/misc/ItemCrystalSeedRendering.java new file mode 100644 index 000000000..d73ff76fc --- /dev/null +++ b/src/main/java/appeng/items/misc/ItemCrystalSeedRendering.java @@ -0,0 +1,85 @@ +package appeng.items.misc; + + +import com.google.common.collect.ImmutableList; + +import net.minecraft.client.renderer.ItemMeshDefinition; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; + + +public class ItemCrystalSeedRendering extends ItemRenderingCustomizer +{ + + private static final ModelResourceLocation[] MODELS_CERTUS = { + new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus2" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_certus3" ) + }; + private static final ModelResourceLocation[] MODELS_FLUIX = { + new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix2" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_fluix3" ) + }; + private static final ModelResourceLocation[] MODELS_NETHER = { + new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether2" ), + new ModelResourceLocation( "appliedenergistics2:crystal_seed_nether3" ) + }; + + @Override + @SideOnly( Side.CLIENT ) + public void customize( IItemRendering rendering ) + { + rendering.variants( ImmutableList.builder().add( MODELS_CERTUS ).add( MODELS_FLUIX ).add( MODELS_NETHER ).build() ); + rendering.meshDefinition( getItemMeshDefinition() ); + } + + private ItemMeshDefinition getItemMeshDefinition() + { + return is -> + { + int damage = ItemCrystalSeed.getProgress( is ); + + // Split the damage value into crystal type and growth level + int type = damage / ItemCrystalSeed.SINGLE_OFFSET; + int level = ( damage % ItemCrystalSeed.SINGLE_OFFSET ) / ItemCrystalSeed.LEVEL_OFFSET; + + // Determine which list of models to use based on the type of crystal + ModelResourceLocation[] models; + switch( type ) + { + case 0: + models = MODELS_CERTUS; + break; + case 1: + models = MODELS_NETHER; + break; + case 2: + models = MODELS_FLUIX; + break; + default: + // We use this as the fallback for broken items + models = MODELS_CERTUS; + break; + } + + // Return one of the 3 models based on the level + if( level < 0 ) + { + level = 0; + } + else if( level >= models.length ) + { + level = models.length - 1; + } + + return models[level]; + }; + } +} diff --git a/src/main/java/appeng/items/misc/ItemEncodedPattern.java b/src/main/java/appeng/items/misc/ItemEncodedPattern.java index 2b269aefc..bb0e3a4b5 100644 --- a/src/main/java/appeng/items/misc/ItemEncodedPattern.java +++ b/src/main/java/appeng/items/misc/ItemEncodedPattern.java @@ -19,14 +19,10 @@ package appeng.items.misc; -import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.WeakHashMap; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; @@ -37,16 +33,12 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.AEApi; import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.data.IAEItemStack; -import appeng.client.ClientHelper; import appeng.core.CommonHelper; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.helpers.PatternHelper; import appeng.items.AEBaseItem; @@ -60,7 +52,6 @@ public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternIt public ItemEncodedPattern() { - this.setFeature( EnumSet.of( AEFeature.Patterns ) ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/misc/ItemPaintBall.java b/src/main/java/appeng/items/misc/ItemPaintBall.java index 4f0fffbc2..6e0d5c487 100644 --- a/src/main/java/appeng/items/misc/ItemPaintBall.java +++ b/src/main/java/appeng/items/misc/ItemPaintBall.java @@ -19,22 +19,13 @@ package appeng.items.misc; -import java.util.EnumSet; import java.util.List; -import com.google.common.collect.ImmutableList; - -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.AEColor; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; @@ -46,7 +37,6 @@ public class ItemPaintBall extends AEBaseItem public ItemPaintBall() { - this.setFeature( EnumSet.of( AEFeature.PaintBalls ) ); this.setHasSubtypes( true ); } @@ -97,49 +87,10 @@ public class ItemPaintBall extends AEBaseItem } } - public boolean isLumen( final ItemStack is ) + public static boolean isLumen( final ItemStack is ) { final int dmg = is.getItemDamage(); return dmg >= DAMAGE_THRESHOLD; } - public static int getColorFromItemstack( ItemStack stack, int tintIndex ) - { - final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); - - final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; - final int r = ( colorValue >> 16 ) & 0xff; - final int g = ( colorValue >> 8 ) & 0xff; - final int b = ( colorValue ) & 0xff; - - if( stack.getItemDamage() >= 20 ) - { - final float fail = 0.7f; - final int full = (int) ( 255 * 0.3 ); - return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; - } - else - { - return r << 16 | g << 8 | b | 0xff << 24; - } - } - - private static final ModelResourceLocation MODEL_NORMAL = new ModelResourceLocation( "appliedenergistics2:ItemPaintBall" ); - private static final ModelResourceLocation MODEL_SHIMMER = new ModelResourceLocation( "appliedenergistics2:ItemPaintBallShimmer" ); - - @Override - public List getItemVariants() - { - return ImmutableList.of( - MODEL_NORMAL, - MODEL_SHIMMER - ); - } - - @Override - @SideOnly( Side.CLIENT ) - public ItemMeshDefinition getItemMeshDefinition() - { - return is -> isLumen( is ) ? MODEL_SHIMMER : MODEL_NORMAL; - } } diff --git a/src/main/java/appeng/items/misc/ItemPaintBallRendering.java b/src/main/java/appeng/items/misc/ItemPaintBallRendering.java new file mode 100644 index 000000000..59a5e37a1 --- /dev/null +++ b/src/main/java/appeng/items/misc/ItemPaintBallRendering.java @@ -0,0 +1,46 @@ +package appeng.items.misc; + + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; + +import appeng.api.util.AEColor; +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; + + +public class ItemPaintBallRendering extends ItemRenderingCustomizer +{ + + private static final ModelResourceLocation MODEL_NORMAL = new ModelResourceLocation( "appliedenergistics2:paint_ball" ); + private static final ModelResourceLocation MODEL_SHIMMER = new ModelResourceLocation( "appliedenergistics2:paint_ball_shimmer" ); + + @Override + public void customize( IItemRendering rendering ) + { + rendering.color( ItemPaintBallRendering::getColorFromItemstack ); + rendering.variants( MODEL_NORMAL, MODEL_SHIMMER ); + rendering.meshDefinition( is -> ItemPaintBall.isLumen( is ) ? MODEL_SHIMMER : MODEL_NORMAL ); + } + + private static int getColorFromItemstack( ItemStack stack, int tintIndex ) + { + final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); + + final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; + final int r = ( colorValue >> 16 ) & 0xff; + final int g = ( colorValue >> 8 ) & 0xff; + final int b = ( colorValue ) & 0xff; + + if( stack.getItemDamage() >= 20 ) + { + final float fail = 0.7f; + final int full = (int) ( 255 * 0.3 ); + return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; + } + else + { + return r << 16 | g << 8 | b | 0xff << 24; + } + } +} diff --git a/src/main/java/appeng/items/parts/ItemFacade.java b/src/main/java/appeng/items/parts/ItemFacade.java index 9ca044895..ee0d372b7 100644 --- a/src/main/java/appeng/items/parts/ItemFacade.java +++ b/src/main/java/appeng/items/parts/ItemFacade.java @@ -20,7 +20,6 @@ package appeng.items.parts; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; import net.minecraft.block.Block; @@ -47,7 +46,6 @@ import appeng.api.exceptions.MissingDefinition; import appeng.api.parts.IAlphaPassItem; import appeng.api.util.AEPartLocation; import appeng.core.FacadeConfig; -import appeng.core.features.AEFeature; import appeng.facade.FacadePart; import appeng.facade.IFacadeItem; import appeng.items.AEBaseItem; @@ -60,7 +58,6 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte public ItemFacade() { - this.setFeature( EnumSet.of( AEFeature.Facades ) ); this.setHasSubtypes( true ); } diff --git a/src/main/java/appeng/items/parts/ItemMultiPart.java b/src/main/java/appeng/items/parts/ItemMultiPart.java index c210af3ac..ef74cefc5 100644 --- a/src/main/java/appeng/items/parts/ItemMultiPart.java +++ b/src/main/java/appeng/items/parts/ItemMultiPart.java @@ -23,20 +23,16 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; - import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.google.common.base.Preconditions; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -75,20 +71,13 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG { Preconditions.checkNotNull( partHelper ); - this.registered = new HashMap( INITIAL_REGISTERED_CAPACITY ); + this.registered = new HashMap<>( INITIAL_REGISTERED_CAPACITY ); - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.setHasSubtypes( true ); instance = this; } - @Override - public ItemMeshDefinition getItemMeshDefinition() - { - return itemstack -> new ModelResourceLocation( getTypeByStack( itemstack ).getModel(), null ); - } - @Nonnull public final ItemStackSrc createPart( final PartType mat ) { diff --git a/src/main/java/appeng/items/parts/ItemMultipartRendering.java b/src/main/java/appeng/items/parts/ItemMultipartRendering.java new file mode 100644 index 000000000..871a00539 --- /dev/null +++ b/src/main/java/appeng/items/parts/ItemMultipartRendering.java @@ -0,0 +1,33 @@ +package appeng.items.parts; + + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; + +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; + + +public class ItemMultipartRendering extends ItemRenderingCustomizer +{ + + private final ItemMultiPart item; + + public ItemMultipartRendering( ItemMultiPart item ) + { + this.item = item; + } + + @Override + public void customize( IItemRendering rendering ) + { + rendering.meshDefinition( this::getItemMeshDefinition ); + } + + private ModelResourceLocation getItemMeshDefinition( ItemStack is ) + { + // TODO: Avoid object creation here. This happens every frame + return new ModelResourceLocation( item.getTypeByStack( is ).getModel(), null ); + } + +} diff --git a/src/main/java/appeng/items/storage/ItemBasicStorageCell.java b/src/main/java/appeng/items/storage/ItemBasicStorageCell.java index 2104ff079..a9255024d 100644 --- a/src/main/java/appeng/items/storage/ItemBasicStorageCell.java +++ b/src/main/java/appeng/items/storage/ItemBasicStorageCell.java @@ -19,12 +19,9 @@ package appeng.items.storage; -import java.util.EnumSet; import java.util.List; import java.util.Set; -import com.google.common.base.Optional; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; @@ -69,9 +66,6 @@ public final class ItemBasicStorageCell extends AEBaseItem implements IStorageCe public ItemBasicStorageCell( final MaterialType whichCell, final int kilobytes ) { - super( Optional.of( kilobytes + "k" ) ); - - this.setFeature( EnumSet.of( AEFeature.StorageCells ) ); this.setMaxStackSize( 1 ); this.totalBytes = kilobytes * 1024; this.component = whichCell; diff --git a/src/main/java/appeng/items/storage/ItemCreativeStorageCell.java b/src/main/java/appeng/items/storage/ItemCreativeStorageCell.java index f33bf41fe..65094a0e7 100644 --- a/src/main/java/appeng/items/storage/ItemCreativeStorageCell.java +++ b/src/main/java/appeng/items/storage/ItemCreativeStorageCell.java @@ -19,14 +19,11 @@ package appeng.items.storage; -import java.util.EnumSet; - import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import appeng.api.config.FuzzyMode; import appeng.api.storage.ICellWorkbenchItem; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.items.contents.CellConfig; @@ -36,7 +33,6 @@ public class ItemCreativeStorageCell extends AEBaseItem implements ICellWorkbenc public ItemCreativeStorageCell() { - this.setFeature( EnumSet.of( AEFeature.StorageCells, AEFeature.Creative ) ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java b/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java index 92359c5a3..f85e07ef7 100644 --- a/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java +++ b/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java @@ -19,11 +19,8 @@ package appeng.items.storage; -import java.util.EnumSet; import java.util.List; -import com.google.common.base.Optional; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -33,7 +30,6 @@ import net.minecraftforge.common.DimensionManager; import appeng.api.implementations.TransitionResult; import appeng.api.implementations.items.ISpatialStorageCell; import appeng.api.util.WorldCoord; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.core.worlddata.WorldData; import appeng.items.AEBaseItem; @@ -48,8 +44,6 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag public ItemSpatialStorageCell( final int spatialScale ) { - super( Optional.of( spatialScale + "Cubed" ) ); - this.setFeature( EnumSet.of( AEFeature.SpatialIO ) ); this.setMaxStackSize( 1 ); this.maxRegion = spatialScale; } diff --git a/src/main/java/appeng/items/storage/ItemViewCell.java b/src/main/java/appeng/items/storage/ItemViewCell.java index c69aee33c..27d3383df 100644 --- a/src/main/java/appeng/items/storage/ItemViewCell.java +++ b/src/main/java/appeng/items/storage/ItemViewCell.java @@ -19,8 +19,6 @@ package appeng.items.storage; -import java.util.EnumSet; - import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -31,7 +29,6 @@ import appeng.api.implementations.items.IUpgradeModule; import appeng.api.storage.ICellWorkbenchItem; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.items.contents.CellConfig; import appeng.items.contents.CellUpgrades; @@ -47,7 +44,6 @@ public class ItemViewCell extends AEBaseItem implements ICellWorkbenchItem { public ItemViewCell() { - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/tools/ToolBiometricCard.java b/src/main/java/appeng/items/tools/ToolBiometricCard.java index 707eb4368..7cabc6021 100644 --- a/src/main/java/appeng/items/tools/ToolBiometricCard.java +++ b/src/main/java/appeng/items/tools/ToolBiometricCard.java @@ -38,7 +38,6 @@ import appeng.api.config.SecurityPermissions; import appeng.api.features.IPlayerRegistry; import appeng.api.implementations.items.IBiometricCard; import appeng.api.networking.security.ISecurityRegistry; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; import appeng.util.Platform; @@ -48,7 +47,6 @@ public class ToolBiometricCard extends AEBaseItem implements IBiometricCard { public ToolBiometricCard() { - this.setFeature( EnumSet.of( AEFeature.Security ) ); this.setMaxStackSize( 1 ); if( Platform.isClient() ) diff --git a/src/main/java/appeng/items/tools/ToolMemoryCard.java b/src/main/java/appeng/items/tools/ToolMemoryCard.java index a1cc5cca6..9b1c6397f 100644 --- a/src/main/java/appeng/items/tools/ToolMemoryCard.java +++ b/src/main/java/appeng/items/tools/ToolMemoryCard.java @@ -19,7 +19,6 @@ package appeng.items.tools; -import java.util.EnumSet; import java.util.List; import net.minecraft.entity.player.EntityPlayer; @@ -35,7 +34,6 @@ import net.minecraft.world.World; import appeng.api.implementations.items.IMemoryCard; import appeng.api.implementations.items.MemoryCardMessages; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; import appeng.items.AEBaseItem; @@ -46,7 +44,6 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard { public ToolMemoryCard() { - this.setFeature( EnumSet.of( AEFeature.Core ) ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/tools/ToolNetworkTool.java b/src/main/java/appeng/items/tools/ToolNetworkTool.java index 30fb23b0a..53a705f6d 100644 --- a/src/main/java/appeng/items/tools/ToolNetworkTool.java +++ b/src/main/java/appeng/items/tools/ToolNetworkTool.java @@ -19,10 +19,6 @@ package appeng.items.tools; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -48,7 +44,6 @@ import appeng.api.util.DimensionalCoord; import appeng.api.util.INetworkToolAgent; import appeng.client.ClientHelper; import appeng.container.AEBaseContainer; -import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketClick; @@ -64,9 +59,6 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench / public ToolNetworkTool() { - super( Optional.absent() ); - - this.setFeature( EnumSet.of( AEFeature.NetworkTool ) ); this.setMaxStackSize( 1 ); this.setHarvestLevel( "wrench", 0 ); } diff --git a/src/main/java/appeng/items/tools/powered/ToolChargedStaff.java b/src/main/java/appeng/items/tools/powered/ToolChargedStaff.java index 404c5acfa..6058dd0af 100644 --- a/src/main/java/appeng/items/tools/powered/ToolChargedStaff.java +++ b/src/main/java/appeng/items/tools/powered/ToolChargedStaff.java @@ -19,17 +19,12 @@ package appeng.items.tools.powered; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.core.sync.packets.PacketLightning; import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.server.ServerHelper; @@ -41,8 +36,7 @@ public class ToolChargedStaff extends AEBasePoweredItem public ToolChargedStaff() { - super( AEConfig.instance.chargedStaffBattery, Optional.absent() ); - this.setFeature( EnumSet.of( AEFeature.ChargedStaff, AEFeature.PoweredTools ) ); + super( AEConfig.instance.chargedStaffBattery ); } @Override diff --git a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java index 82fab0495..3a55c3533 100644 --- a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java +++ b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java @@ -21,15 +21,12 @@ package appeng.items.tools.powered; import java.util.Collections; import java.util.Comparator; -import java.util.EnumSet; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.block.BlockColored; import net.minecraft.block.BlockDispenser; @@ -67,7 +64,6 @@ import appeng.api.util.DimensionalCoord; import appeng.block.misc.BlockPaint; import appeng.block.networking.BlockCableBus; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.helpers.IMouseWheelItem; import appeng.hooks.DispenserBlockTool; @@ -104,8 +100,7 @@ public class ToolColorApplicator extends AEBasePoweredItem implements IStorageCe public ToolColorApplicator() { - super( AEConfig.instance.colorApplicatorBattery, Optional.absent() ); - this.setFeature( EnumSet.of( AEFeature.ColorApplicator, AEFeature.PoweredTools ) ); + super( AEConfig.instance.colorApplicatorBattery ); if( Platform.isClient() ) { // TODO - color applicator @@ -113,10 +108,9 @@ public class ToolColorApplicator extends AEBasePoweredItem implements IStorageCe } } - @Override public void postInit() { - super.postInit(); + // TODO BOOTSTRAP BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserBlockTool() ); } diff --git a/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java b/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java index ae594a8e5..1c3964673 100644 --- a/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java +++ b/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java @@ -20,13 +20,10 @@ package appeng.items.tools.powered; import java.util.ArrayList; -import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockTNT; @@ -52,7 +49,6 @@ import net.minecraft.world.World; import appeng.api.util.DimensionalCoord; import appeng.block.misc.BlockTinyTNT; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.hooks.DispenserBlockTool; import appeng.hooks.IBlockTool; import appeng.items.tools.powered.powersink.AEBasePoweredItem; @@ -67,9 +63,7 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT public ToolEntropyManipulator() { - super( AEConfig.instance.entropyManipulatorBattery, Optional.absent() ); - - this.setFeature( EnumSet.of( AEFeature.EntropyManipulator, AEFeature.PoweredTools ) ); + super( AEConfig.instance.entropyManipulatorBattery ); this.heatUp = new HashMap(); this.coolDown = new HashMap(); @@ -91,10 +85,9 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT this.heatUp.put( new InWorldToolOperationIngredient( Blocks.SNOW, true ), new InWorldToolOperationResult( new ItemStack( Blocks.FLOWING_WATER ) ) ); } - @Override public void postInit() { - super.postInit(); + // TODO BOOTSTRAP BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserBlockTool() ); } diff --git a/src/main/java/appeng/items/tools/powered/ToolMassCannon.java b/src/main/java/appeng/items/tools/powered/ToolMassCannon.java index 5a77964c0..17bf1c116 100644 --- a/src/main/java/appeng/items/tools/powered/ToolMassCannon.java +++ b/src/main/java/appeng/items/tools/powered/ToolMassCannon.java @@ -19,13 +19,9 @@ package appeng.items.tools.powered; -import java.util.EnumSet; import java.util.List; - import javax.annotation.Nullable; -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.block.BlockDispenser; import net.minecraft.block.state.IBlockState; @@ -89,14 +85,12 @@ public class ToolMassCannon extends AEBasePoweredItem implements IStorageCell public ToolMassCannon() { - super( AEConfig.instance.matterCannonBattery, Optional.absent() ); - this.setFeature( EnumSet.of( AEFeature.MatterCannon, AEFeature.PoweredTools ) ); + super( AEConfig.instance.matterCannonBattery ); } - @Override public void postInit() { - super.postInit(); + // TODO BOOTSTRAP BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserMatterCannon() ); } diff --git a/src/main/java/appeng/items/tools/powered/ToolPortableCell.java b/src/main/java/appeng/items/tools/powered/ToolPortableCell.java index baf25c8d9..4ef486e8f 100644 --- a/src/main/java/appeng/items/tools/powered/ToolPortableCell.java +++ b/src/main/java/appeng/items/tools/powered/ToolPortableCell.java @@ -19,12 +19,9 @@ package appeng.items.tools.powered; -import java.util.EnumSet; import java.util.List; import java.util.Set; -import com.google.common.base.Optional; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -49,7 +46,6 @@ import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AEPartLocation; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.core.sync.GuiBridge; import appeng.items.contents.CellConfig; @@ -64,8 +60,7 @@ public class ToolPortableCell extends AEBasePoweredItem implements IStorageCell, { public ToolPortableCell() { - super( AEConfig.instance.portableCellBattery, Optional.absent() ); - this.setFeature( EnumSet.of( AEFeature.PortableCell, AEFeature.StorageCells, AEFeature.PoweredTools ) ); + super( AEConfig.instance.portableCellBattery ); } @Override diff --git a/src/main/java/appeng/items/tools/powered/ToolWirelessTerminal.java b/src/main/java/appeng/items/tools/powered/ToolWirelessTerminal.java index 9d685144f..3117196b1 100644 --- a/src/main/java/appeng/items/tools/powered/ToolWirelessTerminal.java +++ b/src/main/java/appeng/items/tools/powered/ToolWirelessTerminal.java @@ -19,11 +19,8 @@ package appeng.items.tools.powered; -import java.util.EnumSet; import java.util.List; -import com.google.common.base.Optional; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -43,7 +40,6 @@ import appeng.api.config.ViewItems; import appeng.api.features.IWirelessTermHandler; import appeng.api.util.IConfigManager; import appeng.core.AEConfig; -import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.util.ConfigManager; @@ -56,8 +52,7 @@ public class ToolWirelessTerminal extends AEBasePoweredItem implements IWireless public ToolWirelessTerminal() { - super( AEConfig.instance.wirelessTerminalBattery, Optional.absent() ); - this.setFeature( EnumSet.of( AEFeature.WirelessAccessTerminal, AEFeature.PoweredTools ) ); + super( AEConfig.instance.wirelessTerminalBattery ); } @Override diff --git a/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java b/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java index ed6700b7c..731c61c26 100644 --- a/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java +++ b/src/main/java/appeng/items/tools/powered/powersink/AEBasePoweredItem.java @@ -19,14 +19,11 @@ package appeng.items.tools.powered.powersink; -import com.google.common.base.Optional; - - public abstract class AEBasePoweredItem extends AERootPoweredItem { - public AEBasePoweredItem( final double powerCapacity, final Optional subName ) + public AEBasePoweredItem( final double powerCapacity ) { - super( powerCapacity, subName ); + super( powerCapacity ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/tools/powered/powersink/AERootPoweredItem.java b/src/main/java/appeng/items/tools/powered/powersink/AERootPoweredItem.java index a007a86ca..d8ba050d2 100644 --- a/src/main/java/appeng/items/tools/powered/powersink/AERootPoweredItem.java +++ b/src/main/java/appeng/items/tools/powered/powersink/AERootPoweredItem.java @@ -22,8 +22,6 @@ package appeng.items.tools.powered.powersink; import java.text.MessageFormat; import java.util.List; -import com.google.common.base.Optional; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -43,9 +41,8 @@ public abstract class AERootPoweredItem extends AEBaseItem implements IAEItemPow private static final String POWER_NBT_KEY = "internalCurrentPower"; private final double powerCapacity; - public AERootPoweredItem( final double powerCapacity, final Optional subName ) + public AERootPoweredItem( final double powerCapacity ) { - super( subName ); this.setMaxDamage( 32 ); this.hasSubtypes = false; this.setFull3D(); diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzAxe.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzAxe.java index 092b73aca..0438e4d23 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzAxe.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzAxe.java @@ -19,41 +19,21 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; import appeng.util.Platform; -public class ToolQuartzAxe extends ItemAxe implements IAEFeature +public class ToolQuartzAxe extends ItemAxe { private final AEFeature type; - private final IFeatureHandler feature; public ToolQuartzAxe( final AEFeature type ) { super( ToolMaterial.IRON ); - this.feature = new ItemFeatureHandler( EnumSet.of( this.type = type, AEFeature.QuartzAxe ), this, this, Optional.of( type.name() ) ); - } - - @Override - public IFeatureHandler handler() - { - return this.feature; - } - - @Override - public void postInit() - { - // override! + this.type = type; } @Override diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java index 3f153191c..2a08edaee 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java @@ -19,10 +19,6 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; @@ -48,10 +44,7 @@ public class ToolQuartzCuttingKnife extends AEBaseItem implements IGuiItem public ToolQuartzCuttingKnife( final AEFeature type ) { - super( Optional.of( type.name() ) ); - this.type = type; - this.setFeature( EnumSet.of( type, AEFeature.QuartzKnife ) ); this.setMaxDamage( 50 ); this.setMaxStackSize( 1 ); } diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzHoe.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzHoe.java index 1fd06627a..c1376824a 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzHoe.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzHoe.java @@ -19,48 +19,27 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemStack; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; import appeng.util.Platform; -public class ToolQuartzHoe extends ItemHoe implements IAEFeature +public class ToolQuartzHoe extends ItemHoe { - private final AEFeature feature; - private final IFeatureHandler handler; + private final AEFeature type; - public ToolQuartzHoe( final AEFeature feature ) + public ToolQuartzHoe( final AEFeature type ) { super( ToolMaterial.IRON ); - - this.feature = feature; - this.handler = new ItemFeatureHandler( EnumSet.of( feature, AEFeature.QuartzHoe ), this, this, Optional.of( feature.name() ) ); - } - - @Override - public IFeatureHandler handler() - { - return this.handler; - } - - @Override - public void postInit() - { - // override! + this.type = type; } @Override public boolean getIsRepairable( final ItemStack a, final ItemStack b ) { - return Platform.canRepair( this.feature, a, b ); + return Platform.canRepair( this.type, a, b ); } + } \ No newline at end of file diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzPickaxe.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzPickaxe.java index 2ee95a475..3b5bfbf6e 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzPickaxe.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzPickaxe.java @@ -19,43 +19,21 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; import appeng.util.Platform; -public class ToolQuartzPickaxe extends ItemPickaxe implements IAEFeature +public class ToolQuartzPickaxe extends ItemPickaxe { private final AEFeature type; - private final IFeatureHandler feature; public ToolQuartzPickaxe( final AEFeature type ) { super( ToolMaterial.IRON ); - this.type = type; - this.feature = new ItemFeatureHandler( EnumSet.of( type, AEFeature.QuartzPickaxe ), this, this, Optional.of( type.name() ) ); - } - - @Override - public IFeatureHandler handler() - { - return this.feature; - } - - @Override - public void postInit() - { - // override! } @Override diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzSpade.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzSpade.java index a717c0ce2..ffcb6ec18 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzSpade.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzSpade.java @@ -19,42 +19,21 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; import appeng.util.Platform; -public class ToolQuartzSpade extends ItemSpade implements IAEFeature +public class ToolQuartzSpade extends ItemSpade { private final AEFeature type; - private final IFeatureHandler handler; public ToolQuartzSpade( final AEFeature type ) { super( ToolMaterial.IRON ); - - this.handler = new ItemFeatureHandler( EnumSet.of( this.type = type, AEFeature.QuartzSpade ), this, this, Optional.of( type.name() ) ); - } - - @Override - public IFeatureHandler handler() - { - return this.handler; - } - - @Override - public void postInit() - { - // override! + this.type = type; } @Override diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzSword.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzSword.java index 6670f1005..6cd0901e6 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzSword.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzSword.java @@ -19,41 +19,21 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import appeng.core.features.AEFeature; -import appeng.core.features.IAEFeature; -import appeng.core.features.IFeatureHandler; -import appeng.core.features.ItemFeatureHandler; import appeng.util.Platform; -public class ToolQuartzSword extends ItemSword implements IAEFeature +public class ToolQuartzSword extends ItemSword { private final AEFeature type; - private final IFeatureHandler feature; - public ToolQuartzSword( final AEFeature type ) + public ToolQuartzSword( AEFeature type ) { super( ToolMaterial.IRON ); - this.feature = new ItemFeatureHandler( EnumSet.of( this.type = type, AEFeature.QuartzSword ), this, this, Optional.of( type.name() ) ); - } - - @Override - public IFeatureHandler handler() - { - return this.feature; - } - - @Override - public void postInit() - { - // override! + this.type = type; } @Override diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzWrench.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzWrench.java index 3410af29c..836522882 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzWrench.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzWrench.java @@ -19,10 +19,6 @@ package appeng.items.tools.quartz; -import java.util.EnumSet; - -import com.google.common.base.Optional; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -35,7 +31,6 @@ import net.minecraft.world.World; import appeng.api.implementations.items.IAEWrench; import appeng.api.util.DimensionalCoord; -import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; import appeng.util.Platform; @@ -45,11 +40,8 @@ import appeng.util.Platform; public class ToolQuartzWrench extends AEBaseItem implements IAEWrench /* , IToolWrench */ { - public ToolQuartzWrench( final AEFeature type ) + public ToolQuartzWrench() { - super( Optional.of( type.name() ) ); - - this.setFeature( EnumSet.of( type, AEFeature.QuartzWrench ) ); this.setMaxStackSize( 1 ); this.setHarvestLevel( "wrench", 0 ); } diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/creative_energy_cell.json b/src/main/resources/assets/appliedenergistics2/blockstates/creative_energy_cell.json index 9b9989fa1..742d65d42 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/creative_energy_cell.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/creative_energy_cell.json @@ -1,7 +1,7 @@ { "variants": { "normal": { - "model": "appliedenergistics2:EnergyCell/creative_energy_cell" + "model": "appliedenergistics2:energy_cell/creative_energy_cell" } } } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/dense_energy_cell.json b/src/main/resources/assets/appliedenergistics2/blockstates/dense_energy_cell.json index 17ad59ba2..9f2bd43cf 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/dense_energy_cell.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/dense_energy_cell.json @@ -1,28 +1,28 @@ { "variants": { "fullness=0": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell0" + "model": "appliedenergistics2:energy_cell/dense_energy_cell0" }, "fullness=1": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell1" + "model": "appliedenergistics2:energy_cell/dense_energy_cell1" }, "fullness=2": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell2" + "model": "appliedenergistics2:energy_cell/dense_energy_cell2" }, "fullness=3": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell3" + "model": "appliedenergistics2:energy_cell/dense_energy_cell3" }, "fullness=4": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell4" + "model": "appliedenergistics2:energy_cell/dense_energy_cell4" }, "fullness=5": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell5" + "model": "appliedenergistics2:energy_cell/dense_energy_cell5" }, "fullness=6": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell6" + "model": "appliedenergistics2:energy_cell/dense_energy_cell6" }, "fullness=7": { - "model": "appliedenergistics2:EnergyCell/dense_energy_cell7" + "model": "appliedenergistics2:energy_cell/dense_energy_cell7" } } } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/energy_cell.json b/src/main/resources/assets/appliedenergistics2/blockstates/energy_cell.json index 2a629ba48..27c0020aa 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/energy_cell.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/energy_cell.json @@ -1,28 +1,28 @@ { "variants": { "fullness=0": { - "model": "appliedenergistics2:EnergyCell/energy_cell0" + "model": "appliedenergistics2:energy_cell/energy_cell0" }, "fullness=1": { - "model": "appliedenergistics2:EnergyCell/energy_cell1" + "model": "appliedenergistics2:energy_cell/energy_cell1" }, "fullness=2": { - "model": "appliedenergistics2:EnergyCell/energy_cell2" + "model": "appliedenergistics2:energy_cell/energy_cell2" }, "fullness=3": { - "model": "appliedenergistics2:EnergyCell/energy_cell3" + "model": "appliedenergistics2:energy_cell/energy_cell3" }, "fullness=4": { - "model": "appliedenergistics2:EnergyCell/energy_cell4" + "model": "appliedenergistics2:energy_cell/energy_cell4" }, "fullness=5": { - "model": "appliedenergistics2:EnergyCell/energy_cell5" + "model": "appliedenergistics2:energy_cell/energy_cell5" }, "fullness=6": { - "model": "appliedenergistics2:EnergyCell/energy_cell6" + "model": "appliedenergistics2:energy_cell/energy_cell6" }, "fullness=7": { - "model": "appliedenergistics2:EnergyCell/energy_cell7" + "model": "appliedenergistics2:energy_cell/energy_cell7" } } } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/quartz_lamp.json b/src/main/resources/assets/appliedenergistics2/blockstates/quartz_lamp.json index 09fb49b26..a34ef0e1e 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/quartz_lamp.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/quartz_lamp.json @@ -1,7 +1,31 @@ { - "variants": { - "normal": { - "model": "appliedenergistics2:builtin/connected_glass" + "multipart": [ + { + "apply": [{ "model": "appliedenergistics2:quartz_glass_1" }, { "model": "appliedenergistics2:quartz_glass_2" }, { "model": "appliedenergistics2:quartz_glass_3" }, { "model": "appliedenergistics2:quartz_glass_4" }] + }, + { + "when": { "down": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame", "x": 90 } + }, + { + "when": { "up": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame", "x": -90 } + }, + { + "when": { "north": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame"} + }, + { + "when": { "south": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame", "y": 180 } + }, + { + "when": { "west": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame", "y": -90 } + }, + { + "when": { "east": "false" }, + "apply": { "model": "appliedenergistics2:quartz_glass_frame", "y": 90 } } - } -} \ No newline at end of file + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/creative_energy_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/creative_energy_cell.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/creative_energy_cell.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/creative_energy_cell.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell0.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell0.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell0.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell0.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell1.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell1.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell1.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell1.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell2.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell2.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell2.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell2.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell3.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell3.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell3.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell3.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell4.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell4.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell4.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell4.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell5.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell5.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell5.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell5.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell6.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell6.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell6.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell6.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell7.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell7.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/dense_energy_cell7.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/dense_energy_cell7.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell0.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell0.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell0.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell0.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell1.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell1.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell1.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell1.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell2.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell2.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell2.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell2.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell3.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell3.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell3.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell3.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell4.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell4.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell4.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell4.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell5.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell5.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell5.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell5.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell6.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell6.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell6.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell6.json diff --git a/src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell7.json b/src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell7.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/block/EnergyCell/energy_cell7.json rename to src/main/resources/assets/appliedenergistics2/models/block/energy_cell/energy_cell7.json diff --git a/src/main/resources/assets/appliedenergistics2/models/item/creative_energy_cell.json b/src/main/resources/assets/appliedenergistics2/models/item/creative_energy_cell.json deleted file mode 100644 index 9a55f807c..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/creative_energy_cell.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "appliedenergistics2:block/EnergyCell/creative_energy_cell" -} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/fluix.json b/src/main/resources/assets/appliedenergistics2/models/item/fluix.json deleted file mode 100644 index a7bc039eb..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/fluix.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "display": { - "thirdperson": { - "rotation": [ - 10, - -45, - 170 - ], - "scale": [ - 0.375, - 0.375, - 0.375 - ], - "translation": [ - 0, - 1.5, - -2.75 - ] - } - }, - "parent": "appliedenergistics2:fluix/block" -} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/quartz_lamp.json b/src/main/resources/assets/appliedenergistics2/models/item/quartz_lamp.json index cfe7da7de..ae7ee206b 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/quartz_lamp.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/quartz_lamp.json @@ -1,6 +1,6 @@ { "parent": "block/cube_all", "textures": { - "all": "appliedenergistics2:items/quartz_glass" + "all": "appliedenergistics2:blocks/quartz_glass" } } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/quartz_pillar.json b/src/main/resources/assets/appliedenergistics2/models/item/quartz_pillar.json deleted file mode 100644 index 9e2d5bc05..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/quartz_pillar.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "appliedenergistics2:block/quartz_pillar" -} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_block.json b/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_block.json index cd20eec8a..e08076bad 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_block.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_block.json @@ -1,107 +1,7 @@ { - "display": { - "firstperson_righthand": { - "rotation": [ - 0, - 315, - 0 - ], - "scale": [ - 0.4, - 0.4, - 0.4 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "fixed": { - "rotation": [ - 0, - 180, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "ground": { - "rotation": [ - 0, - 0, - 0 - ], - "scale": [ - 0.25, - 0.25, - 0.25 - ], - "translation": [ - 0, - 3, - 0 - ] - }, - "gui": { - "rotation": [ - 30, - 45, - 0 - ], - "scale": [ - 0.625, - 0.625, - 0.625 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "head": { - "rotation": [ - 0, - 180, - 0 - ], - "scale": [ - 1, - 1, - 1 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "thirdperson_righthand": { - "rotation": [ - 75, - 315, - 0 - ], - "scale": [ - 0.375, - 0.375, - 0.375 - ], - "translation": [ - 0, - 2.5, - 0 - ] - } - }, - "parent": "builtin/entity" + "parent": "appliedenergistics2:item/sky_chest_stone", + "textures": { + "particle": "appliedenergistics2:models/skyblockchest", + "0": "appliedenergistics2:models/skyblockchest" + } } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_stone.json b/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_stone.json index cd20eec8a..43e950c4b 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_stone.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/sky_chest_stone.json @@ -1,107 +1,50 @@ { - "display": { - "firstperson_righthand": { - "rotation": [ - 0, - 315, - 0 - ], - "scale": [ - 0.4, - 0.4, - 0.4 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "fixed": { - "rotation": [ - 0, - 180, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "ground": { - "rotation": [ - 0, - 0, - 0 - ], - "scale": [ - 0.25, - 0.25, - 0.25 - ], - "translation": [ - 0, - 3, - 0 - ] - }, - "gui": { - "rotation": [ - 30, - 45, - 0 - ], - "scale": [ - 0.625, - 0.625, - 0.625 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "head": { - "rotation": [ - 0, - 180, - 0 - ], - "scale": [ - 1, - 1, - 1 - ], - "translation": [ - 0, - 0, - 0 - ] - }, - "thirdperson_righthand": { - "rotation": [ - 75, - 315, - 0 - ], - "scale": [ - 0.375, - 0.375, - 0.375 - ], - "translation": [ - 0, - 2.5, - 0 - ] - } + "parent": "block/orientable", + "textures": { + "particle": "appliedenergistics2:models/skychest", + "0": "appliedenergistics2:models/skychest" }, - "parent": "builtin/entity" + "elements": [ + { + "name": "Base", + "from": [ 1.0, 0.0, 1.0 ], + "to": [ 15.0, 10.0, 15.0 ], + "shade": false, + "faces": { + "north": { "texture": "#0", "uv": [ 3.5, 8.25, 7, 10.75 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 8.25, 3.5, 10.75 ] }, + "south": { "texture": "#0", "uv": [ 10.5, 8.25, 14, 10.75 ] }, + "west": { "texture": "#0", "uv": [ 7, 8.25, 10.5, 10.75 ] }, + "up": { "texture": "#0", "uv": [ 3.5, 0.0, 7, 3.5 ] }, + "down": { "texture": "#0", "uv": [ 7, 0.0, 10.5, 3.5 ] } + } + }, + { + "name": "Lid", + "from": [ 1.0, 10.0, 1.0 ], + "to": [ 15.0, 15.0, 15.0 ], + "shade": false, + "faces": { + "north": { "texture": "#0", "uv": [ 3.5, 3.5, 7, 4.75 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 3.5, 3.5, 4.75 ] }, + "south": { "texture": "#0", "uv": [ 10.5, 3.5, 14, 4.75 ] }, + "west": { "texture": "#0", "uv": [ 7, 3.5, 10.5, 4.75 ] }, + "up": { "texture": "#0", "uv": [ 3.5, 0.0, 7, 3.5 ] }, + "down": { "texture": "#0", "uv": [ 7, 0.0, 10.5, 3.5 ] } + } + }, + { + "name": "Knob", + "from": [ 7.0, 6.0, 0.0 ], + "to": [ 9.0, 10.0, 1.0 ], + "shade": false, + "faces": { + "north": { "texture": "#0", "uv": [ 0.25, 0.25, 0.75, 1.25 ] }, + "east": { "texture": "#0", "uv": [ 0, 0.25, 0.25, 1.25 ] }, + "west": { "texture": "#0", "uv": [ 0.75, 0.25, 1.5, 1.25 ] }, + "up": { "texture": "#0", "uv": [ 0.25, 0.0, 0.75, 0.25 ] }, + "down": { "texture": "#0", "uv": [ 0.75, 0.0, 1.5, 0.25 ] } + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/item/tiny_tnt.json b/src/main/resources/assets/appliedenergistics2/models/item/tiny_tnt.json deleted file mode 100644 index af083a079..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/tiny_tnt.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "appliedenergistics2:tiny_tnt" -} \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index bc4d39f1a..52bf0b6e5 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "pack_format": 1, + "pack_format": 2, "description": "Resources used for Applied Energistics 2" } }