251 lines
8.9 KiB
Java
251 lines
8.9 KiB
Java
package electroblob.wizardry.client;
|
|
|
|
import org.lwjgl.input.Keyboard;
|
|
|
|
import electroblob.wizardry.SpellGlyphData;
|
|
import electroblob.wizardry.WizardData;
|
|
import electroblob.wizardry.Wizardry;
|
|
import electroblob.wizardry.constants.Element;
|
|
import electroblob.wizardry.item.ItemWand;
|
|
import electroblob.wizardry.packet.PacketControlInput;
|
|
import electroblob.wizardry.packet.WizardryPacketHandler;
|
|
import electroblob.wizardry.spell.Spell;
|
|
import electroblob.wizardry.tileentity.ContainerArcaneWorkbench;
|
|
import electroblob.wizardry.tileentity.TileEntityArcaneWorkbench;
|
|
import electroblob.wizardry.util.WandHelper;
|
|
import electroblob.wizardry.util.WizardryUtilities;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.gui.GuiButton;
|
|
import net.minecraft.client.gui.inventory.GuiContainer;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.resources.I18n;
|
|
import net.minecraft.entity.player.InventoryPlayer;
|
|
import net.minecraft.inventory.IInventory;
|
|
import net.minecraft.inventory.Slot;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
|
|
|
|
public class GuiArcaneWorkbench extends GuiContainer {
|
|
|
|
private GuiButton applyBtn;
|
|
private static final ResourceLocation texture = new ResourceLocation(Wizardry.MODID,
|
|
"textures/gui/arcane_workbench.png");
|
|
|
|
private IInventory playerInventory;
|
|
private IInventory arcaneWorkbenchInventory;
|
|
|
|
private final int tooltipWidth = 164;
|
|
|
|
// We report the actual size of the GUI to Minecraft when a wand is in so JEI doesn't overdraw it.
|
|
// For calculations, we use the size without the tooltip.
|
|
private final int xSizeNoTip = 176;
|
|
|
|
public GuiArcaneWorkbench(InventoryPlayer invPlayer, TileEntityArcaneWorkbench entity){
|
|
super(new ContainerArcaneWorkbench(invPlayer, entity));
|
|
this.playerInventory = invPlayer;
|
|
this.arcaneWorkbenchInventory = entity;
|
|
xSize = xSizeNoTip;
|
|
ySize = 220;
|
|
}
|
|
|
|
@Override
|
|
public void drawScreen(int p_73863_1_, int p_73863_2_, float p_73863_3_){
|
|
|
|
this.drawDefaultBackground();
|
|
|
|
// Tests if there is a wand in the workbench and edits the positioning accordingly
|
|
if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getHasStack() && this.inventorySlots
|
|
.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getStack().getItem() instanceof ItemWand){
|
|
xSize = xSizeNoTip + tooltipWidth;
|
|
guiLeft = (this.width - this.xSize) / 2;
|
|
this.applyBtn.x = (this.width - tooltipWidth) / 2 + 48;
|
|
}else{
|
|
xSize = xSizeNoTip;
|
|
guiLeft = (this.width - this.xSize) / 2;
|
|
this.applyBtn.x = this.width / 2 + 48;
|
|
}
|
|
|
|
if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getHasStack()){
|
|
this.applyBtn.enabled = true;
|
|
}else{
|
|
this.applyBtn.enabled = false;
|
|
}
|
|
|
|
super.drawScreen(p_73863_1_, p_73863_2_, p_73863_3_);
|
|
|
|
// Required now, or item mouseover tooltips won't render.
|
|
this.renderHoveredToolTip(p_73863_1_, p_73863_2_);
|
|
}
|
|
|
|
@Override
|
|
public void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY){
|
|
|
|
GlStateManager.color(1F, 1F, 1F, 1F);
|
|
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
|
|
|
|
// Main inventory
|
|
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSizeNoTip, ySize);
|
|
|
|
// Changing slots
|
|
for(int i = 0; i < ContainerArcaneWorkbench.CRYSTAL_SLOT; i++){
|
|
Slot slot = this.inventorySlots.getSlot(i);
|
|
if(slot.xPos >= 0 && slot.yPos >= 0)
|
|
this.drawTexturedModalRect(guiLeft + slot.xPos - 10, guiTop + slot.yPos - 10, 0, 220, 36, 36);
|
|
}
|
|
|
|
// Tooltip only drawn if there is a wand
|
|
if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getHasStack() && this.inventorySlots
|
|
.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getStack().getItem() instanceof ItemWand){
|
|
|
|
// Tooltip box
|
|
drawTexturedModalRect(guiLeft + xSizeNoTip, guiTop, xSizeNoTip, 0, 256 - xSizeNoTip - 4, ySize);
|
|
drawTexturedModalRect(guiLeft + 252, guiTop, xSizeNoTip + 4, 0, tooltipWidth - 2 * (256 - xSizeNoTip - 4), ySize);
|
|
drawTexturedModalRect(guiLeft + xSize - (256 - xSizeNoTip - 4), guiTop, xSizeNoTip + 4, 0,
|
|
256 - xSizeNoTip - 4, ySize);
|
|
|
|
ItemStack wand = this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getStack();
|
|
|
|
Spell[] spells = WandHelper.getSpells(wand);
|
|
|
|
int i = 0;
|
|
|
|
for(Spell spell : spells){
|
|
|
|
boolean discovered = true;
|
|
|
|
if(!this.mc.player.capabilities.isCreativeMode && WizardData.get(this.mc.player) != null){
|
|
discovered = WizardData.get(this.mc.player).hasSpellBeenDiscovered(spell);
|
|
}
|
|
// As of Wizardry 1.2, the icons have been split off into their own texture files to allow for add-on
|
|
// mods to add their own.
|
|
Minecraft.getMinecraft().renderEngine
|
|
.bindTexture(discovered ? spell.element.getIcon() : Element.MAGIC.getIcon());
|
|
|
|
// Renders the little element icon
|
|
WizardryUtilities.drawTexturedRect(guiLeft + xSizeNoTip + 5, guiTop + 34 + 10 * i++, 8, 8);
|
|
}
|
|
|
|
int x = 0;
|
|
int y = guiTop + 50 + spells.length * 10;
|
|
|
|
// Look how much shorter this is with the WandHelper class!
|
|
for(Item item : WandHelper.getSpecialUpgrades()){
|
|
|
|
int level = WandHelper.getUpgradeLevel(wand, item);
|
|
|
|
if(level > 0){
|
|
ItemStack stack = new ItemStack(item, level);
|
|
GlStateManager.enableDepth();
|
|
this.itemRender.renderItemAndEffectIntoGUI(stack, guiLeft + xSizeNoTip + 6 + x, y);
|
|
this.itemRender.renderItemOverlayIntoGUI(this.fontRenderer, stack, guiLeft + xSizeNoTip + 6 + x, y,
|
|
null);
|
|
x += 18;
|
|
GlStateManager.disableDepth();
|
|
}
|
|
}
|
|
}
|
|
|
|
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
|
|
|
|
// Fixes the bug that caused the slot hightlight to render opaque. I don't know why it works, it just works!
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.enableAlpha();
|
|
}
|
|
|
|
@Override
|
|
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY){
|
|
|
|
this.fontRenderer
|
|
.drawString(this.arcaneWorkbenchInventory.hasCustomName() ? this.arcaneWorkbenchInventory.getName()
|
|
: I18n.format(this.arcaneWorkbenchInventory.getName()), 8, 6, 4210752);
|
|
this.fontRenderer.drawString(this.playerInventory.hasCustomName() ? this.playerInventory.getName()
|
|
: I18n.format(this.playerInventory.getName()), 8, this.ySize - 96 + 2, 4210752);
|
|
|
|
if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getHasStack() && this.inventorySlots
|
|
.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getStack().getItem() instanceof ItemWand){
|
|
|
|
ItemStack wand = this.inventorySlots.getSlot(ContainerArcaneWorkbench.WAND_SLOT).getStack();
|
|
|
|
this.fontRenderer.drawStringWithShadow("\u00A7f" + wand.getDisplayName(), xSizeNoTip + 6, 6, 0);
|
|
this.fontRenderer.drawStringWithShadow(
|
|
"\u00A77" + I18n.format("container." + Wizardry.MODID + ":arcane_workbench.mana") + " "
|
|
+ (wand.getMaxDamage() - wand.getItemDamage()) + "/" + wand.getMaxDamage(),
|
|
xSizeNoTip + 6, 20, 0);
|
|
|
|
Spell[] spells = WandHelper.getSpells(wand);
|
|
|
|
int y = 34;
|
|
|
|
for(Spell spell : spells){
|
|
|
|
boolean discovered = true;
|
|
|
|
if(!this.mc.player.capabilities.isCreativeMode && WizardData.get(this.mc.player) != null){
|
|
discovered = WizardData.get(this.mc.player).hasSpellBeenDiscovered(spell);
|
|
}
|
|
|
|
if(discovered){
|
|
this.fontRenderer.drawStringWithShadow(spell.getDisplayNameWithFormatting(), xSizeNoTip + 16, y, 0);
|
|
}else{
|
|
this.mc.standardGalacticFontRenderer.drawStringWithShadow(
|
|
"\u00A79" + SpellGlyphData.getGlyphName(spell, this.mc.world), xSizeNoTip + 16, y, 0);
|
|
}
|
|
y += 10;
|
|
}
|
|
|
|
if(WandHelper.getTotalUpgrades(wand) > 0){
|
|
|
|
this.fontRenderer.drawStringWithShadow(
|
|
"\u00A7f" + I18n.format("container." + Wizardry.MODID + ":arcane_workbench.upgrades"), xSizeNoTip + 6, y + 6, 0);
|
|
|
|
int x = 0;
|
|
y = 50 + spells.length * 10;
|
|
// Wand upgrade tooltips
|
|
for(Item item : WandHelper.getSpecialUpgrades()){
|
|
|
|
int level = WandHelper.getUpgradeLevel(wand, item);
|
|
|
|
if(level > 0){
|
|
// The javadoc for isPointInRegion is ambiguous; what it means is that the REGION is
|
|
// relative to the GUI but the POINT isn't.
|
|
if(isPointInRegion(xSizeNoTip + 6 + x, y, 16, 16, mouseX, mouseY)){
|
|
ItemStack stack = new ItemStack(item, level);
|
|
this.renderToolTip(stack, mouseX - guiLeft, mouseY - guiTop);
|
|
}
|
|
x += 18;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void initGui(){
|
|
this.mc.player.openContainer = this.inventorySlots;
|
|
this.guiLeft = (this.width - this.xSize) / 2;
|
|
this.guiTop = (this.height - this.ySize) / 2;
|
|
Keyboard.enableRepeatEvents(true);
|
|
this.buttonList.clear();
|
|
this.buttonList.add(this.applyBtn = new GuiButtonApply(0, this.width / 2 + 48, this.height / 2 + 3));
|
|
}
|
|
|
|
@Override
|
|
public void onGuiClosed(){
|
|
super.onGuiClosed();
|
|
Keyboard.enableRepeatEvents(false);
|
|
}
|
|
|
|
@Override
|
|
protected void actionPerformed(GuiButton button){
|
|
if(button.enabled){
|
|
if(button.id == 0){
|
|
// Packet building
|
|
IMessage msg = new PacketControlInput.Message(PacketControlInput.ControlType.APPLY_BUTTON);
|
|
WizardryPacketHandler.net.sendToServer(msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
} |