Commit Graph

787 Commits

Author SHA1 Message Date
itsRevela
eb5aa9fa8f fix: chat color codes not rendering in singleplayer
PlayerConnection::handleChat called FormatChatMessage with
applyStyling=false before broadcasting, which stripped all color codes
from the message. The client then had nothing left to format. Send the
raw message and let the client handle formatting on receive.
2026-04-17 07:06:39 -05:00
itsRevela
59f9dbc8c6 fix: hardcore mode UI not locking difficulty/gamemode on world load
Three issues fixed:

- Save file path used hardcoded saveData.ms but new 4JLibs names files
  as <title>.ms. ReadLevelNameFromSaveFile now constructs the correct
  path with fallback to saveData.ms for old saves.
- The level.dat code path for reading the hardcore flag (sidecar rename)
  returned early without ever parsing level.dat. Now stores the sidecar
  name and continues to read the hardcore flag from NBT.
- The thumbnail host options path could overwrite m_bHardcore to false.
  Now only upgrades to true, never downgrades.
- Load menu constructor and tick handler both lock difficulty slider to
  Hardcore and gamemode to Survival when hardcore is detected.
- Hide title logo on load menu to match create world menu.
2026-04-17 07:06:26 -05:00
itsRevela
bc6e445f0c fix: capture save thumbnails directly from D3D11 backbuffer
The new 4JLibs CaptureThumbnail produces all-black 64x64 PNGs because
its internal m_backBufferTexture copy fails silently. Bypass it entirely
and capture from the swap chain backbuffer using the same proven approach
as our F2 screenshot, with center-crop and downsample to 64x64 PNG.
2026-04-17 07:06:02 -05:00
itsRevela
ec5ec84407 feat: add 4JLibs comparison tooling
Tools for comparing 4JLibs binary changes between git refs:
- compare-4jlibs.py: Extracts libs, parses symbol tables via dumpbin,
  demangles with undname, generates structured diff reports
- extract_lib.py: Extracts .obj members from COFF .lib archives
- ExportLibInfo.java: Ghidra headless script for non-LTCG object files
- list-lib-symbols.sh / compare-4jlibs.sh: Shell wrappers
2026-04-17 05:55:25 -05:00
itsRevela
019b790fb3 chore: sync upstream MinecraftConsoles through 1a552fbd 2026-04-17 05:53:46 -05:00
DrPerkyLegit
9ddb95e7ad Fix broken Chat Formatting behavior (#1520)
- Remove shadowcolor from font tags (Iggy doesn't support multiple)
- Enforce HTML text mode on chat labels and jukebox
- Move IDS translatable pattern matching into FormatChatMessage
- Add §r (reset) color code support
- Fix message truncation to count visible characters, skipping HTML tags
- Fix CJK truncation using raw index instead of visible char count
2026-04-17 05:52:26 -05:00
dtentiion
8464bfd448 fix: Skin pack names showing only first letter after 4JLibs update (#1518) 2026-04-17 05:49:22 -05:00
Loki Rautio
0e0f8f696d feat: Upgrade to 4JLibs libraries
Includes fixes and some modernizations compared to the original 4J
library binaries. Also introduces functionality to support stuff like
F2 screenshots, etc. This is basically the beginning of modernizing the
codebase.
2026-04-17 05:40:38 -05:00
Loki
6ef535d53e Add new Discord invite to issue config 2026-04-17 05:39:51 -05:00
Alisa Vulpes
004cd72ba5 Add .DS_Store to .gitignore (#1509) 2026-04-17 05:38:39 -05:00
DrPerkyLegit
1a552fbd0c Fix broken Chat Formatting behavior (#1520)
* fix formatting in chat

iggy doesnt like multiple shadow colors

* enforce html labels

* dont format before sending packet, client formats anyway

* move translateables to chat format, restore original empty message results

* fix crappy string cutoff

* forgot a line on last commit, reset color support

* restore function to strip styling from player messages
2026-04-16 22:41:50 -05:00
dtentiion
cccfd860b9 fix: Skin pack names showing only first letter after 4JLibs update (#1518) 2026-04-16 22:35:14 -05:00
Revela
d0094a6409 Add F2 screenshot functionality (#1262)
- Updated `EControllerActions` to include `MINECRAFT_ACTION_SCREENSHOT`.
- Added conditional compilation for `stb_image_write.h` in `Minecraft.cpp`.
- Modified `run_middle()` to handle screenshot key press.
- Updated `tick()` to capture and save screenshots as PNG files.
- Introduced `KEY_SCREENSHOT` in `KeyboardMouseInput.h` mapped to F2.
- Added `stb_image_write.h` for image writing capabilities.
2026-04-16 22:33:30 -05:00
Loki Rautio
78d4bc80cf feat: Upgrade to 4JLibs libraries
Includes fixes and some modernizations compared to the original 4J
library binaries. Also introduces functionality to support stuff like
F2 screenshots, etc. This is basically the beginning of modernizing the
codebase.
2026-04-15 19:07:15 -05:00
Loki
6595b3820d Add new Discord invite to issue config 2026-04-15 18:22:01 -05:00
Alisa Vulpes
7f0237a286 Add .DS_Store to .gitignore (#1509)
macOS automatically creates a .DS_Store file if any custom macOS attributes are set to files (like visual position in Finder). It's redundant for this repo and to avoid that to be accidentally committed/pushed, I added it to .gitignore.
2026-04-15 17:26:27 -05:00
itsRevela
d694cd1c9d chore: sync upstream MinecraftConsoles through 2fba264c 2026-04-15 05:25:33 -05:00
Loki Rautio
9d92d5eb9b Swap critical.mp3 for critical.ogg (#1503) 2026-04-15 05:22:37 -05:00
Loki
2fba264c08 Revert "Prevent contextually wrong music from playing (#1138)"
This reverts commit 2d41711055.
2026-04-14 17:00:35 -05:00
Loki Rautio
1533b2138f Swap critical.mp3 for critical.ogg (#1503) 2026-04-14 16:59:58 -05:00
Riley M.
c0da06e4ee major: Switch to forward slashes(+more) to fix compilation on Linux (#1403)
Notably also adds some metadata files for NixOS 

* add support for linux clang cross compiles

* add linux clang instructions

* un-capitalize Mob.horse.*

* update the description in flake.nix

---------

Co-authored-by: Loki <lokirautio@gmail.com>
2026-04-14 16:47:37 -05:00
itsRevela
5133925be0 chore: sync upstream MinecraftConsoles through f78dec6e 2026-04-13 03:16:34 -05:00
itsRevela
0544add4e2 chore: remove redundant/unused 4JLibs files 2026-04-13 03:15:58 -05:00
Loki Rautio
f78dec6e00 Remove redundant/unused 4JLibs files
also adds some countermeasures against, yknow.
2026-04-13 01:26:36 -05:00
itsRevela
0d102b167f docs: add Latest entries for upstream sync through 78afb091 2026-04-13 01:00:03 -05:00
itsRevela
8c34855343 chore: sync upstream MinecraftConsoles through 78afb091 2026-04-13 00:54:24 -05:00
Tyler Reese
6913ce5323 fix: Implement missing critical hit sound (#1141) 2026-04-13 00:51:16 -05:00
DrPerkyLegit
71707fbb8c Add Chat Formatting Support For Servers (#1483) 2026-04-13 00:49:49 -05:00
GabsPuNs
ae9dbd837d Exclude more files, reduce build .zip size (#1374) 2026-04-13 00:48:43 -05:00
Toru the Red Fox
825e96da54 Request dedicated GPU (#850) 2026-04-13 00:47:00 -05:00
Botch
dea2bad0c4 fix: Disable font mipmapping (#1410) 2026-04-13 00:46:32 -05:00
DrPerkyLegit
ae3c843ee5 fix: Increase entity network limit to 16k entities (#1492) 2026-04-13 00:43:18 -05:00
DrPerkyLegit
6c572d4940 feat: Scrollable chat (#1493) 2026-04-13 00:42:04 -05:00
DrPerkyLegit
5e7ad7333e Better Text Scaling (#1494)
* f3 menu text scaling

* Reduce overscaling above 1080p

Restores original scaling for 1440p to try and keep the text size more
sane on high DPI monitors

---------

Co-authored-by: Loki Rautio <lokirautio@gmail.com>
2026-04-13 00:37:54 -05:00
Tyler Reese
78afb091a4 fix: Implement missing critical hit sound (#1141)
* Fix

* Crit Sound Now Plays On Death

* Revert BuildVer.h

---------

Co-authored-by: Loki <lokio.casebstv@gmail.com>
2026-04-12 23:24:29 -05:00
Tyler Reese
2d41711055 fix: Prevent contextually wrong music from playing (#1138) 2026-04-12 23:22:14 -05:00
DrPerkyLegit
14f8d793dd Add Chat Formatting Support For Servers (#1483)
* add chat support for html formatting

* html character serialization, normal color format support

* change for chat input handling on color

has a bug where the text after the cursor gets stripped of its color, need to make a function to backstep on a string and find the last used color codes, or get all color codes used before the string is split, and apply them to the start of the next string

* expose jukebox label as action bar like java

* prevent players from sending chat color

* restore non styled chat size check
2026-04-12 23:17:45 -05:00
GabsPuNs
bfcb621808 Exclude more files, reduce build .zip size (#1374)
* Fix Sign

* Exclude more files from the compilation.

* Remove Trial and Tutorial folder in Common, Tutorial world is in windows64media
2026-04-12 23:17:21 -05:00
Toru the Red Fox
050c501786 Request dedicated GPU (#850) 2026-04-12 22:56:24 -05:00
Botch
e5ce9a06cd fix: Disable font mipmapping (#1410)
Fixes visual artifacts with signs, improving legibility at distances
2026-04-12 22:55:07 -05:00
Us3ful"-Dev
e730033bcc fix: Prevent end poem crash (#1489)
Removed player name check that always fails to work on non host instances
2026-04-12 22:53:39 -05:00
rtm516
9e6e3de338 Improve actions file ignore rules (#1491)
* Add clang-format workflow for pull request checks

* Modify push paths in nightly workflow

Updated paths for push event to include all files except specified ones.

* Update paths for nightly-server workflow triggers

* Modify paths for pull request triggers

Update pull request workflow to include specific paths.

* Remove formatting check workflow
2026-04-12 22:52:34 -05:00
DrPerkyLegit
82c1ae1968 fix: Increase entity network limit to 16k entities (#1492) 2026-04-12 22:50:46 -05:00
DrPerkyLegit
c7014f6b18 feat: Scrollable chat (#1493)
* chat scrolling

* allow escape to close chat instead of opening pause
2026-04-12 22:50:16 -05:00
DrPerkyLegit
744048f455 Better Text Scaling (#1494)
* f3 menu text scaling

* Reduce overscaling above 1080p

Restores original scaling for 1440p to try and keep the text size more
sane on high DPI monitors

---------

Co-authored-by: Loki Rautio <lokirautio@gmail.com>
2026-04-12 22:48:08 -05:00
itsRevela
33bec8a93c docs: add Latest entries for recent client fixes
Covers the join-flow kick bug, the fullscreen and frame rate work, and the controller cursor speed fix.
2026-04-11 08:13:58 -05:00
itsRevela
abb18e3e12 fix: new players kicked when joining right after being whitelisted
When a new player was whitelisted while they were sitting on the join screen, their next attempt would insta-kick before the world ever loaded, and the retry after that would let them in for roughly 20 seconds before booting them with "connection closed". Two separate bugs were colliding.

The first kick was a stale cancel flag on the client. When the server rejects a join, the "Connecting to host..." screen tears down, and its teardown path fires the cancel callback defensively. That flag would latch on without ever being consumed, so the very first tick of the next join attempt saw it and immediately closed the fresh connection. Clearing the flag when a new join starts prevents this.

The second kick was an orphan on the server. When the first failed join's TCP dropped, its slot got recycled for the next successful join, but the half-built login object from the broken attempt was still in the pending queue. 30 seconds later its "login took too long" timer fired, and the disconnect packet it tried to send was routed to whoever currently held that slot, which was now the new in-world player. It landed on their live socket and kicked them. Telling the game's Socket layer about the TCP drop lets the orphan clean itself up, and refusing to write on an already-closing socket stops any late packet from leaking into the recycled slot.
2026-04-11 08:13:46 -05:00
itsRevela
f189234614 feat: uncap fps in fullscreen for lower input latency
Before this change, turning VSync off did not actually uncap your frame rate. The game ran in borderless fullscreen, where Windows' desktop compositor owns the display pipeline and applies its own VSync regardless of what the game asks for. So on a 240Hz monitor with a GPU that could draw 800fps, you still only saw 240 frames per second and the other 560 were thrown away. Worse, the frames you did see were up to a refresh cycle stale by the time they hit your eyes, which is input latency you can feel when moving the camera or aiming.

Fullscreen now uses true DXGI exclusive mode, where the compositor is out of the way and the swap chain writes directly to the display. Every frame the GPU produces lands on screen as soon as it is ready, so "VSync off" actually does something. Expect FPS to climb well past your monitor's refresh rate and the mouse to feel noticeably more responsive.

Exclusive fullscreen also displays at your monitor's native resolution with no driver-side scaling or filtering. The backbuffer is grown to match the monitor exactly before the transition, and the display mode is pinned to the backbuffer size so nothing in the output pipeline resamples your pixels on the way to the screen. The result is a crisp 1:1 image with none of the softening or greyish filter that stretched output can introduce.

Yes, this is the mode where screen tearing can happen. Tearing gets a bad reputation but it is a visual tradeoff, not a bug, and many players prefer it over the latency VSync causes. If you want to avoid tearing, just turn VSync on in the settings and the game will cap cleanly to your refresh rate. You now have a real choice between the two instead of "off" quietly being broken.

Under the hood, F11 and the saved fullscreen preference both route through a new ApplyExclusiveFullscreen path that does Microsoft's recommended transition: grow the window to cover the monitor, ResizeTarget with no scaling so the display mode is pinned to the backbuffer size, SetFullscreenState(TRUE), SetColorSpace1(sRGB), then a second ResizeTarget so picky drivers actually apply the mode. Exit forces a real decorated windowed state so F11 cycles cleanly between windowed and exclusive fullscreen. ResizeD3D skips its swap-chain-recreate path while in exclusive mode so it does not fight DXGI for ownership.

The swap chain's RefreshRate changes from a hardcoded 60Hz to 0/0 so DXGI matches the current display mode. Fixes an "input signal out of range" error that could happen on high-refresh monitors after entering fullscreen, where the monitor was being asked to renegotiate timing off of 240Hz down to 60Hz on every launch.
2026-04-11 06:19:22 -05:00
itsRevela
6c8f463707 fix: restore in-world rendering and aspect ratio via bitblt swap chain
The previous FLIP_DISCARD swap chain configuration was producing broken rendering and a stretched aspect ratio on startup and after window resize, because the closed-source 4J Renderer library holds hidden backbuffer references that prevent ResizeBuffers from succeeding in flip mode. Switches the swap chain to the legacy bitblt DISCARD model with BufferCount=1, which lets the "destroy old, create new" resize path in ResizeD3D work cleanly. In-world rendering and aspect ratio are now correct at launch and across window resizes.

Known regression from this change: screen tearing no longer works when VSync is off. On Windows 10 and 11, bitblt swap chains always go through the DWM compositor, which locks presentation to the monitor refresh rate regardless of the SyncInterval parameter we pass to Present. Every frame the renderer produces above the refresh rate is silently dropped by DWM, which hurts input latency compared to a true uncapped-fps presentation path. The next iteration will reverse-engineer the 4J Renderer struct layout to find where those hidden backbuffer references are stored, release them before ResizeBuffers, and switch back to FLIP_DISCARD with ALLOW_TEARING so real tearing is possible again.

Also removes the dead SwapChainVSyncProxy COM wrapper. The proxy was originally intended to intercept Present calls from the Renderer library for VSync control, but the library hardcodes SyncInterval=1 and does not dispatch Present through the proxy vtable, so it was never actually doing anything useful.
2026-04-11 02:49:53 -05:00
Revela
b67889485f Remove Discord link from README
Removed Discord badge from README.
2026-04-11 02:09:48 -05:00