Files
TinkersConstruct/src/main/java/tconstruct/tools/gui/ToolStationGui.java
T

517 lines
21 KiB
Java
Raw Normal View History

package tconstruct.tools.gui;
import java.math.RoundingMode;
import java.text.DecimalFormat;
2014-02-05 10:28:54 -05:00
import java.util.Arrays;
import java.util.List;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
2014-05-14 09:52:04 -05:00
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
2014-02-05 10:28:54 -05:00
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
2014-02-05 10:28:54 -05:00
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
2014-02-05 10:28:54 -05:00
2014-02-01 17:28:41 +11:00
import tconstruct.TConstruct;
2014-02-05 10:28:54 -05:00
import tconstruct.library.client.TConstructClientRegistry;
import tconstruct.library.client.ToolGuiElement;
import tconstruct.library.tools.ToolCore;
2014-06-04 21:44:48 -08:00
import tconstruct.smeltery.inventory.ActiveContainer;
import tconstruct.tools.inventory.ToolStationContainer;
import tconstruct.tools.logic.ToolStationLogic;
2014-07-21 12:52:39 -08:00
import tconstruct.util.network.ToolStationPacket;
2014-02-05 10:28:54 -05:00
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
2014-05-14 09:52:04 -05:00
public class ToolStationGui extends GuiContainer
{
public ToolStationLogic logic;
public ToolStationContainer toolSlots;
public GuiTextField text;
public String toolName;
public int guiType;
public int[] slotX, slotY, iconX, iconY;
public boolean active;
public String title, body = "";
public ToolStationGui(InventoryPlayer inventoryplayer, ToolStationLogic stationlogic, World world, int x, int y, int z)
{
super((ActiveContainer) stationlogic.getGuiContainer(inventoryplayer, world, x, y, z));
this.logic = stationlogic;
2014-05-14 09:52:04 -05:00
toolSlots = (ToolStationContainer) inventorySlots;
text = new GuiTextField(this.fontRendererObj, 83, 8, 30, 12);
2014-02-05 08:28:53 -05:00
this.text.setMaxStringLength(40);
this.text.setEnableBackgroundDrawing(false);
this.text.setVisible(true);
this.text.setCanLoseFocus(false);
this.text.setFocused(true);
this.text.setTextColor(0xffffff);
toolName = "";
resetGui();
Keyboard.enableRepeatEvents(true);
}
2014-02-17 00:31:43 -05:00
@Override
protected void mouseClicked (int mouseX, int mouseY, int mouseButton)
{
super.mouseClicked(mouseX, mouseY, mouseButton);
if (mouseButton == 0)
{
int gLeft = this.guiLeft + 68 + 110;
int gTop = this.guiTop + 6;
2014-02-05 08:28:53 -05:00
int gwidth = 102;
int gheight = 12;
active = mouseX > gLeft && mouseX < gLeft + gwidth && mouseY > gTop && mouseY < gTop + gheight;
}
}
void resetGui ()
{
2014-02-05 08:28:53 -05:00
this.text.setText("");
guiType = 0;
setSlotType(0);
iconX = new int[] { 0, 1, 2 };
iconY = new int[] { 13, 13, 13 };
2014-02-08 18:48:09 +01:00
title = "\u00A7n" + StatCollector.translateToLocal("gui.toolforge1");
body = StatCollector.translateToLocal("gui.toolforge2");
}
2014-02-17 00:31:43 -05:00
@Override
public void initGui ()
{
super.initGui();
2014-05-14 09:52:04 -05:00
this.guiLeft -= 110;
this.xSize += 110;
2014-02-05 08:28:53 -05:00
this.buttonList.clear();
ToolGuiElement repair = TConstructClientRegistry.toolButtons.get(0);
2014-05-14 09:52:04 -05:00
GuiButtonTool repairButton = new GuiButtonTool(0, this.guiLeft, this.guiTop, repair.buttonIconX, repair.buttonIconY, repair.domain, repair.texture, repair); // Repair
2014-02-05 08:28:53 -05:00
repairButton.enabled = false;
this.buttonList.add(repairButton);
for (int iter = 1; iter < TConstructClientRegistry.toolButtons.size(); iter++)
{
ToolGuiElement element = TConstructClientRegistry.toolButtons.get(iter);
2014-05-14 09:52:04 -05:00
GuiButtonTool button = new GuiButtonTool(iter, this.guiLeft + 22 * (iter % 5), this.guiTop + 22 * (iter / 5), element.buttonIconX, element.buttonIconY, repair.domain, element.texture,
2013-08-31 05:13:31 -07:00
element);
2014-02-05 08:28:53 -05:00
this.buttonList.add(button);
}
}
2014-02-17 00:31:43 -05:00
@Override
protected void actionPerformed (GuiButton button)
{
2014-02-05 08:28:53 -05:00
((GuiButton) this.buttonList.get(guiType)).enabled = true;
guiType = button.id;
button.enabled = false;
ToolGuiElement element = TConstructClientRegistry.toolButtons.get(guiType);
setSlotType(element.slotType);
iconX = element.iconsX;
iconY = element.iconsY;
title = "\u00A7n" + element.title;
body = element.body;
}
void setSlotType (int type)
{
switch (type)
{
case 0:
slotX = new int[] { 56, 38, 38 }; // Repair
slotY = new int[] { 37, 28, 46 };
break;
case 1:
slotX = new int[] { 56, 56, 56 }; // Three parts
slotY = new int[] { 19, 55, 37 };
break;
case 2:
slotX = new int[] { 56, 56, 14 }; // Two parts
slotY = new int[] { 28, 46, 37 };
break;
case 3:
slotX = new int[] { 38, 47, 56 }; // Double head
slotY = new int[] { 28, 46, 28 };
break;
case 7:
slotX = new int[] { 56, 56, 56 }; // Three parts reverse
slotY = new int[] { 19, 37, 55 };
break;
}
toolSlots.resetSlots(slotX, slotY);
}
2014-02-17 00:31:43 -05:00
@Override
public void updateScreen ()
{
super.updateScreen();
2014-02-05 08:28:53 -05:00
this.text.updateCursorCounter();
}
/**
2014-02-16 14:23:50 -05:00
* Draw the foreground layer for the GuiContainer (everything in front of
* the items)
*/
2014-02-17 00:31:43 -05:00
@Override
protected void drawGuiContainerForegroundLayer (int par1, int par2)
{
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal(logic.getInvName()), 116, 8, 0x000000);
this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 118, this.ySize - 96 + 2, 0x000000);
this.fontRendererObj.drawString(toolName + "_", 180, 8, 0xffffff);
if (logic.isStackInSlot(0))
drawToolStats();
else
drawToolInformation();
}
void drawToolStats ()
{
ItemStack stack = logic.getStackInSlot(0);
if (stack.getItem() instanceof ToolCore)
{
ToolCore tool = (ToolCore) stack.getItem();
NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool");
2014-05-14 09:52:04 -05:00
this.drawCenteredString(fontRendererObj, "\u00A7n" + tool.getToolName(), 349, 8, 0xffffff);
drawModularToolStats(stack, tool, tags);
}
}
void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags)
{
2014-06-30 22:26:00 -08:00
List categories = Arrays.asList(tool.getTraits());
final int durability = tags.getInteger("Damage");
final int maxDur = tags.getInteger("TotalDurability");
int availableDurability = maxDur - durability;
2014-02-16 14:23:50 -05:00
// Durability
int base = 24;
int offset = 0;
if (maxDur > 0)
{
if (maxDur >= 10000)
{
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), 294, base + offset * 11, 0xffffff);
offset++;
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, 294, base + offset * 10, 0xffffff);
offset++;
}
else
{
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, 294, base + offset * 10, 0xffffff);
offset++;
}
}
final float stonebound = tags.getFloat("Shoddy");
2014-02-16 14:23:50 -05:00
// Attack
if (categories.contains("weapon"))
{
int attack = (int) (tags.getInteger("Attack")) + 1;
float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound;
attack += stoneboundDamage;
attack *= tool.getDamageModifier();
if (attack < 1)
attack = 1;
2014-02-08 18:48:09 +01:00
String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9");
if (attack % 2 == 0)
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, 294, base + offset * 10, 0xffffff);
else
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, 294, base + offset * 10, 0xffffff);
offset++;
if (stoneboundDamage != 0)
{
DecimalFormat df = new DecimalFormat("##.##");
2014-02-08 18:48:09 +01:00
heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9");
2013-12-01 21:42:03 +00:00
String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5");
this.fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, xSize + 8, base + offset * 10, 0xffffff);
offset++;
}
offset++;
}
if (categories.contains("bow"))
{
DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);
int drawSpeed = tags.getInteger("DrawSpeed");
float flightSpeed = tags.getFloat("FlightSpeed");
float trueDraw = drawSpeed / 20f * flightSpeed;
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", 294, base + offset * 10, 0xffffff);
offset++;
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", 294, base + offset * 10, 0xffffff);
offset++;
offset++;
}
if (categories.contains("ammo"))
{
DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);
int attack = (int) (tags.getInteger("Attack"));
float mass = tags.getFloat("Mass");
float shatter = tags.getFloat("BreakChance");
float accuracy = tags.getFloat("Accuracy");
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), 294, base + offset * 10, 0xffffff);
offset++;
2014-02-08 18:48:09 +01:00
String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9");
if (attack % 2 == 0)
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString("- " + attack / 2 + heart, 294, base + offset * 10, 0xffffff);
else
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString("- " + attack / 2f + heart, 294, base + offset * 10, 0xffffff);
offset++;
int minAttack = attack;
int maxAttack = attack * 2;
2014-02-08 18:48:09 +01:00
heart = StatCollector.translateToLocal("gui.partcrafter9");
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), 294, base + offset * 10, 0xffffff);
offset++;
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, 294, base + offset * 10, 0xffffff);
offset++;
offset++;
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), 294, base + offset * 10, 0xffffff);
offset++;
2014-05-14 09:52:04 -05:00
this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", 294, base + offset * 10, 0xffffff);
offset++;
2014-02-16 14:23:50 -05:00
/*
* this.fontRendererObj.drawString("Chance to break: " +
* df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff);
* offset++;
*/
offset++;
}
2014-02-16 14:23:50 -05:00
// Mining
if (categories.contains("dualharvest"))
{
float mineSpeed = tags.getInteger("MiningSpeed") / 100f;
float mineSpeed2 = tags.getInteger("MiningSpeed2") / 100f;
float stoneboundSpeed = (float) Math.log(durability / 72f + 1) * 2 * stonebound;
DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);
float trueSpeed = mineSpeed + stoneboundSpeed;
float trueSpeed2 = mineSpeed2 + stoneboundSpeed;
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), 294, base + offset * 10, 0xffffff);
offset++;
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), 294, base + offset * 10, 0xffffff);
offset++;
if (stoneboundSpeed != 0)
{
2013-12-01 21:42:03 +00:00
String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5");
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), 294, base + offset * 10, 0xffffff);
offset++;
}
offset++;
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), 294, base + offset * 10, 0xffffff);
offset++;
fontRendererObj.drawString("- " + getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + getHarvestLevelName(tags.getInteger("HarvestLevel2")), 294, base + offset * 10, 0xffffff);
offset++;
offset++;
}
else if (categories.contains("harvest"))
{
float mineSpeed = tags.getInteger("MiningSpeed");
int heads = 1;
if (tags.hasKey("MiningSpeed2"))
{
mineSpeed += tags.getInteger("MiningSpeed2");
heads++;
}
if (tags.hasKey("MiningSpeedHandle"))
{
mineSpeed += tags.getInteger("MiningSpeedHandle");
heads++;
}
if (tags.hasKey("MiningSpeedExtra"))
{
mineSpeed += tags.getInteger("MiningSpeedExtra");
heads++;
}
float trueSpeed = mineSpeed / (heads * 100f);
float stoneboundSpeed = (float) Math.log(durability / 72f + 1) * 2 * stonebound;
DecimalFormat df = new DecimalFormat("##.##");
df.setRoundingMode(RoundingMode.DOWN);
trueSpeed += stoneboundSpeed;
if (trueSpeed < 0)
trueSpeed = 0;
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), 294, base + offset * 10, 0xffffff);
offset++;
if (stoneboundSpeed != 0)
{
2013-12-01 21:42:03 +00:00
String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5");
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), 294, base + offset * 10, 0xffffff);
offset++;
}
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + getHarvestLevelName(tags.getInteger("HarvestLevel")), 294, base + offset * 10, 0xffffff);
offset++;
offset++;
}
else if (categories.contains("utility"))
{
float mineSpeed = tags.getInteger("MiningSpeed");
float trueSpeed = mineSpeed / (100f);
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, 294, base + offset * 10, 0xffffff);
offset++;
offset++;
}
2013-12-01 21:42:03 +00:00
int modifiers = tags.getInteger("Modifiers");
if (modifiers > 0)
{
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), 294, base + offset * 10, 0xffffff);
offset++;
}
if (tags.hasKey("Tooltip1"))
{
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), 294, base + offset * 10, 0xffffff);
}
boolean displayToolTips = true;
int tipNum = 0;
while (displayToolTips)
{
tipNum++;
String tooltip = "ModifierTip" + tipNum;
if (tags.hasKey(tooltip))
{
String tipName = tags.getString(tooltip);
2014-05-14 09:52:04 -05:00
fontRendererObj.drawString("- " + tipName, 294, base + (offset + tipNum) * 10, 0xffffff);
}
else
displayToolTips = false;
}
}
void drawToolInformation ()
{
2014-05-14 09:52:04 -05:00
this.drawCenteredString(fontRendererObj, title, 349, 8, 0xffffff);
fontRendererObj.drawSplitString(body, 294, 24, 115, 0xffffff);
}
2013-10-26 15:55:53 +09:00
protected String getHarvestLevelName (int num)
{
switch (num)
{
case 0:
2013-12-01 21:42:03 +00:00
return StatCollector.translateToLocal("gui.partcrafter.mining1");
case 1:
2013-12-01 21:42:03 +00:00
return StatCollector.translateToLocal("gui.partcrafter.mining2");
case 2:
2013-12-01 21:42:03 +00:00
return StatCollector.translateToLocal("gui.partcrafter.mining3");
case 3:
2014-02-16 14:23:50 -05:00
return StatCollector.translateToLocal("gui.partcrafter.mining4"); // Mithril
case 4:
2013-12-01 21:42:03 +00:00
return StatCollector.translateToLocal("gui.partcrafter.mining5");
case 5:
2013-12-01 21:42:03 +00:00
return StatCollector.translateToLocal("gui.partcrafter.mining6");
default:
return String.valueOf(num);
}
}
2013-08-31 05:13:31 -07:00
private static final ResourceLocation background = new ResourceLocation("tinker", "textures/gui/toolstation.png");
private static final ResourceLocation icons = new ResourceLocation("tinker", "textures/gui/icons.png");
private static final ResourceLocation description = new ResourceLocation("tinker", "textures/gui/description.png");
/**
2014-02-16 14:23:50 -05:00
* Draw the background layer for the GuiContainer (everything behind the
* items)
*/
2014-02-17 00:31:43 -05:00
@Override
protected void drawGuiContainerBackgroundLayer (float par1, int par2, int par3)
{
// Draw the background
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
2014-02-05 08:28:53 -05:00
this.mc.getTextureManager().bindTexture(background);
2014-05-14 09:52:04 -05:00
final int cornerX = this.guiLeft + 110;
this.drawTexturedModalRect(cornerX, this.guiTop, 0, 0, 176, this.ySize);
if (active)
{
2014-05-14 09:52:04 -05:00
this.drawTexturedModalRect(cornerX + 62, this.guiTop, 0, this.ySize, 112, 22);
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
2014-02-05 08:28:53 -05:00
this.mc.getTextureManager().bindTexture(icons);
// Draw the slots
for (int i = 0; i < slotX.length; i++)
{
2014-05-14 09:52:04 -05:00
this.drawTexturedModalRect(cornerX + slotX[i] - 4, this.guiTop + slotY[i] - 4, 140, 212, 28, 28);
if (!logic.isStackInSlot(i + 1))
{
2014-05-14 09:52:04 -05:00
this.drawTexturedModalRect(cornerX + slotX[i], this.guiTop + slotY[i], 18 * iconX[i], 18 * iconY[i], 18, 18);
}
}
// Draw description
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
2014-02-05 08:28:53 -05:00
this.mc.getTextureManager().bindTexture(description);
2014-05-14 09:52:04 -05:00
this.drawTexturedModalRect(cornerX + 176, this.guiTop, 0, 0, 126, this.ySize + 30);
}
2014-02-17 00:31:43 -05:00
@Override
protected void keyTyped (char par1, int keyCode)
{
2014-02-05 08:28:53 -05:00
if (keyCode == 1 || (!active && keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()))
{
logic.setToolname("");
updateServer("");
Keyboard.enableRepeatEvents(false);
2014-02-05 08:28:53 -05:00
this.mc.thePlayer.closeScreen();
}
else if (active)
{
2014-02-05 08:28:53 -05:00
text.textboxKeyTyped(par1, keyCode);
toolName = text.getText().trim();
logic.setToolname(toolName);
updateServer(toolName);
}
}
void updateServer (String name)
{
2014-02-16 14:23:50 -05:00
/*
* ByteArrayOutputStream bos = new ByteArrayOutputStream(8);
* DataOutputStream outputStream = new DataOutputStream(bos); try {
* outputStream.writeByte(1);
* outputStream.writeInt(logic.getWorld().provider.dimensionId);
* outputStream.writeInt(logic.xCoord);
* outputStream.writeInt(logic.yCoord);
* outputStream.writeInt(logic.zCoord); outputStream.writeUTF(name); }
* catch (Exception ex) { ex.printStackTrace(); }
*
* Packet250CustomPayload packet = new Packet250CustomPayload();
* packet.channel = "TConstruct"; packet.data = bos.toByteArray();
* packet.length = bos.size();
*
* PacketDispatcher.sendPacketToServer(packet);
*/
2014-02-05 09:11:06 -05:00
2014-07-21 12:52:39 -08:00
TConstruct.packetPipeline.sendToServer(new ToolStationPacket(logic.xCoord, logic.yCoord, logic.zCoord, name));
}
2014-02-16 14:23:50 -05:00
/*
* protected void mouseClicked(int par1, int par2, int par3) {
* super.mouseClicked(par1, par2, par3); text.mouseClicked(par1, par2,
* par3); }
*/
}