@@ -7,17 +7,17 @@ import net.minecraft.network.chat.Component;
|
|||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
public class FirstTimeScreen extends Screen {
|
public class FirstTimeScreen extends Screen {
|
||||||
private static final int FRAME_WIDTH = 854;
|
private static final int FRAME_WIDTH = 256;
|
||||||
private static final int FRAME_HEIGHT = 480;
|
private static final int FRAME_HEIGHT = 144;
|
||||||
private static final int COLUMNS = 10;
|
private static final int COLUMNS = 10;
|
||||||
private static final int ROWS = 10;
|
private static final int ROWS = 10;
|
||||||
private static final int FRAME_COUNT = COLUMNS * ROWS;
|
private static final int FRAME_COUNT = COLUMNS * ROWS;
|
||||||
private static final int BORDER = 0xFFFF7A70;
|
private static final int BORDER = 0xFFFF7A70;
|
||||||
private static final int BORDER_HOVER = 0xFFFF9B91;
|
private static final int BORDER_HOVER = 0xFFFF9B91;
|
||||||
private static final Choice[] CHOICES = new Choice[] {
|
private static final Choice[] CHOICES = new Choice[] {
|
||||||
new Choice("gui_screen_1.png", 42, "REALISTIC", Config.Client.ParticleRenderMode.REALISTIC),
|
new Choice("gui_screen_1.png", 12, "REALISTIC", Config.Client.ParticleRenderMode.REALISTIC),
|
||||||
new Choice("gui_screen_2.png", 42, "VANILLA-LIKE", Config.Client.ParticleRenderMode.VANILA),
|
new Choice("gui_screen_2.png", 28, "VANILLA-LIKE", Config.Client.ParticleRenderMode.VANILA),
|
||||||
new Choice("gui_screen_3.png", 42, "REALISTIC 2", Config.Client.ParticleRenderMode.REALISTIC_2)
|
new Choice("gui_screen_3.png", 44, "REALISTIC 2", Config.Client.ParticleRenderMode.REALISTIC_2)
|
||||||
};
|
};
|
||||||
|
|
||||||
private final Rect[] cardRects = new Rect[] { Rect.empty(), Rect.empty(), Rect.empty() };
|
private final Rect[] cardRects = new Rect[] { Rect.empty(), Rect.empty(), Rect.empty() };
|
||||||
@@ -31,18 +31,20 @@ public class FirstTimeScreen extends Screen {
|
|||||||
graphics.fill(0, 0, this.width, this.height, 0xFF050506);
|
graphics.fill(0, 0, this.width, this.height, 0xFF050506);
|
||||||
this.drawAmbient(graphics);
|
this.drawAmbient(graphics);
|
||||||
|
|
||||||
int top = Math.max(34, this.height / 6);
|
int top = Math.max(28, this.height / 9);
|
||||||
graphics.drawCenteredString(this.font, Component.literal("Choose Your Explosion Style."), this.width / 2, top, 0xFFFF9900);
|
graphics.drawCenteredString(this.font, Component.literal("Choose Your Explosion Style."), this.width / 2, top, 0xFFFF9900);
|
||||||
graphics.drawCenteredString(this.font, Component.literal("You can change this anytime in the config"), this.width / 2, top + 25, 0xFFE5E5E5);
|
graphics.drawCenteredString(this.font, Component.literal("You can change this anytime in the config"), this.width / 2, top + 25, 0xFFE5E5E5);
|
||||||
graphics.drawCenteredString(this.font, Component.literal("The game may differ from the animations because compression has altered them."), this.width / 2, top + 48, 0xFF9C9C9C);
|
graphics.drawCenteredString(this.font, Component.literal("The game may differ from the animations because compression has altered them."), this.width / 2, top + 48, 0xFF9C9C9C);
|
||||||
|
|
||||||
int cardW = Math.min(420, Math.max(220, (this.width - 170) / 2));
|
int availableCardH = Math.max(78, (this.height - top - 188) / 2);
|
||||||
|
int cardW = Math.min(360, Math.max(150, (this.width - 170) / 2));
|
||||||
|
cardW = Math.min(cardW, availableCardH * FRAME_WIDTH / FRAME_HEIGHT);
|
||||||
int cardH = cardW * FRAME_HEIGHT / FRAME_WIDTH;
|
int cardH = cardW * FRAME_HEIGHT / FRAME_WIDTH;
|
||||||
int gap = Math.max(34, this.width / 28);
|
int gap = Math.max(34, this.width / 28);
|
||||||
int firstX = this.width / 2 - cardW - gap / 2;
|
int firstX = this.width / 2 - cardW - gap / 2;
|
||||||
int secondX = this.width / 2 + gap / 2;
|
int secondX = this.width / 2 + gap / 2;
|
||||||
int firstRowY = top + 88;
|
int firstRowY = top + 92;
|
||||||
int secondRowY = firstRowY + cardH + 84;
|
int secondRowY = firstRowY + cardH + 60;
|
||||||
|
|
||||||
this.cardRects[0] = new Rect(firstX, firstRowY, cardW, cardH + 58);
|
this.cardRects[0] = new Rect(firstX, firstRowY, cardW, cardH + 58);
|
||||||
this.cardRects[1] = new Rect(secondX, firstRowY, cardW, cardH + 58);
|
this.cardRects[1] = new Rect(secondX, firstRowY, cardW, cardH + 58);
|
||||||
@@ -81,7 +83,7 @@ public class FirstTimeScreen extends Screen {
|
|||||||
int imageW = rect.w;
|
int imageW = rect.w;
|
||||||
int imageH = rect.w * FRAME_HEIGHT / FRAME_WIDTH;
|
int imageH = rect.w * FRAME_HEIGHT / FRAME_WIDTH;
|
||||||
graphics.fill(imageX - 6, imageY - 6, imageX + imageW + 6, imageY + imageH + 6, hovered ? BORDER_HOVER : BORDER);
|
graphics.fill(imageX - 6, imageY - 6, imageX + imageW + 6, imageY + imageH + 6, hovered ? BORDER_HOVER : BORDER);
|
||||||
this.drawSheetFrame(graphics, choice.texture, choice.frame, imageX, imageY, imageW, imageH);
|
this.drawSheetFrame(graphics, choice.texture, (this.currentFrame(65L) + choice.frameOffset) % FRAME_COUNT, imageX, imageY, imageW, imageH);
|
||||||
graphics.drawCenteredString(this.font, Component.literal(choice.label), imageX + imageW / 2, imageY + imageH + 28, 0xFFFFFFFF);
|
graphics.drawCenteredString(this.font, Component.literal(choice.label), imageX + imageW / 2, imageY + imageH + 28, 0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,12 +100,16 @@ public class FirstTimeScreen extends Screen {
|
|||||||
graphics.pose().popPose();
|
graphics.pose().popPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int currentFrame(long frameTimeMillis) {
|
||||||
|
return (int)((System.currentTimeMillis() / frameTimeMillis) % FRAME_COUNT);
|
||||||
|
}
|
||||||
|
|
||||||
private void drawAmbient(GuiGraphics graphics) {
|
private void drawAmbient(GuiGraphics graphics) {
|
||||||
for (int i = 0; i < 96; ++i) {
|
for (int i = 0; i < 48; ++i) {
|
||||||
int x = Math.floorMod(i * 173 + 19, Math.max(1, this.width));
|
int x = Math.floorMod(i * 173 + 19, Math.max(1, this.width));
|
||||||
int y = Math.floorMod(i * 97 + 53, Math.max(1, this.height));
|
int y = Math.floorMod(i * 97 + 53, Math.max(1, this.height));
|
||||||
int color = i % 7 == 0 ? 0xFFFFB347 : 0xFF414141;
|
int color = i % 7 == 0 ? 0xFFFFB347 : 0xFF414141;
|
||||||
graphics.fill(x, y, x + 2, y + 2, color);
|
graphics.fill(x, y, x + 1, y + 1, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,13 +120,13 @@ public class FirstTimeScreen extends Screen {
|
|||||||
|
|
||||||
private static final class Choice {
|
private static final class Choice {
|
||||||
private final ResourceLocation texture;
|
private final ResourceLocation texture;
|
||||||
private final int frame;
|
private final int frameOffset;
|
||||||
private final String label;
|
private final String label;
|
||||||
private final Config.Client.ParticleRenderMode mode;
|
private final Config.Client.ParticleRenderMode mode;
|
||||||
|
|
||||||
private Choice(String fileName, int frame, String label, Config.Client.ParticleRenderMode mode) {
|
private Choice(String fileName, int frameOffset, String label, Config.Client.ParticleRenderMode mode) {
|
||||||
this.texture = ResourceLocation.fromNamespaceAndPath("explosionoverhaul", "intro_gui/" + fileName);
|
this.texture = ResourceLocation.fromNamespaceAndPath("explosionoverhaul", "intro_gui/preview/" + fileName);
|
||||||
this.frame = frame;
|
this.frameOffset = frameOffset;
|
||||||
this.label = label;
|
this.label = label;
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import net.minecraft.resources.ResourceLocation;
|
|||||||
import net.minecraft.util.FormattedCharSequence;
|
import net.minecraft.util.FormattedCharSequence;
|
||||||
|
|
||||||
public class GuideSlidesScreen extends Screen {
|
public class GuideSlidesScreen extends Screen {
|
||||||
private static final int FRAME_WIDTH = 854;
|
private static final int FRAME_WIDTH = 256;
|
||||||
private static final int FRAME_HEIGHT = 480;
|
private static final int FRAME_HEIGHT = 144;
|
||||||
private static final int COLUMNS = 14;
|
private static final int COLUMNS = 14;
|
||||||
private static final int ROWS = 14;
|
private static final int ROWS = 14;
|
||||||
private static final int FRAME_COUNT = COLUMNS * ROWS;
|
private static final int FRAME_COUNT = COLUMNS * ROWS;
|
||||||
@@ -17,11 +17,11 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
private static final int RED = 0xFF561818;
|
private static final int RED = 0xFF561818;
|
||||||
private static final int RED_HOVER = 0xFF752020;
|
private static final int RED_HOVER = 0xFF752020;
|
||||||
private static final Slide[] SLIDES = new Slide[] {
|
private static final Slide[] SLIDES = new Slide[] {
|
||||||
new Slide("claster_slide.png", 82, "Cluster TNT - If you place more than two TNT blocks next to each other, the explosion will be much stronger!"),
|
new Slide("claster_slide.png", 177, "Cluster TNT - If you place more than two TNT blocks next to each other, the explosion will be much stronger!"),
|
||||||
new Slide("cave_slide.png", 64, "Caves - If an explosion happens on the surface while you're underground, you'll hear a terrifying rumble, and the ground and dripstones will start to crumble!"),
|
new Slide("cave_slide.png", 121, "Caves - If an explosion happens on the surface while you're underground, you'll hear a terrifying rumble, and the ground and dripstones will start to crumble!"),
|
||||||
new Slide("glass_slide.png", 56, "Glass Shattering - Explosions create shockwaves! Be careful when working with explosives near settlements."),
|
new Slide("glass_slide.png", 98, "Glass Shattering - Explosions create shockwaves! Be careful when working with explosives near settlements."),
|
||||||
new Slide("lamp_slide.png", 74, "Lamp Flickering - If an explosion happens near lamps, the lights will start to flicker."),
|
new Slide("lamp_slide.png", 154, "Lamp Flickering - If an explosion happens near lamps, the lights will start to flicker."),
|
||||||
new Slide("speed_of_sound_slide.png", 78, "Speed of Sound - Explosions travel at the speed of sound. You can also enable \"Epic Mode\" in the settings!")
|
new Slide("speed_of_sound_slide.png", 140, "Speed of Sound - Explosions travel at the speed of sound. You can also enable \"Epic Mode\" in the settings!")
|
||||||
};
|
};
|
||||||
|
|
||||||
private int slideIndex;
|
private int slideIndex;
|
||||||
@@ -38,27 +38,29 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
graphics.fill(0, 0, this.width, this.height, 0xFF070708);
|
graphics.fill(0, 0, this.width, this.height, 0xFF070708);
|
||||||
this.drawAmbient(graphics);
|
this.drawAmbient(graphics);
|
||||||
|
|
||||||
int imageW = Math.min(this.width - 220, 1100);
|
int imageW = Math.min(this.width - 220, 1080);
|
||||||
int imageH = imageW * FRAME_HEIGHT / FRAME_WIDTH;
|
int imageH = imageW * FRAME_HEIGHT / FRAME_WIDTH;
|
||||||
int maxImageH = Math.max(180, this.height / 3);
|
int imageY = Math.max(28, this.height / 9);
|
||||||
|
int maxImageH = Math.max(120, this.height - imageY - 220);
|
||||||
if (imageH > maxImageH) {
|
if (imageH > maxImageH) {
|
||||||
imageH = maxImageH;
|
imageH = Math.max(120, maxImageH);
|
||||||
imageW = imageH * FRAME_WIDTH / FRAME_HEIGHT;
|
imageW = imageH * FRAME_WIDTH / FRAME_HEIGHT;
|
||||||
}
|
}
|
||||||
int imageX = (this.width - imageW) / 2;
|
int imageX = (this.width - imageW) / 2;
|
||||||
int imageY = Math.max(42, this.height / 8);
|
|
||||||
|
|
||||||
graphics.fill(imageX - 8, imageY - 8, imageX + imageW + 8, imageY + imageH + 8, 0xFF1E1205);
|
graphics.fill(imageX - 8, imageY - 8, imageX + imageW + 8, imageY + imageH + 8, 0xFF1E1205);
|
||||||
graphics.fill(imageX - 4, imageY - 4, imageX + imageW + 4, imageY + imageH + 4, 0xFF3D270E);
|
graphics.fill(imageX - 4, imageY - 4, imageX + imageW + 4, imageY + imageH + 4, 0xFF3D270E);
|
||||||
this.drawSheetFrame(graphics, SLIDES[this.slideIndex].texture, SLIDES[this.slideIndex].frame, imageX, imageY, imageW, imageH);
|
Slide slide = SLIDES[this.slideIndex];
|
||||||
|
this.drawSheetFrame(graphics, slide.texture, this.currentFrame(slide.frameCount, 55L), imageX, imageY, imageW, imageH);
|
||||||
|
|
||||||
int textWidth = Math.min(this.width - 240, 1040);
|
int textWidth = Math.min(this.width - 240, 1040);
|
||||||
int textY = imageY + imageH + 44;
|
int textY = imageY + imageH + 44;
|
||||||
this.drawCenteredWrappedText(graphics, SLIDES[this.slideIndex].text, this.width / 2, textY, textWidth, 0xFFFFFFFF);
|
this.drawCenteredWrappedText(graphics, slide.text, this.width / 2, textY, textWidth, 0xFFFFFFFF);
|
||||||
|
|
||||||
int arrowY = imageY + imageH / 2 - 46;
|
int arrowSize = 74;
|
||||||
this.leftArrow = new Rect(Math.max(16, imageX / 2 - 46), arrowY, 92, 92);
|
int arrowY = imageY + imageH / 2 - arrowSize / 2;
|
||||||
this.rightArrow = new Rect(Math.min(this.width - 108, imageX + imageW + (this.width - imageX - imageW) / 2 - 46), arrowY, 92, 92);
|
this.leftArrow = new Rect(Math.max(18, imageX / 2 - arrowSize / 2), arrowY, arrowSize, arrowSize);
|
||||||
|
this.rightArrow = new Rect(Math.min(this.width - arrowSize - 18, imageX + imageW + (this.width - imageX - imageW) / 2 - arrowSize / 2), arrowY, arrowSize, arrowSize);
|
||||||
if (this.slideIndex > 0) {
|
if (this.slideIndex > 0) {
|
||||||
this.drawArrow(graphics, this.leftArrow, "<", this.leftArrow.contains(mouseX, mouseY));
|
this.drawArrow(graphics, this.leftArrow, "<", this.leftArrow.contains(mouseX, mouseY));
|
||||||
}
|
}
|
||||||
@@ -66,9 +68,9 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
this.drawArrow(graphics, this.rightArrow, ">", this.rightArrow.contains(mouseX, mouseY));
|
this.drawArrow(graphics, this.rightArrow, ">", this.rightArrow.contains(mouseX, mouseY));
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipW = 156;
|
int skipW = 142;
|
||||||
int skipH = 44;
|
int skipH = 38;
|
||||||
this.skipButton = new Rect((this.width - skipW) / 2, this.height - 84, skipW, skipH);
|
this.skipButton = new Rect((this.width - skipW) / 2, this.height - 58, skipW, skipH);
|
||||||
this.drawFlatButton(graphics, this.skipButton, "Skip Guide", this.skipButton.contains(mouseX, mouseY));
|
this.drawFlatButton(graphics, this.skipButton, "Skip Guide", this.skipButton.contains(mouseX, mouseY));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,6 +112,11 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
graphics.pose().popPose();
|
graphics.pose().popPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int currentFrame(int frameCount, long frameTimeMillis) {
|
||||||
|
int maxFrame = Math.max(1, Math.min(frameCount, FRAME_COUNT));
|
||||||
|
return (int)((System.currentTimeMillis() / frameTimeMillis) % maxFrame);
|
||||||
|
}
|
||||||
|
|
||||||
private void drawCenteredWrappedText(GuiGraphics graphics, String text, int centerX, int y, int maxWidth, int color) {
|
private void drawCenteredWrappedText(GuiGraphics graphics, String text, int centerX, int y, int maxWidth, int color) {
|
||||||
List<FormattedCharSequence> lines = this.font.split(Component.literal(text), maxWidth);
|
List<FormattedCharSequence> lines = this.font.split(Component.literal(text), maxWidth);
|
||||||
int lineY = y;
|
int lineY = y;
|
||||||
@@ -120,8 +127,8 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void drawArrow(GuiGraphics graphics, Rect rect, String text, boolean hovered) {
|
private void drawArrow(GuiGraphics graphics, Rect rect, String text, boolean hovered) {
|
||||||
graphics.fill(rect.x, rect.y, rect.x + rect.w, rect.y + rect.h, hovered ? RED_HOVER : RED);
|
this.drawDisc(graphics, rect.centerX(), rect.centerY(), rect.w / 2, hovered ? RED_HOVER : RED);
|
||||||
graphics.drawCenteredString(this.font, Component.literal(text), rect.x + rect.w / 2, rect.y + 36, 0xFFFFFFFF);
|
graphics.drawCenteredString(this.font, Component.literal(text), rect.centerX(), rect.centerY() - 4, 0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawFlatButton(GuiGraphics graphics, Rect rect, String text, boolean hovered) {
|
private void drawFlatButton(GuiGraphics graphics, Rect rect, String text, boolean hovered) {
|
||||||
@@ -130,11 +137,18 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void drawAmbient(GuiGraphics graphics) {
|
private void drawAmbient(GuiGraphics graphics) {
|
||||||
for (int i = 0; i < 72; ++i) {
|
for (int i = 0; i < 42; ++i) {
|
||||||
int x = Math.floorMod(i * 131 + 17, Math.max(1, this.width));
|
int x = Math.floorMod(i * 131 + 17, Math.max(1, this.width));
|
||||||
int y = Math.floorMod(i * 71 + 41, Math.max(1, this.height));
|
int y = Math.floorMod(i * 71 + 41, Math.max(1, this.height));
|
||||||
int color = i % 5 == 0 ? ACCENT : 0xFF444444;
|
int color = i % 5 == 0 ? ACCENT : 0xFF444444;
|
||||||
graphics.fill(x, y, x + 2, y + 2, color);
|
graphics.fill(x, y, x + 1, y + 1, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawDisc(GuiGraphics graphics, int centerX, int centerY, int radius, int color) {
|
||||||
|
for (int y = -radius; y <= radius; ++y) {
|
||||||
|
int halfWidth = (int)Math.sqrt(radius * radius - y * y);
|
||||||
|
graphics.fill(centerX - halfWidth, centerY + y, centerX + halfWidth + 1, centerY + y + 1, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,12 +159,12 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
|
|
||||||
private static final class Slide {
|
private static final class Slide {
|
||||||
private final ResourceLocation texture;
|
private final ResourceLocation texture;
|
||||||
private final int frame;
|
private final int frameCount;
|
||||||
private final String text;
|
private final String text;
|
||||||
|
|
||||||
private Slide(String fileName, int frame, String text) {
|
private Slide(String fileName, int frameCount, String text) {
|
||||||
this.texture = ResourceLocation.fromNamespaceAndPath("explosionoverhaul", "intro_gui/" + fileName);
|
this.texture = ResourceLocation.fromNamespaceAndPath("explosionoverhaul", "intro_gui/preview/" + fileName);
|
||||||
this.frame = frame;
|
this.frameCount = frameCount;
|
||||||
this.text = text;
|
this.text = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,5 +189,13 @@ public class GuideSlidesScreen extends Screen {
|
|||||||
private boolean contains(double mouseX, double mouseY) {
|
private boolean contains(double mouseX, double mouseY) {
|
||||||
return mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.w && mouseY < this.y + this.h;
|
return mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.w && mouseY < this.y + this.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int centerX() {
|
||||||
|
return this.x + this.w / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int centerY() {
|
||||||
|
return this.y + this.h / 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 2.8 MiB |