Skip to content

chore: move trunk to main and merge upstream history - #35

Merged
TheMeinerLP merged 47 commits into
mainfrom
chore/sync-upstream-history
Oct 10, 2026
Merged

TheMeinerLP merged 47 commits into
mainfrom
chore/sync-upstream-history

Conversation

@TheMeinerLP

Copy link
Copy Markdown
Collaborator

Brings develop into main and adds the upstream goPaint_1.14 history (44 commits, merged from upstream/master). The tree is identical to develop (git diff origin/develop HEAD is empty); all upstream conflicts were resolved to the fork's version.

This PR MUST be merged with a merge commit, NOT squashed, otherwise the history is lost.

https://claude.ai/code/session_01JavEedb4MyR9NehY3HusTn

MrRockis and others added 30 commits June 27, 2024 21:33
Removes the NmsManager checks for goPaint tool interaction
Fixes the error on 1.20.5/6 servers
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Refactor createHead method to use PlayerProfile and PlayerTextures for player head creation.
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…iax-Development#138)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate Bot and others added 17 commits February 1, 2026 15:00
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…ent#154)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…pment#155)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
… quality (#34)

* feat!: support Minecraft 26.1 and 26.2 on Java 25

Compile against Paper API 26.2 and FastAsyncWorldEdit 2.16.1 with Gradle 9.8 and Java 25.
Versions move into one catalog, shadow/plugin-yml/run-paper/hangar/spotless use their current
coordinates, and build-logic, ServerLib, paperlib and EldoNexus publishing are dropped.
Translations use MiniMessageTranslationStore because Adventure removed TranslationRegistry;
extra language files in lang/ now fall back to the bundled English bundle.
run-<version> tasks start Paper with FastAsyncWorldEdit installed.

BREAKING CHANGE: requires Paper 26.1.1 or newer and Java 25. Servers on 1.21 stay on 1.1.x.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* test: add unit tests for brushes, curves and translations

JUnit 6, AssertJ and Mockito with JaCoCo reports. Covers brush cycling and lookup,
the Paint Brush curve and translation key completeness.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* ci: adopt release please, commit linting and security scans

Mirror the AntiRedstoneClock-Remastered pipeline: pr-lint, multi-OS PR builds on Java 25,
Release Please on main with a Trivy gate before Hangar/Modrinth publishing and an SBOM upload,
weekly Trivy scan, shared Renovate presets and new issue forms. Snapshot publishing on every push
and release-drafter are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: restructure documentation along diataxis

Tutorial, how-to guides, reference pages for brushes, commands, permissions, configuration
and supported versions, background pages and developer guides, published through GitBook.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: add openspec with the modernisation roadmap

OpenSpec changes for the four delivered parts (platform upgrade, release pipeline, tests,
documentation) and the planned follow-ups: cloud commands, brush menu hardening, non-blocking
update check and dependency injection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* fix: check for updates without blocking server start

The first update check ran on the main thread during onEnable. It now runs from an async
timer with connect and request timeouts, logs failures at debug level, tells the console once per
new version and players only on join. generic.check-for-updates turns it off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* feat!: rebuild /gopaint on cloud with brigadier and translated messages

One command tree /gopaint (aliases /gp, /bgp) through cloud's PaperCommandManager with
per-subcommand permissions, a generated help, range-checked and tab-completed sizes and messages
from the translation bundle. The Bukkit Command subclass and the separate reload command are gone.

BREAKING CHANGE: /gopaint reload needs bettergopaint.command.admin.reload (granted by the
bettergopaint.admin bundle); every subcommand needs its own bettergopaint.command.* node, which
defaults to true.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* fix: identify brush menus by holder and store exported brushes in item data

The menu and the brush picker are recognised by their InventoryHolder instead of the title,
so foreign inventories with the same title are no longer hijacked. Menu text comes from the
translation bundle, rendered for the player's locale. Exported brushes are stored as versioned
data under bettergopaint:brush; renamed or edited items keep working and 1.x items are converted on
first use without ever throwing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* fix: honour config.yml again and wire the plugin with guice

Settings no longer extend FAWE's Config, which on Paper 26 could not set the plugin's fields
and ignored every value in config.yml. They are now immutable records behind SettingsHolder,
read by a small YAML loader that writes every key back with its comment, replaces invalid values
with their default and swaps the snapshot atomically on reload.

Listeners, commands and services receive narrow dependencies through Guice modules instead of the
plugin instance. Guice, jakarta.inject and aopalliance are shaded and relocated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: archive the implemented openspec changes

All eight changes are implemented. Their delta specs are merged into openspec/specs/; the steps
that need a game client, GitHub repository settings or GitBook access are listed as manual
follow-ups in the archived task lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: add the server admin guide

A setup tutorial for admins, how-to guides for upgrading from 1.x, limiting builders,
applying config changes, turning off update notices and reporting bugs, reference pages for
console messages and files, and background on how settings are loaded and why 2.x needs Paper 26.
ReferenceDocsTest fails the build when config keys, defaults, permissions, commands, supported
versions or the navigation drift from the code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: plan native worldedit brushes and folia readiness

Two OpenSpec changes: brushes compute on WorldEdit extents instead of the Bukkit world, which
also makes strokes thread-safe, and scheduling plus shared state become Folia-ready while the Folia
flag stays off until FastAsyncWorldEdit supports it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* refactor: add stroke context, mask and in-memory extent for native brushes

Add an immutable StrokeContext that is captured on the player's thread, a
factory that converts the brush settings to WorldEdit types without asking
the world for anything, a WorldEdit mask for the BetterGoPaint mask and a
runner that executes a stroke in the player's WorldEdit session.

Tests get a map-backed MemoryExtent and mock block types, because the
WorldEdit block registry cannot initialise without a server.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* refactor: read and write brush strokes through worldedit extents only

Brushes now compute their blocks from a StrokeContext and an Extent. The
geometry helpers (Sphere, Height, Surface, ConnectedBlocks) and the
Bezier curve use BlockVector3 and Vector3, so no Bukkit world, block or
location call remains in objects/ and utils/. InteractListener captures
the context on the player's thread and queues a WorldEdit Brush that runs
in the player's edit session with its global mask and one history entry.

Brushes read all positions before they write, which keeps the result the
same as when the Bukkit world was read.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: describe the native worldedit stroke and record design deviations

Explain the stroke context, the player's WorldEdit session and //gmask in
the stroke explanation, document how brushes are tested without a server
and note where the implementation differs from the design decisions.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* fix: schedule update check on paper's async scheduler

The legacy BukkitScheduler is not available on Folia. Run the update
check with Bukkit.getAsyncScheduler().runAtFixedRate and cancel the
returned ScheduledTask on shutdown.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* refactor: make per-player brush state thread-safe

PlayerBrushManager keeps its per-player brushes in a ConcurrentHashMap
and takes a brush factory so the concurrency behaviour can be tested
without a server.

The Paint Brush stroke points move from a static map into the brush
instance and are dropped with the player's brush state on quit.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* build: drive foliaSupported from a gradle property

paper-plugin.yml declares folia-supported only when -PfoliaSupported=true
is passed. Without it the flag stays false, so release builds cannot
declare Folia support by accident.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* build: add run-folia tasks with a configurable fawe url

run-folia-<version> starts a local Folia test server with run-paper's
Folia downloads. It installs FastAsyncWorldEdit from -PfoliaFaweUrl.
Without that property the task fails when it runs, with a message that
names the property, so normal builds are unaffected.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: state folia status and how to test on folia

Scope and non-goals now says BetterGoPaint is prepared for Folia but
does not declare support until a stable FastAsyncWorldEdit release
supports it. Supported versions links to that page, and the testing
guide describes run-folia-<version> for local testing only.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* build: refuse run-folia without the folia flag

Without -PfoliaSupported=true the test server starts but Folia skips BetterGoPaint, which looks
like a broken setup. The task now fails early and names both required properties.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

* docs: archive native worldedit brushes and folia readiness

Both changes are implemented; their specs move to openspec/specs/. In-game checks with a client
and a Folia test with a FAWE fork remain listed as manual follow-ups.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLYZtULzHeMRpNygcFFWgp

---------

Co-authored-by: Claude <noreply@anthropic.com>
Adds the 44 upstream commits to the fork history. All conflicts were
resolved to the fork's version because upstream's fixes (head/skull
handling, ServerLib removal, NMS check removal, dependency bumps) are
already covered differently on develop. The tree is identical to develop.

Claude-Session: https://claude.ai/code/session_01JavEedb4MyR9NehY3HusTn
@github-actions

Copy link
Copy Markdown

Unit Test Results

 23 files   23 suites   12s ⏱️
118 tests 118 ✅ 0 💤 0 ❌
119 runs  119 ✅ 0 💤 0 ❌

Results for commit adb4049.

@TheMeinerLP
TheMeinerLP merged commit 016c013 into main Oct 10, 2026
7 of 8 checks passed
@TheMeinerLP
TheMeinerLP deleted the chore/sync-upstream-history branch October 10, 2026 11:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants