plugins { id 'java' } group = 'best.lolicon.felis' version = '0.1.0' // The lobby runs Paper 26.x, which needs Java 25, and paper-api 26.x is published as a // Java-25 artifact (its Gradle module metadata declares org.gradle.jvm.version = 25), so // this module compiles with a Java-25 toolchain. The toolchain block makes that explicit // and self-enforcing: Gradle uses a detected JDK 25 whichever JDK runs Gradle, and fails // loudly if none is present. The shared codec is plain Java-17 source, which 25 compiles // forward-compatibly. java { toolchain { languageVersion = JavaLanguageVersion.of(25) } } repositories { mavenCentral() maven { name = 'papermc' url = 'https://repo.papermc.io/repository/maven-public/' } } dependencies { // paper-api is compile-only (the server provides it at runtime). It pulls in // Bukkit + Adventure, which is all the lobby face needs. // // Pinned to the API of the exact server the lobby image bundles: deploy/game-stack.lock's // PAPER_JAR_URL is paper--.jar, and PaperMC publishes that build's API as // .build.-. A release build, never a -SNAPSHOT, so the same sources // compile against the same bytes every time (gradle/verification-metadata.xml checks // them). deploy/bootstrap_test.sh fails when this and the lock drift apart. compileOnly 'io.papermc.paper:paper-api:26.3.build.40-alpha' } // The lobby is a PURE UI face (spec §12): it speaks only the felis:control // plugin-message channel and never holds a felis-api token or talks to felis-api // directly. We enforce that physically here — the shared source root is on the // path, but the include filter ships ONLY the paper package and the three codec // files (Control + ControlFrame + Json). FelisApiClient, LinkClient and the token // config are not compiled in at all, so the lobby cannot reach the API even by // mistake. If a codec class grows a new dependency, compilation fails loudly here // rather than silently widening the lobby's reach. sourceSets { main { java { srcDir '../shared/src/main/java' include 'best/lolicon/felis/paper/**' include 'best/lolicon/felis/link/Control.java' include 'best/lolicon/felis/link/ControlFrame.java' include 'best/lolicon/felis/link/Json.java' } } } tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' } // LobbyGuardTest drives the real LobbyGuard handlers with real paper-api events around // Proxy-built fakes (plain main, no framework, like the velocity routing tests). It is // not part of `build`, which the lobby image runs; plugins/test.sh runs `./gradlew lobbyTest`. sourceSets { lobbyTest { java { srcDir 'test' include 'best/lolicon/felis/paper/Fakes.java' include 'best/lolicon/felis/paper/LobbyGuardTest.java' } compileClasspath += sourceSets.main.output + configurations.compileClasspath runtimeClasspath += output + compileClasspath } } tasks.register('lobbyTest', JavaExec) { group = 'verification' description = 'Runs the LobbyGuardTest self-test main.' classpath = sourceSets.lobbyTest.runtimeClasspath mainClass = 'best.lolicon.felis.paper.LobbyGuardTest' }