aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common')
-rw-r--r--src/main/java/gregtech/common/GT_Network.java4
-rw-r--r--src/main/java/gregtech/common/GT_Proxy.java3
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings4.java6
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Machines.java53
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Machines.java14
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java27
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java235
-rw-r--r--src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java128
-rw-r--r--src/main/java/gregtech/common/render/GT_TextureBuilder.java39
9 files changed, 502 insertions, 7 deletions
diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java
index ef28a26a97..8db38d86f7 100644
--- a/src/main/java/gregtech/common/GT_Network.java
+++ b/src/main/java/gregtech/common/GT_Network.java
@@ -51,7 +51,9 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet>
new GT_Packet_SetConfigurationCircuit(),
new GT_Packet_UpdateItem(),
new GT_Packet_SetLockedFluid(),
- new GT_Packet_GtTileEntityGuiRequest()
+ new GT_Packet_GtTileEntityGuiRequest(),
+ new GT_Packet_SendCoverData(),
+ new GT_Packet_RequestCoverData()
);
}
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
index 403f7a43b8..ec4362ec75 100644
--- a/src/main/java/gregtech/common/GT_Proxy.java
+++ b/src/main/java/gregtech/common/GT_Proxy.java
@@ -140,7 +140,8 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
"arditeRod", "manyullynRod", "bronzeRod", "boneRod", "slimeRod", "redalloyBundled", "bluestoneBundled", "infusedteslatiteInsulated",
"redalloyInsulated", "infusedteslatiteBundled"));
private final DateFormat mDateFormat = DateFormat.getInstance();
- public ArrayList<String> mBufferedPlayerActivity = new ArrayList();
+ public ArrayList<String> mBufferedPlayerActivity = new ArrayList<>();
+ public final GT_BlockMap<Boolean> mCTMBlockCache = new GT_BlockMap<>();
public boolean mHardcoreCables = false;
public boolean mDisableVanillaOres = true;
public boolean mHardMachineCasings = true;
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java
index 2bd94c6ccb..cef115f0c0 100644
--- a/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java
@@ -2,11 +2,13 @@ package gregtech.common.blocks;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Textures;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_RenderingWorld;
import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@@ -67,6 +69,9 @@ public class GT_Block_Casings4 extends GT_Block_Casings_Abstract {
ItemList.Casing_EngineIntake.set(new ItemStack(this, 1, 13));
ItemList.Casing_MiningOsmiridium.set(new ItemStack(this, 1, 14));
ItemList.Casing_Firebricks.set(new ItemStack(this, 1, 15));
+
+ GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 6, true);
+ GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 8, true);
}
@Override
@@ -148,6 +153,7 @@ public class GT_Block_Casings4 extends GT_Block_Casings_Abstract {
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int aSide) {
+ aWorld = GT_RenderingWorld.getInstance(aWorld);
int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
if (tMeta != 6 && tMeta != 8 && tMeta != 9 && tMeta != 10 && tMeta != 11 && tMeta != 12 || !mConnectedMachineTextures) {
return getIcon(aSide, tMeta);
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java
index 2c9254bf28..ad97bb9572 100644
--- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java
@@ -1,5 +1,7 @@
package gregtech.common.blocks;
+import com.cricketcraft.chisel.api.IFacade;
+import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.GregTech_API;
@@ -27,6 +29,7 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -47,7 +50,8 @@ import java.util.List;
import static gregtech.GT_Mod.GT_FML_LOGGER;
import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
-public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider {
+@Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI")
+public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider, IFacade {
private static final ThreadLocal<IGregTechTileEntity> mTemporaryTileEntity = new ThreadLocal<>();
private boolean renderAsNormalBlock;
@@ -648,4 +652,51 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo
}
return false;
}
+
+ @Override
+ public Block getFacade(IBlockAccess aWorld, int aX, int aY, int aZ, int side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ byte aSide = (byte) side;
+ IGregTechTileEntity tile = (IGregTechTileEntity) tTileEntity;
+ if (side != -1) {
+ Block facadeBlock = tile.getCoverBehaviorAtSideNew(aSide).getFacadeBlock(aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
+ if (facadeBlock != null) return facadeBlock;
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (byte i = 0; i < 6; i++) {
+ Block facadeBlock = tile.getCoverBehaviorAtSideNew(i).getFacadeBlock(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ if (facadeBlock != null) {
+ return facadeBlock;
+ }
+ }
+ }
+ }
+ return Blocks.air;
+ }
+
+ @Override
+ public int getFacadeMetadata(IBlockAccess aWorld, int aX, int aY, int aZ, int side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ byte aSide = (byte) side;
+ IGregTechTileEntity tile = (IGregTechTileEntity) tTileEntity;
+ if (side != -1) {
+ Block facadeBlock = tile.getCoverBehaviorAtSideNew(aSide).getFacadeBlock(aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
+ if (facadeBlock != null)
+ return tile.getCoverBehaviorAtSideNew(aSide).getFacadeMeta(aSide, tile.getCoverIDAtSide(aSide), tile.getComplexCoverDataAtSide(aSide), tile);
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (byte i = 0; i < 6; i++) {
+ Block facadeBlock = tile.getCoverBehaviorAtSideNew(i).getFacadeBlock(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ if (facadeBlock != null) {
+ return tile.getCoverBehaviorAtSideNew(i).getFacadeMeta(i, tile.getCoverIDAtSide(i), tile.getComplexCoverDataAtSide(i), tile);
+ }
+ }
+ }
+ }
+ return 0;
+ }
}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Machines.java b/src/main/java/gregtech/common/blocks/GT_Item_Machines.java
index bcc6d7e14c..73443006b2 100644
--- a/src/main/java/gregtech/common/blocks/GT_Item_Machines.java
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Machines.java
@@ -6,15 +6,18 @@ import gregtech.api.enums.Materials;
import gregtech.api.interfaces.metatileentity.IConnectable;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.CoverableGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame;
import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item;
+import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.GT_ItsNotMyFaultException;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
import gregtech.common.tileentities.storage.*;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
@@ -144,9 +147,14 @@ public class GT_Item_Machines extends ItemBlock implements IFluidContainerItem {
if (mCoverSides != null && mCoverSides.length == 6) {
for (byte i = 0; i < 6; i++) {
int coverId = mCoverSides[i];
- ItemStack coverStack = GT_Utility.intToStack(coverId);
- if (coverStack != null) {
- aList.add(String.format("Cover on %s side: %s", directionNames[i], coverStack.getDisplayName()));
+ if (coverId == 0) continue;
+ GT_CoverBehaviorBase<?> behavior = GregTech_API.getCoverBehaviorNew(coverId);
+ if (behavior == null || behavior == GregTech_API.sNoBehavior) continue;
+ if (!aNBT.hasKey(CoverableGregTechTileEntity.COVER_DATA_NBT_KEYS[i])) continue;
+ ISerializableObject dataObject = behavior.createDataObject(aNBT.getTag(CoverableGregTechTileEntity.COVER_DATA_NBT_KEYS[i]));
+ ItemStack itemStack = behavior.getDisplayStack(coverId, dataObject);
+ if (itemStack != null) {
+ aList.add(String.format("Cover on %s side: %s", directionNames[i], itemStack.getDisplayName()));
}
}
}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java
new file mode 100644
index 0000000000..592b6f322d
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java
@@ -0,0 +1,27 @@
+package gregtech.common.covers;
+
+import appeng.facade.IFacadeItem;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public class GT_Cover_FacadeAE extends GT_Cover_FacadeBase {
+ @Override
+ protected Block getTargetBlock(ItemStack aFacadeStack) {
+ Item item = aFacadeStack.getItem();
+ if (!(item instanceof IFacadeItem)) return null;
+ return ((IFacadeItem) item).getBlock(aFacadeStack);
+ }
+
+ @Override
+ protected int getTargetMeta(ItemStack aFacadeStack) {
+ Item item = aFacadeStack.getItem();
+ if (!(item instanceof IFacadeItem)) return 0;
+ return ((IFacadeItem) item).getMeta(aFacadeStack);
+ }
+
+ @Override
+ protected ItemStack getDisplayStackImpl(int aCoverID, FacadeData aCoverVariable) {
+ return aCoverVariable.mStack;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java
new file mode 100644
index 0000000000..9f21b34c3f
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java
@@ -0,0 +1,235 @@
+package gregtech.common.covers;
+
+import com.google.common.io.ByteArrayDataInput;
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import javax.annotation.Nonnull;
+
+public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_FacadeBase.FacadeData> {
+ /**
+ * This is the Dummy, if there is a generic Cover without behavior
+ */
+ public GT_Cover_FacadeBase() {
+ super(FacadeData.class);
+ }
+
+ @Override
+ public boolean isSimpleCover() {
+ return true;
+ }
+
+ @Override
+ public FacadeData createDataObject(int aLegacyData) {
+ return new FacadeData();
+ }
+
+ @Override
+ public FacadeData createDataObject() {
+ return new FacadeData();
+ }
+
+ @Override
+ protected FacadeData onCoverScrewdriverClickImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable.mFlags = ((aCoverVariable.mFlags + 1) & 15);
+ GT_Utility.sendChatToPlayer(aPlayer, ((aCoverVariable.mFlags & 1) != 0 ? trans("128", "Redstone ") : "") + ((aCoverVariable.mFlags & 2) != 0 ? trans("129", "Energy ") : "") + ((aCoverVariable.mFlags & 4) != 0 ? trans("130", "Fluids ") : "") + ((aCoverVariable.mFlags & 8) != 0 ? trans("131", "Items ") : ""));
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 1) != 0;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 1) != 0;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 2) != 0;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 2) != 0;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 4) != 0;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 4) != 0;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 8) != 0;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 8) != 0;
+ }
+
+ @Override
+ public void placeCover(byte aSide, ItemStack aCover, ICoverable aTileEntity) {
+ aTileEntity.setCoverIDAtSide(aSide, GT_Utility.stackToInt(aCover));
+ aTileEntity.setCoverDataAtSide(aSide, new FacadeData(GT_Utility.copyAmount(1, aCover), 0));
+ if (aTileEntity.isClientSide())
+ GT_RenderingWorld.getInstance().register(aTileEntity.getXCoord(), aTileEntity.getYCoord(), aTileEntity.getZCoord(), getTargetBlock(aCover), getTargetMeta(aCover));
+ }
+
+ @Override
+ protected ItemStack getDropImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable.mStack;
+ }
+
+ @Override
+ protected ITexture getSpecialCoverTextureImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return null;
+ Block block = getTargetBlock(aCoverVariable.mStack);
+ if (block == null) return null;
+ return TextureFactory.builder().setFromBlock(block, getTargetMeta(aCoverVariable.mStack)).useWorldCoord().setFromSide(ForgeDirection.getOrientation(aSide)).build();
+ }
+
+ @Override
+ protected Block getFacadeBlockImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return null;
+ return getTargetBlock(aCoverVariable.mStack);
+ }
+
+ @Override
+ protected int getFacadeMetaImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return 0;
+ return getTargetMeta(aCoverVariable.mStack);
+ }
+
+ protected abstract Block getTargetBlock(ItemStack aFacadeStack);
+
+ protected abstract int getTargetMeta(ItemStack aFacadeStack);
+
+ @Override
+ protected boolean isDataNeededOnClientImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected void onDataChangedImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (aTileEntity.isClientSide())
+ GT_RenderingWorld.getInstance().register(aTileEntity.getXCoord(), aTileEntity.getYCoord(), aTileEntity.getZCoord(), getTargetBlock(aCoverVariable.mStack), getTargetMeta(aCoverVariable.mStack));
+ }
+
+ @Override
+ protected void onDroppedImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (aTileEntity.isClientSide()) {
+ for (byte i = 0; i < 6; i++) {
+ if (i == aSide) continue;
+ // since we do not allow multiple type of facade per block, this check would be enough.
+ if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof GT_Cover_FacadeBase) return;
+ }
+ if (aCoverVariable.mStack != null)
+ // mStack == null -> cover removed before data reach client
+ GT_RenderingWorld.getInstance().unregister(aTileEntity.getXCoord(), aTileEntity.getYCoord(), aTileEntity.getZCoord(), getTargetBlock(aCoverVariable.mStack), getTargetMeta(aCoverVariable.mStack));
+ }
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // in case cover data didn't hit client somehow. maybe he had a ridiculous view distance
+ aTileEntity.issueCoverUpdate(aSide);
+ return super.onCoverRightClickImpl(aSide, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean isCoverPlaceable(byte aSide, ItemStack aStack, ICoverable aTileEntity) {
+ // blocks that are not rendered in pass 0 are rejected for now.
+ // to implement it require changing GT_Block_Machine to render in both pass, which is not really a good idea...
+ if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false;
+ Block targetBlock = getTargetBlock(aStack);
+ if (targetBlock == null) return false;
+ if (targetBlock.getRenderBlockPass() != GregTech_API.sBlockMachines.getRenderBlockPass()) return false;
+ // we allow one single type of facade on the same block for now
+ // otherwise it's not clear which block this block should impersonate
+ // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this class
+ for (byte i = 0; i < 6; i++) {
+ if (i == aSide) continue;
+ GT_CoverBehaviorBase<?> behavior = aTileEntity.getCoverBehaviorAtSideNew(i);
+ if (behavior == null) continue;
+ Block facadeBlock = behavior.getFacadeBlock(i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity);
+ if (facadeBlock == null) continue;
+ if (facadeBlock != targetBlock) return false;
+ if (behavior.getFacadeMeta(i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity) != getTargetMeta(aStack)) return false;
+ }
+ return true;
+ }
+
+ public static class FacadeData implements ISerializableObject {
+ ItemStack mStack;
+ int mFlags;
+
+ public FacadeData() {
+ }
+
+ public FacadeData(ItemStack mStack, int mFlags) {
+ this.mStack = mStack;
+ this.mFlags = mFlags;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FacadeData(mStack, mFlags);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound()));
+ tag.setByte("mFlags", (byte) mFlags);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ ByteBufUtils.writeItemStack(aBuf, mStack);
+ aBuf.writeByte(mFlags);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack"));
+ mFlags = tag.getByte("mFlags");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ mStack = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf);
+ mFlags = aBuf.readByte();
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java b/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java
new file mode 100644
index 0000000000..fc83e4b687
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java
@@ -0,0 +1,128 @@
+package gregtech.common.render;
+
+import gregtech.api.interfaces.IBlockContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.api.util.LightingHelper;
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.common.util.ForgeDirection;
+
+class GT_CopiedCTMBlockTexture implements ITexture, IBlockContainer {
+ private final Block mBlock;
+ private final byte mSide, mMeta;
+
+ GT_CopiedCTMBlockTexture(Block aBlock, int aSide, int aMeta, short[] aRGBa, boolean allowAlpha) {
+ if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedCTMBlockTexture");
+ mBlock = aBlock;
+ mSide = (byte) aSide;
+ mMeta = (byte) aMeta;
+ }
+
+ private IIcon getIcon(int aSide, int aX, int aY, int aZ, RenderBlocks aRenderer) {
+ int tSide = mSide == 6 ? aSide : mSide;
+ return mBlock.getIcon(getBlockAccess(aRenderer), aX, aY, aZ, tSide);
+ }
+
+ private GT_RenderingWorld getBlockAccess(RenderBlocks aRenderer) {
+ return GT_RenderingWorld.getInstance(aRenderer.blockAccess);
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal(), aX, aY, aZ, aRenderer);
+ aRenderer.field_152631_f = true;
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f);
+ new LightingHelper(aRenderer)
+ .setupLightingXPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.EAST.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f);
+ IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer)
+ .setupLightingXNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.WEST.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f);
+ IIcon aIcon = getIcon(ForgeDirection.UP.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer)
+ .setupLightingYPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.UP.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f);
+ IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer)
+ .setupLightingYNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.DOWN.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f);
+ IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer)
+ .setupLightingZPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.SOUTH.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f);
+ IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal(), aX, aY, aZ, aRenderer);
+ aRenderer.field_152631_f = true;
+ new LightingHelper(aRenderer)
+ .setupLightingZNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.NORTH.ordinal(), mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon);
+ // TODO: Uncomment this once all addons have migrated to the new Texture API
+ //draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ return mBlock != null;
+ }
+
+ @Override
+ public Block getBlock() {
+ return mBlock;
+ }
+
+ @Override
+ public byte getMeta() {
+ return mMeta;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_TextureBuilder.java b/src/main/java/gregtech/common/render/GT_TextureBuilder.java
index 82bce4c8c4..f79e438dd7 100644
--- a/src/main/java/gregtech/common/render/GT_TextureBuilder.java
+++ b/src/main/java/gregtech/common/render/GT_TextureBuilder.java
@@ -1,6 +1,8 @@
package gregtech.common.render;
+import gregtech.GT_Mod;
import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
import gregtech.api.interfaces.IIconContainer;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.ITextureBuilder;
@@ -23,6 +25,7 @@ public class GT_TextureBuilder implements ITextureBuilder {
private boolean stdOrient;
private boolean extFacing;
private boolean glow;
+ private Boolean worldCoord = null;
public GT_TextureBuilder() {
textureLayers = new ArrayList<>();
@@ -78,6 +81,20 @@ public class GT_TextureBuilder implements ITextureBuilder {
}
@Override
+ public ITextureBuilder useWorldCoord() {
+ if (fromBlock == null) throw new IllegalStateException("no from block");
+ this.worldCoord = true;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder noWorldCoord() {
+ if (fromBlock == null) throw new IllegalStateException("no from block");
+ this.worldCoord = false;
+ return this;
+ }
+
+ @Override
public ITextureBuilder extFacing() {
this.extFacing = true;
return this;
@@ -91,7 +108,12 @@ public class GT_TextureBuilder implements ITextureBuilder {
@Override
public ITexture build() {
- if (fromBlock != null) return new GT_CopiedBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha);
+ if (fromBlock != null) {
+ if (worldCoord == Boolean.TRUE || worldCoord == null && isCTMBlock(fromBlock, fromMeta))
+ return new GT_CopiedCTMBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha);
+ else
+ return new GT_CopiedBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha);
+ }
if (!textureLayers.isEmpty()) return new GT_MultiTexture(textureLayers.toArray(new ITexture[0]));
switch (iconContainerList.size()) {
case 1:
@@ -109,4 +131,19 @@ public class GT_TextureBuilder implements ITextureBuilder {
throw new IllegalStateException("Invalid sideIconContainer count");
}
}
+
+ private boolean isCTMBlock(Block fromBlock, int fromMeta) {
+ return GT_Mod.gregtechproxy.mCTMBlockCache.computeIfAbsent(fromBlock, (byte) fromMeta, GT_TextureBuilder::apply);
+ }
+
+ private static Boolean apply(Block b, Byte m) {
+ Class<?> clazz = b.getClass();
+ while (clazz != Block.class) {
+ String className = clazz.getName();
+ if (GT_Values.mCTMDisabledBlock.contains(className)) return false;
+ if (GT_Values.mCTMEnabledBlock.contains(className)) return true;
+ clazz = clazz.getSuperclass();
+ }
+ return false;
+ }
}