▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/Emage
Emage

Emage

A Minecraft plugin that displays images and GIFs on item frames.

269
2
Все версииEmage 1.3.1

Emage 1.3.1

Release1 мес. назад

Список изменений

Better Color Accuracy on Modern Servers

The color matching system now detects your server version and uses the full map color palette available on Minecraft 1.17+. Previously, the palette was capped at 220 colors regardless of version. Servers on 1.17 or newer will now use up to 236 colors, which means slightly more accurate color reproduction - especially for browns, dark reds, and similar tones that were added in newer versions. Older servers continue to work as before.

Lower Default Performance Settings

The default configuration has been tuned down to be more conservative out of the box. This should result in less bandwidth usage and fewer lag spikes on typical servers without any manual tweaking.

  • Max FPS default lowered from 60 to 30. The old recommendation of "values above 60 are NOT recommended" has been tightened - values above 30 are now discouraged.
  • Max render distance default lowered from 64 to 32 blocks.
  • Max packets per tick default lowered from 60 to 32.
  • Max redirects default changed from 1 to 5, which better matches the actual code behavior and avoids issues with URLs that redirect multiple times (e.g., image hosting services).

If you've already customized these values in your config, your settings won't change - these only affect new installs or newly generated config entries.

Smarter Animation Tick Rate

The GIF animation renderer previously ticked every single server tick (every 50ms). It now ticks every other tick and also respects the configured FPS limit and adaptive update interval directly inside the tick loop. Before, the FPS setting only affected packet sending - now it also skips unnecessary frame calculations entirely. This means less CPU work when animations don't need to update that frequently.

A global packet budget has also been added on top of the per-player budget to prevent total packet output from scaling linearly with player count. The distance check now also handles null worlds safely to avoid potential errors.

Reusing Existing Maps

When you apply a new image or GIF to an item frame that already has a map in it, Emage now reuses that existing map ID instead of always creating a brand new one. This prevents map ID "leaks" where repeatedly re-applying images to the same frames would consume new map IDs each time.

GIF Memory Safety

Large GIFs could previously consume unbounded memory during decoding. The GIF reader now tracks how much decoded pixel data it has produced and stops reading frames if it exceeds the configured memory limit (memory.max-usage-mb). It also rejects GIFs with canvas dimensions larger than 4096×4096 before attempting to decode them. If a GIF is truncated due to memory limits, a warning is logged with the frame number where it stopped.

Configurable Cache at Runtime

The GIF cache (max entries, max memory, expiration time) was previously hardcoded. These values are now read from your config and applied on startup. Running /emage reload also updates the cache settings live - previously a reload would update the config object but the cache itself kept using its original hardcoded limits.

Safer Image Downloads

The image download system has been reworked to pull its limits (timeouts, max file size, redirect count, internal URL blocking) from the config rather than using hardcoded constants. This means changes to the downloads section of your config now actually take effect.

Additionally, the SSRF protection (blocking requests to internal networks) now also checks for IPv6-mapped IPv4 addresses. Previously, an attacker could potentially bypass the internal URL block by using an IPv6-mapped address like ::ffff:127.0.0.1. The internal URL blocking can also now be toggled off via downloads.block-internal-urls if your setup requires accessing local resources.

Static image downloads now go through the same secured download pipeline (with size limits, SSRF checks, and timeouts) as GIF downloads. Previously, static images were fetched with ImageIO.read(url) directly, which bypassed all of these protections.

bStats Metrics

The plugin now reports anonymous usage statistics via bStats. This includes things like how many maps and animations are active, whether animations are in use, the configured dither quality, and whether adaptive performance is enabled. This helps the developer understand how the plugin is being used. No personal or server-identifying data is collected.

Better Config Validation

All config values are now clamped to sensible minimums after loading. For example, FPS can't go below 1, render distance can't go below 8, download size can't go below 1MB, and so on. Previously, setting a value to 0 or a negative number in the config could cause division-by-zero errors or other unexpected behavior.

Safer Cleanup

Running /emage cleanup now properly removes map renderers from the server when deleting unused files. Before, the files were deleted and the internal tracking was cleared, but the actual map renderers (especially GIF renderers) were left attached to their MapView objects, potentially causing errors or orphaned animations.

Other Changes

  • The transparent pixel index for Fast and Balanced dithering modes was changed from 4 to 0. This fixes how fully transparent pixels are represented in the map data.
  • Thread-local buffers used during dithering are now lazily allocated instead of eagerly created, reducing memory footprint when processing threads are idle.
  • Thread-local buffers are explicitly cleaned up during shutdown to prevent potential memory leaks in environments that reuse classloaders.
  • The mapInitTaskScheduled flag in the map manager now uses AtomicBoolean with compareAndSet instead of a plain volatile boolean, fixing a potential race condition where multiple map init tasks could be scheduled simultaneously.
  • The pending save logic for static and animation grids now correctly handles the case where a save is already in progress and new data arrives - it creates a fresh pending entry instead of trying to add to one that's mid-save.
  • URL validation in the command now explicitly checks that the scheme is http or https before proceeding, rather than just checking if the URI parses successfully. This prevents file:// or other unexpected schemes from reaching the download code.
  • Shutdown order changed: the manager now shuts down before the processing executor, ensuring pending saves complete before the thread pool is terminated.
  • The render method in GifRenderer no longer checks the needsRender flag - it just compares frame indices. This simplifies the logic and avoids an edge case where a frame could be skipped.
  • Added removeByMapId and removeMap methods for cleaner programmatic removal of maps and their associated renderers.
  • The palette data in EmageColors was extended with additional color entries at the end of the table for 1.17+ support.
  • Legacy animation decompression now handles more edge cases, including data that was stored as a single static frame in the EM format.

Файлы

Emage-1.3.1.jar(129.83 KiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.3.1

Загрузчики

Bukkit
Paper
Purpur
Spigot

Версии игры

1.18–1.21.11

Загрузок

13

Дата публикации

1 мес. назад

Загрузил

ID версии

Главная