Skip to content
Merged

v4.1 #23

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
49 changes: 6 additions & 43 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,9 @@
# Changelog

## v4.0.0
## v4.1.0

### Core Features
- First-launch **Welcome Wizard** for guided setup
- Custom **main menu styles** (Modern, Modern Minimal, Minimal)
- Built-in **performance profile selector**
- Visual customization pages for:
- Tab design
- Item background style
- Storage design
- Optional wizard pages for supported mods:
- **ScaleMe** sword block toggle
- **ScamScreener** alert + ping setup
- **Resource pack selection** during setup
- Final **review + apply** page with per-setting status

### Config Pack System
- Automatic config pack detection and loading
- Resolution-based best-match config selection
- Safer update behavior (tracks applied pack + version)
- Restart-safe pending apply flow for full preset changes

### Config Manager UI
- New in-game **modpack config screen** with tabs:
- Configuration
- Export
- Import
- Backups
- Browse config pack contents before applying
- Apply **selected files** or apply **entire preset**

### Export / Import / Backups
- Export selected files as reusable config pack `.zip`
- Include metadata in exports (name, version, author, description, target resolution, GUI scale)
- Import external config packs from imports folder
- Create and restore backups from in-game UI

### Commands & Utilities
- Command to reopen wizard: `/packcore wizard`
- Command to open config manager: `/packcore modpack_config`
- Update check commands:
- `/packcore update check`
- `/packcore update reset`
- Performance/design quick commands for advanced users
### Diagnostics
- Full diagnostics report logged on every startup (modpack info, config pack, settings, runtime, system)
- Crash reports now include a **PackCore Diagnostics** section with the same data as the startup log
- New `/packcore diagnose` command — shows a compact report in chat with a **click-to-copy** button for easy sharing when reporting issues
- New `/packcore crashtest` command — triggers a test crash to verify the crash report enrichment is working
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ org.gradle.parallel=true
org.gradle.configuration-cache=false

# Mod properties
mod.version=4.0.0
mod.version=4.1.0
mod.group=com.github.kd_gaming1
mod.id=packcore
mod.name=Pack Core
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ pluginManagement {
}

plugins {
id("dev.kikugie.stonecutter") version "0.9-beta.1"
id("dev.kikugie.stonecutter") version "0.9"
}

stonecutter {
Expand Down
34 changes: 15 additions & 19 deletions src/main/java/com/github/kd_gaming1/packcore/PackCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.github.kd_gaming1.packcore.command.PackCoreCommands;
import com.github.kd_gaming1.packcore.config.PackCoreConfig;
import com.github.kd_gaming1.packcore.util.diagnostics.DiagnosticsCollector;
import com.github.kd_gaming1.packcore.gui.screen.PackCoreTitleScreen;
import com.github.kd_gaming1.packcore.gui.screen.SBETitleScreen;
import com.github.kd_gaming1.packcore.gui.screen.WelcomeWizardScreen;
Expand All @@ -23,70 +24,65 @@
import java.nio.file.Path;

public class PackCore implements ClientModInitializer {

public static final String MOD_ID = "packcore";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

public static final Path PACKCORE_DIR = FabricLoader.getInstance().getGameDir().resolve("packcore");
public static final Path PACKCORE_DIR =
FabricLoader.getInstance().getGameDir().resolve("packcore");

public static boolean migratedFromV3 = false;
private static boolean replacingTitleScreen = false;

@Override
public void onInitializeClient() {
LOGGER.info("[PackCore] Initialized");
LOGGER.info("[PackCore] Initialized\n{}", DiagnosticsCollector.buildFullReport());

RamWarningHelper.init();
UpdateChecker.checkAsync();

ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> PackCoreCommands.register(dispatcher));
ClientCommandRegistrationCallback.EVENT.register(
(dispatcher, registryAccess) -> PackCoreCommands.register(dispatcher));

ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof TitleScreen)) return;
if (screen instanceof PackCoreTitleScreen) return;

if (!(screen instanceof TitleScreen) || screen instanceof PackCoreTitleScreen) return;
RamWarningHelper.onMainMenu();

if (PackCoreConfig.menuStyle != PackCoreConfig.MenuStyle.MINIMAL) {
scheduleConfiguredTitleScreen(client, screen);
}
});

ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof TitleScreen)) return;
if (screen instanceof PackCoreTitleScreen) return;
if (!(screen instanceof TitleScreen) || screen instanceof PackCoreTitleScreen) return;
if (!PackCoreConfig.successfulWelcomeWizard) return;
if (PackCoreConfig.menuStyle != PackCoreConfig.MenuStyle.MINIMAL) return;

PackCoreTitleScreen.decorateExisting((TitleScreen) screen, scaledWidth, scaledHeight);
});

ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> client.execute(RamWarningHelper::onWorldJoin));
ClientPlayConnectionEvents.JOIN.register(
(handler, sender, client) -> client.execute(RamWarningHelper::onWorldJoin));

ClientLifecycleEvents.CLIENT_STARTED.register(client -> PlaytimeTracker.onSessionStart());
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> PlaytimeTracker.onSessionEnd());
}

private static void scheduleConfiguredTitleScreen(Minecraft client, Screen screen) {
if (!(screen instanceof TitleScreen) || screen instanceof PackCoreTitleScreen || replacingTitleScreen) return;

if (replacingTitleScreen) return;
replacingTitleScreen = true;
client.execute(() -> {
try {
if (client.screen != screen) return;

if (!PackCoreConfig.successfulWelcomeWizard) {
client.setScreen(new WelcomeWizardScreen(screen));
return;
}

switch (PackCoreConfig.menuStyle) {
case MODERN -> client.setScreen(new SBETitleScreen());
case MODERN -> client.setScreen(new SBETitleScreen());
case MODERN_MINIMAL -> client.setScreen(new SBETitleScreen(false));
case MINIMAL -> client.setScreen(new PackCoreTitleScreen());
case MINIMAL -> client.setScreen(new PackCoreTitleScreen());
}
} finally {
replacingTitleScreen = false;
}
});
}
}
}
Loading
Loading