init
This commit is contained in:
commit
f7b026bf8e
|
|
@ -0,0 +1,31 @@
|
|||
name: Workflow Build
|
||||
on: [ push ]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: cache gradle packages
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
- name: validate gradle wrapper
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
- name: setup jdk 8.0
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: adopt
|
||||
java-version: 8.0
|
||||
- name: make gradle wrapper executable
|
||||
run: chmod +x ./gradlew
|
||||
- name: build
|
||||
run: ./gradlew build
|
||||
- name: capture build artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts
|
||||
path: build/libs/
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
name: Workflow Release
|
||||
on:
|
||||
release:
|
||||
types: [ published ]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: validate gradle wrapper
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
- name: setup jdk 8.0
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: adopt
|
||||
java-version: 8.0
|
||||
- name: make gradle wrapper executable
|
||||
run: chmod +x ./gradlew
|
||||
- name: build
|
||||
run: ./gradlew publish
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
.gradle
|
||||
.idea
|
||||
build
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
plugins {
|
||||
`java-library`
|
||||
`maven-publish`
|
||||
id("io.izzel.taboolib") version "1.42"
|
||||
id("org.jetbrains.kotlin.jvm") version "1.5.10"
|
||||
}
|
||||
|
||||
taboolib {
|
||||
install("common")
|
||||
install("common-5")
|
||||
install("module-chat")
|
||||
install("module-configuration")
|
||||
install("module-lang")
|
||||
install("module-ui")
|
||||
install("platform-bukkit")
|
||||
classifier = null
|
||||
version = "6.0.9-55"
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly("ink.ptms:nms-all:1.0.0")
|
||||
compileOnly("ink.ptms.core:v11900:11900-minimize:mapped")
|
||||
compileOnly("ink.ptms.core:v11900:11900-minimize:universal")
|
||||
compileOnly(kotlin("stdlib"))
|
||||
compileOnly(fileTree("libs"))
|
||||
}
|
||||
|
||||
tasks.withType<JavaCompile> {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
freeCompilerArgs = listOf("-Xjvm-default=all")
|
||||
}
|
||||
}
|
||||
|
||||
configure<JavaPluginConvention> {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
maven {
|
||||
url = uri("https://repo.tabooproject.org/repository/releases")
|
||||
credentials {
|
||||
username = project.findProperty("taboolibUsername").toString()
|
||||
password = project.findProperty("taboolibPassword").toString()
|
||||
}
|
||||
authentication {
|
||||
create<BasicAuthentication>("basic")
|
||||
}
|
||||
}
|
||||
}
|
||||
publications {
|
||||
create<MavenPublication>("library") {
|
||||
from(components["java"])
|
||||
groupId = project.group.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
group=cc.maxmc.chunkloader
|
||||
version=1.0.0
|
||||
Binary file not shown.
|
|
@ -0,0 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$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=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 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
|
||||
;;
|
||||
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"
|
||||
which java >/dev/null 2>&1 || 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
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
@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=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@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=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
: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 %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="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
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
|
|
@ -0,0 +1 @@
|
|||
rootProject.name="SimpleChunkLoader"
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package cc.maxmc.chunkloader
|
||||
|
||||
import cc.maxmc.chunkloader.misc.ChunkLoaderManager
|
||||
import taboolib.common.platform.Plugin
|
||||
import taboolib.common.platform.function.info
|
||||
|
||||
object SimpleChunkLoader : Plugin() {
|
||||
|
||||
override fun onEnable() {
|
||||
info("")
|
||||
ChunkLoaderManager
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
package cc.maxmc.chunkloader.gui
|
||||
|
||||
import cc.maxmc.chunkloader.misc.ChunkLoaderManager
|
||||
import cc.maxmc.chunkloader.misc.ChunkLoaderManager.type
|
||||
import cc.maxmc.chunkloader.misc.ChunkType.*
|
||||
import org.bukkit.Chunk
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.Inventory
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import taboolib.library.xseries.XMaterial
|
||||
import taboolib.module.ui.ClickType.*
|
||||
import taboolib.module.ui.buildMenu
|
||||
import taboolib.module.ui.type.Linked
|
||||
import taboolib.platform.util.buildItem
|
||||
|
||||
class ChunkInfoGUI(private val player: Player, private val centerChunk: Chunk) {
|
||||
val menu: Inventory = buildMenu<Linked<Chunk>>("§a| §7查看区块信息") {
|
||||
for (slot in 9..53) {
|
||||
val chunkCoordinate = slot2ChunkCoordinate(slot)
|
||||
val chunk = centerChunk.world.getChunkAt(chunkCoordinate.first, chunkCoordinate.second)
|
||||
set(slot, generateChunkIcon(chunk)) {
|
||||
isCancelled = true
|
||||
assert(clickType == CLICK)
|
||||
if (clickEvent().click.isLeftClick) {
|
||||
ChunkLoaderManager.tryClaimChunk(player, chunk)
|
||||
return@set
|
||||
}
|
||||
if (clickEvent().click.isRightClick) {
|
||||
|
||||
return@set
|
||||
}
|
||||
player.sendMessage("喵喵喵?")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun chunkCoordinate2Slot(coordinate: Pair<Int, Int>) =
|
||||
31 + (coordinate.second - centerChunk.z) * 9 + (coordinate.first - centerChunk.x)
|
||||
|
||||
private fun slot2ChunkCoordinate(slot: Int): Pair<Int, Int> {
|
||||
val offset = slot - 31
|
||||
if (offset == 0) return 3 to 3
|
||||
return centerChunk.x + (slot / 9) to centerChunk.z + (slot % 9)
|
||||
}
|
||||
|
||||
private fun generateChunkIcon(chunk: Chunk): ItemStack {
|
||||
val baseItem = when (chunk.type()) {
|
||||
CLAIMED -> {
|
||||
val loader = ChunkLoaderManager.loaderMap[chunk]!!
|
||||
if (loader.owner == player) {
|
||||
buildItem(XMaterial.EMERALD_BLOCK)
|
||||
} else {
|
||||
buildItem(XMaterial.PLAYER_HEAD) {
|
||||
this.skullOwner = loader.owner.name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NON_CLAIM -> buildItem(XMaterial.IRON_BLOCK)
|
||||
UNLOAD -> buildItem(XMaterial.COPPER_BLOCK)
|
||||
SYSTEM -> buildItem(XMaterial.DIAMOND_BLOCK)
|
||||
}
|
||||
|
||||
// TODO Finalize item generation.
|
||||
|
||||
return baseItem
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package cc.maxmc.chunkloader.misc
|
||||
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Chunk
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerializable
|
||||
import org.bukkit.configuration.serialization.SerializableAs
|
||||
import java.util.*
|
||||
|
||||
@SerializableAs("ChunkLoader")
|
||||
data class ChunkLoader(val owner: OfflinePlayer, val chunk: Chunk) : ConfigurationSerializable {
|
||||
|
||||
@Suppress("unused")
|
||||
constructor(map: Map<String, Any>) : this(
|
||||
Bukkit.getOfflinePlayer(UUID.fromString(map["owner"] as String)), (map["chunk"] as Location).chunk
|
||||
)
|
||||
|
||||
override fun serialize(): MutableMap<String, Any> = hashMapOf(
|
||||
"owner" to owner.uniqueId, "chunk" to chunk.getBlock(0, 0, 0).location
|
||||
)
|
||||
|
||||
fun enable() {
|
||||
chunk.isForceLoaded = true
|
||||
chunk.load()
|
||||
}
|
||||
|
||||
fun disable() {
|
||||
chunk.isForceLoaded = false
|
||||
chunk.load()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
package cc.maxmc.chunkloader.misc
|
||||
|
||||
import cc.maxmc.chunkloader.provider.ClaimProviderManager
|
||||
import org.bukkit.Chunk
|
||||
import org.bukkit.entity.Player
|
||||
import taboolib.common.platform.function.getDataFolder
|
||||
import taboolib.module.configuration.Configuration
|
||||
import taboolib.platform.util.sendLang
|
||||
import java.io.File
|
||||
|
||||
object ChunkLoaderManager {
|
||||
val loaderMap = HashMap<Chunk, ChunkLoader>()
|
||||
private val config = Configuration.loadFromFile(File(getDataFolder(), "loaders.yaml"))
|
||||
|
||||
init {
|
||||
loadChunkLoaders()
|
||||
}
|
||||
|
||||
private fun loadChunkLoaders() {
|
||||
@Suppress("UNCHECKED_CAST") val loaders =
|
||||
config.getList("loaders", emptyList<ChunkLoader>()) as List<ChunkLoader>
|
||||
loaders.forEach {
|
||||
loaderMap[it.chunk] = it
|
||||
it.enable()
|
||||
}
|
||||
}
|
||||
|
||||
private fun registerChunkLoader(chunkLoader: ChunkLoader) {
|
||||
loaderMap[chunkLoader.chunk] = chunkLoader
|
||||
config["loaders"] = loaderMap.values.toList()
|
||||
config.saveToFile()
|
||||
}
|
||||
|
||||
fun tryClaimChunk(player: Player, chunk: Chunk) {
|
||||
val type = chunk.type()
|
||||
if (type == ChunkType.SYSTEM) {
|
||||
player.sendLang("claim_system")
|
||||
return
|
||||
}
|
||||
if (type == ChunkType.CLAIMED) {
|
||||
player.sendLang("chunk_already_claimed", loaderMap[chunk]!!.owner.name!!)
|
||||
return
|
||||
}
|
||||
|
||||
val remain = calculateRemainClaims(player)
|
||||
if (remain <= 0) {
|
||||
return player.sendLang("chunk_claim_reach_max")
|
||||
}
|
||||
|
||||
val loader = ChunkLoader(player, chunk)
|
||||
registerChunkLoader(loader)
|
||||
player.sendLang(
|
||||
"chunk_claim_success",
|
||||
"${chunk.x}, ${chunk.z}",
|
||||
calculateUsedClaims(player),
|
||||
ClaimProviderManager.calculateTotalClaims(player)
|
||||
)
|
||||
}
|
||||
|
||||
fun tryDisclaimChunk(player: Player, chunk: Chunk) {
|
||||
if (chunk.type() != ChunkType.CLAIMED) return player.sendLang("chunk_disclaim_system")
|
||||
|
||||
val loader = loaderMap[chunk]!!
|
||||
if (loader.owner != player) {
|
||||
if (player.isOp || player.hasPermission("chunk_loader.disclaim_force")) return player.sendLang("chunk_disclaim_others")
|
||||
}
|
||||
}
|
||||
|
||||
fun calculateRemainClaims(player: Player): Int {
|
||||
val maxPermCount = ClaimProviderManager.calculateTotalClaims(player)
|
||||
val used = calculateUsedClaims(player)
|
||||
|
||||
if (used >= maxPermCount) return 0
|
||||
|
||||
return maxPermCount - used
|
||||
}
|
||||
|
||||
fun calculateUsedClaims(player: Player) =
|
||||
loaderMap.filter { (_, loader) -> loader.owner.uniqueId == player.uniqueId }.size
|
||||
|
||||
fun Chunk.type(): ChunkType {
|
||||
if (loaderMap.containsKey(this)) return ChunkType.CLAIMED
|
||||
if (isForceLoaded) return ChunkType.SYSTEM
|
||||
return if (this.isLoaded) ChunkType.NON_CLAIM else ChunkType.UNLOAD
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package cc.maxmc.chunkloader.misc
|
||||
|
||||
enum class ChunkType(val id: String) {
|
||||
SYSTEM("system"),
|
||||
CLAIMED("claimed"),
|
||||
NON_CLAIM("non_claim"),
|
||||
UNLOAD("unload")
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package cc.maxmc.chunkloader.provider
|
||||
|
||||
import cc.maxmc.chunkloader.provider.impl.PermissionProvider
|
||||
import cc.maxmc.chunkloader.provider.impl.PlayerUnlockProvider
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
object ClaimProviderManager {
|
||||
private val providers = ArrayList<IClaimProvider>()
|
||||
|
||||
init {
|
||||
providers.add(PermissionProvider)
|
||||
providers.add(PlayerUnlockProvider)
|
||||
}
|
||||
|
||||
fun calculateTotalClaims(player: Player) = providers.sumOf { it.maxClaim(player) }
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package cc.maxmc.chunkloader.provider
|
||||
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
interface IClaimProvider {
|
||||
fun maxClaim(player: Player): Int
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package cc.maxmc.chunkloader.provider.impl
|
||||
|
||||
import cc.maxmc.chunkloader.provider.IClaimProvider
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
object PermissionProvider : IClaimProvider {
|
||||
|
||||
override fun maxClaim(player: Player) =
|
||||
player.effectivePermissions
|
||||
.map { it.permission }
|
||||
.filter { it.startsWith("chunk_loader.max.") }
|
||||
.maxOfOrNull { it.split("chunk_loader.max.")[1].toInt() } ?: 0
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package cc.maxmc.chunkloader.provider.impl
|
||||
|
||||
import cc.maxmc.chunkloader.provider.IClaimProvider
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
import taboolib.platform.BukkitPlugin
|
||||
|
||||
object PlayerUnlockProvider : IClaimProvider {
|
||||
override fun maxClaim(player: Player) = player.persistentDataContainer
|
||||
.getOrDefault(NamespacedKey(BukkitPlugin.getInstance(), "provided"), PersistentDataType.INTEGER, 0)
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
chunk_system: "§c| §7该区块为系统强制加载区块, 无法认领."
|
||||
chunk_already_claimed: "§a| §7该区块已被玩家 §a{0} §7认领."
|
||||
chunk_claim_success: "§a| §7成功加载位于 §a{0} 的区块 (§6{1}/{2}§7)."
|
||||
chunk_claim_reach_max: "§e| §7您加载的区块达到上限."
|
||||
chunk_disclaim_system: "§c| §7该区块未被认领或为默认强加载区块,您无法取消加载."
|
||||
chunk_disclaim_others: "§c| §7该区块为 §c{0} 所加载, 您无法取消加载"
|
||||
Loading…
Reference in New Issue