cn.academy.vanilla.electromaster.client.effect.CurrentChargingHUD.java Source code

Java tutorial

Introduction

Here is the source code for cn.academy.vanilla.electromaster.client.effect.CurrentChargingHUD.java

Source

/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.vanilla.electromaster.client.effect;

import cn.academy.core.Resources;
import cn.lambdalib.util.client.HudUtils;
import cn.lambdalib.util.client.RenderUtils;
import cn.lambdalib.util.client.auxgui.AuxGui;
import cn.lambdalib.util.generic.RandUtils;
import cn.lambdalib.util.helper.GameTimer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;

/**
 * @author WeAthFolD
 */
public class CurrentChargingHUD extends AuxGui {

    private static final ResourceLocation mask = Resources.getTexture("effects/em_intensify_mask");
    static final long BLEND_TIME = 500, BLEND_OUT_TIME = 200;

    SubArcHandler2D arcHandler;

    public CurrentChargingHUD() {
        arcHandler = new SubArcHandler2D(Resources.ARC_SMALL);

        /* Generate charging arc */ {
            int gen = RandUtils.rangei(5, 7);
            while (gen-- > 0) {
                double phi = RandUtils.ranged(0.84, 0.96);
                double theta = RandUtils.ranged(0, Math.PI * 2);
                double size = RandUtils.ranged(25, 30);

                SubArc2D arc = arcHandler.generateAt(phi * Math.sin(theta), phi * Math.cos(theta), size);
                arc.life = 233333;
                arc.frameRate = 0.3;
                arc.switchRate = 0.0;
            }
        }
        this.requireTicking = true;
    }

    private long blendTime = -1;

    public void startBlend(boolean regen) {
        blendTime = GameTimer.getTime();

        arcHandler.clear();

        if (regen && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0) {
            int gen = RandUtils.rangei(10, 15);
            while (gen-- > 0) {
                double phi = RandUtils.ranged(0.6, 1);
                double theta = RandUtils.ranged(0, Math.PI * 2);
                double size = RandUtils.ranged(35, 40);

                SubArc2D arc = arcHandler.generateAt(phi * Math.sin(theta), phi * Math.cos(theta), size);
                arc.life = 25;
                arc.frameRate = 0.3;
                arc.switchRate = 0.2;
            }
        }
    }

    private boolean isBlendingOut() {
        return blendTime != -1;
    }

    @Override
    public void tick() {
        arcHandler.tick();
    }

    @Override
    public void draw(ScaledResolution sr) {
        double width = sr.getScaledWidth_double(), height = sr.getScaledHeight_double();
        GL11.glDisable(GL11.GL_ALPHA_TEST);

        arcHandler.xScale = width / 2;
        arcHandler.yScale = height / 2;

        double mAlpha;
        if (isBlendingOut()) {
            mAlpha = 1 - (double) (GameTimer.getTime() - blendTime) / BLEND_OUT_TIME;
            if (mAlpha < 0)
                mAlpha = 0;
        } else {
            mAlpha = Math.min((double) this.getTimeActive() / BLEND_TIME, 1.0);
        }

        /* Black Mask */ {
            GL11.glColor4d(0, 0, 0, 0.1 * mAlpha);
            HudUtils.colorRect(0, 0, width, height);
            GL11.glColor4d(1, 1, 1, 1);
        }

        /* Blue Mask */ {
            GL11.glColor4d(1, 1, 1, 1 * mAlpha);
            RenderUtils.loadTexture(mask);
            HudUtils.rect(0, 0, width, height);
        }

        /* SubArc */ {
            GL11.glColor4d(1, 1, 1, isBlendingOut() ? 0.4 : 0.3);
            GL11.glPushMatrix();
            GL11.glTranslated(width / 2, height / 2, 0);
            arcHandler.drawAll();
            GL11.glPopMatrix();
        }

        if (isBlendingOut() && GameTimer.getTime() - blendTime > 1000)
            dispose();
    }

    @Override
    public boolean isForeground() {
        return false;
    }

}