---
layout: doc
---

# v1.3.0

- Download:
    - [GitHub](https://github.com/m1sk9/LunaticChat/releases/tag/paper/v1.3.0)
    - [Modrinth](https://modrinth.com/plugin/lunaticchat/version/1.3.0)

## New Features

- Added support for Paper 26.2 (Minecraft 26.2)
  - Support for Paper 26.1 has ended at the same time.
  - Paper 26.2 bundles Adventure 5.2.0, which is not binary compatible with 26.1.
  - Builds from v1.3.0 onward therefore no longer run on Paper 26.1.
- `/tell <player>@<server>` can now message a player on a server connected through Velocity
  - Disabled by default.
  - Enable it with `features.velocityIntegration.crossServerDirectMessage`.
- Raised the protocol version to `1.0.1`.
  - Paper and Velocity can be updated in either order.
  - Cross-server direct messages do, however, require both sides to be updated.

## Improvements

- A failed player data save no longer aborts the remaining shutdown steps, so channel logs and the Velocity connection are always closed.
- File persistence has been consolidated behind a single storage layer.
  - As a result, a crash or a concurrent save can no longer leave a file in a half-written state.
- Each player's messages are now delivered in the order they were sent.
  - Work still queued when a player disconnects is discarded rather than delivered to a player who has already logged out.
- Direct message delivery and channel message logging no longer run on the tick thread.
- Cached romaji conversion results no longer wait for a permit from the shared API concurrency limiter.
  - Previously, even a message whose every word was already cached could exhaust its conversion budget waiting for a permit it did not need, and be sent unconverted.
- The words in a message are now converted concurrently.
- Player settings are only rewritten when something has changed.
  - Previously, every player quit re-serialized every player stored in the file, even when the bytes were identical.
- When a player quits without an active channel, clearing their active channel no longer takes a snapshot of the channel caches.
  - Previously, a mass disconnect produced one full snapshot per disconnecting player within a single tick.
- Spy notification for direct messages and channel messages no longer builds its translation lookup and member set when no recipient is online.
- Channel data writes are now batched instead of rewriting the whole file on every change.
- Performed internal cleanup.

## Changes

- `config.yml` is now read with KAML, which changes how a broken file is treated.
  - An unreadable configuration file no longer disables the plugin; it starts on its default settings instead.
  - When a single value cannot be read, the other settings in the file are no longer all discarded: only that value falls back to its default, with a warning.
- Per-player delivery queues are now bounded.
  - A player who sends faster than delivery drains is refused with a warning, rather than building an unbounded backlog that arrives all at once minutes later.

## Bug Fixes

- Fixed the player argument of `/tell` matching partially
  - This came from the switch away from the old Bukkit API.
- Fixed `features.channelChat.messageLogging` never actually being read and falling back to its default values
  - The loading was never implemented despite being documented, so it stayed at its defaults regardless of what the file said.
- Fixed a slow Google IME reply silently stopping every subsequent message delivery for that player's session
- Fixed a single conversion timeout permanently pinning a word to its hiragana form
- Fixed `/reply` not recognizing a reply target that had just been recorded
- Fixed reply target entries that had already been cleared on disconnect being recorded again
