Skip to content

Commit

Permalink
Add Minecraft 1.20.0 support
Browse files Browse the repository at this point in the history
  • Loading branch information
LostLuma committed Aug 10, 2024
1 parent 560b347 commit 69e1af7
Show file tree
Hide file tree
Showing 17 changed files with 518 additions and 0 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
}
Expand Down
34 changes: 34 additions & 0 deletions projects/kitten-square/r1.20.0/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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}")
}
8 changes: 8 additions & 0 deletions projects/kitten-square/r1.20.0/gradle.properties
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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)));
}
}
Original file line number Diff line number Diff line change
@@ -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!");
}
}
}
Original file line number Diff line number Diff line change
@@ -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<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
return Map.of(Constants.MOD_ID, this::modHomeScreen);
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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<Component> lines, Color color, int maxLineLength, Point pos) {
List<FormattedCharSequence> text = lines.stream().map(UICompatImpl::internalToMinecraftType)
.flatMap(line -> this.client.font.split(line, maxLineLength).stream()).toList();

return new TextBoxImpl(text, color, pos);
}
}
Original file line number Diff line number Diff line change
@@ -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<ResourceLocation, net.minecraft.network.chat.Component> {
@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);
}

}
Original file line number Diff line number Diff line change
@@ -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");
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Loading

0 comments on commit 69e1af7

Please sign in to comment.