Skip to content

Releases: MrNickax/eco-folia

v2026.29.5-folia

Choose a tag to compare

@github-actions github-actions released this 28 Aug 20:14
fix(drops): resolve telekinesis when the collated queue is pushed, re…

v2026.29.4-folia

Choose a tag to compare

@github-actions github-actions released this 02 Aug 21:40
fix(folia): spawn drops on the region that owns the drop location

EcoDropQueue.push() spawned item entities and the XP orb inline, on
whatever thread pushed the queue. CollatedRunnable pushes on the
player's region thread, but the drop location is arbitrary and often
belongs to a different region, so every drop for a location outside the
player's region failed the tick thread check ("Cannot add entity async")
and was lost.

Entity spawning is now dispatched to the region that owns the drop
location. Inventory, mending and XP still run on the player's thread, so
telekinesis semantics are unchanged; only the spawning moves. The
common case (drops at the player) is still spawned inline via an
ownership check, so no tick of latency is added there.

Release 2026.29.4-folia.

v2026.29.3-folia

Choose a tag to compare

@github-actions github-actions released this 29 Jul 00:34
Theme lang.yml with the Hystic palette and release 2026.29.3-folia

Rewrites the two player-facing strings in lang.yml:

- multiple-in-craft is item lore, not chat, so it drops the decorative
  "&l&c!" glyph and becomes a label/value pair in body + highlight.
- The example price-display entry now renders the value in highlight
  instead of legacy yellow.

Config comments, keys and placeholders are untouched.

v2026.29.2-folia

Choose a tag to compare

@github-actions github-actions released this 22 Jul 09:48
fix(build): shade caffeine into the jar to match its relocation

The 2026.29 sync took upstream's caffeine relocation (com.willfp.eco.libs.caffeine)
but kept the dependency as compileOnly, so the relocated classes were never
bundled and eco failed to load with NoClassDefFoundError on
com/willfp/eco/libs/caffeine/cache/Cache. Switch caffeine to implementation
so shadowJar shades it, matching upstream #532.

Release 2026.29.2-folia.

v2026.29.1-folia

Choose a tag to compare

@github-actions github-actions released this 21 Jul 19:03
fix(folia): run anvil merge on the player's region scheduler

The anvil result computation touches the anvil inventory and the player's
view, so it must run on the player's region, not the global scheduler.
Release 2026.29.1-folia.

v2026.29-folia

Choose a tag to compare

@github-actions github-actions released this 21 Jul 18:01
chore: adopt upstream CalVer versioning — 2026.29-folia

v7.6.8-folia

Choose a tag to compare

@github-actions github-actions released this 21 Jul 17:34
merge: upstream Auxilor/eco 2026.29 sync into master

Full resync to upstream 2026.29 with the Folia layer preserved and new
upstream features (workstation recipes) adapted to region/entity schedulers.
Release 7.6.8-folia.

v7.6.7-folia

Choose a tag to compare

@github-actions github-actions released this 17 Jul 18:42
chore: bump to 7.6.7-folia to publish the console-dispatch fix

The 31502400 push triggered a build against an already-published 7.6.6
version, which 409'd. Bump so the on:push workflow republishes cleanly and
the ConfigSlot global-region console dispatch lands in Packages.

v7.6.6-folia

Choose a tag to compare

@github-actions github-actions released this 16 Jul 21:34
fix: stop reading the open container from the netty thread in Display

Display#display reads the player's open container (getOpenInventory, and
GUIDetectionManager#hasGUIOpen via the player's rendered inventory) to work out
the inInventory and inGui properties. It runs on the player's netty event loop,
which does not own the player, so both reads are thread check violations and
race against the region thread mutating the container.

It can't hop to the player's scheduler to read them, as it has to return the
displayed item synchronously to the packet write, and it must not block the
event loop waiting either. So the thread that owns the player now takes the
readings and publishes them, and the netty thread reads the last published
values and queues the next reading. Callers that already own the player keep
reading it live, as they did before.

The properties are now up to a tick stale on the netty path. They already
document themselves as approximate, and the reads they replace were racing with
the region thread anyway.

v7.6.5-folia

Choose a tag to compare

@github-actions github-actions released this 16 Jul 16:01
fix: run per-player work on the owning region thread

Several code paths did per-player work from a thread that does not own the
player, which Folia rejects with a thread check ("Cannot add entity off-main
thread") and which can corrupt region bookkeeping:

- CollatedRunnable flushed collated drops on the RegionScheduler of the DROP
  LOCATION and then read and mutated the player (location, inventory, XP,
  mending) from that foreign region thread. Dispatch to the player's
  EntityScheduler instead; the drop location is the block the player broke, so
  it stays within the player's own region.
- StackedRecipeListener re-ran the crafting-matrix mutation on the
  GlobalRegionScheduler. Use the clicking player's EntityScheduler.
- CraftingRecipeListener re-read the crafting matrix a tick later on the
  GlobalRegionScheduler. Use the viewing player's EntityScheduler.
- MultiverseInventoriesIntegration read the armor inventory of a player who is
  mid-teleport between worlds on the GlobalRegionScheduler, mirroring what
  ArmorChangeEventListeners already does correctly.
- ProfileLoadListener read getDisplayName() on the GlobalRegionScheduler after
  join, mirroring what PlayerHealthPatch already does correctly.
- GUIListener deferred menu deregistration to the GlobalRegionScheduler. Use
  the player's EntityScheduler, and unregister on retirement too: a
  RenderedInventory strongly references the inventory it is weakly keyed under,
  so skipping the removal would leak the entry.

Also make the shared state these paths touch safe for concurrent region
threads. The collated drop map now claims its value with an atomic remove()
before scheduling, made exclusive against the merge in push() by switching that
to compute(), so drops can no longer be lost or appended to a list the flush
task is iterating. The menu registry and the force-rendered map were a bare
WeakHashMap and LinkedHashMap written from every player's region thread.

Bump version to 7.6.5-folia.