aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java3
-rw-r--r--src/main/java/gregtech/common/GT_Client.java1
-rw-r--r--src/main/java/gregtech/common/GT_Network.java5
-rw-r--r--src/main/java/gregtech/common/GT_Proxy.java9
-rw-r--r--src/main/java/gregtech/common/gui/GT_ContainerVolumetricFlask.java20
-rw-r--r--src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java222
-rw-r--r--src/main/java/gregtech/common/items/GT_VolumetricFlask.java290
-rw-r--r--src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java42
-rw-r--r--src/main/java/gregtech/common/render/GT_FlaskRenderer.java89
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java3
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java2
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/VolumetricFlask.pngbin0 -> 663 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.pngbin0 -> 1041 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.pngbin0 -> 409 bytes
14 files changed, 683 insertions, 3 deletions
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
index 12db03e068..5b25e5a3d2 100644
--- a/src/main/java/gregtech/api/enums/ItemList.java
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -686,7 +686,8 @@ public enum ItemList implements IItemContainer {
Machine_LV_CircuitAssembler, Machine_MV_CircuitAssembler, Machine_HV_CircuitAssembler, Machine_EV_CircuitAssembler, Machine_IV_CircuitAssembler, Machine_LuV_CircuitAssembler, Machine_ZPM_CircuitAssembler, Machine_UV_CircuitAssembler, Circuit_Integrated_Good, Machine_IV_LightningRod, Machine_HV_LightningRod, Machine_EV_LightningRod,
ULV_Coil, LV_Coil, MV_Coil, HV_Coil, EV_Coil, IV_Coil, LuV_Coil, ZPM_Coil, UV_Coil, UHV_Coil,
Depleted_MNq_1, Depleted_MNq_2, Depleted_MNq_4,
- MNqCell_1, MNqCell_2, MNqCell_4,;
+ MNqCell_1, MNqCell_2, MNqCell_4,
+ VOLUMETRIC_FLASK;
public static final ItemList[]
DYE_ONLY_ITEMS = {Color_00, Color_01, Color_02, Color_03, Color_04, Color_05, Color_06, Color_07, Color_08, Color_09, Color_10, Color_11, Color_12, Color_13, Color_14, Color_15}, SPRAY_CAN_DYES = {Spray_Color_00, Spray_Color_01, Spray_Color_02, Spray_Color_03, Spray_Color_04, Spray_Color_05, Spray_Color_06, Spray_Color_07, Spray_Color_08, Spray_Color_09, Spray_Color_10, Spray_Color_11, Spray_Color_12, Spray_Color_13, Spray_Color_14, Spray_Color_15}, SPRAY_CAN_DYES_USED = {Spray_Color_Used_00, Spray_Color_Used_01, Spray_Color_Used_02, Spray_Color_Used_03, Spray_Color_Used_04, Spray_Color_Used_05, Spray_Color_Used_06, Spray_Color_Used_07, Spray_Color_Used_08, Spray_Color_Used_09, Spray_Color_Used_10, Spray_Color_Used_11, Spray_Color_Used_12, Spray_Color_Used_13, Spray_Color_Used_14, Spray_Color_Used_15}, TRANSFORMERS = {Transformer_LV_ULV, Transformer_MV_LV, Transformer_HV_MV, Transformer_EV_HV, Transformer_IV_EV, Transformer_LuV_IV, Transformer_ZPM_LuV, Transformer_UV_ZPM, Transformer_MAX_UV}, MACHINE_HULLS = {Hull_ULV, Hull_LV, Hull_MV, Hull_HV, Hull_EV, Hull_IV, Hull_LuV, Hull_ZPM, Hull_UV, Hull_MAX}, HATCHES_DYNAMO = {Hatch_Dynamo_ULV, Hatch_Dynamo_LV, Hatch_Dynamo_MV, Hatch_Dynamo_HV, Hatch_Dynamo_EV, Hatch_Dynamo_IV, Hatch_Dynamo_LuV, Hatch_Dynamo_ZPM, Hatch_Dynamo_UV, Hatch_Dynamo_MAX}, HATCHES_ENERGY = {Hatch_Energy_ULV, Hatch_Energy_LV, Hatch_Energy_MV, Hatch_Energy_HV, Hatch_Energy_EV, Hatch_Energy_IV, Hatch_Energy_LuV, Hatch_Energy_ZPM, Hatch_Energy_UV, Hatch_Energy_MAX}, HATCHES_INPUT = {Hatch_Input_ULV, Hatch_Input_LV, Hatch_Input_MV, Hatch_Input_HV, Hatch_Input_EV, Hatch_Input_IV, Hatch_Input_LuV, Hatch_Input_ZPM, Hatch_Input_UV, Hatch_Input_MAX}, HATCHES_INPUT_BUS = {Hatch_Input_Bus_ULV, Hatch_Input_Bus_LV, Hatch_Input_Bus_MV, Hatch_Input_Bus_HV, Hatch_Input_Bus_EV, Hatch_Input_Bus_IV, Hatch_Input_Bus_LuV, Hatch_Input_Bus_ZPM, Hatch_Input_Bus_UV, Hatch_Input_Bus_MAX}, HATCHES_OUTPUT = {Hatch_Output_ULV, Hatch_Output_LV, Hatch_Output_MV, Hatch_Output_HV, Hatch_Output_EV, Hatch_Output_IV, Hatch_Output_LuV, Hatch_Output_ZPM, Hatch_Output_UV, Hatch_Output_MAX}, HATCHES_OUTPUT_BUS = {Hatch_Output_Bus_ULV, Hatch_Output_Bus_LV, Hatch_Output_Bus_MV, Hatch_Output_Bus_HV, Hatch_Output_Bus_EV, Hatch_Output_Bus_IV, Hatch_Output_Bus_LuV, Hatch_Output_Bus_ZPM, Hatch_Output_Bus_UV, Hatch_Output_Bus_MAX}, HATCHES_MUFFLER = {Hatch_Muffler_LV, Hatch_Muffler_LV, Hatch_Muffler_MV, Hatch_Muffler_HV, Hatch_Muffler_EV, Hatch_Muffler_IV, Hatch_Muffler_LuV, Hatch_Muffler_ZPM, Hatch_Muffler_UV, Hatch_Muffler_MAX};
public static Fluid sOilExtraHeavy, sEpichlorhydrin, sDrillingFluid, sNitricAcid, sBlueVitriol, sNickelSulfate, sToluene, sNitrationMixture, sRocketFuel, sHydricSulfur, sIndiumConcentrate, sLeadZincSolution, sHydrochloricAcid;
diff --git a/src/main/java/gregtech/common/GT_Client.java b/src/main/java/gregtech/common/GT_Client.java
index 272a6bfa6e..1345042b45 100644
--- a/src/main/java/gregtech/common/GT_Client.java
+++ b/src/main/java/gregtech/common/GT_Client.java
@@ -308,6 +308,7 @@ public class GT_Client extends GT_Proxy
new GT_MetaGenerated_Tool_Renderer();
new GT_Renderer_Entity_Arrow(GT_Entity_Arrow.class, "arrow");
new GT_Renderer_Entity_Arrow(GT_Entity_Arrow_Potion.class, "arrow_potions");
+ new GT_FlaskRenderer();
}
public void onPostLoad() {
diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java
index 1371b6485c..79c13156d7 100644
--- a/src/main/java/gregtech/common/GT_Network.java
+++ b/src/main/java/gregtech/common/GT_Network.java
@@ -6,10 +6,12 @@ import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import cpw.mods.fml.common.network.FMLOutboundHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
+import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.relauncher.Side;
import gregtech.api.enums.GT_Values;
import gregtech.api.net.*;
import gregtech.common.blocks.GT_Packet_Ores;
+import gregtech.common.net.MessageSetFlaskCapacity;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
@@ -31,8 +33,11 @@ public class GT_Network
implements IGT_NetworkHandler {
private final EnumMap<Side, FMLEmbeddedChannel> mChannel;
private final GT_Packet[] mSubChannels;
+ public final SimpleNetworkWrapper networkWrapper;
public GT_Network() {
+ networkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("gregtech_network_wrapper");
+ networkWrapper.registerMessage(MessageSetFlaskCapacity.Handler.class, MessageSetFlaskCapacity.class, 0, Side.SERVER);
this.mChannel = NetworkRegistry.INSTANCE.newChannel("GregTech", new ChannelHandler[]{this, new HandlerShared()});
this.mSubChannels = new GT_Packet[]{new GT_Packet_TileEntity(), new GT_Packet_Sound(), new GT_Packet_Block_Event(), new GT_Packet_Ores(), new GT_Packet_Pollution()};
}
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
index bf79b49133..2486d4d241 100644
--- a/src/main/java/gregtech/common/GT_Proxy.java
+++ b/src/main/java/gregtech/common/GT_Proxy.java
@@ -26,6 +26,7 @@ import gregtech.api.net.GT_Packet_Pollution;
import gregtech.api.objects.*;
import gregtech.api.util.*;
import gregtech.common.entities.GT_Entity_Arrow;
+import gregtech.common.gui.GT_ContainerVolumetricFlask;
import gregtech.common.items.GT_MetaGenerated_Tool_01;
import gregtech.common.items.armor.ModularArmor_Item;
import gregtech.common.items.armor.gui.*;
@@ -1461,7 +1462,9 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
return new ContainerElectricArmor1(aPlayer, new InventoryArmor(ModularArmor_Item.class, aPlayer.getCurrentEquippedItem()));
case 2:
return new ContainerElectricArmor1(aPlayer, new InventoryArmor(ModularArmor_Item.class, aPlayer.getCurrentEquippedItem()));
- default:
+ case 10:
+ return new GT_ContainerVolumetricFlask(aPlayer.inventory);
+ default:
return getRightItem(aPlayer, ID);
}
}
@@ -1475,7 +1478,9 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
return new ContainerElectricArmor1(aPlayer, new InventoryArmor(ModularArmor_Item.class, aPlayer.getEquipmentInSlot(tSlot)));
case 2:
return new ContainerElectricArmor1(aPlayer, new InventoryArmor(ModularArmor_Item.class, aPlayer.getEquipmentInSlot(tSlot)));
- default:
+ case 10:
+ return new GT_ContainerVolumetricFlask(aPlayer.inventory);
+ default:
return getRightItem(aPlayer, ID);
}
}
diff --git a/src/main/java/gregtech/common/gui/GT_ContainerVolumetricFlask.java b/src/main/java/gregtech/common/gui/GT_ContainerVolumetricFlask.java
new file mode 100644
index 0000000000..2f8fd2a356
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/GT_ContainerVolumetricFlask.java
@@ -0,0 +1,20 @@
+package gregtech.common.gui;
+
+import gregtech.common.items.GT_VolumetricFlask;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.item.ItemStack;
+
+public final class GT_ContainerVolumetricFlask extends Container {
+ ItemStack flask;
+
+ public GT_ContainerVolumetricFlask(InventoryPlayer inventoryPlayer) {
+ flask = inventoryPlayer.getCurrentItem();
+ }
+
+ @Override
+ public boolean canInteractWith(EntityPlayer p) {
+ return (flask != null) && (flask.stackSize > 0) && ((flask.getItem() instanceof GT_VolumetricFlask));
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java b/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java
new file mode 100644
index 0000000000..65b0676534
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java
@@ -0,0 +1,222 @@
+package gregtech.common.gui;
+
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.common.GT_Network;
+import gregtech.common.items.GT_VolumetricFlask;
+import gregtech.common.net.MessageSetFlaskCapacity;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.util.ResourceLocation;
+import org.lwjgl.opengl.GL11;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+
+@SideOnly(Side.CLIENT)
+public final class GT_GUIContainerVolumetricFlask extends GuiContainer {
+ private static final ResourceLocation BACKGROUND = new ResourceLocation("gregtech:textures/gui/VolumetricFlask.png");
+
+ private GuiIntegerBox amount;
+ private GuiButton apply;
+ private GuiButton plus1;
+ private GuiButton plus10;
+ private GuiButton plus100;
+ private GuiButton plus1000;
+ private GuiButton minus1;
+ private GuiButton minus10;
+ private GuiButton minus100;
+ private GuiButton minus1000;
+ private GT_ContainerVolumetricFlask container;
+
+ public GT_GUIContainerVolumetricFlask(GT_ContainerVolumetricFlask container) {
+ super(container);
+ this.container = container;
+ }
+
+ public void initGui() {
+ super.initGui();
+
+ buttonList.add(plus1 = new GuiButton(0, guiLeft + 20, guiTop + 26, 22, 20, "+1"));
+ buttonList.add(plus10 = new GuiButton(0, guiLeft + 48, guiTop + 26, 28, 20, "+10"));
+ buttonList.add(plus100 = new GuiButton(0, guiLeft + 82, guiTop + 26, 32, 20, "+100"));
+ buttonList.add(plus1000 = new GuiButton(0, guiLeft + 120, guiTop + 26, 38, 20, "+1000"));
+
+ buttonList.add(minus1 = new GuiButton(0, guiLeft + 20, guiTop + 75, 22, 20, "-1"));
+ buttonList.add(minus10 = new GuiButton(0, guiLeft + 48, guiTop + 75, 28, 20, "-10"));
+ buttonList.add(minus100 = new GuiButton(0, guiLeft + 82, guiTop + 75, 32, 20, "-100"));
+ buttonList.add(minus1000 = new GuiButton(0, guiLeft + 120, guiTop + 75, 38, 20, "-1000"));
+
+ buttonList.add(apply = new GuiButton(0, guiLeft + 128, guiTop + 51, 38, 20, "Accept"));
+
+ amount = new GuiIntegerBox(fontRendererObj, guiLeft + 62, guiTop + 57, 59, fontRendererObj.FONT_HEIGHT, ((GT_VolumetricFlask) container.flask.getItem()).getMaxCapacity());
+ amount.setEnableBackgroundDrawing(false);
+ amount.setMaxStringLength(16);
+ amount.setTextColor(16777215);
+ amount.setVisible(true);
+ amount.setFocused(true);
+ amount.setText("1");
+ System.out.println(((GT_VolumetricFlask) container.flask.getItem()).getCapacity(container.flask));
+ amount.setText(String.valueOf(((GT_VolumetricFlask) container.flask.getItem()).getCapacity(container.flask)));
+ }
+
+
+ protected final void drawGuiContainerBackgroundLayer(float f, int x, int y) {
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ mc.getTextureManager().bindTexture(BACKGROUND);
+ drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
+
+ try {
+ Long.parseLong(amount.getText());
+ apply.enabled = (amount.getText().length() > 0);
+ } catch (NumberFormatException e) {
+ apply.enabled = false;
+ }
+
+ amount.drawTextBox();
+ }
+
+
+ protected void keyTyped(char character, int key) {
+ if (!checkHotbarKeys(key)) {
+ if (key == 28)
+ actionPerformed(apply);
+ if (((key == 211) || (key == 205) || (key == 203) || (key == 14) || (character == '-') || (Character.isDigit(character))) && (amount.textboxKeyTyped(character, key))) {
+ try {
+ String out = amount.getText();
+ boolean fixed = false;
+ while ((out.startsWith("0")) && (out.length() > 1)) {
+ out = out.substring(1);
+ fixed = true;
+ }
+ if (fixed) {
+ amount.setText(out);
+ }
+ if (out.isEmpty()) {
+ out = "0";
+ }
+ long result = Long.parseLong(out);
+ if (result < 0L) {
+ amount.setText("1");
+ }
+
+ } catch (NumberFormatException localNumberFormatException) {
+ }
+ } else {
+ super.keyTyped(character, key);
+ }
+ }
+ }
+
+ protected void actionPerformed(GuiButton btn) {
+ try {
+ if (btn == apply) {
+ ((GT_Network) GT_Values.NW).networkWrapper.sendToServer(new MessageSetFlaskCapacity(Integer.parseInt(amount.getText())));
+ mc.thePlayer.closeScreen();
+ }
+
+ } catch (NumberFormatException e) {
+ amount.setText("1");
+ }
+
+ boolean isPlus = (btn == plus1) || (btn == plus10) || (btn == plus100) || (btn == plus1000);
+ boolean isMinus = (btn == minus1) || (btn == minus10) || (btn == minus100) || (btn == minus1000);
+
+ if ((isPlus) || (isMinus)) {
+ addQty(getQty(btn));
+ }
+ }
+
+ private void addQty(int i) {
+ try {
+ String out = amount.getText();
+
+ boolean fixed = false;
+ while ((out.startsWith("0")) && (out.length() > 1)) {
+ out = out.substring(1);
+ fixed = true;
+ }
+
+ if (fixed) {
+ amount.setText(out);
+ }
+ if (out.isEmpty()) {
+ out = "0";
+ }
+ long result = Integer.parseInt(out);
+
+ if ((result == 1L) && (i > 1)) {
+ result = 0L;
+ }
+ result += i;
+ if (result < 1L) {
+ result = 1L;
+ }
+ out = Long.toString(result);
+ Integer.parseInt(out);
+ amount.setText(out);
+ } catch (NumberFormatException localNumberFormatException) {
+ }
+ }
+
+
+ protected int getQty(GuiButton btn) {
+ try {
+ DecimalFormat df = new DecimalFormat("+#;-#");
+ return df.parse(btn.displayString).intValue();
+ } catch (ParseException e) {
+ }
+
+ return 0;
+ }
+
+ public class GuiIntegerBox extends GuiTextField {
+ private final int maxValue;
+
+ public GuiIntegerBox(FontRenderer fontRenderer, int x, int y, int width, int height) {
+ this(fontRenderer, x, y, width, height, Integer.MAX_VALUE);
+ }
+
+ public GuiIntegerBox(FontRenderer fontRenderer, int x, int y, int width, int height, int maxValue) {
+ super(fontRenderer, x, y, width, height);
+ this.maxValue = maxValue;
+ }
+
+
+ public void writeText(String selectedText) {
+ String original = getText();
+ super.writeText(selectedText);
+
+ try {
+ int i = Integer.parseInt(getText());
+ if (i > maxValue) {
+ setText(String.valueOf(maxValue));
+ } else if (i < 0) {
+ setText("0");
+ }
+ } catch (NumberFormatException e) {
+ setText(original);
+ }
+ }
+
+
+ public void setText(String s) {
+ try {
+ int i = Integer.parseInt(s);
+ if (i > maxValue) {
+ s = String.valueOf(maxValue);
+ } else if (i < 0) {
+ s = "0";
+ }
+ } catch (NumberFormatException e) {
+ s = String.valueOf(maxValue);
+ }
+ super.setText(s);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
new file mode 100644
index 0000000000..a247b09df9
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
@@ -0,0 +1,290 @@
+
+package gregtech.common.items;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.items.GT_Generic_Item;
+import ic2.core.util.LiquidUtil;
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+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;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.MovingObjectPosition.MovingObjectType;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.*;
+
+import java.util.List;
+
+import static gregtech.api.enums.GT_Values.RES_PATH_ITEM;
+import static ic2.core.util.LiquidUtil.*;
+
+
+public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContainerItem {
+ private final int maxCapacity;
+ @SideOnly(Side.CLIENT)
+ public IIcon iconWindow;
+
+ public GT_VolumetricFlask(String unlocalized, String english, int maxCapacity) {
+ super(unlocalized, english, null);
+ this.maxCapacity = maxCapacity;
+ setMaxStackSize(16);
+ setNoRepair();
+ if (Loader.isModLoaded("NotEnoughItems")) {
+ for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
+ if (fluid != null) {
+ ItemStack stack = new ItemStack(this);
+ setCapacity(stack, getMaxCapacity());
+ fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), true);
+ codechicken.nei.api.API.hideItem(stack);
+ }
+ }
+ }
+ }
+
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ if (!world.isRemote && isEmpty(stack) && getMovingObjectPositionFromPlayer(world, player, true) == null)
+ player.openGui(GT_Values.GT, 1010, world, 0, 0, 0);
+ return super.onItemRightClick(stack, world, player);
+ }
+
+ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float xOffset, float yOffset, float zOffset) {
+ if (player instanceof FakePlayer) {
+ return false;
+ }
+ if (world.isRemote)
+ return false;
+ if (interactWithTank(stack, player, world, x, y, z, side)) {
+ return true;
+ }
+ MovingObjectPosition mop = getMovingObjectPositionFromPlayer(world, player, true);
+ if (mop == null) {
+ return false;
+ }
+ if (mop.typeOfHit == MovingObjectType.BLOCK) {
+ x = mop.blockX;
+ y = mop.blockY;
+ z = mop.blockZ;
+ if (!world.canMineBlock(player, x, y, z) || !player.canPlayerEdit(x, y, z, mop.sideHit, stack)) {
+ return false;
+ }
+ if (collectFluidBlock(stack, player, world, x, y, z)) {
+ return true;
+ }
+ ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[mop.sideHit];
+ FluidStack fluidStack = drainContainerStack(stack, player, 1000, true);
+ if (placeFluid(fluidStack, world, x, y, z) || (player.canPlayerEdit(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, mop.sideHit, stack) && placeFluid(fluidStack, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))) {
+ if (!player.capabilities.isCreativeMode)
+ drainContainerStack(stack, player, 1000, false);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isEmpty(ItemStack stack) {
+ return getFluid(stack) == null;
+ }
+
+ public int getFreeSpace(ItemStack stack) {
+ int capacity = getCapacity(stack);
+ if (capacity > 0) {
+ FluidStack fluidStack = getFluid(stack);
+ return fluidStack == null ? capacity : capacity - fluidStack.amount;
+ }
+ return 0;
+ }
+
+ public int getMaxCapacity() {
+ return this.maxCapacity;
+ }
+
+ public int getCapacity(ItemStack stack) {
+ int capacity = 1000;
+ if (stack.hasTagCompound()) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt.hasKey("Capacity", 3))
+ capacity = nbt.getInteger("Capacity");
+ }
+ return Math.min(getMaxCapacity(), capacity);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister aIconRegister) {
+ super.registerIcons(aIconRegister);
+ iconWindow = aIconRegister.registerIcon(RES_PATH_ITEM + "gt.Volumetric_Flask.window");
+ }
+
+ public void setCapacity(ItemStack stack, int capacity) {
+ capacity = Math.min(capacity, getMaxCapacity());
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ nbt.setInteger("Capacity", capacity);
+ }
+
+ public FluidStack getFluid(ItemStack stack) {
+ if (stack.hasTagCompound()) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt.hasKey("Fluid", 10))
+ return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid"));
+ }
+ return null;
+ }
+
+ public void setFluid(ItemStack stack, FluidStack fluidStack) {
+ boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0);
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ if (removeFluid)
+ return;
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ if (removeFluid) {
+ nbt.removeTag("Fluid");
+ if (nbt.hasNoTags()) {
+ stack.setTagCompound(null);
+ }
+ } else {
+ nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ public int fill(ItemStack stack, FluidStack resource, boolean doFill) {
+ if (stack.stackSize != 1)
+ return 0;
+ if ((resource == null) || (resource.amount <= 0)) {
+ return 0;
+ }
+ FluidStack fluidStack = getFluid(stack);
+ if (fluidStack == null) {
+ fluidStack = new FluidStack(resource, 0);
+ } else if (!fluidStack.isFluidEqual(resource)) {
+ return 0;
+ }
+ int amount = Math.min(getCapacity(stack) - fluidStack.amount, resource.amount);
+ if ((doFill) && (amount > 0)) {
+ fluidStack.amount += amount;
+ setFluid(stack, fluidStack);
+ }
+ return amount;
+ }
+
+ public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) {
+ if (stack.stackSize != 1)
+ return null;
+ FluidStack fluidStack = getFluid(stack);
+ if (fluidStack == null)
+ return null;
+ maxDrain = Math.min(fluidStack.amount, maxDrain);
+ if (doDrain) {
+ fluidStack.amount -= maxDrain;
+ setFluid(stack, fluidStack);
+ }
+ return new FluidStack(fluidStack, maxDrain);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public void addInformation(ItemStack stack, EntityPlayer player, List info, boolean b) {
+ super.addInformation(stack, player, info, b);
+ FluidStack fs = getFluid(stack);
+ if (fs != null) {
+ info.add(String.format("< %s, %d mB >", FluidRegistry.getFluidName(fs), fs.amount));
+ } else {
+ info.add(String.format("< Empty, %d mB >", getCapacity(stack)));
+ }
+ info.add("Rightclick on air to set volume (only while empty)");
+ }
+
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs creativeTabs, List itemList) {
+ itemList.add(new ItemStack(this));
+ for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
+ if (fluid != null) {
+ ItemStack stack = new ItemStack(this);
+ setCapacity(stack, getMaxCapacity());
+ fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), true);
+ itemList.add(stack);
+ }
+ }
+ }
+
+ private boolean interactWithTank(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) {
+ if (world.isRemote) {
+ return false;
+ }
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof IFluidHandler)) {
+ return false;
+ }
+ IFluidHandler handler = (IFluidHandler) te;
+ ForgeDirection dir = ForgeDirection.getOrientation(side);
+ FluidStack fs = this.getFluid(stack);
+ int capacity = getCapacity(stack);
+ if (fs != null && (!player.isSneaking() || fs.amount >= capacity)) {
+ int amount = handler.fill(dir, fs, false);
+ if (amount > 0) {
+ fs = LiquidUtil.drainContainerStack(stack, player, amount, false);
+ if (fs != null && fs.amount > 0) {
+ handler.fill(dir, fs, true);
+ }
+ }
+ } else {
+ int amount = fs == null ? capacity : capacity - fs.amount;
+ FluidStack input = handler.drain(dir, amount, false);
+ if (input != null && input.amount > 0) {
+ amount = LiquidUtil.fillContainerStack(stack, player, input, false);
+ if (amount > 0) {
+ handler.drain(dir, amount, true);
+ }
+ }
+ }
+ return true;
+ }
+
+ private boolean collectFluidBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ if (block instanceof IFluidBlock) {
+ IFluidBlock liquid = (IFluidBlock) block;
+ if (liquid.canDrain(world, x, y, z)) {
+ FluidStack fluid = liquid.drain(world, x, y, z, false);
+ int amount = fillContainerStack(stack, player, fluid, true);
+ if (amount == fluid.amount) {
+ fillContainerStack(stack, player, fluid, false);
+ liquid.drain(world, x, y, z, true);
+ return true;
+ }
+ }
+ } else if (world.getBlockMetadata(x, y, z) == 0) {
+ FluidStack fluid = null;
+ if (block != Blocks.water && block != Blocks.flowing_water) {
+ if (block == Blocks.lava || block == Blocks.flowing_lava) {
+ fluid = new FluidStack(FluidRegistry.LAVA, 1000);
+ }
+ } else {
+ fluid = new FluidStack(FluidRegistry.WATER, 1000);
+ }
+
+ if (fluid != null) {
+ int amount = fillContainerStack(stack, player, fluid, true);
+ if (amount == fluid.amount) {
+ fillContainerStack(stack, player, fluid, false);
+ world.setBlockToAir(x, y, z);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
new file mode 100644
index 0000000000..c20b4002c3
--- /dev/null
+++ b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
@@ -0,0 +1,42 @@
+package gregtech.common.net;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import gregtech.common.items.GT_VolumetricFlask;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public final class MessageSetFlaskCapacity implements IMessage {
+ private int capacity;
+
+ public MessageSetFlaskCapacity() {
+ }
+
+ public MessageSetFlaskCapacity(int capacity) {
+ this.capacity = capacity;
+ }
+
+
+ public void fromBytes(ByteBuf buf) {
+ this.capacity = buf.readInt();
+ }
+
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(this.capacity);
+ }
+
+ public static final class Handler
+ implements IMessageHandler<MessageSetFlaskCapacity, IMessage> {
+ public IMessage onMessage(MessageSetFlaskCapacity message, MessageContext ctx) {
+ ItemStack stack = ctx.getServerHandler().playerEntity.getHeldItem();
+ if ((stack != null) && (stack.stackSize > 0)) {
+ Item item = stack.getItem();
+ if ((item instanceof GT_VolumetricFlask))
+ ((GT_VolumetricFlask) item).setCapacity(stack, message.capacity);
+ }
+ return null;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/common/render/GT_FlaskRenderer.java b/src/main/java/gregtech/common/render/GT_FlaskRenderer.java
new file mode 100644
index 0000000000..8b1f505314
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_FlaskRenderer.java
@@ -0,0 +1,89 @@
+package gregtech.common.render;
+
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_VolumetricFlask;
+import ic2.core.util.DrawUtil;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.fluids.FluidStack;
+import org.lwjgl.opengl.GL11;
+
+@SideOnly(cpw.mods.fml.relauncher.Side.CLIENT)
+public final class GT_FlaskRenderer implements net.minecraftforge.client.IItemRenderer {
+ public GT_FlaskRenderer() {
+ MinecraftForgeClient.registerItemRenderer(ItemList.VOLUMETRIC_FLASK.getItem(), this);
+ }
+
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type != ItemRenderType.FIRST_PERSON_MAP;
+ }
+
+
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, IItemRenderer.ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY;
+ }
+
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ GT_VolumetricFlask cell = (GT_VolumetricFlask) item.getItem();
+ IIcon icon = item.getIconIndex();
+ GL11.glEnable(3042);
+ GL11.glEnable(3008);
+ if (type.equals(ItemRenderType.ENTITY)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glRotated(90.0D, 0.0D, 1.0D, 0.0D);
+ GL11.glTranslated(-0.5D, -0.6D, 0.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON)) {
+ GL11.glTranslated(1.0D, 1.0D, 0.0D);
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glTranslated(-1.0D, -1.0D, 0.0D);
+ }
+
+ FluidStack fs = cell.getFluid(item);
+ if (fs != null) {
+ IIcon iconWindow = cell.iconWindow;
+ IIcon fluidicon = fs.getFluid().getIcon(fs);
+ int fluidColor = fs.getFluid().getColor(fs);
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(0, 1);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(iconWindow, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+ GL11.glBlendFunc(770, 771);
+ GL11.glDepthFunc(514);
+ GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(fluidicon, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
+ GL11.glDepthFunc(515);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(770, 771);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ } else {
+ ItemRenderer.renderItemIn2D(Tessellator.instance, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
+ }
+ GL11.glDisable(3008);
+ GL11.glDisable(3042);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
index d172e95115..7946381981 100644
--- a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+++ b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
@@ -12,6 +12,8 @@ import ic2.core.Ic2Items;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
public class GT_CraftingRecipeLoader implements Runnable {
private final static String aTextIron1 = "X X";
@@ -839,5 +841,6 @@ public class GT_CraftingRecipeLoader implements Runnable {
}
GT_ModHandler.addShapelessCraftingRecipe(Materials.Fireclay.getDust(2), new Object[]{Materials.Brick.getDust(1), Materials.Clay.getDust(1)});
+ GT_Values.RA.addFluidSolidifierRecipe(ItemList.Shape_Mold_Ball.get(0), new FluidStack(FluidRegistry.getFluid("molten.borosilicateglass"), 144), ItemList.VOLUMETRIC_FLASK.get(1), 44, 24);
}
}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
index 2023253eec..28968ef537 100644
--- a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
@@ -83,6 +83,8 @@ public class GT_Loader_Item_Block_And_Fluid
ItemList.Rotor_EV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L));
ItemList.Rotor_IV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1L));
+ ItemList.VOLUMETRIC_FLASK.set(new GT_VolumetricFlask("Volumetric_Flask", "Volumetric flask", 1000));
+
Item tItem = (Item) GT_Utility.callConstructor("gregtech.common.items.GT_SensorCard_Item", 0, null, false, new Object[]{"sensorcard", "GregTech Sensor Card"});
ItemList.NC_SensorCard.set(tItem == null ? new GT_Generic_Item("sensorcard", "GregTech Sensor Card", "Nuclear Control not installed", false) : tItem);
diff --git a/src/main/resources/assets/gregtech/textures/gui/VolumetricFlask.png b/src/main/resources/assets/gregtech/textures/gui/VolumetricFlask.png
new file mode 100644
index 0000000000..59004127eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/VolumetricFlask.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png
new file mode 100644
index 0000000000..3923f6c2fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png
new file mode 100644
index 0000000000..567eccb544
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png
Binary files differ