CI on 3b5e555 revealed:
- net.minecraft.client.renderer.RenderType moved to
net.minecraft.client.renderer.rendertype; use RenderTypes.lines() factory.
- Camera.position() returns Vec3, not Vector3fc as I guessed.
OrderedSubmitNodeCollector, submitShapeOutline, Shapes.block/box,
LevelRenderEvents.AFTER_TRANSLUCENT_FEATURES — all compiled cleanly.
MC 26.2 removed MultiBufferSource; new in-world outline drawing goes through
OrderedSubmitNodeCollector#submitShapeOutline (PoseStack, VoxelShape,
RenderType, color, width, beforeTranslucent).
- LevelRenderEvents.AFTER_TRANSLUCENT_FEATURES is the new entry point (was
WorldRenderEvents.AFTER_ENTITIES).
- Friend dots: small 0.3-unit voxel cube above player head, green.
- Markers: 1x1x1 cube outline + thin tall beam (0.1x50x0.1), magenta.
- Camera.position() returns Vector3fc; camera offset applied to render in
camera-relative space.
- Casts SubmitNodeCollector to OrderedSubmitNodeCollector; if vanilla wraps
it differently we'll see in the next CI cycle.
MC 26.2 overhauled rendering significantly. The classes we used don't
exist anymore:
- MultiBufferSource was removed; world line drawing now goes through
SubmitNodeCollector via LevelRenderEvents.COLLECT_SUBMITS — a much
larger rewrite. Defer until next iteration.
- HudLayerRegistrationCallback / IdentifiedLayer / LayeredDraw — replaced
by HudElementRegistry / HudElement / VanillaHudElements. Compass and
watermark deferred until next iteration.
- fabric-key-binding-api-v1 module renamed to fabric-key-mapping-api-v1.
Class is now KeyMappingHelper at net.fabricmc.fabric.api.client.keymapping.v1.
- KeyMapping ctor: last arg is KeyMapping.Category, not a String.
- BlockPos#getCenter removed — construct Vec3 manually.
- ResourceKey#location renamed to identifier (returns Identifier).
- ResourceLocation was renamed to Identifier (in 26.1).
Friends/markers/chat/tab-complete still work; marker_set from friends
shows up as a chat line "[IRC] marker from X @ x, y, z" instead of an
in-world beacon for this iteration.
- FriendsManager persists a per-user friend list at config/clientirc-friends.json.
- MarkerManager holds one ephemeral marker per owner (5 min expiry).
- IRC protocol extended with marker_set / marker_remove; server relays them.
- IrcService DisplayLine replaced with sealed IrcEvent (Chat / System / MarkerSet / MarkerRemove); chat formatting moved into the client.
- ClientIrcMod handles .friends add/remove/list, .marker remove, .help; chat lines from friends are prefixed with a green dot; marker events from non-friends are ignored.
- OverlayHud draws a top-center compass strip and a top-left watermark (nick / FPS / ping) via HudLayerRegistrationCallback.
- WorldOverlayRenderer draws green crosses above friends and magenta beams + base cubes at active markers via WorldRenderEvents.AFTER_ENTITIES.
- MiddleClickHandler binds MMB via KeyMapping, raycasts a block or 20-block look ray, stores locally and sends marker_set on a daemon executor.
- ChatScreenMixin completes . prefix commands on Tab; first mixin in the project, plumbed through clientirc.client.mixins.json and fabric.mod.json.
displayClientMessage(Component, boolean) was removed from LocalPlayer
in 26.2. sendSystemMessage(Component) is inherited from Entity, has
been part of Mojang's public API since 1.19, and LocalPlayer overrides
it to route the message into the local chat hud, which is exactly the
behaviour we want.
Gui.chat is private in 26.2 and Gui.getChat() is gone, so the previous
direct-field access does not compile. Player.displayClientMessage is a
public, stable API for client-side chat output, so push everything
through it. When the player is null (e.g. on the title screen before
join, where the auto-connect "Connected to ..." line lands), fall back
to the logger so the message is not silently dropped.
In 26.2 Mojang dropped the getChat() wrapper on Gui in favour of the
public 'chat' field, and com.mojang.authlib.GameProfile is now a record
so its getter is name() rather than getName(). Reflect both changes in
the IRC chat dispatcher.
Starting with 26.1 Mojang ships Minecraft unobfuscated, and Yarn /
Intermediary are no longer published past 1.21.11. Loom does not need
a mappings dependency in that mode: the Mojang-named source compiles
directly. Remove the mappings line, drop the yarn_mappings property,
revert the client entrypoint to Mojang names (Minecraft, Component,
ChatFormatting, gui.getChat(), getUser().getName()), and rewrite the
README note so it stops claiming Mojang mappings via Loom.
Loom rejected officialMojangMappings() with a non-obfuscated
environment error, and Mojang client_mappings are not published for
26.2 yet. Pin Yarn at 26.2+build.3 via the new yarn_mappings property
and rewrite the client entrypoint with Yarn names: MinecraftClient,
Text, Formatting, inGameHud.getChatHud(), getSession().getUsername().
Auto-connect on CLIENT_STARTED, .irc reconnect and .irc <msg> all used
to open a TCP socket on the render thread with a 5s connect timeout,
freezing client startup and chat input when the server was unreachable.
Dispatch those paths through a single daemon executor instead, and
release the socket plus the executor on CLIENT_STOPPING.