2015-10-22 00:47:13 +00:00
package gregtech.common.blocks ;
2016-07-16 22:48:25 +00:00
import exterminatorJeff.undergroundBiomes.common.UndergroundBiomes ;
import exterminatorJeff.undergroundBiomes.common.block.BlockMetadataBase ;
2015-10-25 21:52:57 +00:00
import gregtech.GT_Mod ;
2015-10-22 00:47:13 +00:00
import gregtech.api.GregTech_API ;
import gregtech.api.enums.GT_Values ;
import gregtech.api.enums.Materials ;
import gregtech.api.enums.OrePrefixes ;
import gregtech.api.enums.Textures ;
import gregtech.api.interfaces.ITexture ;
import gregtech.api.interfaces.tileentity.ITexturedTileEntity ;
import gregtech.api.objects.GT_CopiedBlockTexture ;
import gregtech.api.objects.GT_RenderedTexture ;
import gregtech.api.util.GT_OreDictUnificator ;
import gregtech.api.util.GT_Utility ;
import net.minecraft.block.Block ;
import net.minecraft.init.Blocks ;
import net.minecraft.item.ItemStack ;
import net.minecraft.nbt.NBTTagCompound ;
import net.minecraft.network.Packet ;
import net.minecraft.tileentity.TileEntity ;
import net.minecraft.world.World ;
2015-10-22 02:06:25 +00:00
import java.util.ArrayList ;
import java.util.Random ;
2015-10-22 00:47:13 +00:00
public class GT_TileEntity_Ores
2015-10-22 02:06:25 +00:00
extends TileEntity
implements ITexturedTileEntity {
2016-07-16 22:48:25 +00:00
//private static final ITexture[] mStoneTextures = {new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.netherrack, 0, 0), new GT_CopiedBlockTexture(Blocks.end_stone, 0, 0), new GT_RenderedTexture(Textures.BlockIcons.GRANITE_BLACK_STONE), new GT_RenderedTexture(Textures.BlockIcons.GRANITE_RED_STONE), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 0), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 1), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 2), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 3), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 4), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 5), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 6), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 7), new GT_CopiedBlockTexture(UndergroundBiomes.igneousStone, 0, 8), new GT_CopiedBlockTexture(Blocks.stone, 0, 0), new GT_CopiedBlockTexture(Blocks.stone, 0, 8)};
private static final ITexture [ ] mStoneTextures = { new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_CopiedBlockTexture ( Blocks . netherrack , 0 , 0 ) , new GT_CopiedBlockTexture ( Blocks . end_stone , 0 , 0 ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_BLACK_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_RenderedTexture ( Textures . BlockIcons . GRANITE_RED_STONE ) , new GT_CopiedBlockTexture ( Blocks . stone , 0 , 0 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 0 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 1 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 2 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 3 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 4 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 5 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 6 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 7 ) , new GT_CopiedBlockTexture ( UndergroundBiomes . igneousStone , 0 , 8 ) , new GT_CopiedBlockTexture ( Blocks . stone , 0 , 0 ) } ;
2015-10-22 02:06:25 +00:00
public short mMetaData = 0 ;
public boolean mNatural = false ;
public boolean mBlocked = true ;
public static byte getHarvestData ( short aMetaData ) {
Materials aMaterial = GregTech_API . sGeneratedMaterials [ ( aMetaData % 1000 ) ] ;
2015-10-25 21:52:57 +00:00
byte tByte = aMaterial = = null ? 0 : ( byte ) Math . max ( ( aMetaData % 16000 / 1000 = = 3 ) | | ( aMetaData % 16000 / 1000 = = 4 ) ? 3 : 0 , Math . min ( 7 , aMaterial . mToolQuality - ( aMetaData < 16000 ? 0 : 1 ) ) ) ;
if ( GT_Mod . gregtechproxy . mChangeHarvestLevels ) {
tByte = aMaterial = = null ? 0 : ( byte ) Math . max ( ( aMetaData % 16000 / 1000 = = 3 ) | | ( aMetaData % 16000 / 1000 = = 4 ) ? GT_Mod . gregtechproxy . mGraniteHavestLevel : 0 , Math . min ( GT_Mod . gregtechproxy . mMaxHarvestLevel , GT_Mod . gregtechproxy . mHarvestLevel [ aMaterial . mMetaItemSubID ] - ( aMetaData < 16000 ? 0 : 1 ) ) ) ;
}
return tByte ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
public static boolean setOreBlock ( World aWorld , int aX , int aY , int aZ , int aMetaData ) {
return setOreBlock ( aWorld , aX , aY , aZ , aMetaData , false ) ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
public static boolean setOreBlock ( World aWorld , int aX , int aY , int aZ , int aMetaData , boolean air ) {
if ( ! air ) {
aY = Math . min ( aWorld . getActualHeight ( ) , Math . max ( aY , 1 ) ) ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
Block tBlock = aWorld . getBlock ( aX , aY , aZ ) ;
if ( ( aMetaData > 0 ) & & ( ( tBlock ! = Blocks . air ) | | air ) ) {
if ( tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , Blocks . netherrack ) ) {
aMetaData + = 1000 ;
} else if ( tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , Blocks . end_stone ) ) {
aMetaData + = 2000 ;
} else if ( tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , GregTech_API . sBlockGranites ) ) {
if ( tBlock = = GregTech_API . sBlockGranites ) {
if ( aWorld . getBlockMetadata ( aX , aY , aZ ) < 8 ) {
aMetaData + = 3000 ;
} else {
aMetaData + = 4000 ;
}
} else {
aMetaData + = 3000 ;
}
2016-07-16 22:48:25 +00:00
} else if ( tBlock instanceof BlockMetadataBase ) { //TODO Implement config option
int aMeta = aWorld . getBlockMetadata ( aX , aY , aZ ) ;
if ( tBlock = = UndergroundBiomes . igneousStone ) {
aMetaData + = ( 21000 + ( aMeta * 1000 ) ) ;
} / * else if ( tBlock = = UndergroundBiomes . metamorphicStone & & tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , UndergroundBiomes . metamorphicStone ) ) {
//aMetaData += (40000 + (aMeta * 1000));
} else if ( tBlock = = UndergroundBiomes . sedimentaryStone & & tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , UndergroundBiomes . sedimentaryStone ) ) {
//aMetaData += (50000 + (aMeta * 1000));
} * /
2015-10-22 02:06:25 +00:00
} else if ( ! tBlock . isReplaceableOreGen ( aWorld , aX , aY , aZ , Blocks . stone ) ) {
return false ;
}
aWorld . setBlock ( aX , aY , aZ , GregTech_API . sBlockOres1 , getHarvestData ( ( short ) aMetaData ) , 0 ) ;
TileEntity tTileEntity = aWorld . getTileEntity ( aX , aY , aZ ) ;
if ( ( tTileEntity instanceof GT_TileEntity_Ores ) ) {
( ( GT_TileEntity_Ores ) tTileEntity ) . mMetaData = ( ( short ) aMetaData ) ;
( ( GT_TileEntity_Ores ) tTileEntity ) . mNatural = true ;
}
return true ;
2015-10-22 00:47:13 +00:00
}
return false ;
}
2015-10-22 02:06:25 +00:00
public void readFromNBT ( NBTTagCompound aNBT ) {
super . readFromNBT ( aNBT ) ;
this . mMetaData = aNBT . getShort ( " m " ) ;
this . mNatural = aNBT . getBoolean ( " n " ) ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
public void writeToNBT ( NBTTagCompound aNBT ) {
super . writeToNBT ( aNBT ) ;
aNBT . setShort ( " m " , this . mMetaData ) ;
aNBT . setBoolean ( " n " , this . mNatural ) ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
public void onUpdated ( ) {
if ( ( ! this . worldObj . isRemote ) & & ( this . mBlocked ) ) {
this . mBlocked = false ;
GT_Values . NW . sendPacketToAllPlayersInRange ( this . worldObj , new GT_Packet_Ores ( this . xCoord , ( short ) this . yCoord , this . zCoord , this . mMetaData ) , this . xCoord , this . zCoord ) ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
}
public Packet getDescriptionPacket ( ) {
if ( ! this . worldObj . isRemote ) {
if ( ( this . mBlocked = = ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord + 1 , this . yCoord , this . zCoord ) ) & & ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord - 1 , this . yCoord , this . zCoord ) ) & & ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord , this . yCoord + 1 , this . zCoord ) ) & & ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord , this . yCoord - 1 , this . zCoord ) ) & & ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord , this . yCoord , this . zCoord + 1 ) ) & & ( GT_Utility . isOpaqueBlock ( this . worldObj , this . xCoord , this . yCoord , this . zCoord - 1 ) ) ? 1 : 0 ) = = 0 ) {
GT_Values . NW . sendPacketToAllPlayersInRange ( this . worldObj , new GT_Packet_Ores ( this . xCoord , ( short ) this . yCoord , this . zCoord , this . mMetaData ) , this . xCoord , this . zCoord ) ;
}
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
return null ;
}
public void overrideOreBlockMaterial ( Block aOverridingStoneBlock , byte aOverridingStoneMeta ) {
this . mMetaData = ( ( short ) ( int ) ( this . mMetaData % 1000L + this . mMetaData / 16000L * 16000L ) ) ;
if ( aOverridingStoneBlock . isReplaceableOreGen ( this . worldObj , this . xCoord , this . yCoord , this . zCoord , Blocks . netherrack ) ) {
this . mMetaData = ( ( short ) ( this . mMetaData + 1000 ) ) ;
} else if ( aOverridingStoneBlock . isReplaceableOreGen ( this . worldObj , this . xCoord , this . yCoord , this . zCoord , Blocks . end_stone ) ) {
this . mMetaData = ( ( short ) ( this . mMetaData + 2000 ) ) ;
} else if ( aOverridingStoneBlock . isReplaceableOreGen ( this . worldObj , this . xCoord , this . yCoord , this . zCoord , GregTech_API . sBlockGranites ) ) {
if ( aOverridingStoneBlock = = GregTech_API . sBlockGranites ) {
if ( aOverridingStoneMeta < 8 ) {
this . mMetaData = ( ( short ) ( this . mMetaData + 3000 ) ) ;
} else {
this . mMetaData = ( ( short ) ( this . mMetaData + 4000 ) ) ;
}
} else {
this . mMetaData = ( ( short ) ( this . mMetaData + 3000 ) ) ;
}
2016-07-16 22:48:25 +00:00
} else if ( aOverridingStoneBlock . isReplaceableOreGen ( this . worldObj , this . xCoord , this . yCoord , this . zCoord , GregTech_API . sBlockStones ) ) {
if ( aOverridingStoneBlock = = GregTech_API . sBlockStones ) {
if ( aOverridingStoneMeta = = 0 ) {
this . mMetaData = ( ( short ) ( this . mMetaData + 5000 ) ) ;
}
}
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
this . worldObj . setBlockMetadataWithNotify ( this . xCoord , this . yCoord , this . zCoord , getHarvestData ( this . mMetaData ) , 0 ) ;
}
public short getMetaData ( ) {
return this . mMetaData ;
}
public boolean canUpdate ( ) {
return false ;
}
public ArrayList < ItemStack > getDrops ( int aFortune ) {
ArrayList < ItemStack > rList = new ArrayList ( ) ;
if ( this . mMetaData < = 0 ) {
rList . add ( new ItemStack ( Blocks . cobblestone , 1 , 0 ) ) ;
return rList ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
if ( this . mMetaData < 16000 ) {
rList . add ( new ItemStack ( GregTech_API . sBlockOres1 , 1 , this . mMetaData ) ) ;
return rList ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
Materials aMaterial = GregTech_API . sGeneratedMaterials [ ( this . mMetaData % 1000 ) ] ;
if ( ! this . mNatural ) {
aFortune = 0 ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
if ( aMaterial ! = null ) {
Random tRandom = new Random ( this . xCoord ^ this . yCoord ^ this . zCoord ) ;
ArrayList < ItemStack > tSelector = new ArrayList ( ) ;
ItemStack tStack = GT_OreDictUnificator . get ( OrePrefixes . gemExquisite , aMaterial , GT_OreDictUnificator . get ( OrePrefixes . gem , aMaterial , 1L ) , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 1 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . gemFlawless , aMaterial , GT_OreDictUnificator . get ( OrePrefixes . gem , aMaterial , 1L ) , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 2 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . gem , aMaterial , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 12 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . gemFlawed , aMaterial , GT_OreDictUnificator . get ( OrePrefixes . crushed , aMaterial , 1L ) , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 5 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . crushed , aMaterial , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 10 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . gemChipped , aMaterial , GT_OreDictUnificator . get ( OrePrefixes . dustImpure , aMaterial , 1L ) , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 5 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
tStack = GT_OreDictUnificator . get ( OrePrefixes . dustImpure , aMaterial , 1L ) ;
if ( tStack ! = null ) {
for ( int i = 0 ; i < 10 ; i + + ) {
tSelector . add ( tStack ) ;
}
}
if ( tSelector . size ( ) > 0 ) {
int i = 0 ;
for ( int j = Math . max ( 1 , aMaterial . mOreMultiplier + ( aFortune > 0 ? tRandom . nextInt ( 1 + aFortune * aMaterial . mOreMultiplier ) : 0 ) / 2 ) ; i < j ; i + + ) {
rList . add ( GT_Utility . copyAmount ( 1L , new Object [ ] { tSelector . get ( tRandom . nextInt ( tSelector . size ( ) ) ) } ) ) ;
}
}
if ( tRandom . nextInt ( 3 + aFortune ) > 1 ) {
switch ( this . mMetaData / 1000 % 16 ) {
case 0 :
rList . add ( GT_OreDictUnificator . get ( tRandom . nextInt ( 3 ) > 0 ? OrePrefixes . dustImpure : OrePrefixes . dust , Materials . Stone , 1L ) ) ;
break ;
case 1 :
rList . add ( GT_OreDictUnificator . get ( tRandom . nextInt ( 3 ) > 0 ? OrePrefixes . dustImpure : OrePrefixes . dust , Materials . Netherrack , 1L ) ) ;
break ;
case 2 :
rList . add ( GT_OreDictUnificator . get ( tRandom . nextInt ( 3 ) > 0 ? OrePrefixes . dustImpure : OrePrefixes . dust , Materials . Endstone , 1L ) ) ;
break ;
case 3 :
rList . add ( GT_OreDictUnificator . get ( tRandom . nextInt ( 3 ) > 0 ? OrePrefixes . dustImpure : OrePrefixes . dust , Materials . GraniteBlack , 1L ) ) ;
break ;
case 4 :
rList . add ( GT_OreDictUnificator . get ( tRandom . nextInt ( 3 ) > 0 ? OrePrefixes . dustImpure : OrePrefixes . dust , Materials . GraniteRed , 1L ) ) ;
}
}
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
return rList ;
2015-10-22 00:47:13 +00:00
}
2015-10-22 02:06:25 +00:00
public ITexture [ ] getTexture ( byte aSide ) {
Materials aMaterial = GregTech_API . sGeneratedMaterials [ ( this . mMetaData % 1000 ) ] ;
2016-07-16 22:48:25 +00:00
if ( ( aMaterial ! = null ) & & ( this . mMetaData < 32767 ) ) {
System . out . println ( ( this . mMetaData / 1000 % 31 ) ) ;
return new ITexture [ ] { mStoneTextures [ ( this . mMetaData / 1000 % 31 ) ] , new GT_RenderedTexture ( aMaterial . mIconSet . mTextures [ ! ( this . mMetaData > = 16000 & & this . mMetaData < = 20999 ) ? OrePrefixes . ore . mTextureIndex : OrePrefixes . oreSmall . mTextureIndex ] , aMaterial . mRGBa ) } ;
2015-10-22 02:06:25 +00:00
}
return new ITexture [ ] { mStoneTextures [ 0 ] , new GT_RenderedTexture ( gregtech . api . enums . TextureSet . SET_NONE . mTextures [ OrePrefixes . ore . mTextureIndex ] ) } ;
2015-10-22 00:47:13 +00:00
}
}