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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
- fix: backup manager restores specific files, letting you select specific sup files inside the config folder.
- fix: Added default message to /scamshield and /packcore command.
56 changes: 56 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<div align="center">

# PackCore

[![Download on Modrinth](https://raw.githubusercontent.com/intergrav/devins-badges/c7fd18efdadd1c3f12ae56b49afd834640d2d797/assets/cozy/available/modrinth_vector.svg)](https://modrinth.com/mod/packcore)
[![fapi-badge](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/requires/fabric-api_vector.svg)](https://modrinth.com/mod/fabric-api)

![Build Status](https://github.com/KdGaming0/PackCore/actions/workflows/build.yml/badge.svg)
[![Modrinth Donwloads](https://img.shields.io/modrinth/dt/packcore?color=00AF5C&label=downloads&logo=modrinth)](https://modrinth.com/mod/packcore)

PackCore is a companion mod for the **Skyblock Enhanced** modpacks. It enhances the player experience with a seamless and immersive start to the game.

</div>

---
The mod provides:

- **SkyBlock-themed start menu**, bringing a custom touch to your gameplay.
- A **default configuration setup prompt** on first launch, ensuring the best settings for your modpack.
- In-game **pop-up notifications** in the main menu with information about the newest modpack updates.

PackCore is essential to the SkyBlock Enhanced Modpacks. Its goal is to make your Hypixel experience feel like you’re stepping directly into a SkyBlock world—not just vanilla Minecraft.

---

## Interested in Modpacks for SkyBlock?

### _SkyBlock Enhanced – Modern Edition_
The newest pack, built for **Minecraft 1.21+**.
Play Hypixel Skyblock on the latest version with improved performance over 1.8.9.
→ https://modrinth.com/project/e0oMrxjp

### _SkyBlock Enhanced [Hypixel]_
The original pack, built for **Minecraft 1.8.9**.
Features strong performance and a large collection of SkyBlock-specific mods, all preconfigured so you can jump right in.
→ https://modrinth.com/project/9JTbeXjU

---

Support the Project
-------------------

Want to support my work? You can do this on Ko‑fi. All donations are highly appreciated and help me continue providing support and updates. Thank you to everyone who wants to help!

→ [☕ Support on Ko-fi](https://ko-fi.com/kdgaming1)

Server Hosting Partner
----------------------

In need of your own server? I partner with Bisect Hosting to bring you reliable game servers. Whether you play Minecraft or another title, they deliver high‑performance hardware and fast support.

Use code **SBE** at checkout for **25% off** your first purchase.

→ [🎮 Get 25% Off with Bisect Hosting](https://www.bisecthosting.com/SBE?r=SkyblockEnhancedModrinthPage)

![Bisect Hosting promotional banner advertising 'Use code SBE for 25% off' to start your adventure, featuring the Bisect Hosting logo and pixelated Minecraft-style text with golden decorative borders](https://cdn.modrinth.com/data/cached_images/01502d9d41e784dfa18a3a1903a3e906cde1af1f.webp)
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ org.gradle.configuration-cache=false
# Mod properties
mod.name=PackCore
mod.id=packcore
mod.version=3.2.3
mod.version=3.2.4
mod.group=com.github.kd_gaming1

# Global dependencies
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.github.kd_gaming1.packcore.command;

import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.minecraft.text.ClickEvent;
import net.minecraft.text.HoverEvent;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;

public class CommandHelper {
// Send a command that can be clicked to copy
public static void sendCopyCommand(FabricClientCommandSource source, String message, String command) {
MutableText commandText = Text.literal(" ").append(Text.literal(message))
.styled(style -> style
.withClickEvent(new ClickEvent.SuggestCommand(command))
.withHoverEvent(new HoverEvent.ShowText(
Text.literal("Click to copy command").formatted(Formatting.YELLOW))));
source.sendFeedback(commandText);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import com.mojang.brigadier.context.CommandContext;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.minecraft.text.ClickEvent;
import net.minecraft.text.HoverEvent;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;

import static com.github.kd_gaming1.packcore.command.CommandHelper.sendCopyCommand;

public class HelpCommand {

public static LiteralArgumentBuilder<FabricClientCommandSource> register() {
Expand All @@ -26,26 +25,26 @@ private static int execute(CommandContext<FabricClientCommandSource> context) {

// Setup & Configuration
source.sendFeedback(Text.literal("⚙ Setup & Configuration:").formatted(Formatting.YELLOW, Formatting.BOLD));
sendCommand(source, "/packcore wizard", "Open the setup wizard");
sendCommand(source, "/packcore configmanager", "Open config manager GUI");
sendCommand(source, "/packcore menu toggle", "Enable/disable custom menu");
sendCommand(source, "/packcore menu enable", "Enable custom menu");
sendCommand(source, "/packcore menu disable", "Disable custom menu");
sendCopyCommand(source, "§a/packcore wizard §7- Open the setup wizard", "/packcore wizard");
sendCopyCommand(source, "§a/packcore configmanager §7- Open config manager GUI", "/packcore configmanager");
sendCopyCommand(source, "§a/packcore menu toggle §7- Enable/disable custom menu", "/packcore menu toggle");
sendCopyCommand(source, "§a/packcore menu enable §7- Enable custom menu", "/packcore menu enable");
sendCopyCommand(source, "§a/packcore menu disable §7- Disable custom menu", "/packcore menu disable");
source.sendFeedback(Text.literal(""));

// Performance & Design
source.sendFeedback(Text.literal("🚀 Performance & Design:").formatted(Formatting.YELLOW, Formatting.BOLD));
sendCommand(source, "/packcore performance list", "List performance profiles");
sendCommand(source, "/packcore performance apply <profile>", "Apply performance profile");
sendCommand(source, "/packcore tabdesign list", "List available tab designs");
sendCommand(source, "/packcore tabdesign apply <design>", "Apply tab design");
sendCopyCommand(source, "§a/packcore performance list §7- List performance profiles", "/packcore performance list");
sendCopyCommand(source, "§a/packcore performance apply <profile> §7- Apply performance profile", "/packcore performance apply");
sendCopyCommand(source, "§a/packcore tabdesign list §7- List available tab designs", "/packcore tabdesign list");
sendCopyCommand(source, "§a/packcore tabdesign apply <design> §7- Apply tab design", "/packcore tabdesign apply <design>");
source.sendFeedback(Text.literal(""));

// Information
source.sendFeedback(Text.literal("ℹ Information:").formatted(Formatting.YELLOW, Formatting.BOLD));
sendCommand(source, "/packcore status", "Show current status");
sendCommand(source, "/packcore guide", "Open guide system");
sendCommand(source, "/packcore help", "Show this help message");
sendCopyCommand(source, "§a/packcore status §7- Show current status", "/packcore status");
sendCopyCommand(source, "§a/packcore guide §7- Open guide system", "/packcore guide");
sendCopyCommand(source, "§a/packcore help §7- Show this help message", "/packcore help");

source.sendFeedback(Text.literal(""));
source.sendFeedback(Text.literal("═══════════════════════════════════").formatted(Formatting.GOLD));
Expand All @@ -54,17 +53,4 @@ private static int execute(CommandContext<FabricClientCommandSource> context) {
return 1;
}

private static void sendCommand(FabricClientCommandSource source, String command, String description) {
MutableText commandText = Text.literal(" " + command)
.formatted(Formatting.GREEN)
.styled(style -> style
.withClickEvent(new ClickEvent.SuggestCommand(command))
.withHoverEvent(new HoverEvent.ShowText(
Text.literal("Click to copy command").formatted(Formatting.YELLOW))));

MutableText descText = Text.literal(" - " + description).formatted(Formatting.GRAY);

source.sendFeedback(commandText.append(descText));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,8 @@ private static int showMenuStatus(CommandContext<FabricClientCommandSource> cont
.append(Text.literal(status).formatted(color))
);

context.getSource().sendFeedback(
Text.literal("Use ").formatted(Formatting.GRAY)
.append(Text.literal("/packcore menu toggle").formatted(Formatting.GREEN))
.append(Text.literal(" to change").formatted(Formatting.GRAY))
);
context.getSource().sendFeedback(Text.literal("/packcore menu toggle")
.formatted(Formatting.YELLOW));

return 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;

import static com.github.kd_gaming1.packcore.command.CommandHelper.sendCopyCommand;

public class PackCoreCommand {

public static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher) {
Expand All @@ -27,20 +29,16 @@ private static int showQuickHelp(CommandContext<FabricClientCommandSource> conte
var source = context.getSource();

source.sendFeedback(Text.literal("PackCore Commands").formatted(Formatting.GOLD, Formatting.BOLD));
source.sendFeedback(Text.literal("Type ").formatted(Formatting.GRAY)
.append(Text.literal("/packcore help").formatted(Formatting.GREEN))
.append(Text.literal(" for full command list").formatted(Formatting.GRAY)));

sendCopyCommand(source, "§7Type §a/packcore help §7for full command list", "/packcore help");

source.sendFeedback(Text.literal(""));
source.sendFeedback(Text.literal("Quick Commands:").formatted(Formatting.YELLOW));
source.sendFeedback(Text.literal(" • ").formatted(Formatting.GRAY)
.append(Text.literal("/packcore wizard").formatted(Formatting.GREEN))
.append(Text.literal(" - Open setup wizard").formatted(Formatting.GRAY)));
source.sendFeedback(Text.literal(" • ").formatted(Formatting.GRAY)
.append(Text.literal("/packcore menu toggle").formatted(Formatting.GREEN))
.append(Text.literal(" - Toggle custom menu").formatted(Formatting.GRAY)));
source.sendFeedback(Text.literal(" • ").formatted(Formatting.GRAY)
.append(Text.literal("/packcore configmanager").formatted(Formatting.GREEN))
.append(Text.literal(" - Open config manager").formatted(Formatting.GRAY)));

sendCopyCommand(source, "§7 • §a/packcore wizard §7- Open setup wizard", "/packcore wizard");
sendCopyCommand(source, "§7 • §a/packcore menu toggle §7- Toggle custom menu", "/packcore menu toggle");
sendCopyCommand(source, "§7 • §a/packcore configmanager §7- Open config manager", "/packcore configmanager");


return 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,25 @@

import java.util.concurrent.CompletableFuture;

import static com.github.kd_gaming1.packcore.command.CommandHelper.sendCopyCommand;

public class PerformanceCommand {

public static LiteralArgumentBuilder<FabricClientCommandSource> register() {
return ClientCommandManager.literal("performance")
.executes(context -> {
context.getSource().sendFeedback(Text.literal("Available types: list, apply")
.formatted(Formatting.YELLOW));
return 0;
})
.then(ClientCommandManager.literal("list")
.executes(PerformanceCommand::listPerformanceProfiles))
.then(ClientCommandManager.literal("apply")
.executes(context -> {
context.getSource().sendFeedback(Text.literal("Available performance options: performance, balanced, quality, shaders")
.formatted(Formatting.YELLOW));
return 0;
})
.then(ClientCommandManager.argument("profile", StringArgumentType.word())
.suggests((context, builder) -> {
builder.suggest("performance");
Expand Down Expand Up @@ -107,35 +119,46 @@ private static int applyPerformanceProfile(CommandContext<FabricClientCommandSou
}

private static int listPerformanceProfiles(CommandContext<FabricClientCommandSource> context) {
var source = context.getSource();
var availability = PerformanceProfileService.getSystemAvailability();

context.getSource().sendFeedback(Text.literal("=== PackCore Performance Profiles ===")
source.sendFeedback(Text.literal("=== PackCore Performance Profiles ===")
.formatted(Formatting.GOLD));

// Show available systems
context.getSource().sendFeedback(Text.literal("Available Systems:")
// Available systems
source.sendFeedback(Text.literal("Available Systems:")
.formatted(Formatting.YELLOW));
context.getSource().sendFeedback(Text.literal(" • Minecraft: ✓")
source.sendFeedback(Text.literal(" • Minecraft: ✓")
.formatted(Formatting.GREEN));
context.getSource().sendFeedback(Text.literal(" • Sodium: " + (availability.sodiumAvailable() ? "✓" : "✗"))
source.sendFeedback(Text.literal(" • Sodium: " + (availability.sodiumAvailable() ? "✓" : "✗"))
.formatted(availability.sodiumAvailable() ? Formatting.GREEN : Formatting.RED));
context.getSource().sendFeedback(Text.literal(" • Iris/Shaders: " + (availability.irisAvailable() ? "✓" : "✗"))
source.sendFeedback(Text.literal(" • Iris/Shaders: " + (availability.irisAvailable() ? "✓" : "✗"))
.formatted(availability.irisAvailable() ? Formatting.GREEN : Formatting.RED));

context.getSource().sendFeedback(Text.literal(""));
source.sendFeedback(Text.literal(""));

// Show available profiles
context.getSource().sendFeedback(Text.literal("Available Profiles:")
// Profiles
source.sendFeedback(Text.literal("Available Profiles:")
.formatted(Formatting.YELLOW));

for (PerformanceProfileService.PerformanceProfile profile : PerformanceProfileService.PerformanceProfile.values()) {
for (PerformanceProfileService.PerformanceProfile profile
: PerformanceProfileService.PerformanceProfile.values()) {

String command = "/packcore performance apply " + profile.name().toLowerCase();
context.getSource().sendFeedback(Text.literal(" • " + profile.getDisplayName() + " - " + profile.getDescription())
.formatted(Formatting.WHITE));
context.getSource().sendFeedback(Text.literal(" Command: " + command)

source.sendFeedback(Text.literal(" • " + profile.getDisplayName())
.formatted(Formatting.WHITE, Formatting.BOLD));
source.sendFeedback(Text.literal(" " + profile.getDescription())
.formatted(Formatting.GRAY));

sendCopyCommand(
source,
" §a" + command + " §7- Apply this profile",
command
);
}

return 1;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,25 @@

import java.util.concurrent.CompletableFuture;

import static com.github.kd_gaming1.packcore.command.CommandHelper.sendCopyCommand;

public class TabDesignCommand {

public static LiteralArgumentBuilder<FabricClientCommandSource> register() {
return ClientCommandManager.literal("tabdesign")
.executes(context -> {
context.getSource().sendFeedback(Text.literal("Available types: list, apply")
.formatted(Formatting.YELLOW));
return 0;
})
.then(ClientCommandManager.literal("list")
.executes(TabDesignCommand::listTabDesigns))
.then(ClientCommandManager.literal("apply")
.executes(context -> {
context.getSource().sendFeedback(Text.literal("Available designs: skyhanni, skyblocker")
.formatted(Formatting.YELLOW));
return 0;
})
.then(ClientCommandManager.argument("design", StringArgumentType.word())
.suggests((context, builder) -> {
builder.suggest("skyhanni");
Expand Down
Loading