79 Commits
v0.1.0 ... main

Author SHA1 Message Date
2a9648c014 v0.17.0 2025-04-10 21:16:06 -07:00
f91316fef3 it works! 2025-04-10 21:11:27 -07:00
d228685b59 fix and update github workflows 2025-04-10 20:36:14 -07:00
610ba483ca Start work on v0.17.0-SNAPSHOT 2025-04-10 20:29:44 -07:00
61b1abd335 v0.16.0 2025-04-10 20:29:37 -07:00
1a968a6489 Cleanup smart downloader utility. 2023-03-18 14:55:19 -07:00
aa2750bdc0 Start work on v0.16.0-SNAPSHOT 2023-03-16 17:44:48 -07:00
075cd169bb v0.15.0 2023-03-16 17:44:27 -07:00
d561146024 Fix samples. 2023-03-16 17:39:48 -07:00
900b430e58 v0.15.0 2023-03-16 17:36:12 -07:00
4cec9a74a9 Implement support for custom concrete items. 2023-03-16 17:35:40 -07:00
bb3d3cb6bc Start work on v0.15.0-SNAPSHOT 2023-03-13 16:27:25 -07:00
3042512a92 v0.14.0 2023-03-13 16:27:02 -07:00
6d6a71b4f8 Fix bug in update manifest generation. 2023-03-13 16:26:30 -07:00
2a38525180 Begin work on v0.14.0-SNAPSHOT 2023-03-13 16:07:18 -07:00
b910e3b2ff v0.13.0 2023-03-13 16:06:41 -07:00
89664eb5d7 Switch to plugin {} for concrete plugin dependency sets. 2023-03-13 16:00:49 -07:00
aaf15e5270 Start on v0.13.0-SANPSHOT 2023-03-13 15:51:12 -07:00
353f62dfc8 v0.12.0 2023-03-13 15:50:44 -07:00
e6f1efb346 Gradle 8.0.2 2023-03-13 15:50:27 -07:00
df8f755ff7 Extensible manifest format. 2023-03-13 15:49:59 -07:00
0478616f34 Upgrade to Gradle v8.0.1 2023-02-19 21:28:18 -08:00
43d76cfb96 Upgrade to Gradle v8.0 2023-02-15 21:47:36 -08:00
0d60664838 Update plugin descriptions. 2023-02-08 18:21:35 -05:00
02abbabb08 Start work on v0.12.0-SNAPSHOT 2023-02-07 18:23:47 -05:00
b040711701 v0.11.0 2023-02-07 18:23:23 -05:00
96ed2ff2bb Remove serialization plugin, which makes us compatible with more Gradle versions. 2023-02-07 18:22:01 -05:00
061a788d93 Fix CodeQL task name. 2023-02-07 10:13:30 -05:00
3c02e23163 Publish GitHub CodeQL from Qodona 2023-02-07 10:09:42 -05:00
1c4217da53 Qodona Workflow 2023-02-07 09:57:48 -05:00
81985013e8 Start work on v0.11.0-SNAPSHOT 2023-02-07 06:41:11 -05:00
55efba22bd v0.10.0 2023-02-07 06:36:41 -05:00
2cb2d8fe89 v0.10.0 2023-02-07 06:34:30 -05:00
b3219afb24 v0.10.0 2023-02-07 06:31:43 -05:00
ac7ec227b0 Gradle Plugin Portal 2023-02-07 06:31:23 -05:00
0ed243e9ae Publish sources JAR and ensure new lines. 2023-02-07 05:57:45 -05:00
34648bdc8c Begin work on 0.10.0-SNAPSHOT 2023-02-05 21:33:03 -08:00
e1e42df67e v0.9.0 2023-02-05 21:32:40 -08:00
dc1ebe09b7 Upgrade Kotlin to 1.8.10 2023-02-05 21:30:50 -08:00
1cd36b5529 Start work on 0.9.0 2023-02-03 13:08:14 -08:00
a06687507c v0.8.0 2023-02-03 13:07:49 -08:00
5d4152d6df Support CONCRETE_BUILD_NUMBER for build number in version. 2023-02-02 20:33:32 -08:00
4c7dea2296 Start on v0.8.0-SNAPSHOT 2023-01-27 22:43:23 -08:00
c3ddcff572 v0.7.0 2023-01-27 22:40:24 -08:00
ee697e2c4f Simple code cleanup. 2023-01-27 22:39:21 -08:00
d304170062 Allocate PaperVersionClient closer to time of use. 2023-01-27 22:31:07 -08:00
0129f761f2 Properly mark task internal methods as internal. 2023-01-27 22:01:48 -08:00
ace5b0ab3e Add support for running a second custom directory as a Minecraft server. 2023-01-27 21:59:40 -08:00
18916bbd22 Start on v0.7.0-SNAPSHOT 2023-01-26 21:48:45 -08:00
34c54a6628 v0.6.0 2023-01-26 10:27:02 -08:00
c31de09a52 Fix sample builds. 2023-01-25 19:59:09 -08:00
73d7019f2e GitHub workflow for building samples. 2023-01-25 19:55:10 -08:00
b297931915 Update samples to 1.19.3 2023-01-24 20:40:36 -08:00
38e359b49b Attempt at fixing GitHub Packages too. 2023-01-24 20:28:40 -08:00
426020f1f9 GitLab Publishing 2023-01-24 20:26:25 -08:00
a06be05645 Attempt to fix GitHub packages token. 2023-01-24 20:11:07 -08:00
5aed273563 Fix task name for publishing to GitHub Packages 2023-01-24 20:04:55 -08:00
f87264235f Fix repository name for GitHub Packages 2023-01-24 20:03:27 -08:00
fdc124276b Migration to Gay Pizza 2023-01-24 20:00:50 -08:00
e131c50306 Upgrade for 1.19.2 and Gradle 7.5.1 2022-10-26 20:32:44 -07:00
95bda20186 Merge pull request #4 from kendfinger/base-plugin
Support for base projects which do not contain the Bukkit API.
2022-07-14 19:01:26 -07:00
64028dd1de Support for base projects which do not contain the Bukkit API.
Also fixes a bug where root and plugin couldn't exist in the same project.
2022-07-13 03:40:33 -04:00
117e914b01 Bump to 0.4.0. 2022-07-12 01:06:46 -07:00
842aa4e264 Add GitLab to publishing repositories. 2022-07-12 01:06:14 -07:00
617017f6e2 Merge pull request #2 from kendfinger/more-cleanup
More cleanup and support for concrete as part of a project hierarchy.
2022-07-12 00:29:43 -07:00
07bb459111 Update README.md 2022-07-12 00:28:23 -07:00
30def2c165 Take review comments. 2022-07-12 03:27:42 -04:00
7640782161 Paper server update rework and support for offline mode. 2022-07-11 08:15:06 -04:00
e7d87c638c Add basic GitHub Workflow 2022-07-10 19:37:05 -04:00
58356c27f3 Add a concept of a concrete-library which has access to Bukkit but is not a plugin. 2022-07-10 19:35:50 -04:00
39a7b50a07 Mixed project sample and more bug fixes. 2022-07-10 19:03:59 -04:00
adcff8dcc5 Fix problem where concrete root project may not be found if the hierarchy is deep enough. 2022-07-10 18:20:38 -04:00
e3d191e277 More cleanup and support for concrete as part of a project hierarchy. 2022-07-10 18:18:27 -04:00
ee4249e3e8 Bump to 0.3.0 for next development release. 2022-07-10 13:02:45 -07:00
ba6881627f Bump version to 0.2.0. 2022-07-10 12:58:58 -07:00
4f11d45f20 Merge pull request #1 from kendfinger/main
Rework and Sample Project
2022-07-10 12:56:25 -07:00
7310465d55 Create LICENSE 2022-07-10 12:37:16 -07:00
fa1dc3a152 Create README.md 2022-07-10 12:35:24 -07:00
fbaf3f8ab0 Sample project which dumbs down everything. 2022-07-10 02:45:16 -04:00
77 changed files with 2141 additions and 252 deletions

17
.github/workflows/plugin.yml vendored Normal file
View File

@ -0,0 +1,17 @@
name: Plugin
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 21
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Build with Gradle
run: ./gradlew build

20
.github/workflows/portal.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Gradle Plugin Portal
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 21
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Publish with Gradle
run: "./gradlew publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PLUGIN_PUBLISHING_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PLUGIN_PUBLISHING_SECRET }}"

23
.github/workflows/publish.yml vendored Normal file
View File

@ -0,0 +1,23 @@
name: Publish
on:
push:
branches:
- main
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 21
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Build with Gradle
run: ./gradlew publishAllPublicationsToGitHubPackagesRepository publishAllPublicationsToGitLabRepository
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
GITLAB_TOKEN: "${{ secrets.GITLAB_TOKEN }}"

21
.github/workflows/samples.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Samples
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 21
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Build mixed sample with Gradle
run: ./gradlew -p samples/mixed build
- name: Build shared sample with Gradle
run: ./gradlew -p samples/shared build
- name: Build simple sample with Gradle
run: ./gradlew -p samples/simple build

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Gay Pizza Specifications
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

8
README.md Normal file
View File

@ -0,0 +1,8 @@
# Concrete
Concrete is a Gradle plugin for Bukkit projects. Originally spawned out of the Gradle buildSrc written for a set of plugins named Foundation.
## Contributors
- [@azenla](https://github.com/azenla)
- [@kubeliv](https://github.com/kubeliv)

View File

@ -1,13 +1,16 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
`kotlin-dsl`
kotlin("plugin.serialization") version "1.6.21"
id("maven-publish")
id("java-gradle-plugin")
`maven-publish`
`java-gradle-plugin`
id("com.gradle.plugin-publish") version "1.3.1"
}
group = "lgbt.mystic.foundation"
version = "0.1.0"
group = "gay.pizza.foundation"
version = "0.17.0"
repositories {
mavenCentral()
@ -15,34 +18,120 @@ repositories {
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21")
implementation("org.jetbrains.kotlin:kotlin-serialization:1.6.21")
implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.2")
implementation("com.google.code.gson:gson:2.9.0")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20")
implementation("org.jetbrains.kotlin:kotlin-serialization:2.1.20")
implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:8.3.6")
implementation("com.google.code.gson:gson:2.12.1")
// TODO: What uses this?
implementation("org.bouncycastle:bcprov-jdk15on:1.70")
// Implementation of crypto used in smart downloader.
implementation("org.bouncycastle:bcprov-jdk18on:1.80")
}
gradlePlugin {
website.set("https://github.com/GayPizzaSpecifications/concrete")
vcsUrl.set("https://github.com/GayPizzaSpecifications/concrete")
plugins {
create("concrete") {
id = "lgbt.mystic.foundation.concrete"
implementationClass = "lgbt.mystic.foundation.concrete.ConcreteGradlePlugin"
create("concrete-root") {
id = "gay.pizza.foundation.concrete-root"
implementationClass = "gay.pizza.foundation.concrete.ConcreteRootPlugin"
displayName = "Concrete Root"
description = "Gradle conventions for Foundation Bukkit plugins. Root project plugin."
}
create("concrete-base") {
id = "gay.pizza.foundation.concrete-base"
implementationClass = "gay.pizza.foundation.concrete.ConcreteBasePlugin"
displayName = "Concrete Base"
description = "Gradle conventions for Foundation Bukkit plugins. Base project plugin."
}
create("concrete-library") {
id = "gay.pizza.foundation.concrete-library"
implementationClass = "gay.pizza.foundation.concrete.ConcreteLibraryPlugin"
displayName = "Concrete Library"
description = "Gradle conventions for Foundation Bukkit plugins. Library project plugin."
}
create("concrete-plugin") {
id = "gay.pizza.foundation.concrete-plugin"
implementationClass = "gay.pizza.foundation.concrete.ConcretePluginPlugin"
displayName = "Concrete Library"
description = "Gradle conventions for Foundation Bukkit plugins. Plugin project plugin."
}
forEach { declaration ->
declaration.tags.set(listOf("foundation-concrete", "minecraft-bukkit"))
}
}
}
val gradlePublishingKey: String? = System.getenv("GRADLE_PLUGIN_PUBLISHING_KEY")
val gradlePublishingSecret: String? = System.getenv("GRADLE_PLUGIN_PUBLISHING_SECRET")
if (gradlePublishingKey != null && gradlePublishingSecret != null) {
project.setProperty("gradle.publish.key", gradlePublishingKey.toString())
project.setProperty("gradle.publish.secret", gradlePublishingSecret.toString())
}
java {
val version = JavaVersion.toVersion("21")
sourceCompatibility = version
targetCompatibility = version
}
tasks.compileKotlin {
compilerOptions {
jvmTarget.value(JvmTarget.JVM_21)
}
}
publishing {
repositories {
mavenLocal()
var githubPackagesToken = System.getenv("GITHUB_TOKEN")
if (githubPackagesToken == null) {
githubPackagesToken = project.findProperty("github.token") as String?
}
var gitlabPackagesToken = System.getenv("GITLAB_TOKEN")
if (gitlabPackagesToken == null) {
gitlabPackagesToken = project.findProperty("gitlab.com.accessToken") as String?
}
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/mysticlgbt/concrete")
url = uri("https://maven.pkg.github.com/gaypizzaspecifications/concrete")
credentials {
username = project.findProperty("github.username") as String?
password = project.findProperty("github.token") as String?
username = project.findProperty("github.username") as String? ?: "gaypizzaspecifications"
password = githubPackagesToken
}
}
maven {
name = "GitLab"
url = uri("https://gitlab.com/api/v4/projects/42873094/packages/maven")
credentials(HttpHeaderCredentials::class.java) {
name = "Private-Token"
value = gitlabPackagesToken
}
authentication {
create<HttpHeaderAuthentication>("header")
}
}
}
}
tasks.withType<Wrapper> {
gradleVersion = "8.13"
}
java {
withSourcesJar()
}

Binary file not shown.

View File

@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

25
gradlew vendored
View File

@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +80,10 @@ do
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# 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"'
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -143,12 +140,16 @@ fi
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=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=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then
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, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
@ -205,6 +210,12 @@ set -- \
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.

15
gradlew.bat vendored
View File

@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
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!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
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

View File

View File

@ -0,0 +1 @@
server/

View File

@ -0,0 +1,11 @@
plugins {
id("gay.pizza.foundation.concrete-root")
}
concreteRoot {
minecraftServerPath.set("server")
paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true)
expansiveItemInclusion.set(true)
}

View File

@ -0,0 +1,3 @@
plugins {
id("gay.pizza.foundation.concrete-library")
}

View File

@ -0,0 +1,6 @@
package gay.pizza.foundation.concrete.sample.common
import org.bukkit.plugin.java.JavaPlugin
fun JavaPlugin.logOnEnable(name: String) = slF4JLogger.info("Enabled $name")
fun JavaPlugin.logOnDisable(name: String) = slF4JLogger.info("Disabled $name")

View File

@ -0,0 +1,7 @@
plugins {
id("gay.pizza.foundation.concrete-plugin")
}
dependencies {
implementation(project(":bukkit-plugins:common-library"))
}

View File

@ -0,0 +1,15 @@
package gay.pizza.foundation.concrete.sample.goodbyeworld
import gay.pizza.foundation.concrete.sample.common.logOnDisable
import gay.pizza.foundation.concrete.sample.common.logOnEnable
import org.bukkit.plugin.java.JavaPlugin
class GoodbyeWorldPlugin : JavaPlugin() {
override fun onEnable() {
logOnEnable("Goodbye World")
}
override fun onDisable() {
logOnDisable("Goodbye World")
}
}

View File

@ -0,0 +1,9 @@
name: GoodbyeWorld
version: '${version}'
main: gay.pizza.foundation.concrete.sample.goodbyeworld.GoodbyeWorldPlugin
api-version: 1.18
prefix: GoodbyeWorld
load: STARTUP
authors:
- kubelet
- kexec

View File

@ -0,0 +1,12 @@
plugins {
id("gay.pizza.foundation.concrete-plugin")
}
dependencies {
implementation(project(":other-library"))
implementation(project(":bukkit-plugins:common-library"))
}
concreteItem {
dependency(project(":bukkit-plugins:goodbye-world"))
}

View File

@ -0,0 +1,16 @@
package gay.pizza.foundation.concrete.sample.helloworld
import gay.pizza.foundation.concrete.other.OtherLibrary
import gay.pizza.foundation.concrete.sample.common.logOnDisable
import gay.pizza.foundation.concrete.sample.common.logOnEnable
import org.bukkit.plugin.java.JavaPlugin
class HelloWorldPlugin : JavaPlugin() {
override fun onEnable() {
logOnEnable(OtherLibrary.HELLO_WORLD)
}
override fun onDisable() {
logOnDisable(OtherLibrary.HELLO_WORLD)
}
}

View File

@ -0,0 +1,9 @@
name: HelloWorld
version: '${version}'
main: gay.pizza.foundation.concrete.sample.helloworld.HelloWorldPlugin
api-version: 1.18
prefix: HelloWorld
load: STARTUP
authors:
- kubelet
- kexec

Binary file not shown.

View File

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
samples/mixed/gradlew vendored Executable file
View File

@ -0,0 +1,251 @@
#!/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, 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" "$@"

94
samples/mixed/gradlew.bat vendored Normal file
View File

@ -0,0 +1,94 @@
@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

View File

@ -0,0 +1,10 @@
plugins {
id("gay.pizza.foundation.concrete-base")
}
concreteItem {
type.set("library")
fileInclusion {
tasks.jar.get().outputs.files.associateWith { "library-jar" }
}
}

View File

@ -0,0 +1,5 @@
package gay.pizza.foundation.concrete.other;
public class OtherLibrary {
public static final String HELLO_WORLD = "Hello World";
}

View File

@ -0,0 +1,6 @@
includeBuild("../..")
include(":bukkit-plugins")
include(":bukkit-plugins:hello-world")
include(":bukkit-plugins:goodbye-world")
include(":bukkit-plugins:common-library")
include(":other-library")

1
samples/shared/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
server/

View File

@ -0,0 +1,11 @@
plugins {
id("gay.pizza.foundation.concrete-root")
id("gay.pizza.foundation.concrete-plugin")
}
concreteRoot {
minecraftServerPath.set("server")
paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true)
}

Binary file not shown.

View File

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
samples/shared/gradlew vendored Executable file
View File

@ -0,0 +1,251 @@
#!/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, 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" "$@"

94
samples/shared/gradlew.bat vendored Normal file
View File

@ -0,0 +1,94 @@
@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

View File

@ -0,0 +1 @@
includeBuild("../..")

View File

@ -0,0 +1,13 @@
package gay.pizza.foundation.concrete.sample.helloworld
import org.bukkit.plugin.java.JavaPlugin
class HelloWorldPlugin : JavaPlugin() {
override fun onEnable() {
slF4JLogger.info("Enabled Hello World")
}
override fun onDisable() {
slF4JLogger.info("Disabled Hello World")
}
}

View File

@ -0,0 +1,9 @@
name: HelloWorld
version: '${version}'
main: gay.pizza.foundation.concrete.sample.helloworld.HelloWorldPlugin
api-version: 1.18
prefix: HelloWorld
load: STARTUP
authors:
- kubelet
- kexec

1
samples/simple/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
server/

View File

@ -0,0 +1,10 @@
plugins {
id("gay.pizza.foundation.concrete-root")
}
concreteRoot {
minecraftServerPath.set("server")
paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true)
}

Binary file not shown.

View File

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
samples/simple/gradlew vendored Executable file
View File

@ -0,0 +1,251 @@
#!/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, 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" "$@"

94
samples/simple/gradlew.bat vendored Normal file
View File

@ -0,0 +1,94 @@
@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

View File

@ -0,0 +1,3 @@
plugins {
id("gay.pizza.foundation.concrete-plugin")
}

View File

@ -0,0 +1,13 @@
package gay.pizza.foundation.concrete.sample.helloworld
import org.bukkit.plugin.java.JavaPlugin
class HelloWorldPlugin : JavaPlugin() {
override fun onEnable() {
slF4JLogger.info("Enabled Hello World")
}
override fun onDisable() {
slF4JLogger.info("Disabled Hello World")
}
}

View File

@ -0,0 +1,9 @@
name: HelloWorld
version: '${version}'
main: gay.pizza.foundation.concrete.sample.helloworld.HelloWorldPlugin
api-version: 1.18
prefix: HelloWorld
load: STARTUP
authors:
- kubelet
- kexec

View File

@ -0,0 +1,2 @@
includeBuild("../..")
include(":hello-world")

View File

@ -0,0 +1,23 @@
package gay.pizza.foundation.concrete
import org.gradle.api.Project
import org.gradle.kotlin.dsl.repositories
import java.net.URI
open class ConcreteBaseBukkitPlugin : ConcreteBasePlugin() {
override fun apply(project: Project) {
super.apply(project)
project.repositories {
maven {
name = "papermc"
url = URI.create("https://repo.papermc.io/repository/maven-public/")
}
}
project.afterEvaluate {
val paperApiVersion = project.concreteRootExtension.paperApiVersion.get()
project.dependencies.add("compileOnly", "io.papermc.paper:paper-api:${paperApiVersion}")
}
}
}

View File

@ -0,0 +1,48 @@
package gay.pizza.foundation.concrete
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
open class ConcreteBasePlugin : Plugin<Project> {
override fun apply(project: Project) {
val versionWithBuild = if (System.getenv("CI_PIPELINE_IID") != null) {
project.rootProject.version.toString() + ".${System.getenv("CI_PIPELINE_IID")}"
} else if (System.getenv("CONCRETE_BUILD_NUMBER") != null) {
project.rootProject.version.toString() + ".${System.getenv("CONCRETE_BUILD_NUMBER")}"
} else {
"DEV"
}
if (project.repositories.none { it.name == "MavenRepo" }) {
project.repositories.mavenCentral()
}
project.version = versionWithBuild
project.plugins.apply("org.jetbrains.kotlin.jvm")
project.plugins.apply("org.jetbrains.kotlin.plugin.serialization")
project.extensions.getByType<JavaPluginExtension>().apply {
val javaVersion = JavaVersion.toVersion(21)
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
}
project.tasks.withType<KotlinCompile>().forEach {
it.apply {
compilerOptions {
jvmTarget.value(JvmTarget.JVM_21)
}
}
}
project.extensions.create<ConcreteItemExtension>("concreteItem")
}
}

View File

@ -0,0 +1,21 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DomainObjectSet
import org.gradle.api.Project
import org.gradle.api.provider.Property
import java.io.File
interface ConcreteItemExtension {
val type: Property<String>
val version: Property<String>
val dependencies: DomainObjectSet<Project>
val fileInclusion: Property<() -> Map<File, String>>
fun dependency(project: Project) {
dependencies.add(project)
}
fun fileInclusion(inclusion: () -> Map<File, String>) {
fileInclusion.set(inclusion)
}
}

View File

@ -0,0 +1,3 @@
package gay.pizza.foundation.concrete
class ConcreteLibraryPlugin : ConcreteBaseBukkitPlugin()

View File

@ -0,0 +1,36 @@
package gay.pizza.foundation.concrete
import org.gradle.api.Project
import org.gradle.kotlin.dsl.get
import org.gradle.language.jvm.tasks.ProcessResources
class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() {
override fun apply(project: Project) {
super.apply(project)
project.plugins.apply("com.gradleup.shadow")
// During IDEA project import, if this code is active, it will print warnings.
// This will make the VERSION field unexpanded if you run using the IntelliJ build system.
if (!project.properties.containsKey("idea.gradle.do.not.build.tasks")) {
project.tasks.find<ProcessResources>("processResources")!!.apply {
val props = mapOf("version" to project.version.toString())
inputs.properties(props)
filteringCharset = "UTF-8"
filesMatching("plugin.yml") {
expand(props)
}
}
}
project.shadowJarTask!!.apply {
archiveClassifier.set("plugin")
}
project.tasks.addTaskDependency("assemble", "shadowJar")
project.concreteRootProject.tasks["setupPaperServer"].dependsOn(project.tasks["shadowJar"])
project.concreteRootProject.tasks.find<SetupLocalMinecraftServer>("setupLocalMinecraftServer")
?.dependsOn(project.tasks["shadowJar"])
}
}

View File

@ -0,0 +1,11 @@
package gay.pizza.foundation.concrete
import org.gradle.api.provider.Property
interface ConcreteRootExtension {
val paperServerVersionGroup: Property<String>
val paperApiVersion: Property<String>
val minecraftServerPath: Property<String>
val acceptServerEula: Property<Boolean>
val expansiveItemInclusion: Property<Boolean>
}

View File

@ -0,0 +1,36 @@
package gay.pizza.foundation.concrete
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.register
import java.nio.file.Paths
class ConcreteRootPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.apply(plugin = "base")
project.extensions.create<ConcreteRootExtension>("concreteRoot")
val setupPaperServer = project.tasks.register<SetupPaperServer>("setupPaperServer").get()
val runPaperServer = project.tasks.register<RunPaperServer>("runPaperServer").get()
runPaperServer.dependsOn(setupPaperServer)
val maybeLocalServerPathString = project.properties["localMinecraftServerPath"]?.toString()
if (maybeLocalServerPathString != null) {
val localServerJarFileName = project.properties["localMinecraftServerJarFileName"]?.toString() ?: "server.jar"
val currentWorkingDirectory = System.getProperty("user.dir")
val localServerDirectory = Paths.get(currentWorkingDirectory).resolve(maybeLocalServerPathString).toFile()
val setupLocalMinecraftServer = project.tasks.register<SetupLocalMinecraftServer>("setupLocalMinecraftServer").get()
val runLocalMinecraftServer = project.tasks.register<RunLocalMinecraftServer>("runLocalMinecraftServer").get()
runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer)
setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.serverJarFileName = localServerJarFileName
}
val updateManifests = project.tasks.register<UpdateManifestTask>("updateManifests")
project.tasks.getByName("assemble").dependsOn(updateManifests)
}
}

View File

@ -0,0 +1,55 @@
package gay.pizza.foundation.concrete
/**
* The extensible update manifest format.
*/
data class ExtensibleManifest(
/**
* The items the manifest describes.
*/
val items: List<ExtensibleManifestItem>
)
/**
* An item in the update manifest.
*/
data class ExtensibleManifestItem(
/**
* The name of the item.
*/
val name: String,
/**
* The type of item.
*/
val type: String,
/**
* The version of the item.
*/
val version: String,
/**
* The dependencies of the item.
*/
val dependencies: List<String>,
/**
* The files that are required to install the item.
*/
val files: List<ExtensibleManifestItemFile>
)
/**
* A file built from the item.
*/
data class ExtensibleManifestItemFile(
/**
* The name of the file.
*/
val name: String,
/**
* A type of file.
*/
val type: String,
/**
* The relative path to download the file.
*/
val path: String
)

View File

@ -0,0 +1,9 @@
package gay.pizza.foundation.concrete
import com.google.gson.Gson
import com.google.gson.GsonBuilder
object Globals {
val gsonPretty: Gson = GsonBuilder().setPrettyPrinting().create()
val gson: Gson = Gson()
}

View File

@ -1,4 +1,4 @@
package lgbt.mystic.foundation.concrete
package gay.pizza.foundation.concrete
import com.google.gson.Gson
import java.net.URI
@ -7,10 +7,10 @@ import java.net.http.HttpRequest
import java.net.http.HttpResponse
class PaperVersionClient(
val client: HttpClient = HttpClient.newHttpClient(),
private val client: HttpClient = HttpClient.newHttpClient(),
private val gson: Gson = Globals.gson
) {
private val apiBaseUrl = URI.create("https://papermc.io/api/v2/")
private val apiBaseUrl = URI.create("https://api.papermc.io/v2/")
fun getVersionBuilds(group: String): List<PaperBuild> {
val response = client.send(

View File

@ -0,0 +1,20 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import org.gradle.process.ExecOperations
import java.io.File
import javax.inject.Inject
open class RunLocalMinecraftServer @Inject constructor(execOperations: ExecOperations) : RunMinecraftServer(execOperations) {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
lateinit var serverJarFileName: String
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
@Internal
override fun getServerJarName(): String = serverJarFileName
}

View File

@ -0,0 +1,53 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
import java.io.File
import java.util.jar.JarFile
import javax.inject.Inject
abstract class RunMinecraftServer @Inject constructor(private var execOperations: ExecOperations) : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@get:Input
var additionalServerArguments = mutableListOf<String>()
@get:Input
var disableServerGui = true
@TaskAction
fun runMinecraftServer() {
val minecraftServerDirectory = getServerDirectory()
val serverJarFile = minecraftServerDirectory.resolve(getServerJarName())
val mainClassName = readMainClass(serverJarFile)
execOperations.javaexec {
classpath(serverJarFile.absolutePath)
workingDir(minecraftServerDirectory)
val allServerArguments = mutableListOf<String>()
allServerArguments.addAll(additionalServerArguments)
if (disableServerGui) {
allServerArguments.add("nogui")
}
args(allServerArguments)
mainClass.set(mainClassName)
}
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
@Internal
abstract fun getServerDirectory(): File
@Internal
abstract fun getServerJarName(): String
}

View File

@ -0,0 +1,22 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import org.gradle.kotlin.dsl.getByType
import org.gradle.process.ExecOperations
import java.io.File
import javax.inject.Inject
open class RunPaperServer @Inject constructor(execOperations: ExecOperations) : RunMinecraftServer(execOperations) {
init {
outputs.upToDateWhen { false }
}
@Internal
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteRootExtension>()
return project.file(concrete.minecraftServerPath.get())
}
@Internal
override fun getServerJarName(): String = "paper.jar"
}

View File

@ -0,0 +1,12 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import java.io.File
open class SetupLocalMinecraftServer : SetupMinecraftServer() {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
}

View File

@ -0,0 +1,49 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.nio.file.Files
import java.util.*
abstract class SetupMinecraftServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@TaskAction
fun setupMinecraftAction() {
val minecraftServerDirectory = getServerDirectory()
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val serverPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!serverPluginsDirectory.exists()) {
serverPluginsDirectory.mkdirs()
}
for (project in project.findPluginProjects()) {
val task = project.shadowJarTask!!
val pluginJarFile = task.outputs.files.first()
val pluginLinkFile = serverPluginsDirectory.resolve("${project.name}.jar")
pluginLinkFile.delete()
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
val concrete = project.extensions.getByType<ConcreteRootExtension>()
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties()
properties.setProperty("eula", "true")
properties.store(writer, "Written by Concrete")
writer.close()
}
}
@Internal
abstract fun getServerDirectory(): File
}

View File

@ -0,0 +1,57 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
import org.gradle.kotlin.dsl.getByType
import java.io.File
open class SetupPaperServer : SetupMinecraftServer() {
init {
outputs.upToDateWhen { false }
}
@get:Input
@set:Option(option = "update", description = "Update Paper Server")
var shouldUpdatePaperServer = true
@TaskAction
fun setupPaperServer() {
val concrete = project.extensions.getByType<ConcreteRootExtension>()
val minecraftServerDirectory = getServerDirectory()
minecraftServerDirectory.mkdirs()
val paperJarFile = project.file("${minecraftServerDirectory}/paper.jar")
if (!paperJarFile.exists() || shouldUpdatePaperServer) {
downloadLatestBuild(concrete.paperServerVersionGroup.get(), paperJarFile)
}
}
private fun downloadLatestBuild(paperVersionGroup: String, paperJarFile: File) {
val paperVersionClient = PaperVersionClient()
if (project.gradle.startParameter.isOffline) {
if (!paperJarFile.exists()) {
throw RuntimeException("Offline mode is enabled and Paper has not been downloaded.")
} else {
logger.lifecycle("Offline mode is enabled, skipping Paper update.")
return
}
}
val builds = paperVersionClient.getVersionBuilds(paperVersionGroup)
val build = builds.last()
val download = build.downloads["application"]!!
val url = paperVersionClient.resolveDownloadUrl(build, download)
val downloader = SmartDownloader(paperJarFile.toPath(), url, download.sha256)
if (downloader.download()) {
logger.lifecycle("Installed Paper Server ${build.version} build ${build.build}")
} else {
logger.lifecycle("Paper Server ${build.version} build ${build.build} is up-to-date")
}
}
@Internal
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteRootExtension>()
return project.file(concrete.minecraftServerPath.get())
}
}

View File

@ -1,9 +1,13 @@
package lgbt.mystic.foundation.concrete
package gay.pizza.foundation.concrete
import java.net.URI
import java.nio.file.Files
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse.BodyHandlers
import java.nio.file.Path
import java.security.MessageDigest
import kotlin.io.path.exists
import kotlin.io.path.inputStream
class SmartDownloader(
private val localFilePath: Path,
@ -14,29 +18,31 @@ class SmartDownloader(
val hashResult = checkLocalFileHash()
if (hashResult != HashResult.ValidHash) {
downloadRemoteFile()
return false
return true
}
return true
return false
}
private fun downloadRemoteFile() {
val url = remoteDownloadUrl.toURL()
val remoteFileStream = url.openStream()
val localFileStream = Files.newOutputStream(localFilePath)
remoteFileStream.transferTo(localFileStream)
val httpClient = HttpClient.newHttpClient()
val request = HttpRequest.newBuilder()
.GET()
.uri(remoteDownloadUrl)
.build()
httpClient.send(request, BodyHandlers.ofFile(localFilePath))
val hashResult = checkLocalFileHash()
if (hashResult != HashResult.ValidHash) {
throw RuntimeException("Download of $remoteDownloadUrl did not result in valid hash.")
throw RuntimeException("Download of $remoteDownloadUrl did not result in a valid hash.")
}
}
private fun checkLocalFileHash(): HashResult {
if (!Files.exists(localFilePath)) {
if (!localFilePath.exists()) {
return HashResult.DoesNotExist
}
val digest = MessageDigest.getInstance("SHA-256")
val localFileStream = Files.newInputStream(localFilePath)
val localFileStream = localFilePath.inputStream()
val buffer = ByteArray(16 * 1024)
while (true) {

View File

@ -0,0 +1,70 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import java.nio.file.Path
import kotlin.io.path.relativeTo
import kotlin.io.path.writeText
open class UpdateManifestTask : DefaultTask() {
@TaskAction
fun update() {
val manifestsDir = ensureManifestsDirectory()
val rootExtension = project.concreteRootExtension
val rootPath = if (rootExtension.expansiveItemInclusion.orNull == true) {
project.rootProject.rootDir
} else {
project.rootDir
}
val legacyUpdateManifest = project.findPluginProjects().mapNotNull { project ->
val paths = project.shadowJarOutputs!!.files.allFilesRelativeToPath(rootPath.toPath())
if (paths.isNotEmpty()) {
project.name to mapOf(
"version" to project.version,
"artifacts" to paths.map { it.toUnixString() }
)
} else null
}.toMap()
val legacyUpdateFile = manifestsDir.resolve("update.json")
legacyUpdateFile.writeText(Globals.gson.toJson(legacyUpdateManifest))
val extensibleUpdateManifestItems = project.findItemProjects().map { project ->
val concreteItemExtension = project.concreteItemExtension!!
val pathInclusion = concreteItemExtension.fileInclusion.orNull ?: {
project.shadowJarOutputs!!.files.associateWith { "plugin-jar" }
}
val paths = pathInclusion()
val dependencies = concreteItemExtension.dependencies.map { it.name }
ExtensibleManifestItem(
name = project.name,
type = concreteItemExtension.type.orNull ?: "bukkit-plugin",
version = concreteItemExtension.version.orNull ?: project.version.toString(),
dependencies = dependencies,
files = paths.map { (path, type) ->
ExtensibleManifestItemFile(
name = path.name,
type = type,
path = path.toPath().relativeTo(rootPath.toPath()).toUnixString()
)
}
)
}
val extensibleUpdateManifest = ExtensibleManifest(
items = extensibleUpdateManifestItems
)
val extensibleUpdateManifestFile = manifestsDir.resolve("manifest.json")
extensibleUpdateManifestFile.writeText(Globals.gson.toJson(extensibleUpdateManifest) + "\n")
}
private fun ensureManifestsDirectory(): Path {
val manifestsDir = project.layout.buildDirectory.asFile.get().resolve("manifests")
manifestsDir.mkdirs()
return manifestsDir.toPath()
}
}

View File

@ -0,0 +1,93 @@
package gay.pizza.foundation.concrete
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.Project
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskOutputs
import java.io.File
import java.nio.file.FileSystems
import java.nio.file.Path
/**
* Checks if the project has the [ConcretePluginPlugin] applied.
*/
internal fun Project.isPluginProject() = plugins.hasPlugin(ConcretePluginPlugin::class.java)
/**
* Checks if the project has the [ConcreteBasePlugin] applied and is opting into item behavior.
*/
internal fun Project.isConcreteItem() =
isPluginProject() || concreteItemExtension?.type?.orNull != null
/**
* Finds all projects in the project's hierarchy that are plugins.
*/
internal fun Project.findPluginProjects() = allprojects.filter { project -> project.isPluginProject() }
/**
* Finds all projects in the project's hierarchy that are items.
*/
internal fun Project.findItemProjects(): List<Project> {
val optInExpansion = concreteRootExtension.expansiveItemInclusion.orNull ?: false
val searchScope = if (optInExpansion) {
project.rootProject.allprojects
} else {
allprojects
}
return searchScope.filter { project -> project.isConcreteItem() }
}
internal fun TaskContainer.addTaskDependency(dependent: String, dependency: String) {
getByName(dependent).dependsOn(getByName(dependency))
}
internal inline fun <reified T> TaskContainer.find(name: String) =
findByName(name) as T?
internal val Project.shadowJarTask: ShadowJar?
get() = project.tasks.find<ShadowJar>("shadowJar")
internal val Project.shadowJarOutputs: TaskOutputs?
get() = shadowJarTask?.outputs
internal val Project.concreteRootExtension: ConcreteRootExtension
get() = findTargetParent(
valid = { extensions.findByType(ConcreteRootExtension::class.java) != null },
extract = { extensions.findByType(ConcreteRootExtension::class.java)!! },
error = { "Failed to find concrete root. Did you apply the concrete root plugin?" }
)
internal val Project.concreteItemExtension: ConcreteItemExtension?
get() = extensions.findByType(ConcreteItemExtension::class.java)
/**
* Finds the concrete root project, which is the first project in the project hierarchy
* that has the concrete extension.
*/
internal val Project.concreteRootProject: Project
get() = findTargetParent(
valid = { extensions.findByType(ConcreteRootExtension::class.java) != null },
extract = { this },
error = { "Failed to find concrete root. Did you apply the concrete root plugin?" }
)
/**
* Scans a project hierarchy looking for a project matching the criteria specified in [valid].
* If found, [extract] is called and the result is returned. If no matching project is found, [error] is called
* and passed to RuntimeException as an error string.
*/
internal fun <T> Project.findTargetParent(valid: Project.() -> Boolean, extract: Project.() -> T, error: () -> String): T {
if (valid(this)) {
return extract(this)
}
if (parent != null) {
return parent!!.findTargetParent(valid, extract, error)
}
throw RuntimeException(error())
}
internal fun Iterable<File>.allFilesRelativeToPath(root: Path): List<Path> = map { root.relativize(it.toPath()) }
internal fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/")

View File

@ -1,8 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.provider.Property
interface ConcreteExtension {
val paperVersionGroup: Property<String>
val minecraftServerPath: Property<String>
}

View File

@ -1,25 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.create
class ConcreteGradlePlugin : Plugin<Project> {
override fun apply(project: Project) {
project.extensions.create<ConcreteExtension>("concrete")
val setupPaperServer = project.tasks.create<SetupPaperServer>("setupPaperServer")
project.afterEvaluate { ->
setupPaperServer.dependsOn(*project.subprojects
// TODO: Foundation specific
.filter { it.isFoundationPlugin() }
.map { it.tasks.getByName("shadowJar") }
.toTypedArray()
)
}
val runPaperServer = project.tasks.create<RunPaperServer>("runPaperServer")
runPaperServer.dependsOn(setupPaperServer)
val updateManifests = project.tasks.create<UpdateManifestTask>("updateManifests")
project.tasks.getByName("assemble").dependsOn(updateManifests)
}
}

View File

@ -1,16 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.Plugin
import org.gradle.api.Project
class ConcreteProjectPlugin : Plugin<Project> {
override fun apply(project: Project) {
val versionWithBuild = if (System.getenv("CI_PIPELINE_IID") != null) {
project.rootProject.version.toString() + ".${System.getenv("CI_PIPELINE_IID")}"
} else {
"DEV"
}
project.version = versionWithBuild
}
}

View File

@ -1,7 +0,0 @@
package lgbt.mystic.foundation.concrete
import com.google.gson.Gson
object Globals {
val gson = Gson()
}

View File

@ -1,33 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.util.jar.JarFile
open class RunPaperServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@TaskAction
fun runPaperServer() {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
val paperJarFile = minecraftServerDirectory.resolve("paper.jar")
val mainClassName = readMainClass(paperJarFile)
project.javaexec {
classpath(paperJarFile.absolutePath)
workingDir(minecraftServerDirectory)
args("nogui")
mainClass.set(mainClassName)
}
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
}

View File

@ -1,69 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.nio.file.Files
open class SetupPaperServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@get:Input
@set:Option(option = "update", description = "Update Paper Server")
var shouldUpdatePaperServer = false
private val paperVersionClient = PaperVersionClient()
@TaskAction
fun downloadPaperTask() {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val paperJarFile = project.file("${concrete.minecraftServerPath.get()}/paper.jar")
if (!paperJarFile.exists() || shouldUpdatePaperServer) {
downloadLatestBuild(concrete.paperVersionGroup.get(), paperJarFile)
}
val paperPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!paperPluginsDirectory.exists()) {
paperPluginsDirectory.mkdirs()
}
for (project in project.subprojects) {
if (!project.isFoundationPlugin()) {
continue
}
val pluginJarFile = project.buildDir.resolve("libs/${project.name}-DEV-plugin.jar")
val pluginLinkFile = paperPluginsDirectory.resolve("${project.name}.jar")
if (pluginLinkFile.exists()) {
pluginLinkFile.delete()
}
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
}
private fun downloadLatestBuild(paperVersionGroup: String, paperJarFile: File) {
val builds = paperVersionClient.getVersionBuilds(paperVersionGroup)
val build = builds.last()
val download = build.downloads["application"]!!
val url = paperVersionClient.resolveDownloadUrl(build, download)
val downloader = SmartDownloader(paperJarFile.toPath(), url, download.sha256)
if (downloader.download()) {
logger.lifecycle("Installed Paper Server ${build.version} build ${build.build}")
} else {
logger.lifecycle("Paper Server ${build.version} build ${build.build} is up-to-date")
}
}
}

View File

@ -1,32 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import java.nio.file.Files
import java.nio.file.Path
open class UpdateManifestTask : DefaultTask() {
@TaskAction
fun update() {
val manifestsDir = ensureManifestsDir()
val updateFile = manifestsDir.resolve("update.json")
val rootPath = project.rootProject.rootDir.toPath()
val updateManifest = project.findPluginProjects().mapNotNull { project ->
val paths = project.shadowJarOutputs.allFilesRelativeToPath(rootPath)
if (paths.isNotEmpty()) {
project.name to mapOf(
"version" to project.version,
"artifacts" to paths.map { it.toUnixString() }
)
} else null
}.toMap()
Files.writeString(updateFile, Globals.gson.toJson(updateManifest))
}
private fun ensureManifestsDir(): Path {
val manifestsDir = project.buildDir.resolve("manifests")
manifestsDir.mkdirs()
return manifestsDir.toPath()
}
}

View File

@ -1,17 +0,0 @@
package lgbt.mystic.foundation.concrete
import org.gradle.api.Project
import org.gradle.api.tasks.TaskOutputs
import java.nio.file.FileSystems
import java.nio.file.Path
fun Project.isFoundationPlugin() = name.startsWith("foundation-")
fun Project.findPluginProjects() = rootProject.subprojects.filter { project -> project.isFoundationPlugin() }
val Project.shadowJarOutputs: TaskOutputs
get() = project.tasks.getByName("shadowJar").outputs
fun TaskOutputs.allFilesRelativeToPath(root: Path): List<Path> = files.map { root.relativize(it.toPath()) }
fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/")

9
tools/build-samples.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
set -e
cd "$(dirname "${0}")/.."
for SAMPLE_PATH in samples/*
do
pushd "${SAMPLE_PATH}" > /dev/null
./gradlew -q build
popd > /dev/null
done

10
tools/ensure-new-lines.sh Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -e
git ls-files -z | while IFS= read -rd '' f
do
if file --mime-encoding "$f" | grep -qv binary
then
tail -c1 < "$f" | read -r _ || echo >> "$f"
fi
done