Feature Matrix
v1.5.10 1.20.1 / 1.21.1 Forge Fabric
Everything CNPCExtended offers, compared across platforms at a glance.
30+
Total Features
30+
Shared (Both)
0
Platform-Only
2
Platforms
✔ Supported
─ Not yet
✘ N/A
⚙
Core (Server-Side)
Forge + Fabric| Feature | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| Script Injection (cnpcext global) | ✔ | ✔ |
| Client Bridge API (getClientBridge()) | ✔ | ✔ |
| Global Script Preloading | ✔ | ✔ |
| Global NPC Data Preloading | ✔ | ✔ |
| Script Commands (registerCommand()) | ✔ | ✔ |
| /cnpcext CLI Commands | ✔ | ✔ |
| ModConfig (common.toml) | ✔ | ✔ |
| ClientConfig (skip menu) | <td class=\"s s-yes\">✔</td><td class=\"s s-yes\">✔</td>||
| Skip Menu (auto-load world/server) | <td class=\"s s-yes\">✔</td><td class=\"s s-yes\">✔</td>
🌐
HTML GUI (Client)
Forge + Fabric| Feature | Forge 1.20.1 | Fabric 1.21.1 | Notes |
|---|---|---|---|
| HTML GUI (MCEF Chromium) | ✔ | ✔ | Full HTML/CSS/JS rendered in-game |
| Bridge JS (window.cnpc) | ✔ | ✔ | sendEvent, onEvent, close, initData |
| MC Item Overlays | ✔ | ✔ | Real ItemStack rendering on HTML elements |
| Entity Overlays | ✔ | ✔ | Full entity rendering (NPCs, players) via data-mc-entity |
| Clip Rects (data-mc-clip) | ✔ | ✔ | Scissor clipping for scrollable item lists |
| Client Queries | ✔ | ✔ | Video, keybinds, sound, player state, packs |
| Client Script Engine | ✔ | ✔ | JSR-223 JavaScript on client side |
| Key State Tracking | ✔ | ✔ | bridge.isKeyHeld(), isInGui(), isTyping() |
| Client Key Events | ✔ | ✔ | clientKeyPressed, clientKeyReleased, clientKeyHeld |
📺
HTML Overlays (HUD)
Forge + FabricRender HTML on the HUD layer — skill bars, HP bars, quest trackers. Game stays fully playable.
| Feature | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| openOverlay(name, file, x, y, w, h, data) | ✔ | ✔ |
| updateOverlay(name, data) — auto-dedup | ✔ | ✔ |
| hideOverlay / showOverlay / closeOverlay | ✔ | ✔ |
| Multiple simultaneous overlays (up to 8) | ✔ | ✔ |
| Persistent overlays (survive relog) | ✔ | ✔ |
| Auto-cleanup on disconnect | ✔ | ✔ |
| Item overlays on HUD | ✔ | ✔ |
| Entity overlays on HUD | ✔ | ✔ |
| Fade-in animation | ✔ | ✔ |
| Interactive mode (cursor unlock) | ✔ | ✔ |
🎨
Vanilla HUD Hiding
Forge + FabricSelectively hide vanilla HUD elements. Resets on disconnect.
| Element | hideHudElement() Name | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|---|
| Hotbar + item name | hotbar | ✔ | ✔ |
| XP bar + level number | experience | ✔ | ✔ |
| Hearts + food + armor + air | health | ✔ | ✔ |
| Armor icons only | armor | ✔ | ✔ |
| Hunger bar only | food | ✔ | ✔ |
| Crosshair | crosshair | ✔ | ✔ |
| Potion effects | effects | ✔ | ✔ |
| Action bar text | actionbar | ✔ | ✔ |
| Chat display | chat | ✔ | ✔ |
| Sidebar scoreboard | scoreboard | ✔ | ✔ |
| Tab player list | tablist | ✔ | ✔ |
| All at once | all | ✔ | ✔ |
📁
Asset Loading
Forge + FabricLoad images, CSS, JS, and fonts from the scripts folder via the cnpc:// custom CEF scheme.
| Feature | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| cnpc:// custom CEF scheme | ✔ | ✔ |
| window.cnpc.assetUrl in bridge JS | ✔ | ✔ |
| Auto-sync scripts path on join | ✔ | ✔ |
| Path traversal protection | ✔ | ✔ |
| Works in HTML GUIs | ✔ | ✔ |
| Works in HTML Overlays | ✔ | ✔ |
🎬
Cutscene System
Forge + FabricKeyframe-based camera cutscenes with visual HTML editor, fade transitions, per-keyframe easing, player protection, and script phase events.
| Feature | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| startCutscene(player, name, options) | ✔ | ✔ |
| stopCutscene / pauseCutscene / resumeCutscene | ✔ | ✔ |
| isInCutscene(player) | ✔ | ✔ |
| moveCamera(player, json) — ad-hoc keyframes | ✔ | ✔ |
| cutscene(e) phase event handler | ✔ | ✔ |
| Visual editor GUI (HTML) | ✔ | ✔ |
| Per-keyframe easing (11 curves) | ✔ | ✔ |
| Keep position on end | ✔ | ✔ |
| Fade transitions | ✔ | ✔ |
| Cinematic black bars | ✔ | ✔ |
| FOV lock + hand hidden | ✔ | ✔ |
| Mouse look blocked | ✔ | ✔ |
| Player protection (freeze + invulnerable) | ✔ | ✔ |
| Disconnect/reconnect failsafe | ✔ | ✔ |
| Catmull-Rom camera interpolation | ✔ | ✔ |
| Sub-tick camera smoothing (60fps+) | ✔ | ✔ |
| /cnpcext cutscene play <name> <player> | ✔ | ✔ |
📡
API Method Reference
cnpcext — Server Script Global
| Method | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| getClientBridge(mcPlayer) | ✔ | ✔ |
| openHtmlGui(e, file, w, h, json) | ✔ | ✔ |
| registerCommand(name, json) | ✔ | ✔ |
| openOverlay(e, name, file, x, y, w, h, json) | ✔ | ✔ |
| updateOverlay(e, name, json) | ✔ | ✔ |
| hideOverlay / showOverlay | ✔ | ✔ |
| closeOverlay / hasOverlay | ✔ | ✔ |
| hideHudElement(e, element) | ✔ | ✔ |
| showHudElement(e, element) | ✔ | ✔ |
| startCutscene(player, name, optionsJson) | ✔ | ✔ |
| stopCutscene(player) | ✔ | ✔ |
| pauseCutscene / resumeCutscene | ✔ | ✔ |
| isInCutscene(player) | ✔ | ✔ |
| moveCamera(player, keyframesJson) | ✔ | ✔ |
| entityId(entity) | ✔ | ✔ |
| entityNbt(entity) | ✔ | ✔ |
IClientBridge — via getClientBridge()
| Method | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| openHtmlGui(file, w, h, json) | ✔ | ✔ |
| closeHtmlGui() | ✔ | ✔ |
| sendToBrowser(event, json) | ✔ | ✔ |
| queryVideoSettings(cb) | ✔ | ✔ |
| queryKeybinds(cb) | ✔ | ✔ |
| querySoundSettings(cb) | ✔ | ✔ |
| queryPlayerState(cb) | ✔ | ✔ |
| queryResourcePacks(cb) | ✔ | ✔ |
| openOverlay(name, file, x, y, w, h, json) | ✔ | ✔ |
| updateOverlay(name, json) | ✔ | ✔ |
| hideOverlay / showOverlay / closeOverlay | ✔ | ✔ |
| hasOverlay(name) | ✔ | ✔ |
| hideHudElement(element) | ✔ | ✔ |
| showHudElement(element) | ✔ | ✔ |
| isKeyHeld(keyCode) | ✔ | ✔ |
| getKeyHoldDuration(keyCode) | ✔ | ✔ |
| isInGui() | ✔ | ✔ |
| isTyping() | ✔ | ✔ |
| getOpenScreen() | ✔ | ✔ |
window.cnpc — Browser-Side JS
| Property / Method | HTML GUI | HTML Overlay |
|---|---|---|
| initData | ✔ | ✔ |
| assetUrl | ✔ | ✔ |
| onEvent(name, cb) | ✔ | ✔ |
| sendEvent(name, data) | ✔ | ✔ |
| close() | ✔ | ✔ |
| setOverlayItems(items) | ✔ | ✔ |
| setClipRect(rect) | ✔ | ✔ |
📦
Network Packets
| ActionType | Forge 1.20.1 | Fabric 1.21.1 |
|---|---|---|
| OPEN_HTML_GUI | ✔ | ✔ |
| CLOSE_HTML_GUI | ✔ | ✔ |
| SEND_TO_BROWSER | ✔ | ✔ |
| RUN_CLIENT_SCRIPT | ✔ | ✔ |
| SEND_TO_CLIENT | ✔ | ✔ |
| OPEN_OVERLAY | ✔ | ✔ |
| UPDATE_OVERLAY | ✔ | ✔ |
| CLOSE_OVERLAY | ✔ | ✔ |
| HIDE_OVERLAY | ✔ | ✔ |
| SHOW_OVERLAY | ✔ | ✔ |
| SET_OVERLAY_INTERACTIVE | ✔ | ✔ |
| CLOSE_ALL_OVERLAYS | ✔ | ✔ |
| HIDE_HUD_ELEMENT | ✔ | ✔ |
| SHOW_HUD_ELEMENT | ✔ | ✔ |
| SYNC_SCRIPTS_PATH | ✔ | ✔ |
| PacketCutsceneStart (S→C) | ✔ | ✔ |
| PacketCutsceneStop (S→C) | ✔ | ✔ |
⚠
Known Issues & Fixes
v1.5Discovered via user testing. Fixed on both platforms.
| Issue | Status | Details |
|---|---|---|
| Blurry overlay text | FIXED | Overlay browser was sized at width × guiScale instead of native window pixel ratio. Text rendered at half resolution then stretched. |
| Black flash on HTML load | FIXED | CEF needs a few frames to paint after creation. Added fade-in animation (skip 8 frames + fade over 10 frames). |
| Cursor detaches from game | FIXED | CEF's default cursorChangeListener calls glfwSetInputMode(GLFW_CURSOR_NORMAL) during HTML load. Fix: no-op cursor listener on overlay browsers. |
| Overlay breaks on window resize | FIXED | Item/entity overlay positions misaligned after resizing MC window. Fix: auto-resize browser each frame via checkResize(). |