From 69e1af78fe2ba5b09b607f52b4c97d224a93b87c Mon Sep 17 00:00:00 2001 From: LostLuma Date: Sat, 10 Aug 2024 20:52:10 +0200 Subject: [PATCH] Add Minecraft 1.20.0 support --- build.gradle.kts | 1 + .../kitten-square/r1.20.0/build.gradle.kts | 34 ++++++ .../kitten-square/r1.20.0/gradle.properties | 8 ++ .../kitten_square/impl/FakeComponent.java | 22 ++++ .../kitten_square/impl/SoundUtil.java | 17 +++ .../impl/compat/ModMenuIntegration.java | 23 ++++ .../kitten_square/impl/mixin/GuiMixin.java | 19 +++ .../impl/service/UICompatImpl.java | 115 ++++++++++++++++++ .../impl/ui/ConversionCacheImpl.java | 20 +++ .../impl/ui/display/GuiDisplayImpl.java | 65 ++++++++++ .../impl/ui/screen/MinecraftScreen.java | 32 +++++ .../impl/ui/screen/ScreenImpl.java | 66 ++++++++++ .../impl/ui/toast/ToastImpl.java | 46 +++++++ .../impl/ui/widget/TextBoxImpl.java | 35 ++++++ ...itten_heart.impl.service.MinecraftUICompat | 1 + .../main/resources/kitten_square.mixins.json | 13 ++ settings.gradle.kts | 1 + 17 files changed, 518 insertions(+) create mode 100644 projects/kitten-square/r1.20.0/build.gradle.kts create mode 100644 projects/kitten-square/r1.20.0/gradle.properties create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/FakeComponent.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/SoundUtil.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/compat/ModMenuIntegration.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/mixin/GuiMixin.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/ConversionCacheImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/display/GuiDisplayImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/MinecraftScreen.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/ScreenImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/toast/ToastImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/widget/TextBoxImpl.java create mode 100644 projects/kitten-square/r1.20.0/src/main/resources/META-INF/services/net.pixaurora.kitten_heart.impl.service.MinecraftUICompat create mode 100644 projects/kitten-square/r1.20.0/src/main/resources/kitten_square.mixins.json diff --git a/build.gradle.kts b/build.gradle.kts index 3026d72..5a99cac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { include(project(":projects:kitten-sounds:r1.20.3")) include(project(":projects:kitten-square:r1.17.0")) + include(project(":projects:kitten-square:r1.20.0")) include(project(":projects:kitten-square:r1.20.3")) include(project(":projects:kitten-square:r1.21.0")) } diff --git a/projects/kitten-square/r1.20.0/build.gradle.kts b/projects/kitten-square/r1.20.0/build.gradle.kts new file mode 100644 index 0000000..86659b6 --- /dev/null +++ b/projects/kitten-square/r1.20.0/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + id("kit_tunes.java.17") + id("kit_tunes.submodule") +} + +val modmenu_version = project.property("modmenu_version") as String + +mod { + dependencies { + required("quilt_resource_loader") + optional("modmenu").versionAbove(modmenu_version) + } + + entrypoint("modmenu", "net.pixaurora.kitten_square.impl.compat.ModMenuIntegration") + + intermediaryMappings = "net.fabricmc:intermediary" + mixin("kitten_square.mixins.json") +} + +repositories { + maven { + name = "Terraformers" + url = uri("https://maven.terraformersmc.com/") + } +} + +dependencies { + implementation(project(":projects:kit-tunes-api")) + implementation(project(":projects:kitten-heart")) + + modImplementation(libs.qsl.resource.loader) + + modImplementation("com.terraformersmc:modmenu:${modmenu_version}") +} diff --git a/projects/kitten-square/r1.20.0/gradle.properties b/projects/kitten-square/r1.20.0/gradle.properties new file mode 100644 index 0000000..cc5786f --- /dev/null +++ b/projects/kitten-square/r1.20.0/gradle.properties @@ -0,0 +1,8 @@ +# Mod properties + +minecraft_version_min = 1.20.0 +minecraft_version_max = 1.20.2 + +minecraft_version = 1.20 + +modmenu_version=7.0.1 diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/FakeComponent.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/FakeComponent.java new file mode 100644 index 0000000..509ac55 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/FakeComponent.java @@ -0,0 +1,22 @@ +package net.pixaurora.kitten_square.impl; + +import net.minecraft.network.chat.MutableComponent; +import net.pixaurora.kitten_cube.impl.text.Component; +import net.pixaurora.kitten_square.impl.service.UICompatImpl; + +public class FakeComponent implements Component { + private final MutableComponent parent; + + public FakeComponent(MutableComponent component) { + this.parent = component; + } + + public MutableComponent gameVer() { + return this.parent; + } + + @Override + public Component concat(Component component) { + return new FakeComponent(this.parent.copy().append(UICompatImpl.internalToMinecraftType(component))); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/SoundUtil.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/SoundUtil.java new file mode 100644 index 0000000..4420931 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/SoundUtil.java @@ -0,0 +1,17 @@ +package net.pixaurora.kitten_square.impl; + +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundEvents; +import net.pixaurora.kitten_cube.impl.ui.sound.Sound; + +public class SoundUtil { + public static SoundInstance soundFromInternalID(Sound sound) { + switch (sound) { + case BUTTON_CLICK: + return SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F); + default: + throw new RuntimeException("Sound " + sound.name() + " was not mapped!"); + } + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/compat/ModMenuIntegration.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/compat/ModMenuIntegration.java new file mode 100644 index 0000000..03bf3f0 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/compat/ModMenuIntegration.java @@ -0,0 +1,23 @@ +package net.pixaurora.kitten_square.impl.compat; + +import java.util.Map; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +import net.minecraft.client.gui.screens.Screen; +import net.pixaurora.kitten_heart.impl.Constants; +import net.pixaurora.kitten_heart.impl.ui.screen.KitTunesHomeScreen; +import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen; +import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl; + +public class ModMenuIntegration implements ModMenuApi { + public ScreenImpl modHomeScreen(Screen parent) { + return new ScreenImpl(new KitTunesHomeScreen(new MinecraftScreen(parent))); + } + + @Override + public Map> getProvidedConfigScreenFactories() { + return Map.of(Constants.MOD_ID, this::modHomeScreen); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/mixin/GuiMixin.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/mixin/GuiMixin.java new file mode 100644 index 0000000..b66b429 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/mixin/GuiMixin.java @@ -0,0 +1,19 @@ +package net.pixaurora.kitten_square.impl.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.gui.Gui; +import net.minecraft.network.chat.Component; + +@Mixin(Gui.class) +public class GuiMixin { + // Because we want to show our own notification, we cancel this one so it + // doesn't show twice. + @Inject(method = "setNowPlaying", at = @At("HEAD"), cancellable = true) + private void cancelNowPlayingNotification(Component description, CallbackInfo cInfo) { + cInfo.cancel(); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java new file mode 100644 index 0000000..f92c4a7 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -0,0 +1,115 @@ +package net.pixaurora.kitten_square.impl.service; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ConfirmLinkScreen; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FormattedCharSequence; +import net.pixaurora.kit_tunes.api.resource.ResourcePath; +import net.pixaurora.kitten_cube.impl.math.Point; +import net.pixaurora.kitten_cube.impl.text.Color; +import net.pixaurora.kitten_cube.impl.text.Component; +import net.pixaurora.kitten_cube.impl.ui.screen.Screen; +import net.pixaurora.kitten_cube.impl.ui.sound.Sound; +import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_heart.impl.resource.ResourcePathUtils; +import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; +import net.pixaurora.kitten_square.impl.FakeComponent; +import net.pixaurora.kitten_square.impl.SoundUtil; +import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen; +import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl; +import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl; +import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl; + +public class UICompatImpl implements MinecraftUICompat { + private final Minecraft client = Minecraft.getInstance(); + + public static ResourceLocation internalToMinecraftType(ResourcePath path) { + return new ResourceLocation(path.namespace(), path.path()); + } + + public static ResourceLocation internalToMinecraftGuiSprite(ResourcePath path) { + return internalToMinecraftType( + ResourcePathUtils.stripSuffixAndPrefix("textures/gui/sprites/", ".png", path).get()); + } + + public static MutableComponent internalToMinecraftType(Component component) { + if (component instanceof FakeComponent) { + return ((FakeComponent) component).gameVer(); + } else { + throw new RuntimeException( + "Internal component is of an unconvertable type `" + component.getClass().getName() + "`!"); + } + } + + @Override + public void sendToast(net.pixaurora.kitten_cube.impl.ui.toast.Toast toast) { + this.client.getToasts().addToast(new ToastImpl(toast)); + } + + @Override + public ResourcePath convertToRegularAsset(ResourcePath path) { + return path; + } + + @Override + public ResourcePath convertToGuiAsset(ResourcePath path) { + return path; + } + + @Override + public Component translatable(String key) { + return new FakeComponent(net.minecraft.network.chat.Component.translatable(key)); + } + + @Override + public Component translatableWithFallback(String key, String defaultText) { + return new FakeComponent(net.minecraft.network.chat.Component.translatableWithFallback(key, defaultText)); + } + + @Override + public Component literal(String text) { + return new FakeComponent(net.minecraft.network.chat.Component.literal(text)); + } + + @Override + public int textHeight() { + return this.client.font.lineHeight; + } + + @Override + public int textWidth(Component text) { + return this.client.font.width(internalToMinecraftType(text)); + } + + @Override + public void playSound(Sound sound) { + this.client.getSoundManager().play(SoundUtil.soundFromInternalID(sound)); + } + + @Override + public void setScreen(Screen screen) { + net.minecraft.client.gui.screens.Screen mcScreen; + if (screen instanceof MinecraftScreen) { + mcScreen = ((MinecraftScreen) screen).parent(); + } else { + mcScreen = new ScreenImpl(screen); + } + this.client.setScreen(mcScreen); + } + + @Override + public void confirmURL(String url) { + ConfirmLinkScreen.confirmLinkNow(url, this.client.screen, true); + } + + @Override + public TextBox createTextbox(List lines, Color color, int maxLineLength, Point pos) { + List text = lines.stream().map(UICompatImpl::internalToMinecraftType) + .flatMap(line -> this.client.font.split(line, maxLineLength).stream()).toList(); + + return new TextBoxImpl(text, color, pos); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/ConversionCacheImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/ConversionCacheImpl.java new file mode 100644 index 0000000..c4e443e --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/ConversionCacheImpl.java @@ -0,0 +1,20 @@ +package net.pixaurora.kitten_square.impl.ui; + +import net.minecraft.resources.ResourceLocation; +import net.pixaurora.kit_tunes.api.resource.ResourcePath; +import net.pixaurora.kitten_cube.impl.ConversionCache; +import net.pixaurora.kitten_square.impl.service.UICompatImpl; + +public class ConversionCacheImpl extends ConversionCache { + @Override + protected ResourceLocation resourceToMinecraftType(ResourcePath path) { + return UICompatImpl.internalToMinecraftType(path); + } + + @Override + protected net.minecraft.network.chat.Component componentToMinecraftType( + net.pixaurora.kitten_cube.impl.text.Component component) { + return UICompatImpl.internalToMinecraftType(component); + } + +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/display/GuiDisplayImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/display/GuiDisplayImpl.java new file mode 100644 index 0000000..3ead049 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/display/GuiDisplayImpl.java @@ -0,0 +1,65 @@ +package net.pixaurora.kitten_square.impl.ui.display; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.FormattedCharSequence; +import net.pixaurora.kit_tunes.api.resource.ResourcePath; +import net.pixaurora.kitten_cube.impl.MinecraftClient; +import net.pixaurora.kitten_cube.impl.math.Point; +import net.pixaurora.kitten_cube.impl.math.Size; +import net.pixaurora.kitten_cube.impl.text.Color; +import net.pixaurora.kitten_cube.impl.text.Component; +import net.pixaurora.kitten_cube.impl.ui.display.GuiDisplay; +import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_square.impl.ui.ConversionCacheImpl; +import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl; + +public class GuiDisplayImpl implements GuiDisplay { + private final GuiGraphics graphics; + + private final ConversionCacheImpl conversions; + + public GuiDisplayImpl(GuiGraphics graphics, ConversionCacheImpl conversions) { + this.graphics = graphics; + this.conversions = conversions; + } + + @Override + public void drawTexture(ResourcePath path, Size size, Point pos) { + int width = size.width(); + int height = size.height(); + + this.graphics.blit(conversions.convert(path), pos.x(), pos.y(), 0, 0.0F, 0.0F, width, height, width, height); + } + + @Override + public void drawGuiTextureSubsection(ResourcePath path, Size size, Point pos, Size subsection, Point offset) { + this.graphics.blit(conversions.convert(path), pos.x(), pos.y(), offset.x(), offset.y(), subsection.width(), subsection.height(), size.width(), size.height()); + } + + @SuppressWarnings("resource") + @Override + public void drawText(Component text, Color color, Point pos, boolean shadowed) { + this.graphics.drawString(Minecraft.getInstance().font, conversions.convert(text), pos.x(), pos.y(), color.hex(), + shadowed); + } + + @SuppressWarnings("resource") + @Override + public void drawTextBox(TextBox textBox) { + if (textBox instanceof TextBoxImpl) { + TextBoxImpl impl = (TextBoxImpl) textBox; + + int y = impl.startPos.y(); + + for (FormattedCharSequence line : impl.lines) { + this.graphics.drawString(Minecraft.getInstance().font, line, impl.startPos.x(), y, impl.color.hex(), + false); + + y += MinecraftClient.textHeight(); + } + } else { + throw new UnsupportedOperationException("Unsupported instance of textbox"); + } + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/MinecraftScreen.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/MinecraftScreen.java new file mode 100644 index 0000000..56af33a --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/MinecraftScreen.java @@ -0,0 +1,32 @@ +package net.pixaurora.kitten_square.impl.ui.screen; + +import net.pixaurora.kitten_cube.impl.math.Point; +import net.pixaurora.kitten_cube.impl.math.Size; +import net.pixaurora.kitten_cube.impl.ui.controls.MouseButton; +import net.pixaurora.kitten_cube.impl.ui.display.GuiDisplay; +import net.pixaurora.kitten_cube.impl.ui.screen.Screen; + +public class MinecraftScreen implements Screen { + private final net.minecraft.client.gui.screens.Screen parent; + + public MinecraftScreen(net.minecraft.client.gui.screens.Screen parent) { + this.parent = parent; + } + + @Override + public void draw(GuiDisplay gui, Point mousePos) { + } + + @Override + public void init(Size window) { + throw new RuntimeException("This isn't a real Kit Tunes screen!"); + } + + @Override + public void handleClick(Point mousePos, MouseButton button) { + } + + public net.minecraft.client.gui.screens.Screen parent() { + return this.parent; + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/ScreenImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/ScreenImpl.java new file mode 100644 index 0000000..2740a1a --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/screen/ScreenImpl.java @@ -0,0 +1,66 @@ +package net.pixaurora.kitten_square.impl.ui.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.pixaurora.kitten_cube.impl.math.Point; +import net.pixaurora.kitten_cube.impl.math.Size; +import net.pixaurora.kitten_cube.impl.ui.controls.MouseButton; +import net.pixaurora.kitten_cube.impl.ui.display.GuiDisplay; +import net.pixaurora.kitten_cube.impl.ui.screen.Screen; +import net.pixaurora.kitten_square.impl.ui.ConversionCacheImpl; +import net.pixaurora.kitten_square.impl.ui.display.GuiDisplayImpl; + +public class ScreenImpl extends net.minecraft.client.gui.screens.Screen { + private final Screen screen; + + private final ConversionCacheImpl conversions; + + public ScreenImpl(Screen screen) { + super(Component.empty()); + + this.screen = screen; + + this.conversions = new ConversionCacheImpl(); + } + + // "Minecraft Screen" functions + + @Override + public void init() { + this.screen.init(Size.of(this.width, this.height)); + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) { + super.render(graphics, mouseX, mouseY, delta); + + GuiDisplay display = new GuiDisplayImpl(graphics, this.conversions); + Point mousePos = Point.of(mouseX, mouseY); + + this.screen.draw(display, mousePos); + } + + @Override + public void onClose() { + this.screen.onExit(); + } + + @Override + public boolean shouldCloseOnEsc() { + return true; + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + Point mousePos = Point.of((int) x, (int) y); + + this.screen.handleClick(mousePos, MouseButton.fromGlfwCode(button)); + + return false; + } + + @Override + public void tick() { + this.screen.tick(); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/toast/ToastImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/toast/ToastImpl.java new file mode 100644 index 0000000..38377af --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/toast/ToastImpl.java @@ -0,0 +1,46 @@ +package net.pixaurora.kitten_square.impl.ui.toast; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.toasts.Toast; +import net.minecraft.client.gui.components.toasts.ToastComponent; +import net.pixaurora.kitten_square.impl.ui.ConversionCacheImpl; +import net.pixaurora.kitten_square.impl.ui.display.GuiDisplayImpl; + +public class ToastImpl implements Toast { + private final net.pixaurora.kitten_cube.impl.ui.toast.Toast toast; + private final long millisecondsShown; + + private final ConversionCacheImpl conversions; + + private boolean hasRendered; + private long firstRenderedTime; + + public ToastImpl(net.pixaurora.kitten_cube.impl.ui.toast.Toast toast) { + this.toast = toast; + this.millisecondsShown = toast.timeShown().toMillis(); + this.conversions = new ConversionCacheImpl(); + } + + @Override + public int width() { + return this.toast.size().width(); + } + + @Override + public int height() { + return this.toast.size().height(); + } + + @Override + public Toast.Visibility render(GuiGraphics graphics, ToastComponent manager, long frameTime) { + if (!this.hasRendered) { + this.hasRendered = true; + this.firstRenderedTime = frameTime; + } + + this.toast.draw(new GuiDisplayImpl(graphics, conversions)); + + return frameTime - this.firstRenderedTime < this.millisecondsShown ? Toast.Visibility.SHOW + : Toast.Visibility.HIDE; + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/widget/TextBoxImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/widget/TextBoxImpl.java new file mode 100644 index 0000000..2b0b5a0 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/ui/widget/TextBoxImpl.java @@ -0,0 +1,35 @@ +package net.pixaurora.kitten_square.impl.ui.widget; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.FormattedCharSequence; +import net.pixaurora.kitten_cube.impl.MinecraftClient; +import net.pixaurora.kitten_cube.impl.math.Point; +import net.pixaurora.kitten_cube.impl.math.Size; +import net.pixaurora.kitten_cube.impl.text.Color; +import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; + +public class TextBoxImpl implements TextBox { + public final List lines; + public final Color color; + public final Point startPos; + + public TextBoxImpl(List lines, Color color, Point startPos) { + this.lines = lines; + this.color = color; + this.startPos = startPos; + } + + @SuppressWarnings("resource") + @Override + public Size size() { + int width = 0; + + for (FormattedCharSequence line : lines) { + width = Math.max(width, Minecraft.getInstance().font.width(line)); + } + + return Size.of(width, MinecraftClient.textHeight() * lines.size()); + } +} diff --git a/projects/kitten-square/r1.20.0/src/main/resources/META-INF/services/net.pixaurora.kitten_heart.impl.service.MinecraftUICompat b/projects/kitten-square/r1.20.0/src/main/resources/META-INF/services/net.pixaurora.kitten_heart.impl.service.MinecraftUICompat new file mode 100644 index 0000000..f8e21a9 --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/resources/META-INF/services/net.pixaurora.kitten_heart.impl.service.MinecraftUICompat @@ -0,0 +1 @@ +net.pixaurora.kitten_square.impl.service.UICompatImpl diff --git a/projects/kitten-square/r1.20.0/src/main/resources/kitten_square.mixins.json b/projects/kitten-square/r1.20.0/src/main/resources/kitten_square.mixins.json new file mode 100644 index 0000000..cf3533d --- /dev/null +++ b/projects/kitten-square/r1.20.0/src/main/resources/kitten_square.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.pixaurora.kitten_square.impl.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [], + "client": [ + "GuiMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 91fd0f2..0c6cb4e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,5 +26,6 @@ include("projects:kitten-sounds:r1.17.0") include("projects:kitten-sounds:r1.20.3") include("projects:kitten-square:r1.17.0") +include("projects:kitten-square:r1.20.0") include("projects:kitten-square:r1.20.3") include("projects:kitten-square:r1.21.0")