aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbasdxz <tudurap.com@gmail.com>2020-12-19 12:04:46 +0000
committerbasdxz <tudurap.com@gmail.com>2020-12-19 12:04:46 +0000
commit28ccd508edfdb5b7e09d31d446f9e1b8338f3ff0 (patch)
tree9c43674cc6c21e458220a7f632e41bc03ba3a0f0
parentb21fbb19c3c1a5093ed3200e7caa637c2699e5e2 (diff)
parentf71194d635e5ebf7d82ab4d402be58e6de60638d (diff)
downloadGT5-Unofficial-28ccd508edfdb5b7e09d31d446f9e1b8338f3ff0.tar.gz
GT5-Unofficial-28ccd508edfdb5b7e09d31d446f9e1b8338f3ff0.tar.bz2
GT5-Unofficial-28ccd508edfdb5b7e09d31d446f9e1b8338f3ff0.zip
Merge branch 'ender-tank-alike' into BassAddons
-rw-r--r--build.properties2
-rw-r--r--src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java20
-rw-r--r--src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java5
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java4
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java1
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java4
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java100
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkCoverMessage.java132
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java39
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java46
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java129
-rw-r--r--src/main/java/com/github/technus/tectech/thing/CustomItemList.java2
-rw-r--r--src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java355
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java47
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta5
-rw-r--r--src/main/resources/assets/tectech/lang/en_US.lang5
-rw-r--r--src/main/resources/assets/tectech/lang/zh_CN.lang21
-rw-r--r--src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.pngbin0 -> 574 bytes
19 files changed, 900 insertions, 17 deletions
diff --git a/build.properties b/build.properties
index 658ccf3377..578a6b6e77 100644
--- a/build.properties
+++ b/build.properties
@@ -6,7 +6,7 @@ ic2.version=2.2.790-experimental
codechickenlib.version=1.1.3.140
codechickencore.version=1.0.7.47
nei.version=1.0.5.120
-gregtech.jenkinsbuild=772
+gregtech.jenkinsbuild=778
gregtech.version=5.09.33.57
#cofhcore.version=[1.7.10]3.1.4-329-dev
cofh_core_version=2388751
diff --git a/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java b/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java
index df5c11e67b..2609a81860 100644
--- a/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java
+++ b/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java
@@ -933,6 +933,8 @@ public class DreamCraftRecipeLoader implements Runnable {
48000, 64, 200000, 8, new Object[]{
GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L),
GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 6L),
+ ItemList.Gravistar.get(4L),
+ ItemList.Emitter_UHV.get(4L),
new Object[]{OrePrefixes.circuit.get(Materials.Bio), 4L},
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L),
@@ -952,7 +954,9 @@ public class DreamCraftRecipeLoader implements Runnable {
96000, 128, 400000, 16, new Object[]{
GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L),
GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 6L),
- new Object[]{OrePrefixes.circuit.get(Materials.Bio), 8L},
+ ItemList.Gravistar.get(8L),
+ ItemList.Emitter_UEV.get(4L),
+ new Object[]{OrePrefixes.circuit.get(Materials.Nano), 4},
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L),
@@ -1084,7 +1088,7 @@ public class DreamCraftRecipeLoader implements Runnable {
GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 64),
GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64)
}, new FluidStack[]{
- Materials.SolderingAlloy.getMolten(3760L),
+ Materials.SolderingAlloy.getMolten(3744L),
Materials.Naquadria.getMolten(4032L),
new FluidStack(FluidRegistry.getFluid("ic2coolant"), 20000)
}, getItemContainer("NanoCircuit").get(1L), 8000, 8000000);
@@ -1105,7 +1109,7 @@ public class DreamCraftRecipeLoader implements Runnable {
GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Neutronium, 16),
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 64)
}, new FluidStack[]{
- Materials.SolderingAlloy.getMolten(3760L),
+ Materials.SolderingAlloy.getMolten(3744L),
Materials.UUMatter.getFluid(8000L),
Materials.Osmium.getMolten(1152L)
}, getItemContainer("PikoCircuit").get(1L), 10000, 8000000);
@@ -1124,7 +1128,7 @@ public class DreamCraftRecipeLoader implements Runnable {
GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Bedrockium, 8),
GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 64)
}, new FluidStack[]{
- Materials.SolderingAlloy.getMolten(3760L),
+ Materials.SolderingAlloy.getMolten(3744L),
Materials.UUMatter.getFluid(24000L),
Materials.Osmium.getMolten(2304L)
}, getItemContainer("QuantumCircuit").get(1L), 20000, 32000000);
@@ -1682,7 +1686,13 @@ public class DreamCraftRecipeLoader implements Runnable {
GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2),
GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8),
}, Materials.SolderingAlloy.getMolten(72), CustomItemList.teslaCover.getWithDamage(1, 1), 320, 7680);
-
+ //Ender Fluid Link Cover
+ GT_Values.RA.addAssemblerRecipe(new ItemStack[]{
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 4),
+ ItemList.Sensor_LuV.get(1),
+ ItemList.Emitter_LuV.get(1),
+ ItemList.Electric_Pump_LuV.get(1),
+ }, Materials.Chrome.getMolten(288), CustomItemList.enderLinkFluidCover.getWithDamage(1, 0), 320, 30720);
//endregion
//region recycling
diff --git a/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java b/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java
index 581c81d15f..1edd924587 100644
--- a/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java
+++ b/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java
@@ -2,6 +2,7 @@ package com.github.technus.tectech.loader;
import com.github.technus.tectech.mechanics.data.ChunkDataMessage;
import com.github.technus.tectech.mechanics.data.PlayerDataMessage;
+import com.github.technus.tectech.mechanics.enderStorage.EnderLinkCoverMessage;
import com.github.technus.tectech.mechanics.spark.RendererMessage;
import com.github.technus.tectech.mechanics.alignment.AlignmentMessage;
import com.github.technus.tectech.thing.metaTileEntity.hatch.TextParametersMessage;
@@ -34,6 +35,10 @@ public class NetworkDispatcher extends eu.usrv.yamcore.network.PacketDispatcher
registerMessage(RendererMessage.ClientHandler.class, RendererMessage.RendererData.class);
+ registerMessage(EnderLinkCoverMessage.ServerHandler.class, EnderLinkCoverMessage.EnderLinkCoverQuery.class);
+ registerMessage(EnderLinkCoverMessage.ServerUpdateHandler.class, EnderLinkCoverMessage.EnderLinkCoverUpdate.class);
+ registerMessage(EnderLinkCoverMessage.ClientHandler.class, EnderLinkCoverMessage.EnderLinkCoverData.class);
+
registerMessage(TextParametersMessage.ServerHandler.class, TextParametersMessage.ParametersTextQuery.class);
registerMessage(TextParametersMessage.ServerUpdateHandler.class, TextParametersMessage.ParametersTextUpdate.class);
registerMessage(TextParametersMessage.ClientHandler.class, TextParametersMessage.ParametersTextData.class);
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java
index d7e9a21a67..1376049f5a 100644
--- a/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java
@@ -1,8 +1,10 @@
package com.github.technus.tectech.loader.thing;
import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.cover.GT_Cover_TM_EnderFluidLink;
import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil;
import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil_Ultimate;
+import com.github.technus.tectech.thing.item.EnderFluidLinkCover;
import com.github.technus.tectech.thing.item.TeslaCoilCover;
import gregtech.api.GregTech_API;
import gregtech.api.enums.Textures;
@@ -16,9 +18,11 @@ public class CoverLoader implements Runnable {
public void run() {
final IIconContainer TESLA_OVERLAY = new Textures.BlockIcons.CustomIcon("iconsets/TESLA_OVERLAY");
final IIconContainer TESLA_OVERLAY_ULTIMATE = new Textures.BlockIcons.CustomIcon("iconsets/TESLA_OVERLAY_ULTIMATE");
+ final IIconContainer ENDERFLUIDLINK_OVERLAY = new Textures.BlockIcons.CustomIcon("iconsets/ENDERFLUIDLINK_OVERLAY");
GregTech_API.registerCover(new ItemStack(TeslaCoilCover.INSTANCE, 1, 0), new GT_RenderedTexture(TESLA_OVERLAY), new GT_Cover_TM_TeslaCoil());
GregTech_API.registerCover(new ItemStack(TeslaCoilCover.INSTANCE, 1, 1), new GT_RenderedTexture(TESLA_OVERLAY_ULTIMATE), new GT_Cover_TM_TeslaCoil_Ultimate());
+ GregTech_API.registerCover(new ItemStack(EnderFluidLinkCover.INSTANCE, 1, 0), new GT_RenderedTexture(ENDERFLUIDLINK_OVERLAY), new GT_Cover_TM_EnderFluidLink());
TecTech.LOGGER.info("Cover functionality registered");
}
}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
index 7b432dbcb4..6fa0ba2bb3 100644
--- a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
@@ -60,6 +60,7 @@ public class ThingsLoader implements Runnable {
TeslaStaff.run();
TeslaCoilCover.run();
TeslaCoilCapacitor.run();
+ EnderFluidLinkCover.run();
TecTech.LOGGER.info("Useful Items registered");
TeslaCoilComponent.run();
diff --git a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java
index a3fa341697..0beb5e0af8 100644
--- a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java
+++ b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java
@@ -243,7 +243,9 @@ public class AnomalyHandler implements IChunkMetaDataHandler {
player.attackEntityFrom(MainLoader.subspace,Math.max(1,badness/8f));
}
} else if (playerTag.getDouble(SPACE_CANCER) > 0 && !player.isDead) {
- playerTag.setDouble(SPACE_CANCER, Math.max(0, playerTag.getDouble(SPACE_CANCER) - 7.6293945E-6f));
+ if (playerTag.getDouble(SPACE_CANCER) == 0 || player.ticksExisted % 10 != 0)
+ return;
+ playerTag.setDouble(SPACE_CANCER, Math.max(0, playerTag.getDouble(SPACE_CANCER) - 7.6293945E-5f));
}
}
TecTech.playerPersistence.saveData(player);
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java
new file mode 100644
index 0000000000..1a5ad6a69c
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java
@@ -0,0 +1,100 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import java.io.Serializable;
+
+public class EnderFluidContainer implements IFluidHandler, Serializable {
+ private static final int CAPACITY = 64000;
+ private int fluidID = -1;
+ private int fluidQuantity = 0;
+
+ public EnderFluidContainer() {
+ }
+
+ private FluidStack getFluidStack() {
+ FluidStack fluidStack = null;
+ if (fluidID >= 0) {
+ fluidStack = new FluidStack(fluidID, fluidQuantity);
+ }
+ return fluidStack;
+ }
+
+ private void setFluidStack(FluidStack fluidStack) {
+ if (fluidStack != null && fluidStack.amount != 0) {
+ fluidID = fluidStack.getFluidID();
+ fluidQuantity = fluidStack.amount;
+ } else {
+ fluidID = -1;
+ fluidQuantity = 0;
+ }
+ }
+
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack fluidStackIn, boolean doFill) {
+ int filledFluid = 0;
+ FluidStack fluidStackStored = getFluidStack();
+ if (fluidStackIn != null) {
+ if (fluidStackStored == null) {
+ fluidStackStored = fluidStackIn.copy();
+ fluidStackStored.amount = 0;
+ }
+ if (fluidStackStored.amount < CAPACITY && fluidStackIn.isFluidEqual(fluidStackStored)) {
+ filledFluid = Math.min(CAPACITY - fluidStackStored.amount, fluidStackIn.amount);
+ if (doFill) {
+ fluidStackStored.amount += filledFluid;
+ setFluidStack(fluidStackStored);
+ }
+ }
+ }
+ return filledFluid;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack fluidStack, boolean doDrain) {
+ FluidStack fluidStackOutput = null;
+ if (fluidStack != null && fluidStack.isFluidEqual(getFluidStack())) {
+ fluidStackOutput = drain(side, fluidStack.amount, doDrain);
+ }
+ return fluidStackOutput;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int amount, boolean doDrain) {
+ FluidStack fluidStackOutput = null;
+ FluidStack fluidStackStored = getFluidStack();
+ if (fluidStackStored != null && fluidStackStored.amount > 0) {
+ int drainedFluid = Math.min(fluidStackStored.amount, amount);
+ fluidStackOutput = fluidStackStored.copy();
+ fluidStackOutput.amount = drainedFluid;
+ if (doDrain) {
+ fluidStackStored.amount -= drainedFluid;
+ if (fluidStackStored.amount == 0) {
+ fluidStackStored = null;
+ }
+ setFluidStack(fluidStackStored);
+ }
+ }
+ return fluidStackOutput;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection forgeDirection, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection forgeDirection, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection forgeDirection) {
+ return new FluidTankInfo[]{new FluidTankInfo(getFluidStack(), CAPACITY)};
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkCoverMessage.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkCoverMessage.java
new file mode 100644
index 0000000000..081ce3b309
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkCoverMessage.java
@@ -0,0 +1,132 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import eu.usrv.yamcore.network.client.AbstractClientMessageHandler;
+import eu.usrv.yamcore.network.server.AbstractServerMessageHandler;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import java.io.*;
+import java.util.Arrays;
+
+import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.bindEnderLinkTag;
+import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.getEnderLinkTag;
+import static com.github.technus.tectech.thing.cover.GT_Cover_TM_EnderFluidLink.setEnderLinkTag;
+
+public class EnderLinkCoverMessage implements IMessage {
+ EnderLinkTankWithTag messageData;
+
+ public EnderLinkCoverMessage() {
+ }
+
+ @Override
+ public void fromBytes(ByteBuf pBuffer) {
+ try {
+ //I'd love to know why I need to offset by one byte for this to work
+ byte[] boop = pBuffer.array();
+ boop = Arrays.copyOfRange(boop, 1, boop.length);
+ InputStream is = new ByteArrayInputStream(boop);
+ ObjectInputStream ois = new ObjectInputStream(is);
+ Object data = ois.readObject();
+ messageData = (EnderLinkTankWithTag) data;
+ } catch (Exception ignore) {
+ }
+ }
+
+ @Override
+ public void toBytes(ByteBuf pBuffer) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(messageData);
+ oos.flush();
+ InputStream is = new ByteArrayInputStream(baos.toByteArray());
+ pBuffer.writeBytes(is, baos.toByteArray().length);
+ } catch (Exception ignore) {
+ }
+ }
+
+ public static class EnderLinkCoverQuery extends EnderLinkCoverMessage {
+ public EnderLinkCoverQuery() {
+ }
+
+ public EnderLinkCoverQuery(EnderLinkTag tag, IFluidHandler fluidHandler) {
+ messageData = new EnderLinkTankWithTag(tag, fluidHandler);
+ }
+ }
+
+ public static class EnderLinkCoverUpdate extends EnderLinkCoverMessage {
+ public EnderLinkCoverUpdate() {
+ }
+
+ public EnderLinkCoverUpdate(EnderLinkTag tag, IFluidHandler fluidHandler) {
+ messageData = new EnderLinkTankWithTag(tag, fluidHandler);
+ }
+ }
+
+ public static class EnderLinkCoverData extends EnderLinkCoverMessage {
+ public EnderLinkCoverData() {
+ }
+
+ public EnderLinkCoverData(EnderLinkTag tag, IFluidHandler fluidHandler) {
+ messageData = new EnderLinkTankWithTag(tag, fluidHandler);
+ }
+ }
+
+ public static class ServerHandler extends AbstractServerMessageHandler<EnderLinkCoverQuery> {
+ @Override
+ public IMessage handleServerMessage(EntityPlayer pPlayer, EnderLinkCoverQuery pMessage, MessageContext pCtx) {
+ IMessage reply = null;
+ if (pMessage.messageData != null) {
+ reply = new EnderLinkCoverData(getEnderLinkTag(pMessage.messageData.getFluidHandler()),
+ pMessage.messageData.getFluidHandler());
+ }
+ return reply;
+ }
+ }
+
+ public static class ServerUpdateHandler extends AbstractServerMessageHandler<EnderLinkCoverUpdate> {
+ @Override
+ public IMessage handleServerMessage(EntityPlayer pPlayer, EnderLinkCoverUpdate pMessage, MessageContext pCtx) {
+ if (pMessage.messageData != null) {
+ EnderLinkTag tag = pMessage.messageData.getTag();
+ IFluidHandler handler = pMessage.messageData.getFluidHandler();
+ if (tag.getUUID() == null){
+ bindEnderLinkTag(handler, tag);
+ } else if (handler instanceof BaseMetaTileEntity) {
+ BaseMetaTileEntity baseTile = (BaseMetaTileEntity) handler;
+ if (tag.getUUID() == baseTile.getOwnerUuid()){
+ bindEnderLinkTag(handler, tag);
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class ClientHandler extends AbstractClientMessageHandler<EnderLinkCoverData> {
+ @Override
+ public IMessage handleClientMessage(EntityPlayer pPlayer, EnderLinkCoverData pMessage, MessageContext pCtx) {
+ if (pMessage.messageData != null) {
+ setEnderLinkTag(pMessage.messageData.getTag());
+ }
+ return null;
+ }
+ }
+
+ private static class EnderLinkTankWithTag extends EnderLinkTank {
+ private final EnderLinkTag tag;
+
+ public EnderLinkTankWithTag(EnderLinkTag tag, IFluidHandler fluidHandler) {
+ super(fluidHandler);
+ this.tag = tag;
+ }
+
+ public EnderLinkTag getTag() {
+ return tag;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java
new file mode 100644
index 0000000000..3d7b7a20b8
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java
@@ -0,0 +1,39 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import com.google.common.base.Objects;
+
+import java.awt.*;
+import java.io.Serializable;
+import java.util.UUID;
+
+public class EnderLinkTag implements Serializable {
+ private final Color color;
+ private final UUID player;
+
+ public EnderLinkTag(Color color, UUID player) {
+ this.color = color;
+ this.player = player;
+ }
+
+ public int getColorInt() {
+ return color.getRGB();
+ }
+
+ public UUID getUUID() {
+ return player;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EnderLinkTag that = (EnderLinkTag) o;
+ return Objects.equal(color, that.color) &&
+ Objects.equal(player, that.player);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(color, player);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java
new file mode 100644
index 0000000000..a64a629161
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java
@@ -0,0 +1,46 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import com.google.common.base.Objects;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import java.io.Serializable;
+
+public class EnderLinkTank implements Serializable {
+ private final int X;
+ private final int Y;
+ private final int Z;
+ private final int D;
+
+ public EnderLinkTank(IFluidHandler fluidHandler) {
+ TileEntity tile = (TileEntity)fluidHandler;
+ X = tile.xCoord;
+ Y = tile.yCoord;
+ Z = tile.zCoord;
+ D = tile.getWorldObj().provider.dimensionId;
+ }
+
+ public IFluidHandler getFluidHandler() {
+ IFluidHandler fluidHandler = null;
+ TileEntity tile = DimensionManager.getWorld(D).getTileEntity(X, Y, Z);
+ if (tile instanceof IFluidHandler) fluidHandler = (IFluidHandler) tile;
+ return fluidHandler;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EnderLinkTank that = (EnderLinkTank) o;
+ return X == that.X &&
+ Y == that.Y &&
+ Z == that.Z &&
+ D == that.D;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(X, Y, Z, D);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java
new file mode 100644
index 0000000000..6afa3a494f
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java
@@ -0,0 +1,129 @@
+package com.github.technus.tectech.mechanics.enderStorage;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.storage.MapStorage;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import java.awt.*;
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.github.technus.tectech.Reference.MODID;
+
+public class EnderWorldSavedData extends WorldSavedData {
+ private static EnderWorldSavedData INSTANCE;
+
+ private static final String DATA_NAME = MODID + "_EnderWorldSavedData";
+ private static final String ENDER_LIQUID_TAG_LINK = DATA_NAME + "_EnderLiquidTagLink";
+ private static final String ENDER_LIQUID_TANK_LINK = DATA_NAME + "_EnderLiquidTankLink";
+ private static final EnderLinkTag DEFAULT_LINK_TAG = new EnderLinkTag(Color.WHITE, null);
+
+ private Map<EnderLinkTag, EnderFluidContainer> EnderLiquidTagLink = new HashMap<>();
+ private Map<EnderLinkTank, EnderLinkTag> EnderLiquidTankLink = new HashMap<>();
+
+ public EnderWorldSavedData() {
+ super(DATA_NAME);
+ }
+
+ public EnderWorldSavedData(String s) {
+ super(s);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound nbtTagCompound) {
+ try {
+ byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TAG_LINK);
+ InputStream is = new ByteArrayInputStream(ba);
+ ObjectInputStream ois = new ObjectInputStream(is);
+ Object data = ois.readObject();
+ EnderLiquidTagLink = (Map<EnderLinkTag, EnderFluidContainer>) data;
+ } catch (IOException | ClassNotFoundException ignored) {
+ System.out.println("ENDER_LIQUID_TAG_LINK LOAD FAILED");
+ System.out.println(ignored);
+ }
+
+ try {
+ byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TANK_LINK);
+ InputStream is = new ByteArrayInputStream(ba);
+ ObjectInputStream ois = new ObjectInputStream(is);
+ Object data = ois.readObject();
+ EnderLiquidTankLink = (Map<EnderLinkTank, EnderLinkTag>) data;
+ } catch (IOException | ClassNotFoundException ignored) {
+ System.out.println("ENDER_LIQUID_TANK_LINK LOAD FAILED");
+ System.out.println(ignored);
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbtTagCompound) {
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(EnderLiquidTagLink);
+ oos.flush();
+ byte[] data = bos.toByteArray();
+ nbtTagCompound.setByteArray(ENDER_LIQUID_TAG_LINK, data);
+ } catch (IOException ignored) {
+ System.out.println("ENDER_LIQUID_TAG_LINK SAVE FAILED");
+ System.out.println(ignored);
+ }
+
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeObject(EnderLiquidTankLink);
+ oos.flush();
+ byte[] data = bos.toByteArray();
+ nbtTagCompound.setByteArray(ENDER_LIQUID_TANK_LINK, data);
+ } catch (IOException ignored) {
+ System.out.println("ENDER_LIQUID_TANK_LINK SAVE FAILED");
+ System.out.println(ignored);
+ }
+ }
+
+ private static void loadInstance() {
+ if (INSTANCE == null) {
+ MapStorage storage = DimensionManager.getWorld(0).mapStorage;
+ INSTANCE = (EnderWorldSavedData) storage.loadData(EnderWorldSavedData.class, DATA_NAME);
+ if (INSTANCE == null) {
+ INSTANCE = new EnderWorldSavedData();
+ storage.setData(DATA_NAME, INSTANCE);
+ }
+ }
+ INSTANCE.markDirty();
+ }
+
+ private static Map<EnderLinkTag, EnderFluidContainer> getEnderLiquidLink() {
+ loadInstance();
+ return INSTANCE.EnderLiquidTagLink;
+ }
+
+ private static Map<EnderLinkTank, EnderLinkTag> getEnderLiquidTankLink() {
+ loadInstance();
+ return INSTANCE.EnderLiquidTankLink;
+ }
+
+ public static EnderFluidContainer getEnderFluidContainer(EnderLinkTag tag) {
+ if (!getEnderLiquidLink().containsKey(tag)) {
+ getEnderLiquidLink().put(tag, new EnderFluidContainer());
+ }
+ return getEnderLiquidLink().get(tag);
+ }
+
+ public static EnderLinkTag getEnderLinkTag(IFluidHandler handler) {
+ EnderLinkTank tank = new EnderLinkTank(handler);
+ if (!getEnderLiquidTankLink().containsKey(tank)) {
+ getEnderLiquidTankLink().put(tank, DEFAULT_LINK_TAG);
+ }
+ return getEnderLiquidTankLink().get(tank);
+ }
+
+ public static void bindEnderLinkTag(IFluidHandler handler, EnderLinkTag tag) {
+ EnderLinkTank tank = new EnderLinkTank(handler);
+ getEnderLiquidTankLink().remove(tank);
+ getEnderLiquidTankLink().put(tank, tag);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
index a86695ff4a..9bd69c67ed 100644
--- a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
+++ b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
@@ -94,7 +94,7 @@ public enum CustomItemList implements IItemContainer {
eM_avr_HV, eM_avr_EV, eM_avr_IV, eM_avr_LuV, eM_avr_ZPM, eM_avr_UV, eM_avr_UHV, eM_avr_UEV, eM_avr_UIV, eM_avr_UMV,
- scanContainer, parametrizerMemory, teslaCapacitor, teslaCover, teslaComponent, teslaStaff,
+ scanContainer, parametrizerMemory, teslaCapacitor, teslaCover, teslaComponent, teslaStaff, enderLinkFluidCover,
Machine_TeslaCoil_1by1_LV, Machine_TeslaCoil_1by1_MV, Machine_TeslaCoil_1by1_HV, Machine_TeslaCoil_1by1_EV, Machine_TeslaCoil_1by1_IV,
Machine_TeslaCoil_2by2_LV, Machine_TeslaCoil_2by2_MV, Machine_TeslaCoil_2by2_HV, Machine_TeslaCoil_2by2_EV, Machine_TeslaCoil_2by2_IV,
diff --git a/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java
new file mode 100644
index 0000000000..03c612c190
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java
@@ -0,0 +1,355 @@
+package com.github.technus.tectech.thing.cover;
+
+import com.github.technus.tectech.loader.NetworkDispatcher;
+import com.github.technus.tectech.mechanics.enderStorage.EnderLinkCoverMessage;
+import com.github.technus.tectech.mechanics.enderStorage.EnderLinkTag;
+import eu.usrv.yamcore.auxiliary.PlayerChatHelper;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.GT_GUICover;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiIconButton;
+import gregtech.api.gui.widgets.GT_GuiIntegerTextBox;
+import gregtech.api.interfaces.IGuiScreen;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.net.GT_Packet_TileEntityCover;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import java.awt.*;
+import java.util.UUID;
+
+import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.*;
+
+public class GT_Cover_TM_EnderFluidLink extends GT_CoverBehavior {
+ private static final int L_PER_TICK = 8000;
+ private final static int IMPORT_EXPORT_MASK = 0b0001;
+ private final static int PUBLIC_PRIVATE_MASK = 0b0010;
+ private static EnderLinkTag tag = new EnderLinkTag(Color.WHITE, null);//Client-Sided
+
+ public GT_Cover_TM_EnderFluidLink() {
+ }
+
+ public static void setEnderLinkTag(EnderLinkTag inputTag) {
+ if(inputTag != null) {
+ tag = inputTag;
+ //Hacky Way to update the gui
+ GUI_INSTANCE.resetColorField();
+ }
+ }
+
+ private void transferFluid(IFluidHandler source, byte sSide, IFluidHandler target, byte tSide, int amount) {
+ FluidStack fluidStack = source.drain(ForgeDirection.getOrientation(sSide), amount, false);
+
+ if (fluidStack != null) {
+ int fluidTransferred = target.fill(ForgeDirection.getOrientation(tSide), fluidStack, true);
+ source.drain(ForgeDirection.getOrientation(sSide), fluidTransferred, true);
+ }
+ }
+
+ private boolean testBit(int aCoverVariable, int bitMask) {
+ return (aCoverVariable & bitMask) != 0;
+ }
+
+ private int toggleBit(int aCoverVariable, int bitMask) {
+ return (aCoverVariable ^ bitMask);
+ }
+
+ @Override
+ public int doCoverThings(byte aSide, byte aInputRedstone, int aCoverID, int aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ if ((aTileEntity instanceof IFluidHandler)) {
+ IFluidHandler fluidHandlerSelf = (IFluidHandler) aTileEntity;
+ IFluidHandler fluidHandlerEnder = getEnderFluidContainer(getEnderLinkTag((IFluidHandler) aTileEntity));
+
+ if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) {
+ transferFluid(fluidHandlerEnder, (byte) 6, fluidHandlerSelf, aSide, L_PER_TICK);
+ } else {
+ transferFluid(fluidHandlerSelf, aSide, fluidHandlerEnder, (byte) 6, L_PER_TICK);
+ }
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public String getDescription(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return "";
+ }
+
+ @Override
+ public boolean letsFluidIn(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int newCoverVariable = toggleBit(aCoverVariable, IMPORT_EXPORT_MASK);
+
+ if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) {
+ PlayerChatHelper.SendInfo(aPlayer, "Ender Suction Engaged!");//TODO Translation support
+ } else {
+ PlayerChatHelper.SendInfo(aPlayer, "Ender Filling Engaged!");
+ }
+ return newCoverVariable;
+ }
+
+ @Override
+ public int getTickRate(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ //Runs each tick
+ return 1;
+ }
+
+ //region GUI
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) {
+ //Only open gui if we're placed on a fluid tank
+ Object gui = null;
+ if (aTileEntity instanceof IFluidHandler) {
+ gui = new TM_EnderFluidLinkCover(aSide, aCoverID, coverData, aTileEntity);
+ }
+ return gui;
+ }
+
+ private static TM_EnderFluidLinkCover GUI_INSTANCE;
+
+ private class TM_EnderFluidLinkCover extends GT_GUICover {
+ private final byte side;
+ private final int coverID;
+ private int coverVariable;
+ private GT_GuiIntegerHexTextBox colorField;
+
+ private final static int START_X = 10;
+ private final static int START_Y = 25;
+ private final static int SPACE_X = 18;
+ private final static int SPACE_Y = 18;
+
+ private final static int SIZE_X = 176;
+ private final static int SIZE_Y = 107;
+
+ private final static int BOX_SIZE_X = 34;
+ private final static int BOX_SIZE_Y = 34;
+
+ private final static int TEXT_FIELD_SIZE_X = 72;
+ private final static int TEXT_FIELD_SIZE_Y = 12;
+ private final static int TEXT_STRING_LENGTH = 9;
+
+ private final static int FONT_COLOR = 0xFF555555;
+ private final static int BOX_BORDER_COLOR = 0xFF000000;
+
+ private final static int COLOR_FIELD_ID = 0;
+ private final static int PUBLIC_BUTTON_ID = 1;
+ private final static int PRIVATE_BUTTON_ID = 2;
+ private final static int IMPORT_BUTTON_ID = 3;
+ private final static int EXPORT_BUTTON_ID = 4;
+
+ private GT_GuiIconButton newButtonWithSpacing(int id, int x, int y, GT_GuiIcon icon) {
+ return new GT_GuiIconButton(this, id, START_X + SPACE_X * x, START_Y + SPACE_Y * y, icon);
+ }
+
+ private GT_GuiIntegerHexTextBox newTextField(int id, int x, int y) {
+ GT_GuiIntegerHexTextBox field = new GT_GuiIntegerHexTextBox(this, id, START_X + SPACE_X * x,
+ START_Y + SPACE_Y * y, TEXT_FIELD_SIZE_X, TEXT_FIELD_SIZE_Y);
+ field.setMaxStringLength(TEXT_STRING_LENGTH);
+ return field;
+ }
+
+ private int drawNewString(String text, int x, int y) {
+ int align = 4;
+ return fontRendererObj.drawString(text, START_X + SPACE_X * x, align + START_Y + SPACE_Y * y, FONT_COLOR);
+ }
+
+ private void drawColorSquare(int x, int y) {
+ //Draw the border square
+ int borderX1 = START_X + SPACE_X * x;
+ int borderY1 = START_Y + SPACE_Y * y;
+ int borderX2 = borderX1 + BOX_SIZE_X;
+ int borderY2 = borderY1 + BOX_SIZE_Y;
+ drawRect(borderX1, borderY1, borderX2, borderY2, BOX_BORDER_COLOR);
+
+ //Draw Checkerboard Pattern
+ int white = 0xFFFFFFFF;
+ int grey = 0xFFBFBFBF;
+ boolean whiteOrGrey = true;
+ int cGridXStart = borderX1 + 1;
+ int cGridYStart = borderY1 + 1;
+ int cGridXToDraw = 4;
+ int cGridYToDraw = 4;
+ int cSquareWidth = 8;
+ int cSquareHeight = 8;
+ for (int i = 0; i < cGridXToDraw; i++) {
+ for (int j = 0; j < cGridYToDraw; j++) {
+ int cBoxX1 = cGridXStart + (cSquareWidth * i);
+ int cBoxY1 = cGridYStart + (cSquareHeight * j);
+ int cBoxX2 = cBoxX1 + cSquareWidth;
+ int cBoxY2 = cBoxY1 + cSquareHeight;
+ int cBoxColor = whiteOrGrey ? white : grey;
+ drawRect(cBoxX1, cBoxY1, cBoxX2, cBoxY2, cBoxColor);
+ whiteOrGrey = !whiteOrGrey;
+ }
+ whiteOrGrey = !whiteOrGrey;
+ }
+
+ //Draw the actual color
+ int insideX1 = borderX1 + 1;
+ int insideY1 = borderY1 + 1;
+ int insideX2 = borderX2 - 1;
+ int insideY2 = borderY2 - 1;
+ drawRect(insideX1, insideY1, insideX2, insideY2, tag.getColorInt());
+ }
+
+ public TM_EnderFluidLinkCover(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ super(aTileEntity, SIZE_X, SIZE_Y, GT_Utility.intToStack(aCoverID));
+ side = aSide;
+ coverID = aCoverID;
+ coverVariable = aCoverVariable;
+ NetworkDispatcher.INSTANCE.sendToServer(new EnderLinkCoverMessage.EnderLinkCoverQuery(tag, (IFluidHandler) tile));
+ //Color Value Field
+ colorField = newTextField(COLOR_FIELD_ID, 2, 1);
+ GUI_INSTANCE = this;
+ resetColorField();
+ //Public/Private Buttons
+ newButtonWithSpacing(PUBLIC_BUTTON_ID, 0, 2, GT_GuiIcon.WHITELIST)
+ .setTooltipText("Public");
+ newButtonWithSpacing(PRIVATE_BUTTON_ID, 1, 2, GT_GuiIcon.BLACKLIST)
+ .setTooltipText("Private");
+ //Import/Export Buttons
+ newButtonWithSpacing(IMPORT_BUTTON_ID, 0, 3, GT_GuiIcon.IMPORT)
+ .setTooltipText(trans("007", "Import"));
+ newButtonWithSpacing(EXPORT_BUTTON_ID, 1, 3, GT_GuiIcon.EXPORT)
+ .setTooltipText(trans("007", "Export"));
+ }
+
+ @Override
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ super.drawExtras(mouseX, mouseY, parTicks);
+ drawColorSquare(0, 0);
+ drawNewString("Color Value", 2, 0);
+ drawNewString("Public/Private", 2, 2);
+ drawNewString(trans("229", "Import/Export"), 2, 3);
+ }
+
+ @Override
+ protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) {
+ updateButtons();
+ }
+
+ @Override
+ public void buttonClicked(GuiButton btn){
+ if (getClickable(btn.id)){
+ coverVariable = getNewCoverVariable(btn.id);
+ GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile));
+ }
+ updateButtons();
+ }
+
+ private void updateButtons(){
+ GuiButton b;
+ for (Object o : buttonList) {
+ b = (GuiButton) o;
+ b.enabled = getClickable(b.id);
+ }
+ }
+
+ private void switchPrivatePublic(int coverVar) {
+ UUID ownerUUID = tag.getUUID();
+ if (testBit(coverVar, PUBLIC_PRIVATE_MASK)){
+ if (tile instanceof BaseMetaTileEntity){
+ BaseMetaTileEntity mte = (BaseMetaTileEntity) tile;
+ ownerUUID = mte.getOwnerUuid();
+ }
+ } else {
+ ownerUUID = null;
+ }
+ EnderLinkTag newTag = new EnderLinkTag(new Color(tag.getColorInt(), true), ownerUUID);
+ NetworkDispatcher.INSTANCE.sendToServer(new EnderLinkCoverMessage.EnderLinkCoverUpdate(newTag, (IFluidHandler) tile));
+ }
+
+ private int getNewCoverVariable(int id) {
+ int tempCoverVariable = coverVariable;
+ switch (id) {
+ case PUBLIC_BUTTON_ID: case PRIVATE_BUTTON_ID:
+ tempCoverVariable = toggleBit(tempCoverVariable, PUBLIC_PRIVATE_MASK);
+ switchPrivatePublic(tempCoverVariable);
+ break;
+ case IMPORT_BUTTON_ID: case EXPORT_BUTTON_ID:
+ tempCoverVariable = toggleBit(tempCoverVariable, IMPORT_EXPORT_MASK);
+ }
+ return tempCoverVariable;
+ }
+
+ private boolean getClickable(int id) {
+ boolean canBeClicked = false;
+ switch (id) {
+ case PUBLIC_BUTTON_ID:
+ canBeClicked = testBit(coverVariable, PUBLIC_PRIVATE_MASK);
+ break;
+ case PRIVATE_BUTTON_ID:
+ canBeClicked = !testBit(coverVariable, PUBLIC_PRIVATE_MASK);
+ break;
+ case IMPORT_BUTTON_ID:
+ canBeClicked = testBit(coverVariable, IMPORT_EXPORT_MASK);
+ break;
+ case EXPORT_BUTTON_ID:
+ canBeClicked = !testBit(coverVariable, IMPORT_EXPORT_MASK);
+ }
+ return canBeClicked;
+ }
+
+ @Override
+ public void applyTextBox(GT_GuiIntegerTextBox box) {
+ try {
+ String string = box.getText();
+ int colorValue = (int) Long.parseLong(string.replaceFirst("#", ""), 16);
+ tag = new EnderLinkTag(new Color(colorValue, true), tag.getUUID());
+ NetworkDispatcher.INSTANCE.sendToServer(new EnderLinkCoverMessage.EnderLinkCoverUpdate(tag, (IFluidHandler) tile));
+ } catch (NumberFormatException ignored) {
+ }
+ resetColorField();
+ }
+
+ @Override
+ public void resetTextBox(GT_GuiIntegerTextBox box) {
+ //Solid White becomes: #FFFFFFFF
+ box.setText("#" + String.format("%08X", tag.getColorInt()));
+ }
+
+ public void resetColorField() {
+ resetTextBox(colorField);
+ }
+
+ private class GT_GuiIntegerHexTextBox extends GT_GuiIntegerTextBox {
+ public GT_GuiIntegerHexTextBox(IGuiScreen gui, int id, int x, int y, int width, int height) {
+ super(gui, id, x, y, width, height);
+ }
+
+ @Override
+ public boolean validChar(char c, int key) {
+ boolean isValid;
+ if (getCursorPosition() == 0) {
+ isValid = c == '#';
+ } else {
+ isValid = super.validChar(c, key)
+ || c == 'A' || c == 'B' || c == 'C' || c == 'D' || c == 'E' || c == 'F'
+ || c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f';
+ }
+ return isValid;
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java b/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java
new file mode 100644
index 0000000000..57a882ec26
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java
@@ -0,0 +1,47 @@
+package com.github.technus.tectech.thing.item;
+
+import com.github.technus.tectech.util.CommonValues;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import java.util.List;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.thing.CustomItemList.enderLinkFluidCover;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+public final class EnderFluidLinkCover extends Item {
+ public static EnderFluidLinkCover INSTANCE;
+
+ private EnderFluidLinkCover() {
+ setHasSubtypes(true);
+ setUnlocalizedName("tm.enderfluidlinkcover");
+ setTextureName(MODID + ":itemEnderFluidLinkCover");
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer ep, List aList, boolean boo) {
+ aList.add(CommonValues.BASS_MARK);
+ aList.add(translateToLocal("item.tm.enderfluidlinkcover.desc.0"));//Ender-Fluid-Enables Machines!
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.1"));//Use on any side of a fluid tank to link it to the Ender
+ aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.2"));//Ender Tanks so are laggy -Bot from the Chads of NH
+ }
+
+ public static void run() {
+ INSTANCE = new EnderFluidLinkCover();
+ GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName());
+ enderLinkFluidCover.set(INSTANCE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ itemIcon = iconRegister.registerIcon(getIconString());
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png
new file mode 100644
index 0000000000..010bc0888d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang
index b81b865b22..9f49d692b8 100644
--- a/src/main/resources/assets/tectech/lang/en_US.lang
+++ b/src/main/resources/assets/tectech/lang/en_US.lang
@@ -87,6 +87,11 @@ item.tm.teslaCover.desc.4=Who the hell uses cables anyway?
item.tm.teslaStaff.name=Tesla Staff
item.tm.teslaStaff.desc=Power of the gods, at the whim of a mortal!
+item.tm.enderfluidlinkcover.name=Ender Fluid Link Cover
+item.tm.enderfluidlinkcover.desc.0=Ender-Fluid-Enables Machines!
+item.tm.enderfluidlinkcover.desc.1=Use on any side of a fluid tank to link it to the Ender
+item.tm.enderfluidlinkcover.desc.2=Ender Tanks so are laggy -Bot from the Chads of NH
+
#Death Messages
death.attack.microwaving=%1$s was dehydrated by radiation.
death.attack.microwaving.player=%1$s was dehydrated by radiation while fighting %2$s.
diff --git a/src/main/resources/assets/tectech/lang/zh_CN.lang b/src/main/resources/assets/tectech/lang/zh_CN.lang
index cfa23fb88d..c01c8f2757 100644
--- a/src/main/resources/assets/tectech/lang/zh_CN.lang
+++ b/src/main/resources/assets/tectech/lang/zh_CN.lang
@@ -42,7 +42,7 @@ item.em.constructable.desc.0=触发可构造界面
item.em.constructable.desc.1=显示多方块结构细节,
item.em.constructable.desc.2=只可在多方块控制器上使用.
item.em.constructable.desc.3=(在创造模式下潜行右键可直接构造)
-item.em.constructable.desc.4=数量影响等级/模式/类型
+item.em.constructable.desc.4=堆叠数量影响等级/模式/类型
item.em.EuMeterGT.name=GT EU电表
item.em.EuMeterGT.desc.0=测量EU相关的基本内容
@@ -64,6 +64,8 @@ item.tm.teslaCoilCapacitor.1.name=MV特斯拉电容
item.tm.teslaCoilCapacitor.2.name=HV特斯拉电容
item.tm.teslaCoilCapacitor.3.name=EV特斯拉电容
item.tm.teslaCoilCapacitor.4.name=IV特斯拉电容
+item.tm.teslaCoilCapacitor.5.name=LuV特斯拉电容
+item.tm.teslaCoilCapacitor.6.name=ZPM特斯拉电容
item.tm.teslaCoilCapacitor.desc.0=存储量:
item.tm.teslaCoilCapacitor.desc.1=EU;充能速度:
item.tm.teslaCoilCapacitor.desc.2=把这个破碎的东西浸入某种辛辣的水中!
@@ -402,12 +404,12 @@ gt.blockmachines.hatch.certain.tier.10.name=未定元解析器 X
gt.blockmachines.hatch.certain.desc.0=你真的很确定吗?
gt.blockmachines.hatch.certain.desc.1=盒子里的薛定谔方程
-gt.blockmachines.hatch.datain.tier.07.name=副光学连接端口
+gt.blockmachines.hatch.datain.tier.07.name=副光学接口
gt.blockmachines.hatch.datain.desc.0=多方块机器的数据输入
gt.blockmachines.hatch.datain.desc.1=高速光纤接口
gt.blockmachines.hatch.datain.desc.2=启用前必须涂色
-gt.blockmachines.hatch.dataout.tier.07.name=主光学连接端口
+gt.blockmachines.hatch.dataout.tier.07.name=主光学接口
gt.blockmachines.hatch.dataout.desc.0=多方块机器的数据输出
gt.blockmachines.hatch.dataout.desc.1=高速光纤接口
gt.blockmachines.hatch.dataout.desc.2=启用前必须涂色
@@ -518,6 +520,7 @@ gt.blockcasingsBA0.2.name=HV超导初级特斯拉绕组
gt.blockcasingsBA0.3.name=EV超导初级特斯拉绕组
gt.blockcasingsBA0.4.name=IV超导初级特斯拉绕组
gt.blockcasingsBA0.5.name=LuV超导初级特斯拉绕组
+gt.blockcasingsBA0.9.name=ZPM超导初级特斯拉绕组
gt.blockcasingsBA0.0.desc.0=最高电圧
gt.blockcasingsBA0.0.desc.1=有的人称这为神迹,另一些人把这叫做物理.
gt.blockcasingsBA0.6.name=特斯拉基座机械方块
@@ -575,12 +578,12 @@ gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7=充能进度显示
gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8=扫描时间显示
gt.blockmachines.multimachine.em.switch.name=QoS网络交换机
-gt.blockmachines.multimachine.em.switch.hint=1 - 基础仓室、光学连接端口或电子计算机机械方块
+gt.blockmachines.multimachine.em.switch.hint=1 - 基础仓室、光学接口或电子计算机机械方块
gt.blockmachines.multimachine.em.switch.desc.0=用户控制的计算力路由
gt.blockmachines.multimachine.em.switch.desc.1=服务质量是必须的
gt.blockmachines.multimachine.em.computer.name=量子计算机
-gt.blockmachines.multimachine.em.computer.hint.0=1 - 基础仓室、光学连接端口或电子计算机机械方块
+gt.blockmachines.multimachine.em.computer.hint.0=1 - 基础仓室、光学接口或电子计算机机械方块
gt.blockmachines.multimachine.em.computer.hint.1=2 - 计算机箱或进阶电子计算机械方块
gt.blockmachines.multimachine.em.computer.desc=你需要它来处理上面的这串数字
gt.blockmachines.multimachine.em.computer.cfgi.0=超频比
@@ -639,7 +642,7 @@ gt.blockmachines.multimachine.em.scanner.desc.0=它是如何存在的?
gt.blockmachines.multimachine.em.scanner.desc.1=我!不!知!道!(至少暂时是这样)
gt.blockmachines.multimachine.em.research.name=研究站
-gt.blockmachines.multimachine.em.research.hint.0=1 - 基础仓室、光学连接端口或电子计算机械方块
+gt.blockmachines.multimachine.em.research.hint.0=1 - 基础仓室、光学接口或电子计算机械方块
gt.blockmachines.multimachine.em.research.hint.1=2 - 物品固定容器
gt.blockmachines.multimachine.em.research.desc.0=哲学家们甚至...
gt.blockmachines.multimachine.em.research.desc.1=从来不曾梦见它!
@@ -762,7 +765,7 @@ gt.blockmachines.machine.tt.tesla.desc.1=富人的闪电洪炉
gt.blockmachines.debug.tt.pollutor.name=Debug污染生成机
gt.blockmachines.debug.tt.pollutor.desc.0=该死的genny破产了!
gt.blockmachines.debug.tt.pollutor.desc.1=无限的生产者/消费者
-gt.blockmachines.debug.tt.pollutor.desc.2=我只是想要一个?
+gt.blockmachines.debug.tt.pollutor.desc.2=因为我需要一个?
gt.blockmachines.debug.tt.data.name=Debug数据仓
gt.blockmachines.debug.tt.data.desc.0=量子数据输出
gt.blockmachines.debug.tt.data.desc.1=高速光纤接口
@@ -811,7 +814,7 @@ tt.keyword.Efficiency=效率
#Button that allows to pass power to other machines
tt.keyword.PowerPass=导能
#Button that vents EM
-tt.keyword.SafeVoid=安全罩
+tt.keyword.SafeVoid=安全销毁
tt.keyword.Parametrizer=参数仪
tt.keyword.Value=值
tt.keyword.Input=输入
@@ -823,7 +826,7 @@ tt.keyword.PacketHistory=封包记录
tt.keyphrase.LIFE_TIME=寿命
tt.keyphrase.CARRIES_COLOR=有色
-tt.keyphrase.提示方块:Details=提示细节
+tt.keyphrase.Hint_Details=提示细节
tt.keyphrase.At_current_energy_level=在当前能级
#Used when 0 Elemental Matter Stacks
tt.keyphrase.No_Stacks=空
diff --git a/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png b/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png
new file mode 100644
index 0000000000..201f7e4090
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png
Binary files differ