Initial commit

This commit is contained in:
lexikiq
2021-05-01 15:25:18 -04:00
commit 1261d05c9b
23 changed files with 1686 additions and 0 deletions

23
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,23 @@
---
name: Bug report
about: Create a report detailing a bug
title: ''
labels: bug, unconfirmed
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce. Videos are nice if applicable.
**Plugins**
Show the output of /plugins here.
**Version**
Show the output of /version here.
**Misc**
Anything else helpful not belonging in the categories above.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

38
.github/workflows/pr-build.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Build PR
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [11, 8]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-maven-
- name: Patch Parchment
run: |
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git submodule update --init --recursive
./parchment jar
- uses: actions/upload-artifact@v2
with:
name: Parchment-PR${{ github.event.pull_request.number }}-JDK${{ matrix.java }}
path: parchment-paperclip.jar

38
.github/workflows/push-build.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Build main
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [11, 8]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-maven-
- name: Patch Parchment
run: |
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git submodule update --init --recursive
./parchment jar
- uses: actions/upload-artifact@v2
with:
name: Parchment-JDK${{ matrix.java }}
path: parchment-paperclip.jar

43
.gitignore vendored Normal file
View File

@@ -0,0 +1,43 @@
# Concrete
Parchment-Server
Parchment-API
mc-dev
.idea
testserver
run
current-paper
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# IntelliJ
*.iml
*.ipr
*.iws
.idea/
out/
# Maven
target/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

4
.gitmodules vendored Normal file
View File

@@ -0,0 +1,4 @@
[submodule "Paper"]
path = Paper
url = https://github.com/PaperMC/Paper
branch = master

1
Paper Submodule

Submodule Paper added at 9958447cba

39
README.md Normal file
View File

@@ -0,0 +1,39 @@
# Parchment
This is a fork of [Paper](https://github.com/PaperMC/Paper) for the [Project Eden](https://bnn.gg/) server.
It contains changes to the API to make development of our plugin [Nexus](https://github.com/Pugabyte/Nexus) easier.
## Building
Requirements:
- You need `git` installed, with a configured user name and email.
On Windows you need to run from git bash.
- You need `maven` installed.
- You need `jdk` 8+ installed to compile (and `jre` 8+ to run).
- Anything else that `paper` requires to build.
If all you want is a paperclip server jar, just run `./parchment jar`.
Otherwise, to setup the `Parchment-API` and `Parchment-Server` repo, just run the following command
in your project root `./parchment patch` additionally, after you run `./parchment patch` you can run `./parchment build` to build the
respective api and server jars.
`./parchment patch` should initialize the repo such that you can now start modifying and creating
patches. The folder `Parchment-API` is the api repo and the `Parchment-Server` folder
is the server repo and will contain the source files you will modify.
### Creating a patch
Patches are effectively just commits in either `Parchment-API` or `Parchment-Server`.
To create one, just add a commit to either repo and run `./parchment rb`, and a
patch will be placed in the patches folder. Modifying commits will also modify its
corresponding patch file.
## License
See https://github.com/starlis/empirecraft, https://github.com/electronicboy/byof, and https://github.com/Spottedleaf/Tuinity
for the license of material used/modified by this project.
### Note
The fork is based off of [Tuinity](https://github.com/Spottedleaf/Tuinity).

136
parchment Executable file
View File

@@ -0,0 +1,136 @@
#!/usr/bin/env bash
# exit immediately if a command exits with a non-zero status
set -e
# get base dir regardless of execution location
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SOURCE=$([[ "$SOURCE" = /* ]] && echo "$SOURCE" || echo "$PWD/${SOURCE#./}")
basedir=$(dirname "$SOURCE")
. "$basedir"/scripts/init.sh
paperstash() {
STASHED=$(git stash)
}
paperunstash() {
if [[ "$STASHED" != "No local changes to save" ]] ; then
git stash pop
fi
}
case "$1" in
"rb" | "rbp" | "rebuild")
(
set -e
cd "$basedir"
scripts/rebuildpatches.sh "$basedir"
)
;;
"p" | "patch" | "apply")
(
set -e
cd "$basedir"
if [ "$2" != "fast" ]; then
scripts/upstream.sh
fi
scripts/apply.sh "$basedir"
)
;;
"b" | "bu" | "build")
(
basedir
mvn -N install
cd ${FORK_NAME}-API && mvn -e clean install
cd ../Paper/Paper-MojangAPI && mvn -e clean install
cd ../../${FORK_NAME}-Server && mvn -e clean install
)
;;
"jar" | "paperclip")
(
basedir
cd "$basedir"
if [ "$2" != "fast" ]; then
scripts/upstream.sh
fi
./scripts/apply.sh "$basedir"
cd "$basedir"
mvn -N install
cd ${FORK_NAME}-API && mvn -e clean install
cd ../Paper/Paper-MojangAPI && mvn -e clean install
cd ../../${FORK_NAME}-Server && mvn -e clean install
cd "$basedir"
./scripts/paperclip.sh
)
;;
"i" | "install")
(
basedir
mvn -N install
cd ${FORK_NAME}-API
mvn clean install && cd ../${FORK_NAME}-Server && mvn clean install
)
;;
"up" | "upstream")
(
cd "$basedir"
scripts/upstream.sh "$2"
)
;;
"r" | "root")
cd "$basedir"
;;
"a" | "api")
cd "$basedir/Parchment-API"
;;
"s" | "server")
cd "$basedir/Parchment-Server"
;;
"setup")
if [[ -f ~/.bashrc ]] ; then
NAME="ec"
if [[ ! -z "${2+x}" ]] ; then
NAME="$2"
fi
(grep "alias $NAME=" ~/.bashrc > /dev/null) && (sed -i "s|alias $NAME=.*|alias $NAME='. $SOURCE'|g" ~/.bashrc) || (echo "alias $NAME='. $SOURCE'" >> ~/.bashrc)
alias "$NAME=. $SOURCE"
echo "You can now just type '$NAME' at any time to access the paper tool."
fi
;;
*)
echo "Parchment build tool command. This provides a variety of commands to build and manage the PaperMC build"
echo "environment. For all of the functionality of this command to be available, you must first run the"
echo "'setup' command. View below for details. For essential building and patching, you do not need to do the setup."
echo ""
echo " Normal commands:"
echo " * rb, rebuild | Rebuild patches, can be called from anywhere."
echo " * p, patch | Apply all patches to top of Paper without building it. Can be run from anywhere."
echo " * up, upstream | Build Paper upstream, pass arg up to update paper. Can be run from anywhere."
echo " * b, build | Build API and Server but no deploy. Can be ran anywhere."
echo " * j, jar | Apply all patches and build the project, parchment-paperclip.jar will be output. Can be run from anywhere."
echo " * i, install | Build and install API jar and build Server. Can be ran anywhere."
echo ""
echo " These commands require the setup command before use:"
echo " * r, root | Change directory to the root of the project."
echo " * a. api | Move to the Paper-API directory."
echo " * s, server | Move to the Paper-Server directory."
echo " * e, edit | Use to edit a specific patch, give it the argument \"server\" or \"api\""
echo " | respectively to edit the correct project. Use the argument \"continue\" after"
echo " | the changes have been made to finish and rebuild patches. Can be called from anywhere."
echo ""
echo " * setup | Add an alias to .bashrc to allow full functionality of this script. Run as:"
echo " | . ./parchment setup"
echo " | After you run this command you'll be able to just run 'parchment' from anywhere."
echo " | The default name for the resulting alias is 'parchment', you can give an argument to override"
echo " | this default, such as:"
echo " | . ./parchment setup example"
echo " | Which will allow you to run 'example' instead."
;;
esac
unset -f paperstash
unset -f paperunstash

View File

@@ -0,0 +1,35 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Sat, 1 May 2021 14:27:26 -0400
Subject: [PATCH] Parchment POM Changes
diff --git a/pom.xml b/pom.xml
index c2e9ca1cc7f14d3a696385edc3cb341f902fa2fd..e5ed07236c358e9ea544f43b41533c92769192dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,18 +3,18 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
- <groupId>com.destroystokyo.paper</groupId>
- <artifactId>paper-parent</artifactId>
+ <groupId>me.lexikiq</groupId>
+ <artifactId>parchment-parent</artifactId>
<version>dev-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
</parent>
- <groupId>com.destroystokyo.paper</groupId>
- <artifactId>paper-api</artifactId>
+ <artifactId>parchment-api</artifactId>
<version>1.16.5-R0.1-SNAPSHOT</version>
<packaging>jar</packaging>
- <name>Paper-API</name>
- <url>https://github.com/PaperMC/Paper</url>
+ <name>Parchment-API</name>
+ <url>https://github.com/lexikiq/Parchment</url>
<description>An enhanced plugin API for Minecraft servers.</description>
<properties>

View File

@@ -0,0 +1,78 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Sat, 1 May 2021 14:36:37 -0400
Subject: [PATCH] Parchment POM Changes
diff --git a/pom.xml b/pom.xml
index ab57297272c2d6f3d21067081bcaf8775b8fff09..85bf0a229fa8c4e42744f438b71fda4cef67b4e0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,11 +1,11 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
- <artifactId>paper</artifactId>
+ <artifactId>parchment</artifactId>
<packaging>jar</packaging>
<version>1.16.5-R0.1-SNAPSHOT</version>
- <name>Paper</name>
- <url>https://papermc.io</url>
+ <name>Parchment-Server</name>
+ <url>https://github.com/lexikiq/Parchment</url>
<properties>
<!-- <skipTests>true</skipTests> Paper - This [was] not going to end well -->
@@ -19,8 +19,8 @@
</properties>
<parent>
- <groupId>com.destroystokyo.paper</groupId>
- <artifactId>paper-parent</artifactId>
+ <groupId>me.lexikiq</groupId>
+ <artifactId>parchment-parent</artifactId>
<version>dev-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
@@ -39,8 +39,8 @@
<dependencies>
<dependency>
- <groupId>com.destroystokyo.paper</groupId>
- <artifactId>paper-api</artifactId>
+ <groupId>me.lexikiq</groupId>
+ <artifactId>parchment-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
@@ -160,7 +160,7 @@
<!-- This builds a completely 'ready to start' jar with all dependencies inside -->
<build>
- <finalName>paper-${minecraft.version}</finalName>
+ <finalName>parchment-${minecraft.version}</finalName>
<defaultGoal>clean install</defaultGoal> <!-- Paper -->
<plugins>
<plugin>
@@ -168,7 +168,7 @@
<artifactId>gitdescribe-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
- <outputPrefix>git-Paper-</outputPrefix>
+ <outputPrefix>git-Parchment-</outputPrefix>
<scmDirectory>..</scmDirectory>
</configuration>
<executions>
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
index 674096cab190d62622f9947853b056f57d43a2a5..fbba763d909c4636174e79c680745b83c41409bb 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
@@ -11,7 +11,7 @@ public final class Versioning {
public static String getBukkitVersion() {
String result = "Unknown-Version";
- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/com.destroystokyo.paper/paper-api/pom.properties");
+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/me.lexikiq/parchment-api/pom.properties");
Properties properties = new Properties();
if (stream != null) {

View File

@@ -0,0 +1,19 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Sat, 1 May 2021 14:44:37 -0400
Subject: [PATCH] Disable Metrics
diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java
index dee00aac05f1acf050f05d4db557a08dd0f301c8..df2aefc163d9f932664e2ff0c8a8f9a5b09047e5 100644
--- a/src/main/java/com/destroystokyo/paper/Metrics.java
+++ b/src/main/java/com/destroystokyo/paper/Metrics.java
@@ -73,7 +73,7 @@ public class Metrics {
Metrics.logger = logger;
// Start submitting the data
- startSubmitting();
+ // startSubmitting();
}
/**

View File

@@ -0,0 +1,683 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Sat, 1 May 2021 15:08:28 -0400
Subject: [PATCH] Parchment brand changes
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 61712ae515b329a6b85dbe2e5960e4e864dc7731..051ba2c4ae14c5da58177e52f5c55241f97caab8 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1579,7 +1579,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
}
public String getServerModName() {
- return "Paper"; //Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
+ return "Parchment"; //Parchment - Parchment > //Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
}
public CrashReport b(CrashReport crashreport) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 03b8d67a5f0088c0254b2099f27e8dcae32a6221..d2c645f459a604dd804fcda119a282f6947a4bbf 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -232,7 +232,7 @@ import javax.annotation.Nullable; // Paper
import javax.annotation.Nonnull; // Paper
public final class CraftServer implements Server {
- private final String serverName = "Paper"; // Paper
+ private final String serverName = "Parchment"; // Paper // Parchment
private final String serverVersion;
private final String bukkitVersion = Versioning.getBukkitVersion();
private final Logger logger = Logger.getLogger("Minecraft");
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 154f3a6a3d37b94c40cb29c305e3aa5fb494850c..ae76d5878392e1226ad7d72fe536fb1796cdb500 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -253,7 +253,7 @@ public class Main {
if (buildDate.before(deadline.getTime())) {
// Paper start - This is some stupid bullshit
System.err.println("*** Warning, you've not updated in a while! ***");
- System.err.println("*** Please download a new build as per instructions from https://papermc.io/downloads ***"); // Paper
+ System.err.println("*** Please compile a new build ***"); // Paper
//System.err.println("*** Server will start in 20 seconds ***");
//Thread.sleep(TimeUnit.SECONDS.toMillis(20));
// Paper End
diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png
index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..0aea373d9f0b09a19a0ed781938bba9cda1a4a30 100644
GIT binary patch
literal 18477
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
literal 14310
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%0ABLt+m?son?j
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
WX&3$!%>|s_1IbA#OV)^+1pg1OmmZn`

30
pom.xml Normal file
View File

@@ -0,0 +1,30 @@
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>me.lexikiq</groupId>
<artifactId>parchment-parent</artifactId>
<version>dev-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Parchment (Parent)</name>
<repositories>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
</repository>
<repository>
<id>velocity-snapshots</id>
<url>https://nexus.velocitypowered.com/repository/velocity-artifacts-snapshots/</url>
</repository>
</repositories>
<build>
<defaultGoal>install</defaultGoal>
<finalName>${project.artifactId}</finalName>
</build>
<modules>
<module>Parchment-API</module>
<module>Parchment-Server</module>
<module>Paper${file.separator}Paper-MojangAPI</module> <!-- We don't plan on patching this, so this hack is good enough. -->
</modules>
</project>

92
scripts/apply.sh Executable file
View File

@@ -0,0 +1,92 @@
#!/usr/bin/env bash
# get base dir regardless of execution location
# resolve shell-specifics
case "$(echo "$SHELL" | sed -E 's|/usr(/local)?||g')" in
"/bin/zsh")
RCPATH="$HOME/.zshrc"
SOURCE="${BASH_SOURCE[0]:-${(%):-%N}}"
;;
*)
RCPATH="$HOME/.bashrc"
if [[ -f "$HOME/.bash_aliases" ]]; then
RCPATH="$HOME/.bash_aliases"
fi
SOURCE="${BASH_SOURCE[0]}"
;;
esac
# get base dir regardless of execution location
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
PS1="$"
paperVer=$(cat current-paper)
gpgsign="$(git config commit.gpgsign || echo "false")"
echo "Rebuilding Forked projects.... "
function applyPatch {
what=$1
what_name=$(basename $what)
target=$2
branch=$3
patch_folder=$4
cd "$basedir/$what"
git fetch --all
git branch -f upstream "$branch" >/dev/null
cd "$basedir"
if [ ! -d "$basedir/$target" ]; then
mkdir "$basedir/$target"
cd "$basedir/$target"
git init
git remote add origin "$5"
cd "$basedir"
fi
cd "$basedir/$target"
# Disable GPG signing before AM, slows things down and doesn't play nicely.
# There is also zero rational or logical reason to do so for these sub-repo AMs.
# Calm down kids, it's re-enabled (if needed) immediately after, pass or fail.
git config commit.gpgsign false
echo "Resetting $target to $what_name..."
git remote rm upstream > /dev/null 2>&1
git remote add upstream "$basedir/$what" >/dev/null 2>&1
git checkout master 2>/dev/null || git checkout -b master
git fetch upstream >/dev/null 2>&1
git reset --hard upstream/upstream
echo " Applying patches to $target..."
git am --abort >/dev/null 2>&1
git am --3way --ignore-whitespace "$basedir/patches/$patch_folder/"*.patch
if [ "$?" != "0" ]; then
echo " Something did not apply cleanly to $target."
echo " Please review above details and finish the apply then"
echo " save the changes with rebuildPatches.sh"
exit 1
else
echo " Patches applied cleanly to $target"
fi
}
function enableCommitSigningIfNeeded {
if [[ "$gpgsign" == "true" ]]; then
git config commit.gpgsign true
fi
}
echo "Importing MC-DEV"
./scripts/importmcdev.sh "$basedir" || exit 1
(
(applyPatch Paper/Paper-API ${FORK_NAME}-API HEAD api $API_REPO &&
applyPatch Paper/Paper-Server ${FORK_NAME}-Server HEAD server $SERVER_REPO) || exit 1
enableCommitSigningIfNeeded
) || (
echo "Failed to apply patches"
enableCommitSigningIfNeeded
exit 1
) || exit 1

40
scripts/generatesources.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/usr/bin/env bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
cd $basedir
paperVer=$(cat current-paper)
minecraftversion=$(cat $basedir/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4)
decompile="Paper/work/Minecraft/$minecraftversion/spigot"
mkdir -p mc-dev/src/net/minecraft
cd mc-dev
if [ ! -d ".git" ]; then
git init
fi
rm src/net/minecraft/*.java
cp -r $basedir/$decompile/net/minecraft/* src/net/minecraft
base="$basedir/Paper/Paper-Server/src/main/java/net/minecraft"
cd $basedir/mc-dev/src/net/minecraft/
for file in $(/bin/ls $base)
do
if [ -f "$file" ]; then
rm -f "$file"
fi
done
cd $basedir/mc-dev
git add . -A
git commit . -m "mc-dev"
git tag -a "$paperVer" -m "$paperVer" 2>/dev/null
pushRepo . $MCDEV_REPO $paperVer

127
scripts/importmcdev.sh Executable file
View File

@@ -0,0 +1,127 @@
#!/usr/bin/env bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
workdir="$basedir"/Paper/work
minecraftversion=$(cat "$basedir"/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4)
decompiledir=$workdir/Minecraft/$minecraftversion/spigot
nms="net/minecraft"
export MODLOG=""
cd "$basedir"
function containsElement {
local e
for e in "${@:2}"; do
[[ "$e" == "$1" ]] && return 0;
done
return 1
}
export importedmcdev=""
function import {
if [ -f "$basedir/Paper/Paper-Server/src/main/java/$nms/$1.java" ]; then
echo "ALREADY IMPORTED $1"
return 0
fi
export importedmcdev="$importedmcdev $1"
file="${1}.java"
target="$basedir/Paper/Paper-Server/src/main/java/$nms/$file"
base="$decompiledir/$nms/$file"
if [[ ! -f "$target" ]]; then
export MODLOG="$MODLOG Imported $file from mc-dev\n";
mkdir -p "$(dirname "$target")"
echo "$(bashColor 1 32) Copying $(bashColor 1 34)$base $(bashColor 1 32)to$(bashColor 1 34) $target $(bashColorReset)"
cp "$base" "$target"
else
echo "$(bashColor 1 33) UN-NEEDED IMPORT STATEMENT:$(bashColor 1 34) $file $(bashColorReset)"
fi
}
function importLibrary {
group=$1
lib=$2
prefix=$3
shift 3
for file in "$@"; do
file="$prefix/$file"
target="$basedir/Paper/Paper-Server/src/main/java/$file"
targetdir=$(dirname "$target")
mkdir -p "${targetdir}"
base="$workdir/Minecraft/$minecraftversion/libraries/${group}/${lib}/$file"
if [ ! -f "$base" ]; then
echo "Missing $base"
exit 1
fi
export MODLOG="$MODLOG Imported $file from $lib\n";
sed 's/\r$//' "$base" > "$target" || exit 1
done
}
(
cd Paper/Paper-Server/
lastlog=$(git log -1 --oneline)
if [[ "$lastlog" = *"Parchment-Extra mc-dev Imports"* ]]; then
git reset --hard HEAD^
fi
)
files=$(cat patches/server/* | grep "+++ b/src/main/java/net/minecraft/" | sort | uniq | sed 's/\+\+\+ b\/src\/main\/java\/net\/minecraft\///g')
nonnms=$(grep -R "new file mode" -B 1 "$basedir/patches/server/" | grep -v "new file mode" | grep -oE --color=none "net\/minecraft\/.*.java" | sed 's/.*\/net\/minecraft\///g')
for f in $files; do
containsElement "$f" ${nonnms[@]}
if [ "$?" == "1" ]; then
if [ ! -f "$basedir/Paper/Paper-Server/src/main/java/net/minecraft/$f" ]; then
f="$(echo "$f" | sed 's/.java//g')"
if [ ! -f "$decompiledir/$nms/$f.java" ]; then
echo "$(bashColor 1 31) ERROR!!! Missing NMS$(bashColor 1 34) $f $(bashColorReset)";
error=true
else
import $f
fi
fi
fi
done
if [ -n "$error" ]; then
exit 1
fi
###############################################################################################
###############################################################################################
#################### ADD TEMPORARY ADDITIONS HERE #############################################
###############################################################################################
###############################################################################################
# import Foo
########################################################
########################################################
########################################################
# LIBRARY IMPORTS
# These must always be mapped manually, no automatic stuff
#
# # group # lib # prefix # many files
#importLibrary com.mojang datafixerupper com/mojang/datafixers/util Either.java
importLibrary com.mojang brigadier com/mojang/brigadier CommandDispatcher.java
importLibrary com.mojang brigadier com/mojang/brigadier/tree LiteralCommandNode.java
importLibrary com.mojang brigadier com/mojang/brigadier/suggestion SuggestionsBuilder.java
importLibrary com.mojang brigadier com/mojang/brigadier/arguments BoolArgumentType.java
################
(
cd Paper/Paper-Server/
rm -rf nms-patches
git add src -A
echo -e "Parchment-Extra mc-dev Imports\n\n$MODLOG" | git commit src -F -
exit 0
)

65
scripts/init.sh Executable file
View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# BEGIN config
FORK_NAME="Parchment"
API_REPO=""
SERVER_REPO=""
PAPER_API_REPO=""
PAPER_SERVER_REPO=""
MCDEV_REPO=""
# END config
sourceBase=$(dirname $SOURCE)/../
cd "${basedir:-$sourceBase}"
basedir=$(pwd -P)
cd -
function bashColor {
if [ $2 ]; then
echo -e "\e[$1;$2m"
else
echo -e "\e[$1m"
fi
}
function bashColorReset {
echo -e "\e[m"
}
function cleanupPatches {
cd "$1"
for patch in *.patch; do
gitver=$(tail -n 2 $patch | grep -ve "^$" | tail -n 1)
diffs=$(git diff --staged $patch | grep -E "^(\+|\-)" | grep -Ev "(From [a-z0-9]{32,}|\-\-\- a|\+\+\+ b|.index|Date\: )")
testver=$(echo "$diffs" | tail -n 2 | grep -ve "^$" | tail -n 1 | grep "$gitver")
if [ "x$testver" != "x" ]; then
diffs=$(echo "$diffs" | tail -n +3)
fi
if [ "x$diffs" == "x" ] ; then
git reset HEAD $patch >/dev/null
git checkout -- $patch >/dev/null
fi
done
}
function pushRepo {
if [ "$(git config minecraft.push-${FORK_NAME})" == "1" ]; then
echo "Pushing - $1 ($3) to $2"
(
cd "$1"
git remote rm emc-push > /dev/null 2>&1
git remote add emc-push $2 >/dev/null 2>&1
git push emc-push $3 -f
)
fi
}
function basedir {
cd "$basedir"
}
function gethead {
(
cd "$1"
git log -1 --oneline
)
}

25
scripts/paperclip.sh Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Copied from https://github.com/PaperMC/Paper/blob/d54ce6c17fb7a35238d6b9f734d30a4289886773/scripts/paperclip.sh
# License from Paper applies to this file
(
set -e
basedir="$(cd "$1" && pwd -P)"
workdir="$basedir/Paper/work"
mcver=$(cat "$workdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4)
paperjar="$basedir/Parchment-Server/target/parchment-$mcver.jar"
vanillajar="$workdir/Minecraft/$mcver/$mcver.jar"
(
cd "$workdir/Paperclip"
mvn clean package "-Dmcver=$mcver" "-Dpaperjar=$paperjar" "-Dvanillajar=$vanillajar"
)
cp "$workdir/Paperclip/assembly/target/paperclip-${mcver}.jar" "$basedir/parchment-paperclip.jar"
echo ""
echo ""
echo ""
echo "Build success!"
echo "Copied final jar to $(cd "$basedir" && pwd -P)/parchment-paperclip.jar"
) || exit 1

15
scripts/push.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# get base dir regardless of execution location
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
minecraftversion=$(cat $basedir/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4)
basedir
pushRepo ${FORK_NAME}-API $API_REPO master:$minecraftversion
pushRepo ${FORK_NAME}-Server $SERVER_REPO master:$minecraftversion

43
scripts/rebuildpatches.sh Executable file
View File

@@ -0,0 +1,43 @@
#!/usr/bin/env bash
# get base dir regardless of execution location
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
PS1="$"
echo "Rebuilding patch files from current fork state..."
function savePatches {
what=$1
cd $basedir/$what/
mkdir -p $basedir/patches/$2
if [ -d ".git/rebase-apply" ]; then
# in middle of a rebase, be smarter
echo "REBASE DETECTED - PARTIAL SAVE"
last=$(cat ".git/rebase-apply/last")
next=$(cat ".git/rebase-apply/next")
declare -a files=("$basedir/patches/$2/"*.patch)
for i in $(seq -f "%04g" 1 1 $last)
do
if [ $i -lt $next ]; then
rm "${files[`expr $i - 1`]}"
fi
done
else
rm $basedir/patches/$2/*.patch
fi
git format-patch --no-signature --zero-commit --full-index --no-stat -N -o $basedir/patches/$2 upstream/upstream
cd $basedir
git add -A $basedir/patches/$2
echo " Patches saved for $what to patches/$2"
}
savePatches ${FORK_NAME}-API api
savePatches ${FORK_NAME}-Server server
$basedir/scripts/push.sh

64
scripts/upstream.sh Executable file
View File

@@ -0,0 +1,64 @@
#!/usr/bin/env bash
# get base dir regardless of execution location
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
. $(dirname $SOURCE)/init.sh
git submodule update --init --recursive
if [[ "$1" == up* ]]; then
(
cd "$basedir/Paper/"
git fetch && git reset --hard origin/master
cd ../
git add Paper
)
fi
paperVer=$(gethead Paper)
cd "$basedir/Paper/"
./paper patch
cd "Paper-Server"
mcVer=$(mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=minecraft_version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }')
basedir
. "$basedir"/scripts/importmcdev.sh
minecraftversion=$(cat "$basedir"/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4)
version=$(echo -e "Paper: $paperVer\nmc-dev:$importedmcdev")
tag="${minecraftversion}-${mcVer}-$(echo -e $version | shasum | awk '{print $1}')"
echo "$tag" > "$basedir"/current-paper
"$basedir"/scripts/generatesources.sh
cd Paper/
function tag {
(
cd $1
if [ "$2" == "1" ]; then
git tag -d "$tag" 2>/dev/null
fi
echo -e "$(date)\n\n$version" | git tag -a "$tag" -F - 2>/dev/null
)
}
echo "Tagging as $tag"
echo -e "$version"
forcetag=0
if [ "$(cat "$basedir"/current-paper)" != "$tag" ]; then
forcetag=1
fi
tag Paper-API $forcetag
tag Paper-Server $forcetag
pushRepo Paper-API $PAPER_API_REPO $tag
pushRepo Paper-Server $PAPER_SERVER_REPO $tag

28
scripts/upstreamCommit.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
(
set -e
PS1="$"
function changelog() {
base=$(git ls-tree HEAD $1 | cut -d' ' -f3 | cut -f1)
cd $1 && git log --oneline ${base}...HEAD
}
paper=$(changelog Paper)
updated=""
logsuffix=""
if [ ! -z "$paper" ]; then
logsuffix="$logsuffix\n\nPaper Changes:\n$paper"
if [ -z "$updated" ]; then updated="Paper"; else updated="$updated/Paper"; fi
fi
disclaimer="Upstream has released updates that appears to apply and compile correctly"
if [ ! -z "$1" ]; then
disclaimer="$@"
fi
log="${UP_LOG_PREFIX}Updated Upstream ($updated)\n\n${disclaimer}${logsuffix}"
echo -e "$log" | git commit -F -
) || exit 1