Compare commits
9 Commits
Author | SHA1 | Date |
---|---|---|
Jill | 0bb24bea8d | |
Jill | dbcbc873b4 | |
Jill | ee2bb2d769 | |
Jill | f6f8d096c1 | |
Jill | 419b7fe35c | |
Jill | 6c71aa8668 | |
Jill | 551e06f092 | |
Jill | 720ced2e96 | |
Jill | a154072f03 |
|
@ -1 +1,2 @@
|
|||
Initial release
|
||||
1.20.1-specific fix:
|
||||
- Fix the GMod logo option
|
10
README.md
10
README.md
|
@ -1,6 +1,4 @@
|
|||
<center>
|
||||
<h1 style="vertical-align:center"><img src="./docs/icon.png" width="32"> GMod Title Screen</h1>
|
||||
</center>
|
||||
<h1><img src="./docs/icon.png" width="32" height="32"> GMod Title Screen</h1>
|
||||
|
||||
Transforms the usual Minecraft title screen into one that looks highly reminiscent of
|
||||
[Garry's Mod](https://store.steampowered.com/app/4000/Garrys_Mod/)'s title screen. Lightly configurable. Originally taken from a
|
||||
|
@ -8,6 +6,12 @@ Transforms the usual Minecraft title screen into one that looks highly reminisce
|
|||
|
||||
![](./docs/screenshot1.png)
|
||||
|
||||
<center>
|
||||
<a href="https://legacy.curseforge.com/minecraft/mc-mods/gmod-title-screen"><img alt="curseforge" height="56" src="https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/curseforge_vector.svg"></a>
|
||||
<a href="https://modrinth.com/mod/gmod-title-screen"><img alt="modrinth" height="56" src="https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/modrinth_vector.svg"></a>
|
||||
<img alt="forge" height="56" src="https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/unsupported/forge_vector.svg">
|
||||
</center>
|
||||
|
||||
---
|
||||
|
||||
Currently, there is no way to change the backgrounds (at least, without having to abide by the resolution and amount
|
||||
|
|
55
build.gradle
55
build.gradle
|
@ -2,7 +2,7 @@ plugins {
|
|||
id 'fabric-loom' version '1.0-SNAPSHOT'
|
||||
id 'maven-publish'
|
||||
id 'io.github.juuxel.loom-quiltflower' version '1.7.+'
|
||||
id 'me.hypherionmc.cursegradle' version '2.+'
|
||||
id 'net.darkhax.curseforgegradle' version '1.+'
|
||||
id "com.modrinth.minotaur" version "2.+"
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,8 @@ repositories {
|
|||
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
|
||||
// for more information about repositories.
|
||||
|
||||
maven { url = "https://api.modrinth.com/maven" } // LazyDFU, Suggestion Tweaker
|
||||
// no longer needed, see dependencies below
|
||||
// maven { url = "https://api.modrinth.com/maven" } // LazyDFU, Suggestion Tweaker
|
||||
maven { url = "https://maven.terraformersmc.com" } // Mod Menu
|
||||
maven { url = "https://maven.shedaniel.me/" } // Cloth Config
|
||||
}
|
||||
|
@ -30,9 +31,11 @@ dependencies {
|
|||
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||
|
||||
modLocalRuntime("maven.modrinth:lazydfu:0.1.2") // lazydfu - improves start times
|
||||
// lazydfu is no longer needed on 1.19.4+
|
||||
//modLocalRuntime("maven.modrinth:lazydfu:0.1.2") // lazydfu - improves start times
|
||||
//modLocalRuntime("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { exclude(group: "net.fabricmc.fabric-api") } // required for suggestion tweaker
|
||||
modLocalRuntime("maven.modrinth:suggestion-tweaker:${project.suggestion_tweaker_version}") // suggestion tweaker - dev QOL, improves command suggestions
|
||||
// does not function on 1.19.2
|
||||
//modLocalRuntime("maven.modrinth:suggestion-tweaker:${project.suggestion_tweaker_version}") // suggestion tweaker - dev QOL, improves command suggestions
|
||||
|
||||
modApi("com.terraformersmc:modmenu:${project.modmenu_version}")
|
||||
|
||||
|
@ -97,32 +100,30 @@ publishing {
|
|||
|
||||
import com.modrinth.minotaur.dependencies.ModDependency
|
||||
|
||||
curseforge {
|
||||
task curseforge(type: net.darkhax.curseforgegradle.TaskPublishCurseForge) {
|
||||
if (!file('./CHANGELOG.md').canRead()) { throw new FileNotFoundException("Could not read changelog file") }
|
||||
apiKey = project.hasProperty("CURSEFORGE_TOKEN") ? project.CURSEFORGE_TOKEN : ""
|
||||
project {
|
||||
id = '699839'
|
||||
changelog = file('./CHANGELOG.md')
|
||||
changelogType = 'markdown'
|
||||
releaseType = 'release'
|
||||
accepted_minecraft_version.split(",").each {
|
||||
addGameVersion it.trim()
|
||||
}
|
||||
|
||||
mainArtifact(remapJar) {
|
||||
displayName = "${mod_version_friendly}"
|
||||
relations {
|
||||
requiredDependency 'fabric-api'
|
||||
requiredDependency 'cloth-config'
|
||||
optionalDependency 'modmenu'
|
||||
}
|
||||
}
|
||||
}
|
||||
options {
|
||||
//debug = true
|
||||
javaVersionAutoDetect = false
|
||||
forgeGradleIntegration = false
|
||||
apiToken = project.hasProperty("CURSEFORGE_TOKEN") ? project.CURSEFORGE_TOKEN : ""
|
||||
|
||||
disableVersionDetection()
|
||||
|
||||
def mainFile = upload('699839', jar)
|
||||
mainFile.displayName = "${mod_version_friendly}"
|
||||
mainFile.changelog = file('./CHANGELOG.md')
|
||||
mainFile.changelogType = 'markdown'
|
||||
mainFile.releaseType = 'release'
|
||||
|
||||
mainFile.addModLoader('fabric', 'quilt')
|
||||
|
||||
accepted_minecraft_version.split(",").each {
|
||||
mainFile.addGameVersion it.trim()
|
||||
}
|
||||
|
||||
mainFile.addRelation('fabric-api', 'requiredDependency')
|
||||
mainFile.addRelation('cloth-config', 'requiredDependency')
|
||||
mainFile.addRelation('modmenu', 'optionalDependency')
|
||||
|
||||
//debugMode = true
|
||||
}
|
||||
|
||||
modrinth {
|
||||
|
|
|
@ -3,24 +3,24 @@ org.gradle.jvmargs=-Xmx1G
|
|||
|
||||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/develop
|
||||
minecraft_version=1.18.2
|
||||
accepted_minecraft_version=1.18,1.18.1,1.18.2
|
||||
yarn_mappings=1.18.2+build.4
|
||||
loader_version=0.14.10
|
||||
minecraft_version=1.20.1
|
||||
accepted_minecraft_version=1.20.1
|
||||
yarn_mappings=1.20.1+build.10
|
||||
loader_version=0.14.22
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 1.0+1.18
|
||||
mod_version_friendly = 1.0 for 1.18.2
|
||||
mod_version = 1.3+1.20.1
|
||||
mod_version_friendly = 1.3 for 1.20.1
|
||||
maven_group = zone.oat
|
||||
archives_base_name = gmod-title-screen
|
||||
|
||||
# Dependencies
|
||||
fabric_version=0.66.0+1.18.2
|
||||
fabric_version=0.87.0+1.20.1
|
||||
# https://modrinth.com/mod/modmenu
|
||||
modmenu_version=3.2.3
|
||||
modmenu_version=7.2.1
|
||||
|
||||
# Dev environment
|
||||
# https://modrinth.com/mod/suggestion-tweaker
|
||||
suggestion_tweaker_version = 1.18.x-1.2.0
|
||||
#suggestion_tweaker_version = 1.19.1-1.3.1
|
||||
# https://modrinth.com/mod/cloth-config
|
||||
cloth_config_version = 6.3.81
|
||||
cloth_config_version = 11.1.106
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package zone.oat.gmodtitlescreen;
|
||||
|
||||
import me.shedaniel.autoconfig.AutoConfig;
|
||||
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Mod implements ClientModInitializer {
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger("");
|
||||
public static ModConfig config;
|
||||
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
AutoConfig.register(ModConfig.class, Toml4jConfigSerializer::new);
|
||||
config = AutoConfig.getConfigHolder(ModConfig.class).getConfig();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package zone.oat.gmodtitlescreen;
|
||||
|
||||
import me.shedaniel.autoconfig.ConfigData;
|
||||
import me.shedaniel.autoconfig.annotation.Config;
|
||||
import me.shedaniel.autoconfig.annotation.ConfigEntry;
|
||||
|
||||
@Config(name = "gmod-title-screen")
|
||||
@Config.Gui.Background("textures/block/blue_concrete_powder.png")
|
||||
public
|
||||
class ModConfig implements ConfigData {
|
||||
@ConfigEntry.Gui.Tooltip(count = 2)
|
||||
public boolean showGModLogo = false;
|
||||
public boolean showSplashText = true;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package zone.oat.gmodtitlescreen;
|
||||
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class ModIdentifier extends Identifier {
|
||||
public ModIdentifier(String path) {
|
||||
super("gmod-title-screen", path);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package zone.oat.gmodtitlescreen;
|
||||
|
||||
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
|
||||
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||
import me.shedaniel.autoconfig.AutoConfig;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class ModMenuIntegration implements ModMenuApi {
|
||||
@Override
|
||||
public ConfigScreenFactory<?> getModConfigScreenFactory() {
|
||||
return parent -> AutoConfig.getConfigScreen(ModConfig.class, parent).get();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package zone.oat.gmodtitlescreen;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.tooltip.Tooltip;
|
||||
import net.minecraft.client.gui.widget.PressableTextWidget;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class PressableTextWithTooltipWidget extends PressableTextWidget {
|
||||
protected final Tooltip tooltip;
|
||||
|
||||
public PressableTextWithTooltipWidget(int x, int y, int width, int height, Text text, PressAction onPress, TextRenderer textRenderer, Tooltip tooltip) {
|
||||
super(x, y, width, height, text, onPress, textRenderer);
|
||||
this.tooltip = tooltip;
|
||||
setTooltip(tooltip);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package zone.oat.gmodtitlescreen.mixin;
|
||||
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import zone.oat.gmodtitlescreen.screen.CustomTitleScreen;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Mixin(TextureManager.class)
|
||||
public class LoadCustomTitleScreenMixin {
|
||||
@Redirect(method = "reload", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/TitleScreen;loadTexturesAsync(Lnet/minecraft/client/texture/TextureManager;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"))
|
||||
private CompletableFuture<Void> injected(TextureManager textureManager, Executor executor) {
|
||||
return CustomTitleScreen.loadTexturesAsync(textureManager, executor);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package zone.oat.gmodtitlescreen.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.TitleScreen;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import zone.oat.gmodtitlescreen.screen.CustomTitleScreen;
|
||||
|
||||
// this sucks. lmao.
|
||||
@Mixin(MinecraftClient.class)
|
||||
public class RedirectTitleScreenMixin {
|
||||
@Redirect(method = "setScreen", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", opcode = Opcodes.PUTFIELD))
|
||||
private void injected(MinecraftClient instance, Screen value) {
|
||||
if (value instanceof TitleScreen) {
|
||||
//instance.currentScreen = new CustomTitleScreen();
|
||||
// this causes a fabric api error of all things, so let's do a little redundancy, shall we?
|
||||
instance.setScreen(new CustomTitleScreen());
|
||||
// yes. Wonderful. let's fucking call it Twice.
|
||||
// (i genuinely could not find anything that Isn't this)
|
||||
} else {
|
||||
instance.currentScreen = value;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,372 @@
|
|||
package zone.oat.gmodtitlescreen.screen;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.terraformersmc.modmenu.gui.ModsScreen;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.SharedConstants;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.DrawableHelper;
|
||||
import net.minecraft.client.gui.screen.ConfirmLinkScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
||||
import net.minecraft.client.gui.screen.option.AccessibilityOptionsScreen;
|
||||
import net.minecraft.client.gui.screen.option.LanguageOptionsScreen;
|
||||
import net.minecraft.client.gui.screen.option.OptionsScreen;
|
||||
import net.minecraft.client.gui.screen.world.SelectWorldScreen;
|
||||
import net.minecraft.client.gui.tooltip.Tooltip;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.PressableTextWidget;
|
||||
import net.minecraft.client.gui.widget.TexturedButtonWidget;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.RotationAxis;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import zone.oat.gmodtitlescreen.Mod;
|
||||
import zone.oat.gmodtitlescreen.ModIdentifier;
|
||||
import zone.oat.gmodtitlescreen.PressableTextWithTooltipWidget;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class CustomTitleScreen extends Screen {
|
||||
public static final Text VERSION_TEXT = Text.translatable("menu.gmod-title-screen.version", SharedConstants.getGameVersion().getName(), FabricLoader.getInstance().getModContainer("gmod-title-screen").get().getMetadata().getVersion().getFriendlyString());
|
||||
private static final Identifier ACCESSIBILITY_ICON_TEXTURE = new Identifier("textures/gui/accessibility.png");
|
||||
private final boolean isMinceraft;
|
||||
@Nullable
|
||||
private String splashText;
|
||||
private static final Identifier MINECRAFT_TITLE_TEXTURE = new Identifier("textures/gui/title/minecraft.png");
|
||||
private static final Identifier EDITION_TITLE_TEXTURE = new Identifier("textures/gui/title/edition.png");
|
||||
private static final Identifier GMOD_TITLE_TEXTURE = new ModIdentifier("textures/gui/title/gmod_title.png");
|
||||
|
||||
private PressableTextWidget version;
|
||||
|
||||
private class SmallPressableTextWidget extends PressableTextWidget {
|
||||
public SmallPressableTextWidget(int x, int y, int width, int height, Text text, PressAction onPress, TextRenderer textRenderer) {
|
||||
super(x, y, width, height, text, onPress, textRenderer);
|
||||
}
|
||||
|
||||
public boolean shouldDownscale() {
|
||||
return this.width > CustomTitleScreen.this.width * 0.6f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
matrices.push();
|
||||
if (shouldDownscale()) {
|
||||
matrices.translate(CustomTitleScreen.this.width, 0d, 0d);
|
||||
matrices.scale(0.5f, 0.5f, 1.0f);
|
||||
matrices.translate(-CustomTitleScreen.this.width, 0d, 0d);
|
||||
}
|
||||
|
||||
int padding = 3;
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
DrawableHelper.fill(matrices, version.getX() - padding, version.getY() - padding, version.getX() + version.getWidth() + padding * 2, version.getY() + version.getHeight() + padding * 2, 0xFF111111);
|
||||
|
||||
super.renderButton(matrices, mouseX, mouseY, delta);
|
||||
|
||||
matrices.pop();
|
||||
}
|
||||
}
|
||||
|
||||
private static CompletableFuture<Void> loadBackgroundTexturesAsync(TextureManager textureManager, Executor executor) {
|
||||
return SlideshowBackground.loadBackgroundTexturesAsync(textureManager, executor);
|
||||
}
|
||||
|
||||
private void openLink(String url) {
|
||||
this.client.setScreen(new ConfirmLinkScreen(openInBrowser -> {
|
||||
if (openInBrowser) {
|
||||
Util.getOperatingSystem().open(url);
|
||||
}
|
||||
|
||||
this.client.setScreen(this);
|
||||
}, url, true));
|
||||
}
|
||||
|
||||
public CustomTitleScreen() {
|
||||
super(Text.translatable("narrator.screen.title"));
|
||||
this.isMinceraft = (double)new Random().nextFloat() < 1.0E-4;
|
||||
}
|
||||
|
||||
public static CompletableFuture<Void> loadTexturesAsync(TextureManager textureManager, Executor executor) {
|
||||
return CompletableFuture.allOf(
|
||||
textureManager.loadTextureAsync(MINECRAFT_TITLE_TEXTURE, executor),
|
||||
textureManager.loadTextureAsync(EDITION_TITLE_TEXTURE, executor),
|
||||
textureManager.loadTextureAsync(GMOD_TITLE_TEXTURE, executor),
|
||||
loadBackgroundTexturesAsync(textureManager, executor)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldPause() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldCloseOnEsc() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private int getXPadding() {
|
||||
return this.width / 22;
|
||||
}
|
||||
|
||||
private int getLogoY() {
|
||||
if (Mod.config.showGModLogo) {
|
||||
return this.height / 32;
|
||||
} else {
|
||||
return this.height / 12;
|
||||
}
|
||||
}
|
||||
|
||||
private int getLogoHeight() {
|
||||
if (Mod.config.showGModLogo) {
|
||||
return 75;
|
||||
} else {
|
||||
return 50;
|
||||
}
|
||||
}
|
||||
|
||||
private double getSplashTextX() {
|
||||
if (Mod.config.showGModLogo) {
|
||||
return 220d;
|
||||
} else {
|
||||
return 260d;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
if (this.splashText == null) {
|
||||
this.splashText = this.client.getSplashTextLoader().get();
|
||||
}
|
||||
|
||||
int versionWidth = this.textRenderer.getWidth(VERSION_TEXT) - 1;
|
||||
int versionX = this.width - versionWidth;
|
||||
int buttonsX = getXPadding();
|
||||
int buttonsY = getLogoY() * 2 + getLogoHeight();
|
||||
|
||||
int buttonHeight = 12;
|
||||
int buttonSpacing = buttonHeight + 1;
|
||||
int buttonSectionSpacing = 6;
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY,
|
||||
130,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.singleplayer"),
|
||||
button -> this.client.setScreen(new SelectWorldScreen(this)),
|
||||
this.textRenderer
|
||||
));
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 1,
|
||||
130,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.multiplayer"),
|
||||
button -> {
|
||||
this.client.setScreen(new MultiplayerScreen(this));
|
||||
},
|
||||
this.textRenderer
|
||||
));
|
||||
|
||||
boolean modsButtonActive = FabricLoader.getInstance().isModLoaded("modmenu");
|
||||
if (modsButtonActive) {
|
||||
var modsButton = this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 2 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.modmenu"),
|
||||
button -> this.client.setScreen(new ModsScreen(this)),
|
||||
textRenderer
|
||||
));
|
||||
modsButton.active = true;
|
||||
} else {
|
||||
var modsButton = this.addDrawableChild(new PressableTextWithTooltipWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 2 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.modmenu").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer,
|
||||
Tooltip.of(Text.translatable("menu.gmod-title-screen.modmenu.not-installed"), Text.translatable("menu.gmod-title-screen.modmenu.not-installed"))
|
||||
));
|
||||
modsButton.active = false;
|
||||
}
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 3 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.dupes").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 4 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.demos").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 5 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.saves").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 6 + buttonSectionSpacing * 2,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.options"),
|
||||
button -> this.client.setScreen(new OptionsScreen(this, this.client.options)),
|
||||
textRenderer
|
||||
));
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 7 + buttonSectionSpacing * 3,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.quit"),
|
||||
button -> this.client.scheduleStop(),
|
||||
textRenderer
|
||||
));
|
||||
|
||||
this.addDrawableChild(
|
||||
new TexturedButtonWidget(
|
||||
this.width - 22,
|
||||
this.height - 22,
|
||||
20,
|
||||
20,
|
||||
0,
|
||||
106,
|
||||
20,
|
||||
ButtonWidget.WIDGETS_TEXTURE,
|
||||
256,
|
||||
256,
|
||||
button -> this.client.setScreen(new LanguageOptionsScreen(this, this.client.options, this.client.getLanguageManager())),
|
||||
Text.translatable("narrator.button.language")
|
||||
)
|
||||
);
|
||||
this.addDrawableChild(new TexturedButtonWidget(
|
||||
this.width - 22 - 22,
|
||||
this.height - 22,
|
||||
20,
|
||||
20,
|
||||
0,
|
||||
0,
|
||||
20,
|
||||
ACCESSIBILITY_ICON_TEXTURE,
|
||||
32,
|
||||
64,
|
||||
button -> this.client.setScreen(new AccessibilityOptionsScreen(this, this.client.options)),
|
||||
Text.translatable("narrator.button.accessibility")
|
||||
));
|
||||
|
||||
version = this.addDrawableChild(
|
||||
new SmallPressableTextWidget(
|
||||
versionX - 8, 6, versionWidth, 7, VERSION_TEXT, button -> openLink("https://git.oat.zone/oat/gmod-title-screen"), this.textRenderer
|
||||
)
|
||||
);
|
||||
version.setAlpha(0.8f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
int logoX = getXPadding();
|
||||
int logoY = getLogoY();
|
||||
|
||||
SlideshowBackground.render(matrices, delta, this.width, this.height);
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
int gradientWidth = (int)(this.width * 0.7);
|
||||
|
||||
matrices.push();
|
||||
matrices.translate(gradientWidth/2f, this.height/2f, 0);
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-90f));
|
||||
DrawableHelper.fillGradient(matrices, -(int)Math.floor(this.height/2f), -(int)Math.floor(gradientWidth/2f) - 1, (int)Math.ceil(this.height/2f), (int)Math.ceil(gradientWidth/2f), 0x7b000000, 0x00000000, 0);
|
||||
matrices.pop();
|
||||
|
||||
DrawableHelper.fill(matrices, 0, this.height - 24, this.width, this.height, 0x70111111);
|
||||
|
||||
if (Mod.config.showGModLogo) {
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
//RenderSystem.defaultBlendFunc();
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
|
||||
RenderSystem.setShaderTexture(0, GMOD_TITLE_TEXTURE);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
this.drawTexture(matrices, logoX, logoY, 0, 0, 256, 256);
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.defaultBlendFunc();
|
||||
} else {
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderTexture(0, MINECRAFT_TITLE_TEXTURE);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
if (this.isMinceraft) {
|
||||
this.drawWithOutline(logoX, logoY, (x, y) -> {
|
||||
this.drawTexture(matrices, x + 0, y, 0, 0, 99, 44);
|
||||
this.drawTexture(matrices, x + 99, y, 129, 0, 27, 44);
|
||||
this.drawTexture(matrices, x + 99 + 26, y, 126, 0, 3, 44);
|
||||
this.drawTexture(matrices, x + 99 + 26 + 3, y, 99, 0, 26, 44);
|
||||
this.drawTexture(matrices, x + 155, y, 0, 45, 155, 44);
|
||||
});
|
||||
} else {
|
||||
this.drawWithOutline(logoX, logoY, (x, y) -> {
|
||||
this.drawTexture(matrices, x + 0, y, 0, 0, 155, 44);
|
||||
this.drawTexture(matrices, x + 155, y, 0, 45, 155, 44);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
RenderSystem.setShaderTexture(0, EDITION_TITLE_TEXTURE);
|
||||
drawTexture(matrices, logoX + 88, logoY + 37, 0.0F, 0.0F, 98, 14, 128, 16);
|
||||
*/
|
||||
|
||||
if (this.splashText != null && Mod.config.showSplashText) {
|
||||
matrices.push();
|
||||
matrices.translate(getSplashTextX(), logoY + getLogoHeight() - 10, 0.0);
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-20.0F));
|
||||
float h = 1.8F - MathHelper.abs(MathHelper.sin((float)(Util.getMeasuringTimeMs() % 1000L) / 1000.0F * (float) (Math.PI * 2)) * 0.1F);
|
||||
h = h * 100.0F / (float)(this.textRenderer.getWidth(this.splashText) + 32);
|
||||
matrices.scale(h, h, h);
|
||||
drawCenteredTextWithShadow(matrices, this.textRenderer, this.splashText, 0, -8, 16776960);
|
||||
matrices.pop();
|
||||
}
|
||||
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
package zone.oat.gmodtitlescreen.screen;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.client.util.math.Vector2f;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.RotationAxis;
|
||||
import zone.oat.gmodtitlescreen.ModIdentifier;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import static net.minecraft.client.gui.DrawableHelper.drawTexture;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class SlideshowBackground {
|
||||
private static final Identifier[] BACKGROUNDS = {
|
||||
new ModIdentifier("textures/gui/title/background/background_0.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_1.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_2.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_3.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_4.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_5.png"),
|
||||
new ModIdentifier("textures/gui/title/background/background_6.png"),
|
||||
};
|
||||
private static final Integer[][] BACKGROUND_SIZES = {
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
{960, 528},
|
||||
};
|
||||
private static final float SLIDESHOW_IMAGE_LENGTH = 400f;
|
||||
private static final float TRANSITION_LENGTH = 30f;
|
||||
private static float t = TRANSITION_LENGTH;
|
||||
|
||||
public static CompletableFuture<Void> loadBackgroundTexturesAsync(TextureManager textureManager, Executor executor) {
|
||||
CompletableFuture<?>[] completableFutures = new CompletableFuture[BACKGROUNDS.length];
|
||||
|
||||
for(int i = 0; i < completableFutures.length; ++i) {
|
||||
completableFutures[i] = textureManager.loadTextureAsync(BACKGROUNDS[i], executor);
|
||||
}
|
||||
|
||||
return CompletableFuture.allOf(completableFutures);
|
||||
}
|
||||
|
||||
private static void renderBackground(MatrixStack matrices, float a, int backgroundIndex, float alpha, int width, int height) {
|
||||
matrices.push();
|
||||
|
||||
Identifier bg = BACKGROUNDS[backgroundIndex];
|
||||
Integer[] backgroundSize = BACKGROUND_SIZES[backgroundIndex];
|
||||
float baseScale = Math.max(width / (float) backgroundSize[0], height / (float) backgroundSize[1]);
|
||||
Vector2f overscan = new Vector2f(backgroundSize[0] * baseScale - width, backgroundSize[1] * baseScale - height);
|
||||
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderTexture(0, bg);
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, alpha);
|
||||
|
||||
float scale = MathHelper.lerp(a, 1.1f, 1.2f);
|
||||
float angle = MathHelper.lerp(a, -1f, 3f);
|
||||
|
||||
matrices.translate(width / 2f, height / 2f, 0f);
|
||||
matrices.scale(scale, scale, 1f);
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(angle));
|
||||
drawTexture(
|
||||
matrices,
|
||||
(int) Math.floor(-overscan.getX()/2f - width/2f),
|
||||
(int) Math.floor(-overscan.getY()/2f - height/2f),
|
||||
width + (int) Math.ceil(overscan.getX()),
|
||||
height + (int) Math.ceil(overscan.getY()),
|
||||
0.0F,
|
||||
0.0F,
|
||||
1, 1, 1, 1
|
||||
);
|
||||
matrices.translate(width / 2f, height / 2f, 0f);
|
||||
|
||||
matrices.pop();
|
||||
}
|
||||
|
||||
public static void render(MatrixStack matrices, float delta, int width, int height) {
|
||||
t += delta;
|
||||
|
||||
int index = (int) Math.floor(t / SLIDESHOW_IMAGE_LENGTH) % BACKGROUNDS.length;
|
||||
int previousIndex = (index - 1 + BACKGROUNDS.length) % BACKGROUNDS.length;
|
||||
float a = (t % SLIDESHOW_IMAGE_LENGTH) / SLIDESHOW_IMAGE_LENGTH;
|
||||
float transition = MathHelper.clamp(a / (TRANSITION_LENGTH / SLIDESHOW_IMAGE_LENGTH), 0f, 1f);
|
||||
|
||||
if (transition < 1f) {
|
||||
renderBackground(matrices, a + 1f, previousIndex, 1f, width, height);
|
||||
}
|
||||
renderBackground(matrices, a, index, transition, width, height);
|
||||
}
|
||||
}
|
|
@ -3,32 +3,17 @@ package zone.oat.gmodtitlescreen;
|
|||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
|
||||
import net.minecraft.client.gui.screen.narration.NarrationPart;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.tooltip.Tooltip;
|
||||
import net.minecraft.client.gui.widget.PressableTextWidget;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class PressableTextWithTooltipWidget extends PressableTextWidget {
|
||||
protected final ButtonWidget.TooltipSupplier tooltipSupplier;
|
||||
protected final Tooltip tooltip;
|
||||
|
||||
public PressableTextWithTooltipWidget(int x, int y, int width, int height, Text text, ButtonWidget.PressAction onPress, TextRenderer textRenderer, ButtonWidget.TooltipSupplier tooltipSupplier) {
|
||||
public PressableTextWithTooltipWidget(int x, int y, int width, int height, Text text, PressAction onPress, TextRenderer textRenderer, Tooltip tooltip) {
|
||||
super(x, y, width, height, text, onPress, textRenderer);
|
||||
this.tooltipSupplier = tooltipSupplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) {
|
||||
super.renderTooltip(matrices, mouseX, mouseY);
|
||||
this.tooltipSupplier.onTooltip(this, matrices, mouseX, mouseY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendNarrations(NarrationMessageBuilder builder) {
|
||||
super.appendNarrations(builder);
|
||||
this.appendDefaultNarrations(builder);
|
||||
this.tooltipSupplier.supply(text -> builder.put(NarrationPart.HINT, text));
|
||||
this.tooltip = tooltip;
|
||||
setTooltip(tooltip);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,13 +8,17 @@ import net.fabricmc.api.Environment;
|
|||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.SharedConstants;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.DrawableHelper;
|
||||
import net.minecraft.client.gui.screen.*;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.LogoDrawer;
|
||||
import net.minecraft.client.gui.screen.ConfirmLinkScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.SplashTextRenderer;
|
||||
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
|
||||
import net.minecraft.client.gui.screen.option.AccessibilityOptionsScreen;
|
||||
import net.minecraft.client.gui.screen.option.LanguageOptionsScreen;
|
||||
import net.minecraft.client.gui.screen.option.OptionsScreen;
|
||||
import net.minecraft.client.gui.screen.world.SelectWorldScreen;
|
||||
import net.minecraft.client.gui.tooltip.Tooltip;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.PressableTextWidget;
|
||||
import net.minecraft.client.gui.widget.TexturedButtonWidget;
|
||||
|
@ -22,60 +26,30 @@ import net.minecraft.client.render.GameRenderer;
|
|||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec2f;
|
||||
import net.minecraft.util.math.Vec3f;
|
||||
import net.minecraft.util.math.RotationAxis;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import zone.oat.gmodtitlescreen.Mod;
|
||||
import zone.oat.gmodtitlescreen.ModIdentifier;
|
||||
import zone.oat.gmodtitlescreen.PressableTextWithTooltipWidget;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class CustomTitleScreen extends Screen {
|
||||
public static final Text VERSION_TEXT = new TranslatableText("menu.gmod-title-screen.version", SharedConstants.getGameVersion().getName(), FabricLoader.getInstance().getModContainer("gmod-title-screen").get().getMetadata().getVersion().getFriendlyString());
|
||||
public static final Text VERSION_TEXT = Text.translatable("menu.gmod-title-screen.version", SharedConstants.getGameVersion().getName(), FabricLoader.getInstance().getModContainer("gmod-title-screen").get().getMetadata().getVersion().getFriendlyString());
|
||||
private static final Identifier ACCESSIBILITY_ICON_TEXTURE = new Identifier("textures/gui/accessibility.png");
|
||||
private final boolean isMinceraft;
|
||||
private final LogoDrawer logoDrawer;
|
||||
@Nullable
|
||||
private String splashText;
|
||||
private static final Identifier MINECRAFT_TITLE_TEXTURE = new Identifier("textures/gui/title/minecraft.png");
|
||||
private static final Identifier EDITION_TITLE_TEXTURE = new Identifier("textures/gui/title/edition.png");
|
||||
private SplashTextRenderer splashText;
|
||||
private static final Identifier GMOD_TITLE_TEXTURE = new ModIdentifier("textures/gui/title/gmod_title.png");
|
||||
|
||||
private PressableTextWidget version;
|
||||
|
||||
private class DisabledTooltipSupplier implements ButtonWidget.TooltipSupplier {
|
||||
private final Text tooltip;
|
||||
|
||||
public DisabledTooltipSupplier(Text tooltip) {
|
||||
this.tooltip = tooltip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTooltip(ButtonWidget button, MatrixStack matrices, int i, int j) {
|
||||
if (!button.active) {
|
||||
CustomTitleScreen.this.renderOrderedTooltip(
|
||||
matrices,
|
||||
CustomTitleScreen.this.client.textRenderer.wrapLines(this.tooltip, Math.max(CustomTitleScreen.this.width / 2 - 43, 170)),
|
||||
i, j
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void supply(Consumer<Text> consumer) {
|
||||
consumer.accept(this.tooltip);
|
||||
}
|
||||
}
|
||||
|
||||
private class SmallPressableTextWidget extends PressableTextWidget {
|
||||
public SmallPressableTextWidget(int x, int y, int width, int height, Text text, PressAction onPress, TextRenderer textRenderer) {
|
||||
super(x, y, width, height, text, onPress, textRenderer);
|
||||
|
@ -86,7 +60,8 @@ public class CustomTitleScreen extends Screen {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
public void renderButton(DrawContext ctx, int mouseX, int mouseY, float delta) {
|
||||
MatrixStack matrices = ctx.getMatrices();
|
||||
matrices.push();
|
||||
if (shouldDownscale()) {
|
||||
matrices.translate(CustomTitleScreen.this.width, 0d, 0d);
|
||||
|
@ -97,11 +72,11 @@ public class CustomTitleScreen extends Screen {
|
|||
int padding = 3;
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
DrawableHelper.fill(matrices, version.x - padding, version.y - padding, version.x + version.getWidth() + padding * 2, version.y + version.getHeight() + padding * 2, 0xFF111111);
|
||||
ctx.fill(version.getX() - padding, version.getY() - padding, version.getX() + version.getWidth() + padding * 2, version.getY() + version.getHeight() + padding * 2, 0xFF111111);
|
||||
|
||||
super.renderButton(matrices, mouseX, mouseY, delta);
|
||||
super.renderButton(ctx, mouseX, mouseY, delta);
|
||||
|
||||
matrices.pop();
|
||||
}
|
||||
|
@ -112,7 +87,7 @@ public class CustomTitleScreen extends Screen {
|
|||
}
|
||||
|
||||
private void openLink(String url) {
|
||||
this.client.setScreen(new ConfirmChatLinkScreen(openInBrowser -> {
|
||||
this.client.setScreen(new ConfirmLinkScreen(openInBrowser -> {
|
||||
if (openInBrowser) {
|
||||
Util.getOperatingSystem().open(url);
|
||||
}
|
||||
|
@ -122,14 +97,16 @@ public class CustomTitleScreen extends Screen {
|
|||
}
|
||||
|
||||
public CustomTitleScreen() {
|
||||
super(new TranslatableText("narrator.screen.title"));
|
||||
this.isMinceraft = (double)new Random().nextFloat() < 1.0E-4;
|
||||
this(null);
|
||||
}
|
||||
|
||||
public CustomTitleScreen(@Nullable LogoDrawer logoDrawer) {
|
||||
super(Text.translatable("narrator.screen.title"));
|
||||
this.logoDrawer = Objects.requireNonNullElseGet(logoDrawer, () -> new LogoDrawer(false));
|
||||
}
|
||||
|
||||
public static CompletableFuture<Void> loadTexturesAsync(TextureManager textureManager, Executor executor) {
|
||||
return CompletableFuture.allOf(
|
||||
textureManager.loadTextureAsync(MINECRAFT_TITLE_TEXTURE, executor),
|
||||
textureManager.loadTextureAsync(EDITION_TITLE_TEXTURE, executor),
|
||||
textureManager.loadTextureAsync(GMOD_TITLE_TEXTURE, executor),
|
||||
loadBackgroundTexturesAsync(textureManager, executor)
|
||||
);
|
||||
|
@ -189,46 +166,59 @@ public class CustomTitleScreen extends Screen {
|
|||
int buttonSectionSpacing = 6;
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY,
|
||||
130,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.singleplayer"),
|
||||
button -> this.client.setScreen(new SelectWorldScreen(this)),
|
||||
this.textRenderer
|
||||
buttonsX,
|
||||
buttonsY,
|
||||
130,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.singleplayer"),
|
||||
button -> this.client.setScreen(new SelectWorldScreen(this)),
|
||||
this.textRenderer
|
||||
));
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 1,
|
||||
130,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.multiplayer"),
|
||||
button -> {
|
||||
this.client.setScreen(new MultiplayerScreen(this));
|
||||
},
|
||||
this.textRenderer
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 1,
|
||||
130,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.multiplayer"),
|
||||
button -> {
|
||||
this.client.setScreen(new MultiplayerScreen(this));
|
||||
},
|
||||
this.textRenderer
|
||||
));
|
||||
|
||||
boolean modsButtonActive = FabricLoader.getInstance().isModLoaded("modmenu");
|
||||
var modsButton = this.addDrawableChild(new PressableTextWithTooltipWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 2 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.modmenu").formatted(modsButtonActive ? Formatting.RESET : Formatting.GRAY),
|
||||
button -> this.client.setScreen(new ModsScreen(this)),
|
||||
textRenderer,
|
||||
new DisabledTooltipSupplier(new TranslatableText("menu.gmod-title-screen.modmenu.not-installed"))
|
||||
));
|
||||
modsButton.active = modsButtonActive;
|
||||
if (modsButtonActive) {
|
||||
var modsButton = this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 2 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.modmenu"),
|
||||
button -> this.client.setScreen(new ModsScreen(this)),
|
||||
textRenderer
|
||||
));
|
||||
modsButton.active = true;
|
||||
} else {
|
||||
var modsButton = this.addDrawableChild(new PressableTextWithTooltipWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 2 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
Text.translatable("menu.gmod-title-screen.modmenu").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer,
|
||||
Tooltip.of(Text.translatable("menu.gmod-title-screen.modmenu.not-installed"), Text.translatable("menu.gmod-title-screen.modmenu.not-installed"))
|
||||
));
|
||||
modsButton.active = false;
|
||||
}
|
||||
|
||||
this.addDrawableChild(new PressableTextWidget(
|
||||
buttonsX,
|
||||
buttonsY + buttonSpacing * 3 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.dupes").formatted(Formatting.GRAY),
|
||||
Text.translatable("menu.gmod-title-screen.dupes").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
|
@ -237,7 +227,7 @@ public class CustomTitleScreen extends Screen {
|
|||
buttonsY + buttonSpacing * 4 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.demos").formatted(Formatting.GRAY),
|
||||
Text.translatable("menu.gmod-title-screen.demos").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
|
@ -246,7 +236,7 @@ public class CustomTitleScreen extends Screen {
|
|||
buttonsY + buttonSpacing * 5 + buttonSectionSpacing,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.saves").formatted(Formatting.GRAY),
|
||||
Text.translatable("menu.gmod-title-screen.saves").formatted(Formatting.GRAY),
|
||||
button -> {},
|
||||
textRenderer
|
||||
)).active = false;
|
||||
|
@ -256,7 +246,7 @@ public class CustomTitleScreen extends Screen {
|
|||
buttonsY + buttonSpacing * 6 + buttonSectionSpacing * 2,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.options"),
|
||||
Text.translatable("menu.gmod-title-screen.options"),
|
||||
button -> this.client.setScreen(new OptionsScreen(this, this.client.options)),
|
||||
textRenderer
|
||||
));
|
||||
|
@ -266,7 +256,7 @@ public class CustomTitleScreen extends Screen {
|
|||
buttonsY + buttonSpacing * 7 + buttonSectionSpacing * 3,
|
||||
98,
|
||||
buttonHeight,
|
||||
new TranslatableText("menu.gmod-title-screen.quit"),
|
||||
Text.translatable("menu.gmod-title-screen.quit"),
|
||||
button -> this.client.scheduleStop(),
|
||||
textRenderer
|
||||
));
|
||||
|
@ -284,7 +274,7 @@ public class CustomTitleScreen extends Screen {
|
|||
256,
|
||||
256,
|
||||
button -> this.client.setScreen(new LanguageOptionsScreen(this, this.client.options, this.client.getLanguageManager())),
|
||||
new TranslatableText("narrator.button.language")
|
||||
Text.translatable("narrator.button.language")
|
||||
)
|
||||
);
|
||||
this.addDrawableChild(new TexturedButtonWidget(
|
||||
|
@ -299,7 +289,7 @@ public class CustomTitleScreen extends Screen {
|
|||
32,
|
||||
64,
|
||||
button -> this.client.setScreen(new AccessibilityOptionsScreen(this, this.client.options)),
|
||||
new TranslatableText("narrator.button.accessibility")
|
||||
Text.translatable("narrator.button.accessibility")
|
||||
));
|
||||
|
||||
version = this.addDrawableChild(
|
||||
|
@ -311,74 +301,49 @@ public class CustomTitleScreen extends Screen {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
public void render(DrawContext ctx, int mouseX, int mouseY, float delta) {
|
||||
MatrixStack matrices = ctx.getMatrices();
|
||||
|
||||
int logoX = getXPadding();
|
||||
// reverse of `int i = screenWidth / 2 - 128;`
|
||||
int logoXMiddle = (logoX + 128) * 2;
|
||||
int logoY = getLogoY();
|
||||
|
||||
SlideshowBackground.render(matrices, delta, this.width, this.height);
|
||||
SlideshowBackground.render(ctx, delta, this.width, this.height);
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
int gradientWidth = (int)(this.width * 0.7);
|
||||
|
||||
matrices.push();
|
||||
matrices.translate(gradientWidth/2f, this.height/2f, 0);
|
||||
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(-90f));
|
||||
DrawableHelper.fillGradient(matrices, -(int)Math.floor(this.height/2f), -(int)Math.floor(gradientWidth/2f) - 1, (int)Math.ceil(this.height/2f), (int)Math.ceil(gradientWidth/2f), 0x7b000000, 0x00000000, 0);
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-90f));
|
||||
ctx.fillGradient(-(int)Math.floor(this.height/2f), -(int)Math.floor(gradientWidth/2f) - 1, (int)Math.ceil(this.height/2f), (int)Math.ceil(gradientWidth/2f), 0x7b000000, 0x00000000, 0);
|
||||
matrices.pop();
|
||||
|
||||
DrawableHelper.fill(matrices, 0, this.height - 24, this.width, this.height, 0x70111111);
|
||||
ctx.fill(0, this.height - 24, this.width, this.height, 0x70111111);
|
||||
|
||||
if (Mod.config.showGModLogo) {
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
//RenderSystem.defaultBlendFunc();
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
|
||||
RenderSystem.setShaderTexture(0, GMOD_TITLE_TEXTURE);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
this.drawTexture(matrices, logoX, logoY, 0, 0, 256, 256);
|
||||
ctx.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
ctx.drawTexture(GMOD_TITLE_TEXTURE, logoX, logoY, 0.0F, 0.0F, 256, 256, 256, 256);
|
||||
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.defaultBlendFunc();
|
||||
} else {
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
RenderSystem.setShaderTexture(0, MINECRAFT_TITLE_TEXTURE);
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
if (this.isMinceraft) {
|
||||
this.drawWithOutline(logoX, logoY, (x, y) -> {
|
||||
this.drawTexture(matrices, x + 0, y, 0, 0, 99, 44);
|
||||
this.drawTexture(matrices, x + 99, y, 129, 0, 27, 44);
|
||||
this.drawTexture(matrices, x + 99 + 26, y, 126, 0, 3, 44);
|
||||
this.drawTexture(matrices, x + 99 + 26 + 3, y, 99, 0, 26, 44);
|
||||
this.drawTexture(matrices, x + 155, y, 0, 45, 155, 44);
|
||||
});
|
||||
} else {
|
||||
this.drawWithOutline(logoX, logoY, (x, y) -> {
|
||||
this.drawTexture(matrices, x + 0, y, 0, 0, 155, 44);
|
||||
this.drawTexture(matrices, x + 155, y, 0, 45, 155, 44);
|
||||
});
|
||||
}
|
||||
logoDrawer.draw(ctx, logoXMiddle, 1.0f, logoY);
|
||||
}
|
||||
|
||||
/*
|
||||
RenderSystem.setShaderTexture(0, EDITION_TITLE_TEXTURE);
|
||||
drawTexture(matrices, logoX + 88, logoY + 37, 0.0F, 0.0F, 98, 14, 128, 16);
|
||||
*/
|
||||
|
||||
if (this.splashText != null && Mod.config.showSplashText) {
|
||||
matrices.push();
|
||||
matrices.translate(getSplashTextX(), logoY + getLogoHeight() - 10, 0.0);
|
||||
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(-20.0F));
|
||||
float h = 1.8F - MathHelper.abs(MathHelper.sin((float)(Util.getMeasuringTimeMs() % 1000L) / 1000.0F * (float) (Math.PI * 2)) * 0.1F);
|
||||
h = h * 100.0F / (float)(this.textRenderer.getWidth(this.splashText) + 32);
|
||||
matrices.scale(h, h, h);
|
||||
drawCenteredText(matrices, this.textRenderer, this.splashText, 0, -8, 16776960);
|
||||
matrices.pop();
|
||||
this.splashText.render(ctx, logoXMiddle, this.textRenderer, 0xFF000000);
|
||||
}
|
||||
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
super.render(ctx, mouseX, mouseY, delta);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,20 +4,19 @@ import com.mojang.blaze3d.platform.GlStateManager;
|
|||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.client.util.math.Vector2f;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec3f;
|
||||
import net.minecraft.util.math.RotationAxis;
|
||||
import zone.oat.gmodtitlescreen.ModIdentifier;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import static net.minecraft.client.gui.DrawableHelper.drawTexture;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class SlideshowBackground {
|
||||
private static final Identifier[] BACKGROUNDS = {
|
||||
|
@ -52,7 +51,9 @@ public class SlideshowBackground {
|
|||
return CompletableFuture.allOf(completableFutures);
|
||||
}
|
||||
|
||||
private static void renderBackground(MatrixStack matrices, float a, int backgroundIndex, float alpha, int width, int height) {
|
||||
private static void renderBackground(DrawContext ctx, float a, int backgroundIndex, float alpha, int width, int height) {
|
||||
MatrixStack matrices = ctx.getMatrices();
|
||||
|
||||
matrices.push();
|
||||
|
||||
Identifier bg = BACKGROUNDS[backgroundIndex];
|
||||
|
@ -60,7 +61,7 @@ public class SlideshowBackground {
|
|||
float baseScale = Math.max(width / (float) backgroundSize[0], height / (float) backgroundSize[1]);
|
||||
Vector2f overscan = new Vector2f(backgroundSize[0] * baseScale - width, backgroundSize[1] * baseScale - height);
|
||||
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
|
||||
RenderSystem.setShaderTexture(0, bg);
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
|
||||
|
@ -71,9 +72,9 @@ public class SlideshowBackground {
|
|||
|
||||
matrices.translate(width / 2f, height / 2f, 0f);
|
||||
matrices.scale(scale, scale, 1f);
|
||||
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(angle));
|
||||
drawTexture(
|
||||
matrices,
|
||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(angle));
|
||||
ctx.drawTexture(
|
||||
bg,
|
||||
(int) Math.floor(-overscan.getX()/2f - width/2f),
|
||||
(int) Math.floor(-overscan.getY()/2f - height/2f),
|
||||
width + (int) Math.ceil(overscan.getX()),
|
||||
|
@ -87,7 +88,7 @@ public class SlideshowBackground {
|
|||
matrices.pop();
|
||||
}
|
||||
|
||||
public static void render(MatrixStack matrices, float delta, int width, int height) {
|
||||
public static void render(DrawContext ctx, float delta, int width, int height) {
|
||||
t += delta;
|
||||
|
||||
int index = (int) Math.floor(t / SLIDESHOW_IMAGE_LENGTH) % BACKGROUNDS.length;
|
||||
|
@ -96,8 +97,8 @@ public class SlideshowBackground {
|
|||
float transition = MathHelper.clamp(a / (TRANSITION_LENGTH / SLIDESHOW_IMAGE_LENGTH), 0f, 1f);
|
||||
|
||||
if (transition < 1f) {
|
||||
renderBackground(matrices, a + 1f, previousIndex, 1f, width, height);
|
||||
renderBackground(ctx, a + 1f, previousIndex, 1f, width, height);
|
||||
}
|
||||
renderBackground(matrices, a, index, transition, width, height);
|
||||
renderBackground(ctx, a, index, transition, width, height);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"menu.gmod-title-screen.singleplayer": "Начать новую игру",
|
||||
"menu.gmod-title-screen.multiplayer": "Сетевая игра",
|
||||
"menu.gmod-title-screen.options": "Настройки",
|
||||
"menu.gmod-title-screen.modmenu": "Аддоны",
|
||||
"menu.gmod-title-screen.modmenu.not-installed": "Скачайте мод меню, чтобы использовать это!",
|
||||
"menu.gmod-title-screen.dupes": "Дюпы",
|
||||
"menu.gmod-title-screen.demos": "Демо",
|
||||
"menu.gmod-title-screen.saves": "Сохранения",
|
||||
"menu.gmod-title-screen.quit": "Выйти",
|
||||
"menu.gmod-title-screen.version": "Сейчас вы используете minecraft-%s branch. Нажмите сюда, чтобы узнать большее. ( %s )",
|
||||
|
||||
"title.gmod-title-screen.config": "GMod Title Screen Конфиг",
|
||||
|
||||
"category.gmod-title-screen.general": "Основные",
|
||||
|
||||
"text.autoconfig.gmod-title-screen.title": "GMod Title Screen Конфиг",
|
||||
"text.autoconfig.gmod-title-screen.option.showGModLogo": "Показывать GMod логотип",
|
||||
"text.autoconfig.gmod-title-screen.option.showSplashText": "Показывать сплеши",
|
||||
"text.autoconfig.gmod-title-screen.option.showGModLogo.@Tooltip[0]": "Показывать иконку GMod вместо иконки Minecraft",
|
||||
"text.autoconfig.gmod-title-screen.option.showGModLogo.@Tooltip[1]": "сделайте это более интересным"
|
||||
}
|
|
@ -30,13 +30,13 @@
|
|||
],
|
||||
|
||||
"depends": {
|
||||
"fabricloader": ">=0.14.6",
|
||||
"fabricloader": ">=0.14.22",
|
||||
"fabric": "*",
|
||||
"minecraft": "~1.18.2",
|
||||
"minecraft": ["1.20.1"],
|
||||
"java": ">=17",
|
||||
"cloth-config": ">=6.0.0"
|
||||
"cloth-config": ">=11.0.0"
|
||||
},
|
||||
"recommends": {
|
||||
"modmenu": ">=3.0.0"
|
||||
"modmenu": ">=7.0.0"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue