package joshie.harvest.calendar.render; import joshie.harvest.api.HFApi; import joshie.harvest.api.calendar.CalendarDate; import joshie.harvest.api.calendar.Season; import joshie.harvest.calendar.CalendarAPI; import joshie.harvest.calendar.CalendarHelper; import joshie.harvest.calendar.HFCalendar; import joshie.harvest.calendar.data.Calendar; import joshie.harvest.calendar.data.SeasonData; import joshie.harvest.core.HFTrackers; import joshie.harvest.core.helpers.MCClientHelper; import joshie.harvest.core.helpers.TextHelper; import joshie.harvest.core.lib.HFModInfo; import joshie.harvest.core.util.annotations.HFEvents; import joshie.harvest.mining.HFMining; import joshie.harvest.mining.MiningHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.GuiScreenEvent.KeyboardInputEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; import org.lwjgl.input.Keyboard; import java.text.NumberFormat; import java.util.Locale; import static joshie.harvest.calendar.HFCalendar.HIDE_GOLD_TEXTURE; import static joshie.harvest.core.lib.HFModInfo.MODID; @HFEvents(Side.CLIENT) public class CalendarHUD { private static final ResourceLocation MINE_HUD = new ResourceLocation(MODID, "textures/gui/mine.png"); public static boolean editingCalendar; public static boolean editingGold; private String formatTime(int time) { int hour = time / 1000; int minute = (int) ((double) (time % 1000) / 20 * 1.2); if (HFCalendar.CLOCK_24H) { return (hour < 10 ? "0" + hour : hour) + ":" + (minute < 10 ? "0" + minute : minute); } else { boolean pm = false; if (hour > 12) { hour = hour - 12; pm = true; } if (hour == 12) pm = true; if (hour == 0) hour = 12; return (hour < 10 ? "0" + hour : hour) + ":" + (minute < 10 ? "0" + minute : minute) + (pm ? "PM" : "AM"); } } private boolean isHUDVisible() { return CalendarAPI.INSTANCE.getSeasonProvider(MCClientHelper.getWorld()).displayHUD(); } @SubscribeEvent public void keyPress(KeyboardInputEvent.Pre event) { if (editingCalendar || editingGold) { event.setCanceled(true); Keyboard.enableRepeatEvents(true); boolean save = false; if (Keyboard.isKeyDown(Keyboard.KEY_H)) { if (editingCalendar) HFCalendar.HIDE_CALENDAR_TEXTURE = !HFCalendar.HIDE_CALENDAR_TEXTURE; else HFCalendar.HIDE_GOLD_TEXTURE = !HFCalendar.HIDE_GOLD_TEXTURE; } else if (Keyboard.isKeyDown(Keyboard.KEY_W) || Keyboard.isKeyDown(Keyboard.KEY_UP)) { if (editingCalendar) HFCalendar.Y_CALENDAR--; else HFCalendar.Y_GOLD--; } else if (Keyboard.isKeyDown(Keyboard.KEY_S) || Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { if (editingCalendar) HFCalendar.Y_CALENDAR++; else HFCalendar.Y_GOLD++; } else if (Keyboard.isKeyDown(Keyboard.KEY_D) || Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { if (editingCalendar) HFCalendar.X_CALENDAR++; else HFCalendar.X_GOLD++; } else if (Keyboard.isKeyDown(Keyboard.KEY_A) || Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { if (editingCalendar) HFCalendar.X_CALENDAR--; else HFCalendar.X_GOLD--; } else if (Keyboard.isKeyDown(Keyboard.KEY_RETURN)) { editingCalendar = false; editingGold = false; save = true; } if (HFCalendar.X_CALENDAR >= 80) HFCalendar.X_CALENDAR = 80; if (HFCalendar.X_CALENDAR <= -6) HFCalendar.X_CALENDAR = -6; if (HFCalendar.Y_CALENDAR >= 90) HFCalendar.Y_CALENDAR = 90; if (HFCalendar.Y_CALENDAR <= -2) HFCalendar.Y_CALENDAR = -2; if (HFCalendar.X_GOLD >= 0) HFCalendar.X_GOLD = 0; if (HFCalendar.X_GOLD <= -90) HFCalendar.X_GOLD = -90; if (HFCalendar.Y_GOLD >= 95) HFCalendar.Y_GOLD = 95; if (HFCalendar.Y_GOLD <= 0) HFCalendar.Y_GOLD = 0; if (save) { HFCalendar.save(); } } } @SubscribeEvent public void onRenderOverlay(RenderGameOverlayEvent.Pre event) { if (event.getType() == ElementType.HOTBAR) { Minecraft mc = MCClientHelper.getMinecraft(); GlStateManager.pushMatrix(); GlStateManager.enableBlend(); GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); int maxWidth = event.getResolution().getScaledWidth(); int maxHeight = event.getResolution().getScaledHeight(); if (HFCalendar.ENABLE_DATE_HUD && isHUDVisible()) { Calendar calendar = HFTrackers.getCalendar(MCClientHelper.getWorld()); CalendarDate date = calendar.getDate(); boolean inMine = mc.theWorld.provider.getDimension() == HFMining.MINING_ID; Season season = HFApi.calendar.getSeasonAtCoordinates(MCClientHelper.getWorld(), new BlockPos(MCClientHelper.getPlayer())); if (season != null) { SeasonData data = CalendarAPI.INSTANCE.getDataForSeason(season); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); float adjustedX = ((HFCalendar.X_CALENDAR / 100F) * maxWidth); float adjustedY = ((HFCalendar.Y_CALENDAR / 100F) * maxHeight); if (!HFCalendar.HIDE_CALENDAR_TEXTURE) { mc.renderEngine.bindTexture(inMine ? MINE_HUD : data.getResource()); mc.ingameGUI.drawTexturedModalRect(adjustedX - 44, adjustedY - 35, 0, 0, 256, 110); } //Enlarge the Day GlStateManager.pushMatrix(); GlStateManager.scale(1.4F, 1.4F, 1.4F); String header = inMine ? TextFormatting.GRAY + TextHelper.format("harvestfestival.mine.format", "" + MiningHelper.getFloor((int)mc.thePlayer.posX >> 4, (int) Math.min(247, Math.max(1, mc.thePlayer.posY)))) : TextHelper.format("harvestfestival.calendar.date", season.getDisplayName(), (date.getDay() + 1)); mc.fontRendererObj.drawStringWithShadow(header, (adjustedX / 1.4F) + 30, (adjustedY / 1.4F) + 7, 0xFFFFFFFF); GlStateManager.popMatrix(); //Draw the time GlStateManager.pushMatrix(); String time = formatTime(CalendarHelper.getScaledTime((int) CalendarHelper.getTime(MCClientHelper.getWorld()))); mc.fontRendererObj.drawStringWithShadow("(" + date.getWeekday().getLocalizedName() + ")" + " " + time, adjustedX + 42, adjustedY + 23, 0xFFFFFFFF); GlStateManager.popMatrix(); } } if (HFCalendar.ENABLE_GOLD_HUD) { String text = NumberFormat.getNumberInstance(Locale.ENGLISH).format(HFApi.player.getStatsForPlayer(MCClientHelper.getPlayer()).getGold()); float adjustedX = ((HFCalendar.X_GOLD / 100F) * maxWidth); float adjustedY = ((HFCalendar.Y_GOLD / 100F) * maxHeight); if (!HIDE_GOLD_TEXTURE) { mc.getTextureManager().bindTexture(HFModInfo.ELEMENTS); mc.ingameGUI.drawTexturedModalRect(maxWidth - mc.fontRendererObj.getStringWidth(text) - 20 + adjustedX, 2 + adjustedY, 244, 0, 12, 12); } int coinWidth = maxWidth - mc.fontRendererObj.getStringWidth(text) - 5 + (int) adjustedX; mc.fontRendererObj.drawStringWithShadow(text, coinWidth, 5 + adjustedY, 0xFFFFFFFF); } GlStateManager.disableBlend(); GlStateManager.popMatrix(); } } }