From 28d7718764ad1e7b58848b5c81c83fd783fa2820 Mon Sep 17 00:00:00 2001 From: Emerald-Railroad Date: Mon, 31 Aug 2026 20:57:33 -0500 Subject: [PATCH] Add custom theater screens and Screenwriter automation Add custom theater screens and Screenwriter automation --- CHANGELOG.md | 136 +++ README.md | 30 +- build-mod.bat | 2 +- gradle.properties | 2 +- run-client.bat | 2 +- settings.gradle | 2 +- .../pixelreel/client/ClientNetworking.java | 29 + .../com/pixelreel/client/PixelReelClient.java | 15 + .../gui/CustomScreenPlacementScreen.java | 144 +++ .../client/gui/MediaSourceScreen.java | 8 +- .../client/gui/PlaybackControlScreen.java | 5 + .../client/gui/ScreenwriterLinkScreen.java | 99 ++ .../client/playback/ChannelPlayer.java | 54 +- .../client/playback/DirectAudioSink.java | 196 +++ .../client/playback/PlaybackManager.java | 190 ++- .../client/playback/video/VlcRuntime.java | 2 +- .../render/DisplayBlockEntityRenderer.java | 82 +- .../client/render/DisplayRenderState.java | 2 + src/main/java/com/pixelreel/ClientBridge.java | 19 + src/main/java/com/pixelreel/PixelReel.java | 7 + .../blockentities/DisplayBlockEntity.java | 104 +- .../blockentities/ScreenPanelBlockEntity.java | 6 +- .../com/pixelreel/blocks/DisplayBlock.java | 60 +- .../com/pixelreel/blocks/DisplayGeometry.java | 162 +++ .../com/pixelreel/blocks/DisplayType.java | 12 +- .../pixelreel/blocks/ScreenPanelBlock.java | 17 + .../com/pixelreel/blocks/ScreenShapes.java | 80 +- .../blocks/ScreenwriterConsoleBlock.java | 33 + .../commands/ScreenwriterCommand.java | 179 +++ .../com/pixelreel/commands/TvCommand.java | 2 +- .../items/CustomScreenBlockItem.java | 32 + .../pixelreel/items/RemoteControlItem.java | 54 + .../networking/ModNetworkPayloads.java | 56 + .../networking/ServerNetworking.java | 123 ++ .../pixelreel/ondemand/OnDemandCatalog.java | 9 + .../com/pixelreel/registry/ModBlocks.java | 14 +- .../pixelreel/registry/ModCreativeTabs.java | 2 +- .../java/com/pixelreel/registry/ModItems.java | 29 +- .../pixelreel/server/ScreenwriterManager.java | 1067 +++++++++++++++++ .../blockstates/screenwriter_console.json | 5 + .../assets/pixelreel/items/cinema_screen.json | 2 +- .../pixelreel/items/curved_cinema_screen.json | 2 +- .../pixelreel/items/remote_control.json | 1 + .../pixelreel/items/screenwriter_console.json | 6 + .../assets/pixelreel/lang/en_us.json | 102 +- .../models/block/screenwriter_console.json | 6 + .../pixelreel/models/item/remote_control.json | 1 + .../models/item/screenwriter_console.json | 3 + .../textures/block/screenwriter_console.png | Bin 0 -> 28764 bytes .../textures/item/remote_control.png | Bin 0 -> 127 bytes .../blocks/screenwriter_console.json | 20 + .../data/pixelreel/recipe/cinema_screen.json | 3 +- .../recipe/curved_cinema_screen.json | 3 +- .../data/pixelreel/recipe/remote_control.json | 18 + .../recipe/screenwriter_console.json | 18 + src/main/resources/fabric.mod.json | 7 +- 56 files changed, 3023 insertions(+), 241 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 src/client/java/com/pixelreel/client/gui/CustomScreenPlacementScreen.java create mode 100644 src/client/java/com/pixelreel/client/gui/ScreenwriterLinkScreen.java create mode 100644 src/client/java/com/pixelreel/client/playback/DirectAudioSink.java create mode 100644 src/main/java/com/pixelreel/blocks/DisplayGeometry.java create mode 100644 src/main/java/com/pixelreel/blocks/ScreenwriterConsoleBlock.java create mode 100644 src/main/java/com/pixelreel/commands/ScreenwriterCommand.java create mode 100644 src/main/java/com/pixelreel/items/CustomScreenBlockItem.java create mode 100644 src/main/java/com/pixelreel/items/RemoteControlItem.java create mode 100644 src/main/java/com/pixelreel/server/ScreenwriterManager.java create mode 100644 src/main/resources/assets/pixelreel/blockstates/screenwriter_console.json create mode 100644 src/main/resources/assets/pixelreel/items/remote_control.json create mode 100644 src/main/resources/assets/pixelreel/items/screenwriter_console.json create mode 100644 src/main/resources/assets/pixelreel/models/block/screenwriter_console.json create mode 100644 src/main/resources/assets/pixelreel/models/item/remote_control.json create mode 100644 src/main/resources/assets/pixelreel/models/item/screenwriter_console.json create mode 100644 src/main/resources/assets/pixelreel/textures/block/screenwriter_console.png create mode 100644 src/main/resources/assets/pixelreel/textures/item/remote_control.png create mode 100644 src/main/resources/data/pixelreel/loot_table/blocks/screenwriter_console.json create mode 100644 src/main/resources/data/pixelreel/recipe/remote_control.json create mode 100644 src/main/resources/data/pixelreel/recipe/screenwriter_console.json diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b1ed177 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,136 @@ +# PixelReel Custom Fork Changelog + +## v1.1.0 + +Screenwriter media-server load controls. + +- Screenwriter now starts **OFF by default** in fresh worlds. Existing worlds keep their saved ON/OFF state. +- Added `/screenwriter maxstreams <0-30>` to cap the number of **simultaneous scheduled auditorium shows**. +- Default simultaneous-show limit is **4**. A value of `0` means unlimited. +- Daily schedule generation now respects that cap for the complete duration of every movie, not just the start time. +- Scheduling is built chronologically across all linked auditoriums so higher auditorium numbers still receive shows as capacity becomes available. +- Changing the limit preserves the already-generated day; `/screenwriter regenerate` applies the new setting to today's schedule. +- `/screenwriter status` now reports the configured simultaneous-show limit. + +## v1.0.0 + +First formal release of the theater-focused PixelReel Custom Fork. + +### Custom cinema screens + +- Replaced the normal screen lineup with two user-facing theater screens: + - **Custom Cinema Screen** — flat. + - **Custom Curved Cinema Screen** — dynamically curved using the original PixelReel curved-screen profile. +- Both screens open a placement menu for custom width, height, audio depth, and side range. +- Supported custom dimensions: **1–64 blocks wide** and **1–36 blocks tall**. +- Default custom dimensions: **27 × 11**. +- Screen placement validates that all required panel cells are available before consuming the item. +- Custom screen geometry, size, and audio-zone settings persist in the block entity and sync to clients. +- Flat screens render/collide against the back face of their occupied cells so they can sit flush against a wall. +- Breaking any generated screen panel removes the complete bound display. Survival drops the controller item normally; creative does not duplicate it. +- Legacy preset display registrations remain internally for world compatibility, but the old preset TV/monitor items are no longer part of the normal creative/crafting lineup. + +### Auditorium audio + +- Custom screens use a hard auditorium-shaped audio zone rather than circular distance attenuation. +- Default audio zone: **40 blocks forward**, **2 blocks beyond each screen edge**, and **1 block behind the screen**. +- Audio remains at the screen's configured volume anywhere inside the zone and becomes silent outside it. +- The client chooses at most one audible screen when zones overlap. +- Replaced shared LibVLC native volume output with per-screen decoded PCM callbacks and independent JavaSound output. +- Each physical screen has its own playback/audio session, preventing simultaneous auditorium tracks from mixing. + +### Remote Control + +- Added a Remote Control that can target screens from a longer distance and open normal screen controls. +- Added **Reset Connection** to rebuild only the local client's media/audio session for the selected screen and reconnect at the current synchronized playback position. +- The remote is also used to link custom cinema screens to Screenwriter. +- Recipe: + +```text +II +RB +II +``` + +- `I` = Iron Ingot +- `R` = Redstone +- `B` = any Button + +### Screenwriter theater automation + +- Added the **Screenwriter Console** for centralized real-world theater scheduling. +- Supports up to **30 linked custom cinema screens**. +- Auditorium numbers are user-selected and unique from **1–30**; link order does not determine auditorium number. +- Re-linking can change an auditorium number without deleting that auditorium's current generated schedule. +- Right-click the console to arm linking; sneak + right-click a custom screen with the Remote Control to open the auditorium link/update menu. +- Shift + right-click the console toggles Screenwriter on/off. +- Screenwriter can also be enabled/disabled through commands. +- Generates a new schedule for the current real-world day from configured **Jellyfin or Plex** movie libraries. +- Provider mode can be `AUTO`, `JELLYFIN`, or `PLEX`; AUTO prefers Jellyfin when available and otherwise uses Plex. +- Only movies with runtime metadata are scheduled. +- Uses runtime metadata to calculate exact end times. +- Supports configurable theater opening/closing times, turnaround gaps, and first-show staggering. +- Default settings: + - open: **11:00 AM** + - close: **11:30 PM** + - turnaround: **20 minutes** + - first-show stagger window: **30 minutes** + - later-show rounding: **10 minutes** +- The first show in each auditorium is distributed through the stagger window rather than starting every auditorium at opening time. +- A movie used in the previous **3 calendar days** is excluded from the current day's random schedule. +- A movie is used at most once in the same generated day. +- Schedules are saved to `pixelreel-screenwriter.json` in the world folder and are not rerolled by server restarts. +- If the server starts during an active scheduled movie, Screenwriter resumes that movie at the elapsed real-world position. +- Screenwriter powers linked displays off between shows. +- Turning Screenwriter off stops its controlled playback and prevents automatic generation until re-enabled. + +### Screenwriter commands + +```text +/screenwriter +/screenwriter status +/screenwriter on +/screenwriter off +/screenwriter schedule +/screenwriter book +/screenwriter generate +/screenwriter regenerate +/screenwriter source +/screenwriter open