Releases: MrNickax/eco-folia
Releases · MrNickax/eco-folia
Release list
v2026.29.5-folia
fix(drops): resolve telekinesis when the collated queue is pushed, re…
v2026.29.4-folia
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
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
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
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
chore: adopt upstream CalVer versioning — 2026.29-folia
v7.6.8-folia
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
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
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
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.