aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java834
1 files changed, 439 insertions, 395 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
index 21427e47..976dfcf8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
@@ -22,399 +22,443 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DungeonWin {
- private static class Confetti {
- private float x;
- private float y;
- private float xLast;
- private float yLast;
- private int life = 0;
- private float xVel;
- private float yVel;
- private final int id;
-
- public Confetti(float x, float y, float xVel, float yVel) {
- this.x = x;
- this.xLast = x;
- this.y = y;
- this.yLast = y;
- this.xVel = xVel;
- this.yVel = yVel;
- this.id = rand.nextInt(16);
- this.life = 20 + rand.nextInt(10);
- }
- }
-
- public static ResourceLocation CONFETTI = new ResourceLocation("notenoughupdates:dungeon_win/confetti.png");
- public static ResourceLocation SPLUS = new ResourceLocation("notenoughupdates:dungeon_win/splus.png");
- public static ResourceLocation S = new ResourceLocation("notenoughupdates:dungeon_win/s.png");
- public static ResourceLocation A = new ResourceLocation("notenoughupdates:dungeon_win/a.png");
- public static ResourceLocation B = new ResourceLocation("notenoughupdates:dungeon_win/b.png");
- public static ResourceLocation C = new ResourceLocation("notenoughupdates:dungeon_win/c.png");
- public static ResourceLocation D = new ResourceLocation("notenoughupdates:dungeon_win/d.png");
- public static ResourceLocation TEAM_SCORE = SPLUS;
-
- private static final int SCALE_FACTOR = 3;
- private static final int WIDTH = 32 * SCALE_FACTOR;
- private static final int HEIGHT = 16 * SCALE_FACTOR;
-
- private static boolean hideChat = false;
- private static long lastDungeonFinish = 0;
- private static final Pattern TEAM_SCORE_REGEX = Pattern.compile("Team Score: [0-9]+ \\((S\\+|S|A|B|C|D)\\)");
-
- private static final ScheduledExecutorService SES = Executors.newScheduledThreadPool(1);
-
- public static Random rand = new Random();
- public static List<Confetti> confetti = new ArrayList<>();
- public static List<String> text = new ArrayList<>();
- public static long startTime = 0;
-
- static {
- for (int i = 0; i < 10; i++) {
- text.add("{PLACEHOLDER DUNGEON STAT #" + i + "}");
- }
- }
-
- public static void displayWin() {
- if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
- return;
- startTime = System.currentTimeMillis();
- confetti.clear();
- }
-
- public static void tick() {
- if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
- return;
- if (System.currentTimeMillis() - startTime > 5000) return;
- int deltaTime = (int) (System.currentTimeMillis() - startTime);
-
- if (deltaTime < 1000) {
- ScaledResolution sr = Utils.pushGuiScale(2);
- int cap = 0;
- switch (TEAM_SCORE.getResourcePath()) {
- case "dungeon_win/splus.png":
- cap = 200;
- break;
- case "dungeon_win/s.png":
- cap = 100;
- break;
- case "dungeon_win/a.png":
- cap = 50;
- break;
- }
- int maxConfetti = Math.min(cap, deltaTime / 5);
- while (confetti.size() < maxConfetti) {
- int y;
- if (deltaTime < 500) {
- y = sr.getScaledHeight() / 2 - (int) (Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() / 9);
- } else {
- y = sr.getScaledHeight() / 6 + (int) (Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 / 18);
- }
- int xOffset = -WIDTH / 2 + rand.nextInt(WIDTH);
- int x = sr.getScaledWidth() / 2 + xOffset;
-
- int xVel = xOffset / 2;
- int yVel = -25 - rand.nextInt(10) + Math.abs(xVel) / 2;
-
- confetti.add(new Confetti(x, y, xVel, yVel));
- }
- } else {
- Set<Confetti> toRemove = new HashSet<>();
- for (Confetti c : confetti) {
- if (c.life <= 0) {
- toRemove.add(c);
- }
- }
- try {
- confetti.removeAll(toRemove);
- } catch (ConcurrentModificationException ignored) {}
- }
-
- Utils.pushGuiScale(-1);
- for (Confetti c : confetti) {
- c.yVel += 1;
- c.xVel /= 1.1f;
- c.yVel /= 1.1f;
- c.xLast = c.x;
- c.yLast = c.y;
- c.x += c.xVel;
- c.y += c.yVel;
- c.life--;
- }
- }
-
- public static void onChatMessage(ClientChatReceivedEvent e) {
- if (e.type == 2) return;
-
- if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
- return;
-
- long currentTime = System.currentTimeMillis();
- String unformatted = Utils.cleanColour(e.message.getUnformattedText());
-
- //Added two more Resets, can't do Reset+Reset+Reset cause idk?
- //hypixel please don't randomly add more
-
- if (e.message.getFormattedText().startsWith(EnumChatFormatting.RESET + "" + EnumChatFormatting.RESET + "" + EnumChatFormatting.RESET + " ")) {
- if (currentTime - lastDungeonFinish > 30000) {
- Matcher matcher = TEAM_SCORE_REGEX.matcher(unformatted);
- if (matcher.find()) {
- lastDungeonFinish = currentTime;
- String score = matcher.group(1);
- switch (score.toUpperCase()) {
- case "S+":
- TEAM_SCORE = SPLUS;
- break;
- case "S":
- TEAM_SCORE = S;
- break;
- case "A":
- TEAM_SCORE = A;
- break;
- case "B":
- TEAM_SCORE = B;
- break;
- case "C":
- TEAM_SCORE = C;
- break;
- default:
- TEAM_SCORE = D;
- break;
- }
-
- SES.schedule(() -> NotEnoughUpdates.INSTANCE.sendChatMessage("/showextrastats"), 100L, TimeUnit.MILLISECONDS);
- }
- }
- }
- if (currentTime - lastDungeonFinish > 100 && currentTime - lastDungeonFinish < 10000) {
- if (hideChat) {
- if (text.size() > 50) text.clear();
-
- e.setCanceled(true);
- if (unformatted.contains("\u25AC")) {
- hideChat = false;
- displayWin();
- } else {
- if (unformatted.trim().length() > 0) {
- text.add(e.message.getFormattedText().substring(6).trim());
- }
- }
- } else {
- if (unformatted.contains("\u25AC")) {
- hideChat = true;
- text.clear();
- e.setCanceled(true);
- }
- }
-
- }
- }
-
- public static void render(float partialTicks) {
- if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
- return;
- int maxTime = Math.min(30000, NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis);
- if (System.currentTimeMillis() - startTime > maxTime) return;
- int deltaTime = (int) (System.currentTimeMillis() - startTime);
-
- float alpha = Math.max(0, Math.min(1, 1 - (deltaTime - maxTime + 150) / 150f));
-
- ScaledResolution sr = Utils.pushGuiScale(2);
-
- if (deltaTime > 600) {
- float bottom;
- if (deltaTime < 1000) {
- bottom = sr.getScaledHeight() / 6f + (float) Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 / 18 + HEIGHT / 2;
- } else {
- bottom = sr.getScaledHeight() / 6f + HEIGHT / 2;
- }
- for (int i = 0; i < text.size(); i++) {
- String line = text.get(i);
- float textCenterY = sr.getScaledHeight() / 6f + HEIGHT / 2 + 7 + i * 10;
- if (textCenterY > bottom) {
- int textAlpha = (int) (alpha * (deltaTime > 1000 ? 255 : Math.min(255, (textCenterY - bottom) / 30f * 255)));
- GlStateManager.enableBlend();
-
- if (textAlpha > 150) {
- for (int xOff = -2; xOff <= 2; xOff++) {
- for (int yOff = -2; yOff <= 2; yOff++) {
- if (Math.abs(xOff) != Math.abs(yOff)) {
- Utils.drawStringCentered(Utils.cleanColourNotModifiers(line), Minecraft.getMinecraft().fontRendererObj,
- sr.getScaledWidth() / 2 + xOff / 2f, textCenterY + yOff / 2f, false,
- ((textAlpha / Math.max(Math.abs(xOff), Math.abs(yOff))) << 24));
- }
- }
- }
- }
-
- Utils.drawStringCentered(line, Minecraft.getMinecraft().fontRendererObj,
- sr.getScaledWidth() / 2, textCenterY, false, (textAlpha << 24) | 0x00FFFFFF);
- }
- }
- }
-
- for (Confetti c : confetti) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(CONFETTI);
- GlStateManager.color(1, 1, 1, 1);
- if (c.life >= 15) {
- GlStateManager.color(1, 1, 1, Math.min(1, c.life / 4f));
- Utils.drawTexturedRect(c.xLast + (c.x - c.xLast) * partialTicks - 4, c.yLast + (c.y - c.yLast) * partialTicks - 4,
- 8, 8, (c.id % 4) / 4f, (c.id % 4 + 1) / 4f, (c.id / 4) / 4f, (c.id / 4 + 1) / 4f, GL11.GL_NEAREST);
- }
- }
-
- Minecraft.getMinecraft().getTextureManager().bindTexture(TEAM_SCORE);
- GlStateManager.color(1, 1, 1, alpha);
-
- GlStateManager.pushMatrix();
- if (deltaTime < 1600) {
- GlStateManager.translate(sr.getScaledWidth() / 2, 0, 0);
- if (deltaTime < 500) {
- GlStateManager.translate(0, sr.getScaledHeight() / 2f - Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() / 9, 0);
- } else if (deltaTime < 1000) {
- GlStateManager.translate(0, sr.getScaledHeight() / 6f + Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 / 18, 0);
- } else {
- GlStateManager.translate(0, sr.getScaledHeight() / 6f, 0);
- }
- if (deltaTime < 200) {
- float scale = deltaTime / 200f;
- GlStateManager.scale(scale, scale, 1);
- } else if (deltaTime < 1000) {
- float scale = 1 + (float) Math.sin((deltaTime - 200) / 800f * Math.PI) * 0.8f;
- GlStateManager.scale(scale, scale, 1);
- } else if (deltaTime < 1100) {
- float scale = 1 + (float) Math.sin((deltaTime - 1000) / 100f * Math.PI) * 0.15f;
- GlStateManager.scale(scale, scale, 1);
- }
-
- if (deltaTime < 600) {
- GlStateManager.rotate(180 + deltaTime / 600f * 180, 0, 1, 0);
- GlStateManager.rotate(180 - deltaTime / 600f * 180, 1, 0, 0);
- GlStateManager.rotate(-180 - deltaTime / 600f * 165, 0, 0, 1);
- } else if (deltaTime < 1000) {
- GlStateManager.rotate(15 - (deltaTime - 600) / 400f * 11, 0, 0, 1);
- } else {
- float logFac = 1 - (float) Math.log((deltaTime - 1000) / 600f * 1.7f + 1);
- logFac = logFac * logFac;
-
- GlStateManager.rotate(4f * logFac, 0, 0, 1);
- float x = (deltaTime - 1000) / 300f;
- GlStateManager.rotate((float) (40 * (1 - Math.log(x * 0.85f + 1)) * Math.sin(10 * x * x)), 0, 1, 0);
- }
- } else {
- GlStateManager.translate(sr.getScaledWidth() / 2, sr.getScaledHeight() / 6f, 0);
- }
-
- GlStateManager.disableCull();
-
- Utils.drawTexturedRect(-WIDTH / 2, -HEIGHT / 2, WIDTH, HEIGHT, GL11.GL_NEAREST);
- GlStateManager.translate(0, 0, -SCALE_FACTOR * 2);
- Utils.drawTexturedRect(-WIDTH / 2, -HEIGHT / 2, WIDTH, HEIGHT, GL11.GL_NEAREST);
- GlStateManager.translate(0, 0, SCALE_FACTOR * 2);
-
- if (deltaTime < 1600) {
- float epsilon = 0.01f;
- for (int xIndex = 0; xIndex < 32; xIndex++) {
- for (int yIndex = 0; yIndex < 16; yIndex++) {
- float uMin = xIndex / 32f;
- float uMax = (xIndex + 1) / 32f;
- float vMin = yIndex / 16f;
- float vMax = (yIndex + 1) / 16f;
-
- int x = -WIDTH / 2 + xIndex * SCALE_FACTOR;
- int y = -HEIGHT / 2 + yIndex * SCALE_FACTOR;
-
- GlStateManager.enableTexture2D();
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
-
- GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
-
- Tessellator tessellator = Tessellator.getInstance();
- WorldRenderer worldrenderer = tessellator.getWorldRenderer();
- //Left
- worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
- worldrenderer
- .pos(x + epsilon, y + SCALE_FACTOR, 0.0D + epsilon)
- .tex(uMin, vMax).endVertex();
- worldrenderer
- .pos(x + epsilon, y, 0.0D + epsilon)
- .tex(uMax, vMax).endVertex();
- worldrenderer
- .pos(x + epsilon, y, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMax, vMin).endVertex();
- worldrenderer
- .pos(x + epsilon, y + SCALE_FACTOR, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMin, vMin).endVertex();
- tessellator.draw();
- //Right
- worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
- worldrenderer
- .pos(x + SCALE_FACTOR - epsilon, y + SCALE_FACTOR, 0.0D + epsilon)
- .tex(uMin, vMax).endVertex();
- worldrenderer
- .pos(x + SCALE_FACTOR - epsilon, y, 0.0D + epsilon)
- .tex(uMax, vMax).endVertex();
- worldrenderer
- .pos(x + SCALE_FACTOR - epsilon, y, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMax, vMin).endVertex();
- worldrenderer
- .pos(x + SCALE_FACTOR - epsilon, y + SCALE_FACTOR, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMin, vMin).endVertex();
- tessellator.draw();
- //Top
- worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
- worldrenderer
- .pos(x + SCALE_FACTOR, y + epsilon, 0.0D + epsilon)
- .tex(uMin, vMax).endVertex();
- worldrenderer
- .pos(x, y + epsilon, 0.0D + epsilon)
- .tex(uMax, vMax).endVertex();
- worldrenderer
- .pos(x, y + epsilon, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMax, vMin).endVertex();
- worldrenderer
- .pos(x + SCALE_FACTOR, y + epsilon, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMin, vMin).endVertex();
- tessellator.draw();
- //Top
- worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
- worldrenderer
- .pos(x + SCALE_FACTOR, y + SCALE_FACTOR - epsilon, 0.0D + epsilon)
- .tex(uMin, vMax).endVertex();
- worldrenderer
- .pos(x, y + SCALE_FACTOR - epsilon, 0.0D + epsilon)
- .tex(uMax, vMax).endVertex();
- worldrenderer
- .pos(x, y + SCALE_FACTOR - epsilon, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMax, vMin).endVertex();
- worldrenderer
- .pos(x + SCALE_FACTOR, y + SCALE_FACTOR - epsilon, -SCALE_FACTOR * 2 - epsilon)
- .tex(uMin, vMin).endVertex();
- tessellator.draw();
-
- GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
-
- GlStateManager.disableBlend();
- }
- }
- }
-
- GlStateManager.popMatrix();
-
- for (Confetti c : confetti) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(CONFETTI);
- GlStateManager.color(1, 1, 1, 1);
- if (c.life > 0 && c.life < 15) {
- GlStateManager.color(1, 1, 1, Math.min(1, c.life / 4f));
- Utils.drawTexturedRect(c.xLast + (c.x - c.xLast) * partialTicks - 4, c.yLast + (c.y - c.yLast) * partialTicks - 4,
- 8, 8, (c.id % 4) / 4f, (c.id % 4 + 1) / 4f, (c.id / 4) / 4f, (c.id / 4 + 1) / 4f, GL11.GL_NEAREST);
- }
- }
-
- Utils.pushGuiScale(-1);
-
- GlStateManager.enableBlend();
- }
+ private static class Confetti {
+ private float x;
+ private float y;
+ private float xLast;
+ private float yLast;
+ private int life = 0;
+ private float xVel;
+ private float yVel;
+ private final int id;
+
+ public Confetti(float x, float y, float xVel, float yVel) {
+ this.x = x;
+ this.xLast = x;
+ this.y = y;
+ this.yLast = y;
+ this.xVel = xVel;
+ this.yVel = yVel;
+ this.id = rand.nextInt(16);
+ this.life = 20 + rand.nextInt(10);
+ }
+ }
+
+ public static ResourceLocation CONFETTI = new ResourceLocation("notenoughupdates:dungeon_win/confetti.png");
+ public static ResourceLocation SPLUS = new ResourceLocation("notenoughupdates:dungeon_win/splus.png");
+ public static ResourceLocation S = new ResourceLocation("notenoughupdates:dungeon_win/s.png");
+ public static ResourceLocation A = new ResourceLocation("notenoughupdates:dungeon_win/a.png");
+ public static ResourceLocation B = new ResourceLocation("notenoughupdates:dungeon_win/b.png");
+ public static ResourceLocation C = new ResourceLocation("notenoughupdates:dungeon_win/c.png");
+ public static ResourceLocation D = new ResourceLocation("notenoughupdates:dungeon_win/d.png");
+ public static ResourceLocation TEAM_SCORE = SPLUS;
+
+ private static final int SCALE_FACTOR = 3;
+ private static final int WIDTH = 32 * SCALE_FACTOR;
+ private static final int HEIGHT = 16 * SCALE_FACTOR;
+
+ private static boolean hideChat = false;
+ private static long lastDungeonFinish = 0;
+ private static final Pattern TEAM_SCORE_REGEX = Pattern.compile("Team Score: [0-9]+ \\((S\\+|S|A|B|C|D)\\)");
+
+ private static final ScheduledExecutorService SES = Executors.newScheduledThreadPool(1);
+
+ public static Random rand = new Random();
+ public static List<Confetti> confetti = new ArrayList<>();
+ public static List<String> text = new ArrayList<>();
+ public static long startTime = 0;
+
+ static {
+ for (int i = 0; i < 10; i++) {
+ text.add("{PLACEHOLDER DUNGEON STAT #" + i + "}");
+ }
+ }
+
+ public static void displayWin() {
+ if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 ||
+ !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
+ return;
+ startTime = System.currentTimeMillis();
+ confetti.clear();
+ }
+
+ public static void tick() {
+ if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 ||
+ !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
+ return;
+ if (System.currentTimeMillis() - startTime > 5000) return;
+ int deltaTime = (int) (System.currentTimeMillis() - startTime);
+
+ if (deltaTime < 1000) {
+ ScaledResolution sr = Utils.pushGuiScale(2);
+ int cap = 0;
+ switch (TEAM_SCORE.getResourcePath()) {
+ case "dungeon_win/splus.png":
+ cap = 200;
+ break;
+ case "dungeon_win/s.png":
+ cap = 100;
+ break;
+ case "dungeon_win/a.png":
+ cap = 50;
+ break;
+ }
+ int maxConfetti = Math.min(cap, deltaTime / 5);
+ while (confetti.size() < maxConfetti) {
+ int y;
+ if (deltaTime < 500) {
+ y = sr.getScaledHeight() / 2 - (int) (Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() / 9);
+ } else {
+ y = sr.getScaledHeight() / 6 + (int) (Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 / 18);
+ }
+ int xOffset = -WIDTH / 2 + rand.nextInt(WIDTH);
+ int x = sr.getScaledWidth() / 2 + xOffset;
+
+ int xVel = xOffset / 2;
+ int yVel = -25 - rand.nextInt(10) + Math.abs(xVel) / 2;
+
+ confetti.add(new Confetti(x, y, xVel, yVel));
+ }
+ } else {
+ Set<Confetti> toRemove = new HashSet<>();
+ for (Confetti c : confetti) {
+ if (c.life <= 0) {
+ toRemove.add(c);
+ }
+ }
+ try {
+ confetti.removeAll(toRemove);
+ } catch (ConcurrentModificationException ignored) {
+ }
+ }
+
+ Utils.pushGuiScale(-1);
+ for (Confetti c : confetti) {
+ c.yVel += 1;
+ c.xVel /= 1.1f;
+ c.yVel /= 1.1f;
+ c.xLast = c.x;
+ c.yLast = c.y;
+ c.x += c.xVel;
+ c.y += c.yVel;
+ c.life--;
+ }
+ }
+
+ public static void onChatMessage(ClientChatReceivedEvent e) {
+ if (e.type == 2) return;
+
+ if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 ||
+ !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
+ return;
+
+ long currentTime = System.currentTimeMillis();
+ String unformatted = Utils.cleanColour(e.message.getUnformattedText());
+
+ //Added two more Resets, can't do Reset+Reset+Reset cause idk?
+ //hypixel please don't randomly add more
+
+ if (e.message.getFormattedText().startsWith(
+ EnumChatFormatting.RESET + "" + EnumChatFormatting.RESET + "" + EnumChatFormatting.RESET + " ")) {
+ if (currentTime - lastDungeonFinish > 30000) {
+ Matcher matcher = TEAM_SCORE_REGEX.matcher(unformatted);
+ if (matcher.find()) {
+ lastDungeonFinish = currentTime;
+ String score = matcher.group(1);
+ switch (score.toUpperCase()) {
+ case "S+":
+ TEAM_SCORE = SPLUS;
+ break;
+ case "S":
+ TEAM_SCORE = S;
+ break;
+ case "A":
+ TEAM_SCORE = A;
+ break;
+ case "B":
+ TEAM_SCORE = B;
+ break;
+ case "C":
+ TEAM_SCORE = C;
+ break;
+ default:
+ TEAM_SCORE = D;
+ break;
+ }
+
+ SES.schedule(() -> NotEnoughUpdates.INSTANCE.sendChatMessage("/showextrastats"), 100L, TimeUnit.MILLISECONDS);
+ }
+ }
+ }
+ if (currentTime - lastDungeonFinish > 100 && currentTime - lastDungeonFinish < 10000) {
+ if (hideChat) {
+ if (text.size() > 50) text.clear();
+
+ e.setCanceled(true);
+ if (unformatted.contains("\u25AC")) {
+ hideChat = false;
+ displayWin();
+ } else {
+ if (unformatted.trim().length() > 0) {
+ text.add(e.message.getFormattedText().substring(6).trim());
+ }
+ }
+ } else {
+ if (unformatted.contains("\u25AC")) {
+ hideChat = true;
+ text.clear();
+ e.setCanceled(true);
+ }
+ }
+
+ }
+ }
+
+ public static void render(float partialTicks) {
+ if (NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis < 100 ||
+ !NotEnoughUpdates.INSTANCE.config.dungeons.enableDungeonWin)
+ return;
+ int maxTime = Math.min(30000, NotEnoughUpdates.INSTANCE.config.dungeons.dungeonWinMillis);
+ if (System.currentTimeMillis() - startTime > maxTime) return;
+ int deltaTime = (int) (System.currentTimeMillis() - startTime);
+
+ float alpha = Math.max(0, Math.min(1, 1 - (deltaTime - maxTime + 150) / 150f));
+
+ ScaledResolution sr = Utils.pushGuiScale(2);
+
+ if (deltaTime > 600) {
+ float bottom;
+ if (deltaTime < 1000) {
+ bottom = sr.getScaledHeight() / 6f + (float) Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 /
+ 18 + HEIGHT / 2;
+ } else {
+ bottom = sr.getScaledHeight() / 6f + HEIGHT / 2;
+ }
+ for (int i = 0; i < text.size(); i++) {
+ String line = text.get(i);
+ float textCenterY = sr.getScaledHeight() / 6f + HEIGHT / 2 + 7 + i * 10;
+ if (textCenterY > bottom) {
+ int textAlpha = (int) (alpha * (deltaTime > 1000 ? 255 : Math.min(255, (textCenterY - bottom) / 30f * 255)));
+ GlStateManager.enableBlend();
+
+ if (textAlpha > 150) {
+ for (int xOff = -2; xOff <= 2; xOff++) {
+ for (int yOff = -2; yOff <= 2; yOff++) {
+ if (Math.abs(xOff) != Math.abs(yOff)) {
+ Utils.drawStringCentered(
+ Utils.cleanColourNotModifiers(line),
+ Minecraft.getMinecraft().fontRendererObj,
+ sr.getScaledWidth() / 2 + xOff / 2f,
+ textCenterY + yOff / 2f,
+ false,
+ ((textAlpha / Math.max(Math.abs(xOff), Math.abs(yOff))) << 24)
+ );
+ }
+ }
+ }
+ }
+
+ Utils.drawStringCentered(line, Minecraft.getMinecraft().fontRendererObj,
+ sr.getScaledWidth() / 2, textCenterY, false, (textAlpha << 24) | 0x00FFFFFF
+ );
+ }
+ }
+ }
+
+ for (Confetti c : confetti) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(CONFETTI);
+ GlStateManager.color(1, 1, 1, 1);
+ if (c.life >= 15) {
+ GlStateManager.color(1, 1, 1, Math.min(1, c.life / 4f));
+ Utils.drawTexturedRect(
+ c.xLast + (c.x - c.xLast) * partialTicks - 4,
+ c.yLast + (c.y - c.yLast) * partialTicks - 4,
+ 8,
+ 8,
+ (c.id % 4) / 4f,
+ (c.id % 4 + 1) / 4f,
+ (c.id / 4) / 4f,
+ (c.id / 4 + 1) / 4f,
+ GL11.GL_NEAREST
+ );
+ }
+ }
+
+ Minecraft.getMinecraft().getTextureManager().bindTexture(TEAM_SCORE);
+ GlStateManager.color(1, 1, 1, alpha);
+
+ GlStateManager.pushMatrix();
+ if (deltaTime < 1600) {
+ GlStateManager.translate(sr.getScaledWidth() / 2, 0, 0);
+ if (deltaTime < 500) {
+ GlStateManager.translate(
+ 0,
+ sr.getScaledHeight() / 2f - Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() / 9,
+ 0
+ );
+ } else if (deltaTime < 1000) {
+ GlStateManager.translate(
+ 0,
+ sr.getScaledHeight() / 6f + Math.sin(deltaTime / 1000f * Math.PI) * sr.getScaledHeight() * 4 / 18,
+ 0
+ );
+ } else {
+ GlStateManager.translate(0, sr.getScaledHeight() / 6f, 0);
+ }
+ if (deltaTime < 200) {
+ float scale = deltaTime / 200f;
+ GlStateManager.scale(scale, scale, 1);
+ } else if (deltaTime < 1000) {
+ float scale = 1 + (float) Math.sin((deltaTime - 200) / 800f * Math.PI) * 0.8f;
+ GlStateManager.scale(scale, scale, 1);
+ } else if (deltaTime < 1100) {
+ float scale = 1 + (float) Math.sin((deltaTime - 1000) / 100f * Math.PI) * 0.15f;
+ GlStateManager.scale(scale, scale, 1);
+ }
+
+ if (deltaTime < 600) {
+ GlStateManager.rotate(180 + deltaTime / 600f * 180, 0, 1, 0);
+ GlStateManager.rotate(180 - deltaTime / 600f * 180, 1, 0, 0);
+ GlStateManager.rotate(-180 - deltaTime / 600f * 165, 0, 0, 1);
+ } else if (deltaTime < 1000) {
+ GlStateManager.rotate(15 - (deltaTime - 600) / 400f * 11, 0, 0, 1);
+ } else {
+ float logFac = 1 - (float) Math.log((deltaTime - 1000) / 600f * 1.7f + 1);
+ logFac = logFac * logFac;
+
+ GlStateManager.rotate(4f * logFac, 0, 0, 1);
+ float x = (deltaTime - 1000) / 300f;
+ GlStateManager.rotate((float) (40 * (1 - Math.log(x * 0.85f + 1)) * Math.sin(10 * x * x)), 0, 1, 0);
+ }
+ } else {
+ GlStateManager.translate(sr.getScaledWidth() / 2, sr.getScaledHeight() / 6f, 0);
+ }
+
+ GlStateManager.disableCull();
+
+ Utils.drawTexturedRect(-WIDTH / 2, -HEIGHT / 2, WIDTH, HEIGHT, GL11.GL_NEAREST);
+ GlStateManager.translate(0, 0, -SCALE_FACTOR * 2);
+ Utils.drawTexturedRect(-WIDTH / 2, -HEIGHT / 2, WIDTH, HEIGHT, GL11.GL_NEAREST);
+ GlStateManager.translate(0, 0, SCALE_FACTOR * 2);
+
+ if (deltaTime < 1600) {
+ float epsilon = 0.01f;
+ for (int xIndex = 0; xIndex < 32; xIndex++) {
+ for (int yIndex = 0; yIndex < 16; yIndex++) {
+ float uMin = xIndex / 32f;
+ float uMax = (xIndex + 1) / 32f;
+ float vMin = yIndex / 16f;
+ float vMax = (yIndex + 1) / 16f;
+
+ int x = -WIDTH / 2 + xIndex * SCALE_FACTOR;
+ int y = -HEIGHT / 2 + yIndex * SCALE_FACTOR;
+
+ GlStateManager.enableTexture2D();
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(
+ GL11.GL_SRC_ALPHA,
+ GL11.GL_ONE_MINUS_SRC_ALPHA,
+ GL11.GL_ONE,
+ GL11.GL_ONE_MINUS_SRC_ALPHA
+ );
+
+ GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+
+ Tessellator tessellator = Tessellator.getInstance();
+ WorldRenderer worldrenderer = tessellator.getWorldRenderer();
+ //Left
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
+ worldrenderer
+ .pos(x + epsilon, y + SCALE_FACTOR, 0.0D + epsilon)
+ .tex(uMin, vMax).endVertex();
+ worldrenderer
+ .pos(x + epsilon, y, 0.0D + epsilon)
+ .tex(uMax, vMax).endVertex();
+ worldrenderer
+ .pos(x + epsilon, y, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMax, vMin).endVertex();
+ worldrenderer
+ .pos(x + epsilon, y + SCALE_FACTOR, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMin, vMin).endVertex();
+ tessellator.draw();
+ //Right
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
+ worldrenderer
+ .pos(x + SCALE_FACTOR - epsilon, y + SCALE_FACTOR, 0.0D + epsilon)
+ .tex(uMin, vMax).endVertex();
+ worldrenderer
+ .pos(x + SCALE_FACTOR - epsilon, y, 0.0D + epsilon)
+ .tex(uMax, vMax).endVertex();
+ worldrenderer
+ .pos(x + SCALE_FACTOR - epsilon, y, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMax, vMin).endVertex();
+ worldrenderer
+ .pos(x + SCALE_FACTOR - epsilon, y + SCALE_FACTOR, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMin, vMin).endVertex();
+ tessellator.draw();
+ //Top
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
+ worldrenderer
+ .pos(x + SCALE_FACTOR, y + epsilon, 0.0D + epsilon)
+ .tex(uMin, vMax).endVertex();
+ worldrenderer
+ .pos(x, y + epsilon, 0.0D + epsilon)
+ .tex(uMax, vMax).endVertex();
+ worldrenderer
+ .pos(x, y + epsilon, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMax, vMin).endVertex();
+ worldrenderer
+ .pos(x + SCALE_FACTOR, y + epsilon, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMin, vMin).endVertex();
+ tessellator.draw();
+ //Top
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
+ worldrenderer
+ .pos(x + SCALE_FACTOR, y + SCALE_FACTOR - epsilon, 0.0D + epsilon)
+ .tex(uMin, vMax).endVertex();
+ worldrenderer
+ .pos(x, y + SCALE_FACTOR - epsilon, 0.0D + epsilon)
+ .tex(uMax, vMax).endVertex();
+ worldrenderer
+ .pos(x, y + SCALE_FACTOR - epsilon, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMax, vMin).endVertex();
+ worldrenderer
+ .pos(x + SCALE_FACTOR, y + SCALE_FACTOR - epsilon, -SCALE_FACTOR * 2 - epsilon)
+ .tex(uMin, vMin).endVertex();
+ tessellator.draw();
+
+ GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+
+ GlStateManager.disableBlend();
+ }
+ }
+ }
+
+ GlStateManager.popMatrix();
+
+ for (Confetti c : confetti) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(CONFETTI);
+ GlStateManager.color(1, 1, 1, 1);
+ if (c.life > 0 && c.life < 15) {
+ GlStateManager.color(1, 1, 1, Math.min(1, c.life / 4f));
+ Utils.drawTexturedRect(
+ c.xLast + (c.x - c.xLast) * partialTicks - 4,
+ c.yLast + (c.y - c.yLast) * partialTicks - 4,
+ 8,
+ 8,
+ (c.id % 4) / 4f,
+ (c.id % 4 + 1) / 4f,
+ (c.id / 4) / 4f,
+ (c.id / 4 + 1) / 4f,
+ GL11.GL_NEAREST
+ );
+ }
+ }
+
+ Utils.pushGuiScale(-1);
+
+ GlStateManager.enableBlend();
+ }
}