Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: setup jdk
uses: actions/setup-java@v4
with:
java-version: '21'
java-version: '25'
distribution: 'microsoft'
- name: make gradle wrapper executable
run: chmod +x ./gradlew
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: setup jdk
uses: actions/setup-java@v4
with:
java-version: '21'
java-version: '25'
distribution: 'microsoft'
- name: make gradle wrapper executable
run: chmod +x ./gradlew
Expand All @@ -34,4 +34,4 @@ jobs:
version: ${{ github.event.release.tag_name }}
version-type: release
loaders: fabric
game-versions: 1.21.11
game-versions: 26.1
15 changes: 7 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'net.fabricmc.fabric-loom-remap' version "${loom_version}"
id 'net.fabricmc.fabric-loom' version "${loom_version}"
id 'maven-publish'
}

Expand Down Expand Up @@ -38,13 +38,12 @@ loom {
dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.officialMojangMappings()
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
implementation "net.fabricmc:fabric-loader:${project.loader_version}"

// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

modCompileOnly "maven.modrinth:iris:${project.iris_version}"
compileOnly "maven.modrinth:iris:${project.iris_version}"
}

processResources {
Expand All @@ -56,7 +55,7 @@ processResources {
}

tasks.withType(JavaCompile).configureEach {
it.options.release = 21
it.options.release = 25
}

java {
Expand All @@ -65,8 +64,8 @@ java {
// If you remove this line, sources will not be generated.
withSourcesJar()

sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
sourceCompatibility = JavaVersion.VERSION_25
targetCompatibility = JavaVersion.VERSION_25
}

jar {
Expand Down
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ org.gradle.configuration-cache=false

# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=1.21.11
minecraft_version=26.1
loader_version=0.18.4
loom_version=1.14-SNAPSHOT
loom_version=1.15-SNAPSHOT

# Mod Properties
mod_version=0.0.7
maven_group=net.imaginefun
archives_base_name=ImagineFunUtils

# Dependencies
fabric_version=0.140.2+1.21.11
iris_version=1.10.5+1.21.11-fabric
fabric_version=0.144.3+26.1
iris_version=1.10.8+26.1-fabric
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
3 changes: 3 additions & 0 deletions src/client/java/net/imaginefun/ImagineFunUtilsClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.loader.api.FabricLoader;
import net.imaginefun.gui.TitleScreenHandler;
import net.imaginefun.networking.ClientCustomPacketListener;
import net.imaginefun.networking.ClientCustomPacketListenerImpl;
import net.imaginefun.networking.HandshakePayload;
Expand All @@ -26,6 +27,8 @@ public void onInitializeClient() {
ClientPlayNetworking.send(new HandshakePayload(version));
});

TitleScreenHandler.register();

}

public ClientCustomPacketListener getClientCustomPacketListener() {
Expand Down
44 changes: 16 additions & 28 deletions src/client/java/net/imaginefun/gui/ImagineFunButton.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
package net.imaginefun.gui;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ActiveTextCollector;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.WidgetSprites;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.network.chat.TextColor;

public class ImagineFunButton extends Button {

private static final WidgetSprites SPRITES = new WidgetSprites(
Identifier.withDefaultNamespace("widget/button"),
Identifier.withDefaultNamespace("widget/button_disabled"),
Identifier.withDefaultNamespace("widget/button_highlighted")
);

private static final int COLOR_FROM = 0xFFee609c;
private static final int COLOR_TO = 0xFF4f88de;

Expand All @@ -25,36 +20,29 @@ public ImagineFunButton(int x, int y, int width, int height, Component message,
}

@Override
protected void renderContents(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) {
if (this.alpha <= 0.0f) {
return;
}
Identifier sprite = SPRITES.get(this.active, this.isHovered());
graphics.blitSprite(RenderPipelines.GUI_TEXTURED, sprite, this.getX(), this.getY(), this.width, this.height);
protected void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) {
this.extractDefaultSprite(graphics);

Minecraft minecraft = Minecraft.getInstance();
Font font = minecraft.font;
Font font = Minecraft.getInstance().font;
String text = this.getMessage().getString();

int textWidth = font.width(text);
int textHeight = font.lineHeight;

float startX = this.getX() + (this.width - textWidth) / 2.0f;
float startY = this.getY() + (this.height - textHeight) / 2.0f;

float currentX = startX;
MutableComponent gradientText = Component.empty();
float currentWidth = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
String charStr = String.valueOf(c);
int charWidth = font.width(charStr);

float gradientPos = (currentX - startX + charWidth / 2.0f) / textWidth;
float gradientPos = textWidth > 0 ? (currentWidth + charWidth / 2.0f) / textWidth : 0;
int color = interpolateColor(COLOR_FROM, COLOR_TO, gradientPos);

graphics.drawString(font, charStr, (int) currentX, (int) startY, color, true);

currentX += charWidth;
gradientText.append(Component.literal(charStr).withStyle(Style.EMPTY.withColor(TextColor.fromRgb(color & 0xFFFFFF))));
currentWidth += charWidth;
}

ActiveTextCollector textCollector = graphics.textRendererForWidget(this, GuiGraphicsExtractor.HoveredTextEffects.NONE);
this.extractScrollingStringOverContents(textCollector, gradientText, 2);
}

private int interpolateColor(int from, int to, float t) {
Expand Down
65 changes: 65 additions & 0 deletions src/client/java/net/imaginefun/gui/TitleScreenHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package net.imaginefun.gui;

import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.client.screen.v1.Screens;
import net.imaginefun.ImaginefunUtilsConstants;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.screens.ConnectScreen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.resolver.ServerAddress;
import net.minecraft.network.chat.Component;

public class TitleScreenHandler {

public static void register() {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof TitleScreen)) return;

// Screens.getWidgets() is the Fabric API-provided modifiable widget list.
// Adding to it is the correct way to register widgets from outside a Screen
// subclass (addRenderableWidget is protected). This is the same approach
// used by ModMenu.
var widgets = Screens.getWidgets(screen);

// Find the Singleplayer button dynamically so we anchor to its actual
// position after all other mods (e.g. ModMenu) have already shifted things
// in their own AFTER_INIT or @Inject TAIL handlers.
int singleplayerIndex = -1;
AbstractWidget singleplayerButton = null;
String singleplayerText = Component.translatable("menu.singleplayer").getString();
for (int i = 0; i < widgets.size(); i++) {
AbstractWidget widget = widgets.get(i);
if (singleplayerText.equals(widget.getMessage().getString())) {
singleplayerIndex = i;
singleplayerButton = widget;
break;
}
}
if (singleplayerButton == null) return;

int y = singleplayerButton.getY() + 24;
int x = screen.width / 2 - 100;

for (AbstractWidget widget : widgets) {
if (widget != singleplayerButton && widget.getY() >= y) {
widget.setY(widget.getY() + 24);
}
}

widgets.add(singleplayerIndex + 1, new ImagineFunButton(
x, y, 200, 20,
Component.literal("Join " + ImaginefunUtilsConstants.serverName),
button -> {
ServerData serverData = new ServerData(
ImaginefunUtilsConstants.serverName,
ImaginefunUtilsConstants.serverAddress,
ServerData.Type.OTHER
);
serverData.setResourcePackStatus(ServerData.ServerPackStatus.ENABLED);
ConnectScreen.startConnecting(screen, client, ServerAddress.parseString(ImaginefunUtilsConstants.serverAddress), serverData, false, null);
}
));
});
}
}
15 changes: 0 additions & 15 deletions src/client/java/net/imaginefun/mixins/client/ScreenAccessor.java

This file was deleted.

Loading
Loading