diff --git a/.claude/skills/sync-docs-after-overhaul/SKILL.md b/.claude/skills/sync-docs-after-overhaul/SKILL.md index 02e91d6e1..67c161933 100644 --- a/.claude/skills/sync-docs-after-overhaul/SKILL.md +++ b/.claude/skills/sync-docs-after-overhaul/SKILL.md @@ -1,6 +1,6 @@ --- name: sync-docs-after-overhaul -description: Bring KDoc comments and the markdown guides under Archie/docs/ back in sync after a significant refactor or architecture overhaul in this repo (renamed classes, restructured hierarchies, new/removed APIs, changed method signatures). Use this whenever the user says they "overhauled", "refactored", "restructured", or "rewrote" a system and asks to update docs, or whenever you notice staged/unstaged changes that rename or gut core classes in an area that has a doc guide (config, events, gui, networking, registries, resource-packs, serialization, transfer). Don't reach for this for a small fix or single-file change — it's for the case where the shape of a system changed enough that existing docs now describe something that no longer exists. +description: Bring KDoc comments and the markdown guides under docs/ back in sync after a significant refactor or architecture overhaul in this repo (renamed classes, restructured hierarchies, new/removed APIs, changed method signatures). Use this whenever the user says they "overhauled", "refactored", "restructured", or "rewrote" a system and asks to update docs, or whenever you notice staged/unstaged changes that rename or gut core classes in an area that has a doc guide (config, events, gui, networking, registries, resource-packs, serialization, transfer). Don't reach for this for a small fix or single-file change — it's for the case where the shape of a system changed enough that existing docs now describe something that no longer exists. --- # Sync docs after an overhaul @@ -35,19 +35,19 @@ critically, the same as an external markdown guide. Check all of these, not just the obvious one: -- **The dedicated markdown guide**, if this feature area has one — `Archie/docs/config.md`, +- **The dedicated markdown guide**, if this feature area has one — `docs/config.md`, `events.md`, `gui.md`, `networking.md`, `registries.md`, `resource-packs.md`, - `serialization.md`, `transfer.md`. Find it with `ls Archie/docs/`; don't guess a name. -- **`Archie/docs/index.md`**, which has a one-line feature-overview table entry per area — usually + `serialization.md`, `transfer.md`. Find it with `ls docs/`; don't guess a name. +- **`docs/index.md`**, which has a one-line feature-overview table entry per area — usually just needs a phrase added/adjusted, rarely a rewrite. - **Class- and member-level KDoc** in the overhauled files themselves, *and* in any other file that references the overhauled types (grep for the old and new type names across - `Archie/common/src/main/kotlin` and the loader modules to catch call sites whose doc comments - now describe stale behavior). + `core/common/src/main/kotlin` and the loader/datagen/gametest/test modules to catch call sites + whose doc comments now describe stale behavior). - **Grep the whole repo for old names** (`grep -rn OldClassName`) to catch stragglers a targeted read would miss — renames especially leave orphaned references in comments that don't affect compilation and so never surface as errors. -- **README.md / AGENTS.md** — usually just point at `Archie/docs/`, so low priority, but check if +- **README.md / AGENTS.md** — usually just point at `docs/`, so low priority, but check if either names a specific API that changed. - **Archie-Test** — the dev-playground module sometimes demonstrates a feature area directly; check whether it does before ruling it out. @@ -82,7 +82,7 @@ rest of the file, mismatched brackets in a code fence, etc. After editing source for markdown-only edits), run the relevant compile task, e.g.: ``` -./gradlew :Archie:common:compileKotlin -q +./gradlew :archie-core-common:compileKotlin -q ``` Treat a clean compile as confirmation the edits are syntactically sound — it says nothing about diff --git a/.github/scripts/generate_release_notes.py b/.github/scripts/generate_release_notes.py index 26cc2fe05..413e1b2d6 100644 --- a/.github/scripts/generate_release_notes.py +++ b/.github/scripts/generate_release_notes.py @@ -13,7 +13,7 @@ - Post-tag (.github/workflows/release-notes.yaml): --new-tag is a real, already-pushed tag; used as both the git ref to end the walk at and the version display string. Writes both the changelog section and a news post. - - Pre-publish (Archie/build.gradle.kts's `generateChangelog` task): the tag doesn't exist yet at + - Pre-publish (build.gradle.kts's `generateChangelog` task): the tag doesn't exist yet at this point, so pass --new-tag as the *intended* version (e.g. `v1.2.0`, not yet a real ref) together with --range-end HEAD (or another real ref) to walk up to. Only pass --changelog-path, not --posts-dir, in this mode - modpublisher's `changelog = file(...)` needs CHANGELOG.md diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 6e2082fc9..d3bdef1f5 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -24,6 +24,7 @@ jobs: fail-fast: false matrix: loader: [fabric, neoforge] + side: [server, client] runs-on: ubuntu-latest timeout-minutes: 40 env: @@ -63,30 +64,30 @@ jobs: env: GITHUB_ACTOR: ${{ github.actor }} GITHUB_TOKEN: ${{ github.token }} - run: xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" ./gradlew check --console=plain -Darchie.junit.gametest.matrix=${{ matrix.loader }}:server,${{ matrix.loader }}:client + run: xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" ./gradlew check --console=plain -Darchie.junit.gametest.matrix=${{ matrix.loader }}:${{ matrix.side }} - name: Publish test report if: success() || failure() uses: mikepenz/action-junit-report@v6 with: - check_name: JUnit Test Report (${{ matrix.loader }}) - # Matrix expansion names this job "check (fabric)"/"check (neoforge)", not just "check" - - # without this, the action's default job_name (the raw job id "check") doesn't match any - # actual check-run on this commit, and its annotations silently land on an unrelated job - # (observed: the docs workflow's job) instead of failing loudly. - job_name: check (${{ matrix.loader }}) + check_name: JUnit Test Report (${{ matrix.loader }}, ${{ matrix.side }}) + job_name: check (${{ matrix.loader }}, ${{ matrix.side }}) report_paths: '**/build/test-results/test/TEST-*.xml' - name: Upload test reports if: always() uses: actions/upload-artifact@v7 with: - name: test-reports-${{ matrix.loader }} + name: test-reports-${{ matrix.loader }}-${{ matrix.side }} path: | - Archie/**/build/reports/tests/** - Archie/**/build/tmp/junit-gametest-runner/** - Archie-Test/**/build/reports/tests/** - Archie-Test/**/build/tmp/junit-gametest-runner/** + core/**/build/reports/tests/** + core/**/build/tmp/junit-gametest-runner/** + datagen/**/build/reports/tests/** + datagen/**/build/tmp/junit-gametest-runner/** + gametest/**/build/reports/tests/** + gametest/**/build/tmp/junit-gametest-runner/** + test/**/build/reports/tests/** + test/**/build/tmp/junit-gametest-runner/** build/reports/problems/** if-no-files-found: ignore retention-days: 7 diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index dd64c5efb..23287d943 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -31,7 +31,7 @@ jobs: - uses: actions/cache@v6 with: key: mkdocs-material-${{ env.cache_id }} - path: Archie/.cache + path: .cache restore-keys: | mkdocs-material- - run: sudo apt-get update && sudo apt-get install -y pngquant @@ -39,6 +39,5 @@ jobs: - run: git fetch origin gh-pages --depth=1 - name: Build Documentation run: ./gradlew publishDocs - working-directory: Archie env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-notes.yaml b/.github/workflows/release-notes.yaml index d8274e022..ab112e090 100644 --- a/.github/workflows/release-notes.yaml +++ b/.github/workflows/release-notes.yaml @@ -1,6 +1,6 @@ name: release-notes -# Generates Archie/CHANGELOG.md and a dated Archie/docs/news/posts/ blog entry for a tagged +# Generates CHANGELOG.md and a dated docs/news/posts/ blog entry for a tagged # release, then opens a PR with both. See .github/scripts/generate_release_notes.py for how # entries are sourced (merged PR titles, parsed for a Conventional Commits prefix) and # .github/workflows/pr-title-lint.yml for how those titles are kept in that shape. @@ -54,14 +54,14 @@ jobs: python .github/scripts/generate_release_notes.py \ --repo "${{ github.repository }}" \ --new-tag "${{ github.ref_name }}" \ - --changelog-path Archie/CHANGELOG.md \ - --posts-dir Archie/docs/news/posts + --changelog-path CHANGELOG.md \ + --posts-dir docs/news/posts - name: Open pull request env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - if git diff --quiet -- Archie/CHANGELOG.md Archie/docs/news/posts; then + if git diff --quiet -- CHANGELOG.md docs/news/posts; then echo "Nothing new to record since the previous tag - skipping PR." exit 0 fi @@ -71,7 +71,7 @@ jobs: BRANCH_NAME="release-notes/${{ github.ref_name }}" git checkout -b "$BRANCH_NAME" - git add Archie/CHANGELOG.md Archie/docs/news/posts + git add CHANGELOG.md docs/news/posts git commit -m "docs: release notes for ${{ github.ref_name }}" git push origin "$BRANCH_NAME" diff --git a/.gitignore b/.gitignore index d161eef74..c9497c7ef 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ local.properties docs/api site .architectury-transformer +.kotlin */.kotlin __pycache__/ *.pyc diff --git a/AGENTS.md b/AGENTS.md index 7da1aa989..68ed9a210 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,75 +1,123 @@ # AGENTS Guide for Archie ## Repository shape -- The repo root is a Gradle **composite build** (`settings.gradle.kts`) that includes two independent - builds: `Archie/` (the library — this is what's published) and `Archie-Test/` (a playground mod that - substitutes in `Archie`'s project sources, used to exercise the library during development). Run all - Gradle commands from inside `Archie/` or `Archie-Test/`, not the repo root. -- Inside `Archie/`: multi-module Architectury mod: `common` (shared API/logic), `fabric`, `neoforge` - (`Archie/settings.gradle.kts`). +- The repo root is a single Gradle build (`settings.gradle.kts`) on Architectury Loom, with four + products, each nested `/` and flattened to a single-level project name + (e.g. `core/fabric` -> `archie-core-fabric`): `core` (the library, published), `datagen` + (Archie's datagen DSL, own separate mod `archie_datagen`, dev-time only), `gametest` (Archie's + GameTest framework/harness, own separate mod `archie_gametest`, dev/test-time only), `test` (a + playground mod `archie_test` that depends on the other three via plain project references, used + to exercise the library during development). Run all Gradle commands from the repo root. +- Each product's own layout: `common` (shared API/logic), `fabric`, `neoforge` + (`settings.gradle.kts`'s `includeCorePlatform`/`includeModule` helpers). - `common` is the source of truth; loader modules mostly provide bootstrapping, loader deps, and `actual` implementations. -- Main entrypoint flow is `Archie.init()` -> register events/network/config/datagen/gametest gates (`Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt`). +- Main entrypoint flow is `Archie.init()` -> register events/network/config, then activate + datagen/gametest via a `ServiceLoader`-based `ArchieExtension` hook (`net.kernelpanicsoft.archie. + ArchieExtension`, `core/common/.../ArchieExtension.kt`) if `archie-datagen`/`archie-gametest` are + present on the classpath - `core` never has a compile-time dependency on either + (`core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt`). +- `core` never depends on `datagen`/`gametest`, even for things the datagen DSL also touches: + condition/ingredient registration and common tags run at runtime (`Archie.kt` calls + `ABuiltinConditions.init()`/`ABuiltinIngredients.init()`/`ACommonTags.init()` directly), so they + live in `core`; only the datagen-only half of each (e.g. `ADatagenConditionsPlatform`'s + `withCondition`/`fabricRecipeProvider`, which reference the datagen-only `ARecipeProvider` type) + lives in `datagen`. ## Architecture patterns to preserve - Cross-loader abstractions use Kotlin `expect/actual` files named `*.common.kt`, `*.fabric.kt`, `*.neoforge.kt` (example: `APlatform`, `ADataGeneratorPlatform`, `AGameTestPlatform`). - Loader entrypoints must only delegate into common init methods: - - Fabric: `ArchieFabric.onInitialize*` (`Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt`) - - NeoForge: bus listeners in `ArchieNeoForge` (`Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt`) -- Networking is centralized via `NetworkChannel`; packets must be `@Serializable data class` and registered before `register()` (`Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt`). + - Fabric: `ArchieFabric.onInitialize*` (`core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt`) + - NeoForge: bus listeners in `ArchieNeoForge` (`core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt`) +- Networking is centralized via `NetworkChannel`; packets must be `@Serializable data class` and registered before `register()` (`core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt`). - `ArchieNetworkChannel.init()` is the canonical registration order example (register packet producers/consumers, then call `register()`). ## Build and run workflows -All commands below are run from inside `Archie/` (`cd Archie` first). -- Build all modules + merged artifact: `./gradlew build` (`build`/`assemble` finalize with `fusejars` in `Archie/build.gradle.kts`). -- Loader-specific dev runs: `./gradlew fabric:runClient`, `./gradlew neoforge:runClient`. -- Datagen runs are explicit tasks: `./gradlew fabric:runDatagen` / `./gradlew neoforge:runDatagen`. -- GameTest runs: `./gradlew fabric:runGametest` / `./gradlew neoforge:runGametest` (server-side suite), - `./gradlew fabric:runGametestClient` / `./gradlew neoforge:runGametestClient` (client GUI harness suite). -- Docs pipeline: `embedDokkaIntoMkDocs` then `publishDocs` (calls `mike deploy ...`); `Archie/mkdocs.yml` +All commands below are run from the repo root. +- Build everything: `./gradlew build`. +- **Never use `mod*` configurations (`modApi`/`modImplementation`/`modCompileOnly`/etc.) on a + `project(...)` reference between archie-core/-datagen/-gametest/-test** - `mod*` marks a + dependency as needing Loom's intermediary<->named *remapping*, and for a project reference that + makes Loom eagerly read that project's own output jar during *configuration* (before any task + has run), which reliably breaks the very first build on a clean checkout with "Failed to setup + Minecraft ... NoSuchFileException: .../build/libs/archie-x-*.jar". None of these cross-product + dependencies need remapping at all - every product's fabric target is already namespace-symmetric + with every other product's fabric target (same for neoforge, same for common). Use plain + `api(project(":archie-x-y", "namedElements"))` instead (the explicit `"namedElements"` target + matters - it's what makes the Architectury Transformer's own classpath resolve the target + project's classes correctly; a bare `api(project(":archie-x-y"))` with no target reintroduces the + `transformProductionFabric`/`transformProductionNeoForge` "Type ... not present" failure this was + chosen to avoid). Do **not** add `{ isTransitive = false }` to these `api(...)` calls either - that + strips the target project's own `api`-declared dependencies (e.g. `archie-core-common`'s + `compose.runtime`/`kotlinx-serialization`) from flowing through to whichever module declared the + dependency, breaking compilation with "Unresolved reference" on types that module never + redeclares itself. +- Loader-specific dev runs: `./gradlew archie-core-fabric:runClient`, `./gradlew archie-core-neoforge:runClient`. +- Datagen runs are explicit tasks: `./gradlew archie-datagen-fabric:runDatagen` / `./gradlew archie-datagen-neoforge:runDatagen`. +- GameTest runs: `./gradlew archie-gametest-fabric:runGametest` / `./gradlew archie-gametest-neoforge:runGametest` (server-side suite), + `./gradlew archie-gametest-fabric:runGametestClient` / `./gradlew archie-gametest-neoforge:runGametestClient` (client GUI harness suite). +- Docs pipeline: `embedDokkaIntoMkDocs` then `publishDocs` (calls `mike deploy ...`); root `mkdocs.yml` contains `# !!! EMBEDDED DOKKA ... DO NOT COMMIT !!!` markers. CI (`.github/workflows/docs.yaml`) runs - `./gradlew publishDocs` with `working-directory: Archie`. + `./gradlew publishDocs` from the repo root. +- `./gradlew build`/`assemble` are `finalizedBy(fusejars)`, which merges only `archie-core-fabric`'s + and `archie-core-neoforge`'s `remapJar` outputs (`fusioner { fabric { projectName = + "archie-core-fabric" }; neoforge { projectName = "archie-core-neoforge" } }` in root + `build.gradle.kts`) into one artifact under `build/artifacts/` - `datagen`/`gametest`/`test` each + ship as their own separate mod and are never fused. `./gradlew publishCurseforge`/ + `publishModrinth`/`publishGitHub`/`publishMod` publish that merged jar (`publisher{}` block, same + file). +- Every `archie-core`/`archie-datagen`/`archie-gametest` module (not `archie-test` - dev playground, + never published) gets its own `MavenPublication` to kernelpanicsoft.net's Reposilite + (`./gradlew publishToMavenLocal`/`publish`), wired via `extensions.configure + ("publishing") { ... }` inside root `build.gradle.kts`'s `subprojects{}` (not the bare `publishing + { }` DSL accessor - that's only type-safe when the plugin is applied via a `plugins{}` block, and + `maven-publish` here is applied imperatively). Release vs. snapshot repo URL is chosen by whether + `version` ends in `SNAPSHOT`; credentials come from `local.properties` (`reposilite.username`/ + `reposilite.password`, gitignored, developer machines) or `REPOSILITE_USERNAME`/ + `REPOSILITE_PASSWORD` env vars (CI). ## Project-specific conventions -- Keep resource/manifests tokenized using Gradle properties (`${mod_id}`, `${versions.*}`) in `fabric.mod.json` and `neoforge.mods.toml`. +- Keep resource/manifests tokenized using Gradle properties (`${mod_id}`, `${versions.*}`) in `fabric.mod.json` and `neoforge.mods.toml`. `datagen`/`gametest`/`test` each ship as their own mod, so their own modId is `${mod_id}_datagen`/`${mod_id}_gametest`/`${mod_id}_test`, not the bare `${mod_id}`. - Shared assets are merged from `common` into loader modules via `processResources`; do not duplicate `assets/archie/**` directly in loader modules unless loader-specific. -- `common/build.gradle.kts` intentionally uses `modImplementation(libs.fabric.loader)` only for annotations/mixin deps; avoid importing random Fabric-only classes in common code. +- `core/common/build.gradle.kts` intentionally uses `modImplementation(libs.fabric.loader)` only for annotations/mixin deps; avoid importing random Fabric-only classes in common code. - Utility operators are used pervasively for IDs (`Archie % "main"`, `mod % "path"`, `"namespace" % "path"`) - from `Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt`. + from `core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt`. - PR titles must follow [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, `refactor:`, `perf:`, `test:`, `build:`, `ci:`, `chore:`, `style:`, `revert:`, optionally scoped `type(scope):`) - enforced by `.github/workflows/pr-title-lint.yml`. Individual commits within a PR don't need to conform, but a direct push to a release branch (no PR) does, since it's read the same way. This isn't just style: cutting a release (`git tag vX.Y.Z`) triggers `.github/workflows/release-notes.yaml`, which walks merged PR titles since the last tag to generate - `Archie/CHANGELOG.md` and a `Archie/docs/news/posts/` entry, grouped by this prefix - an unparsed title + `CHANGELOG.md` and a `docs/news/posts/` entry, grouped by this prefix - an unparsed title doesn't break anything, it just lands in the catch-all "Other Changes" section instead of a real one. ## Dependency and integration touchpoints - Versions and plugin IDs are centralized in `gradle/libs.versions.toml` (repo root); update there first. -- Packaging/publishing is configured at the `Archie/` build root via `modfusioner` (`fusejars`) and - `modpublisher` (CurseForge/Modrinth/GitHub IDs and required deps, tasks `publishCurseforge`/ - `publishModrinth`/`publishGitHub`/`publishMod`) in `Archie/build.gradle.kts` - `modpublisher` reads its - changelog text straight off disk from `Archie/CHANGELOG.md` when a publish task runs, so those four - tasks `dependsOn` a `generateChangelog` task (same file, same script, same `Archie/build.gradle.kts`) - that regenerates it synchronously first. This is deliberately *not* left to the reactive, tag-triggered - `release-notes.yaml` workflow: if `modpublisher` auto-tags as part of the same `./gradlew publish*` - invocation, that workflow can't possibly have generated this release's entry yet by the time - `changelog` is read, and if that invocation runs in CI under the default `GITHUB_TOKEN`, the tag it - creates won't even fire the workflow (GitHub's anti-recursion rule for that token). `release-notes.yaml` - still owns the `Archie/docs/news/posts/` blog entry, which has no such ordering requirement. -- Mixins are split by scope: loader mixins in `Archie/fabric/src/main/resources/archie.mixins.json` and - `Archie/neoforge/src/main/resources/archie.mixins.json`, common mixin config in - `Archie/common/src/main/resources/archie-common.mixins.json`. +- `generateChangelog` (root `build.gradle.kts`) regenerates `CHANGELOG.md` synchronously from + `.github/scripts/generate_release_notes.py` - kept separate from the reactive, tag-triggered + `release-notes.yaml` workflow for the same reasons as before the migration (see the task's own + comment in `build.gradle.kts`). `publishCurseforge`/`publishModrinth`/`publishGitHub`/`publishMod` + each `dependsOn(generateChangelog)` so `modpublisher`'s changelog (read straight off disk) is + always fresh when a publish task runs. +- Mixins are split by scope: loader mixins in `core/fabric/src/main/resources/archie.mixins.json` and + `core/neoforge/src/main/resources/archie.mixins.json`, common mixin config in + `core/common/src/main/resources/archie-common.mixins.json`. `datagen`/`gametest` each have their + own small per-loader mixins.json too (`archie_datagen.mixins.json`/`archie_gametest.mixins.json`), + since they're separate mods. ## Safe edit boundaries -- For new gameplay/library logic: start in `Archie/common/src/main/kotlin/...`, then add loader `actual`/bootstrap only when APIs differ. -- When adding packets/events/config sections, mirror existing object-singleton style (`Archie`, `AEvents`, `ArchieNetworkChannel`) rather than introducing DI/service containers. +- For new gameplay/library logic: start in `core/common/src/main/kotlin/...`, then add loader `actual`/bootstrap only when APIs differ. +- When adding packets/config sections, mirror existing object-singleton style (`Archie`, `ArchieNetworkChannel`) rather than introducing DI/service containers. For datagen/gametest event wiring specifically, mirror `ADatagenEvents`/`AGametestEvents` (in `datagen`/`gametest` respectively - the generic `AEventObject`/`Handler`/`HandlerConstructor` base plumbing lives in `core`). - If adding new runtime libraries to shipped jars, use `bundleRuntimeLibrary(...)` / `bundleMod(...)` in loader `build.gradle.kts` files (not plain `implementation` only). ## GameTest structure and conventions -GameTests are located in `Archie/common/src/main/gametest/` (a separate Gradle source set from -`src/main/kotlin`) and organized by scope (`common`, `client`, `server`). Test infrastructure and -registration live in `ArchieGameTest.kt` (`.../gametest/internal/ArchieGameTest.kt`). +Archie's own self-test GameTest suite lives in `gametest/common/src/main/kotlin/net/kernelpanicsoft/ +archie/gametest/internal/tests/` (a normal source dir - the old `Archie/common/src/main/gametest/` +separate-Gradle-source-set trick is gone now that `gametest` is its own module/mod entirely, +`archie_gametest`), organized by scope (`common`, `client`, `server`). Test infrastructure and +registration live in `ArchieGameTest.kt` (`gametest/common/.../gametest/internal/ArchieGameTest.kt`). +The GameTest *framework itself* (harness, assertions, junit runner) is `gametest/common/.../gametest/` +(one level up from `internal/`) - this is what `archie-test`'s own GameTests, and any consuming mod's, +build on. ### Test file organization - **Test discovery**: Each test class must be registered in `ArchieGameTest.kt`'s `archieGameTests()` @@ -145,13 +193,17 @@ every subsequent test in that run then failed too, since the client's main-threa never got a chance to run again (`client.screen` frozen at whatever it was when the hang started). `kotlinx-coroutines-test` (the dependency this needs) is dev/test-only - `compileOnly` in -`common/build.gradle.kts`, `runtimeLibrary(...)` (present for local runs like -`runGametestClient`, never bundled into the shipped jar) in the loader modules. `ComposeScreen` -itself never references `kotlinx.coroutines.test.*` symbols directly (only `AClientGameTestHarness`'s -method bodies do, and those only run under `AGameTestPlatform.isGameTest`) - it only holds a plain -`CoroutineDispatcher?` and a `(() -> Unit)?` pump callback, both already-bundled core/stdlib types, -specifically so a real player's game (which never has the test dependency on its classpath) never -needs to resolve it. +`core/common/build.gradle.kts` (since `ComposeScreen.kt` itself lives in `core`, which ships to +every real player, and must never resolve the symbol), plain `implementation` in +`gametest/common/build.gradle.kts` (`gametest` is dev/test-only already, no need for `compileOnly` +there) and `runtimeLibrary(...)` (present for local runs like `runGametestClient`, never bundled +into the shipped jar) in the loader modules. `ComposeScreen` itself never references +`kotlinx.coroutines.test.*` symbols directly (only `AClientGameTestHarness`'s method bodies do, and +those only run under `AGameTestPlatform.isGameTest`, and live in `gametest` not `core`) - `core`'s +`ComposeScreen` only holds a plain `CoroutineDispatcher?` and a `(() -> Unit)?` pump callback (both +already-bundled core/stdlib types) on its public `ComposeTestClockOverride` object, specifically so +a real player's game never needs to resolve the coroutines-test symbol, while `gametest` (a +different module) can still reach in and set it. ### Current test coverage - `ArchieItemHandlerTests` (`server`) – item storage/handler behavior @@ -160,15 +212,15 @@ needs to resolve it. - `ComposeRenderingTests` (`client`) – GUI framework layout/rendering via the client harness ### Adding new tests -1. Create a new test class in `Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/`. +1. Create a new test class in `gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/`. 2. Name it `XyzTests.kt` (following existing convention). 3. For server/common tests: methods as `fun GameTestHelper.testFeatureName()` with `@GameTest(template = EMPTY)`. For client tests: methods as `fun ClientGameTestContext.testFeatureName()` with `@ClientGameTest`. 4. Use assertion helpers from `GameTestAssertions.kt` (server/common) or `ClientGameTestContext`'s own assertion methods (client). 5. Register the class in `ArchieGameTest.kt`'s `archieGameTests()` under the appropriate scope block. -6. Run tests locally with `./gradlew fabric:runGametest` / `neoforge:runGametest` (server/common), or - `./gradlew fabric:runGametestClient` / `neoforge:runGametestClient` (client). +6. Run tests locally with `./gradlew archie-gametest-fabric:runGametest` / `archie-gametest-neoforge:runGametest` (server/common), or + `./gradlew archie-gametest-fabric:runGametestClient` / `archie-gametest-neoforge:runGametestClient` (client). IMPORTANT: When applicable, prefer using intellij-index MCP tools for code navigation and refactoring. IMPORTANT: When debugging, prefer using intellij-debugger MCP tools to interact with the IDE debugger. diff --git a/Archie-Test/.architectury-transformer/debug.log b/Archie-Test/.architectury-transformer/debug.log deleted file mode 100644 index 0748d5fae..000000000 --- a/Archie-Test/.architectury-transformer/debug.log +++ /dev/null @@ -1 +0,0 @@ -[Architectury Transformer DEBUG] Closed File Systems for /home/kernelpanic/IdeaProjects/Archie/Archie/common/build/libs/archie-common-1.0.0.jar diff --git a/Archie-Test/build.gradle.kts b/Archie-Test/build.gradle.kts deleted file mode 100644 index d755833ba..000000000 --- a/Archie-Test/build.gradle.kts +++ /dev/null @@ -1,154 +0,0 @@ -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import org.jetbrains.kotlin.konan.properties.loadProperties -import java.util.Properties -import kotlin.collections.forEach - -plugins { - java - alias(libs.plugins.architectury) - id("net.kernelpanicsoft.actualizer") version "0.1.0" apply false -// alias(libs.plugins.architectury.kotlin) - alias(libs.plugins.architectury.loom) apply false - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotlin.compose) - alias(libs.plugins.compose) -} - -architectury.minecraft = libs.versions.minecraft.get() - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - -subprojects { - apply(plugin = "dev.architectury.loom") - apply(plugin = "net.kernelpanicsoft.actualizer") - - val loom = project.extensions.getByName("loom") - - configure { - silentMojangMappingsLicense() - } - - repositories { - val githubUsername = "github_actor".localOrEnv - val githubToken = "github_token".localOrEnv - mavenCentral() - mavenLocal() - google { - content { - includeGroupByRegex("androidx\\..*") - includeGroupByRegex("com\\.android.*") - } - } - maven { - name = "kernelpanic releases" - url = uri("https://maven.kernelpanicsoft.net/releases") - } - maven { - name = "kernelpanic snapshots" - url = uri("https://maven.kernelpanicsoft.net/snapshots") - } - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - maven("https://maven.parchmentmc.org") - maven("https://maven.fabricmc.net/") - maven("https://maven.neoforged.net/releases/") - maven("https://maven.terraformersmc.com/releases/") - maven("https://repo.nyon.dev/releases") - maven("https://maven.isxander.dev/releases") { - name = "Xander Maven" - } - maven("https://maven.resourcefulbees.com/repository/maven-public/") { - content { - includeGroup("earth.terrarium.common_storage_lib") - } - } - maven { - url = uri("https://maven.pkg.github.com/MrCrayfish/Maven") - credentials { - username = githubUsername - password = githubToken - } - } - maven { - url = uri("https://www.cursemaven.com") - content { - includeGroup("curse.maven") - } - } - } - - @Suppress("UnstableApiUsage") - dependencies { - "minecraft"(rootProject.libs.minecraft) - "mappings"(loom.layered { - officialMojangMappings() - parchment(rootProject.libs.parchment) - }) - - compileOnly("org.jetbrains:annotations:24.1.0") - } -} - -allprojects { - apply(plugin = "java") - apply(plugin = "org.jetbrains.kotlin.jvm") - apply(plugin = "org.jetbrains.kotlin.plugin.serialization") - apply(plugin = "org.jetbrains.kotlin.plugin.compose") - apply(plugin = "org.jetbrains.compose") - apply(plugin = "architectury-plugin") - apply(plugin = "maven-publish") - - version = "mod_version".prop!! - group = "mod_group".prop!! - base.archivesName = "mod_id".prop!!.replace("_", "-") - - tasks.withType().configureEach { - options.encoding = "UTF-8" - options.release.set(21) - } - - architectury { - compileOnly() - } - - java.withSourcesJar() -} - -tasks { - check { - dependsOn(project(":common-test").tasks.check) - dependsOn(project(":fabric-test").tasks.check) - dependsOn(project(":neoforge-test").tasks.check) - } -} - diff --git a/Archie-Test/common/build.gradle.kts b/Archie-Test/common/build.gradle.kts deleted file mode 100644 index 05d88e214..000000000 --- a/Archie-Test/common/build.gradle.kts +++ /dev/null @@ -1,98 +0,0 @@ -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.jetbrains.kotlin.konan.properties.loadProperties - -architectury { - common("fabric", "neoforge") -} - -actualizer { - stubUnfulfilledExpects() -} - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - - -loom { - log4jConfigs.from(rootDir.resolve("../log4j-dev.xml")) - accessWidenerPath = file("src/main/resources/${"mod_id".prop}.accesswidener") - enableTransitiveAccessWideners = true -} - -sourceSets { - main { - kotlin { - srcDir("src/main/gametest") - srcDir("src/main/datagen") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - // namedElements is the mapped-name variant - without it this resolves to the intermediary-mapped - // variant that remapJar publishes (see fabric/neoforge's "common"(...) dependency for the same fix), - // which is fine at compile time but breaks reflection over Minecraft types at test runtime. - api("net.kernelpanicsoft:common") { targetConfiguration = "namedElements" } - testImplementation(libs.junit.jupiter.api) - testImplementation(kotlin("reflect")) - testRuntimeOnly(libs.junit.jupiter.engine) - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation(libs.fabric.loader) - - modApi(libs.architectury.common) - modApi(libs.rei.common) - modApi(libs.storage.common) - modApi(libs.storage.resources.common) -} - -tasks { - base.archivesName.set(base.archivesName.get() + "-common") - - test { - testClassesDirs = sourceSets.test.get().output.classesDirs - classpath = sourceSets.test.get().runtimeClasspath - useJUnitPlatform() - systemProperty("archie.junit.gametest", "true") - // See the matching comment in Archie/common/build.gradle.kts. - systemProperty( - "archie.junit.gametest.matrix", - System.getProperty("archie.junit.gametest.matrix") ?: "fabric:server,fabric:client,neoforge:server,neoforge:client", - ) - systemProperty("archie.junit.gametest.timeoutMinutes", "20") - systemProperty("archie.junit.gametest.root", rootProject.rootDir.absolutePath) - } -} diff --git a/Archie-Test/fabric/build.gradle.kts b/Archie-Test/fabric/build.gradle.kts deleted file mode 100644 index 282236da9..000000000 --- a/Archie-Test/fabric/build.gradle.kts +++ /dev/null @@ -1,228 +0,0 @@ -import net.kernelpanicsoft.archie.plugin.bundleMod -import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary -import org.jetbrains.kotlin.konan.properties.loadProperties - - -plugins { - alias(libs.plugins.shadow) - alias(libs.plugins.archie) -} - -architectury { - platformSetupLoomIde() - fabric() -} - -actualizer { - actualizes(project(":common-test")) - actualizes("net.kernelpanicsoft:common") -} - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - -configurations { - create("common") - create("archie") - create("shadowCommon") - compileClasspath.get().extendsFrom(configurations["common"], configurations["archie"]) - runtimeClasspath.get().extendsFrom(configurations["common"], configurations["archie"]) - testCompileClasspath.get().extendsFrom(compileClasspath.get()) - testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) -// getByName("developmentFabric").extendsFrom(configurations["common"]) -} - -loom { - log4jConfigs.from(project(":common-test").loom.log4jConfigs) - accessWidenerPath.set(project(":common-test").loom.accessWidenerPath) - - mods { - maybeCreate("main").apply { - sourceSet(sourceSets.main.get()) - } - } - - runs { - getByName("client") { - name = "Minecraft Client" - source(sourceSets.main.get()) - vmArg("-XX:+AllowEnhancedClassRedefinition") - } - getByName("server") { - name = "Minecraft Server" - source(sourceSets.main.get()) - vmArgs("-XX:+AllowEnhancedClassRedefinition") - } - // This adds a new gradle task that runs the datagen API: "gradlew runDatagen" - create("datagen") { - client() - name = "Minecraft Datagen" - property("archie.datagen", "true") - property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) - property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) - property("fabric-api.datagen") - property("fabric-api.datagen.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - property("fabric-api.datagen.output-dir", file("src/main/generated").absolutePath) - - runDir = "build/datagen" - } - create("gametest") { - server() - name = "Minecraft GameTest" - property("fabric-api.gametest") - property("archie.gametest", "true") - property("archie.gametest.side", "server") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie_test").get()) - } - create("gametestClient") { - client() - name = "Minecraft GameTest Client" - property("fabric-api.gametest") - property("archie.gametest", "true") - property("archie.gametest.side", "client") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie_test").get()) - } - } -} - -fabricApi.configureDataGeneration { - createRunConfiguration = false - outputDirectory.set(file("src/main/generated")) -} - -sourceSets { - main { - resources { - } - kotlin { - srcDir("src/main/gametest") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - "archie"("net.kernelpanicsoft:fabric") { targetConfiguration = "namedElements" } - modImplementation(libs.fabric.loader) - modApi(libs.fabric.api) - modApi(libs.architectury.fabric) - modImplementation(libs.kotlin.fabric) - modLocalRuntime(libs.rei.fabric) - modLocalRuntime(libs.catalogue.fabric) - modLocalRuntime(libs.menulogue.fabric) - modLocalRuntime(libs.clothConfig.fabric) - bundleMod(libs.storage.fabric) - - "common"(project(":common-test", "namedElements")) { isTransitive = false } - "common"("net.kernelpanicsoft:common") { targetConfiguration = "namedElements" } - "shadowCommon"(project(":common-test", "transformProductionFabric")) { isTransitive = false } -} - -modResources { - filesMatching.add("fabric.mod.json") -} - - -tasks { - base.archivesName.set(base.archivesName.get() + "-fabric") - - test { - useJUnitPlatform() - } - - processResources { - from(project(":common-test").sourceSets.main.get().resources) { - include("assets/${"mod_id".prop}/**") - include("data/${"mod_id".prop}/**") - include("${"mod_id".prop}-common.mixins.json") - include("${"mod_id".prop}.common.json") - include("${"mod_id".prop}.accesswidener") - } - dependsOn(processTestResources) - } - - processTestResources { - } - - classes { - finalizedBy(testClasses) - } - - shadowJar { - configurations = - listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) - archiveClassifier.set("dev-shadow") - } - - remapJar { - injectAccessWidener.set(true) - inputFile.set(shadowJar.get().archiveFile) - dependsOn(shadowJar) - } - - jar.get().archiveClassifier.set("dev") - - sourcesJar { - val commonSources = project(":common-test").tasks.sourcesJar - dependsOn(commonSources) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(commonSources.get().archiveFile.map { zipTree(it) }) - } -} - -//publishing { -// publications.create("mavenFabric") { -// artifactId = base.archivesName.get() -// from(components["java"]) -// } -// -// repositories { -// mavenLocal() -// maven { -// val releasesRepoUrl = "https://example.com/releases" -// val snapshotsRepoUrl = "https://example.com/snapshots" -// url = uri( -// if (project.version.toString().endsWith("SNAPSHOT") || project.version.toString() -// .startsWith("0") -// ) snapshotsRepoUrl else releasesRepoUrl -// ) -// name = "ExampleRepo" -// credentials { -// username = project.properties["repoLogin"]?.toString() -// password = project.properties["repoPassword"]?.toString() -// } -// } -// } -//} \ No newline at end of file diff --git a/Archie-Test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt b/Archie-Test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt deleted file mode 100644 index 17bcef71d..000000000 --- a/Archie-Test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt +++ /dev/null @@ -1,18 +0,0 @@ -package net.kernelpanicsoft.archie.test - -import net.fabricmc.api.ClientModInitializer -import net.fabricmc.api.ModInitializer - -object ArchieTestFabric : ModInitializer, ClientModInitializer -{ - override fun onInitialize() - { - ArchieTest.init() - ArchieTest.initCommon() - } - - override fun onInitializeClient() - { - ArchieTest.initClient() - } -} \ No newline at end of file diff --git a/Archie-Test/gradle.properties b/Archie-Test/gradle.properties deleted file mode 100644 index ac947a374..000000000 --- a/Archie-Test/gradle.properties +++ /dev/null @@ -1,19 +0,0 @@ -org.gradle.jvmargs=-Xmx8G -kotlin.incremental=false -org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled -org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true - -mod_id=archie_test -mod_group=net.kernelpanicsoft -mod_version=1.0.0 -mod_display_name=Archie Test Mod -mod_description=A library mod for Kernel Panic's mods -mod_authors=Kernel Panic -mod_credits=Both the NeoForge and fabric teams for the code I ported to Architectury and Kotlin -mod_url=https://github.com/kernel-panic-codecave/Archie -mod_source=https://github.com/kernel-panic-codecave/Archie -mod_license=GPL-3.0-or-later - -client_datagen=true -server_datagen=true - diff --git a/Archie-Test/gradle/wrapper/gradle-wrapper.jar b/Archie-Test/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b953..000000000 Binary files a/Archie-Test/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/Archie-Test/gradle/wrapper/gradle-wrapper.properties b/Archie-Test/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cea7a793a..000000000 --- a/Archie-Test/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/Archie-Test/gradlew b/Archie-Test/gradlew deleted file mode 100755 index f3b75f3b0..000000000 --- a/Archie-Test/gradlew +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/Archie-Test/gradlew.bat b/Archie-Test/gradlew.bat deleted file mode 100644 index 9b42019c7..000000000 --- a/Archie-Test/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/Archie-Test/neoforge/build.gradle.kts b/Archie-Test/neoforge/build.gradle.kts deleted file mode 100644 index 943c1f4f5..000000000 --- a/Archie-Test/neoforge/build.gradle.kts +++ /dev/null @@ -1,250 +0,0 @@ -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import net.fabricmc.loom.util.ModPlatform -import net.kernelpanicsoft.archie.plugin.bundleMod -import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary -import net.kernelpanicsoft.archie.plugin.runtimeLibrary -import org.jetbrains.compose.compose -import org.jetbrains.kotlin.konan.properties.loadProperties - - -plugins { - alias(libs.plugins.shadow) - alias(libs.plugins.archie) -} - -architectury { - platformSetupLoomIde() - neoForge() -} - -actualizer { - actualizes(project(":common-test")) - actualizes("net.kernelpanicsoft:common") -} - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - -configurations { - create("common") - create("archie") - create("shadowCommon") - configureEach { - // Keep NeoForge Kotlin runtime provided by KotlinLangForge only. - exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") - exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") - } - compileClasspath.get().extendsFrom(configurations["common"], configurations["archie"]) - runtimeClasspath.get().extendsFrom(configurations["common"], configurations["archie"]) - testCompileClasspath.get().extendsFrom(compileClasspath.get()) - testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) -// getByName("developmentNeoForge").extendsFrom(configurations["common"]) -} - -loom { - log4jConfigs.from(project(":common-test").loom.log4jConfigs) - accessWidenerPath.set(project(":common-test").loom.accessWidenerPath) - - mods { - maybeCreate("main").apply { - sourceSet(sourceSets.main.get()) - } - } - - runs { - getByName("client") { - name = "Minecraft Client" - source(sourceSets.main.get()) - vmArgs("-XX:+AllowEnhancedClassRedefinition") - property("kotlinx.coroutines.debug", "off") - } - getByName("server") { - name = "Minecraft Server" - source(sourceSets.main.get()) - property("kotlinx.coroutines.debug", "off") - vmArgs("-XX:+AllowEnhancedClassRedefinition") - } - create("datagen") { - data() - name = "Minecraft Datagen" - property("archie.datagen", "true") - property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) - property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) - property("kotlinx.coroutines.debug", "off") - programArgs("--all", "--mod", providers.gradleProperty("mod_id").orElse("archie").get()) - programArgs("--output", file("src/main/generated").absolutePath) - } - - create("gametest") { - server() - name = "Minecraft GameTest" - property("neoforge.enableGameTest", "true") - property("neoforge.gameTestServer", "true") - property("archie.gametest", "true") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie_test").get()) - property("kotlinx.coroutines.debug", "off") - providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } - } - - create("gametestClient") { - client() - name = "Minecraft GameTest Client" - property("neoforge.enableGameTest", "true") - property("archie.gametest.side", "client") - property("archie.gametest", "true") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie_test").get()) - property("kotlinx.coroutines.debug", "off") - providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } - } - } - -} - -sourceSets { - main { - resources { - srcDir("src/main/generated") - } - kotlin { - srcDir("src/main/gametest") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - "archie"("net.kernelpanicsoft:neoforge") { targetConfiguration = "namedElements" } - neoForge(libs.neoforge) - modApi(libs.architectury.neoforge) - implementation(libs.kotlin.neoforge) - modRuntimeOnly(libs.rei.neoforge) - modRuntimeOnly(libs.catalogue.neoforge) - modRuntimeOnly(libs.clothConfig.neoforge) - bundleMod(libs.storage.neoforge) { exclude(group = "curse.maven") } - - "common"(project(":common-test", "namedElements")) { isTransitive = false } - "common"("net.kernelpanicsoft:common") { targetConfiguration = "namedElements" } - "shadowCommon"(project(":common-test", "transformProductionNeoForge")) { isTransitive = false } -} - -modResources { - filesMatching.add("META-INF/neoforge.mods.toml") -} - -tasks { - base.archivesName.set(base.archivesName.get() + "-neoforge") - - test { - useJUnitPlatform() - } - - processResources { - from(project(":common-test").sourceSets.main.get().resources) { - include("assets/${"mod_id".prop}/**") - include("data/${"mod_id".prop}/**") - include("${"mod_id".prop}-common.mixins.json") - include("${"mod_id".prop}.common.json") - include("${"mod_id".prop}.accesswidener") - } - dependsOn(processTestResources) - } - - processTestResources { - } - - classes { - finalizedBy(testClasses) - } - - shadowJar { - exclude("fabric.mod.json") - configurations = - listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) - archiveClassifier.set("dev-shadow") - } - - remapJar { - inputFile.set(shadowJar.get().archiveFile) - atAccessWideners.set(setOf(loom.accessWidenerPath.get().asFile.name)) - dependsOn(shadowJar) - } - - jar.get().archiveClassifier.set("dev") - - jar { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(project(":common-test").sourceSets.main.get().output) - } - - sourcesJar { - val commonSources = project(":common-test").tasks.sourcesJar - dependsOn(commonSources) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(commonSources.get().archiveFile.map { zipTree(it) }) - } - -// task("printRuntimeClasspath") { -// val runtimeClasspath = sourceSets.test.get().runtimeClasspath -// inputs.files( runtimeClasspath ) -// doLast { -// println(runtimeClasspath.joinToString("\n") { it.path }) -// } -// } -} - -//publishing { -// publications.create("mavenNeoForge") { -// artifactId = base.archivesName.get() -// from(components["java"]) -// } -// -// repositories { -// mavenLocal() -// maven { -// val releasesRepoUrl = "https://example.com/releases" -// val snapshotsRepoUrl = "https://example.com/snapshots" -// url = uri( -// if (project.version.toString().endsWith("SNAPSHOT") || project.version.toString() -// .startsWith("0") -// ) snapshotsRepoUrl else releasesRepoUrl -// ) -// name = "ExampleRepo" -// credentials { -// username = project.properties["repoLogin"]?.toString() -// password = project.properties["repoPassword"]?.toString() -// } -// } -// } -//} \ No newline at end of file diff --git a/Archie-Test/settings.gradle.kts b/Archie-Test/settings.gradle.kts deleted file mode 100644 index 24329e8de..000000000 --- a/Archie-Test/settings.gradle.kts +++ /dev/null @@ -1,48 +0,0 @@ -import org.gradle.kotlin.dsl.maven - -enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") - -pluginManagement { - repositories { - maven("https://maven.fabricmc.net/") - maven("https://maven.architectury.dev/") - maven("https://maven.minecraftforge.net/") - maven("https://maven.neoforged.net/releases/") - maven("https://maven.firstdarkdev.xyz/releases") - maven { - name = "kernelpanic releases" - url = uri("https://maven.kernelpanicsoft.net/releases") - } - maven { - name = "kernelpanic snapshots" - url = uri("https://maven.kernelpanicsoft.net/snapshots") - } - gradlePluginPortal() - mavenLocal() - } -} - -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - } -} - -includeBuild("../Archie") { - dependencySubstitution { - substitute(module("net.kernelpanicsoft:common")).using(project(":common")) - substitute(module("net.kernelpanicsoft:fabric")).using(project(":fabric")) - substitute(module("net.kernelpanicsoft:neoforge")).using(project(":neoforge")) - } -} - -include("common", "fabric", "neoforge") - -rootProject.name = "Archie-Test" - -project(":common").name = "common-test" -project(":fabric").name = "fabric-test" -project(":neoforge").name = "neoforge-test" - diff --git a/Archie/build.gradle.kts b/Archie/build.gradle.kts deleted file mode 100644 index 0fa47ab4d..000000000 --- a/Archie/build.gradle.kts +++ /dev/null @@ -1,293 +0,0 @@ -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import org.gradle.api.publish.PublishingExtension -import org.jetbrains.kotlin.konan.properties.loadProperties -import org.gradle.api.publish.maven.MavenPublication -import java.util.Properties - -plugins { - java - alias(libs.plugins.architectury) - id("net.kernelpanicsoft.actualizer") version "0.1.0" apply false -// alias(libs.plugins.architectury.kotlin) - alias(libs.plugins.architectury.loom) apply false - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotlin.compose) - alias(libs.plugins.compose) - alias(libs.plugins.dokka.mkdocs) - alias(libs.plugins.modfusioner) - alias(libs.plugins.modpublisher) -} - -architectury.minecraft = libs.versions.minecraft.get() - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - -subprojects { - apply(plugin = "dev.architectury.loom") - apply(plugin = "maven-publish") - apply(plugin = "net.kernelpanicsoft.actualizer") - - val loom = project.extensions.getByName("loom") - - configure { - silentMojangMappingsLicense() - } - - repositories { - val githubUsername = "github_actor".localOrEnv - val githubToken = "github_token".localOrEnv - mavenCentral() - mavenLocal() - google { - content { - includeGroupByRegex("androidx\\..*") - includeGroupByRegex("com\\.android.*") - } - } - maven { - name = "kernelpanic releases" - url = uri("https://maven.kernelpanicsoft.net/releases") - } - maven { - name = "kernelpanic snapshots" - url = uri("https://maven.kernelpanicsoft.net/snapshots") - } - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - maven("https://maven.parchmentmc.org") - maven("https://maven.fabricmc.net/") - maven("https://maven.neoforged.net/releases/") - maven("https://maven.terraformersmc.com/releases/") -// maven("https://thedarkcolour.github.io/KotlinForForge/") - maven("https://repo.nyon.dev/releases") - maven("https://maven.isxander.dev/releases") { - name = "Xander Maven" - } - maven("https://maven.resourcefulbees.com/repository/maven-public/") { - content { - includeGroup("earth.terrarium.common_storage_lib") - } - } - maven { - url = uri("https://maven.pkg.github.com/MrCrayfish/Maven") - credentials { - username = githubUsername - password = githubToken - } - } - maven { - url = uri("https://www.cursemaven.com") - content { - includeGroup("curse.maven") - } - } - - } - - @Suppress("UnstableApiUsage") - dependencies { - "minecraft"(rootProject.libs.minecraft) - "mappings"(loom.layered { - officialMojangMappings() - parchment(rootProject.libs.parchment) - }) - - compileOnly("org.jetbrains:annotations:24.1.0") - } - - extensions.configure("publishing") { - publications { - create("mavenJava") { - artifactId = "${"mod_id".prop}-${base.archivesName.get()}" - from(components["java"]) - } - } - - repositories { - mavenLocal() - maven { - name = "kernelpanicReleases" - url = uri("https://maven.kernelpanicsoft.net/releases") - credentials { - username = "repoLogin".localOrEnv - ?: "maven_username".localOrEnv - ?: "maven_user".localOrEnv - password = "repoPassword".localOrEnv - ?: "maven_password".localOrEnv - ?: "maven_pass".localOrEnv - } - } - } - } - -} - -allprojects { - apply(plugin = "java") - apply(plugin = "org.jetbrains.kotlin.jvm") - apply(plugin = "org.jetbrains.kotlin.plugin.serialization") - apply(plugin = "org.jetbrains.kotlin.plugin.compose") - apply(plugin = "org.jetbrains.compose") - apply(plugin = "dev.opensavvy.dokka-mkdocs") - apply(plugin = "architectury-plugin") - apply(plugin = "maven-publish") - - version = "mod_version".prop!! - group = "mod_group".prop!! - base.archivesName = "mod_id".prop!! - - tasks.withType().configureEach { - options.encoding = "UTF-8" - options.release.set(21) - } - - kotlin { - compilerOptions { - freeCompilerArgs.add("-Xexpect-actual-classes") - } - } - - architectury { - compileOnly() - } - - dokka { - dokkaGeneratorIsolation = ClassLoaderIsolation() -// pluginsConfiguration.html { -// footerMessage = "(c) 2025 Kernel Panic" -// } - } - - java.withSourcesJar() -} - -dependencies { - dokka(project(":common")) { isTransitive = false } - dokka(project(":fabric")) { isTransitive = false } - dokka(project(":neoforge")) { isTransitive = false } -} - -fusioner { - packageGroup = project.group.toString() - mergedJarName = "${project.base.archivesName.get()}-merged-${libs.versions.minecraft.get()}" - jarVersion = project.version.toString() - outputDirectory = "build/artifacts" - - fabric { - inputTaskName = "remapJar" - } - - neoforge { - inputTaskName = "remapJar" - } -} - -tasks { - build { - finalizedBy(fusejars) - } - assemble { - finalizedBy(fusejars) - } -} - -publisher { - apiKeys { - curseforge("curseforge_api_key".localOrEnv) - modrinth("modrinth_api_key".localOrEnv) - } - - debug = true - - curseID = "1029738" - modrinthID = "archie" - githubRepo = "https://github.com/kernel-panic-codecave/Archie" - - projectVersion = "${libs.versions.minecraft.get()}-${project.version}" - displayName = "Archie-Merged-${projectVersion.get()}" - gameVersions = listOf("1.21.1") - loaders = listOf("neoforge", "fabric") - curseEnvironment = "both" - versionType = "alpha" - artifact = tasks.fusejars.get() - javaVersions = listOf(JavaVersion.VERSION_21) - - changelog = file("CHANGELOG.md") - - curseDepends { - required = listOf("fabric-api", "fabric-language-kotlin", "kotlinlangforge", "architectury-api", "cloth-config") - } - - modrinthDepends { - required = listOf("fabric-api", "fabric-language-kotlin", "kotlin-lang-forge", "architectury-api", "cloth-config") - } -} - -tasks { - named("publish") { - dependsOn(publishMod) - } - check { - dependsOn(project(":common").tasks.check) - dependsOn(project(":fabric").tasks.check) - dependsOn(project(":neoforge").tasks.check) - } - register("publishDocs") { - dependsOn(getByName("embedDokkaIntoMkDocs")) - group = "publishing" - val tag = rootProject.version.toString().substringBeforeLast(".") - workingDir = rootDir - commandLine("mike", "deploy", "--push", "--update-aliases", tag, "latest") - } - // modpublisher's `changelog = file("CHANGELOG.md")` (see the `publisher { }` block above) - // reads that file straight off disk when a publish task runs - it doesn't know about git tags - // or PRs. .github/workflows/release-notes.yaml (reactive, post-tag) can't help here: by the - // time it would generate this release's entry, the publish task attached to the tag has - // already read (and shipped) whatever was on disk before. This task closes that gap by - // generating CHANGELOG.md synchronously, right before any publish task reads it - see - // .github/scripts/generate_release_notes.py's module docstring for the two call shapes. - register("generateChangelog") { - group = "publishing" - workingDir = rootDir - commandLine( - "python3", "../.github/scripts/generate_release_notes.py", - "--repo", "mod_source".prop!!.removePrefix("https://github.com/"), - "--new-tag", "v${project.version}", - "--range-end", "HEAD", - "--changelog-path", "CHANGELOG.md", - ) - } - listOf("publishCurseforge", "publishModrinth", "publishGitHub", "publishMod").forEach { - named(it) { dependsOn(getByName("generateChangelog")) } - } -} diff --git a/Archie/common/build.gradle.kts b/Archie/common/build.gradle.kts deleted file mode 100644 index a0a793032..000000000 --- a/Archie/common/build.gradle.kts +++ /dev/null @@ -1,184 +0,0 @@ -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.jetbrains.kotlin.konan.properties.loadProperties - -architectury { - common("fabric", "neoforge") -} - -actualizer { - stubUnfulfilledExpects() -} - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - -loom { - log4jConfigs.from(rootDir.resolve("../log4j-dev.xml")) - accessWidenerPath = file("src/main/resources/${"mod_id".prop}.accesswidener") -} - -sourceSets { - main { - kotlin { - srcDir("src/main/gametest") - srcDir("src/main/datagen") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - compileOnly(kotlin("reflect")) - implementation(libs.junit.jupiter.api) - // Used by the client GameTest harness only (AClientGameTestHarness.kt) to give ComposeScreen a - // virtual clock/dispatcher during tests. compileOnly (not implementation/api) deliberately - - // this must never end up in the shipped jar. ComposeScreen itself never references - // kotlinx.coroutines.test.* symbols directly (only AClientGameTestHarness.kt's method bodies - // do, and those only ever run under AGameTestPlatform.isGameTest), so a real player's game - - // which never has this on its classpath - never needs to resolve it. Loader modules add it - // back as runtimeOnly (not bundled - see AGENTS.md) so local `runGametestClient` has it. - compileOnly(libs.kotlinx.coroutines.test) - testImplementation(libs.junit.jupiter.api) - testImplementation(kotlin("reflect")) - testRuntimeOnly(libs.junit.jupiter.engine) - api(libs.kotlinx.serialization) - api(libs.kotlinx.serialization.json) - api(libs.kotlinx.serialization.nbt) { isTransitive = false } - api(libs.kotlinx.serialization.toml) { isTransitive = false } - api(libs.kotlinx.serialization.json5) { isTransitive = false } - api(libs.kotlinx.serialization.cbor) { isTransitive = false } - api(compose.runtime) - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation(libs.fabric.loader) - - modApi(libs.rei.common) - modCompileOnly(libs.catalogue.common) - modCompileOnly(libs.clothConfig.common) - modCompileOnly(libs.yacl.common) - modApi(libs.architectury.common) - modApi(libs.storage.common) - modApi(libs.storage.resources.common) -} - -tasks { - base.archivesName.set(base.archivesName.get() + "-common") - - val verifyGuiSpriteAssets by registering { - group = "verification" - description = "Verifies GUI sprite metadata files have matching PNG assets." - - doLast { - val spritesDir = file("src/main/resources/assets/archie/textures/gui/sprites") - if (!spritesDir.exists()) return@doLast - - val missingPng = spritesDir - .walkTopDown() - .filter { it.isFile && it.name.endsWith(".png.mcmeta") } - .map { it to file(it.path.removeSuffix(".mcmeta")) } - .filter { (_, png) -> !png.exists() } - .map { (meta, _) -> meta.relativeTo(projectDir).invariantSeparatorsPath } - .toList() - - if (missingPng.isNotEmpty()) { - val details = missingPng.joinToString(separator = "\n") { " - $it" } - throw GradleException( - "Found GUI sprite metadata files without matching PNGs:\n$details" - ) - } - } - } - - named("check") { - dependsOn(verifyGuiSpriteAssets) - } - - // Keep stubUnfulfilledExpects()'s generated throwing-actual stubs out of what gets published - - // a consumer with both this jar and a real actual on its classpath must only ever see the - // real one, or Kotlin's actual-resolution can end up preferring the stub. - jar { - from(sourceSets.main.get().output) - exclude("**/*StubKt.class") - } - - sourcesJar { - exclude("**/*Stub.kt") - } - - test { - testClassesDirs = sourceSets.test.get().output.classesDirs - classpath = sourceSets.test.get().runtimeClasspath - useJUnitPlatform() - systemProperty("archie.junit.gametest", "true") - // Overridable via -Darchie.junit.gametest.matrix=... (a plain JVM system property, not a - // Gradle project property, since -P doesn't propagate across includeBuild() boundaries in - // this composite build - a CI job matrix needs to reach both Archie's and Archie-Test's - // :common:test at once). - systemProperty( - "archie.junit.gametest.matrix", - System.getProperty("archie.junit.gametest.matrix") ?: "fabric:server,fabric:client,neoforge:server,neoforge:client", - ) - systemProperty("archie.junit.gametest.timeoutMinutes", "20") - systemProperty("archie.junit.gametest.root", rootProject.rootDir.absolutePath) - testLogging { - exceptionFormat = TestExceptionFormat.FULL - } - } -} - -publishing { - publications.create("mavenCommon") { - artifactId = base.archivesName.get() - from(components["java"]) - } - - repositories { - mavenLocal() - maven { - name = "Reposilite" - val releasesUrl = "https://maven.kernelpanicsoft.net/releases" - val snapshotsUrl = "https://maven.kernelpanicsoft.net/snapshots" - - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl) - - credentials { - username = localProperties?.getProperty("reposilite.username") - ?: System.getenv("REPOSILITE_USERNAME") - password = localProperties?.getProperty("reposilite.password") - ?: System.getenv("REPOSILITE_PASSWORD") - } - } - } -} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt b/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt deleted file mode 100644 index f0d798256..000000000 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt +++ /dev/null @@ -1,20 +0,0 @@ -package net.kernelpanicsoft.archie.data - -import net.kernelpanicsoft.archie.events.AEvents -import net.kernelpanicsoft.archie.events.AEvents.GatherDataHandler -import net.kernelpanicsoft.archie.events.AEventObject -import dev.architectury.event.Event -import dev.architectury.platform.Mod - -/** - * Convenience [AEventObject] base for hooking into [AEvents.GATHER_DATA], the event fired by - * the loader during a datagen run. Implement [handler] to build and run an [ADataGenerator]. - */ -abstract class ADatagenEventObject(mod: Mod) : - AEventObject( - mod - ) -{ - override val event: Event = AEvents.GATHER_DATA - override val handlerConstructor: GatherDataHandler.Companion = GatherDataHandler.Companion -} \ No newline at end of file diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt b/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt deleted file mode 100644 index bdb7786e1..000000000 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt +++ /dev/null @@ -1,20 +0,0 @@ -package net.kernelpanicsoft.archie.gametest - -import net.kernelpanicsoft.archie.events.AEvents -import net.kernelpanicsoft.archie.events.AEventObject -import dev.architectury.event.Event -import dev.architectury.platform.Mod - -/** - * Convenience [AEventObject] base for listening to [AEvents.REGISTER_GAME_TEST] for [mod]. - * Subclass and override [handler] (an [AEvents.ArchieGameTestBuilder] receiver) to declare - * gametest classes via `server { register<...>() }` / `client { ... }` / `common { ... }`. - */ -abstract class AGameTestEventObject(mod: Mod) : - AEventObject( - mod - ) -{ - override val event: Event = AEvents.REGISTER_GAME_TEST - override val handlerConstructor: AEvents.RegisterGameTestHandler.Companion = AEvents.RegisterGameTestHandler.Companion -} \ No newline at end of file diff --git a/Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java b/Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java deleted file mode 100644 index 14c7664d7..000000000 --- a/Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.client.gui; - -import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.gui.access.SlotHighlightClipProvider; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthProvider; -import net.kernelpanicsoft.archie.gui.layout.IntRect; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.screens.inventory.MenuAccess; -import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Debug; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -@Debug(export = true) -@Mixin(AbstractContainerScreen.class) -public abstract class AbstractContainerScreenMixin extends Screen implements MenuAccess -{ - @Unique - private Float archie$slotDepthOverride; - - protected AbstractContainerScreenMixin(Component title) - { - super(title); - } - - @ModifyArgs(method = "renderSlot", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V")) - private void archie$adjustSlotLayer(Args args, GuiGraphics guiGraphics, Slot slot) - { - float originalZ = args.get(2); - float adjustedZ = originalZ; - archie$slotDepthOverride = null; - if (this instanceof SlotLayerDepthProvider provider) - { - Float custom = provider.slotRenderLayerOffset(slot); - archie$slotDepthOverride = custom; - if (custom != null) - { - adjustedZ = custom; - Archie.LOGGER.debug("Adjusting slot layer depth for {} to {}", slot, custom); - } - } - args.set(2, adjustedZ); - } - - @Redirect(method = "renderSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderItem(Lnet/minecraft/world/item/ItemStack;III)V")) - private void archie$wrapSlotItemRender(GuiGraphics guiGraphics, ItemStack stack, int x, int y, int seed) - { - boolean pushed = false; - if (archie$slotDepthOverride != null) - { - SlotLayerDepthContext.push(archie$slotDepthOverride); - pushed = true; - } - try - { - guiGraphics.renderItem(stack, x, y, seed); - } - finally - { - if (pushed) - { - SlotLayerDepthContext.pop(); - } - archie$slotDepthOverride = null; - } - } - - /** - * Vanilla's per-slot hover highlight is drawn via a static helper that only takes the - * slot's raw x/y/blitOffset - there's no per-slot instance override point to clip it the - * way {@link #archie$adjustSlotLayer} clips the item icon, so this redirects the call - * site directly instead. - */ - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderSlotHighlight(Lnet/minecraft/client/gui/GuiGraphics;III)V")) - private void archie$clipSlotHighlight(GuiGraphics guiGraphics, int x, int y, int blitOffset) - { - IntRect clip = null; - if (this instanceof SlotHighlightClipProvider provider) - { - clip = provider.slotHighlightClipRect(x, y); - if (clip == null) - { - return; - } - } - if (clip != null) - { - guiGraphics.enableScissor(clip.getMinX(), clip.getMinY(), clip.getMaxX(), clip.getMaxY()); - } - try - { - AbstractContainerScreen.renderSlotHighlight(guiGraphics, x, y, blitOffset); - } - finally - { - if (clip != null) - { - guiGraphics.disableScissor(); - } - } - } -} diff --git a/Archie/fabric/build.gradle.kts b/Archie/fabric/build.gradle.kts deleted file mode 100644 index edb2a48e5..000000000 --- a/Archie/fabric/build.gradle.kts +++ /dev/null @@ -1,247 +0,0 @@ -import net.kernelpanicsoft.archie.plugin.bundleMod -import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary -import net.kernelpanicsoft.archie.plugin.runtimeLibrary -import org.jetbrains.kotlin.konan.properties.loadProperties - - -plugins { - alias(libs.plugins.shadow) - alias(libs.plugins.archie) -} - -architectury { - platformSetupLoomIde() - fabric() -} - -actualizer { - actualizes(project(":common")) -} - -// If a `jar { from(project(":common").sourceSets.main.get().output) }` merge (like neoforge's) -// ever gets added here too, exclude("net/kernelpanicsoft/archie/**") from it - that output is -// common's own stub-linked classes, and it won the duplicatesStrategy race on NeoForge (crashed -// at runtime). See neoforge/build.gradle.kts's jar task. - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - -configurations { - create("common") - create("shadowCommon") - compileClasspath.get().extendsFrom(configurations["common"]) - runtimeClasspath.get().extendsFrom(configurations["common"]) - testCompileClasspath.get().extendsFrom(compileClasspath.get()) - testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) -// getByName("developmentFabric").extendsFrom(configurations["common"]) -} - -loom { - log4jConfigs.from(project(":common").loom.log4jConfigs) - accessWidenerPath.set(project(":common").loom.accessWidenerPath) - - mods { - maybeCreate("main").apply { - sourceSet(sourceSets.main.get()) - } - } - - runs { - getByName("client") { - name = "Minecraft Client" - source(sourceSets.main.get()) - vmArg("-XX:+AllowEnhancedClassRedefinition") - } - getByName("server") { - name = "Minecraft Server" - source(sourceSets.main.get()) - vmArgs("-XX:+AllowEnhancedClassRedefinition") - } - // This adds a new gradle task that runs the datagen API: "gradlew runDatagen" - create("datagen") { - client() - name = "Minecraft Datagen" - property("archie.datagen", "true") - property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) - property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) - property("fabric-api.datagen") - property("fabric-api.datagen.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - property("fabric-api.datagen.output-dir", file("src/main/generated").absolutePath) - - runDir = "build/datagen" - } - create("gametest") { - server() - name = "Minecraft GameTest" - property("fabric-api.gametest") - property("archie.gametest", "true") - property("archie.gametest.side", "server") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - } - create("gametestClient") { - client() - name = "Minecraft GameTest Client" - property("fabric-api.gametest") - property("archie.gametest", "true") - property("archie.gametest.side", "client") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - } - } -} - -fabricApi.configureDataGeneration { - createRunConfiguration = false - outputDirectory.set(file("src/main/generated")) -} - -sourceSets { - main { - resources { - } - kotlin { - srcDir("src/main/gametest") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - modImplementation(libs.fabric.loader) - modApi(libs.fabric.api) - modApi(libs.architectury.fabric) - modImplementation(libs.kotlin.fabric) - compileOnly(libs.kotlinx.serialization) - bundleRuntimeLibrary(libs.kotlinx.serialization) - bundleRuntimeLibrary(libs.kotlinx.serialization.json) - bundleRuntimeLibrary(libs.kotlinx.serialization.nbt) - bundleRuntimeLibrary(libs.kotlinx.serialization.toml) - bundleRuntimeLibrary(libs.kotlinx.serialization.json5) - bundleRuntimeLibrary(libs.kotlinx.serialization.cbor) - bundleRuntimeLibrary(compose.runtime) - modLocalRuntime(libs.rei.fabric) - modCompileOnlyApi(libs.modmenu) - modCompileOnlyApi(libs.catalogue.fabric) - modLocalRuntime(libs.catalogue.fabric) - modLocalRuntime(libs.menulogue.fabric) - modCompileOnlyApi(libs.clothConfig.fabric) - modLocalRuntime(libs.clothConfig.fabric) - bundleMod(libs.storage.fabric) - - implementation(libs.junit.jupiter.api) - testImplementation(libs.junit.jupiter.api) - testRuntimeOnly(libs.junit.jupiter.engine) - // dev/test-only, not shipped - see the compileOnly note in common/build.gradle.kts - runtimeLibrary(libs.kotlinx.coroutines.test) - - "common"(project(":common", "namedElements")) { isTransitive = false } - "shadowCommon"(project(":common", "transformProductionFabric")) { isTransitive = false } -} - -modResources { - filesMatching.add("fabric.mod.json") -} - - -tasks { - base.archivesName.set(base.archivesName.get() + "-fabric") - - test { - useJUnitPlatform() - } - - processResources { - from(project(":common").sourceSets.main.get().resources) { - include("assets/${"mod_id".prop}/**") - include("data/${"mod_id".prop}/**") - include("${"mod_id".prop}-common.mixins.json") - include("${"mod_id".prop}.common.json") - include("${"mod_id".prop}.accesswidener") - } - dependsOn(processTestResources) - } - - processTestResources { - } - - classes { - finalizedBy(testClasses) - } - - shadowJar { - configurations = - listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) - archiveClassifier.set("dev-shadow") - } - - remapJar { - injectAccessWidener.set(true) - inputFile.set(shadowJar.get().archiveFile) - dependsOn(shadowJar) - } - - jar.get().archiveClassifier.set("dev") - - sourcesJar { - val commonSources = project(":common").tasks.sourcesJar - dependsOn(commonSources) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(commonSources.get().archiveFile.map { zipTree(it) }) - } -} - -publishing { - publications.create("mavenFabric") { - artifactId = base.archivesName.get() - from(components["java"]) - } - - repositories { - mavenLocal() - maven { - name = "Reposilite" - val releasesUrl = "https://maven.kernelpanicsoft.net/releases" - val snapshotsUrl = "https://maven.kernelpanicsoft.net/snapshots" - - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl) - - credentials { - username = localProperties?.getProperty("reposilite.username") - ?: System.getenv("REPOSILITE_USERNAME") - password = localProperties?.getProperty("reposilite.password") - ?: System.getenv("REPOSILITE_PASSWORD") - } - } - } -} \ No newline at end of file diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt b/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt deleted file mode 100644 index 76ca0324a..000000000 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt +++ /dev/null @@ -1,141 +0,0 @@ -package net.kernelpanicsoft.archie.data.common.conditions - -import com.mojang.serialization.Codec -import com.mojang.serialization.MapCodec -import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider -import kotlinx.serialization.json.Json -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput -import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider -import net.fabricmc.fabric.api.resource.conditions.v1.ResourceCondition -import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditionType -import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions -import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper -import net.kernelpanicsoft.archie.serialization.kSerializer -import net.minecraft.advancements.Advancement -import net.minecraft.advancements.AdvancementHolder -import net.minecraft.core.Holder -import net.minecraft.core.HolderLookup -import net.minecraft.core.Registry -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.data.recipes.RecipeOutput -import net.minecraft.data.recipes.RecipeProvider -import net.minecraft.resources.ResourceKey -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.crafting.Recipe -import java.util.concurrent.CompletableFuture - -/** - * Fabric implementation of [AConditionsPlatform], adapting Archie's platform-neutral [IACondition] - * onto Fabric's `ResourceCondition` API (`fabric-resource-conditions-api-v1`). - * - * Every [IACondition] is wrapped as a [FabricCondition] to cross into Fabric's condition system, - * and unwrapped again via [ResourceCondition.archie] when Archie code needs the original back. - */ -actual object AConditionsPlatform -{ - /** Fabric condition types registered via [register], keyed by their [IACondition.identifier]. */ - private val registry: MutableMap> = mutableMapOf() - - /** Registers [identifier] as a Fabric [ResourceConditionType], backed by [codec] via the [FabricCondition] wrapper. */ - actual fun register(identifier: ResourceLocation, codec: MapCodec) - { - @Suppress("UNCHECKED_CAST") - registry[identifier] = ResourceConditionType.create(identifier, (codec as MapCodec).xmap({ - it.fabric - }, { - it.condition - })) - ResourceConditions.register(registry[identifier]) - } - - /** Attaches [condition] to whatever [output] accepts next, via [FabricDataGenHelper.addConditions]. */ - actual fun withCondition(output: RecipeOutput, condition: IACondition): RecipeOutput - { - return object : RecipeOutput - { - @Suppress("UnstableApiUsage") - override fun accept(identifier: ResourceLocation, recipe: Recipe<*>, advancementEntry: AdvancementHolder?) - { - FabricDataGenHelper.addConditions(recipe, arrayOf(condition.fabric)) - Archie.LOGGER.info(Json.encodeToString(ResourceCondition.CODEC.kSerializer, condition.fabric)) - output.accept(identifier, recipe, advancementEntry) - } - - override fun advancement(): Advancement.Builder - { - return output.advancement() - } - } - } - - /** Codec for [IACondition] backed by [ResourceCondition.CODEC], round-tripping through [fabric]/[archie]. */ - actual fun codec(): Codec - { - return ResourceCondition.CODEC.xmap( - { resourceCondition -> - resourceCondition.archie - }, { iCondition -> - iCondition.fabric - } - ) - } - - /** Wraps [child] in a [FabricRecipeProvider] so its recipes go through Fabric's condition-aware output. */ - actual fun fabricRecipeProvider( - child: ARecipeProvider, - registries: CompletableFuture - ): RecipeProvider? - { - return object : FabricRecipeProvider(child.output as FabricDataOutput, registries) - { - override fun buildRecipes(exporter: RecipeOutput) - { - child.buildRecipes(exporter) - } - } - } - - /** Wraps this condition as a Fabric [ResourceCondition]. */ - val IACondition.fabric - get() = FabricCondition(this) - - /** Unwraps a Fabric [ResourceCondition] back to its originating [IACondition]. Throws if it wasn't created via [fabric]. */ - val ResourceCondition.archie - get() = ((this as? FabricCondition) ?: throw AssertionError()).condition - - /** Adapts an [IACondition] to Fabric's [ResourceCondition] interface, delegating [getType] and [test] to it. */ - class FabricCondition( - val condition: IACondition - ) : ResourceCondition - { - override fun getType(): ResourceConditionType<*> - { - return registry[condition.identifier]!! - } - - override fun test(registryLookup: HolderLookup.Provider?): Boolean - { - return registryLookup?.let { - condition.test(ConditionContext(it)) - } ?: false - } - } - - /** [IACondition.IContext] backed directly by a Fabric registry lookup, used when Fabric evaluates a condition. */ - class ConditionContext(private val registryLookup: HolderLookup.Provider) : - IACondition.IContext - { - override fun getAllTags(registry: ResourceKey>): Map>> - { - return registryLookup.lookupOrThrow(registry).listTags().toList() - .associateBy({ it.key().location }, { it.toList() }) - } - - override fun getRegistry(registry: ResourceKey>): Registry - { - return RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).registryOrThrow(registry) - } - } -} \ No newline at end of file diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt b/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt deleted file mode 100644 index 5a9dabfbb..000000000 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt +++ /dev/null @@ -1,62 +0,0 @@ -package net.kernelpanicsoft.archie.gametest - -import dev.architectury.platform.Mod -import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.events.AEvents -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform.isGameTest -import net.kernelpanicsoft.archie.mixin.fabric.FabricGameTestModInitializerMixin -import net.minecraft.gametest.framework.GameTestRegistry -import net.minecraft.gametest.framework.GlobalTestReporter - -/** Backs [AGameTestPlatform] on Fabric: holds registered test classes and drives Fabric's own GameTest registry. */ -internal object AGameTestPlatformInternal -{ - - /** Test classes registered via [AGameTestPlatform.register], keyed by owning mod. */ - @JvmField - internal val testClasses: MutableMap>> = mutableMapOf() - - /** - * No-ops unless [isGameTest]. Fires [AEvents.REGISTER_GAME_TEST] for every mod selected by - * [AGameTestModFilter] (or just [Archie.MOD] if [AEvents.MODS] is empty), then registers each - * resulting test class with [GameTestRegistry] and [FabricGameTestModInitializerMixin]'s - * id/logger bookkeeping - throwing if the same class is registered under more than one mod. - * - * Falls back to [NoOpGameTest] for a mod whose registration turns up no classes at all for the - * current [AGameTestPlatform.side] (e.g. a client-only mod's server invocation) - vanilla's - * `GameTestServer` refuses to boot with zero test functions registered anywhere. - */ - @JvmStatic - @JvmName("registerGameTests") - internal fun registerGameTests() - { - if (!isGameTest) return - Archie.LOGGER.info("Registering GameTests") - GlobalTestReporter.replaceWith(VerboseTestReporter) - val mods = AGameTestModFilter.selectMods(AEvents.MODS.ifEmpty { listOf(Archie.MOD) }) - for (mod in mods) - { - AEvents.REGISTER_GAME_TEST.invoker()(mod) - val classes = testClasses.getOrPut(mod, ::mutableSetOf) - val toRegister = if (classes.isEmpty()) setOf(NoOpGameTest::class.java) else classes - for (clazz in toRegister) - { - if (FabricGameTestModInitializerMixin.getGameTestIds().containsKey(clazz)) - { - throw UnsupportedOperationException( - "Test class (${clazz.canonicalName}) has already been registered with mod (${mod.modId})" - ) - } - - FabricGameTestModInitializerMixin.getGameTestIds()[clazz] = mod.modId - GameTestRegistry.register(clazz) - - FabricGameTestModInitializerMixin.getLogger().debug( - "Registered test class {} for mod {}", - clazz.canonicalName, - mod.modId - ) - } - } - } -} \ No newline at end of file diff --git a/Archie/gradle.properties b/Archie/gradle.properties deleted file mode 100644 index 1d397d138..000000000 --- a/Archie/gradle.properties +++ /dev/null @@ -1,19 +0,0 @@ -org.gradle.jvmargs=-Xmx8G -kotlin.incremental=false -org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled -org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true - -mod_id=archie -mod_group=net.kernelpanicsoft -mod_version=1.0.0 -mod_display_name=Archie -mod_description=A library mod for Kernel Panic's mods -mod_authors=Kernel Panic -mod_credits=Both the NeoForge and fabric teams for the code I ported to Architectury and Kotlin -mod_url=https://github.com/kernel-panic-codecave/Archie -mod_source=https://github.com/kernel-panic-codecave/Archie -mod_license=GPL-3.0-or-later - -client_datagen=true -server_datagen=true - diff --git a/Archie/gradle/wrapper/gradle-wrapper.jar b/Archie/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b953..000000000 Binary files a/Archie/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/Archie/gradle/wrapper/gradle-wrapper.properties b/Archie/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cea7a793a..000000000 --- a/Archie/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/Archie/gradlew b/Archie/gradlew deleted file mode 100755 index f3b75f3b0..000000000 --- a/Archie/gradlew +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/Archie/gradlew.bat b/Archie/gradlew.bat deleted file mode 100644 index 9b42019c7..000000000 --- a/Archie/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/Archie/neoforge/build.gradle.kts b/Archie/neoforge/build.gradle.kts deleted file mode 100644 index 2a8125933..000000000 --- a/Archie/neoforge/build.gradle.kts +++ /dev/null @@ -1,259 +0,0 @@ -import net.kernelpanicsoft.archie.plugin.bundleMod -import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary -import net.kernelpanicsoft.archie.plugin.runtimeLibrary -import org.jetbrains.kotlin.konan.properties.loadProperties - - -plugins { - alias(libs.plugins.shadow) - alias(libs.plugins.archie) -} - -architectury { - platformSetupLoomIde() - neoForge() -} - -actualizer { - actualizes(project(":common")) -} - -val localProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("local.properties") - val sharedPropsFile = rootDir.resolve("../local.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val sharedProperties = kotlin.runCatching { - val localPropsFile = rootDir.resolve("gradle.properties") - val sharedPropsFile = rootDir.resolve("../gradle.properties") - when { - localPropsFile.exists() -> loadProperties(localPropsFile.path) - sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) - else -> null - } -}.getOrNull() - -val String.prop: String? - get() = sharedProperties?.get(this)?.toString() - -val String.local: String? - get() = localProperties?.get(this)?.toString() - -val String.env: String? - get() = System.getenv(this) - -val String.localOrEnv: String? - get() = localProperties?.get(this)?.toString() ?: System.getenv(this.uppercase()) - - -configurations { - create("common") - create("shadowCommon") - configureEach { - // Keep NeoForge Kotlin runtime provided by KotlinLangForge only. - exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") - exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") - } - compileClasspath.get().extendsFrom(configurations["common"]) - runtimeClasspath.get().extendsFrom(configurations["common"]) - testCompileClasspath.get().extendsFrom(compileClasspath.get()) - testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) -// getByName("developmentNeoForge").extendsFrom(configurations["common"]) -} - -loom { - log4jConfigs.from(project(":common").loom.log4jConfigs) - accessWidenerPath.set(project(":common").loom.accessWidenerPath) - - mods { - maybeCreate("main").apply { - sourceSet(sourceSets.main.get()) - } - } - - runs { - getByName("client") { - name = "Minecraft Client" - source(sourceSets.main.get()) - vmArgs("-XX:+AllowEnhancedClassRedefinition") - property("kotlinx.coroutines.debug", "off") - } - getByName("server") { - name = "Minecraft Server" - source(sourceSets.main.get()) - vmArgs("-XX:+AllowEnhancedClassRedefinition") - property("kotlinx.coroutines.debug", "off") - } - create("datagen") { - data() - name = "Minecraft Datagen" - property("archie.datagen", "true") - property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) - property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) - property("kotlinx.coroutines.debug", "off") - programArgs("--all", "--mod", providers.gradleProperty("mod_id").orElse("archie").get()) - programArgs("--output", file("src/main/generated").absolutePath) - } - - create("gametest") { - server() - name = "Minecraft GameTest" - property("neoforge.enableGameTest", "true") - property("neoforge.gameTestServer", "true") - property("archie.gametest", "true") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - property("kotlinx.coroutines.debug", "off") - providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } - } - - create("gametestClient") { - client() - name = "Minecraft GameTest Client" - property("neoforge.enableGameTest", "true") - property("archie.gametest.side", "client") - property("archie.gametest", "true") - property("archie.gametest.modid", providers.gradleProperty("mod_id").orElse("archie").get()) - property("kotlinx.coroutines.debug", "off") - providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } - } - } - -} - -sourceSets { - main { - resources { - srcDir("src/main/generated") - } - kotlin { - srcDir("src/main/gametest") - } - java { - srcDir("src/main/mixin") - } - } -} - -dependencies { - neoForge(libs.neoforge) - modApi(libs.architectury.neoforge) - implementation(libs.kotlin.neoforge) - compileOnly(libs.kotlinx.serialization) - bundleRuntimeLibrary(libs.kotlinx.serialization) - bundleRuntimeLibrary(libs.kotlinx.serialization.json) - bundleRuntimeLibrary(libs.kotlinx.serialization.nbt) - bundleRuntimeLibrary(libs.kotlinx.serialization.toml) - bundleRuntimeLibrary(libs.kotlinx.serialization.json5) - bundleRuntimeLibrary(libs.kotlinx.serialization.cbor) - bundleRuntimeLibrary(compose.runtime) - modRuntimeOnly(libs.rei.neoforge) - modCompileOnlyApi(libs.catalogue.neoforge) - modRuntimeOnly(libs.catalogue.neoforge) - modCompileOnlyApi(libs.clothConfig.neoforge) - modRuntimeOnly(libs.clothConfig.neoforge) - bundleMod(libs.storage.neoforge) { - exclude(group = "curse.maven") - } - - implementation(libs.junit.jupiter.api) - testImplementation(libs.junit.jupiter.api) - testRuntimeOnly(libs.junit.jupiter.engine) - // dev/test-only, not shipped - see the compileOnly note in common/build.gradle.kts - runtimeLibrary(libs.kotlinx.coroutines.test) - - "common"(project(":common", "namedElements")) { isTransitive = false } - "shadowCommon"(project(":common", "transformProductionNeoForge")) { isTransitive = false } -} - -modResources { - filesMatching.add("META-INF/neoforge.mods.toml") -} - -tasks { - base.archivesName.set(base.archivesName.get() + "-neoforge") - - test { - useJUnitPlatform() - } - - processResources { - from(project(":common").sourceSets.main.get().resources) { - include("assets/${"mod_id".prop}/**") - include("data/${"mod_id".prop}/**") - include("${"mod_id".prop}-common.mixins.json") - include("${"mod_id".prop}.common.json") - include("${"mod_id".prop}.accesswidener") - } - dependsOn(processTestResources) - } - - processTestResources { - } - - classes { - finalizedBy(testClasses) - } - - shadowJar { - exclude("fabric.mod.json") - configurations = - listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) - archiveClassifier.set("dev-shadow") - } - - remapJar { - inputFile.set(shadowJar.get().archiveFile) - atAccessWideners.set(setOf(loom.accessWidenerPath.get().asFile.name)) - dependsOn(shadowJar) - } - - jar.get().archiveClassifier.set("dev") - - jar { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(project(":common").sourceSets.main.get().output) { - // That output is common's own independently-compiled (stub-linked) classes - this - // module's own sourceSets.main.output already has a correctly-actualized copy of all - // of them via actualizes(project(":common")) above. Exclude so the stub-linked copy - // can't win the duplicatesStrategy race - it did, and threw at runtime. - exclude("net/kernelpanicsoft/archie/**") - } - } - - sourcesJar { - val commonSources = project(":common").tasks.sourcesJar - dependsOn(commonSources) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(commonSources.get().archiveFile.map { zipTree(it) }) - } -} - -publishing { - publications.create("mavenNeoForge") { - artifactId = base.archivesName.get() - from(components["java"]) - } - - repositories { - mavenLocal() - maven { - name = "Reposilite" - val releasesUrl = "https://maven.kernelpanicsoft.net/releases" - val snapshotsUrl = "https://maven.kernelpanicsoft.net/snapshots" - - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl) - - credentials { - username = localProperties?.getProperty("reposilite.username") - ?: System.getenv("REPOSILITE_USERNAME") - password = localProperties?.getProperty("reposilite.password") - ?: System.getenv("REPOSILITE_PASSWORD") - } - } - } -} \ No newline at end of file diff --git a/Archie/neoforge/mkdocs.yml b/Archie/neoforge/mkdocs.yml deleted file mode 100644 index 1cb8be744..000000000 --- a/Archie/neoforge/mkdocs.yml +++ /dev/null @@ -1,8 +0,0 @@ -site_name: My Docs -theme: - name: material -nav: - - Home: # your existing pages… - - index.md -# !!! EMBEDDED DOKKA START, DO NOT COMMIT !!! # -# !!! EMBEDDED DOKKA END, DO NOT COMMIT !!! # diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt b/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt deleted file mode 100644 index 4724d2b0e..000000000 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt +++ /dev/null @@ -1,151 +0,0 @@ -package net.kernelpanicsoft.archie.data.common.conditions - -import com.mojang.serialization.* -import dev.nyon.klf.MOD_BUS -import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider -import net.minecraft.advancements.Advancement -import net.minecraft.advancements.AdvancementHolder -import net.minecraft.core.Holder -import net.minecraft.core.HolderLookup -import net.minecraft.core.Registry -import net.minecraft.core.RegistryAccess -import net.minecraft.core.registries.BuiltInRegistries -import net.minecraft.data.recipes.RecipeOutput -import net.minecraft.data.recipes.RecipeProvider -import net.minecraft.resources.ResourceKey -import net.minecraft.resources.ResourceLocation -import net.minecraft.world.item.crafting.Recipe -import net.neoforged.neoforge.common.conditions.ICondition -import net.neoforged.neoforge.registries.DeferredRegister -import net.neoforged.neoforge.registries.NeoForgeRegistries -import java.util.concurrent.CompletableFuture -import java.util.stream.Stream -import net.kernelpanicsoft.archie.data.common.conditions.IACondition as ArchieCondition - - -/** - * NeoForge implementation of [AConditionsPlatform], adapting Archie's platform-neutral - * [ArchieCondition] onto NeoForge's `ICondition` API. - * - * Every [ArchieCondition] is wrapped as a [NeoForgeCondition] to cross into NeoForge's condition - * system, and unwrapped again via [ICondition.archie] when Archie code needs the original back. - */ -actual object AConditionsPlatform -{ - /** Registers [identifier] as a NeoForge condition serializer, backed by [codec] via the [NeoForgeConditionCodec] wrapper. */ - actual fun register(identifier: ResourceLocation, codec: MapCodec) - { - val registry = DeferredRegister.create(NeoForgeRegistries.CONDITION_SERIALIZERS, identifier.namespace) - registry.register(identifier.path) { _ -> - codec.neoforge - } - registry.register(MOD_BUS) - } - - /** Wraps [output] so every entry accepted through it also carries [condition]. */ - actual fun withCondition(output: RecipeOutput, condition: ArchieCondition): RecipeOutput - { - return NeoForgeConditionalRecipeOutput(output, condition.neoforge) - } - - /** Codec for [ArchieCondition] backed by `ICondition.CODEC`, round-tripping through [neoforge]/[archie]. */ - actual fun codec(): Codec - { - return ICondition.CODEC.xmap({ - it.archie - }, { - it.neoforge - }) - } - - /** Fabric-only concern; always `null` on NeoForge. */ - actual fun fabricRecipeProvider(child: ARecipeProvider, registries: CompletableFuture): RecipeProvider? = null - - /** Unwraps a NeoForge [ICondition] back to its originating [ArchieCondition]. Throws if it wasn't created via [neoforge]. */ - val ICondition.archie - get() = ((this as? NeoForgeCondition) ?: throw AssertionError()).condition - - /** Wraps this condition as a NeoForge [ICondition]. */ - val ArchieCondition.neoforge - get() = NeoForgeCondition(this) - - /** Wraps this codec as a NeoForge condition-serializer codec. */ - val MapCodec.neoforge - get() = NeoForgeConditionCodec(this) - - /** Adapts an [ArchieCondition] to NeoForge's [ICondition] interface, delegating [test] to it and [codec] to the registered serializer. */ - class NeoForgeCondition( - val condition: ArchieCondition - ) : ICondition - { - override fun test(iContext: ICondition.IContext): Boolean - { - return condition.test(object : ArchieCondition.IContext - { - override fun getAllTags(registry: ResourceKey>): Map>> - { - return iContext.getAllTags(registry) - } - - override fun getRegistry(registry: ResourceKey>): Registry - { - return RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).registryOrThrow(registry) - } - }) - } - - override fun codec(): MapCodec - { - return NeoForgeRegistries.CONDITION_SERIALIZERS[condition.identifier]!! - } - } - - /** Adapts a [MapCodec] of [ArchieCondition] to one producing/consuming [NeoForgeCondition] wrappers. */ - class NeoForgeConditionCodec( - private val codec: MapCodec - ) : MapCodec() - { - override fun encode( - input: NeoForgeCondition, - ops: DynamicOps, - prefix: RecordBuilder - ): RecordBuilder - { - @Suppress("UNCHECKED_CAST") - return (codec as MapCodec).encode(input.condition, ops, prefix) - } - - override fun keys(ops: DynamicOps): Stream - { - return codec.keys(ops) - } - - override fun decode(ops: DynamicOps, input: MapLike): DataResult - { - return codec.decode(ops, input).map { result -> - result.neoforge - } - } - } - - /** [RecipeOutput] wrapper that always attaches [condition] to whatever [inner] accepts. */ - class NeoForgeConditionalRecipeOutput(private val inner: RecipeOutput, private val condition: ICondition) : - RecipeOutput - { - override fun advancement(): Advancement.Builder - { - return inner.advancement() - } - - /** Forwards to [inner], attaching [condition]; any [iConditions] passed by the caller are not currently applied. */ - override fun accept( - id: ResourceLocation, - recipe: Recipe<*>, - adv: AdvancementHolder?, - vararg iConditions: ICondition - ) - { - inner.accept(id, recipe, adv, this.condition) - } - } -} \ No newline at end of file diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt b/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt deleted file mode 100644 index 0e565abda..000000000 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatformInternal.kt +++ /dev/null @@ -1,55 +0,0 @@ -package net.kernelpanicsoft.archie.gametest - -import dev.architectury.platform.Mod -import net.kernelpanicsoft.archie.events.AEvents -import net.neoforged.fml.ModList -import net.neoforged.neoforge.event.RegisterGameTestsEvent - -/** Backs [AGameTestPlatform] on NeoForge: holds registered test classes and drives NeoForge's own `RegisterGameTestsEvent`. */ -internal object AGameTestPlatformInternal -{ - /** Test classes registered via [AGameTestPlatform.register], keyed by owning mod. */ - @JvmField - internal val testClasses: MutableMap>> = mutableMapOf() - - /** Inverse of [testClasses]: the owning mod for each registered test class. */ - @JvmStatic - @get:JvmName("getTestClassToMod") - internal val testClassToMod: Map, Mod> - get() = buildMap { - testClasses.forEach { (mod, classes) -> - classes.forEach { put(it, mod) } - } - } - - /** - * No-ops unless [AGameTestPlatform.isGameTest]. For every mod selected by [AGameTestModFilter] - * from [AEvents.MODS], subscribes to that mod's `RegisterGameTestsEvent`; when it fires, fires - * [AEvents.REGISTER_GAME_TEST] for the mod and registers each resulting test class with - * NeoForge's event. - * - * Falls back to [NoOpGameTest] for a mod whose registration turns up no classes at all for the - * current [AGameTestPlatform.side] (e.g. a client-only mod's server invocation) - vanilla's - * `GameTestServer` refuses to boot with zero test functions registered anywhere. - */ - @JvmStatic - @JvmName("addEventHandlers") - fun addEventHandlers() - { - if (!AGameTestPlatform.isGameTest) return - - for (mod in AGameTestModFilter.selectMods(AEvents.MODS)) - { - ModList.get().getModContainerById(mod.modId).ifPresent { - it.eventBus?.addListener { event -> - AEvents.REGISTER_GAME_TEST.invoker()(mod) - val classes = testClasses.getOrPut(mod, ::mutableSetOf) - for (clazz in if (classes.isEmpty()) setOf(NoOpGameTest::class.java) else classes) - { - event.register(clazz) - } - } - } - } - } -} \ No newline at end of file diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestRegistryMixin.java b/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestRegistryMixin.java deleted file mode 100644 index 495dc3d37..000000000 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestRegistryMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.neoforge; - -import net.minecraft.gametest.framework.*; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Rotation; -import net.neoforged.neoforge.gametest.GameTestHooks; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.lang.reflect.Method; -import java.util.function.Consumer; - -@Mixin(GameTestRegistry.class) -public abstract class GameTestRegistryMixin { - @Shadow - private static Consumer turnMethodIntoConsumer(Method testMethod) { - return null; - } - - @Inject(method = "turnMethodIntoTestFunction(Ljava/lang/reflect/Method;)Lnet/minecraft/gametest/framework/TestFunction;", at = @At("HEAD"), cancellable = true) - private static void turnMethodIntoTestFunctionMixin(Method testMethod, CallbackInfoReturnable cir) - { - GameTest gameTest = testMethod.getAnnotation(GameTest.class); - if (gameTest.template().contains(":")) - { - ResourceLocation template = ResourceLocation.parse(gameTest.template()); - - String s = testMethod.getDeclaringClass().getSimpleName(); - String s1 = s.toLowerCase(); - boolean prefixGameTestTemplate = GameTestHooks.prefixGameTestTemplate(testMethod); - String s2 = (prefixGameTestTemplate ? s1 + "." : "") + testMethod.getName().toLowerCase(); - String s3 = GameTestHooks.getTemplateNamespace(testMethod) + ":" + (prefixGameTestTemplate ? s1 + "." : "") + template.getPath(); - String s4 = gameTest.batch(); - Rotation rotation = StructureUtils.getRotationForRotationSteps(gameTest.rotationSteps()); - - cir.setReturnValue(new TestFunction(s4, s2, s3, rotation, gameTest.timeoutTicks(), gameTest.setupTicks(), gameTest.required(), gameTest.manualOnly(), gameTest.requiredSuccesses(), gameTest.attempts(), gameTest.skyAccess(), turnMethodIntoConsumer(testMethod))); - } - } -} diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/StructureTemplateManagerMixin.java b/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/StructureTemplateManagerMixin.java deleted file mode 100644 index 4f2b59dc6..000000000 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/StructureTemplateManagerMixin.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.neoforge; - -import com.google.common.collect.ImmutableList; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.datafixers.DataFixer; -import net.minecraft.core.HolderGetter; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.resources.FileToIdConverter; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import net.minecraft.world.level.storage.LevelStorageSource; -import org.apache.commons.io.IOUtils; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -@Mixin(StructureTemplateManager.class) -public abstract class StructureTemplateManagerMixin { - @Unique - private static final String GAMETEST_STRUCTURE_PATH = "gametest/structures"; - @Unique - private static final FileToIdConverter GAMETEST_STRUCTURE_FINDER = new FileToIdConverter(GAMETEST_STRUCTURE_PATH, ".snbt"); - - @Shadow - private ResourceManager resourceManager; - - @Shadow public abstract StructureTemplate readStructure(CompoundTag nbt); - - - @Shadow public List sources; - - @Unique - private Optional archie_loadSnbtFromResource(ResourceLocation id) { - ResourceLocation path = GAMETEST_STRUCTURE_FINDER.idToFile(id); - Optional resource = this.resourceManager.getResource(path); - - if (resource.isPresent()) { - try { - String snbt = IOUtils.toString(resource.get().openAsReader()); - CompoundTag nbt = NbtUtils.snbtToStructure(snbt); - return Optional.of(this.readStructure(nbt)); - } catch (IOException | CommandSyntaxException e) { - throw new RuntimeException("Failed to load GameTest structure " + id, e); - } - } - - return Optional.empty(); - } - - @Unique - private Stream archie_streamTemplatesFromResource() { - FileToIdConverter finder = GAMETEST_STRUCTURE_FINDER; - return finder.listMatchingResources(this.resourceManager).keySet().stream().map(finder::fileToId); - } - - @Inject(method = "", at = @At(value = "RETURN")) - private void addFabricTemplateProvider(ResourceManager resourceManager, LevelStorageSource.LevelStorageAccess levelStorageAccess, DataFixer fixerUpper, HolderGetter blockLookup, CallbackInfo ci, @Local ImmutableList.Builder builder) { - builder.add(new StructureTemplateManager.Source(this::archie_loadSnbtFromResource, this::archie_streamTemplatesFromResource)); - this.sources = builder.build(); - } -} \ No newline at end of file diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenDepthMixin.java b/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenDepthMixin.java deleted file mode 100644 index bf054b7fc..000000000 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenDepthMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.neoforge.client.gui; - -import com.mojang.blaze3d.systems.RenderSystem; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthProvider; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(AbstractContainerScreen.class) -public abstract class AbstractContainerScreenDepthMixin { - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;disableDepthTest()V", shift = At.Shift.AFTER)) - private void archie$restoreDepth(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick, CallbackInfo ci) { - if (this instanceof SlotLayerDepthProvider) { - RenderSystem.enableDepthTest(); - RenderSystem.depthMask(true); - RenderSystem.depthFunc(GL11.GL_LEQUAL); - } - } -} - diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenMixin.java b/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenMixin.java deleted file mode 100644 index d85d0e495..000000000 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenMixin.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.neoforge.client.gui; - -import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.gui.access.SlotHighlightClipProvider; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthProvider; -import net.kernelpanicsoft.archie.gui.layout.IntRect; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.screens.inventory.MenuAccess; -import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -@Mixin(AbstractContainerScreen.class) -public abstract class AbstractContainerScreenMixin extends Screen implements MenuAccess { - @Unique - private Float archie$slotDepthOverride; - - protected AbstractContainerScreenMixin(Component title) { - super(title); - } - - @ModifyArgs(method = "renderSlot", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V")) - private void archie$adjustSlotLayer(Args args, GuiGraphics guiGraphics, Slot slot) { - float adjustedZ = args.get(2); - archie$slotDepthOverride = null; - if (this instanceof SlotLayerDepthProvider provider) { - Float custom = provider.slotRenderLayerOffset(slot); - archie$slotDepthOverride = custom; - if (custom != null) { - adjustedZ = custom; - Archie.LOGGER.debug("Adjusting slot layer depth for {} to {}", slot, custom); - } - } - args.set(2, adjustedZ); - } - - @Redirect(method = "renderSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderItem(Lnet/minecraft/world/item/ItemStack;III)V")) - private void archie$wrapSlotItemRender(GuiGraphics guiGraphics, ItemStack stack, int x, int y, int seed) { - boolean pushed = false; - if (archie$slotDepthOverride != null) { - SlotLayerDepthContext.push(archie$slotDepthOverride); - pushed = true; - } - try { - guiGraphics.renderItem(stack, x, y, seed); - } finally { - if (pushed) { - SlotLayerDepthContext.pop(); - } - archie$slotDepthOverride = null; - } - } - - /** - * Vanilla's per-slot hover highlight is drawn via a static helper that only takes the - * slot's raw x/y/blitOffset - there's no per-slot instance override point to clip it the - * way {@link #archie$adjustSlotLayer} clips the item icon, so this redirects the call - * site directly instead. - */ - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderSlotHighlight(Lnet/minecraft/client/gui/GuiGraphics;III)V")) - private void archie$clipSlotHighlight(GuiGraphics guiGraphics, int x, int y, int blitOffset) { - IntRect clip = null; - if (this instanceof SlotHighlightClipProvider provider) { - clip = provider.slotHighlightClipRect(x, y); - if (clip == null) { - return; - } - } - if (clip != null) { - guiGraphics.enableScissor(clip.getMinX(), clip.getMinY(), clip.getMaxX(), clip.getMaxY()); - } - try { - AbstractContainerScreen.renderSlotHighlight(guiGraphics, x, y, blitOffset); - } finally { - if (clip != null) { - guiGraphics.disableScissor(); - } - } - } -} - diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/GuiGraphicsMixin.java b/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/GuiGraphicsMixin.java deleted file mode 100644 index 3a8474a94..000000000 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/GuiGraphicsMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.kernelpanicsoft.archie.mixin.neoforge.client.gui; - -import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; -import net.minecraft.client.gui.GuiGraphics; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -@Mixin(GuiGraphics.class) -public abstract class GuiGraphicsMixin { - @Unique - private static final float ITEM_TRANSLATE_Z = 150.0F; - - @ModifyArgs( - method = "renderItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;IIII)V", - at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V") - ) - private void archie$flattenSlotItemDepth(Args args) { - if (!SlotLayerDepthContext.isActive()) { - return; - } - float originalZ = args.get(2); - float adjusted = originalZ - ITEM_TRANSLATE_Z; - Archie.LOGGER.debug( - "Slot depth context active: target={}, translate={} -> {}", - SlotLayerDepthContext.currentDepth(), - originalZ, - adjusted - ); - args.set(2, adjusted); - } -} - diff --git a/Archie/neoforge/src/main/resources/pack.mcmeta b/Archie/neoforge/src/main/resources/pack.mcmeta deleted file mode 100644 index 3fef55f02..000000000 --- a/Archie/neoforge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "Archie", - "pack_format": 22 - } -} diff --git a/Archie/settings.gradle.kts b/Archie/settings.gradle.kts deleted file mode 100644 index 98a3553bc..000000000 --- a/Archie/settings.gradle.kts +++ /dev/null @@ -1,36 +0,0 @@ -import org.gradle.kotlin.dsl.maven - -enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") - -pluginManagement { - repositories { - maven("https://maven.fabricmc.net/") - maven("https://maven.architectury.dev/") - maven("https://maven.minecraftforge.net/") - maven("https://maven.neoforged.net/releases/") - maven("https://maven.firstdarkdev.xyz/releases") - maven { - name = "kernelpanic releases" - url = uri("https://maven.kernelpanicsoft.net/releases") - } - maven { - name = "kernelpanic snapshots" - url = uri("https://maven.kernelpanicsoft.net/snapshots") - } - mavenLocal() - gradlePluginPortal() - } -} - -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - } -} - -include("common", "fabric", "neoforge") - -rootProject.name = "Archie" - diff --git a/Archie/CHANGELOG.md b/CHANGELOG.md similarity index 100% rename from Archie/CHANGELOG.md rename to CHANGELOG.md diff --git a/README.md b/README.md index 1d6ea6b50..64c9cd6d4 100644 --- a/README.md +++ b/README.md @@ -4,68 +4,72 @@ Archie is a Kotlin-first Architectury library mod for Minecraft 1.21.1. It provides shared utilities used by Kernel Panic mods across Fabric and NeoForge. Full guides (config, GUI, networking, serialization, etc.) live at -[docs.kernelpanicsoft.net/Archie](https://docs.kernelpanicsoft.net/Archie/) and in [`Archie/docs/`](Archie/docs). +[docs.kernelpanicsoft.net/Archie](https://docs.kernelpanicsoft.net/Archie/) and in [`docs/`](docs). ## Repo layout -This repository root is a Gradle **composite build** (`settings.gradle.kts`) that just wires -together two independent Gradle builds: +This repository root is a single Gradle build (`settings.gradle.kts`) using Architectury Loom, +with four products, each split into `common`/`fabric`/`neoforge` subprojects nested under one +directory per product and flattened to single-level project names (e.g. `core/fabric` → +`archie-core-fabric`), matching `terrarium-earth/Common-Storage-Lib`'s layout: -- [`Archie/`](Archie): the library itself — `common/`, `fabric/`, `neoforge/` subprojects, plus - the `docs/` site sources. This is what gets published. -- [`Archie-Test/`](Archie-Test): a throwaway playground mod (`common-test`/`fabric-test`/`neoforge-test`) - used to exercise Archie during development; it substitutes in Archie's project sources instead - of a published artifact, so changes in `Archie/` are picked up live. +- [`core/`](core) (`archie-core-{common,fabric,neoforge}`): the library itself - `Archie`, + networking, config, GUI, transfer, registries, resource packs. This is what gets published. +- [`datagen/`](datagen) (`archie-datagen-{common,fabric,neoforge}`): Archie's datagen DSL. Ships as + its own separate mod (`archie_datagen`), dev-time only - never on a real player's classpath. +- [`gametest/`](gametest) (`archie-gametest-{common,fabric,neoforge}`): Archie's GameTest + framework/harness. Also its own separate mod (`archie_gametest`), dev/test-time only. +- [`test/`](test) (`archie-test-{common,fabric,neoforge}`): a throwaway playground mod + (`archie_test`) used to exercise Archie during development - depends on `core`/`datagen`/ + `gametest` via plain project references, so changes there are picked up live. -Because these are separate builds, run all Gradle commands **from inside `Archie/` (or -`Archie-Test/`)**, not the repo root — the root `build.gradle.kts` has no real tasks of its own. +Run all Gradle commands from the repo root. -Inside `Archie/`, the module layout is: +Each product's module layout is the same shape: -- `common/`: shared APIs and core implementation (`Archie`, networking, config, GUI, data helpers) +- `common/`: shared APIs and core implementation - `fabric/`: Fabric entrypoints, run configs, platform `actual` implementations - `neoforge/`: NeoForge entrypoints, run configs, platform `actual` implementations The initialization flow is: -1. Loader entrypoint (`ArchieFabric` or `ArchieNeoForge`) -2. `Archie.init()` in `common` -3. Shared systems register events/network/config and optional datagen/gametest hooks +1. Loader entrypoint (`ArchieFabric` or `ArchieNeoForge`, in `core/{fabric,neoforge}`) +2. `Archie.init()` in `core/common` +3. Shared systems register events/network/config; datagen/gametest activate via a + `ServiceLoader`-based `ArchieExtension` hook if `archie-datagen`/`archie-gametest` are present ## Common workflows -Run from inside `Archie/` (`cd Archie` first, or pass `--project-dir Archie`): - ```bash ./gradlew build -./gradlew fabric:runClient -./gradlew neoforge:runClient -./gradlew fabric:runDatagen -./gradlew neoforge:runDatagen -./gradlew fabric:runGametest -./gradlew neoforge:runGametest -./gradlew fabric:runGametestClient -./gradlew neoforge:runGametestClient +./gradlew archie-core-fabric:runClient +./gradlew archie-core-neoforge:runClient +./gradlew archie-datagen-fabric:runDatagen +./gradlew archie-datagen-neoforge:runDatagen +./gradlew archie-gametest-fabric:runGametest +./gradlew archie-gametest-neoforge:runGametest +./gradlew archie-gametest-fabric:runGametestClient +./gradlew archie-gametest-neoforge:runGametestClient ``` -`build` and `assemble` finalize with `fusejars` (merged Fabric+NeoForge artifact). - -To run the `Archie-Test` playground mod, use the same commands from inside `Archie-Test/` instead -(e.g. `./gradlew fabric-test:runClient`). +To run the `archie-test` playground mod, use the same task names against its own modules instead +(e.g. `./gradlew archie-test-fabric:runClient`). ## Conventions that matter - Add gameplay/library logic in `common` first, then platform-specific `actual` code only when needed. - Keep `expect/actual` triplets named `*.common.kt`, `*.fabric.kt`, `*.neoforge.kt`. -- Register packet classes and handlers before calling `register()` on `NetworkChannel`. +- Register packet classes and handlers before calling `register()` on `ArchieNetworkChannel`. - Keep loader manifests tokenized (`${mod_id}`, `${versions.*}`); values come from Gradle properties/version catalog. - Use `bundleRuntimeLibrary(...)` / `bundleMod(...)` for shipped runtime deps in loader modules. +- Runtime-needed-by-`Archie.kt` code (conditions, ingredients, common tags) lives in `core`, even + though the datagen DSL that also touches it lives in `datagen` - `core` never depends on + `datagen`/`gametest`. ## Key files -- `Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt` -- `Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt` -- `Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt` -- `Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt` +- `core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt` +- `core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.kt` +- `core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt` +- `core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt` - `gradle/libs.versions.toml` - diff --git a/build.gradle.kts b/build.gradle.kts index ba8366316..cf9722cdb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,48 +1,290 @@ +import net.fabricmc.loom.api.LoomGradleExtensionAPI +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.jetbrains.kotlin.konan.properties.loadProperties + plugins { - base + java + alias(libs.plugins.architectury) + id("net.kernelpanicsoft.actualizer") version "0.1.0" apply false + alias(libs.plugins.architectury.loom) apply false + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.compose) + alias(libs.plugins.dokka.mkdocs) + alias(libs.plugins.modfusioner) + alias(libs.plugins.modpublisher) +} + +architectury.minecraft = libs.versions.minecraft.get() + +val sharedProperties = kotlin.runCatching { + val localPropsFile = rootDir.resolve("gradle.properties") + val sharedPropsFile = rootDir.resolve("../gradle.properties") + when { + localPropsFile.exists() -> loadProperties(localPropsFile.path) + sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) + else -> null + } +}.getOrNull() + +// Not committed - local.properties (repo root) holds reposilite.username/reposilite.password for +// developer machines; CI supplies REPOSILITE_USERNAME/REPOSILITE_PASSWORD env vars instead. +val localProperties = kotlin.runCatching { + val localPropsFile = rootDir.resolve("local.properties") + if (localPropsFile.exists()) loadProperties(localPropsFile.path) else null +}.getOrNull() + +val String.prop: String? + get() = sharedProperties?.get(this)?.toString() + +val String.localOrEnv: String? + get() = System.getenv(this.uppercase()) + +subprojects { + apply(plugin = "dev.architectury.loom") + apply(plugin = "net.kernelpanicsoft.actualizer") + + val loom = project.extensions.getByName("loom") + + configure { + silentMojangMappingsLicense() + } + + repositories { + val githubUsername = "github_actor".localOrEnv + val githubToken = "github_token".localOrEnv + mavenCentral() + mavenLocal() + google { + content { + includeGroupByRegex("androidx\\..*") + includeGroupByRegex("com\\.android.*") + } + } + maven { + name = "kernelpanic releases" + url = uri("https://maven.kernelpanicsoft.net/releases") + } + maven { + name = "kernelpanic snapshots" + url = uri("https://maven.kernelpanicsoft.net/snapshots") + } + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + maven("https://maven.parchmentmc.org") + maven("https://maven.fabricmc.net/") + maven("https://maven.neoforged.net/releases/") + maven("https://maven.terraformersmc.com/releases/") + maven("https://repo.nyon.dev/releases") + maven("https://maven.isxander.dev/releases") { + name = "Xander Maven" + } + maven("https://maven.resourcefulbees.com/repository/maven-public/") { + content { + includeGroup("earth.terrarium.common_storage_lib") + } + } + maven { + url = uri("https://maven.pkg.github.com/MrCrayfish/Maven") + credentials { + username = githubUsername + password = githubToken + } + } + maven { + url = uri("https://www.cursemaven.com") + content { + includeGroup("curse.maven") + } + } + } + + @Suppress("UnstableApiUsage") + dependencies { + "minecraft"(rootProject.libs.minecraft) + "mappings"(loom.layered { + officialMojangMappings() + parchment(rootProject.libs.parchment) + }) + + compileOnly("org.jetbrains:annotations:24.1.0") + } + + // One MavenPublication per module, published to kernelpanicsoft.net's Reposilite - archie-core/ + // -datagen/-gametest are real consumable libraries; archie-test is a dev playground, never + // published (matches fusioner/dokka's own product/test split above). + if (!project.name.startsWith("archie-test-")) { + // allprojects{} (below) is what normally applies these, but it's declared after this + // subprojects{} block and hasn't run for this project yet - apply is idempotent, so + // re-applying here just guarantees ordering for the components["java"]/publishing{} access + // immediately below. + apply(plugin = "java") + apply(plugin = "maven-publish") + + extensions.configure("publishing") { + publications { + create("maven") { + artifactId = base.archivesName.get() + from(components["java"]) + } + } + + repositories { + mavenLocal() + maven { + name = "Reposilite" + val releasesUrl = "https://maven.kernelpanicsoft.net/releases" + val snapshotsUrl = "https://maven.kernelpanicsoft.net/snapshots" + + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsUrl else releasesUrl) + + credentials { + username = localProperties?.getProperty("reposilite.username") + ?: System.getenv("REPOSILITE_USERNAME") + password = localProperties?.getProperty("reposilite.password") + ?: System.getenv("REPOSILITE_PASSWORD") + } + } + } + } + } } allprojects { - repositories { - mavenCentral() - mavenLocal() - } + apply(plugin = "java") + apply(plugin = "org.jetbrains.kotlin.jvm") + apply(plugin = "org.jetbrains.kotlin.plugin.serialization") + apply(plugin = "org.jetbrains.kotlin.plugin.compose") + apply(plugin = "org.jetbrains.compose") + apply(plugin = "dev.opensavvy.dokka-mkdocs") + apply(plugin = "architectury-plugin") + apply(plugin = "maven-publish") + + version = "mod_version".prop ?: "0.0.1-SNAPSHOT" + group = "mod_group".prop ?: "net.kernelpanicsoft" + base.archivesName = "archie-core" + + tasks.withType().configureEach { + options.encoding = "UTF-8" + options.release.set(21) + } + + kotlin { + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + } + + architectury { + compileOnly() + } + + dokka { + dokkaGeneratorIsolation = ClassLoaderIsolation() + } + + java.withSourcesJar() +} + +// Merges only archie-core's fabric+neoforge jars into one artifact - datagen/gametest/test each +// ship as their own separate mod and are never fused/published. +fusioner { + packageGroup = project.group.toString() + mergedJarName = "${project.base.archivesName.get()}-merged-${libs.versions.minecraft.get()}" + jarVersion = project.version.toString() + outputDirectory = "build/artifacts" + + fabric { + projectName = "archie-core-fabric" + inputTaskName = "remapJar" + } + + neoforge { + projectName = "archie-core-neoforge" + inputTaskName = "remapJar" + } +} + +publisher { + apiKeys { + curseforge("curseforge_api_key".localOrEnv) + modrinth("modrinth_api_key".localOrEnv) + } + + debug = true + + curseID = "1029738" + modrinthID = "archie" + githubRepo = "https://github.com/kernel-panic-codecave/Archie" + + projectVersion = "${libs.versions.minecraft.get()}-${project.version}" + displayName = "Archie-Merged-${projectVersion.get()}" + gameVersions = listOf("1.21.1") + loaders = listOf("neoforge", "fabric") + curseEnvironment = "both" + versionType = "alpha" + artifact = tasks.fusejars.get() + javaVersions = listOf(JavaVersion.VERSION_21) + + changelog = file("CHANGELOG.md") + + curseDepends { + required = listOf("fabric-api", "fabric-language-kotlin", "kotlinlangforge", "architectury-api", "cloth-config") + } + + modrinthDepends { + required = listOf("fabric-api", "fabric-language-kotlin", "kotlin-lang-forge", "architectury-api", "cloth-config") + } +} + +dependencies { + dokka(project(":archie-core-common")) { isTransitive = false } + dokka(project(":archie-core-fabric")) { isTransitive = false } + dokka(project(":archie-core-neoforge")) { isTransitive = false } + dokka(project(":archie-datagen-common")) { isTransitive = false } + dokka(project(":archie-datagen-fabric")) { isTransitive = false } + dokka(project(":archie-datagen-neoforge")) { isTransitive = false } + dokka(project(":archie-gametest-common")) { isTransitive = false } + dokka(project(":archie-gametest-fabric")) { isTransitive = false } + dokka(project(":archie-gametest-neoforge")) { isTransitive = false } } tasks { - check { - dependsOn(gradle.includedBuild("Archie").task(":check")) - dependsOn(gradle.includedBuild("Archie-Test").task(":check")) - } - - register("syncRunConfigurations") { - group = "ide" - description = "Regenerates each included build's run configurations, then copies them up to the composite root's .idea folder." - - dependsOn(gradle.includedBuild("Archie").task(":fabric:ideaSyncTask")) - dependsOn(gradle.includedBuild("Archie").task(":neoforge:ideaSyncTask")) - dependsOn(gradle.includedBuild("Archie-Test").task(":fabric-test:ideaSyncTask")) - dependsOn(gradle.includedBuild("Archie-Test").task(":neoforge-test:ideaSyncTask")) - - doLast { - val targetDir = file(".idea/runConfigurations").apply { mkdirs() } - targetDir.listFiles { f -> f.extension == "xml" }?.forEach { it.delete() } - - val nameAttr = Regex("""name="([^"]*)" type="Application"""") - listOf("Archie", "Archie-Test").forEach { includedBuildName -> - val sourceDir = file("$includedBuildName/.idea/runConfigurations") - if (!sourceDir.isDirectory) return@forEach - sourceDir.listFiles { f -> f.extension == "xml" }?.forEach { source -> - val rewritten = source.readText() - .replace("\$PROJECT_DIR\$/", "\$PROJECT_DIR\$/$includedBuildName/") - .replace("name=\"Minecraft ", "name=\"$includedBuildName ") - - val displayName = nameAttr.find(rewritten)?.groupValues?.get(1) ?: source.nameWithoutExtension - val sanitized = displayName.map { if (it.isLetterOrDigit()) it else '_' }.joinToString("") - - file("$targetDir/$sanitized.xml").writeText(rewritten) - } - } - } - } + build { + finalizedBy(fusejars) + } + assemble { + finalizedBy(fusejars) + } + named("publish") { + dependsOn(publishMod) + } + register("publishDocs") { + dependsOn(getByName("embedDokkaIntoMkDocs")) + group = "publishing" + val tag = rootProject.version.toString().substringBeforeLast(".") + workingDir = rootDir + commandLine("mike", "deploy", "--push", "--update-aliases", tag, "latest") + } + // modpublisher's changelog reads CHANGELOG.md straight off disk when a publish task runs - it + // doesn't know about git tags or PRs. .github/workflows/release-notes.yaml (reactive, post-tag) + // can't help here: by the time it would generate this release's entry, the publish task attached + // to the tag has already read (and shipped) whatever was on disk before. This task closes that + // gap by generating CHANGELOG.md synchronously - see .github/scripts/generate_release_notes.py's + // module docstring for the two call shapes. + register("generateChangelog") { + group = "publishing" + workingDir = rootDir + commandLine( + "python3", ".github/scripts/generate_release_notes.py", + "--repo", "mod_source".prop!!.removePrefix("https://github.com/"), + "--new-tag", "v${project.version}", + "--range-end", "HEAD", + "--changelog-path", "CHANGELOG.md", + ) + } + listOf("publishCurseforge", "publishModrinth", "publishGitHub", "publishMod").forEach { + named(it) { dependsOn(getByName("generateChangelog")) } + } } diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts new file mode 100644 index 000000000..4038110c6 --- /dev/null +++ b/core/common/build.gradle.kts @@ -0,0 +1,97 @@ +import org.jetbrains.kotlin.konan.properties.loadProperties + +architectury { + common("fabric", "neoforge") +} + +actualizer { + stubUnfulfilledExpects() +} + +val sharedProperties = kotlin.runCatching { + val localPropsFile = rootDir.resolve("gradle.properties") + val sharedPropsFile = rootDir.resolve("../gradle.properties") + when { + localPropsFile.exists() -> loadProperties(localPropsFile.path) + sharedPropsFile.exists() -> loadProperties(sharedPropsFile.path) + else -> null + } +}.getOrNull() + +val String.prop: String? + get() = sharedProperties?.get(this)?.toString() + +loom { + accessWidenerPath = file("src/main/resources/${"mod_id".prop}.accesswidener") +} + +dependencies { + compileOnly(kotlin("reflect")) + implementation(libs.junit.jupiter.api) + compileOnly(libs.kotlinx.coroutines.test) + testImplementation(libs.junit.jupiter.api) + testImplementation(kotlin("reflect")) + testRuntimeOnly(libs.junit.jupiter.engine) + api(libs.kotlinx.serialization) + api(libs.kotlinx.serialization.json) + api(libs.kotlinx.serialization.nbt) { isTransitive = false } + api(libs.kotlinx.serialization.toml) { isTransitive = false } + api(libs.kotlinx.serialization.json5) { isTransitive = false } + api(libs.kotlinx.serialization.cbor) { isTransitive = false } + api(compose.runtime) + // Used only for the fabric @Environment annotations + mixin deps. Do NOT use other classes + // from fabric loader from common code. + modImplementation(libs.fabric.loader) + + modApi(libs.rei.common) + modCompileOnly(libs.clothConfig.common) + modApi(libs.architectury.common) + modApi(libs.storage.common) + modApi(libs.storage.resources.common) +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-common") + + val verifyGuiSpriteAssets by registering { + group = "verification" + description = "Verifies GUI sprite metadata files have matching PNG assets." + + doLast { + val spritesDir = file("src/main/resources/assets/archie/textures/gui/sprites") + if (!spritesDir.exists()) return@doLast + + val missingPng = spritesDir + .walkTopDown() + .filter { it.isFile && it.name.endsWith(".png.mcmeta") } + .map { it to file(it.path.removeSuffix(".mcmeta")) } + .filter { (_, png) -> !png.exists() } + .map { (meta, _) -> meta.relativeTo(projectDir).invariantSeparatorsPath } + .toList() + + if (missingPng.isNotEmpty()) { + val details = missingPng.joinToString(separator = "\n") { " - $it" } + throw GradleException( + "Found GUI sprite metadata files without matching PNGs:\n$details" + ) + } + } + } + + named("check") { + dependsOn(verifyGuiSpriteAssets) + } + + jar { + from(sourceSets.main.get().output) + exclude("**/*StubKt.class") + } + + sourcesJar { + exclude("**/*Stub.kt") + } + + test { + useJUnitPlatform() + } +} diff --git a/Archie/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java b/core/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java similarity index 63% rename from Archie/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java rename to core/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java index 30e433a7a..29ace0163 100644 --- a/Archie/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java +++ b/core/common/src/main/java/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthContext.java @@ -11,11 +11,31 @@ public final class SlotLayerDepthContext { private static final ThreadLocal> DEPTHS = ThreadLocal.withInitial(ArrayDeque::new); + private static final ThreadLocal PENDING_OVERRIDE = new ThreadLocal<>(); private SlotLayerDepthContext() { } + /** + * Hands off a depth override computed while still inside {@code renderSlot} (see + * AbstractContainerScreenMixin) to the loader-specific mixin that wraps the actual + * {@code GuiGraphics#renderItem} call - NeoForge moved that call out of {@code renderSlot} + * into its own {@code renderSlotContents} method, so the two can no longer share a + * {@code @Unique} field on one mixin class. + */ + public static void setPendingOverride(Float depth) + { + PENDING_OVERRIDE.set(depth); + } + + public static Float takePendingOverride() + { + Float depth = PENDING_OVERRIDE.get(); + PENDING_OVERRIDE.remove(); + return depth; + } + public static void push(float depth) { Deque depths = DEPTHS.get(); diff --git a/Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenDepthMixin.java b/core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenDepthMixin.java similarity index 100% rename from Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenDepthMixin.java rename to core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenDepthMixin.java diff --git a/core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java b/core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java new file mode 100644 index 000000000..e4d69b4c1 --- /dev/null +++ b/core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/AbstractContainerScreenMixin.java @@ -0,0 +1,53 @@ +package net.kernelpanicsoft.archie.mixin.client.gui; + +import net.kernelpanicsoft.archie.Archie; +import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; +import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthProvider; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +@Debug(export = true) +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenMixin extends Screen implements MenuAccess +{ + protected AbstractContainerScreenMixin(Component title) + { + super(title); + } + + /** + * Computes the depth override and hands it off via {@link SlotLayerDepthContext} rather than + * a {@code @Unique} field - the actual {@code GuiGraphics#renderItem} call this override + * applies to is wrapped by a loader-specific mixin (NeoForge moved it out of this method into + * its own {@code renderSlotContents}, see AbstractContainerScreenItemRenderMixin in each + * loader module), so the two can no longer be @Unique fields on the same mixin class. + */ + @ModifyArgs(method = "renderSlot", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V")) + private void archie$adjustSlotLayer(Args args, GuiGraphics guiGraphics, Slot slot) + { + float originalZ = args.get(2); + float adjustedZ = originalZ; + Float custom = null; + if (this instanceof SlotLayerDepthProvider provider) + { + custom = provider.slotRenderLayerOffset(slot); + if (custom != null) + { + adjustedZ = custom; + Archie.LOGGER.debug("Adjusting slot layer depth for {} to {}", slot, custom); + } + } + SlotLayerDepthContext.setPendingOverride(custom); + args.set(2, adjustedZ); + } +} diff --git a/Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/GuiGraphicsMixin.java b/core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/GuiGraphicsMixin.java similarity index 100% rename from Archie/common/src/main/mixin/net/kernelpanicsoft/archie/mixin/client/gui/GuiGraphicsMixin.java rename to core/common/src/main/java/net/kernelpanicsoft/archie/mixin/client/gui/GuiGraphicsMixin.java diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt similarity index 89% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt index f52e8685e..2a18dba08 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.kt @@ -10,16 +10,12 @@ import net.kernelpanicsoft.archie.config.CategorySpec import net.kernelpanicsoft.archie.config.ConfigContainer import net.kernelpanicsoft.archie.config.ConfigSpec import net.kernelpanicsoft.archie.config.DataSpec -import net.kernelpanicsoft.archie.data.ADataGeneratorPlatform import net.kernelpanicsoft.archie.data.common.conditions.ABuiltinConditions import net.kernelpanicsoft.archie.data.common.crafting.ingredients.ABuiltinIngredients -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags -import net.kernelpanicsoft.archie.data.internal.ArchieDatagen -import net.kernelpanicsoft.archie.events.AEvents -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform -import net.kernelpanicsoft.archie.gametest.AGameTestSide -import net.kernelpanicsoft.archie.gametest.ThreadingImpl -import net.kernelpanicsoft.archie.gametest.internal.ArchieGameTest +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestSide +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl import net.kernelpanicsoft.archie.gui.blockentity.BlockEntityStateManager import net.kernelpanicsoft.archie.gui.item.ItemStateManager import net.kernelpanicsoft.archie.gui.theme.ThemeManifestResourceListener @@ -56,10 +52,10 @@ object Archie /** * Initializes Archie's shared (loader-independent) systems. * - * Registers Archie with [AEvents], wires up networking (skipped only for a server-only - * gametest run, since Architectury's networking registration touches client-only classes), - * initializes block entity state syncing, built-in data providers, and Archie's own config, - * and activates the datagen/gametest code paths when running under those tasks. + * Wires up networking (skipped only for a server-only gametest run, since Architectury's + * networking registration touches client-only classes), initializes block entity state + * syncing, built-in data providers, and Archie's own config. Datagen/GameTest code paths are + * activated separately, by archie-datagen/archie-gametest's own mod entrypoints. * * @throws IllegalStateException if running on LexForge, which is not supported. */ @@ -69,7 +65,6 @@ object Archie if (Platform.isMinecraftForge()) error("LexForge is not supported. Switch to NeoForge, or don't use my mods.") - AEvents += MOD if (!AGameTestPlatform.isGameTest || AGameTestPlatform.side == AGameTestSide.CLIENT) { ArchieNetworkChannel.init() @@ -82,12 +77,6 @@ object Archie ACommonTags.init() Config.init() - - // Datagen and GameTest code paths are only activated in dedicated run configs. - if (AGameTestPlatform.isGameTest) - ArchieGameTest.init() - if (ADataGeneratorPlatform.isDataGen) - ArchieDatagen.init() onClient { ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, ThemeManifestResourceListener(), Archie % "theme_manifest") ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, ThemeResourceListener(), Archie % "theme") diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/block/entity/NBTBlockEntity.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/block/entity/NBTBlockEntity.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/block/entity/NBTBlockEntity.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/block/entity/NBTBlockEntity.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CategorySpec.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CategorySpec.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CategorySpec.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CategorySpec.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigContainer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigContainer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigContainer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigContainer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigSpec.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigSpec.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigSpec.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientConfigSpec.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientDataSpec.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientDataSpec.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientDataSpec.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ClientDataSpec.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CommonKeyCode.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CommonKeyCode.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CommonKeyCode.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/CommonKeyCode.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigContainer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigContainer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigContainer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigContainer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigSpec.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigSpec.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigSpec.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/ConfigSpec.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/DataSpec.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/DataSpec.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/DataSpec.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/DataSpec.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/FieldType.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/FieldType.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/FieldType.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/FieldType.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/IConfigSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/IConfigSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/IConfigSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/IConfigSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorListBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorListBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorListBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorListBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ColorMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ConfigFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ConfigFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ConfigFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ConfigFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DoubleMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DoubleMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DoubleMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DoubleMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DropdownFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DropdownFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DropdownFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/DropdownFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/FloatMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/FloatMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/FloatMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/FloatMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/IntegerMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/IntegerMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/IntegerMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/IntegerMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeListBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeListBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeListBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeListBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/KeycodeMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ListFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ListFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ListFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/ListFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/LongMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/LongMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/LongMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/LongMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/MapFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/MapFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/MapFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/MapFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryListBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryListBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryListBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryListBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/RegistryMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecFieldBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecFieldBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecFieldBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecFieldBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecListBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecListBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecListBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecListBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/SpecMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/StringMapBuilder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/StringMapBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/StringMapBuilder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/StringMapBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/extensions.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/extensions.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/extensions.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/builder/extensions.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/entry/ConfigSpecEntry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/entry/ConfigSpecEntry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/entry/ConfigSpecEntry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/entry/ConfigSpecEntry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/extensions.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/extensions.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/extensions.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/extensions.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/Json5ConfigSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/Json5ConfigSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/Json5ConfigSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/Json5ConfigSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/JsonConfigSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/JsonConfigSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/JsonConfigSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/JsonConfigSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/NullConfigSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/NullConfigSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/NullConfigSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/NullConfigSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/TomlConfigSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/TomlConfigSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/TomlConfigSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/config/serializer/TomlConfigSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AAndCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AAndCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AAndCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AAndCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ABuiltinConditions.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ABuiltinConditions.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ABuiltinConditions.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ABuiltinConditions.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt similarity index 51% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt index 425be65ae..509503761 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.common.kt @@ -2,28 +2,20 @@ package net.kernelpanicsoft.archie.data.common.conditions import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec -import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider -import net.minecraft.core.HolderLookup -import net.minecraft.data.recipes.RecipeOutput -import net.minecraft.data.recipes.RecipeProvider import net.minecraft.resources.ResourceLocation -import java.util.concurrent.CompletableFuture /** * Cross-loader hooks that plug [IACondition] into each loader's native datapack condition * system, since Fabric and NeoForge each have their own recipe/tag condition machinery. + * + * Datagen-only condition plumbing (attaching a condition to a generated recipe) lives separately + * in archie-datagen's `ADatagenConditionsPlatform`, since it needs no runtime presence. */ expect object AConditionsPlatform { /** Registers condition type keyed by [identifier], decodable with [codec]; backs [IACondition.register]. */ fun register(identifier: ResourceLocation, codec: MapCodec) - /** Attaches [condition] to the next recipe written to [output] via the loader's native mechanism. */ - fun withCondition(output: RecipeOutput, condition: IACondition): RecipeOutput - /** The dispatch codec decoding any registered [IACondition]; backs [IACondition.CODEC]. */ fun codec(): Codec - - /** Wraps [child] in a loader-specific [RecipeProvider] so [withCondition] can attach conditions on Fabric; `null` where not needed. */ - fun fabricRecipeProvider(child: ARecipeProvider, registries: CompletableFuture): RecipeProvider? -} \ No newline at end of file +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AEqualsCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AEqualsCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AEqualsCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AEqualsCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AFalseCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AFalseCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AFalseCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AFalseCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AGroupCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AGroupCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AGroupCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AGroupCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AModLoadedCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AModLoadedCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AModLoadedCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AModLoadedCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ANotCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ANotCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ANotCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ANotCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AOrCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AOrCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AOrCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AOrCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/APlatformCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/APlatformCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/APlatformCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/APlatformCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ARegistryCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ARegistryCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ARegistryCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ARegistryCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ATrueCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ATrueCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ATrueCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/ATrueCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AXorCondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AXorCondition.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AXorCondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AXorCondition.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt similarity index 96% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt index de779e370..a5b1fae2b 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/IACondition.kt @@ -16,7 +16,7 @@ import net.minecraft.tags.TagKey * * Built-in implementations live alongside this file (e.g. [AAndCondition], [AOrCondition], * [ANotCondition], [ATrueCondition], [AModLoadedCondition], [ARegistryCondition]); see - * [ABuiltinConditions] for the full set and [AConditionBuilder] for a DSL to combine them. + * [ABuiltinConditions] for the full set and `archie-datagen`'s `AConditionBuilder` for a DSL to combine them. * Register custom conditions with [register]. */ interface IACondition diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAllIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAllIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAllIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAllIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAnyIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAnyIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAnyIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AAnyIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ABuiltinIngredients.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ABuiltinIngredients.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ABuiltinIngredients.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ABuiltinIngredients.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACombinedIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACombinedIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACombinedIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACombinedIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AComponentsIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AComponentsIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AComponentsIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/AComponentsIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomDataIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomDataIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomDataIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomDataIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredient.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredient.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredient.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredient.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientHolder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientHolder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientHolder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientHolder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientSerializer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientSerializer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientSerializer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/IACustomIngredientSerializer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ACommonTags.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/platform/ACommonTags.kt similarity index 99% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ACommonTags.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/platform/ACommonTags.kt index af825addb..e9b596d06 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ACommonTags.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/platform/ACommonTags.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.data.common.tags +package net.kernelpanicsoft.archie.data.common.tags.platform import net.minecraft.core.Registry import net.minecraft.core.registries.Registries diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.common.kt similarity index 85% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.common.kt index 94c57929b..424f496d1 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.common.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.common.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.data +package net.kernelpanicsoft.archie.data.platform /** * Cross-loader switch reporting whether the current run is a datagen run. diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/ABasicEventObject.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/ABasicEventObject.kt similarity index 89% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/ABasicEventObject.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/ABasicEventObject.kt index 6556c99e8..d85a42fbd 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/ABasicEventObject.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/ABasicEventObject.kt @@ -1,11 +1,11 @@ -package net.kernelpanicsoft.archie.events +package net.kernelpanicsoft.archie.events.base import dev.architectury.event.Event /** * A simpler alternative to [AEventObject] for wrapping an Architectury [event] that isn't * scoped to a particular [dev.architectury.platform.Mod] and doesn't need a - * [AEvents.HandlerConstructor]. + * [HandlerConstructor]. * * @param T The Architectury handler/listener type expected by [event]. */ diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEventObject.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/AEventObject.kt similarity index 59% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEventObject.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/AEventObject.kt index 5ae408e7f..a4c456b84 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEventObject.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/events/base/AEventObject.kt @@ -1,22 +1,32 @@ -package net.kernelpanicsoft.archie.events +package net.kernelpanicsoft.archie.events.base import dev.architectury.event.Event import dev.architectury.platform.Mod +/** Marker for a mod-scoped Architectury event listener created by a [HandlerConstructor]. */ +interface Handler + +/** Builds a mod-scoped [H] whose body invokes `block` on the event's [T] payload. */ +fun interface HandlerConstructor> +{ + /** Creates an [H] for [mod] that runs [block] against the [T] payload when invoked. */ + fun create(mod: Mod, block: T.() -> Unit): H +} + /** - * Base class for Archie's mod-scoped Architectury event wrappers, such as - * [AEvents.GatherDataHandler] and [AEvents.RegisterGameTestHandler]. + * Base class for a mod-scoped Architectury event wrapper (e.g. `archie-datagen`'s + * `GatherDataHandler`, `archie-gametest`'s `RegisterGameTestHandler`). * * Subclasses wire together an Architectury [event], the [handlerConstructor] that builds a * [mod]-scoped [H] from a [T] callback, and the [handler] logic itself, then call [init] once * (idempotently, thread-safely) to register with the underlying event. * * @param T The event payload/receiver type passed to [handler]. - * @param H The [AEvents.Handler] type produced for [mod]. - * @param C The [AEvents.HandlerConstructor] that builds an [H]. + * @param H The [Handler] type produced for [mod]. + * @param C The [HandlerConstructor] that builds an [H]. * @param mod The [Mod] this event object is scoped to. */ -abstract class AEventObject, C : AEvents.HandlerConstructor>(val mod: Mod) +abstract class AEventObject, C : HandlerConstructor>(val mod: Mod) { /** The underlying Architectury event this wrapper registers a handler with. */ abstract val event: Event @@ -44,4 +54,4 @@ abstract class AEventObject, C : AEvents.HandlerConstr initialized = true } } -} \ No newline at end of file +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.common.kt similarity index 94% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.common.kt index 83c95fae7..fba247ac7 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.common.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.common.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import java.nio.file.Path import java.util.Properties diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.common.kt similarity index 67% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.common.kt index e86cc366f..fe315d56f 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.common.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.common.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import dev.architectury.platform.Mod import dev.architectury.utils.Env @@ -32,19 +32,20 @@ expect object AGameTestPlatform } /** - * Restricts which [AEvents.REGISTER_GAME_TEST]-registered mods a single `runGametest`/ + * Restricts which `AGametestEvents.REGISTER_GAME_TEST`-registered mods a single `runGametest`/ * `runGametestClient` invocation actually runs, via the [GAMETEST_MOD_ID_FILTER_PROPERTY] * system property (a comma-separated list of mod ids). * - * Every mod that has called `AEvents += MOD` shares one JVM-wide [AEvents.MODS] list - which - * matters because a composite build's included builds can *both* end up in that list within - * the same process. Archie-Test's Loom `runs{}` blocks `includeBuild("../Archie")`, and both - * `Archie` and `ArchieTest`'s mod init call `AEvents += MOD`, so launching Archie-Test's own - * `runGametestClient`/`runGametest` previously ran Archie's *entire* GameTest suite a second - * time in the same process, without Archie-Test's own suite being any bigger - only - * distinguishable by the test count not matching the log's actual line count. Every loader's - * `AGameTestPlatformInternal`/`AClientGameTestHarness` server- and client-side test collection - * should call [selectMods] on [AEvents.MODS] before iterating, instead of iterating it directly. + * Every mod that has called `AGametestEvents += MOD` (in `archie-gametest`) shares one JVM-wide + * `MODS` list - which matters because a composite build's included builds can *both* end up in + * that list within the same process. Archie-Test's Loom `runs{}` blocks + * `includeBuild("../Archie")`, and both `Archie` and `ArchieTest`'s mod init call + * `AGametestEvents += MOD`, so launching Archie-Test's own `runGametestClient`/`runGametest` + * previously ran Archie's *entire* GameTest suite a second time in the same process, without + * Archie-Test's own suite being any bigger - only distinguishable by the test count not matching + * the log's actual line count. Every loader's `AGameTestRegistrationBridge`/ + * `AClientGameTestHarness` server- and client-side test collection should call [selectMods] on + * `AGametestEvents.MODS` before iterating, instead of iterating it directly. */ object AGameTestModFilter { private const val GAMETEST_MOD_ID_FILTER_PROPERTY = "archie.gametest.modid" diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ThreadingImpl.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ThreadingImpl.kt similarity index 99% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ThreadingImpl.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ThreadingImpl.kt index 08367c1bb..06d815915 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ThreadingImpl.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ThreadingImpl.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import net.minecraft.client.Minecraft import java.util.concurrent.Phaser @@ -27,7 +27,7 @@ private val serverRegisteredThread = AtomicReference(null) * the gametest thread to client/server threads. */ object ThreadingImpl { - private const val THREAD_IMPL_CLASS_NAME = "net.kernelpanicsoft.archie.gametest.ThreadingImpl" + private const val THREAD_IMPL_CLASS_NAME = "net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl" private const val TASK_ON_THIS_THREAD_METHOD_NAME = "runTaskOnThisThread" private const val TASK_ON_OTHER_THREAD_METHOD_NAME = "runTaskOnOtherThread" private const val PHASE_MASK = 3 diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/AUIScopeManager.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/AUIScopeManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/AUIScopeManager.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/AUIScopeManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeBlockContainerMenu.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeBlockContainerMenu.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeBlockContainerMenu.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeBlockContainerMenu.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerMenuBase.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerMenuBase.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerMenuBase.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerMenuBase.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerScreen.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerScreen.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerScreen.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeContainerScreen.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt similarity index 99% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt index 9a27044e3..e4ebdbfe7 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt +++ b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/ComposeScreen.kt @@ -31,7 +31,7 @@ val LocalScreen: ProvidableCompositionLocal = * poll for a settled frame (no pending or in-flight recomposition) before asserting on rendered * output - e.g. before taking a screenshot right after simulating a click. */ -internal interface ComposeIdleAware { +interface ComposeIdleAware { /** `true` when there is no snapshot-write notification, frame request, or recompose job pending. */ fun isComposeIdle(): Boolean } @@ -63,7 +63,7 @@ interface LayerManagerProvider * `AGameTestPlatform.isGameTest`) construct the actual `StandardTestDispatcher`/ * `TestCoroutineScheduler` instances installed here. */ -internal object ComposeTestClockOverride { +object ComposeTestClockOverride { /** The dispatcher to back new [ComposeScreen]s' coroutine scope with, in place of [kotlinx.coroutines.Dispatchers.Default]. */ @Volatile var dispatcher: CoroutineDispatcher? = null diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/Slot.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/Slot.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/Slot.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/Slot.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotHighlightClipProvider.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotHighlightClipProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotHighlightClipProvider.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotHighlightClipProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthProvider.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthProvider.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/access/SlotLayerDepthProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/animation/Animation.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/animation/Animation.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/animation/Animation.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/animation/Animation.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateComposables.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateComposables.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateComposables.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateComposables.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateContainer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateContainer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateContainer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateContainer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateManager.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateManager.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStateManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacket.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacket.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacket.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacket.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacketRegistry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacketRegistry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacketRegistry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityStatePacketRegistry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityUpdatePacket.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityUpdatePacket.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityUpdatePacket.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/BlockEntityUpdatePacket.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/ComposeBlockEntityState.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/ComposeBlockEntityState.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/ComposeBlockEntityState.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/blockentity/ComposeBlockEntityState.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Divider.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Divider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Divider.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Divider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/EnergyBar.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/EnergyBar.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/EnergyBar.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/EnergyBar.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/FluidTank.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/FluidTank.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/FluidTank.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/FluidTank.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Icon.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Icon.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Icon.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Icon.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/ProgressBar.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/ProgressBar.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/ProgressBar.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/ProgressBar.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Spacer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Spacer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Spacer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Spacer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Text.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Text.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Text.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Text.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Texture.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Texture.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Texture.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/basic/Texture.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Collapsible.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Collapsible.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Collapsible.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Collapsible.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/ContainerPanel.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/ContainerPanel.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/ContainerPanel.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/ContainerPanel.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Panel.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Panel.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Panel.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Panel.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/RootContainer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/RootContainer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/RootContainer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/RootContainer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Scrollable.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Scrollable.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Scrollable.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Scrollable.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Surface.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Surface.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Surface.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/Surface.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/TabContainer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/TabContainer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/TabContainer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/containers/TabContainer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Button.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Button.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Button.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Button.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Checkbox.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Checkbox.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Checkbox.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Checkbox.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Clickable.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Clickable.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Clickable.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Clickable.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/ColorPicker.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/ColorPicker.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/ColorPicker.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/ColorPicker.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Radio.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Radio.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Radio.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Radio.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Slider.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Slider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Slider.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Slider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Switch.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Switch.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Switch.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/Switch.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextField.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextField.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextField.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextField.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldCore.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldCore.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldCore.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldCore.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldValue.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldValue.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldValue.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/input/textfield/TextFieldValue.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/ConfirmDialog.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/ConfirmDialog.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/ConfirmDialog.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/ConfirmDialog.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/DialogPrimitives.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/DialogPrimitives.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/DialogPrimitives.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/modal/DialogPrimitives.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/TextureStates.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/TextureStates.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/TextureStates.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/TextureStates.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/WidgetState.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/WidgetState.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/WidgetState.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/composables/theme/WidgetState.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemContainerMenu.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemContainerMenu.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemContainerMenu.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemContainerMenu.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemState.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemState.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemState.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ComposeItemState.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemContainerAccess.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemContainerAccess.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemContainerAccess.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemContainerAccess.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateComposables.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateComposables.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateComposables.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateComposables.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateManager.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateManager.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStateManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacket.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacket.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacket.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacket.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacketRegistry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacketRegistry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacketRegistry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemStatePacketRegistry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemUpdatePacket.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemUpdatePacket.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemUpdatePacket.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/ItemUpdatePacket.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/SyncedItemHolder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/SyncedItemHolder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/SyncedItemHolder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/item/SyncedItemHolder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/Layer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/Layer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/Layer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/Layer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/LayerStackManager.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/LayerStackManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/LayerStackManager.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layer/LayerStackManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Alignment.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Alignment.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Alignment.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Alignment.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Arrangement.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Arrangement.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Arrangement.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Arrangement.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Box.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Box.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Box.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Box.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Column.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Column.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Column.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Column.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Helpers.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Helpers.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Helpers.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Helpers.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntCoordinates.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntCoordinates.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntCoordinates.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntCoordinates.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntRect.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntRect.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntRect.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/IntRect.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Layout.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Layout.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Layout.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Layout.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutDirection.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutDirection.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutDirection.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutDirection.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutNode.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutNode.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutNode.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/LayoutNode.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/MeasurePolicy.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/MeasurePolicy.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/MeasurePolicy.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/MeasurePolicy.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Row.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Row.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Row.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Row.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/RowColumnMeasurePolicy.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/RowColumnMeasurePolicy.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/RowColumnMeasurePolicy.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/RowColumnMeasurePolicy.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Size.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Size.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Size.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/layout/Size.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Constraints.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Constraints.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Constraints.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Constraints.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DebugModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DebugModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DebugModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DebugModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DrawModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DrawModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DrawModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/DrawModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/LayoutChangingModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/LayoutChangingModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/LayoutChangingModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/LayoutChangingModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Modifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Modifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Modifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/Modifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnGloballyPositionedModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnGloballyPositionedModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnGloballyPositionedModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnGloballyPositionedModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnSizeChangedModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnSizeChangedModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnSizeChangedModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/OnSizeChangedModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/SizeModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/SizeModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/SizeModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/SizeModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BackgroundModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BackgroundModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BackgroundModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BackgroundModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BorderModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BorderModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BorderModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/BorderModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TextureModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TextureModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TextureModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TextureModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TooltipModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TooltipModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TooltipModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/appearance/TooltipModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/InputEvent.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/InputEvent.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/InputEvent.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/InputEvent.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnCharTypedModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnCharTypedModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnCharTypedModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnCharTypedModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnKeyEventModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnKeyEventModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnKeyEventModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnKeyEventModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnPointerEventModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnPointerEventModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnPointerEventModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/input/OnPointerEventModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/MarginModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/MarginModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/MarginModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/MarginModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/OffsetModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/OffsetModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/OffsetModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/OffsetModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/PaddingModifier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/PaddingModifier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/PaddingModifier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/PaddingModifier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/ZIndex.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/ZIndex.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/ZIndex.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/modifiers/position/ZIndex.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/LayoutNodeApplier.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/LayoutNodeApplier.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/LayoutNodeApplier.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/LayoutNodeApplier.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/UINode.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/UINode.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/UINode.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/nodes/UINode.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/ComposableTheme.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/ComposableTheme.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/ComposableTheme.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/ComposableTheme.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/Theme.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/Theme.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/Theme.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/theme/Theme.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/HsvColor.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/HsvColor.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/HsvColor.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/HsvColor.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/KColor.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/KColor.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/KColor.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/KColor.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/GuiGraphics.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/GuiGraphics.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/GuiGraphics.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/GuiGraphics.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/Screen.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/Screen.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/Screen.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/Screen.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/VertexConsumer.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/VertexConsumer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/VertexConsumer.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/gui/util/extension/VertexConsumer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/IPacketContext.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/IPacketContext.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/IPacketContext.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/IPacketContext.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/NetworkChannel.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.common.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.common.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ACreativeTabRegistry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ACreativeTabRegistry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ACreativeTabRegistry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ACreativeTabRegistry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ADeferredRegistryHolder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ADeferredRegistryHolder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ADeferredRegistryHolder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/ADeferredRegistryHolder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/BlockRegistryHelper.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/BlockRegistryHelper.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/BlockRegistryHelper.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/BlockRegistryHelper.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/CreativeTabRegistryHelper.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/CreativeTabRegistryHelper.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/CreativeTabRegistryHelper.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/CreativeTabRegistryHelper.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistrarHelper.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistrarHelper.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistrarHelper.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistrarHelper.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistryHelper.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistryHelper.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistryHelper.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/RegistryHelper.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/extensions.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/extensions.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/extensions.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/registries/extensions.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/resourcepacks/SerializationReloadListener.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/resourcepacks/SerializationReloadListener.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/resourcepacks/SerializationReloadListener.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/resourcepacks/SerializationReloadListener.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ArchieDataAttachmentImpl.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ArchieDataAttachmentImpl.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ArchieDataAttachmentImpl.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ArchieDataAttachmentImpl.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/AttachmentRegistry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/AttachmentRegistry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/AttachmentRegistry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/AttachmentRegistry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/DataAttachment.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/DataAttachment.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/DataAttachment.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/DataAttachment.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/FluidStackNBTHolderImpl.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/FluidStackNBTHolderImpl.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/FluidStackNBTHolderImpl.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/FluidStackNBTHolderImpl.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ItemStackNBTHolderImpl.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ItemStackNBTHolderImpl.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ItemStackNBTHolderImpl.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ItemStackNBTHolderImpl.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/KOps.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/KOps.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/KOps.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/KOps.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBT.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBT.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBT.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBT.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolder.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolder.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolderImpl.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolderImpl.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolderImpl.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/NBTHolderImpl.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableList.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableList.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableList.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableList.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableMap.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableMap.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableMap.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/ObservableMap.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/SerializationManager.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/SerializationManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/SerializationManager.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/SerializationManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Sync.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Sync.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Sync.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Sync.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Utils.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Utils.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Utils.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/Utils.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/BuiltinSerializers.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/BuiltinSerializers.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/BuiltinSerializers.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/BuiltinSerializers.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/MinecraftSerializers.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/MinecraftSerializers.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/MinecraftSerializers.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/serialization/serializers/MinecraftSerializers.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieCapabilityExposure.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieCapabilityExposure.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieCapabilityExposure.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieCapabilityExposure.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieEnergyStorage.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieEnergyStorage.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieEnergyStorage.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieEnergyStorage.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidSlot.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidSlot.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidSlot.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidSlot.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidStorage.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidStorage.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidStorage.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieFluidStorage.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemMenuSlot.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemMenuSlot.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemMenuSlot.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemMenuSlot.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemSlot.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemSlot.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemSlot.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemSlot.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemStorage.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemStorage.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemStorage.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/ArchieItemStorage.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/VanillaMenuSlot.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/VanillaMenuSlot.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/VanillaMenuSlot.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/transfer/VanillaMenuSlot.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Array.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Array.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Array.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Array.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Component.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Component.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Component.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Component.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Env.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Env.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Env.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Env.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/MutableEntry.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/MutableEntry.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/MutableEntry.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/MutableEntry.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Properties.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Properties.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Properties.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Properties.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Reflect.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Reflect.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Reflect.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Reflect.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/ResourceLocation.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Tile.kt b/core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Tile.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Tile.kt rename to core/common/src/main/kotlin/net/kernelpanicsoft/archie/util/Tile.kt diff --git a/Archie/common/src/main/resources/archie-common.mixins.json b/core/common/src/main/resources/archie-common.mixins.json similarity index 87% rename from Archie/common/src/main/resources/archie-common.mixins.json rename to core/common/src/main/resources/archie-common.mixins.json index 04e18058b..2355de3f2 100644 --- a/Archie/common/src/main/resources/archie-common.mixins.json +++ b/core/common/src/main/resources/archie-common.mixins.json @@ -3,6 +3,7 @@ "package": "net.kernelpanicsoft.archie.mixin", "compatibilityLevel": "JAVA_17", "minVersion": "0.8", + "remap": false, "client": [ "client.gui.AbstractContainerScreenDepthMixin", "client.gui.AbstractContainerScreenMixin", @@ -11,6 +12,6 @@ "mixins": [ ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1 } -} \ No newline at end of file +} diff --git a/Archie/common/src/main/resources/archie.accesswidener b/core/common/src/main/resources/archie.accesswidener similarity index 99% rename from Archie/common/src/main/resources/archie.accesswidener rename to core/common/src/main/resources/archie.accesswidener index 72a381745..1761f9d0e 100644 --- a/Archie/common/src/main/resources/archie.accesswidener +++ b/core/common/src/main/resources/archie.accesswidener @@ -30,6 +30,7 @@ accessible class net/minecraft/world/level/levelgen/structure/templatesystem/Str accessible method net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager$Source (Ljava/util/function/Function;Ljava/util/function/Supplier;)V transitive-accessible field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager sources Ljava/util/List; transitive-mutable field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager sources Ljava/util/List; +accessible class net/minecraft/world/item/crafting/Ingredient extendable class net/minecraft/world/item/crafting/Ingredient extendable method net/minecraft/world/item/crafting/Ingredient (Ljava/util/stream/Stream;)V accessible method net/minecraft/client/gui/screens/MenuScreens register (Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/client/gui/screens/MenuScreens$ScreenConstructor;)V diff --git a/Archie/common/src/main/resources/archie.common.json b/core/common/src/main/resources/archie.common.json similarity index 100% rename from Archie/common/src/main/resources/archie.common.json rename to core/common/src/main/resources/archie.common.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java.theme.json b/core/common/src/main/resources/assets/archie/archie_themes/java.theme.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java.theme.json rename to core/common/src/main/resources/assets/archie/archie_themes/java.theme.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/button.json b/core/common/src/main/resources/assets/archie/archie_themes/java/button.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/button.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/button.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/checkbox.json b/core/common/src/main/resources/assets/archie/archie_themes/java/checkbox.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/checkbox.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/checkbox.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/dark/surface.json b/core/common/src/main/resources/assets/archie/archie_themes/java/dark/surface.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/dark/surface.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/dark/surface.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/energy_bar.json b/core/common/src/main/resources/assets/archie/archie_themes/java/energy_bar.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/energy_bar.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/energy_bar.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/fluid_tank.json b/core/common/src/main/resources/assets/archie/archie_themes/java/fluid_tank.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/fluid_tank.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/fluid_tank.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/progress_bar.json b/core/common/src/main/resources/assets/archie/archie_themes/java/progress_bar.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/progress_bar.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/progress_bar.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/radio.json b/core/common/src/main/resources/assets/archie/archie_themes/java/radio.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/radio.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/radio.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/slider.json b/core/common/src/main/resources/assets/archie/archie_themes/java/slider.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/slider.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/slider.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/slider_handle.json b/core/common/src/main/resources/assets/archie/archie_themes/java/slider_handle.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/slider_handle.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/slider_handle.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/slot.json b/core/common/src/main/resources/assets/archie/archie_themes/java/slot.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/slot.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/slot.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/small_checkbox.json b/core/common/src/main/resources/assets/archie/archie_themes/java/small_checkbox.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/small_checkbox.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/small_checkbox.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/surface.json b/core/common/src/main/resources/assets/archie/archie_themes/java/surface.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/surface.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/surface.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/switch_thumb.json b/core/common/src/main/resources/assets/archie/archie_themes/java/switch_thumb.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/switch_thumb.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/switch_thumb.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/switch_track.json b/core/common/src/main/resources/assets/archie/archie_themes/java/switch_track.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/switch_track.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/switch_track.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/tab_game.json b/core/common/src/main/resources/assets/archie/archie_themes/java/tab_game.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/tab_game.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/tab_game.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/tab_menu.json b/core/common/src/main/resources/assets/archie/archie_themes/java/tab_menu.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/tab_menu.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/tab_menu.json diff --git a/Archie/common/src/main/resources/assets/archie/archie_themes/java/text_field.json b/core/common/src/main/resources/assets/archie/archie_themes/java/text_field.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/archie_themes/java/text_field.json rename to core/common/src/main/resources/assets/archie/archie_themes/java/text_field.json diff --git a/Archie/common/src/main/resources/assets/archie/atlases/java.json b/core/common/src/main/resources/assets/archie/atlases/java.json similarity index 100% rename from Archie/common/src/main/resources/assets/archie/atlases/java.json rename to core/common/src/main/resources/assets/archie/atlases/java.json diff --git a/Archie-Test/common/src/main/resources/assets/archie_test/banner.png b/core/common/src/main/resources/assets/archie/banner.png similarity index 100% rename from Archie-Test/common/src/main/resources/assets/archie_test/banner.png rename to core/common/src/main/resources/assets/archie/banner.png diff --git a/Archie-Test/common/src/main/resources/assets/archie_test/icon.png b/core/common/src/main/resources/assets/archie/icon.png similarity index 100% rename from Archie-Test/common/src/main/resources/assets/archie_test/icon.png rename to core/common/src/main/resources/assets/archie/icon.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_disabled.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/button_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked_and_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked_and_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked_and_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_clicked_and_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/checkbox_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/energy_bar.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/fluid_tank.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/progress_bar.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked_and_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked_and_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked_and_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_clicked_and_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/radio_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_handle_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slider_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slot.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slot.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/slot.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/slot.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/small_checkbox_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_dark.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/surface_inset_dark.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_thumb_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked_and_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked_and_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked_and_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_clicked_and_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/switch_track_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_clicked_and_hovered.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_disabled.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_hovered.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_game_selected_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_clicked_and_hovered.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_disabled.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_hovered.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/tab_menu_selected_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field.png.mcmeta diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png diff --git a/Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png.mcmeta b/core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png.mcmeta similarity index 100% rename from Archie/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png.mcmeta rename to core/common/src/main/resources/assets/archie/textures/gui/sprites/java/text_field_highlighted.png.mcmeta diff --git a/Archie/common/src/main/resources/data/archie/structure/gametest/empty.nbt b/core/common/src/main/resources/data/archie/structure/gametest/empty.nbt similarity index 100% rename from Archie/common/src/main/resources/data/archie/structure/gametest/empty.nbt rename to core/common/src/main/resources/data/archie/structure/gametest/empty.nbt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/AnimationEasingTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/AnimationEasingTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/AnimationEasingTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/AnimationEasingTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ArrayUtilsTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ArrayUtilsTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ArrayUtilsTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ArrayUtilsTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/CommonTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/CommonTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/CommonTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/CommonTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GuiClientHarnessTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GuiClientHarnessTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GuiClientHarnessTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GuiClientHarnessTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/InputPrimitiveTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/InputPrimitiveTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/InputPrimitiveTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/InputPrimitiveTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/LayoutCoreTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/LayoutCoreTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/LayoutCoreTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/LayoutCoreTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/MutableEntryTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/MutableEntryTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/MutableEntryTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/MutableEntryTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/NetworkChannelValidationTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/NetworkChannelValidationTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/NetworkChannelValidationTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/NetworkChannelValidationTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/PaddingMarginTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/PaddingMarginTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/PaddingMarginTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/PaddingMarginTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ReflectionUtilsTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ReflectionUtilsTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ReflectionUtilsTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ReflectionUtilsTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ResourceLocationTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ResourceLocationTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ResourceLocationTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ResourceLocationTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableLayoutTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableLayoutTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableLayoutTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableLayoutTests.kt diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableStateSmokeTests.kt b/core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableStateSmokeTests.kt similarity index 100% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableStateSmokeTests.kt rename to core/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/ScrollableStateSmokeTests.kt diff --git a/Archie-Test/common/src/test/resources/junit-platform.properties b/core/common/src/test/resources/junit-platform.properties similarity index 100% rename from Archie-Test/common/src/test/resources/junit-platform.properties rename to core/common/src/test/resources/junit-platform.properties diff --git a/core/fabric/build.gradle.kts b/core/fabric/build.gradle.kts new file mode 100644 index 000000000..c54d928de --- /dev/null +++ b/core/fabric/build.gradle.kts @@ -0,0 +1,136 @@ +import net.kernelpanicsoft.archie.plugin.bundleMod +import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary +import net.kernelpanicsoft.archie.plugin.runtimeLibrary + +plugins { + alias(libs.plugins.shadow) + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + fabric() +} + +actualizer { + actualizes(project(":archie-core-common")) +} + +configurations { + create("common") + create("shadowCommon") + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArg("-XX:+AllowEnhancedClassRedefinition") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + } + } +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.fabric.api) + modApi(libs.architectury.fabric) + modImplementation(libs.kotlin.fabric) + compileOnly(libs.kotlinx.serialization) + bundleRuntimeLibrary(libs.kotlinx.serialization) + bundleRuntimeLibrary(libs.kotlinx.serialization.json) + bundleRuntimeLibrary(libs.kotlinx.serialization.nbt) + bundleRuntimeLibrary(libs.kotlinx.serialization.toml) + bundleRuntimeLibrary(libs.kotlinx.serialization.json5) + bundleRuntimeLibrary(libs.kotlinx.serialization.cbor) + bundleRuntimeLibrary(compose.runtime) + modLocalRuntime(libs.rei.fabric) + modCompileOnlyApi(libs.modmenu) + modCompileOnlyApi(libs.catalogue.fabric) + modLocalRuntime(libs.catalogue.fabric) + modLocalRuntime(libs.menulogue.fabric) + modCompileOnlyApi(libs.clothConfig.fabric) + modLocalRuntime(libs.clothConfig.fabric) + bundleMod(libs.storage.fabric) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + runtimeLibrary(libs.kotlinx.coroutines.test) + + "common"(project(":archie-core-common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":archie-core-common", "transformProductionFabric")) { isTransitive = false } +} + +modResources { + filesMatching.add("fabric.mod.json") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-fabric") + + test { + useJUnitPlatform() + } + + processResources { + from(project(":archie-core-common").sourceSets.main.get().resources) { + include("assets/archie/**") + include("data/archie/**") + include("archie-common.mixins.json") + include("archie.common.json") + include("archie.accesswidener") + } + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + shadowJar { + configurations = + listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) + archiveClassifier.set("dev-shadow") + } + + remapJar { + injectAccessWidener.set(true) + inputFile.set(shadowJar.get().archiveFile) + dependsOn(shadowJar) + } + + jar.get().archiveClassifier.set("dev") + + jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(project(":archie-core-common").sourceSets.main.get().output) + } + + sourcesJar { + val commonSources = project(":archie-core-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/ArchieMixinPlugin.java b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/ArchieMixinPlugin.java similarity index 100% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/ArchieMixinPlugin.java rename to core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/ArchieMixinPlugin.java diff --git a/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenItemRenderMixin.java b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenItemRenderMixin.java new file mode 100644 index 000000000..829b9e0aa --- /dev/null +++ b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenItemRenderMixin.java @@ -0,0 +1,52 @@ +package net.kernelpanicsoft.archie.mixin.fabric.client.gui; + +import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * Wraps the {@code GuiGraphics#renderItem} call inside vanilla's own {@code renderSlot} with the + * depth override {@code AbstractContainerScreenMixin#archie$adjustSlotLayer} computed just before + * it. NeoForge's own patched {@code AbstractContainerScreen} moves this call into a separate + * {@code renderSlotContents} method, hence a per-loader mixin - see the NeoForge module's own + * copy of this class. + */ +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenItemRenderMixin extends Screen implements MenuAccess +{ + protected AbstractContainerScreenItemRenderMixin(Component title) + { + super(title); + } + + @Redirect(method = "renderSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderItem(Lnet/minecraft/world/item/ItemStack;III)V")) + private void archie$wrapSlotItemRender(GuiGraphics guiGraphics, ItemStack stack, int x, int y, int seed) + { + Float override = SlotLayerDepthContext.takePendingOverride(); + boolean pushed = false; + if (override != null) + { + SlotLayerDepthContext.push(override); + pushed = true; + } + try + { + guiGraphics.renderItem(stack, x, y, seed); + } + finally + { + if (pushed) + { + SlotLayerDepthContext.pop(); + } + } + } +} diff --git a/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenSlotHighlightMixin.java b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenSlotHighlightMixin.java new file mode 100644 index 000000000..b74a8509c --- /dev/null +++ b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/client/gui/AbstractContainerScreenSlotHighlightMixin.java @@ -0,0 +1,59 @@ +package net.kernelpanicsoft.archie.mixin.fabric.client.gui; + +import net.kernelpanicsoft.archie.gui.access.SlotHighlightClipProvider; +import net.kernelpanicsoft.archie.gui.layout.IntRect; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * Vanilla's per-slot hover highlight is drawn via a static helper that only takes the slot's raw + * x/y/blitOffset - there's no per-slot instance override point to clip it the way + * AbstractContainerScreenMixin#archie$adjustSlotLayer clips the item icon, so this redirects the + * call site directly instead. NeoForge's own patched {@code AbstractContainerScreen} calls a + * different, newer overload here, hence a per-loader mixin - see the NeoForge module's own copy + * of this class. + */ +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenSlotHighlightMixin extends Screen implements MenuAccess +{ + protected AbstractContainerScreenSlotHighlightMixin(Component title) + { + super(title); + } + + @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderSlotHighlight(Lnet/minecraft/client/gui/GuiGraphics;III)V")) + private void archie$clipSlotHighlight(GuiGraphics guiGraphics, int x, int y, int blitOffset) + { + IntRect clip = null; + if (this instanceof SlotHighlightClipProvider provider) + { + clip = provider.slotHighlightClipRect(x, y); + if (clip == null) + { + return; + } + } + if (clip != null) + { + guiGraphics.enableScissor(clip.getMinX(), clip.getMinY(), clip.getMaxX(), clip.getMaxY()); + } + try + { + AbstractContainerScreen.renderSlotHighlight(guiGraphics, x, y, blitOffset); + } + finally + { + if (clip != null) + { + guiGraphics.disableScissor(); + } + } + } +} diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java similarity index 95% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java rename to core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java index ba85c6110..0e4b5b141 100644 --- a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java +++ b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/MinecraftClientMixin.java @@ -1,6 +1,6 @@ package net.kernelpanicsoft.archie.mixin.fabric.threading; -import net.kernelpanicsoft.archie.gametest.ThreadingImpl; +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl; import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java similarity index 89% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java rename to core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java index b1c4ed829..73624b45d 100644 --- a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java +++ b/core/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/threading/ServerMixin.java @@ -1,7 +1,7 @@ package net.kernelpanicsoft.archie.mixin.fabric.threading; -import net.kernelpanicsoft.archie.gametest.ThreadingImpl; -import net.kernelpanicsoft.archie.gametest.ADedicatedServerPlatformInternal; +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl; +import net.kernelpanicsoft.archie.gametest.platform.ADedicatedServerPlatformInternal; import net.minecraft.server.MinecraftServer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.kt diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt similarity index 90% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt index 640a5648d..39d52c6b7 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie import net.fabricmc.api.ClientModInitializer import net.fabricmc.api.ModInitializer -import net.kernelpanicsoft.archie.gametest.ThreadingImpl +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl /** * Fabric entrypoint for the mod (`fabric.mod.json` `main`/`client` entrypoints). diff --git a/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt new file mode 100644 index 000000000..65b29dda6 --- /dev/null +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.fabric.kt @@ -0,0 +1,93 @@ +package net.kernelpanicsoft.archie.data.common.conditions + +import com.mojang.serialization.Codec +import com.mojang.serialization.MapCodec +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceCondition +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditionType +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions +import net.minecraft.core.Holder +import net.minecraft.core.HolderLookup +import net.minecraft.core.Registry +import net.minecraft.core.RegistryAccess +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.resources.ResourceKey +import net.minecraft.resources.ResourceLocation + +/** + * Fabric implementation of [AConditionsPlatform], adapting Archie's platform-neutral [IACondition] + * onto Fabric's `ResourceCondition` API (`fabric-resource-conditions-api-v1`). + * + * Every [IACondition] is wrapped as a [FabricCondition] to cross into Fabric's condition system, + * and unwrapped again via [ResourceCondition.archie] when Archie code needs the original back. + */ +actual object AConditionsPlatform +{ + /** Fabric condition types registered via [register], keyed by their [IACondition.identifier]. Public so archie-datagen's `ADatagenConditionsPlatform` can wrap conditions too. */ + val registry: MutableMap> = mutableMapOf() + + /** Registers [identifier] as a Fabric [ResourceConditionType], backed by [codec] via the [FabricCondition] wrapper. */ + actual fun register(identifier: ResourceLocation, codec: MapCodec) + { + @Suppress("UNCHECKED_CAST") + registry[identifier] = ResourceConditionType.create(identifier, (codec as MapCodec).xmap({ + it.fabric + }, { + it.condition + })) + ResourceConditions.register(registry[identifier]) + } + + /** Codec for [IACondition] backed by [ResourceCondition.CODEC], round-tripping through [fabric]/[archie]. */ + actual fun codec(): Codec + { + return ResourceCondition.CODEC.xmap( + { resourceCondition -> + resourceCondition.archie + }, { iCondition -> + iCondition.fabric + } + ) + } +} + +/** Wraps this condition as a Fabric [ResourceCondition]. Public so archie-datagen can attach conditions to generated recipes. */ +val IACondition.fabric: FabricCondition + get() = FabricCondition(this) + +/** Unwraps a Fabric [ResourceCondition] back to its originating [IACondition]. Throws if it wasn't created via [fabric]. */ +val ResourceCondition.archie: IACondition + get() = ((this as? FabricCondition) ?: throw AssertionError()).condition + +/** Adapts an [IACondition] to Fabric's [ResourceCondition] interface, delegating [getType] and [test] to it. */ +class FabricCondition( + val condition: IACondition +) : ResourceCondition +{ + override fun getType(): ResourceConditionType<*> + { + return AConditionsPlatform.registry[condition.identifier]!! + } + + override fun test(registryLookup: HolderLookup.Provider?): Boolean + { + return registryLookup?.let { + condition.test(ConditionContext(it)) + } ?: false + } +} + +/** [IACondition.IContext] backed directly by a Fabric registry lookup, used when Fabric evaluates a condition. */ +class ConditionContext(private val registryLookup: HolderLookup.Provider) : + IACondition.IContext +{ + override fun getAllTags(registry: ResourceKey>): Map>> + { + return registryLookup.lookupOrThrow(registry).listTags().toList() + .associateBy({ it.key().location }, { it.toList() }) + } + + override fun getRegistry(registry: ResourceKey>): Registry + { + return RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).registryOrThrow(registry) + } +} diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.fabric.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.fabric.kt diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.fabric.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.fabric.kt diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.fabric.kt similarity index 86% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.fabric.kt index 771eb2f1f..76aa61354 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.fabric.kt +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.fabric.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.data +package net.kernelpanicsoft.archie.data.platform /** Fabric implementation of [ADataGeneratorPlatform]. */ @Suppress("unused") diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt similarity index 98% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt index 8426bd1db..578643320 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.fabric.kt +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import net.minecraft.Util import net.minecraft.server.Main diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt similarity index 97% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt index 0f5163f50..56f3a5699 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import net.minecraft.server.MinecraftServer import net.minecraft.server.dedicated.DedicatedServer diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt similarity index 96% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt index 8d4dfcdbb..9a05b0aeb 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.fabric.kt +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import dev.architectury.platform.Mod import dev.architectury.platform.Platform diff --git a/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt new file mode 100644 index 000000000..90bb628ba --- /dev/null +++ b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt @@ -0,0 +1,18 @@ +package net.kernelpanicsoft.archie.gametest.platform + +import dev.architectury.platform.Mod + +/** + * Backs [AGameTestPlatform] on Fabric: holds registered test classes. + * + * Trimmed to the [testClasses] map [AGameTestPlatform.register] needs - the actual driving logic + * (firing `AGametestEvents.REGISTER_GAME_TEST`, wiring `GameTestRegistry`/ + * `FabricGameTestModInitializerMixin`) is gametest-run-only and lives in `archie-gametest`'s + * `AGameTestRegistrationBridge` instead. + */ +internal object AGameTestPlatformInternal +{ + /** Test classes registered via [AGameTestPlatform.register], keyed by owning mod. */ + @JvmField + internal val testClasses: MutableMap>> = mutableMapOf() +} diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.kt diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.fabric.kt b/core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.fabric.kt rename to core/fabric/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.kt diff --git a/Archie/fabric/src/main/resources/archie.mixins.json b/core/fabric/src/main/resources/archie.mixins.json similarity index 63% rename from Archie/fabric/src/main/resources/archie.mixins.json rename to core/fabric/src/main/resources/archie.mixins.json index fef37ef83..489fa7330 100644 --- a/Archie/fabric/src/main/resources/archie.mixins.json +++ b/core/fabric/src/main/resources/archie.mixins.json @@ -5,16 +5,14 @@ "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ - "lifecycle.MinecraftClientMixin", - "threading.MinecraftClientMixin" + "threading.MinecraftClientMixin", + "client.gui.AbstractContainerScreenItemRenderMixin", + "client.gui.AbstractContainerScreenSlotHighlightMixin" ], "mixins": [ - "FabricDataGenHelperMixin", - "FabricGameTestHelperMixin", - "FabricGameTestModInitializerMixin", "threading.ServerMixin" ], "injectors": { "defaultRequire": 1 } -} \ No newline at end of file +} diff --git a/Archie/fabric/src/main/resources/fabric.mod.json b/core/fabric/src/main/resources/fabric.mod.json similarity index 99% rename from Archie/fabric/src/main/resources/fabric.mod.json rename to core/fabric/src/main/resources/fabric.mod.json index dfbedcb24..706814a99 100644 --- a/Archie/fabric/src/main/resources/fabric.mod.json +++ b/core/fabric/src/main/resources/fabric.mod.json @@ -52,4 +52,4 @@ "modmenu": "*", "catalogue": "*" } -} \ No newline at end of file +} diff --git a/core/neoforge/build.gradle.kts b/core/neoforge/build.gradle.kts new file mode 100644 index 000000000..2d93ab33f --- /dev/null +++ b/core/neoforge/build.gradle.kts @@ -0,0 +1,148 @@ +import net.kernelpanicsoft.archie.plugin.bundleMod +import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary +import net.kernelpanicsoft.archie.plugin.runtimeLibrary + +plugins { + alias(libs.plugins.shadow) + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +actualizer { + actualizes(project(":archie-core-common")) +} + +configurations { + create("common") + create("shadowCommon") + configureEach { + // Keep NeoForge Kotlin runtime provided by KotlinLangForge only. + exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") + exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") + } + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + // actualizer only merges Kotlin expect/actual source into this project's own + // compilation - plain Java files in archie-core-common (e.g. mixin classes with no + // actual/expect involvement) never get copied in, so they're invisible to FML's + // dev-mode module layer unless their sourceSet is also registered here directly. + sourceSet(project(":archie-core-common").sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + } +} + +dependencies { + neoForge(libs.neoforge) + modApi(libs.architectury.neoforge) + implementation(libs.kotlin.neoforge) + compileOnly(libs.kotlinx.serialization) + bundleRuntimeLibrary(libs.kotlinx.serialization) + bundleRuntimeLibrary(libs.kotlinx.serialization.json) + bundleRuntimeLibrary(libs.kotlinx.serialization.nbt) + bundleRuntimeLibrary(libs.kotlinx.serialization.toml) + bundleRuntimeLibrary(libs.kotlinx.serialization.json5) + bundleRuntimeLibrary(libs.kotlinx.serialization.cbor) + bundleRuntimeLibrary(compose.runtime) + modRuntimeOnly(libs.rei.neoforge) + modCompileOnlyApi(libs.catalogue.neoforge) + modRuntimeOnly(libs.catalogue.neoforge) + modCompileOnlyApi(libs.clothConfig.neoforge) + modRuntimeOnly(libs.clothConfig.neoforge) + bundleMod(libs.storage.neoforge) { + exclude(group = "curse.maven") + } + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + runtimeLibrary(libs.kotlinx.coroutines.test) + + "common"(project(":archie-core-common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":archie-core-common", "transformProductionNeoForge")) { isTransitive = false } +} + +modResources { + filesMatching.add("META-INF/neoforge.mods.toml") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-neoforge") + + test { + useJUnitPlatform() + } + + processResources { + from(project(":archie-core-common").sourceSets.main.get().resources) { + include("assets/archie/**") + include("data/archie/**") + include("archie-common.mixins.json") + include("archie.common.json") + include("archie.accesswidener") + } + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + shadowJar { + exclude("fabric.mod.json") + configurations = + listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) + archiveClassifier.set("dev-shadow") + } + + remapJar { + inputFile.set(shadowJar.get().archiveFile) + atAccessWideners.set(setOf(loom.accessWidenerPath.get().asFile.name)) + dependsOn(shadowJar) + } + + jar.get().archiveClassifier.set("dev") + + jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(project(":archie-core-common").sourceSets.main.get().output) + } + + sourcesJar { + val commonSources = project(":archie-core-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/Archie/neoforge/gradle.properties b/core/neoforge/gradle.properties similarity index 100% rename from Archie/neoforge/gradle.properties rename to core/neoforge/gradle.properties diff --git a/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenItemRenderMixin.java b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenItemRenderMixin.java new file mode 100644 index 000000000..9a14bb5b8 --- /dev/null +++ b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenItemRenderMixin.java @@ -0,0 +1,53 @@ +package net.kernelpanicsoft.archie.mixin.neoforge.client.gui; + +import net.kernelpanicsoft.archie.gui.access.SlotLayerDepthContext; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * Wraps the {@code GuiGraphics#renderItem} call with the depth override + * {@code AbstractContainerScreenMixin#archie$adjustSlotLayer} computed just before it. + * NeoForge's own patched {@code AbstractContainerScreen} moves this call out of vanilla's + * {@code renderSlot} into its own {@code renderSlotContents} extension point (added between + * NeoForge 20.6.5-beta and 21.1.80), so this targets that method instead - see the Fabric + * module's own copy of this class, which targets {@code renderSlot} directly. + */ +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenItemRenderMixin extends Screen implements MenuAccess +{ + protected AbstractContainerScreenItemRenderMixin(Component title) + { + super(title); + } + + @Redirect(method = "renderSlotContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderItem(Lnet/minecraft/world/item/ItemStack;III)V")) + private void archie$wrapSlotItemRender(GuiGraphics guiGraphics, ItemStack stack, int x, int y, int seed) + { + Float override = SlotLayerDepthContext.takePendingOverride(); + boolean pushed = false; + if (override != null) + { + SlotLayerDepthContext.push(override); + pushed = true; + } + try + { + guiGraphics.renderItem(stack, x, y, seed); + } + finally + { + if (pushed) + { + SlotLayerDepthContext.pop(); + } + } + } +} diff --git a/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenSlotHighlightMixin.java b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenSlotHighlightMixin.java new file mode 100644 index 000000000..8c90da191 --- /dev/null +++ b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/client/gui/AbstractContainerScreenSlotHighlightMixin.java @@ -0,0 +1,67 @@ +package net.kernelpanicsoft.archie.mixin.neoforge.client.gui; + +import net.kernelpanicsoft.archie.gui.access.SlotHighlightClipProvider; +import net.kernelpanicsoft.archie.gui.layout.IntRect; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * NeoForge-specific counterpart to AbstractContainerScreenMixin#archie$clipSlotHighlight: NeoForge + * moved the per-slot highlight draw out of the plain static {@code renderSlotHighlight(GuiGraphics, + * int, int, int)} helper vanilla's {@code render} calls directly, replacing that call site with a + * new protected instance overload {@code renderSlotHighlight(GuiGraphics, Slot, int, int, float)} + * (added between NeoForge 20.6.5-beta and 21.1.80) that computes the slot's own pixel position and + * highlight color before delegating to a *different* static overload. The clip rect this mixin + * applies is keyed on the highlight's actual pixel position, so it reads that from the Slot + * directly (slot.x/slot.y) rather than from this overload's int/int params, which are mouseX/mouseY + * here, not the highlight position. + */ +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenSlotHighlightMixin extends Screen implements MenuAccess +{ + protected AbstractContainerScreenSlotHighlightMixin(Component title) + { + super(title); + } + + @Invoker("renderSlotHighlight") + abstract void archie$callRenderSlotHighlight(GuiGraphics guiGraphics, Slot slot, int mouseX, int mouseY, float partialTick); + + @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderSlotHighlight(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/inventory/Slot;IIF)V")) + private void archie$clipSlotHighlight(AbstractContainerScreen self, GuiGraphics guiGraphics, Slot slot, int mouseX, int mouseY, float partialTick) + { + IntRect clip = null; + if (this instanceof SlotHighlightClipProvider provider) + { + clip = provider.slotHighlightClipRect(slot.x, slot.y); + if (clip == null) + { + return; + } + } + if (clip != null) + { + guiGraphics.enableScissor(clip.getMinX(), clip.getMinY(), clip.getMaxX(), clip.getMaxY()); + } + try + { + archie$callRenderSlotHighlight(guiGraphics, slot, mouseX, mouseY, partialTick); + } + finally + { + if (clip != null) + { + guiGraphics.disableScissor(); + } + } + } +} diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java similarity index 95% rename from Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java rename to core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java index 262da08ba..aad026997 100644 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java +++ b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/MinecraftClientMixin.java @@ -1,6 +1,6 @@ package net.kernelpanicsoft.archie.mixin.neoforge.threading; -import net.kernelpanicsoft.archie.gametest.ThreadingImpl; +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl; import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java similarity index 89% rename from Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java rename to core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java index 15636d026..e83579724 100644 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java +++ b/core/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/threading/ServerMixin.java @@ -1,7 +1,7 @@ package net.kernelpanicsoft.archie.mixin.neoforge.threading; -import net.kernelpanicsoft.archie.gametest.ThreadingImpl; -import net.kernelpanicsoft.archie.gametest.ADedicatedServerPlatformInternal; +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl; +import net.kernelpanicsoft.archie.gametest.platform.ADedicatedServerPlatformInternal; import net.minecraft.server.MinecraftServer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/APlatform.kt diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt similarity index 93% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt index a84760b99..87fbfcf1f 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie import dev.architectury.event.events.client.ClientTickEvent import dev.nyon.klf.MOD_BUS -import net.kernelpanicsoft.archie.gametest.ThreadingImpl +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl import net.neoforged.fml.common.Mod import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent diff --git a/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt new file mode 100644 index 000000000..3866573e5 --- /dev/null +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionsPlatform.neoforge.kt @@ -0,0 +1,112 @@ +package net.kernelpanicsoft.archie.data.common.conditions + +import com.mojang.serialization.* +import dev.nyon.klf.MOD_BUS +import net.minecraft.core.Holder +import net.minecraft.core.RegistryAccess +import net.minecraft.core.Registry +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.resources.ResourceKey +import net.minecraft.resources.ResourceLocation +import net.neoforged.neoforge.common.conditions.ICondition +import net.neoforged.neoforge.registries.DeferredRegister +import net.neoforged.neoforge.registries.NeoForgeRegistries +import java.util.stream.Stream +import net.kernelpanicsoft.archie.data.common.conditions.IACondition as ArchieCondition + +/** + * NeoForge implementation of [AConditionsPlatform], adapting Archie's platform-neutral + * [ArchieCondition] onto NeoForge's `ICondition` API. + * + * Every [ArchieCondition] is wrapped as a [NeoForgeCondition] to cross into NeoForge's condition + * system, and unwrapped again via [ICondition.archie] when Archie code needs the original back. + */ +actual object AConditionsPlatform +{ + /** Registers [identifier] as a NeoForge condition serializer, backed by [codec] via the [NeoForgeConditionCodec] wrapper. */ + actual fun register(identifier: ResourceLocation, codec: MapCodec) + { + val registry = DeferredRegister.create(NeoForgeRegistries.CONDITION_SERIALIZERS, identifier.namespace) + registry.register(identifier.path) { _ -> + codec.neoforge + } + registry.register(MOD_BUS) + } + + /** Codec for [ArchieCondition] backed by `ICondition.CODEC`, round-tripping through [neoforge]/[archie]. */ + actual fun codec(): Codec + { + return ICondition.CODEC.xmap({ + it.archie + }, { + it.neoforge + }) + } +} + +/** Unwraps a NeoForge [ICondition] back to its originating [ArchieCondition]. Throws if it wasn't created via [neoforge]. */ +val ICondition.archie: ArchieCondition + get() = ((this as? NeoForgeCondition) ?: throw AssertionError()).condition + +/** Wraps this condition as a NeoForge [ICondition]. Public so archie-datagen can attach conditions to generated recipes. */ +val ArchieCondition.neoforge: NeoForgeCondition + get() = NeoForgeCondition(this) + +/** Wraps this codec as a NeoForge condition-serializer codec. */ +val MapCodec.neoforge: MapCodec + get() = NeoForgeConditionCodec(this) + +/** Adapts an [ArchieCondition] to NeoForge's [ICondition] interface, delegating [test] to it and [codec] to the registered serializer. */ +class NeoForgeCondition( + val condition: ArchieCondition +) : ICondition +{ + override fun test(iContext: ICondition.IContext): Boolean + { + return condition.test(object : ArchieCondition.IContext + { + override fun getAllTags(registry: ResourceKey>): Map>> + { + return iContext.getAllTags(registry) + } + + override fun getRegistry(registry: ResourceKey>): Registry + { + return RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).registryOrThrow(registry) + } + }) + } + + override fun codec(): MapCodec + { + return NeoForgeRegistries.CONDITION_SERIALIZERS[condition.identifier]!! + } +} + +/** Adapts a [MapCodec] of [ArchieCondition] to one producing/consuming [NeoForgeCondition] wrappers. */ +class NeoForgeConditionCodec( + private val codec: MapCodec +) : MapCodec() +{ + override fun encode( + input: NeoForgeCondition, + ops: DynamicOps, + prefix: RecordBuilder + ): RecordBuilder + { + @Suppress("UNCHECKED_CAST") + return (codec as MapCodec).encode(input.condition, ops, prefix) + } + + override fun keys(ops: DynamicOps): Stream + { + return codec.keys(ops) + } + + override fun decode(ops: DynamicOps, input: MapLike): DataResult + { + return codec.decode(ops, input).map { result -> + result.neoforge + } + } +} diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.neoforge.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientPlatform.neoforge.kt diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.neoforge.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ingredients/ACustomIngredientSerializerPlatform.neoforge.kt diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.neoforge.kt similarity index 85% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.neoforge.kt index a447ec655..e0a758177 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatform.neoforge.kt +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/platform/ADataGeneratorPlatform.neoforge.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.data +package net.kernelpanicsoft.archie.data.platform /** NeoForge implementation of [ADataGeneratorPlatform]. */ diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt similarity index 98% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt index 8d3defcc2..c8d53a149 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatform.neoforge.kt +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatform.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import net.minecraft.Util import net.minecraft.server.Main diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt similarity index 97% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt index 0f5163f50..56f3a5699 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ADedicatedServerPlatformInternal.kt +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/ADedicatedServerPlatformInternal.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import net.minecraft.server.MinecraftServer import net.minecraft.server.dedicated.DedicatedServer diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt similarity index 96% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt index 2716dbe42..f80ef4905 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestPlatform.neoforge.kt +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatform.kt @@ -1,4 +1,4 @@ -package net.kernelpanicsoft.archie.gametest +package net.kernelpanicsoft.archie.gametest.platform import dev.architectury.platform.Mod import dev.architectury.platform.Platform diff --git a/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt new file mode 100644 index 000000000..42ef35972 --- /dev/null +++ b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/platform/AGameTestPlatformInternal.kt @@ -0,0 +1,16 @@ +package net.kernelpanicsoft.archie.gametest.platform + +import dev.architectury.platform.Mod + +/** + * Backs [AGameTestPlatform] on NeoForge: holds registered test classes. + * + * Trimmed to the [testClasses] map [AGameTestPlatform.register] needs - the actual + * `registerGameTests()` driving logic is gametest-run-only and lives in `archie-gametest` instead. + */ +internal object AGameTestPlatformInternal +{ + /** Test classes registered via [AGameTestPlatform.register], keyed by owning mod. */ + @JvmField + internal val testClasses: MutableMap>> = mutableMapOf() +} diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gui/render/AFluidRenderPlatform.kt diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.neoforge.kt b/core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.neoforge.kt rename to core/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/registries/AClientRegistrationPlatform.kt diff --git a/Archie-Test/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/core/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 79% rename from Archie-Test/neoforge/src/main/resources/META-INF/neoforge.mods.toml rename to core/neoforge/src/main/resources/META-INF/neoforge.mods.toml index e05e1ec07..ef7a416e1 100644 --- a/Archie-Test/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/core/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -15,6 +15,12 @@ ${mod_description} logoFile = "assets/${mod_id}/banner.png" displayURL = "${mod_url}" +[[mixins]] +config = "${mod_id}.mixins.json" + +[[mixins]] +config = "${mod_id}-common.mixins.json" + [[dependencies."${mod_id}"]] modId = "neoforge" type = "required" @@ -29,19 +35,12 @@ versionRange = "[${versions.minecraft}]" ordering = "NONE" side = "BOTH" -#[[dependencies."${mod_id}"]] -#modId = "klf" -#type = "required" -#versionRange = "[${versions.kotlin_neoforge_range},)" -#ordering = "NONE" -#side = "BOTH" - [[dependencies."${mod_id}"]] modId = "cloth_config" -type = "required" +type = "optional" versionRange = "[${versions.cloth_config_range},)" ordering = "NONE" side = "BOTH" [modproperties."${mod_id}"] -catalogueImageIcon = "assets/${mod_id}/icon.png" \ No newline at end of file +catalogueImageIcon = "assets/${mod_id}/icon.png" diff --git a/Archie/neoforge/src/main/resources/archie.mixins.json b/core/neoforge/src/main/resources/archie.mixins.json similarity index 51% rename from Archie/neoforge/src/main/resources/archie.mixins.json rename to core/neoforge/src/main/resources/archie.mixins.json index e0f9f55c3..f45b199f2 100644 --- a/Archie/neoforge/src/main/resources/archie.mixins.json +++ b/core/neoforge/src/main/resources/archie.mixins.json @@ -4,17 +4,14 @@ "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ - "lifecycle.MinecraftClientMixin", - "threading.MinecraftClientMixin" + "threading.MinecraftClientMixin", + "client.gui.AbstractContainerScreenItemRenderMixin", + "client.gui.AbstractContainerScreenSlotHighlightMixin" ], "mixins": [ - "DatagenModLoaderMixin", - "GameTestHooksMixin", - "GameTestRegistryMixin", - "StructureTemplateManagerMixin", "threading.ServerMixin" ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1 } -} \ No newline at end of file +} diff --git a/datagen/common/build.gradle.kts b/datagen/common/build.gradle.kts new file mode 100644 index 000000000..fd20fb2e3 --- /dev/null +++ b/datagen/common/build.gradle.kts @@ -0,0 +1,35 @@ +architectury { + common("fabric", "neoforge") +} + +actualizer { + stubUnfulfilledExpects() +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) +} + +dependencies { + api(project(":archie-core-common", "namedElements")) + modApi(libs.architectury.common) + + compileOnly(kotlin("reflect")) + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testImplementation(kotlin("reflect")) + testRuntimeOnly(libs.junit.jupiter.engine) +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-datagen-common") + + jar { + from(sourceSets.main.get().output) + exclude("**/*StubKt.class") + } + + sourcesJar { + exclude("**/*Stub.kt") + } +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGenerator.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGenerator.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGenerator.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGenerator.kt diff --git a/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt new file mode 100644 index 000000000..f0f5b1fe6 --- /dev/null +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/ADatagenEventObject.kt @@ -0,0 +1,20 @@ +package net.kernelpanicsoft.archie.data + +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents.GatherDataHandler +import net.kernelpanicsoft.archie.events.base.AEventObject +import dev.architectury.event.Event +import dev.architectury.platform.Mod + +/** + * Convenience [AEventObject] base for hooking into [ADatagenEvents.GATHER_DATA], the event fired + * by the loader during a datagen run. Implement [handler] to build and run an [ADataGenerator]. + */ +abstract class ADatagenEventObject(mod: Mod) : + AEventObject( + mod + ) +{ + override val event: Event = ADatagenEvents.GATHER_DATA + override val handlerConstructor: GatherDataHandler.Companion = GatherDataHandler.Companion +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/IADataProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/IADataProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/IADataProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/IADataProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/ALanguageProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/ALanguageProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/ALanguageProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/ALanguageProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockModelProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockStateProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockStateProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockStateProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ABlockStateProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AConfiguredModel.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AConfiguredModel.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AConfiguredModel.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AConfiguredModel.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ACustomLoaderBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ACustomLoaderBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ACustomLoaderBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/ACustomLoaderBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AItemModelProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelFile.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelFile.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelFile.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelFile.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AModelProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AMultiPartBlockStateBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AMultiPartBlockStateBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AMultiPartBlockStateBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AMultiPartBlockStateBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AVariantBlockStateBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AVariantBlockStateBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AVariantBlockStateBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/AVariantBlockStateBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/IAGeneratedBlockState.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/IAGeneratedBlockState.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/IAGeneratedBlockState.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/client/model/IAGeneratedBlockState.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/AConditionBuilder.kt similarity index 77% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/AConditionBuilder.kt index f16f848c2..23af0b34e 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/AConditionBuilder.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/AConditionBuilder.kt @@ -1,5 +1,16 @@ -package net.kernelpanicsoft.archie.data.common.conditions +package net.kernelpanicsoft.archie.data.common.conditions.gen +import net.kernelpanicsoft.archie.data.common.conditions.AAndCondition +import net.kernelpanicsoft.archie.data.common.conditions.AEqualsCondition +import net.kernelpanicsoft.archie.data.common.conditions.AFalseCondition +import net.kernelpanicsoft.archie.data.common.conditions.AModLoadedCondition +import net.kernelpanicsoft.archie.data.common.conditions.ANotCondition +import net.kernelpanicsoft.archie.data.common.conditions.AOrCondition +import net.kernelpanicsoft.archie.data.common.conditions.APlatformCondition +import net.kernelpanicsoft.archie.data.common.conditions.ARegistryCondition +import net.kernelpanicsoft.archie.data.common.conditions.ATrueCondition +import net.kernelpanicsoft.archie.data.common.conditions.AXorCondition +import net.kernelpanicsoft.archie.data.common.conditions.IACondition import net.minecraft.core.Registry import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation diff --git a/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.common.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.common.kt new file mode 100644 index 000000000..faeebcec3 --- /dev/null +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.common.kt @@ -0,0 +1,22 @@ +package net.kernelpanicsoft.archie.data.common.conditions.gen + +import net.kernelpanicsoft.archie.data.common.conditions.IACondition +import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider +import net.minecraft.core.HolderLookup +import net.minecraft.data.recipes.RecipeOutput +import net.minecraft.data.recipes.RecipeProvider +import java.util.concurrent.CompletableFuture + +/** + * Datagen-only half of [net.kernelpanicsoft.archie.data.common.conditions.AConditionsPlatform] - + * attaching conditions to a *generated* recipe. Split out from that class itself since neither + * member has any runtime presence. + */ +expect object ADatagenConditionsPlatform +{ + /** Attaches [condition] to the next recipe written to [output] via the loader's native mechanism. */ + fun withCondition(output: RecipeOutput, condition: IACondition): RecipeOutput + + /** Wraps [child] in a loader-specific [RecipeProvider] so [withCondition] can attach conditions on Fabric; `null` where not needed. */ + fun fabricRecipeProvider(child: ARecipeProvider, registries: CompletableFuture): RecipeProvider? +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/Extensions.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/Extensions.kt similarity index 76% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/Extensions.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/Extensions.kt index b780e1b21..0f5e4b668 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/Extensions.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/Extensions.kt @@ -1,5 +1,6 @@ -package net.kernelpanicsoft.archie.data.common.conditions +package net.kernelpanicsoft.archie.data.common.conditions.gen +import net.kernelpanicsoft.archie.data.common.conditions.IACondition import net.minecraft.data.recipes.RecipeOutput /** Attaches [condition] to the next recipe written to this [RecipeOutput]. */ @@ -11,7 +12,7 @@ fun RecipeOutput.withCondition(condition: IACondition): RecipeOutput /** Attaches the [IACondition] built by [block] (with [AConditionBuilder] in scope) to the next recipe written to this [RecipeOutput]. */ fun RecipeOutput.withCondition(block: AConditionBuilder.() -> IACondition): RecipeOutput { - return AConditionsPlatform.withCondition(this, AConditionBuilder.block()) + return ADatagenConditionsPlatform.withCondition(this, AConditionBuilder.block()) } /** Builds an [IACondition] with [AConditionBuilder] in scope, e.g. `buildCondition { mod("architectury") }`. */ diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt similarity index 92% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt index 3576c2927..57a522fe4 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/ARecipeProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.common.crafting import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.IADataProvider -import net.kernelpanicsoft.archie.data.common.conditions.AConditionsPlatform +import net.kernelpanicsoft.archie.data.common.conditions.gen.ADatagenConditionsPlatform import net.kernelpanicsoft.archie.data.common.crafting.recipies.ArchieCookingRecipeBuilder import net.kernelpanicsoft.archie.data.common.crafting.recipies.ArchieShapedRecipeBuilder import net.kernelpanicsoft.archie.data.common.crafting.recipies.ArchieShapelessRecipeBuilder @@ -37,8 +37,8 @@ abstract class ARecipeProvider( IADataProvider { - /** On Fabric, a wrapping [RecipeProvider] needed for [AConditionsPlatform.withCondition] support; `null` elsewhere. */ - private val fabricParent: RecipeProvider? = AConditionsPlatform.fabricRecipeProvider(this, registries) + /** On Fabric, a wrapping [RecipeProvider] needed for [ADatagenConditionsPlatform.withCondition] support; `null` elsewhere. */ + private val fabricParent: RecipeProvider? = ADatagenConditionsPlatform.fabricRecipeProvider(this, registries) override fun run(cachedOutput: CachedOutput): CompletableFuture<*> { diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieCookingRecipeBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieCookingRecipeBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieCookingRecipeBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieCookingRecipeBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapedRecipeBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapedRecipeBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapedRecipeBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapedRecipeBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapelessRecipeBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapelessRecipeBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapelessRecipeBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/ArchieShapelessRecipeBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt similarity index 83% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt index f9f4a4040..6303386ca 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/crafting/recipies/IARecipeBuilder.kt @@ -1,8 +1,8 @@ package net.kernelpanicsoft.archie.data.common.crafting.recipies -import net.kernelpanicsoft.archie.data.common.conditions.AConditionBuilder import net.kernelpanicsoft.archie.data.common.conditions.IACondition -import net.kernelpanicsoft.archie.data.common.conditions.withCondition +import net.kernelpanicsoft.archie.data.common.conditions.gen.AConditionBuilder +import net.kernelpanicsoft.archie.data.common.conditions.gen.withCondition import net.minecraft.data.recipes.RecipeBuilder import net.minecraft.data.recipes.RecipeOutput import net.minecraft.resources.ResourceLocation diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilder.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.common.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.common.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.common.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.common.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagsProvider.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagsProvider.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/IATagBuilder.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/IATagBuilder.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/IATagBuilder.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/IATagBuilder.kt diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt similarity index 90% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt index 91a3573ce..4d38cef3b 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/ArchieDatagen.kt @@ -3,9 +3,9 @@ package net.kernelpanicsoft.archie.data.internal import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.ADataGenerator import net.kernelpanicsoft.archie.data.ADatagenEventObject -import net.kernelpanicsoft.archie.data.common.conditions.withCondition +import net.kernelpanicsoft.archie.data.common.conditions.gen.withCondition import net.kernelpanicsoft.archie.data.common.crafting.ingredients.AComponentsIngredient -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import net.kernelpanicsoft.archie.data.internal.common.tags.* import net.minecraft.core.component.DataComponents import net.minecraft.data.recipes.RecipeCategory diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt similarity index 99% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt index 52e0f7ee2..e0dea024a 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBiomeTagsProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.internal.common.tags import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.common.tags.ATagsProvider -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import net.minecraft.core.HolderLookup import net.minecraft.data.PackOutput import net.minecraft.tags.BiomeTags diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt similarity index 99% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt index 53bf4cd82..170c96dbe 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalBlockTagsProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.internal.common.tags import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.common.tags.ATagsProvider -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import dev.architectury.platform.Platform import net.minecraft.core.HolderLookup import net.minecraft.core.registries.BuiltInRegistries diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt similarity index 95% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt index 8b492d8bd..1d0b14d73 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalEntityTypeTagsProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.internal.common.tags import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.common.tags.ATagsProvider -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import net.minecraft.core.HolderLookup import net.minecraft.data.PackOutput import net.minecraft.world.entity.EntityType diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt similarity index 95% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt index 7dd19cfef..a0fd716d0 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalFluidTagsProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.internal.common.tags import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.common.tags.ATagsProvider -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import net.minecraft.core.HolderLookup import net.minecraft.data.PackOutput import net.minecraft.world.level.material.Fluids diff --git a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt similarity index 99% rename from Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt index 00ed7dfb7..2594d64be 100644 --- a/Archie/common/src/main/datagen/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/internal/common/tags/AInternalItemTagsProvider.kt @@ -2,7 +2,7 @@ package net.kernelpanicsoft.archie.data.internal.common.tags import net.kernelpanicsoft.archie.Archie import net.kernelpanicsoft.archie.data.common.tags.ATagsProvider -import net.kernelpanicsoft.archie.data.common.tags.ACommonTags +import net.kernelpanicsoft.archie.data.common.tags.platform.ACommonTags import dev.architectury.platform.Platform import net.minecraft.core.HolderLookup import net.minecraft.core.registries.BuiltInRegistries diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/util/TransformationHelper.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/util/TransformationHelper.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/data/util/TransformationHelper.kt rename to datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/data/util/TransformationHelper.kt diff --git a/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/events/datagen/ADatagenEvents.kt b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/events/datagen/ADatagenEvents.kt new file mode 100644 index 000000000..faff19876 --- /dev/null +++ b/datagen/common/src/main/kotlin/net/kernelpanicsoft/archie/events/datagen/ADatagenEvents.kt @@ -0,0 +1,70 @@ +package net.kernelpanicsoft.archie.events.datagen + +import dev.architectury.event.Event +import dev.architectury.event.EventFactory +import dev.architectury.event.EventResult +import dev.architectury.platform.Mod +import net.kernelpanicsoft.archie.data.ADataGenerator +import net.kernelpanicsoft.archie.events.base.Handler +import net.kernelpanicsoft.archie.events.base.HandlerConstructor + +/** + * `archie-datagen`'s central, mod-scoped event registry, built on top of Architectury's event + * system - the datagen half of what used to be `archie-core`'s combined `AEvents`. + * + * A downstream mod opts in with `ADatagenEvents += MOD` (its own [Mod] descriptor), then listens + * for [GATHER_DATA] via [GatherDataHandler.Companion.create]. Handlers are mod-scoped: they check + * the invoking [Mod] and no-op (via [EventResult.pass]) for any mod other than the one they were + * created for. + */ +object ADatagenEvents +{ + /** Fired during datagen runs; handlers should gate by owning [Mod]. */ + val GATHER_DATA: Event = EventFactory.createEventResult() + + private val mods: MutableList = mutableListOf() + + /** Mods that opted into `archie-datagen`'s event plumbing via `ADatagenEvents += MOD`. */ + val MODS: List + get() = mods + + fun register(mod: Mod) + { + mods.add(mod) + } + + operator fun plusAssign(mod: Mod) = register(mod) + + /** + * Handler for [GATHER_DATA]. Implementations are produced via [HandlerConstructor.create] + * and forward to the registered `block` only when the firing [ADataGenerator.mod] matches + * the [Mod] the handler was created for. + */ + interface GatherDataHandler : Handler + { + operator fun invoke(dataGenerator: ADataGenerator): EventResult + + companion object : HandlerConstructor + { + override fun create(mod: Mod, block: ADataGenerator.() -> Unit): GatherDataHandler + { + return GatherDataHandlerImpl(mod, block) + } + + class GatherDataHandlerImpl internal constructor( + private val mod: Mod, + private val gatherData: ADataGenerator.() -> Unit + ) : + GatherDataHandler + { + override operator fun invoke(dataGenerator: ADataGenerator): EventResult + { + if (this.mod != dataGenerator.mod) + return EventResult.pass() + dataGenerator.gatherData() + return EventResult.interruptDefault() + } + } + } + } +} diff --git a/datagen/fabric/build.gradle.kts b/datagen/fabric/build.gradle.kts new file mode 100644 index 000000000..9045cddfe --- /dev/null +++ b/datagen/fabric/build.gradle.kts @@ -0,0 +1,108 @@ +import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary + +plugins { + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + fabric() +} + +actualizer { + actualizes(project(":archie-datagen-common")) +} + +configurations { + create("common") + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArg("-XX:+AllowEnhancedClassRedefinition") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + } + // This adds a new gradle task that runs the datagen API: "gradlew runDatagen" + create("datagen") { + client() + name = "Minecraft Datagen" + property("archie.datagen", "true") + property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) + property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) + property("fabric-api.datagen") + property("fabric-api.datagen.modid", "archie_datagen") + property("fabric-api.datagen.output-dir", file("src/main/generated").absolutePath) + + runDir = "build/datagen" + } + } +} + +fabricApi.configureDataGeneration { + createRunConfiguration = false + outputDirectory.set(file("src/main/generated")) +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.fabric.api) + modImplementation(libs.kotlin.fabric) + compileOnly(libs.kotlinx.serialization) + modLocalRuntime(libs.clothConfig.fabric) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-datagen-common", "namedElements")) { isTransitive = false } + api(project(":archie-core-fabric", "namedElements")) +} + +modResources { + filesMatching.add("fabric.mod.json") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-datagen-fabric") + + test { + useJUnitPlatform() + } + + processResources { + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + sourcesJar { + val commonSources = project(":archie-datagen-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java b/datagen/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java similarity index 95% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java rename to datagen/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java index 033370dc0..ed88832ac 100644 --- a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java +++ b/datagen/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricDataGenHelperMixin.java @@ -3,7 +3,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.data.ADataGeneratorPlatform; +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform; import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorFabric.kt b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorFabric.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorFabric.kt rename to datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorFabric.kt diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt similarity index 69% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt rename to datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt index a56592555..19ec5c231 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt +++ b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt @@ -6,8 +6,8 @@ import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator import net.fabricmc.loader.api.FabricLoader import net.fabricmc.loader.api.ModContainer import net.fabricmc.loader.api.entrypoint.EntrypointContainer -import net.kernelpanicsoft.archie.data.ADataGeneratorPlatform.isDataGen -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform.isDataGen +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents import net.minecraft.core.RegistrySetBuilder /** @@ -15,15 +15,17 @@ import net.minecraft.core.RegistrySetBuilder * `FabricDataGenHelper.runInternal()` to splice in synthetic datagen entrypoints. * * Archie mods don't declare a `fabric-datagen` entrypoint in `fabric.mod.json`; instead they - * register with [AEvents.MODS] at init time. This object bridges that registration into the - * `EntrypointContainer` list Fabric's data generator actually consumes. + * register with [ADatagenEvents.MODS] at init time. This object bridges that registration into + * the `EntrypointContainer` list Fabric's data generator actually + * consumes. */ internal object ADataGeneratorPlatformInternal { /** - * Appends one [EntrypointContainer] per mod in [AEvents.MODS] to [dataGeneratorInitializers], - * each of which fires [AEvents.GATHER_DATA] with an [ADataGeneratorFabric] for that mod. No-op - * outside a datagen run ([ADataGeneratorPlatform.isDataGen] false). + * Appends one [EntrypointContainer] per mod in [ADatagenEvents.MODS] to + * [dataGeneratorInitializers], each of which fires [ADatagenEvents.GATHER_DATA] with an + * [ADataGeneratorFabric] for that mod. No-op outside a datagen run + * ([ADataGeneratorPlatform.isDataGen] false). */ @JvmStatic @JvmName("addEntrypoints") @@ -33,7 +35,7 @@ internal object ADataGeneratorPlatformInternal // Fabric expects datagen entrypoints; inject one per registered Archie mod. val result = dataGeneratorInitializers.get().toMutableList() - for (mod in AEvents.MODS) + for (mod in ADatagenEvents.MODS) { result.add(object : EntrypointContainer { @@ -43,7 +45,7 @@ internal object ADataGeneratorPlatformInternal { override fun onInitializeDataGenerator(fabricDataGenerator: FabricDataGenerator) { - AEvents.GATHER_DATA.invoker()(ADataGeneratorFabric(fabricDataGenerator, mod)) + ADatagenEvents.GATHER_DATA.invoker()(ADataGeneratorFabric(fabricDataGenerator, mod)) } override fun buildRegistry(registryBuilder: RegistrySetBuilder?) @@ -61,4 +63,4 @@ internal object ADataGeneratorPlatformInternal } dataGeneratorInitializers.set(result) } -} \ No newline at end of file +} diff --git a/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenFabric.kt b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenFabric.kt new file mode 100644 index 000000000..916eb9258 --- /dev/null +++ b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenFabric.kt @@ -0,0 +1,26 @@ +package net.kernelpanicsoft.archie.data + +import net.fabricmc.api.ModInitializer +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.data.internal.ArchieDatagen +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents + +/** + * Fabric entrypoint for archie-datagen (`fabric.mod.json` `main`). + * + * Activates [ArchieDatagen] directly rather than via `ArchieExtension`/`ServiceLoader` - NeoForge's + * own per-mod JPMS module boundaries make classic `META-INF/services` discovery unreliable across + * mods, so each product now triggers its own hooks from its own real entrypoint instead. Also + * registers [Archie.MOD] with [ADatagenEvents] itself, on Archie's behalf - `archie-core` has no + * datagen entrypoint of its own to do this from, since it doesn't know about datagen concepts. + */ +object ArchieDatagenFabric : ModInitializer +{ + override fun onInitialize() + { + if (!ADataGeneratorPlatform.isDataGen) return + ADatagenEvents += Archie.MOD + ArchieDatagen.init() + } +} diff --git a/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.fabric.kt b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.fabric.kt new file mode 100644 index 000000000..f8abd4272 --- /dev/null +++ b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.fabric.kt @@ -0,0 +1,59 @@ +package net.kernelpanicsoft.archie.data.common.conditions.gen + +import kotlinx.serialization.json.Json +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceCondition +import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.data.common.conditions.IACondition +import net.kernelpanicsoft.archie.data.common.conditions.fabric +import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider +import net.kernelpanicsoft.archie.serialization.kSerializer +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementHolder +import net.minecraft.core.HolderLookup +import net.minecraft.data.recipes.RecipeOutput +import net.minecraft.data.recipes.RecipeProvider +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.item.crafting.Recipe +import java.util.concurrent.CompletableFuture + +/** Fabric implementation of [ADatagenConditionsPlatform]. */ +actual object ADatagenConditionsPlatform +{ + /** Attaches [condition] to whatever [output] accepts next, via [FabricDataGenHelper.addConditions]. */ + actual fun withCondition(output: RecipeOutput, condition: IACondition): RecipeOutput + { + return object : RecipeOutput + { + @Suppress("UnstableApiUsage") + override fun accept(identifier: ResourceLocation, recipe: Recipe<*>, advancementEntry: AdvancementHolder?) + { + FabricDataGenHelper.addConditions(recipe, arrayOf(condition.fabric)) + Archie.LOGGER.info(Json.encodeToString(ResourceCondition.CODEC.kSerializer, condition.fabric)) + output.accept(identifier, recipe, advancementEntry) + } + + override fun advancement(): Advancement.Builder + { + return output.advancement() + } + } + } + + /** Wraps [child] in a [FabricRecipeProvider] so its recipes go through Fabric's condition-aware output. */ + actual fun fabricRecipeProvider( + child: ARecipeProvider, + registries: CompletableFuture + ): RecipeProvider? + { + return object : FabricRecipeProvider(child.output as FabricDataOutput, registries) + { + override fun buildRecipes(exporter: RecipeOutput) + { + child.buildRecipes(exporter) + } + } + } +} diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.fabric.kt b/datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.kt similarity index 100% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.fabric.kt rename to datagen/fabric/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.kt diff --git a/datagen/fabric/src/main/resources/archie_datagen.mixins.json b/datagen/fabric/src/main/resources/archie_datagen.mixins.json new file mode 100644 index 000000000..80473e525 --- /dev/null +++ b/datagen/fabric/src/main/resources/archie_datagen.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "net.kernelpanicsoft.archie.mixin.fabric", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "mixins": [ + "FabricDataGenHelperMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/datagen/fabric/src/main/resources/fabric.mod.json b/datagen/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..918c90f50 --- /dev/null +++ b/datagen/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,34 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}_datagen", + "version": "${mod_version}", + "name": "${mod_display_name} Datagen", + "description": "${mod_display_name}'s datagen DSL - dev-time only, never shipped in a production jar.", + "authors": [ + "${mod_authors}" + ], + "contact": { + "homepage": "${mod_url}", + "sources": "${mod_source}" + }, + "license": "${mod_license}", + "environment": "*", + "entrypoints": { + "main": [ + { + "adapter": "kotlin", + "value": "net.kernelpanicsoft.archie.data.ArchieDatagenFabric" + } + ] + }, + "mixins": [ + "${mod_id}_datagen.mixins.json" + ], + "depends": { + "minecraft": "${versions.minecraft}", + "fabricloader": ">=${versions.fabric_loader}", + "fabric-api": ">=${versions.fabric_api}", + "fabric-language-kotlin": ">=${versions.kotlin_fabric}", + "archie": ">=${mod_version}" + } +} diff --git a/datagen/neoforge/build.gradle.kts b/datagen/neoforge/build.gradle.kts new file mode 100644 index 000000000..58194507f --- /dev/null +++ b/datagen/neoforge/build.gradle.kts @@ -0,0 +1,107 @@ +import net.kernelpanicsoft.archie.plugin.bundleRuntimeLibrary +import org.gradle.api.tasks.bundling.AbstractArchiveTask + +plugins { + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +actualizer { + actualizes(project(":archie-datagen-common")) +} + +configurations { + create("common") + configureEach { + exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") + exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") + } + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + create("datagen") { + data() + name = "Minecraft Datagen" + property("archie.datagen", "true") + property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) + property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) + property("kotlinx.coroutines.debug", "off") + programArgs("--all", "--mod", "archie_datagen") + programArgs("--output", file("src/main/generated").absolutePath) + } + } +} + +dependencies { + "neoForge"(libs.neoforge) + implementation(libs.kotlin.neoforge) + compileOnly(libs.kotlinx.serialization) + modRuntimeOnly(libs.clothConfig.neoforge) + modApi(libs.architectury.neoforge) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-datagen-common", "namedElements")) { isTransitive = false } + api(project(":archie-core-neoforge", "namedElements")) +} + +modResources { + filesMatching.add("META-INF/neoforge.mods.toml") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-datagen-neoforge") + + test { + useJUnitPlatform() + } + + processResources { + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + sourcesJar { + val commonSources = project(":archie-datagen-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/datagen/neoforge/gradle.properties b/datagen/neoforge/gradle.properties new file mode 100644 index 000000000..2914393db --- /dev/null +++ b/datagen/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/DatagenModLoaderMixin.java b/datagen/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/datagen/DatagenModLoaderMixin.java similarity index 91% rename from Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/DatagenModLoaderMixin.java rename to datagen/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/datagen/DatagenModLoaderMixin.java index 0b6ecc37e..e738102f2 100644 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/DatagenModLoaderMixin.java +++ b/datagen/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/datagen/DatagenModLoaderMixin.java @@ -1,7 +1,7 @@ -package net.kernelpanicsoft.archie.mixin.neoforge; +package net.kernelpanicsoft.archie.mixin.neoforge.datagen; import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.data.ADataGeneratorPlatform; +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform; import net.kernelpanicsoft.archie.data.ADataGeneratorPlatformInternal; import net.neoforged.fml.ModList; import net.neoforged.neoforge.data.event.GatherDataEvent; diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorNeoForge.kt b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorNeoForge.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorNeoForge.kt rename to datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorNeoForge.kt diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt similarity index 52% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt rename to datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt index d92d46939..1eb89550c 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt +++ b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ADataGeneratorPlatformInternal.kt @@ -1,16 +1,19 @@ package net.kernelpanicsoft.archie.data -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform + +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents import net.neoforged.fml.ModList import net.neoforged.neoforge.data.event.GatherDataEvent -/** Backs [ADataGeneratorPlatform] on NeoForge: wires each registered mod's [GatherDataEvent] listener into [AEvents.GATHER_DATA]. */ +/** Backs [ADataGeneratorPlatform] on NeoForge: wires each registered mod's [GatherDataEvent] listener into [ADatagenEvents.GATHER_DATA]. */ internal object ADataGeneratorPlatformInternal { /** * Called from `DatagenModLoaderMixin` mid-way through NeoForge's datagen bootstrap. No-ops - * outside a datagen run; otherwise, for every mod in [AEvents.MODS], subscribes to that mod's - * [GatherDataEvent] and fires [AEvents.GATHER_DATA] with an [ADataGeneratorNeoForge] wrapping it. + * outside a datagen run; otherwise, for every mod in [ADatagenEvents.MODS], subscribes to + * that mod's [GatherDataEvent] and fires [ADatagenEvents.GATHER_DATA] with an + * [ADataGeneratorNeoForge] wrapping it. */ @JvmStatic @JvmName("addEventHandlers") @@ -18,13 +21,13 @@ internal object ADataGeneratorPlatformInternal { if (!ADataGeneratorPlatform.isDataGen) return - for (mod in AEvents.MODS) + for (mod in ADatagenEvents.MODS) { ModList.get().getModContainerById(mod.modId).ifPresent { it.eventBus?.addListener { event -> - AEvents.GATHER_DATA.invoker()(ADataGeneratorNeoForge(event, mod)) + ADatagenEvents.GATHER_DATA.invoker()(ADataGeneratorNeoForge(event, mod)) } } } } -} \ No newline at end of file +} diff --git a/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenNeoForge.kt b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenNeoForge.kt new file mode 100644 index 000000000..d3c8a08d4 --- /dev/null +++ b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/ArchieDatagenNeoForge.kt @@ -0,0 +1,29 @@ +package net.kernelpanicsoft.archie.data + +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.data.internal.ArchieDatagen +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents +import net.neoforged.fml.common.Mod + +/** + * NeoForge entrypoint for archie-datagen, registered via the `@Mod` annotation. + * + * Activates [ArchieDatagen] directly rather than via `ArchieExtension`/`ServiceLoader` - NeoForge's + * own per-mod JPMS module boundaries make classic `META-INF/services` discovery unreliable across + * mods, so each product now triggers its own hooks from its own real entrypoint instead. Also + * registers [Archie.MOD] with [ADatagenEvents] itself, on Archie's behalf - `archie-core` has no + * datagen entrypoint of its own to do this from, since it doesn't know about datagen concepts. + */ +@Mod("archie_datagen") +object ArchieDatagenNeoForge +{ + init + { + if (ADataGeneratorPlatform.isDataGen) + { + ADatagenEvents += Archie.MOD + ArchieDatagen.init() + } + } +} diff --git a/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.neoforge.kt b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.neoforge.kt new file mode 100644 index 000000000..cc7550d9f --- /dev/null +++ b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/conditions/gen/ADatagenConditionsPlatform.neoforge.kt @@ -0,0 +1,48 @@ +package net.kernelpanicsoft.archie.data.common.conditions.gen + +import net.kernelpanicsoft.archie.data.common.conditions.IACondition +import net.kernelpanicsoft.archie.data.common.conditions.neoforge +import net.kernelpanicsoft.archie.data.common.crafting.ARecipeProvider +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementHolder +import net.minecraft.core.HolderLookup +import net.minecraft.data.recipes.RecipeOutput +import net.minecraft.data.recipes.RecipeProvider +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.item.crafting.Recipe +import net.neoforged.neoforge.common.conditions.ICondition +import java.util.concurrent.CompletableFuture + +/** NeoForge implementation of [ADatagenConditionsPlatform]. */ +actual object ADatagenConditionsPlatform +{ + /** Wraps [output] so every entry accepted through it also carries [condition]. */ + actual fun withCondition(output: RecipeOutput, condition: IACondition): RecipeOutput + { + return NeoForgeConditionalRecipeOutput(output, condition.neoforge) + } + + /** Fabric-only concern; always `null` on NeoForge. */ + actual fun fabricRecipeProvider(child: ARecipeProvider, registries: CompletableFuture): RecipeProvider? = null + + /** [RecipeOutput] wrapper that always attaches [condition] to whatever [inner] accepts. */ + class NeoForgeConditionalRecipeOutput(private val inner: RecipeOutput, private val condition: ICondition) : + RecipeOutput + { + override fun advancement(): Advancement.Builder + { + return inner.advancement() + } + + /** Forwards to [inner], attaching [condition]; any [iConditions] passed by the caller are not currently applied. */ + override fun accept( + id: ResourceLocation, + recipe: Recipe<*>, + adv: AdvancementHolder?, + vararg iConditions: ICondition + ) + { + inner.accept(id, recipe, adv, this.condition) + } + } +} diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.neoforge.kt b/datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.kt similarity index 100% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.neoforge.kt rename to datagen/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/data/common/tags/ATagBuilderPlatform.kt diff --git a/datagen/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/datagen/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 000000000..ef4a72c4b --- /dev/null +++ b/datagen/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,38 @@ +modLoader = "klf" +loaderVersion = "[${versions.kotlin_neoforge_range},)" +issueTrackerURL = "" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}_datagen" +version = "${mod_version}" +displayName = "${mod_display_name} Datagen" +authors = "${mod_authors}" +description = ''' +${mod_display_name}'s datagen DSL - dev-time only, never shipped in a production jar. +''' +displayURL = "${mod_url}" + +[[mixins]] +config = "${mod_id}_datagen.mixins.json" + +[[dependencies."${mod_id}_datagen"]] +modId = "neoforge" +type = "required" +versionRange = "[${versions.neoforge_range},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies."${mod_id}_datagen"]] +modId = "minecraft" +type = "required" +versionRange = "[${versions.minecraft}]" +ordering = "NONE" +side = "BOTH" + +[[dependencies."${mod_id}_datagen"]] +modId = "archie" +type = "required" +versionRange = "[${mod_version},)" +ordering = "AFTER" +side = "BOTH" diff --git a/datagen/neoforge/src/main/resources/archie_datagen.mixins.json b/datagen/neoforge/src/main/resources/archie_datagen.mixins.json new file mode 100644 index 000000000..d65b1325c --- /dev/null +++ b/datagen/neoforge/src/main/resources/archie_datagen.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "net.kernelpanicsoft.archie.mixin.neoforge.datagen", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "mixins": [ + "DatagenModLoaderMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/Archie/docs/assets/icon.svg b/docs/assets/icon.svg similarity index 100% rename from Archie/docs/assets/icon.svg rename to docs/assets/icon.svg diff --git a/Archie/docs/config.md b/docs/config.md similarity index 100% rename from Archie/docs/config.md rename to docs/config.md diff --git a/Archie/docs/datagen.md b/docs/datagen.md similarity index 98% rename from Archie/docs/datagen.md rename to docs/datagen.md index 00c11e6f6..7a4c4931f 100644 --- a/Archie/docs/datagen.md +++ b/docs/datagen.md @@ -10,12 +10,12 @@ datagen API directly. ## Running datagen -Datagen runs as a separate Gradle run configuration per loader, from inside `Archie/` (or -`Archie-Test/` for the playground mod): +Datagen runs as a separate Gradle run configuration per loader, from the repo root (or +`archie-test-{fabric,neoforge}` for the playground mod): ```bash -./gradlew fabric:runDatagen -./gradlew neoforge:runDatagen +./gradlew archie-datagen-fabric:runDatagen +./gradlew archie-datagen-neoforge:runDatagen ``` This sets the `archie.datagen` system property, which `ADataGeneratorPlatform.isDataGen` reads to diff --git a/Archie/docs/events.md b/docs/events.md similarity index 100% rename from Archie/docs/events.md rename to docs/events.md diff --git a/Archie/docs/gametest.md b/docs/gametest.md similarity index 98% rename from Archie/docs/gametest.md rename to docs/gametest.md index 78b6c1711..073007245 100644 --- a/Archie/docs/gametest.md +++ b/docs/gametest.md @@ -368,13 +368,13 @@ entirely: ## Running the tests -From inside `Archie/` (or `Archie-Test/`, for the playground mod's own suite): +From the repo root (or `archie-test-{fabric,neoforge}` for the playground mod's own suite): ```bash -./gradlew fabric:runGametest -./gradlew neoforge:runGametest -./gradlew fabric:runGametestClient -./gradlew neoforge:runGametestClient +./gradlew archie-gametest-fabric:runGametest +./gradlew archie-gametest-neoforge:runGametest +./gradlew archie-gametest-fabric:runGametestClient +./gradlew archie-gametest-neoforge:runGametestClient ``` `runGametest` runs server-side `@GameTest`s; `runGametestClient` runs `@ClientGameTest`s via diff --git a/Archie/docs/gui.md b/docs/gui.md similarity index 100% rename from Archie/docs/gui.md rename to docs/gui.md diff --git a/Archie/docs/index.md b/docs/index.md similarity index 97% rename from Archie/docs/index.md rename to docs/index.md index cb3707fdb..0f1be3a4d 100644 --- a/Archie/docs/index.md +++ b/docs/index.md @@ -64,7 +64,7 @@ object MyMod { ## Where to add new code -- Put shared logic in `Archie/common/src/main/kotlin/...` first. +- Put shared logic in `core/common/src/main/kotlin/...` first. - Add loader differences with `expect/actual` triplets: `*.common.kt`, `*.fabric.kt`, `*.neoforge.kt`. - Keep Fabric and NeoForge entrypoints thin (`ArchieFabric`, `ArchieNeoForge`) and delegate to `Archie.init*()`. - Register packet handlers before calling `register()` on your `NetworkChannel`. diff --git a/Archie/docs/networking.md b/docs/networking.md similarity index 100% rename from Archie/docs/networking.md rename to docs/networking.md diff --git a/Archie/docs/news/index.md b/docs/news/index.md similarity index 100% rename from Archie/docs/news/index.md rename to docs/news/index.md diff --git a/Archie/docs/overrides/main.html b/docs/overrides/main.html similarity index 100% rename from Archie/docs/overrides/main.html rename to docs/overrides/main.html diff --git a/Archie/docs/registries.md b/docs/registries.md similarity index 100% rename from Archie/docs/registries.md rename to docs/registries.md diff --git a/Archie/docs/resource-packs.md b/docs/resource-packs.md similarity index 100% rename from Archie/docs/resource-packs.md rename to docs/resource-packs.md diff --git a/Archie/docs/serialization.md b/docs/serialization.md similarity index 100% rename from Archie/docs/serialization.md rename to docs/serialization.md diff --git a/Archie/docs/transfer.md b/docs/transfer.md similarity index 100% rename from Archie/docs/transfer.md rename to docs/transfer.md diff --git a/gametest/common/build.gradle.kts b/gametest/common/build.gradle.kts new file mode 100644 index 000000000..9817344b3 --- /dev/null +++ b/gametest/common/build.gradle.kts @@ -0,0 +1,58 @@ +import org.gradle.api.tasks.testing.logging.TestExceptionFormat + +architectury { + common("fabric", "neoforge") +} + +actualizer { + stubUnfulfilledExpects() +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) +} + +dependencies { + api(project(":archie-core-common", "namedElements")) + modApi(libs.architectury.common) + modApi(libs.storage.common) + modApi(libs.storage.resources.common) + + compileOnly(kotlin("reflect")) + implementation(libs.junit.jupiter.api) + implementation(libs.kotlinx.coroutines.test) + testImplementation(libs.junit.jupiter.api) + testImplementation(kotlin("reflect")) + testRuntimeOnly(libs.junit.jupiter.engine) +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-gametest-common") + + jar { + from(sourceSets.main.get().output) + exclude("**/*StubKt.class") + } + + sourcesJar { + exclude("**/*Stub.kt") + } + + test { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + useJUnitPlatform() + systemProperty("archie.junit.gametest", "true") + // Overridable via -Darchie.junit.gametest.matrix=... (a plain JVM system property, not a + // Gradle project property, so a CI job matrix reaches every product's :test at once). + systemProperty( + "archie.junit.gametest.matrix", + System.getProperty("archie.junit.gametest.matrix") ?: "fabric:server,fabric:client,neoforge:server,neoforge:client", + ) + systemProperty("archie.junit.gametest.timeoutMinutes", "20") + systemProperty("archie.junit.gametest.root", rootProject.rootDir.absolutePath) + testLogging { + exceptionFormat = TestExceptionFormat.FULL + } + } +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEvents.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/events/gametest/AGametestEvents.kt similarity index 62% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEvents.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/events/gametest/AGametestEvents.kt index 2ca7be7da..acb8e6b04 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/events/AEvents.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/events/gametest/AGametestEvents.kt @@ -1,35 +1,31 @@ -package net.kernelpanicsoft.archie.events +package net.kernelpanicsoft.archie.events.gametest -import net.kernelpanicsoft.archie.data.ADataGenerator -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform import dev.architectury.event.Event import dev.architectury.event.EventFactory import dev.architectury.event.EventResult import dev.architectury.platform.Mod -import dev.architectury.platform.Platform -import dev.architectury.utils.Env -import net.kernelpanicsoft.archie.gametest.AGameTestSide +import net.kernelpanicsoft.archie.events.base.Handler +import net.kernelpanicsoft.archie.events.base.HandlerConstructor +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestSide /** - * Archie's central, mod-scoped event registry, built on top of Architectury's event system. + * `archie-gametest`'s central, mod-scoped event registry, built on top of Architectury's event + * system - the gametest half of what used to be `archie-core`'s combined `AEvents`. * - * A downstream mod opts in with `AEvents += MOD` (its own [Mod] descriptor), then listens for - * [GATHER_DATA] and/or [REGISTER_GAME_TEST] via the corresponding handler's - * [HandlerConstructor.create]. Handlers are mod-scoped: [GatherDataHandler] and - * [RegisterGameTestHandler] both check the invoking [Mod] and no-op (via - * [EventResult.pass]) for any mod other than the one they were created for. + * A downstream mod opts in with `AGametestEvents += MOD` (its own [Mod] descriptor), then listens + * for [REGISTER_GAME_TEST] via [RegisterGameTestHandler.Companion.create]. Handlers are + * mod-scoped: they check the invoking [Mod] and no-op (via [EventResult.pass]) for any mod other + * than the one they were created for. */ -object AEvents +object AGametestEvents { - /** Fired during datagen runs; handlers should gate by owning [Mod]. */ - val GATHER_DATA: Event = EventFactory.createEventResult() - /** Fired during gametest registration runs; handlers should register test classes per [Mod]. */ val REGISTER_GAME_TEST: Event = EventFactory.createEventResult() private val mods: MutableList = mutableListOf() - /** Mods that opted into Archie event plumbing via `AEvents += MOD`. */ + /** Mods that opted into `archie-gametest`'s event plumbing via `AGametestEvents += MOD`. */ val MODS: List get() = mods @@ -40,49 +36,6 @@ object AEvents operator fun plusAssign(mod: Mod) = register(mod) - /** Marker for a mod-scoped Architectury event listener created by a [HandlerConstructor]. */ - interface Handler - - /** Builds a mod-scoped [H] whose body invokes `block` on the event's [T] payload. */ - fun interface HandlerConstructor> - { - /** Creates an [H] for [mod] that runs [block] against the [T] payload when invoked. */ - fun create(mod: Mod, block: T.() -> Unit): H - } - - /** - * Handler for [GATHER_DATA]. Implementations are produced via [HandlerConstructor.create] - * and forward to the registered `block` only when the firing [ADataGenerator.mod] matches - * the [Mod] the handler was created for. - */ - interface GatherDataHandler : Handler - { - operator fun invoke(dataGenerator: ADataGenerator): EventResult - - companion object : HandlerConstructor - { - override fun create(mod: Mod, block: ADataGenerator.() -> Unit): GatherDataHandler - { - return GatherDataHandlerImpl(mod, block) - } - - class GatherDataHandlerImpl internal constructor( - private val mod: Mod, - private val gatherData: ADataGenerator.() -> Unit - ) : - GatherDataHandler - { - override operator fun invoke(dataGenerator: ADataGenerator): EventResult - { - if (this.mod != dataGenerator.mod) - return EventResult.pass() - dataGenerator.gatherData() - return EventResult.interruptDefault() - } - } - } - } - /** * DSL receiver passed to [REGISTER_GAME_TEST] listeners for declaring gametest classes. * @@ -175,11 +128,7 @@ object AEvents } return EventResult.interruptDefault() } - - } } } - - } diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt similarity index 99% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt index 494dfebe5..d82c1c0ac 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AClientGameTestHarness.kt @@ -6,6 +6,11 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestCoroutineScheduler import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.gametest.platform.ADedicatedServerPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestModFilter +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestSide +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl import net.kernelpanicsoft.archie.gui.ComposeIdleAware import net.kernelpanicsoft.archie.gui.ComposeTestClockOverride import net.kernelpanicsoft.archie.gui.LayerManagerProvider @@ -1490,7 +1495,7 @@ data class AClientGameTestSummary( /** * Runs every [ClientGameTest]-annotated method across [modToClasses] (as collected by - * [AGameTestPlatform.register] via [AGameTestEventObject]/[AEvents.ArchieGameTestBuilder]'s + * [AGameTestPlatform.register] via [AGameTestEventObject]/`AGametestEvents.ArchieGameTestBuilder`'s * `client { }` block) sequentially on the client thread, then returns to the title screen. * No-ops (returning an all-zero summary) unless [side] is [AGameTestSide.CLIENT]. */ diff --git a/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt new file mode 100644 index 000000000..0ffc8970f --- /dev/null +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestEventObject.kt @@ -0,0 +1,20 @@ +package net.kernelpanicsoft.archie.gametest + +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.events.base.AEventObject +import dev.architectury.event.Event +import dev.architectury.platform.Mod + +/** + * Convenience [AEventObject] base for listening to [AGametestEvents.REGISTER_GAME_TEST] for + * [mod]. Subclass and override [handler] (an [AGametestEvents.ArchieGameTestBuilder] receiver) + * to declare gametest classes via `server { register<...>() }` / `client { ... }` / `common { ... }`. + */ +abstract class AGameTestEventObject(mod: Mod) : + AEventObject( + mod + ) +{ + override val event: Event = AGametestEvents.REGISTER_GAME_TEST + override val handlerConstructor: AGametestEvents.RegisterGameTestHandler.Companion = AGametestEvents.RegisterGameTestHandler.Companion +} diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ComposeScreenTestContext.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ComposeScreenTestContext.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ComposeScreenTestContext.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ComposeScreenTestContext.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/GameTestAssertions.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/GameTestAssertions.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/GameTestAssertions.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/GameTestAssertions.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt similarity index 65% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt index 6745acc6a..f937a5cac 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/NoOpGameTest.kt @@ -1,12 +1,13 @@ package net.kernelpanicsoft.archie.gametest +import net.kernelpanicsoft.archie.gametest.internal.EMPTY import net.minecraft.gametest.framework.GameTest import net.minecraft.gametest.framework.GameTestHelper /** * A trivially-succeeding placeholder, registered by [AGameTestPlatformInternal] on each loader - * when a mod's [AGameTestModFilter]-selected suite has no real test functions for the current - * [AGameTestSide] - e.g. a mod with only client-side coverage (like Archie-Test, whose own suite + * when a mod's [net.kernelpanicsoft.archie.gametest.platform.AGameTestModFilter]-selected suite has no real test functions for the current + * [net.kernelpanicsoft.archie.gametest.platform.AGameTestSide] - e.g. a mod with only client-side coverage (like Archie-Test, whose own suite * registers just [net.kernelpanicsoft.archie.test.gametest.TestScreenGameTest]) running its * server invocation. Vanilla's `GameTestServer` refuses to boot with zero registered test * functions at all (`IllegalArgumentException: No test functions were given!`); this keeps that @@ -14,7 +15,7 @@ import net.minecraft.gametest.framework.GameTestHelper */ @Suppress("unused") class NoOpGameTest { - @GameTest(template = "archie:gametest/empty") + @GameTest(template = EMPTY) fun GameTestHelper.testNoOpPlaceholder() { succeed() } diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparer.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparer.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparer.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparer.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparisonAlgorithm.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparisonAlgorithm.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparisonAlgorithm.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotComparisonAlgorithm.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotManager.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotManager.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotManager.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ScreenshotManager.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/VerboseTestReporter.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/VerboseTestReporter.kt similarity index 100% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/VerboseTestReporter.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/VerboseTestReporter.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt similarity index 69% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt index 27b1be2ab..8d81ca7c4 100644 --- a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/ArchieGameTest.kt @@ -1,7 +1,7 @@ package net.kernelpanicsoft.archie.gametest.internal import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents import net.kernelpanicsoft.archie.gametest.AGameTestEventObject import net.kernelpanicsoft.archie.gametest.internal.tests.ArchieItemHandlerTests import net.kernelpanicsoft.archie.gametest.internal.tests.BlockEntityNBTHolderTests @@ -13,7 +13,12 @@ import net.kernelpanicsoft.archie.gametest.internal.tests.ModalComponentsGameTes /** * ID of the empty structure template used by every GameTest in this suite; GameTests that don't - * need a specific structure should reference this via `@GameTest(template = EMPTY)`. + * need a specific structure should reference this via `@GameTest(template = EMPTY)`. Explicitly + * namespaced - Fabric has no custom template-namespace resolution of its own and relies entirely + * on this string being a complete id. NeoForge's `GameTestHooksMixin` mixes `turnMethodIntoTestFunction` + * itself (not just its two namespace/prefix helper methods) to use this value verbatim instead of + * NeoForge's own unconditional `getTemplateNamespace(method) + ":"` wrap, which would otherwise + * double the "archie:" prefix already present here. */ const val EMPTY = "archie:gametest/empty" @@ -21,7 +26,7 @@ const val EMPTY = "archie:gametest/empty" * Registers Archie's own internal GameTest suite (the tests under [net.kernelpanicsoft.archie.gametest.internal.tests]) * against the given builder, scoped by the environment each suite needs to run in. */ -internal fun AEvents.ArchieGameTestBuilder.archieGameTests() +internal fun AGametestEvents.ArchieGameTestBuilder.archieGameTests() { common { @@ -40,10 +45,10 @@ internal fun AEvents.ArchieGameTestBuilder.archieGameTests() } /** - * Registration entry point for Archie's internal GameTest suite, hooked into [AEvents]'s + * Registration entry point for Archie's internal GameTest suite, hooked into [AGametestEvents]'s * GameTest registration handler for [Archie.MOD]. */ internal object ArchieGameTest : AGameTestEventObject(Archie.MOD) { - override fun AEvents.ArchieGameTestBuilder.handler() = archieGameTests() + override fun AGametestEvents.ArchieGameTestBuilder.handler() = archieGameTests() } \ No newline at end of file diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ArchieItemHandlerTests.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ArchieItemHandlerTests.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ArchieItemHandlerTests.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ArchieItemHandlerTests.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityNBTHolderTests.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityNBTHolderTests.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityNBTHolderTests.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityNBTHolderTests.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityStateManagerTests.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityStateManagerTests.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityStateManagerTests.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/BlockEntityStateManagerTests.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ComposeRenderingTests.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ComposeRenderingTests.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ComposeRenderingTests.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ComposeRenderingTests.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/InputComponentsGameTest.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/InputComponentsGameTest.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/InputComponentsGameTest.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/InputComponentsGameTest.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/LayoutComponentsGameTest.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/LayoutComponentsGameTest.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/LayoutComponentsGameTest.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/LayoutComponentsGameTest.kt diff --git a/Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ModalComponentsGameTest.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ModalComponentsGameTest.kt similarity index 100% rename from Archie/common/src/main/gametest/net/kernelpanicsoft/archie/gametest/internal/tests/ModalComponentsGameTest.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/internal/tests/ModalComponentsGameTest.kt diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt similarity index 83% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt index 63dc0d8d8..f2eb18c5c 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleExecutor.kt @@ -66,26 +66,22 @@ internal object GameTestGradleExecutor { } /** - * Every invocation is a separate --no-daemon Gradle process, and (at least for Archie-Test) - * they all depend on the same upstream composite-build artifact (e.g. Archie:common's - * remapped jar) - starting all of them at once races multiple processes rebuilding/rewriting - * that shared output concurrently, corrupting it (observed: `:Archie:common:remapJar FAILED - * ... ZipException: invalid stored block lengths`). Whichever invocation calls [start] first - * claims [primingClaimed] and runs a single, fast `assemble` build to force those shared - * outputs to exist once; everyone else blocks on [primingComplete] until that finishes. Once - * it's done, Gradle's up-to-date checks mean every invocation's own process only reads the - * already-built artifact, so all of them - including the priming one - start their real - * (long-running) invocation concurrently right after, instead of one invocation blocking - * every other one on its entire run. + * Every invocation is a separate --no-daemon Gradle process, and several products' invocations + * (`archie-gametest`'s own suite, `archie-test`'s own suite) depend on the same shared upstream + * build outputs (e.g. `archie-core-fabric`'s remapped jar) - starting all of them at once races + * multiple processes rebuilding/rewriting that shared output concurrently, corrupting it. + * Whichever invocation calls [start] first claims [primingClaimed] and runs a single, fast + * `assemble` build to force those shared outputs to exist once; everyone else blocks on + * [primingComplete] until that finishes. Once it's done, Gradle's up-to-date checks mean every + * invocation's own process only reads the already-built artifact, so all of them - including + * the priming one - start their real (long-running) invocation concurrently right after, + * instead of one invocation blocking every other one on its entire run. * - * This alone only serializes invocations launched from the same JVM. `Archie`'s and - * `Archie-Test`'s own `:*:test` tasks each run in a *separate* Gradle test JVM, but - * Archie-Test composite-includes `../Archie` (see its settings.gradle.kts), so both JVMs' - * priming runs `assemble` against the very same `Archie:common` build output concurrently - - * this in-process guard does nothing across that boundary (observed: - * `:common:remapJar FAILED ... NoSuchFileException: archie-common-1.0.0.jar.tmp`, one - * process's remap temp file vanishing out from under the other). [withCrossProcessPrimingLock] - * closes that gap with an OS-level file lock shared by both JVMs. + * This alone only serializes invocations launched from the same JVM. `archie-gametest-common`'s + * and `archie-test-common`'s own `:*:test` tasks each run in a *separate* Gradle test JVM, and + * both JVMs' priming runs `assemble` against the very same shared build outputs concurrently - + * this in-process guard does nothing across that boundary. [withCrossProcessPrimingLock] closes + * that gap with an OS-level file lock shared by both JVMs. */ private val primingClaimed = AtomicBoolean(false) private val primingComplete = CompletableFuture() @@ -191,18 +187,18 @@ internal object GameTestGradleExecutor { * it's acquired. * * Every invocation for one workspaceRoot is spawned as a child --no-daemon Gradle process from - * the same `:common:test` JVM, so a plain in-JVM lock is enough here - unlike - * [withCrossProcessPrimingLock], which guards a race between *separate* JVMs (Archie's and - * Archie-Test's own `:*:test` tasks) and needs an OS-level file lock. (A `FileChannel` lock - * would be wrong here for a different reason too: `java.nio.channels.FileLock` throws - * `OverlappingFileLockException` rather than blocking when a *second* lock on the same file - * is requested from within the same JVM - it's designed to guard against other processes, not - * queue other threads in this one.) + * the same `:*-common:test` JVM, so a plain in-JVM lock is enough here - unlike + * [withCrossProcessPrimingLock], which guards a race between *separate* JVMs + * (`archie-gametest-common`'s and `archie-test-common`'s own `:*:test` tasks) and needs an + * OS-level file lock. (A `FileChannel` lock would be wrong here for a different reason too: + * `java.nio.channels.FileLock` throws `OverlappingFileLockException` rather than blocking when + * a *second* lock on the same file is requested from within the same JVM - it's designed to + * guard against other processes, not queue other threads in this one.) * * Unlike [withCrossProcessPrimingLock]'s one-time shared-artifact priming, this serializes * the *actual* invocation runs for the same loader (e.g. fabric:server and fabric:client), - * which both depend on and mutate that loader subproject's own build outputs - * (`:fabric:processResources` etc.) via their own separate, concurrently-launched + * which both depend on and mutate that loader project's own build outputs + * (`processResources` etc.) via their own separate, concurrently-launched * --no-daemon Gradle processes. Without this, one invocation's spawned Minecraft process can * read e.g. `fabric.mod.json` straight off disk at the exact moment the other invocation's * own build is mid-rewrite of that same file - observed as a `ParseMetadataException: diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt similarity index 57% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt index aedb7de4f..125fe0e01 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestGradleInvocation.kt @@ -6,28 +6,31 @@ enum class Loader { NEOFORGE, } -/** The GameTest side (matches [net.kernelpanicsoft.archie.gametest.AGameTestSide]) to launch. */ +/** The GameTest side (matches [net.kernelpanicsoft.archie.gametest.platform.AGameTestSide]) to launch. */ enum class Side { SERVER, CLIENT, } -/** One `loader:side` entry from [GameTestRunner]'s matrix, resolving to a single Gradle [taskPath] to run. */ +/** + * One `loader:side` entry from [GameTestRunner]'s matrix, resolving to a single Gradle [taskPath] + * to run. [projectPrefix] is which product's Gradle projects to target - e.g. `"archie-gametest"` + * for `archie-gametest`'s own self-test suite, `"archie-test"` for the playground mod's - since + * the repo root is now a single Gradle build shared by every product, not one workspace root per + * product the way it used to be. + */ data class GameTestGradleInvocation( val loader: Loader, val side: Side, + val projectPrefix: String, ) { - /** The fully-qualified Gradle task path that launches this invocation, e.g. `:fabric:runGametest`. */ + /** The fully-qualified Gradle task path that launches this invocation, e.g. `:archie-gametest-fabric:runGametest`. */ val taskPath: String - get() = when (loader) { - Loader.FABRIC -> when (side) { - Side.SERVER -> ":fabric:runGametest" - Side.CLIENT -> ":fabric:runGametestClient" - } - - Loader.NEOFORGE -> when (side) { - Side.SERVER -> ":neoforge:runGametest" - Side.CLIENT -> ":neoforge:runGametestClient" + get() { + val project = "$projectPrefix-${loader.name.lowercase()}" + return when (side) { + Side.SERVER -> ":$project:runGametest" + Side.CLIENT -> ":$project:runGametestClient" } } @@ -38,11 +41,11 @@ data class GameTestGradleInvocation( companion object { /** * Parses a comma-separated list of `loader:side` tokens (e.g. `"fabric:server,neoforge:client"`) - * into invocations, as used by [GameTestRunner.PROP_MATRIX]. + * into invocations targeting [projectPrefix], as used by [GameTestRunner.PROP_MATRIX]. * * @throws IllegalArgumentException if a token isn't in `loader:side` form or names an unknown [Loader]/[Side]. */ - fun parseMatrix(value: String): List { + fun parseMatrix(value: String, projectPrefix: String): List { if (value.isBlank()) return emptyList() return value.split(',').map { token -> val parts = token.trim().split(':') @@ -52,6 +55,7 @@ data class GameTestGradleInvocation( GameTestGradleInvocation( loader = Loader.valueOf(parts[0].trim().uppercase()), side = Side.valueOf(parts[1].trim().uppercase()), + projectPrefix = projectPrefix, ) } } diff --git a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt similarity index 91% rename from Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt rename to gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt index c50e60a01..9307b6c8f 100644 --- a/Archie/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt +++ b/gametest/common/src/main/kotlin/net/kernelpanicsoft/archie/gametest/junit/GameTestRunner.kt @@ -1,6 +1,6 @@ package net.kernelpanicsoft.archie.gametest.junit -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents import net.kernelpanicsoft.archie.gametest.ClientGameTest import net.minecraft.gametest.framework.GameTest import org.junit.jupiter.api.Assumptions.assumeTrue @@ -38,10 +38,11 @@ object GameTestRunner * Builds the JUnit dynamic test tree for [modID]: one container per `loader:side` invocation * in the configured matrix, each running the loader's GameTest Gradle task once and then * reporting one [DynamicTest] per test method declared via [tests] (an - * [AEvents.ArchieGameTestBuilder] receiver, same DSL as [AEvents.REGISTER_GAME_TEST]) whose - * side matches that invocation. + * [AGametestEvents.ArchieGameTestBuilder] receiver, same DSL as [AGametestEvents.REGISTER_GAME_TEST]) whose + * side matches that invocation. [projectPrefix] is which product's Gradle projects the launched + * task targets (e.g. `"archie-gametest"`, `"archie-test"`) - see [GameTestGradleInvocation]. */ - fun tests(modID: String, tests: AEvents.ArchieGameTestBuilder.() -> Unit): Collection + fun tests(modID: String, projectPrefix: String, tests: AGametestEvents.ArchieGameTestBuilder.() -> Unit): Collection { val enabled = System.getProperty(PROP_ENABLED)?.toBooleanStrictOrNull() == true if (!enabled) { @@ -55,7 +56,7 @@ object GameTestRunner } val matrixValue = System.getProperty(PROP_MATRIX) ?: DEFAULT_MATRIX - val invocations = GameTestGradleInvocation.parseMatrix(matrixValue) + val invocations = GameTestGradleInvocation.parseMatrix(matrixValue, projectPrefix) require(invocations.isNotEmpty()) { "No GameTest invocations configured. Set -D$PROP_MATRIX with at least one loader:side pair." } @@ -90,7 +91,7 @@ object GameTestRunner } } add(invocationTest) - AEvents.ArchieGameTestBuilder(true).apply(tests).classes.forEach { clazz -> + AGametestEvents.ArchieGameTestBuilder(true).apply(tests).classes.forEach { clazz -> val classUri = URI.create("class:${clazz.name}") add(DynamicContainer.dynamicContainer(clazz.simpleName, classUri, clazz.declaredMethods.flatMap { method -> val hasGameTest = method.getAnnotationsByType(GameTest::class.java).isNotEmpty() diff --git a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt b/gametest/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt similarity index 76% rename from Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt rename to gametest/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt index 9d4ebd97b..2adb2e2b1 100644 --- a/Archie/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt +++ b/gametest/common/src/test/kotlin/net/kernelpanicsoft/archie/testing/GameTests.kt @@ -1,6 +1,6 @@ package net.kernelpanicsoft.archie.testing -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents import net.kernelpanicsoft.archie.gametest.internal.archieGameTests import net.kernelpanicsoft.archie.gametest.junit.GameTestRunner import org.junit.jupiter.api.DynamicContainer @@ -12,5 +12,5 @@ import org.junit.jupiter.api.parallel.ExecutionMode class GameTests { @TestFactory - fun tests(): Collection = GameTestRunner.tests("archie", AEvents.ArchieGameTestBuilder::archieGameTests) + fun tests(): Collection = GameTestRunner.tests("archie", "archie-gametest", AGametestEvents.ArchieGameTestBuilder::archieGameTests) } \ No newline at end of file diff --git a/Archie/common/src/test/resources/junit-platform.properties b/gametest/common/src/test/resources/junit-platform.properties similarity index 100% rename from Archie/common/src/test/resources/junit-platform.properties rename to gametest/common/src/test/resources/junit-platform.properties diff --git a/gametest/fabric/build.gradle.kts b/gametest/fabric/build.gradle.kts new file mode 100644 index 000000000..b64d41606 --- /dev/null +++ b/gametest/fabric/build.gradle.kts @@ -0,0 +1,104 @@ +plugins { + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + fabric() +} + +actualizer { + actualizes(project(":archie-gametest-common")) +} + +configurations { + create("common") + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArg("-XX:+AllowEnhancedClassRedefinition") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + } + create("gametest") { + server() + name = "Minecraft GameTest" + property("fabric-api.gametest") + property("archie.gametest", "true") + property("archie.gametest.side", "server") + property("archie.gametest.modid", "archie") + } + create("gametestClient") { + client() + name = "Minecraft GameTest Client" + property("fabric-api.gametest") + property("archie.gametest", "true") + property("archie.gametest.side", "client") + property("archie.gametest.modid", "archie") + } + } +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.fabric.api) + modImplementation(libs.kotlin.fabric) + compileOnly(libs.kotlinx.serialization) + modLocalRuntime(libs.clothConfig.fabric) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-gametest-common", "namedElements")) { isTransitive = false } + api(project(":archie-core-fabric", "namedElements")) +} + +modResources { + filesMatching.add("fabric.mod.json") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-gametest-fabric") + + test { + useJUnitPlatform() + } + + processResources { + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + sourcesJar { + val commonSources = project(":archie-gametest-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java b/gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java similarity index 83% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java rename to gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java index 375c75c9f..ab1474f24 100644 --- a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java +++ b/gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestHelperMixin.java @@ -1,7 +1,7 @@ package net.kernelpanicsoft.archie.mixin.fabric; import net.fabricmc.fabric.impl.gametest.FabricGameTestHelper; -import net.kernelpanicsoft.archie.gametest.AGameTestPlatformInternal; +import net.kernelpanicsoft.archie.gametest.AGameTestRegistrationBridge; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,6 +11,6 @@ public class FabricGameTestHelperMixin { @Inject(method = "runHeadlessServer(Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lnet/minecraft/server/packs/repository/PackRepository;)V", at = @At("HEAD")) private static void runHeadlessServer(CallbackInfo ci) { - AGameTestPlatformInternal.registerGameTests(); + AGameTestRegistrationBridge.registerGameTests(); } } diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java b/gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java similarity index 92% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java rename to gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java index f2b750a74..3a9fe2cba 100644 --- a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java +++ b/gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/FabricGameTestModInitializerMixin.java @@ -2,7 +2,7 @@ import net.fabricmc.fabric.impl.gametest.FabricGameTestModInitializer; import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform; +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform; import net.kernelpanicsoft.archie.gametest.VerboseTestReporter; import net.minecraft.gametest.framework.GlobalTestReporter; import org.spongepowered.asm.mixin.Mixin; diff --git a/Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/lifecycle/MinecraftClientMixin.java b/gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/lifecycle/MinecraftClientMixin.java similarity index 100% rename from Archie/fabric/src/main/mixin/net/kernelpanicsoft/archie/mixin/fabric/lifecycle/MinecraftClientMixin.java rename to gametest/fabric/src/main/java/net/kernelpanicsoft/archie/mixin/fabric/lifecycle/MinecraftClientMixin.java diff --git a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt similarity index 83% rename from Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt rename to gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt index df8b60397..1cc365883 100644 --- a/Archie/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt +++ b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt @@ -2,7 +2,10 @@ package net.kernelpanicsoft.archie.gametest import dev.architectury.platform.Mod import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestSide +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl import net.minecraft.client.Minecraft import java.util.concurrent.atomic.AtomicBoolean @@ -32,8 +35,8 @@ internal object AGameTestClientHarnessInternal { if (!hasRun.compareAndSet(false, true)) return ThreadingImpl.runTestThread { - val mods = AEvents.MODS.ifEmpty { listOf(Archie.MOD) } - mods.forEach { mod -> AEvents.REGISTER_GAME_TEST.invoker()(mod) } + val mods = AGametestEvents.MODS.ifEmpty { listOf(Archie.MOD) } + mods.forEach { mod -> AGametestEvents.REGISTER_GAME_TEST.invoker()(mod) } val collected: Map>> = AGameTestPlatform.testClasses.mapValues { it.value.toList() } val summary = AClientGameTestHarness.run(collected, AGameTestPlatform.side) @@ -48,4 +51,3 @@ internal object AGameTestClientHarnessInternal { } } } - diff --git a/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt new file mode 100644 index 000000000..c8794f663 --- /dev/null +++ b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt @@ -0,0 +1,66 @@ +package net.kernelpanicsoft.archie.gametest + +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.platform.AGameTestModFilter +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform.isGameTest +import net.kernelpanicsoft.archie.mixin.fabric.FabricGameTestModInitializerMixin +import net.minecraft.gametest.framework.GameTestRegistry +import net.minecraft.gametest.framework.GlobalTestReporter + +/** + * Backs `FabricGameTestHelperMixin`, which calls [registerGameTests] at the head of Fabric's + * `FabricGameTestHelper.runHeadlessServer` - the flush step that drives Fabric's own GameTest + * registry. Named distinctly from `archie-core`'s own (internal, `testClasses`-only) + * `AGameTestPlatformInternal` to avoid a same-package class name collision on the runtime + * classpath - this reaches `archie-core`'s test class map via + * [net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform.testClasses] instead of + * touching that internal object directly. + */ +object AGameTestRegistrationBridge +{ + /** + * No-ops unless [isGameTest]. Fires [AGametestEvents.REGISTER_GAME_TEST] for every mod + * selected by [AGameTestModFilter] (or just [Archie.MOD] if [AGametestEvents.MODS] is empty), + * then registers each resulting test class with [GameTestRegistry] and + * [FabricGameTestModInitializerMixin]'s id/logger bookkeeping - throwing if the same class is + * registered under more than one mod. + * + * Falls back to [NoOpGameTest] for a mod whose registration turns up no classes at all for the + * current [AGameTestPlatform.side] (e.g. a client-only mod's server invocation) - vanilla's + * `GameTestServer` refuses to boot with zero test functions registered anywhere. + */ + @JvmStatic + fun registerGameTests() + { + if (!isGameTest) return + Archie.LOGGER.info("Registering GameTests") + GlobalTestReporter.replaceWith(VerboseTestReporter) + val mods = AGameTestModFilter.selectMods(AGametestEvents.MODS.ifEmpty { listOf(Archie.MOD) }) + for (mod in mods) + { + AGametestEvents.REGISTER_GAME_TEST.invoker()(mod) + val classes = AGameTestPlatform.testClasses.getOrPut(mod, ::mutableSetOf) + val toRegister = if (classes.isEmpty()) setOf(NoOpGameTest::class.java) else classes + for (clazz in toRegister) + { + if (FabricGameTestModInitializerMixin.getGameTestIds().containsKey(clazz)) + { + throw UnsupportedOperationException( + "Test class (${clazz.canonicalName}) has already been registered with mod (${mod.modId})" + ) + } + + FabricGameTestModInitializerMixin.getGameTestIds()[clazz] = mod.modId + GameTestRegistry.register(clazz) + + FabricGameTestModInitializerMixin.getLogger().debug( + "Registered test class {} for mod {}", + clazz.canonicalName, + mod.modId + ) + } + } + } +} diff --git a/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestFabric.kt b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestFabric.kt new file mode 100644 index 000000000..7392d56db --- /dev/null +++ b/gametest/fabric/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestFabric.kt @@ -0,0 +1,26 @@ +package net.kernelpanicsoft.archie.gametest + +import net.fabricmc.api.ModInitializer +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.internal.ArchieGameTest +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform + +/** + * Fabric entrypoint for archie-gametest (`fabric.mod.json` `main`). + * + * Activates [ArchieGameTest] directly rather than via `ArchieExtension`/`ServiceLoader` - NeoForge's + * own per-mod JPMS module boundaries make classic `META-INF/services` discovery unreliable across + * mods, so each product now triggers its own hooks from its own real entrypoint instead. Also + * registers [Archie.MOD] with [AGametestEvents] itself, on Archie's behalf - `archie-core` has no + * gametest entrypoint of its own to do this from, since it doesn't know about gametest concepts. + */ +object ArchieGameTestFabric : ModInitializer +{ + override fun onInitialize() + { + if (!AGameTestPlatform.isGameTest) return + AGametestEvents += Archie.MOD + ArchieGameTest.init() + } +} diff --git a/gametest/fabric/src/main/resources/archie_gametest.mixins.json b/gametest/fabric/src/main/resources/archie_gametest.mixins.json new file mode 100644 index 000000000..be3a066da --- /dev/null +++ b/gametest/fabric/src/main/resources/archie_gametest.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "net.kernelpanicsoft.archie.mixin.fabric", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "client": [ + "lifecycle.MinecraftClientMixin" + ], + "mixins": [ + "FabricGameTestHelperMixin", + "FabricGameTestModInitializerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/gametest/fabric/src/main/resources/fabric.mod.json b/gametest/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..9e3a5b902 --- /dev/null +++ b/gametest/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,34 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}_gametest", + "version": "${mod_version}", + "name": "${mod_display_name} GameTest", + "description": "${mod_display_name}'s GameTest framework/harness - dev/test-time only, never shipped in a production jar.", + "authors": [ + "${mod_authors}" + ], + "contact": { + "homepage": "${mod_url}", + "sources": "${mod_source}" + }, + "license": "${mod_license}", + "environment": "*", + "entrypoints": { + "main": [ + { + "adapter": "kotlin", + "value": "net.kernelpanicsoft.archie.gametest.ArchieGameTestFabric" + } + ] + }, + "mixins": [ + "${mod_id}_gametest.mixins.json" + ], + "depends": { + "minecraft": "${versions.minecraft}", + "fabricloader": ">=${versions.fabric_loader}", + "fabric-api": ">=${versions.fabric_api}", + "fabric-language-kotlin": ">=${versions.kotlin_fabric}", + "archie": ">=${mod_version}" + } +} diff --git a/gametest/neoforge/build.gradle.kts b/gametest/neoforge/build.gradle.kts new file mode 100644 index 000000000..0831174c5 --- /dev/null +++ b/gametest/neoforge/build.gradle.kts @@ -0,0 +1,114 @@ +import org.gradle.api.tasks.bundling.AbstractArchiveTask + +plugins { + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +actualizer { + actualizes(project(":archie-gametest-common")) +} + +configurations { + create("common") + configureEach { + exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") + exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") + } + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + accessWidenerPath.set(project(":archie-core-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + create("gametest") { + server() + name = "Minecraft GameTest" + property("neoforge.enableGameTest", "true") + property("neoforge.gameTestServer", "true") + property("archie.gametest", "true") + property("archie.gametest.modid", "archie") + property("kotlinx.coroutines.debug", "off") + } + create("gametestClient") { + client() + name = "Minecraft GameTest Client" + property("neoforge.enableGameTest", "true") + property("archie.gametest.side", "client") + property("archie.gametest", "true") + property("archie.gametest.modid", "archie") + property("kotlinx.coroutines.debug", "off") + } + } +} + +dependencies { + "neoForge"(libs.neoforge) + implementation(libs.kotlin.neoforge) + compileOnly(libs.kotlinx.serialization) + modRuntimeOnly(libs.clothConfig.neoforge) + modApi(libs.architectury.neoforge) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-gametest-common", "namedElements")) { isTransitive = false } + api(project(":archie-core-neoforge", "namedElements")) +} + +modResources { + filesMatching.add("META-INF/neoforge.mods.toml") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-gametest-neoforge") + + test { + useJUnitPlatform() + } + + processResources { + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + sourcesJar { + val commonSources = project(":archie-gametest-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/gametest/neoforge/gradle.properties b/gametest/neoforge/gradle.properties new file mode 100644 index 000000000..2914393db --- /dev/null +++ b/gametest/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestHooksMixin.java b/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestHooksMixin.java similarity index 59% rename from Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestHooksMixin.java rename to gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestHooksMixin.java index 54baa19ba..1f478b33c 100644 --- a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/GameTestHooksMixin.java +++ b/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestHooksMixin.java @@ -1,8 +1,8 @@ -package net.kernelpanicsoft.archie.mixin.neoforge; +package net.kernelpanicsoft.archie.mixin.neoforge.gametest; import net.kernelpanicsoft.archie.Archie; -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform; -import net.kernelpanicsoft.archie.gametest.AGameTestPlatformInternal; +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform; +import net.kernelpanicsoft.archie.gametest.AGameTestRegistrationBridge; import net.kernelpanicsoft.archie.gametest.VerboseTestReporter; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GlobalTestReporter; @@ -24,31 +24,36 @@ public abstract class GameTestHooksMixin { private static void getTemplateNamespaceMixin(Method method, CallbackInfoReturnable cir) { GameTest gameTest = method.getAnnotation(GameTest.class); - Mod mod = AGameTestPlatformInternal.getTestClassToMod().get(method.getDeclaringClass()); + Mod mod = AGameTestRegistrationBridge.getTestClassToMod().get(method.getDeclaringClass()); if (gameTest.template().contains(":")) { ResourceLocation template = ResourceLocation.parse(gameTest.template()); cir.setReturnValue(template.getNamespace()); + cir.cancel(); return; } - if (mod != null) - { - cir.setReturnValue(mod.getModId()); - return; - } - + // NoOpGameTest (the fallback placeholder used when a mod has zero real registered tests + // for the current side) never goes through AGameTestPlatform.register, so it's never in + // AGameTestRegistrationBridge.getTestClassToMod() - it's always Archie's own infrastructure + // regardless of which mod's invocation triggered it, so default to Archie.MOD's id. + cir.setReturnValue(mod != null ? mod.getModId() : Archie.MOD_ID); + cir.cancel(); } + /** + * Always suppresses vanilla's own "namespace." infix (see NeoForge's {@code GameTestHooks# + * turnMethodIntoTestFunction}) - it unconditionally wraps the result with {@code + * getTemplateNamespace(method) + ":"} regardless of this method's return value, so any + * additional infixing here would only ever produce a malformed structure id for Archie's own + * (bare-path) templates. + */ @Inject(method = "prefixGameTestTemplate(Ljava/lang/reflect/Method;)Z", at = @At("HEAD"), cancellable = true) private static void prefixGameTestTemplateMixin(Method method, CallbackInfoReturnable cir) { - GameTest gameTest = method.getAnnotation(GameTest.class); - if (gameTest.template().contains(":")) - { - cir.setReturnValue(false); - } + cir.setReturnValue(false); + cir.cancel(); } @Inject(method = "registerGametests()V", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEvent(Lnet/neoforged/bus/api/Event;)V")) @@ -58,7 +63,7 @@ private static void registerGametests(CallbackInfo ci) { Archie.LOGGER.info("Registering GameTests"); GlobalTestReporter.replaceWith(VerboseTestReporter.INSTANCE); - AGameTestPlatformInternal.addEventHandlers(); + AGameTestRegistrationBridge.addEventHandlers(); } } } diff --git a/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestRegistryMixin.java b/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestRegistryMixin.java new file mode 100644 index 000000000..f3ffbbf3d --- /dev/null +++ b/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/gametest/GameTestRegistryMixin.java @@ -0,0 +1,39 @@ +package net.kernelpanicsoft.archie.mixin.neoforge.gametest; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestRegistry; +import net.minecraft.gametest.framework.TestFunction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.lang.reflect.Method; + +/** + * `GameTestRegistry#turnMethodIntoTestFunction` unconditionally wraps its result with + * {@code GameTestHooks.getTemplateNamespace(method) + ":"}, regardless of what {@code + * GameTestHooks#prefixGameTestTemplate} returns - {@code GameTestHooksMixin}'s overrides of those + * two methods alone can't prevent an already-namespaced {@code @GameTest(template = ...)} string + * (like Archie's own {@code EMPTY} constant) from coming out double-prefixed. Fix up the result + * directly instead: {@link TestFunction} is a record, so every other field can just be copied + * from vanilla's own (otherwise correct) result. + */ +@Mixin(GameTestRegistry.class) +public abstract class GameTestRegistryMixin +{ + @ModifyReturnValue(method = "turnMethodIntoTestFunction", at = @At("RETURN")) + private static TestFunction archie$fixNamespacedTemplate(TestFunction original, Method method) + { + GameTest gameTest = method.getAnnotation(GameTest.class); + if (gameTest == null || !gameTest.template().contains(":")) + { + return original; + } + + return new TestFunction( + original.batchName(), original.testName(), gameTest.template(), original.rotation(), + original.maxTicks(), original.setupTicks(), original.required(), original.manualOnly(), + original.maxAttempts(), original.requiredSuccesses(), original.skyAccess(), original.function() + ); + } +} diff --git a/Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/lifecycle/MinecraftClientMixin.java b/gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/lifecycle/MinecraftClientMixin.java similarity index 100% rename from Archie/neoforge/src/main/mixin/net/kernelpanicsoft/archie/mixin/neoforge/lifecycle/MinecraftClientMixin.java rename to gametest/neoforge/src/main/java/net/kernelpanicsoft/archie/mixin/neoforge/lifecycle/MinecraftClientMixin.java diff --git a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt similarity index 81% rename from Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt rename to gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt index 269ecc235..1cc365883 100644 --- a/Archie/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt +++ b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestClientHarnessInternal.kt @@ -2,7 +2,10 @@ package net.kernelpanicsoft.archie.gametest import dev.architectury.platform.Mod import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.gametest.platform.AGameTestSide +import net.kernelpanicsoft.archie.gametest.platform.ThreadingImpl import net.minecraft.client.Minecraft import java.util.concurrent.atomic.AtomicBoolean @@ -32,10 +35,10 @@ internal object AGameTestClientHarnessInternal { if (!hasRun.compareAndSet(false, true)) return ThreadingImpl.runTestThread { - val mods = AEvents.MODS.ifEmpty { listOf(Archie.MOD) } - mods.forEach { mod -> AEvents.REGISTER_GAME_TEST.invoker()(mod) } + val mods = AGametestEvents.MODS.ifEmpty { listOf(Archie.MOD) } + mods.forEach { mod -> AGametestEvents.REGISTER_GAME_TEST.invoker()(mod) } - val collected: Map>> = AGameTestPlatformInternal.testClasses.mapValues { it.value.toList() } + val collected: Map>> = AGameTestPlatform.testClasses.mapValues { it.value.toList() } val summary = AClientGameTestHarness.run(collected, AGameTestPlatform.side) if (summary.failed > 0) { val details = summary.failedDetails.joinToString("\n") { failure -> @@ -48,4 +51,3 @@ internal object AGameTestClientHarnessInternal { } } } - diff --git a/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt new file mode 100644 index 000000000..5f27972de --- /dev/null +++ b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/AGameTestRegistrationBridge.kt @@ -0,0 +1,65 @@ +package net.kernelpanicsoft.archie.gametest + +import dev.architectury.platform.Mod +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.platform.AGameTestModFilter +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.neoforged.fml.ModList +import net.neoforged.neoforge.event.RegisterGameTestsEvent + +/** + * Backs [AGameTestPlatform] on NeoForge: drives NeoForge's own `RegisterGameTestsEvent`. Named + * distinctly from `archie-core`'s own (internal, `testClasses`-only) `AGameTestPlatformInternal` + * to avoid a same-package class name collision on the runtime classpath - this reaches + * `archie-core`'s test class map via [AGameTestPlatform.testClasses] instead of touching that + * internal object directly. + */ +object AGameTestRegistrationBridge +{ + /** + * Inverse of [AGameTestPlatform.testClasses]: the owning mod for each registered test class. + * Used by `GameTestHooksMixin` to resolve a `@GameTest`-annotated method's template namespace + * when its `template()` string doesn't specify one explicitly. + */ + @JvmStatic + @get:JvmName("getTestClassToMod") + val testClassToMod: Map, Mod> + get() = buildMap { + AGameTestPlatform.testClasses.forEach { (mod, classes) -> + classes.forEach { put(it, mod) } + } + } + + /** + * No-ops unless [AGameTestPlatform.isGameTest]. For every mod selected by + * [AGameTestModFilter] from [AGametestEvents.MODS] (or just [Archie.MOD] if that's empty), + * subscribes to that mod's `RegisterGameTestsEvent`; when it fires, fires + * [AGametestEvents.REGISTER_GAME_TEST] for the mod and registers each resulting test class + * with NeoForge's event. + * + * Falls back to [NoOpGameTest] for a mod whose registration turns up no classes at all for the + * current [AGameTestPlatform.side] (e.g. a client-only mod's server invocation) - vanilla's + * `GameTestServer` refuses to boot with zero test functions registered anywhere. + */ + @JvmStatic + @JvmName("addEventHandlers") + fun addEventHandlers() + { + if (!AGameTestPlatform.isGameTest) return + + for (mod in AGameTestModFilter.selectMods(AGametestEvents.MODS.ifEmpty { listOf(Archie.MOD) })) + { + ModList.get().getModContainerById(mod.modId).ifPresent { + it.eventBus?.addListener { event -> + AGametestEvents.REGISTER_GAME_TEST.invoker()(mod) + val classes = AGameTestPlatform.testClasses.getOrPut(mod, ::mutableSetOf) + for (clazz in if (classes.isEmpty()) setOf(NoOpGameTest::class.java) else classes) + { + event.register(clazz) + } + } + } + } + } +} diff --git a/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestNeoForge.kt b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestNeoForge.kt new file mode 100644 index 000000000..12ecf82b4 --- /dev/null +++ b/gametest/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/gametest/ArchieGameTestNeoForge.kt @@ -0,0 +1,29 @@ +package net.kernelpanicsoft.archie.gametest + +import net.kernelpanicsoft.archie.Archie +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.internal.ArchieGameTest +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.neoforged.fml.common.Mod + +/** + * NeoForge entrypoint for archie-gametest, registered via the `@Mod` annotation. + * + * Activates [ArchieGameTest] directly rather than via `ArchieExtension`/`ServiceLoader` - NeoForge's + * own per-mod JPMS module boundaries make classic `META-INF/services` discovery unreliable across + * mods, so each product now triggers its own hooks from its own real entrypoint instead. Also + * registers [Archie.MOD] with [AGametestEvents] itself, on Archie's behalf - `archie-core` has no + * gametest entrypoint of its own to do this from, since it doesn't know about gametest concepts. + */ +@Mod("archie_gametest") +object ArchieGameTestNeoForge +{ + init + { + if (AGameTestPlatform.isGameTest) + { + AGametestEvents += Archie.MOD + ArchieGameTest.init() + } + } +} diff --git a/gametest/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/gametest/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 000000000..982d6e9ce --- /dev/null +++ b/gametest/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,38 @@ +modLoader = "klf" +loaderVersion = "[${versions.kotlin_neoforge_range},)" +issueTrackerURL = "" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}_gametest" +version = "${mod_version}" +displayName = "${mod_display_name} GameTest" +authors = "${mod_authors}" +description = ''' +${mod_display_name}'s GameTest framework/harness - dev/test-time only, never shipped in a production jar. +''' +displayURL = "${mod_url}" + +[[mixins]] +config = "${mod_id}_gametest.mixins.json" + +[[dependencies."${mod_id}_gametest"]] +modId = "neoforge" +type = "required" +versionRange = "[${versions.neoforge_range},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies."${mod_id}_gametest"]] +modId = "minecraft" +type = "required" +versionRange = "[${versions.minecraft}]" +ordering = "NONE" +side = "BOTH" + +[[dependencies."${mod_id}_gametest"]] +modId = "archie" +type = "required" +versionRange = "[${mod_version},)" +ordering = "AFTER" +side = "BOTH" diff --git a/gametest/neoforge/src/main/resources/archie_gametest.mixins.json b/gametest/neoforge/src/main/resources/archie_gametest.mixins.json new file mode 100644 index 000000000..5d6920474 --- /dev/null +++ b/gametest/neoforge/src/main/resources/archie_gametest.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "net.kernelpanicsoft.archie.mixin.neoforge", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "client": [ + "lifecycle.MinecraftClientMixin" + ], + "mixins": [ + "gametest.GameTestHooksMixin", + "gametest.GameTestRegistryMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/gradle.properties b/gradle.properties index 1d397d138..eb2bd8617 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true mod_id=archie -mod_group=net.kernelpanicsoft +mod_group=net.kernelpanicsoft.archie mod_version=1.0.0 mod_display_name=Archie mod_description=A library mod for Kernel Panic's mods @@ -16,4 +16,3 @@ mod_license=GPL-3.0-or-later client_datagen=true server_datagen=true - diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917..a4b76b953 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradlew b/gradlew index 1aa94a426..f3b75f3b0 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 7101f8e46..9b42019c7 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/Archie/mkdocs.yml b/mkdocs.yml similarity index 98% rename from Archie/mkdocs.yml rename to mkdocs.yml index dd82aa5d1..325a87f0e 100644 --- a/Archie/mkdocs.yml +++ b/mkdocs.yml @@ -4,7 +4,7 @@ site_description: > site_author: Kernel Panic site_url: https://docs.kernelpanicsoft.net/Archie/ repo_url: https://github.com/kernel-panic-codecave/Archie/ -edit_uri: edit/1.21.x/Archie/docs/ +edit_uri: edit/1.21.x/docs/ use_directory_urls: false theme: name: material diff --git a/settings.gradle.kts b/settings.gradle.kts index 15e04a1dc..4cd9a8e67 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +rootProject.name = "Archie" + pluginManagement { repositories { maven("https://maven.fabricmc.net/") @@ -7,15 +10,33 @@ pluginManagement { maven("https://maven.neoforged.net/releases/") maven("https://maven.firstdarkdev.xyz/releases") maven { - name = "kernelpanic" + name = "kernelpanic releases" url = uri("https://maven.kernelpanicsoft.net/releases") } + maven { + name = "kernelpanic snapshots" + url = uri("https://maven.kernelpanicsoft.net/snapshots") + } + mavenLocal() gradlePluginPortal() } -// includeBuild("plugins") } -rootProject.name = "Archie-Repo" +includeModule("core") + +includeModule("datagen") -includeBuild("Archie") -includeBuild("Archie-Test") +includeModule("gametest") + +includeModule("test") + +fun includeModulePlatform(name: String, platform: String) { + include("$name/$platform") + project(":$name/$platform").name = "archie-$name-$platform" +} + +fun includeModule(name: String) { + includeModulePlatform(name, "common") + includeModulePlatform(name, "fabric") + includeModulePlatform(name, "neoforge") +} diff --git a/test/common/build.gradle.kts b/test/common/build.gradle.kts new file mode 100644 index 000000000..2efc4d2e5 --- /dev/null +++ b/test/common/build.gradle.kts @@ -0,0 +1,48 @@ +architectury { + common("fabric", "neoforge") +} + +actualizer { + stubUnfulfilledExpects() +} + +loom { + log4jConfigs.from(rootDir.resolve("log4j-dev.xml")) + accessWidenerPath = file("src/main/resources/archie_test.accesswidener") + enableTransitiveAccessWideners = true +} + +dependencies { + api(project(":archie-core-common", "namedElements")) + api(project(":archie-datagen-common", "namedElements")) + api(project(":archie-gametest-common", "namedElements")) + + testImplementation(libs.junit.jupiter.api) + testImplementation(kotlin("reflect")) + testRuntimeOnly(libs.junit.jupiter.engine) + // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies + // Do NOT use other classes from fabric loader + modImplementation(libs.fabric.loader) + + modApi(libs.architectury.common) + modApi(libs.rei.common) + modApi(libs.storage.common) + modApi(libs.storage.resources.common) +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-test-common") + + test { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + useJUnitPlatform() + systemProperty("archie.junit.gametest", "true") + systemProperty( + "archie.junit.gametest.matrix", + System.getProperty("archie.junit.gametest.matrix") ?: "fabric:server,fabric:client,neoforge:server,neoforge:client", + ) + systemProperty("archie.junit.gametest.timeoutMinutes", "20") + systemProperty("archie.junit.gametest.root", rootProject.rootDir.absolutePath) + } +} diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt similarity index 67% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt index 5d691e294..7893a95cd 100644 --- a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt +++ b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTest.kt @@ -4,12 +4,12 @@ import com.mojang.logging.LogUtils import dev.architectury.platform.Mod import dev.architectury.platform.Platform import net.kernelpanicsoft.archie.Archie -import net.kernelpanicsoft.archie.data.ADataGeneratorPlatform -import net.kernelpanicsoft.archie.events.AEvents -import net.kernelpanicsoft.archie.gametest.AGameTestPlatform +import net.kernelpanicsoft.archie.data.platform.ADataGeneratorPlatform +import net.kernelpanicsoft.archie.events.datagen.ADatagenEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform import net.kernelpanicsoft.archie.test.gametest.ArchieTestGameTest import net.kernelpanicsoft.archie.test.gametest.DataAttachmentTestFixtures -import net.kernelpanicsoft.archie.test.gametest.CapabilityLookupTestFixtures import net.kernelpanicsoft.archie.test.data.ArchieTestDatagen import net.kernelpanicsoft.archie.util.onClient import net.minecraft.resources.ResourceLocation @@ -31,7 +31,8 @@ object ArchieTest @JvmStatic fun init() { - AEvents += MOD + ADatagenEvents += MOD + AGametestEvents += MOD if (ADataGeneratorPlatform.isDataGen) ArchieTestDatagen.init() if (AGameTestPlatform.isGameTest) @@ -42,11 +43,6 @@ object ArchieTest GuiRegistry.init() if (AGameTestPlatform.isGameTest) DataAttachmentTestFixtures.init() - // Must come after TileRegistry.init() (needs TestTile to actually exist), but is otherwise - // still normal mod-init timing - see CapabilityLookupTestFixtures's KDoc for why this can't - // be deferred to inside the @GameTest methods themselves. - if (AGameTestPlatform.isGameTest) - CapabilityLookupTestFixtures.init() } @JvmStatic diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/BlockRegistry.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/BlockRegistry.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/BlockRegistry.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/BlockRegistry.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/GuiRegistry.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/GuiRegistry.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/GuiRegistry.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/GuiRegistry.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ItemRegistry.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ItemRegistry.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ItemRegistry.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/ItemRegistry.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestBlock.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestBlock.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestBlock.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestBlock.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItem.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItem.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItem.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItem.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemContainerScreen.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemContainerScreen.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemContainerScreen.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemContainerScreen.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemMenu.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemMenu.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemMenu.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemMenu.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemScreen.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemScreen.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemScreen.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestItemScreen.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestKind.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestKind.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestKind.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestKind.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestMenu.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestMenu.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestMenu.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestMenu.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestScreen.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestScreen.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestScreen.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestScreen.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestTile.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestTile.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestTile.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TestTile.kt diff --git a/Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TileRegistry.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TileRegistry.kt similarity index 100% rename from Archie-Test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TileRegistry.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/TileRegistry.kt diff --git a/Archie-Test/common/src/main/datagen/net/kernelpanicsoft/archie/test/data/ArchieTestDatagen.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/data/ArchieTestDatagen.kt similarity index 100% rename from Archie-Test/common/src/main/datagen/net/kernelpanicsoft/archie/test/data/ArchieTestDatagen.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/data/ArchieTestDatagen.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt similarity index 68% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt index ab87661af..a48f45928 100644 --- a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt +++ b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ArchieTestGameTest.kt @@ -1,10 +1,10 @@ package net.kernelpanicsoft.archie.test.gametest -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents import net.kernelpanicsoft.archie.gametest.AGameTestEventObject import net.kernelpanicsoft.archie.test.ArchieTest -internal fun AEvents.ArchieGameTestBuilder.archieTestGameTests() +internal fun AGametestEvents.ArchieGameTestBuilder.archieTestGameTests() { client { register() @@ -21,5 +21,5 @@ internal fun AEvents.ArchieGameTestBuilder.archieTestGameTests() internal object ArchieTestGameTest : AGameTestEventObject(ArchieTest.MOD) { - override fun AEvents.ArchieGameTestBuilder.handler() = archieTestGameTests() + override fun AGametestEvents.ArchieGameTestBuilder.handler() = archieTestGameTests() } diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTestFixtures.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTestFixtures.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTestFixtures.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTestFixtures.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTests.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTests.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTests.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/CapabilityLookupTests.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuClientTests.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuClientTests.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuClientTests.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuClientTests.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuTests.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuTests.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuTests.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/ComposeItemContainerMenuTests.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTestFixtures.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTestFixtures.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTestFixtures.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTestFixtures.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTests.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTests.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTests.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/DataAttachmentTests.kt diff --git a/Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/TestScreenGameTest.kt b/test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/TestScreenGameTest.kt similarity index 100% rename from Archie-Test/common/src/main/gametest/net/kernelpanicsoft/archie/test/gametest/TestScreenGameTest.kt rename to test/common/src/main/kotlin/net/kernelpanicsoft/archie/test/gametest/TestScreenGameTest.kt diff --git a/Archie-Test/common/src/main/resources/archie_test.accesswidener b/test/common/src/main/resources/archie_test.accesswidener similarity index 100% rename from Archie-Test/common/src/main/resources/archie_test.accesswidener rename to test/common/src/main/resources/archie_test.accesswidener diff --git a/Archie-Test/common/src/main/resources/archie_test.common.json b/test/common/src/main/resources/archie_test.common.json similarity index 100% rename from Archie-Test/common/src/main/resources/archie_test.common.json rename to test/common/src/main/resources/archie_test.common.json diff --git a/Archie/common/src/main/resources/assets/archie/banner.png b/test/common/src/main/resources/assets/archie_test/banner.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/banner.png rename to test/common/src/main/resources/assets/archie_test/banner.png diff --git a/Archie/common/src/main/resources/assets/archie/icon.png b/test/common/src/main/resources/assets/archie_test/icon.png similarity index 100% rename from Archie/common/src/main/resources/assets/archie/icon.png rename to test/common/src/main/resources/assets/archie_test/icon.png diff --git a/Archie-Test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt b/test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt similarity index 76% rename from Archie-Test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt rename to test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt index a5402494a..c11cd59ca 100644 --- a/Archie-Test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt +++ b/test/common/src/test/kotlin/net/kernelpanicsoft/archie/test/testing/GameTests.kt @@ -1,6 +1,6 @@ package net.kernelpanicsoft.archie.test.testing -import net.kernelpanicsoft.archie.events.AEvents +import net.kernelpanicsoft.archie.events.gametest.AGametestEvents import net.kernelpanicsoft.archie.gametest.junit.GameTestRunner import net.kernelpanicsoft.archie.test.gametest.archieTestGameTests import org.junit.jupiter.api.DynamicContainer @@ -12,5 +12,5 @@ import org.junit.jupiter.api.parallel.ExecutionMode class GameTests { @TestFactory - fun tests(): Collection = GameTestRunner.tests("archie_test", AEvents.ArchieGameTestBuilder::archieTestGameTests) + fun tests(): Collection = GameTestRunner.tests("archie_test", "archie-test", AGametestEvents.ArchieGameTestBuilder::archieTestGameTests) } \ No newline at end of file diff --git a/test/common/src/test/resources/junit-platform.properties b/test/common/src/test/resources/junit-platform.properties new file mode 100644 index 000000000..222e4cb1a --- /dev/null +++ b/test/common/src/test/resources/junit-platform.properties @@ -0,0 +1,17 @@ +# Parallel execution is enabled but defaults to same_thread, so every existing test class stays +# sequential unless it explicitly opts in via @Execution(CONCURRENT) (see GameTests). +junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.mode.default=same_thread +junit.jupiter.execution.parallel.mode.classes.default=same_thread + +# Worker threads here spend most of their time blocked waiting on external Gradle/Minecraft +# processes rather than doing CPU work, so size the pool by a fixed count instead of core count +# (which on small CI runners could be lower than the GameTest matrix size). Each invocation test +# and each individual method test blocks its own thread until its specific result appears in the +# invocation's log (which can be minutes into a 20-minute run, since the game processes its own +# tests sequentially) - too small a pool here means most tests just queue for a thread that won't +# free up soon, never even starting even though their result may already be available. Sized well +# past worst-case demand (invocation count + every matching test method across the whole matrix) +# since these threads are cheap to over-provision. +junit.jupiter.execution.parallel.config.strategy=fixed +junit.jupiter.execution.parallel.config.fixed.parallelism=128 diff --git a/test/fabric/build.gradle.kts b/test/fabric/build.gradle.kts new file mode 100644 index 000000000..fa0fe9dff --- /dev/null +++ b/test/fabric/build.gradle.kts @@ -0,0 +1,156 @@ +import net.kernelpanicsoft.archie.plugin.bundleMod + +plugins { + alias(libs.plugins.shadow) + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + fabric() +} + +actualizer { + actualizes(project(":archie-test-common")) +} + +configurations { + create("common") + create("shadowCommon") + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + log4jConfigs.from(project(":archie-test-common").loom.log4jConfigs) + accessWidenerPath.set(project(":archie-test-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArg("-XX:+AllowEnhancedClassRedefinition") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + } + // This adds a new gradle task that runs the datagen API: "gradlew runDatagen" + create("datagen") { + client() + name = "Minecraft Datagen" + property("archie.datagen", "true") + property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) + property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) + property("fabric-api.datagen") + property("fabric-api.datagen.modid", "archie_test") + property("fabric-api.datagen.output-dir", file("src/main/generated").absolutePath) + + runDir = "build/datagen" + } + create("gametest") { + server() + name = "Minecraft GameTest" + property("fabric-api.gametest") + property("archie.gametest", "true") + property("archie.gametest.side", "server") + property("archie.gametest.modid", "archie_test") + } + create("gametestClient") { + client() + name = "Minecraft GameTest Client" + property("fabric-api.gametest") + property("archie.gametest", "true") + property("archie.gametest.side", "client") + property("archie.gametest.modid", "archie_test") + } + } +} + +fabricApi.configureDataGeneration { + createRunConfiguration = false + outputDirectory.set(file("src/main/generated")) +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.fabric.api) + modApi(libs.architectury.fabric) + modImplementation(libs.kotlin.fabric) + modLocalRuntime(libs.rei.fabric) + modLocalRuntime(libs.catalogue.fabric) + modLocalRuntime(libs.menulogue.fabric) + modLocalRuntime(libs.clothConfig.fabric) + bundleMod(libs.storage.fabric) + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-test-common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":archie-test-common", "transformProductionFabric")) { isTransitive = false } + api(project(":archie-core-fabric", "namedElements")) + api(project(":archie-datagen-fabric", "namedElements")) + api(project(":archie-gametest-fabric", "namedElements")) + // See the matching comment in gametest/fabric/build.gradle.kts. + runtimeOnly(project(":archie-core-common", "namedElements")) { isTransitive = false } +} + +modResources { + filesMatching.add("fabric.mod.json") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-test-fabric") + + test { + useJUnitPlatform() + } + + processResources { + from(project(":archie-test-common").sourceSets.main.get().resources) { + include("assets/archie_test/**") + include("data/archie_test/**") + include("archie_test.common.json") + include("archie_test.accesswidener") + } + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + shadowJar { + configurations = + listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) + archiveClassifier.set("dev-shadow") + } + + remapJar { + injectAccessWidener.set(true) + inputFile.set(shadowJar.get().archiveFile) + dependsOn(shadowJar) + } + + jar.get().archiveClassifier.set("dev") + + sourcesJar { + val commonSources = project(":archie-test-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt b/test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt new file mode 100644 index 000000000..669c352db --- /dev/null +++ b/test/fabric/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestFabric.kt @@ -0,0 +1,23 @@ +package net.kernelpanicsoft.archie.test + +import net.fabricmc.api.ClientModInitializer +import net.fabricmc.api.ModInitializer +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.test.gametest.CapabilityLookupTestFixtures + +object ArchieTestFabric : ModInitializer, ClientModInitializer +{ + override fun onInitialize() + { + ArchieTest.init() + ArchieTest.initCommon() + // See the matching comment in ArchieTest.init() - Fabric's registries resolve immediately + // on registration (no staged/frozen model to race), so this is safe right here. + if (AGameTestPlatform.isGameTest) CapabilityLookupTestFixtures.init() + } + + override fun onInitializeClient() + { + ArchieTest.initClient() + } +} \ No newline at end of file diff --git a/Archie-Test/fabric/src/main/resources/fabric.mod.json b/test/fabric/src/main/resources/fabric.mod.json similarity index 78% rename from Archie-Test/fabric/src/main/resources/fabric.mod.json rename to test/fabric/src/main/resources/fabric.mod.json index 1096ed1f2..e33df7f81 100644 --- a/Archie-Test/fabric/src/main/resources/fabric.mod.json +++ b/test/fabric/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "${mod_id}", + "id": "${mod_id}_test", "version": "${mod_version}", - "name": "${mod_display_name}", + "name": "${mod_display_name} Test", "description": "${mod_description}", "authors": [ "${mod_authors}" @@ -16,11 +16,11 @@ }, "custom": { "catalogue": { - "banner": "assets/${mod_id}/banner.png" + "banner": "assets/${mod_id}_test/banner.png" } }, "license": "${mod_license}", - "icon": "assets/${mod_id}/icon.png", + "icon": "assets/${mod_id}_test/icon.png", "environment": "*", "entrypoints": { "main": [ @@ -42,6 +42,7 @@ "fabric-api": ">=${versions.fabric_api}", "fabric-language-kotlin": ">=${versions.kotlin_fabric}", "architectury": ">=${versions.architectury}", - "cloth-config": ">=${versions.cloth_config_range}" + "cloth-config": ">=${versions.cloth_config_range}", + "archie": ">=${mod_version}" } } \ No newline at end of file diff --git a/test/neoforge/build.gradle.kts b/test/neoforge/build.gradle.kts new file mode 100644 index 000000000..e8f6213de --- /dev/null +++ b/test/neoforge/build.gradle.kts @@ -0,0 +1,171 @@ +import net.kernelpanicsoft.archie.plugin.bundleMod + +plugins { + alias(libs.plugins.shadow) + alias(libs.plugins.archie) +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +actualizer { + actualizes(project(":archie-test-common")) +} + +configurations { + create("common") + create("shadowCommon") + configureEach { + // Keep NeoForge Kotlin runtime provided by KotlinLangForge only. + exclude(group = "thedarkcolour", module = "kotlinforforge-neoforge") + exclude(group = "remapped.thedarkcolour", module = "kotlinforforge-neoforge-1d1bcbf2") + } + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + testCompileClasspath.get().extendsFrom(compileClasspath.get()) + testRuntimeClasspath.get().extendsFrom(runtimeClasspath.get()) +} + +loom { + log4jConfigs.from(project(":archie-test-common").loom.log4jConfigs) + accessWidenerPath.set(project(":archie-test-common").loom.accessWidenerPath) + + mods { + maybeCreate("main").apply { + sourceSet(sourceSets.main.get()) + } + } + + runs { + getByName("client") { + name = "Minecraft Client" + source(sourceSets.main.get()) + vmArgs("-XX:+AllowEnhancedClassRedefinition") + property("kotlinx.coroutines.debug", "off") + } + getByName("server") { + name = "Minecraft Server" + source(sourceSets.main.get()) + property("kotlinx.coroutines.debug", "off") + vmArgs("-XX:+AllowEnhancedClassRedefinition") + } + create("datagen") { + data() + name = "Minecraft Datagen" + property("archie.datagen", "true") + property("archie.datagen.client", providers.gradleProperty("client_datagen").orElse("true").get()) + property("archie.datagen.server", providers.gradleProperty("server_datagen").orElse("true").get()) + property("kotlinx.coroutines.debug", "off") + programArgs("--all", "--mod", "archie_test") + programArgs("--output", file("src/main/generated").absolutePath) + } + + create("gametest") { + server() + name = "Minecraft GameTest" + property("neoforge.enableGameTest", "true") + property("neoforge.gameTestServer", "true") + property("archie.gametest", "true") + property("archie.gametest.modid", "archie_test") + property("kotlinx.coroutines.debug", "off") + providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } + } + + create("gametestClient") { + client() + name = "Minecraft GameTest Client" + property("neoforge.enableGameTest", "true") + property("archie.gametest.side", "client") + property("archie.gametest", "true") + property("archie.gametest.modid", "archie_test") + property("kotlinx.coroutines.debug", "off") + providers.gradleProperty("archie.junit.gametest.function").orNull?.let { property("archie.junit.gametest.function", it) } + } + } +} + +sourceSets { + main { + resources { + srcDir("src/main/generated") + } + } +} + +dependencies { + "neoForge"(libs.neoforge) + modApi(libs.architectury.neoforge) + implementation(libs.kotlin.neoforge) + modRuntimeOnly(libs.rei.neoforge) + modRuntimeOnly(libs.catalogue.neoforge) + modRuntimeOnly(libs.clothConfig.neoforge) + bundleMod(libs.storage.neoforge) { exclude(group = "curse.maven") } + + implementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + + "common"(project(":archie-test-common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":archie-test-common", "transformProductionNeoForge")) { isTransitive = false } + api(project(":archie-core-neoforge", "namedElements")) + api(project(":archie-datagen-neoforge", "namedElements")) + api(project(":archie-gametest-neoforge", "namedElements")) +} + +modResources { + filesMatching.add("META-INF/neoforge.mods.toml") +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-test-neoforge") + + test { + useJUnitPlatform() + } + + processResources { + from(project(":archie-test-common").sourceSets.main.get().resources) { + include("assets/archie_test/**") + include("data/archie_test/**") + include("archie_test.common.json") + include("archie_test.accesswidener") + } + dependsOn(processTestResources) + } + + processTestResources { + } + + classes { + finalizedBy(testClasses) + } + + shadowJar { + exclude("fabric.mod.json") + configurations = + listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("shadow")) + archiveClassifier.set("dev-shadow") + } + + remapJar { + inputFile.set(shadowJar.get().archiveFile) + atAccessWideners.set(setOf(loom.accessWidenerPath.get().asFile.name)) + dependsOn(shadowJar) + } + + jar.get().archiveClassifier.set("dev") + + jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(project(":archie-test-common").sourceSets.main.get().output) + } + + sourcesJar { + val commonSources = project(":archie-test-common").tasks.sourcesJar + dependsOn(commonSources) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} diff --git a/Archie-Test/neoforge/gradle.properties b/test/neoforge/gradle.properties similarity index 95% rename from Archie-Test/neoforge/gradle.properties rename to test/neoforge/gradle.properties index 3ce8f5694..7da18ea6f 100644 --- a/Archie-Test/neoforge/gradle.properties +++ b/test/neoforge/gradle.properties @@ -1,2 +1 @@ loom.platform=neoforge - diff --git a/Archie-Test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt b/test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt similarity index 60% rename from Archie-Test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt rename to test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt index 729d3eaf0..cb5ecf913 100644 --- a/Archie-Test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt +++ b/test/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/test/ArchieTestNeoForge.kt @@ -1,10 +1,13 @@ package net.kernelpanicsoft.archie.test import dev.nyon.klf.MOD_BUS +import net.kernelpanicsoft.archie.gametest.platform.AGameTestPlatform +import net.kernelpanicsoft.archie.test.gametest.CapabilityLookupTestFixtures import net.neoforged.fml.common.Mod import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent import net.neoforged.fml.event.lifecycle.FMLConstructModEvent +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent @Mod(ArchieTest.MOD_ID) object ArchieTestNeoForge @@ -19,6 +22,12 @@ object ArchieTestNeoForge MOD_BUS.addListener { ArchieTest.initCommon() } + // See the matching comment in ArchieTest.init() - TileRegistry.TestTile isn't valid until + // its registry unfreezes at RegisterEvent, which has already fired by RegisterCapabilitiesEvent + // (the same event Common Storage Lib's own BlockLookup.onRegister listens to internally). + MOD_BUS.addListener { + if (AGameTestPlatform.isGameTest) CapabilityLookupTestFixtures.init() + } // GuiRegistry.initClient() (an ADeferredRegistryHolder override) now registers its own // screen factories at the correct time on its own - see // net.kernelpanicsoft.archie.registries.scheduleEarlyClientRegistration. A manual diff --git a/Archie/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/test/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 61% rename from Archie/neoforge/src/main/resources/META-INF/neoforge.mods.toml rename to test/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 039e9a0f3..9fecb812e 100644 --- a/Archie/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/test/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -4,55 +4,51 @@ issueTrackerURL = "" license = "${mod_license}" [[mods]] -modId = "${mod_id}" +modId = "${mod_id}_test" version = "${mod_version}" -displayName = "${mod_display_name}" +displayName = "${mod_display_name} Test" authors = "${mod_authors}" credits = "${mod_credits}" description = ''' ${mod_description} ''' -logoFile = "assets/${mod_id}/banner.png" +logoFile = "assets/${mod_id}_test/banner.png" displayURL = "${mod_url}" -[[mixins]] -config = "archie.mixins.json" - - -[[dependencies."${mod_id}"]] +[[dependencies."${mod_id}_test"]] modId = "neoforge" type = "required" versionRange = "[${versions.neoforge_range},)" ordering = "NONE" side = "BOTH" -[[dependencies."${mod_id}"]] +[[dependencies."${mod_id}_test"]] modId = "minecraft" type = "required" versionRange = "[${versions.minecraft}]" ordering = "NONE" side = "BOTH" -#[[dependencies."${mod_id}"]] +#[[dependencies."${mod_id}_test"]] #modId = "klf" #type = "required" #versionRange = "[${versions.kotlin_neoforge_range},)" #ordering = "NONE" #side = "BOTH" -[[dependencies."${mod_id}"]] +[[dependencies."${mod_id}_test"]] modId = "cloth_config" -type = "optional" +type = "required" versionRange = "[${versions.cloth_config_range},)" ordering = "NONE" side = "BOTH" -[[dependencies."${mod_id}"]] -modId = "yet_another_config_lib_v3" -type = "optional" -versionRange = "*" -ordering = "NONE" +[[dependencies."${mod_id}_test"]] +modId = "archie" +type = "required" +versionRange = "[${mod_version},)" +ordering = "AFTER" side = "BOTH" -[modproperties."${mod_id}"] -catalogueImageIcon = "assets/${mod_id}/icon.png" \ No newline at end of file +[modproperties."${mod_id}_test"] +catalogueImageIcon = "assets/${mod_id}_test/icon.png" \ No newline at end of file diff --git a/Archie-Test/neoforge/src/main/resources/pack.mcmeta b/test/neoforge/src/main/resources/pack.mcmeta similarity index 100% rename from Archie-Test/neoforge/src/main/resources/pack.mcmeta rename to test/neoforge/src/main/resources/pack.mcmeta