Java tutorial
/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.gui.element.starmap; import matteroverdrive.Reference; import matteroverdrive.client.data.Color; import matteroverdrive.client.render.HoloIcon; import matteroverdrive.data.ScaleTexture; import matteroverdrive.gui.GuiStarMap; import matteroverdrive.gui.element.ElementGroupList; import matteroverdrive.gui.element.MOElementButton; import matteroverdrive.proxy.ClientProxy; import matteroverdrive.starmap.data.SpaceBody; import matteroverdrive.util.RenderUtils; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import java.util.List; import java.util.Map; /** * Created by Simeon on 6/21/2015. */ public abstract class ElementAbstractStarMapEntry<T extends SpaceBody> extends MOElementButton { public static ScaleTexture BG = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry.png"), 32, 32).setOffsets(18, 12, 15, 15); public static ScaleTexture BG_FLIPPED = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry_flipped.png"), 32, 32).setOffsets(12, 18, 15, 15); public static ScaleTexture BG_MIDDLE_NORMAL = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry_middle.png"), 32, 32) .setOffsets(15, 15, 15, 15).setTextureSize(96, 32); public static ScaleTexture BG_MIDDLE_OVER = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry_middle.png"), 32, 32) .setOffsets(15, 15, 15, 15).setTextureSize(96, 32).setUV(32, 0); public static ScaleTexture BG_MIDDLE_DOWN = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry_middle.png"), 32, 32) .setOffsets(15, 15, 15, 15).setTextureSize(96, 32).setUV(64, 0); public static ScaleTexture BG_CIRCLE = new ScaleTexture( new ResourceLocation(Reference.PATH_ELEMENTS + "holo_list_entry_circle.png"), 32, 32).setOffsets(15, 15, 15, 15); protected T spaceBody; protected ElementGroupList groupList; protected HoloIcon travelIcon, searchIcon; public ElementAbstractStarMapEntry(GuiStarMap gui, ElementGroupList groupList, int width, int height, T spaceBody) { super(gui, groupList, 0, 0, spaceBody.getName(), 0, 0, 0, 0, width, height, ""); this.spaceBody = spaceBody; this.groupList = groupList; this.travelIcon = ClientProxy.holoIcons.getIcon("travel_icon"); this.searchIcon = ClientProxy.holoIcons.getIcon("icon_search"); } @Override public void drawBackground(int mouseX, int mouseY, float gameTicks) { GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glDisable(GL11.GL_ALPHA_TEST); float multiply = getMultiply(spaceBody); RenderUtils.applyColorWithMultipy(getSpaceBodyColor(spaceBody), multiply); if (isSelected(spaceBody)) { getBG(spaceBody).render(posX, posY, sizeX - 64, sizeY); if (canView(spaceBody, Minecraft.getMinecraft().thePlayer)) { this.BG_MIDDLE_NORMAL.render(posX + sizeX - 64, posY, 32, sizeY); } if (canTravelTo(spaceBody, Minecraft.getMinecraft().thePlayer)) this.BG_FLIPPED.render(posX + sizeX - 32, posY, 32, sizeY); RenderUtils.applyColorWithMultipy(getSpaceBodyColor(spaceBody), multiply * 0.75f); } else { if (intersectsWith(mouseX, mouseY)) { getBG(spaceBody).render(posX, posY, sizeX - 64, sizeY); } else { getBG(spaceBody).render(posX, posY, sizeX - 64, sizeY); } } GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glDisable(GL11.GL_BLEND); } protected ScaleTexture getBG(T spaceBody) { return BG; } float getMultiply(T spaceBody) { return 0.1f; } boolean isSelected(T spaceBody) { return groupList.isSelected(this); } @Override public void drawForeground(int mouseX, int mouseY) { if (isSelected(spaceBody)) { float multiply = 1f; Color color = getSpaceBodyColor(spaceBody); drawElementName(spaceBody, color, multiply); int iconsX = 0; if (canTravelTo(spaceBody, Minecraft.getMinecraft().thePlayer)) { multiply = 0.5f; if (intersectsWith(mouseX, mouseY) && mouseX > sizeX - 32 && mouseX < sizeX) { multiply = 1f; } RenderUtils.applyColorWithMultipy(color, multiply); ClientProxy.holoIcons.bindSheet(); ClientProxy.holoIcons.renderIcon(travelIcon, posX + sizeX - 32 + 6, posY + 5); iconsX += 32; } if (canView(spaceBody, Minecraft.getMinecraft().thePlayer)) { multiply = 0.5f; if (intersectsWith(mouseX, mouseY) && mouseX > sizeX - 64 && mouseX < sizeX - 32) { multiply = 1f; } RenderUtils.applyColorWithMultipy(color, multiply); ClientProxy.holoIcons.bindSheet(); ClientProxy.holoIcons.renderIcon(searchIcon, posX + sizeX - 64 + searchIcon.getOriginalWidth() / 2, posY + searchIcon.getOriginalHeight() / 2); iconsX += 32; } multiply = 0.8f; Map<HoloIcon, Integer> icons = getIcons(spaceBody); if (icons != null) { for (Map.Entry<HoloIcon, Integer> entry : icons.entrySet()) { if (entry.getValue() != 0) { GL11.glEnable(GL11.GL_BLEND); RenderUtils.applyColorWithMultipy(getSpaceBodyColor(spaceBody), multiply); BG_CIRCLE.render(posX + 128 + iconsX, posY, 32, 32); ClientProxy.holoIcons.renderIcon(entry.getKey(), posX + iconsX + 128 + 16 - entry.getKey().getOriginalWidth() / 2, posY + 16 - entry.getKey().getOriginalHeight() / 2); if (entry.getValue() > 0) RenderUtils.drawString(String.valueOf(entry.getValue()), posX + iconsX + 128 + 16 + 3, posY + 16 + 3, Reference.COLOR_HOLO, 1); iconsX += 32; } } } } else { drawElementName(spaceBody, getSpaceBodyColor(spaceBody), 0.3f); int x = 0; Map<HoloIcon, Integer> icons = getIcons(spaceBody); if (icons != null) { for (Map.Entry<HoloIcon, Integer> entry : icons.entrySet()) { if (entry.getValue() != 0) { GL11.glEnable(GL11.GL_BLEND); RenderUtils.applyColorWithMultipy(getSpaceBodyColor(spaceBody), 0.3f); BG_CIRCLE.render(posX + 128 + x, posY, 32, 32); ClientProxy.holoIcons.renderIcon(entry.getKey(), posX + x + 128 + 16 - entry.getKey().getOriginalWidth() / 2, posY + 16 - entry.getKey().getOriginalHeight() / 2); if (entry.getValue() > 0) RenderUtils.drawString(String.valueOf(entry.getValue()), posX + x + 128 + 16 + 3, posY + 16 + 3, getSpaceBodyColor(spaceBody), 0.6f); x += 32; } } } } } protected abstract void drawElementName(T spaceBody, Color color, float multiply); protected abstract Map<HoloIcon, Integer> getIcons(T spaceBody); @Override public void addTooltip(List<String> var1, int mouseX, int mouseY) { if (isSelected(spaceBody)) { if (canTravelTo(spaceBody, Minecraft.getMinecraft().thePlayer) && mouseX > sizeX - 32 && mouseX < sizeX) { var1.add("Travel To"); } else if (canView(spaceBody, Minecraft.getMinecraft().thePlayer) && mouseX > sizeX - 64 && mouseX < sizeX - 32) { var1.add("Enter"); } } } @Override public boolean onMousePressed(int mouseX, int mouseY, int mouseButton) { if (isSelected(spaceBody)) { if (mouseX > sizeX - 32 && mouseX < sizeX) { if (canTravelTo(spaceBody, Minecraft.getMinecraft().thePlayer)) { onTravelPress(); } else { return false; } } else if (mouseX > sizeX - 64 && mouseX < sizeX - 32) { if (canView(spaceBody, Minecraft.getMinecraft().thePlayer)) { onViewPress(); } } playSound(); } else { if (mouseX < sizeX - 64) { playSound(); onSelectPress(); return true; } } return false; } protected abstract boolean canTravelTo(T spaceBody, EntityPlayer player); protected abstract boolean canView(T spaceBody, EntityPlayer player); protected void playSound() { String sound = getSound(); if (sound != null && !sound.isEmpty()) { gui.playSound(Reference.MOD_ID + ":gui." + sound, getSoundVolume(), 0.9f + rand.nextFloat() * 0.2f); } } protected abstract void onViewPress(); protected abstract void onTravelPress(); protected abstract void onSelectPress(); protected Color getSpaceBodyColor(T spaceBody) { return Reference.COLOR_HOLO; } public T getSpaceBody() { return spaceBody; } }