diff --git a/build.gradle b/build.gradle index d34536f..6f4a90c 100644 --- a/build.gradle +++ b/build.gradle @@ -16,11 +16,12 @@ repositories { } dependencies { - implementation("java.minicraft:minicraft-plus:${project.minicraftplus_version}") + implementation files("libs/minicraft_delux.jar") implementation 'io.github.pseudodistant:MinicraftGameProvider:1.2.0' implementation "net.fabricmc:fabric-loader:${project.loader_version}" implementation "net.fabricmc:sponge-mixin:0.11.0+mixin.0.8.5" implementation "net.fabricmc:access-widener:2.1.0" + implementation 'org.apache.commons:commons-lang3:3.0' implementation "com.google.code.gson:gson:2.8.9" } diff --git a/gradle.properties b/gradle.properties index 95199a4..f3808b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,9 @@ org.gradle.jvmargs=-Xmx1G - minicraftplus_version=2.2.0-local loader_version=0.15.3 # Mod Properties - mod_version = 1.2.0 + mod_version = 1.2.0-delux maven_group = io.github.minifabric archives_base_name = minifabric-modmenu diff --git a/src/main/java/io/github/minifabric/minifabric_api/impl/ModsDisplay.java b/src/main/java/io/github/minifabric/minifabric_api/impl/ModsDisplay.java index b8ffcef..fc6973c 100644 --- a/src/main/java/io/github/minifabric/minifabric_api/impl/ModsDisplay.java +++ b/src/main/java/io/github/minifabric/minifabric_api/impl/ModsDisplay.java @@ -1,31 +1,39 @@ package io.github.minifabric.minifabric_api.impl; -import minicraft.core.Game; -import minicraft.core.io.InputHandler; -import minicraft.core.io.Localization; -import minicraft.gfx.Color; -import minicraft.gfx.Font; -import minicraft.gfx.Screen; -import minicraft.screen.*; -import minicraft.screen.entry.SelectEntry; +import com.mojang.ld22.GameControl; +import com.mojang.ld22.GameState; +import com.mojang.ld22.InputHandler; +import com.mojang.ld22.gfx.Color; +import com.mojang.ld22.gfx.Font; +import com.mojang.ld22.gfx.Screen; +import com.mojang.ld22.gfx.SpriteSheet; +import com.mojang.ld22.screen.controlmenu.*; +import com.mojang.ld22.sound.Sound; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Objects; -public class ModsDisplay extends Display { +public class ModsDisplay extends SelectControlMenu { + //private static final String[] defaultOptions = new String[]{"Highscore", "Load game", "Save game", "Start new game", "Resume game", "Respawn"}; + private static String[] defaultOptions; + public static final int titleColor = Color.get(0, 8, 131, 551); private final Collection modsList = FabricLoader.getInstance().getAllMods(); private static String modName = ""; public static String getModName() { return modName; } - private static ArrayList modNames = null; + private static ArrayList modNames; private static final ArrayList modVersions = new ArrayList<>(); - Display parent; + public ModsDisplay(SelectControlMenu parent) { + super(parent); + this.parent = parent; + } private static ArrayList getModNames() { Collection modsList = FabricLoader.getInstance().getAllMods(); @@ -64,28 +72,112 @@ private static ArrayList getModNames() { return modNames; } - public ModsDisplay() { - super(true, true); + public void init(GameControl gameControl, InputHandler input) { + defaultOptions = getModNames().toArray(new String[0]); + super.init(gameControl, input); + int[] new_selectable = new int[defaultOptions.length]; + + int amount; + for(amount = 0; amount < defaultOptions.length; ++amount) { + new_selectable[amount] = 1; + } + + amount = defaultOptions.length; + + this.setOptions(Arrays.copyOf(defaultOptions, amount)); + this.selected = this.options.length - 1; } - @Override - public void tick(InputHandler input) { - super.tick(input); - if (input.getKey("exit").clicked) { - Game.setDisplay(parent); + public void optionSelected(int selected) { + String description = modsList.stream() + .filter(mod -> Objects.equals(mod.getMetadata().getName(), defaultOptions[selected])) + .findFirst().get().getMetadata().getDescription() == null ? + "" : modsList.stream() + .filter(mod -> Objects.equals(mod.getMetadata().getName(), defaultOptions[selected])) + .findFirst().get().getMetadata().getDescription(); + this.gameControl.setMenu(new SingleModDisplay(this, defaultOptions[selected], description, modVersions.get(selected))); + + } + + public void render(Screen screen) { + screen.clear(0); + int h = 2; + int w = 13; + int xo = (screen.w - w * SpriteSheet.spriteSize) / 2; + int yo = 1; + screen.renderSprite(xo, yo * SpriteSheet.spriteSize, 0, 28, titleColor, 0, w * SpriteSheet.spriteSize, h * SpriteSheet.spriteSize); + xo = (screen.w - 4 * SpriteSheet.spriteSize) / 2; + yo += h; + screen.renderSprite(xo, yo * SpriteSheet.spriteSize, 13, 28, titleColor, 0, 4 * SpriteSheet.spriteSize, SpriteSheet.spriteSize); + this.menuTop = yo + h + 1; + super.render(screen, false); + Font.draw(GameControl.VERSION, screen, screen.w - GameControl.VERSION.length() * SpriteSheet.spriteSize, screen.h - SpriteSheet.spriteSize, infoCol); + } +} +/* + private final Collection modsList = FabricLoader.getInstance().getAllMods(); + private static String modName = ""; + + public static String getModName() { return modName; } + + private static ArrayList modNames = null; + private static final ArrayList modVersions = new ArrayList<>(); + + ControlMenu parent; + + private static ArrayList getModNames() { + Collection modsList = FabricLoader.getInstance().getAllMods(); + ArrayList modNames = new ArrayList<>(); + + if(ModsDisplay.modNames != null) { + modNames.addAll(ModsDisplay.modNames); + return modNames; } + + if(modsList.isEmpty()) { + System.err.println("ERROR: No mods are detected by Fabric Loader somehow..."); + return new ArrayList<>(); + } + + modVersions.clear(); + + // Iterate between every mod loaded by Fabric. + for (ModContainer container : modsList) { + if (container != null) { + String name = container.getMetadata().getName(); + if (!container.getMetadata().getId().equals("java")) { + modNames.add(name); + modVersions.add(container.getMetadata().getVersion().toString()); + } + } + } + + if(ModsDisplay.modNames == null) + ModsDisplay.modNames = new ArrayList<>(); + else + ModsDisplay.modNames.clear(); + + ModsDisplay.modNames.addAll(modNames); + + return modNames; + } + + public ModsDisplay(ControlMenu parent) { + super(parent); + this.parent = parent; } @Override - public void init(Display parent) { + public void init(GameControl gameControl, InputHandler input) { + super.init(gameControl, input); modName = ""; - this.parent = parent; - ArrayList modNames = getModNames(); + ArrayList modNames = getModNames(); - SelectEntry[] entries = new SelectEntry[modNames.size()]; + int[] entries = new int[modNames.size()]; for(int i = 0; i < entries.length; i++) { + entries[i] = 1; String name = modNames.get(i); final String version = modVersions.get(i); String description = modsList.stream() @@ -135,3 +227,4 @@ public void render(Screen screen) { Font.drawCentered(title, screen, 0, color); } } +*/ \ No newline at end of file diff --git a/src/main/java/io/github/minifabric/minifabric_api/impl/SingleModDisplay.java b/src/main/java/io/github/minifabric/minifabric_api/impl/SingleModDisplay.java new file mode 100644 index 0000000..7bc7a93 --- /dev/null +++ b/src/main/java/io/github/minifabric/minifabric_api/impl/SingleModDisplay.java @@ -0,0 +1,28 @@ +package io.github.minifabric.minifabric_api.impl; + +import com.mojang.ld22.screen.controlmenu.ControlMenu; +import com.mojang.ld22.screen.controlmenu.TextControlMenu; +import com.mojang.ld22.gfx.Color; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SingleModDisplay extends TextControlMenu { + public SingleModDisplay(ControlMenu parent, String mod_name, String content, String version) { + super(parent); + this.title = mod_name; + List matchList = new ArrayList(); + Pattern regex = Pattern.compile("(.{1,24}(?:\\s|$))|(.{0,10})", Pattern.DOTALL); + Matcher regexMatcher = regex.matcher(content); + while (regexMatcher.find()) { + matchList.add(regexMatcher.group()); + } + matchList.forEach(phrase -> { + this.addTextLine((String) phrase, Color.get(0, 333, 333, 333)); + }); + + this.addTextLine(version, Color.get(0, 50, 50, 50)); + } +} diff --git a/src/main/java/io/github/minifabric/minifabric_api/mixin/MenuAccessor.java b/src/main/java/io/github/minifabric/minifabric_api/mixin/MenuAccessor.java deleted file mode 100644 index a146359..0000000 --- a/src/main/java/io/github/minifabric/minifabric_api/mixin/MenuAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.minifabric.minifabric_api.mixin; - -import io.github.minifabric.minifabric_api.impl.MenuDuck; -import minicraft.screen.Menu; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(Menu.class) -public class MenuAccessor implements MenuDuck { - @Shadow private int selection; - - public int minifabric_modmenu$selectionGetter() { - return selection; - } -} diff --git a/src/main/java/io/github/minifabric/minifabric_api/mixin/TitleDisplayMixin.java b/src/main/java/io/github/minifabric/minifabric_api/mixin/TitleDisplayMixin.java index edaa456..3fca0dd 100644 --- a/src/main/java/io/github/minifabric/minifabric_api/mixin/TitleDisplayMixin.java +++ b/src/main/java/io/github/minifabric/minifabric_api/mixin/TitleDisplayMixin.java @@ -1,54 +1,73 @@ package io.github.minifabric.minifabric_api.mixin; +import com.mojang.ld22.GameState; +import com.mojang.ld22.screen.controlmenu.*; +import com.mojang.ld22.sound.Sound; import io.github.minifabric.minifabric_api.impl.ModsDisplay; -import minicraft.core.Game; -import minicraft.gfx.Color; -import minicraft.gfx.Point; -import minicraft.gfx.Screen; -import minicraft.screen.*; -import minicraft.screen.entry.BlankEntry; -import minicraft.screen.entry.ListEntry; -import minicraft.screen.entry.SelectEntry; -import minicraft.screen.entry.StringEntry; -import minicraft.util.BookData; -import org.spongepowered.asm.mixin.Mixin; +import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(TitleDisplay.class) -public class TitleDisplayMixin extends Display { - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lminicraft/screen/Display;(ZZ[Lminicraft/screen/Menu;)V"), index = 2) - private static Menu[] yes(Menu[] menus) { - return new Menu[]{(new Menu.Builder(false, 2, RelPos.CENTER, new ListEntry[]{new StringEntry("minicraft.displays.title.display.checking", Color.BLUE), new BlankEntry(), new SelectEntry("minicraft.displays.title.play", () -> { - if (WorldSelectDisplay.getWorldNames().size() > 0) { - Game.setDisplay(new Display(true, new Menu[]{(new Menu.Builder(false, 2, RelPos.CENTER, new ListEntry[]{new SelectEntry("minicraft.displays.title.play.load_world", () -> { - Game.setDisplay(new WorldSelectDisplay()); - }), new SelectEntry("minicraft.displays.title.play.new_world", () -> { - Game.setDisplay(new WorldGenDisplay()); - })})).createMenu()})); - } else { - Game.setDisplay(new WorldGenDisplay()); - } - - }), new SelectEntry("minicraft.display.options_display", () -> { - Game.setDisplay(new OptionsMainMenuDisplay()); - }), new SelectEntry("Mods", () -> Game.setDisplay(new ModsDisplay())), - new SelectEntry("minicraft.displays.skin", () -> { - Game.setDisplay(new SkinDisplay()); - }), new SelectEntry("minicraft.displays.achievements", () -> { - Game.setDisplay(new AchievementsDisplay()); - }), new SelectEntry("minicraft.displays.title.help", () -> { - Game.setDisplay(new Display(true, new Menu[]{(new Menu.Builder(false, 1, RelPos.CENTER, new ListEntry[]{new BlankEntry(), new SelectEntry("minicraft.displays.title.help.instructions", () -> { - Game.setDisplay(new BookDisplay(BookData.instructions.collect())); - }), new SelectEntry("minicraft.displays.title.help.storyline_guide", () -> { - Game.setDisplay(new BookDisplay(BookData.storylineGuide.collect())); - }), new SelectEntry("minicraft.displays.title.help.about", () -> { - Game.setDisplay(new BookDisplay(BookData.about.collect())); - }), new SelectEntry("minicraft.displays.title.help.credits", () -> { - Game.setDisplay(new BookDisplay(BookData.credits.collect())); - })})).setTitle("minicraft.displays.title.help").createMenu()})); - }), new SelectEntry("minicraft.displays.title.quit", Game::quit)})).setPositioning(new Point(Screen.w / 2, Screen.h * 3 / 5), RelPos.CENTER).createMenu()}; +@Mixin(TitleMenu.class) +public class TitleDisplayMixin extends SelectControlMenu { + @Final @Mutable @Shadow private static String[] defaultOptions; + + public TitleDisplayMixin(ControlMenu parent) { + super(parent); } + /** + * @author PseudoDistant + * @reason Fuck it, not like anyone else would edit this. + */ + @Overwrite + public void optionSelected(int selected) { + if (selected == 8) { + this.gameControl.gameState.respawn(); + this.gameControl.setMenu((ControlMenu)null); + } + + if (selected == 7) { + this.gameControl.setMenu((ControlMenu)null); + } + + if (selected == 6) { + Sound.test.play(); + this.gameControl.gameState = new GameState(this.gameControl); + this.gameControl.gameState.resetGame(); + this.gameControl.setMenu((ControlMenu)null); + } + + if (selected == 5) { + this.gameControl.setMenu(new SaveMenu(this)); + } + + if (selected == 4) { + this.gameControl.setMenu(new LoadMenu(this)); + } + + if (selected == 3) { + this.gameControl.setMenu(new HighScoreMenu(this)); + } + if (selected == 2) { + this.gameControl.setMenu(new InstructionsMenu(this)); + } + + if (selected == 1) { + this.gameControl.setMenu(new AboutMenu(this)); + } + + if (selected == 0) { + this.gameControl.setMenu(new ModsDisplay(this)); + } + + } + + static { + defaultOptions = ArrayUtils.add(defaultOptions,0, "Mods"); + } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 77eb814..90f25b2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,8 +21,8 @@ "modmenu.mixins.json" ], "depends": { - "minicraftplus": [ - "2.2.0-dev3" + "minicraft-delux": [ + "1.20" ] } } diff --git a/src/main/resources/modmenu.mixins.json b/src/main/resources/modmenu.mixins.json index d729cd4..9bd8c20 100644 --- a/src/main/resources/modmenu.mixins.json +++ b/src/main/resources/modmenu.mixins.json @@ -4,8 +4,7 @@ "package": "io.github.minifabric.minifabric_api.mixin", "compatibilityLevel": "JAVA_16", "mixins": [ - "TitleDisplayMixin", - "MenuAccessor" + "TitleDisplayMixin" ], "client": [