MEME ME :heart

FUCK PUTTYEXE
This commit is contained in:
disclearing 2019-06-19 04:50:21 +01:00
parent afcea7ad52
commit 4f52c57848
3670 changed files with 229387 additions and 0 deletions

29
.idea/compiler.xml Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="core" />
<module name="api" />
<module name="server" />
<module name="hub" />
<module name="practice" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="api" target="1.8" />
<module name="core" target="1.8" />
<module name="hub" target="1.5" />
<module name="ivory" target="1.8" />
<module name="ivory-api" target="1.8" />
<module name="ivory-parent" target="1.5" />
<module name="pparent" target="1.5" />
<module name="practice" target="1.5" />
<module name="server" target="1.8" />
<module name="toothless" target="1.5" />
</bytecodeTargetLevel>
</component>
</project>

13
.idea/encodings.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM">
<file url="file://$PROJECT_DIR$/core" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/hub" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ivory" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ivory/Ivory-API" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ivory/Ivory-Server" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/practice" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/toothless/api" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/toothless/server" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.google.code.gson:gson:2.2.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.2.4/gson-2.2.4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.google.guava:guava:17.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/17.0/guava-17.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/17.0/guava-17.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/guava/guava/17.0/guava-17.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.googlecode.json-simple:json-simple:1.1.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.moshi:moshi:1.5.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/moshi/moshi/1.5.0/moshi-1.5.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/moshi/moshi/1.5.0/moshi-1.5.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/moshi/moshi/1.5.0/moshi-1.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.okhttp3:logging-interceptor:3.13.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/logging-interceptor/3.13.1/logging-interceptor-3.13.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/logging-interceptor/3.13.1/logging-interceptor-3.13.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/logging-interceptor/3.13.1/logging-interceptor-3.13.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.okhttp3:okhttp:3.13.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/okhttp/3.13.1/okhttp-3.13.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/okhttp/3.13.1/okhttp-3.13.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okhttp3/okhttp/3.13.1/okhttp-3.13.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.okio:okio:1.17.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okio/okio/1.17.2/okio-1.17.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/okio/okio/1.17.2/okio-1.17.2-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.retrofit2:converter-moshi:2.5.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.squareup.retrofit2:retrofit:2.5.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/retrofit/2.5.0/retrofit-2.5.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/retrofit/2.5.0/retrofit-2.5.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/squareup/retrofit2/retrofit/2.5.0/retrofit-2.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: commons-lang:commons-lang:2.6">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: javax.persistence:persistence-api:1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/javax/persistence/persistence-api/1.0/persistence-api-1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/javax/persistence/persistence-api/1.0/persistence-api-1.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: jline:jline:2.12">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/jline/jline/2.12/jline-2.12.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/jline/jline/2.12/jline-2.12-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/jline/jline/2.12/jline-2.12-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: junit:junit:4.10">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.10/junit-4.10.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.10/junit-4.10-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.10/junit-4.10-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: junit:junit:4.11">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.11/junit-4.11-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: junit:junit:4.12">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: me.lucko.luckperms:luckperms-api:4.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/me/lucko/luckperms/luckperms-api/4.3/luckperms-api-4.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/me/lucko/luckperms/luckperms-api/4.3/luckperms-api-4.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/me/lucko/luckperms/luckperms-api/4.3/luckperms-api-4.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: mysql:mysql-connector-java:5.1.14">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/5.1.14/mysql-connector-java-5.1.14.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/5.1.14/mysql-connector-java-5.1.14-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/5.1.14/mysql-connector-java-5.1.14-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.jafama:jafama:2.1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/jafama/jafama/2.1.0/jafama-2.1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/jafama/jafama/2.1.0/jafama-2.1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/jafama/jafama/2.1.0/jafama-2.1.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.md-5:bungeecord-chat:1.8-SNAPSHOT">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.8-SNAPSHOT/bungeecord-chat-1.8-SNAPSHOT.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.8-SNAPSHOT/bungeecord-chat-1.8-SNAPSHOT-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/md-5/bungeecord-chat/1.8-SNAPSHOT/bungeecord-chat-1.8-SNAPSHOT-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.sf.jopt-simple:jopt-simple:3.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/jopt-simple/jopt-simple/3.2/jopt-simple-3.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/jopt-simple/jopt-simple/3.2/jopt-simple-3.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/jopt-simple/jopt-simple/3.2/jopt-simple-3.2-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.sf.trove4j:trove4j:3.0.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.commons:commons-lang3:3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.commons:commons-pool2:2.4.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.3/commons-pool2-2.4.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.3/commons-pool2-2.4.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.3/commons-pool2-2.4.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.avaje:ebean:2.8.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/avaje/ebean/2.8.1/ebean-2.8.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/avaje/ebean/2.8.1/ebean-2.8.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/avaje/ebean/2.8.1/ebean-2.8.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.hamcrest:hamcrest-core:1.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.hamcrest:hamcrest-core:1.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.hamcrest:hamcrest-library:1.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.influxdb:influxdb-java:2.15">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/influxdb/influxdb-java/2.15/influxdb-java-2.15.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/influxdb/influxdb-java/2.15/influxdb-java-2.15-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/influxdb/influxdb-java/2.15/influxdb-java-2.15-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.mongodb:bson:3.10.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/bson/3.10.0/bson-3.10.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/bson/3.10.0/bson-3.10.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/bson/3.10.0/bson-3.10.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.mongodb:mongodb-driver-core:3.10.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-core/3.10.0/mongodb-driver-core-3.10.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-core/3.10.0/mongodb-driver-core-3.10.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-core/3.10.0/mongodb-driver-core-3.10.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.mongodb:mongodb-driver-sync:3.10.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-sync/3.10.0/mongodb-driver-sync-3.10.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-sync/3.10.0/mongodb-driver-sync-3.10.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongodb-driver-sync/3.10.0/mongodb-driver-sync-3.10.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.msgpack:msgpack-core:0.8.16">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/msgpack/msgpack-core/0.8.16/msgpack-core-0.8.16.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/msgpack/msgpack-core/0.8.16/msgpack-core-0.8.16-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/msgpack/msgpack-core/0.8.16/msgpack-core-0.8.16-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.projectlombok:lombok:1.18.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.4/lombok-1.18.4.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.4/lombok-1.18.4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.4/lombok-1.18.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.slf4j:slf4j-api:1.7.22">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.22/slf4j-api-1.7.22.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.22/slf4j-api-1.7.22-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.22/slf4j-api-1.7.22-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.spigotmc:minecraft-server:1.8.8-SNAPSHOT">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/minecraft-server/1.8.8-SNAPSHOT/minecraft-server-1.8.8-SNAPSHOT.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/minecraft-server/1.8.8-SNAPSHOT/minecraft-server-1.8.8-SNAPSHOT-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/spigotmc/minecraft-server/1.8.8-SNAPSHOT/minecraft-server-1.8.8-SNAPSHOT-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.xerial:sqlite-jdbc:3.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.7.2/sqlite-jdbc-3.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.7.2/sqlite-jdbc-3.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.7.2/sqlite-jdbc-3.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.yaml:snakeyaml:1.15">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.15/snakeyaml-1.15.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.15/snakeyaml-1.15-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.15/snakeyaml-1.15-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: redis.clients:jedis:3.0.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/3.0.1/jedis-3.0.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/3.0.1/jedis-3.0.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/3.0.1/jedis-3.0.1-sources.jar!/" />
</SOURCES>
</library>
</component>

23
.idea/misc.xml Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="1">
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
</list>
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
<option name="ignoredFiles">
<set>
<option value="$PROJECT_DIR$/ivory/pom.xml" />
</set>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/classes" />
</component>
</project>

14
.idea/modules.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/toothless/api/api.iml" filepath="$PROJECT_DIR$/toothless/api/api.iml" />
<module fileurl="file://$PROJECT_DIR$/core/core.iml" filepath="$PROJECT_DIR$/core/core.iml" />
<module fileurl="file://$PROJECT_DIR$/hub/hub.iml" filepath="$PROJECT_DIR$/hub/hub.iml" />
<module fileurl="file://$PROJECT_DIR$/pparent.iml" filepath="$PROJECT_DIR$/pparent.iml" />
<module fileurl="file://$PROJECT_DIR$/practice/practice.iml" filepath="$PROJECT_DIR$/practice/practice.iml" />
<module fileurl="file://$PROJECT_DIR$/toothless/server/server.iml" filepath="$PROJECT_DIR$/toothless/server/server.iml" />
<module fileurl="file://$PROJECT_DIR$/toothless/toothless.iml" filepath="$PROJECT_DIR$/toothless/toothless.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

824
.idea/workspace.xml Normal file
View File

@ -0,0 +1,824 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="29242455-cd44-407f-a2b3-7a1145c9506c" name="Default Changelist" comment="" />
<ignored path="$PROJECT_DIR$/pHub/target/" />
<ignored path="$PROJECT_DIR$/pcore/target/" />
<ignored path="$PROJECT_DIR$/target/" />
<ignored path="$PROJECT_DIR$/ivory/Ivory-API/target/" />
<ignored path="$PROJECT_DIR$/ppractice/target/" />
<ignored path="$PROJECT_DIR$/ivory/target/" />
<ignored path="$PROJECT_DIR$/ivory/Ivory-Server/target/" />
<ignored path="$PROJECT_DIR$/practice/target/" />
<ignored path="$PROJECT_DIR$/hub/target/" />
<ignored path="$PROJECT_DIR$/toothless/target/" />
<ignored path="$PROJECT_DIR$/toothless/api/target/" />
<ignored path="$PROJECT_DIR$/toothless/server/target/" />
<ignored path="$PROJECT_DIR$/core/target/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/src/main/resources/config.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="18" column="29" selection-start-line="18" selection-start-column="29" selection-end-line="18" selection-end-column="29" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/src/main/resources/plugin.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="425">
<caret line="25" column="21" selection-start-line="25" selection-start-column="21" selection-end-line="25" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/toothless/api/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="19" column="57" selection-start-line="19" selection-start-column="57" selection-end-line="19" selection-end-column="57" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/hub/src/main/java/cc/patrone/hub/Hub.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="10" column="19" selection-start-line="10" selection-start-column="19" selection-end-line="10" selection-end-column="19" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/toothless/pom.xml">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/toothless/server/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="37" selection-start-line="14" selection-start-column="37" selection-end-line="14" selection-end-column="37" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/GameModeCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="9" column="41" selection-start-line="9" selection-start-column="41" selection-end-line="9" selection-end-column="41" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/BroadcastCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="13" column="42" selection-start-line="13" selection-start-column="42" selection-end-line="13" selection-end-column="42" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/FreezeCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="425">
<caret line="35" column="124" selection-start-line="35" selection-start-column="124" selection-end-line="35" selection-end-column="124" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>ping</find>
<find>Potion</find>
<find>vel</find>
<find>patrone</find>
<find>apache</find>
<find>chatForm</find>
</findStrings>
<dirStrings>
<dir>C:\Users\ps-de\git\pparent\ppractice</dir>
<dir>C:\Users\ps-de\git\pparent\core\src\main\java\zone\potion</dir>
</dirStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/core/src/main/resources/plugin.yml" />
<option value="$PROJECT_DIR$/toothless/pom.xml" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/utils/message/CC.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/utils/structure/Cuboid.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/utils/player/PlayerUtil.java" />
<option value="$PROJECT_DIR$/core/src/main/resources/config.yml" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/task/BroadcastTask.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/task/AFKTask.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/storage/database/MongoStorage.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/server/ServerSettings.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/redis/RedisMessenger.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/managers/PlayerManager.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/managers/ProfileManager.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/player/CoreProfile.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/managers/StaffManager.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/PlayerListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/MessageListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/InventoryListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/HelpCommandListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/DispatchCommandListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/ChatListener.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/BaseCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/PlayerCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ReportCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ReplyCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/PingCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/MessageCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/IgnoreCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/HelpOpCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/DispatchCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ClearChatCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleSoundsCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleMessagesCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleGlobalChat.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleCrossChat.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/VanishCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/TeleportCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/StaffChatCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/SlowChatCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/task/ShutdownTask.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/ShutdownCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/ReloadKBCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/GameModeCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/BroadcastCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/PunishType.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/FreezeCommand.java" />
<option value="$PROJECT_DIR$/core/src/main/java/zone/potion/CorePlugin.java" />
<option value="$PROJECT_DIR$/core/pom.xml" />
<option value="$PROJECT_DIR$/toothless/server/pom.xml" />
<option value="$PROJECT_DIR$/toothless/api/pom.xml" />
</list>
</option>
</component>
<component name="MavenImportPreferences">
<option name="importingSettings">
<MavenImportingSettings>
<option name="importAutomatically" value="true" />
</MavenImportingSettings>
</option>
</component>
<component name="MavenProjectNavigator">
<treeState>
<expand>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="api" type="9519ce18:MavenProjectsStructure$ProjectNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="api" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="core" type="9519ce18:MavenProjectsStructure$ProjectNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="core" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="pPractice" type="9519ce18:MavenProjectsStructure$ProjectNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="pPractice" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="toothless" type="9519ce18:MavenProjectsStructure$ProjectNode" />
</path>
<path>
<item name="" type="16c1761:MavenProjectsStructure$RootNode" />
<item name="toothless" type="9519ce18:MavenProjectsStructure$ProjectNode" />
<item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
</path>
</expand>
<select />
</treeState>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="-8" />
<option name="y" value="-8" />
<option name="width" value="1936" />
<option name="height" value="1056" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="PackagesPane" />
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="core" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="java" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="hub" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="main" type="462c0819:PsiDirectoryNode" />
<item name="resources" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="practice" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="toothless" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="toothless" type="462c0819:PsiDirectoryNode" />
<item name="api" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="toothless" type="462c0819:PsiDirectoryNode" />
<item name="api" type="462c0819:PsiDirectoryNode" />
<item name="target" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="toothless" type="462c0819:PsiDirectoryNode" />
<item name="server" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="pparent" type="b2602c69:ProjectViewProjectNode" />
<item name="pparent" type="462c0819:PsiDirectoryNode" />
<item name="toothless" type="462c0819:PsiDirectoryNode" />
<item name="server" type="462c0819:PsiDirectoryNode" />
<item name="target" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
</panes>
</component>
<component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1555777590419" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="29242455-cd44-407f-a2b3-7a1145c9506c" name="Default Changelist" comment="" />
<created>1553551552136</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1553551552136</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<layout>
<window_info id="Designer" order="0" />
<window_info id="UI Designer" order="1" />
<window_info id="Capture Tool" order="2" />
<window_info id="Favorites" order="3" side_tool="true" />
<window_info id="Image Layers" order="4" />
<window_info active="true" content_ui="combo" id="Project" order="5" visible="true" weight="0.31556502" />
<window_info id="Structure" order="6" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Terminal" order="0" visible="true" weight="0.2936078" />
<window_info anchor="bottom" id="Event Log" order="1" side_tool="true" />
<window_info anchor="bottom" id="Version Control" order="2" />
<window_info anchor="bottom" id="Message" order="3" />
<window_info anchor="bottom" id="Find" order="4" weight="0.32936078" />
<window_info anchor="bottom" id="Run" order="5" />
<window_info anchor="bottom" id="Debug" order="6" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="7" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="8" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="9" />
<window_info anchor="right" id="Theme Preview" order="0" />
<window_info anchor="right" id="Capture Analysis" order="1" />
<window_info anchor="right" id="Palette&#9;" order="2" />
<window_info anchor="right" id="Maven" order="3" visible="true" weight="0.32995737" />
<window_info anchor="right" id="Palette" order="4" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="5" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="6" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="7" weight="0.25" />
</layout>
</component>
<component name="antWorkspaceConfiguration">
<option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/ChatListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="27" column="22" lean-forward="true" selection-start-line="27" selection-start-column="22" selection-end-line="27" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/DispatchCommandListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="25" column="84" lean-forward="true" selection-start-line="25" selection-start-column="84" selection-end-line="25" selection-end-column="84" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/FreezeListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/event/BanEvent.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="13" column="13" selection-start-line="13" selection-start-column="13" selection-end-line="13" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/event/server/ServerShutdownScheduleEvent.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/event/server/ServerShutdownCancelEvent.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="5" column="13" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/callback/WebCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" column="17" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/callback/DocumentCallback.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="4" column="17" selection-start-line="4" selection-start-column="17" selection-end-line="4" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/BaseCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="434">
<caret line="61" selection-start-line="61" selection-end-line="61" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/PlayerCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="12" column="33" selection-start-line="12" selection-start-column="33" selection-end-line="12" selection-end-column="33" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ReplyCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="383">
<caret line="39" column="72" selection-start-line="39" selection-start-column="72" selection-end-line="39" selection-end-column="72" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ReportCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="57" column="19" selection-start-line="57" selection-start-column="19" selection-end-line="57" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/PingCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="17" column="31" lean-forward="true" selection-start-line="17" selection-start-column="31" selection-end-line="17" selection-end-column="31" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ListCommand.java" />
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/MessageCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="408">
<caret line="46" column="19" lean-forward="true" selection-start-line="46" selection-start-column="19" selection-end-line="46" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/IgnoreCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="272">
<caret line="21" column="30" lean-forward="true" selection-start-line="21" selection-start-column="30" selection-end-line="21" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/HelpOpCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="315">
<caret line="37" column="57" lean-forward="true" selection-start-line="37" selection-start-column="57" selection-end-line="37" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/DispatchCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="40" selection-start-line="6" selection-start-column="40" selection-end-line="6" selection-end-column="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/ClearChatCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="391">
<caret line="26" column="17" selection-start-line="26" selection-start-column="17" selection-end-line="26" selection-end-column="17" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleSoundsCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="17" column="13" lean-forward="true" selection-start-line="17" selection-start-column="13" selection-end-line="17" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleMessagesCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="19" column="76" lean-forward="true" selection-start-line="19" selection-start-column="76" selection-end-line="19" selection-end-column="76" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleGlobalChat.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="19" column="74" selection-start-line="19" selection-start-column="74" selection-end-line="19" selection-end-column="74" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/toggle/ToggleCrossChat.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="18" column="55" lean-forward="true" selection-start-line="18" selection-start-column="55" selection-end-line="18" selection-end-column="55" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/VanishCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="374">
<caret line="22" lean-forward="true" selection-start-line="22" selection-end-line="22" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/TeleportCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="38" selection-start-line="5" selection-start-column="38" selection-end-line="5" selection-end-column="38" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/StaffJoinListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="16" column="39" selection-start-line="16" selection-start-column="39" selection-end-line="16" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/managers/PlayerManager.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="77">
<caret line="22" column="5" selection-start-line="22" selection-start-column="5" selection-end-line="22" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/managers/ProfileManager.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="391">
<caret line="32" column="5" selection-start-line="32" selection-start-column="5" selection-end-line="32" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/managers/StaffManager.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="99">
<caret line="47" column="16" selection-start-line="47" selection-start-column="16" selection-end-line="47" selection-end-column="16" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/player/CoreProfile.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="644">
<caret line="178" column="5" selection-start-line="178" selection-start-column="5" selection-end-line="178" selection-end-column="5" />
<folding>
<element signature="imports" expanded="true" />
<element signature="e#3904#3905#0" expanded="true" />
<element signature="e#3942#3943#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/listeners/redis/StaffChatListener.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="272">
<caret line="21" column="36" selection-start-line="21" selection-start-column="36" selection-end-line="21" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/StaffChatCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="315">
<caret line="46" column="95" lean-forward="true" selection-start-line="46" selection-start-column="95" selection-end-line="46" selection-end-column="95" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/SlowChatCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="52" column="20" lean-forward="true" selection-start-line="52" selection-start-column="20" selection-end-line="52" selection-end-column="20" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/task/ShutdownTask.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="196">
<caret line="17" column="47" selection-start-line="17" selection-start-column="47" selection-end-line="17" selection-end-column="47" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/ShutdownCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="425">
<caret line="52" column="70" selection-start-line="52" selection-start-column="70" selection-end-line="52" selection-end-column="70" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/RankCommand.java" />
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/MuteChatCommand.java" />
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/ReloadKBCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="15" column="5" selection-start-line="15" selection-start-column="5" selection-end-line="15" selection-end-column="5" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/PunishCommand.java" />
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/PunishType.java" />
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/CorePlugin.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="476">
<caret line="67" column="72" selection-start-line="67" selection-start-column="72" selection-end-line="67" selection-end-column="72" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/resources/config.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="18" column="29" selection-start-line="18" selection-start-column="29" selection-end-line="18" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/resources/plugin.yml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="4" selection-start-line="4" selection-end-line="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="425">
<caret line="25" column="21" selection-start-line="25" selection-start-column="21" selection-end-line="25" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/toothless/pom.xml">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/toothless/server/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="37" selection-start-line="14" selection-start-column="37" selection-end-line="14" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/GameModeCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="9" column="41" selection-start-line="9" selection-start-column="41" selection-end-line="9" selection-end-column="41" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/BroadcastCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="13" column="42" selection-start-line="13" selection-start-column="42" selection-end-line="13" selection-end-column="42" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core/src/main/java/zone/potion/commands/impl/staff/punish/FreezeCommand.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="425">
<caret line="35" column="124" selection-start-line="35" selection-start-column="124" selection-end-line="35" selection-end-column="124" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/toothless/api/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="19" column="57" selection-start-line="19" selection-start-column="57" selection-end-line="19" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/hub/src/main/java/cc/patrone/hub/Hub.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="10" column="19" selection-start-line="10" selection-start-column="19" selection-end-line="10" selection-end-column="19" />
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ProjectJDKs.UI">
<settings>
<last-edited>1.8</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

3
core/README.md Normal file
View File

@ -0,0 +1,3 @@
# pCore
Core plugin for Patrone.

56
core/core.iml Normal file
View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
<excludeFolder url="file://$MODULE_DIR$/../pcore/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="server" />
<orderEntry type="library" name="Maven: net.sf.trove4j:trove4j:3.0.3" level="project" />
<orderEntry type="module" module-name="api" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:17.0" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.2.4" level="project" />
<orderEntry type="library" name="Maven: org.avaje:ebean:2.8.1" level="project" />
<orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.15" level="project" />
<orderEntry type="library" name="Maven: net.md-5:bungeecord-chat:1.8-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.spigotmc:minecraft-server:1.8.8-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: net.sf.jopt-simple:jopt-simple:3.2" level="project" />
<orderEntry type="library" name="Maven: jline:jline:2.12" level="project" />
<orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.7.2" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.14" level="project" />
<orderEntry type="library" name="Maven: net.jafama:jafama:2.1.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.9" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:mongodb-driver-sync:3.10.0" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:bson:3.10.0" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:mongodb-driver-core:3.10.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.4" level="project" />
<orderEntry type="library" name="Maven: org.influxdb:influxdb-java:2.15" level="project" />
<orderEntry type="library" name="Maven: com.squareup.retrofit2:retrofit:2.5.0" level="project" />
<orderEntry type="library" name="Maven: com.squareup.retrofit2:converter-moshi:2.5.0" level="project" />
<orderEntry type="library" name="Maven: com.squareup.moshi:moshi:1.5.0" level="project" />
<orderEntry type="library" name="Maven: org.msgpack:msgpack-core:0.8.16" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.13.1" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:logging-interceptor:3.13.1" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:3.0.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.22" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.4.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: me.lucko.luckperms:luckperms-api:4.3" level="project" />
</component>
</module>

105
core/pom.xml Normal file
View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>zone.potion</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>core</artifactId>
<version>1.0.0</version>
<name>core</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>zone.potion</groupId>
<artifactId>server</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>3.10.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.lucko.luckperms</groupId>
<artifactId>luckperms-api</artifactId>
<version>4.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>clean package</defaultGoal>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>false</shadedArtifactAttached>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,191 @@
package zone.potion;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.Getter;
import me.lucko.luckperms.api.LuckPermsApi;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandMap;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.commands.impl.*;
import zone.potion.commands.impl.staff.*;
import zone.potion.commands.impl.staff.punish.*;
import zone.potion.commands.impl.toggle.ToggleCrossChat;
import zone.potion.commands.impl.toggle.ToggleGlobalChat;
import zone.potion.commands.impl.toggle.ToggleMessagesCommand;
import zone.potion.commands.impl.toggle.ToggleSoundsCommand;
import zone.potion.listeners.HelpCommandListener;
import zone.potion.listeners.InventoryListener;
import zone.potion.listeners.MessageListener;
import zone.potion.listeners.PlayerListener;
import zone.potion.listeners.redis.*;
import zone.potion.managers.MenuManager;
import zone.potion.managers.PlayerManager;
import zone.potion.managers.ProfileManager;
import zone.potion.managers.StaffManager;
import zone.potion.redis.RedisMessenger;
import zone.potion.server.ServerSettings;
import zone.potion.server.filter.Filter;
import zone.potion.storage.database.MongoStorage;
import zone.potion.task.AFKTask;
import zone.potion.task.BroadcastTask;
import zone.potion.utils.message.CC;
import zone.potion.utils.structure.Cuboid;
import java.lang.reflect.Field;
import java.util.Arrays;
@Getter
public class CorePlugin extends JavaPlugin {
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
@Getter
private static CorePlugin instance;
@Getter
private static boolean isServerEnabled = false;
private ServerSettings serverSettings;
private Filter filter;
private MongoStorage mongoStorage;
private ProfileManager profileManager;
private StaffManager staffManager;
private PlayerManager playerManager;
private MenuManager menuManager;
private RedisMessenger redisMessenger;
private BroadcastTask broadcastTask;
private LuckPermsApi luckPermsApi;
private static void registerSerializableClass(Class<?> clazz) {
if (ConfigurationSerializable.class.isAssignableFrom(clazz)) {
Class<? extends ConfigurationSerializable> serializable = clazz.asSubclass(ConfigurationSerializable.class);
ConfigurationSerialization.registerClass(serializable);
}
}
@Override
public void onEnable() {
instance = this;
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
saveDefaultConfig();
registerSerializableClass(Cuboid.class);
RegisteredServiceProvider<LuckPermsApi> provider = Bukkit.getServicesManager().getRegistration(LuckPermsApi.class);
if (provider != null) {
LuckPermsApi api = provider.getProvider();
this.luckPermsApi = api;
}
serverSettings = new ServerSettings(this);
filter = new Filter();
redisMessenger = new RedisMessenger(
this,
getConfig().getString("redis.host"),
getConfig().getInt("redis.port"),
getConfig().getInt("redis.timeout"),
getConfig().getString("redis.password")
);
redisMessenger.registerListeners(
new StaffChatListener(this),
new StaffJoinListener(this),
new ChatListener(this),
new HelpopListener(this),
new ReportListener(this),
new DispatchCommandListener(this),
new FreezeListener(this)
);
redisMessenger.initialize();
mongoStorage = new MongoStorage();
profileManager = new ProfileManager();
staffManager = new StaffManager(this);
playerManager = new PlayerManager();
menuManager = new MenuManager(this);
registerCommands(
new BroadcastCommand(this),
new ClearChatCommand(this),
new IgnoreCommand(this),
new MessageCommand(this),
new ReloadKBCommand(this),
new ReplyCommand(this),
new StaffChatCommand(this),
new TeleportCommand(this),
new ToggleMessagesCommand(this),
new ToggleGlobalChat(this),
new ToggleSoundsCommand(this),
new ToggleCrossChat(this),
new VanishCommand(this),
new ReportCommand(this),
new HelpOpCommand(this),
new PingCommand(),
new SlowChatCommand(this),
new GameModeCommand(),
new DispatchCommand(this),
new FreezeCommand(this),
new ShutdownCommand(this)
);
registerListeners(
new PlayerListener(this),
new MessageListener(this),
new InventoryListener(this),
new HelpCommandListener(this)
);
int broadcastTime = getConfig().getInt("broadcasts.delay");
if (getConfig().getBoolean("broadcasts.enabled")) {
this.broadcastTask = new BroadcastTask(this);
broadcastTask.runTaskTimerAsynchronously(this, broadcastTime * 20L, broadcastTime * 20L);
}
getServer().getScheduler().runTaskTimer(this, new AFKTask(this), 0, 20 * 60);
getServer().getScheduler().runTaskLater(this, () -> isServerEnabled = true, 20L);
}
public String getServerName() {
return getConfig().getString("server-name");
}
@Override
public void onDisable() {
profileManager.saveProfiles();
serverSettings.saveConfig();
for (Player player : getServer().getOnlinePlayers()) {
player.kickPlayer(CC.RED + "The server is restarting.");
}
}
private void registerCommands(BaseCommand... commands) {
try {
final Field bukkitCommandMap = getServer().getClass().getDeclaredField("commandMap");
bukkitCommandMap.setAccessible(true);
CommandMap commandMap = (CommandMap) bukkitCommandMap.get(getServer());
Arrays.stream(commands).forEach(command -> {
commandMap.register(getName(), command);
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,7 @@
package zone.potion.callback;
import org.bson.Document;
public interface DocumentCallback {
void call(Document document, boolean found);
}

View File

@ -0,0 +1,5 @@
package zone.potion.callback;
public interface WebCallback {
void callback(String response);
}

View File

@ -0,0 +1,67 @@
package zone.potion.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.utils.message.CC;
import java.util.Arrays;
import java.util.Collections;
public abstract class BaseCommand extends Command {
private static final String LINE_SEPARATOR = System.lineSeparator();
private final String permission;
protected BaseCommand(String name, String permission) {
super(name);
this.permission = permission;
}
protected BaseCommand(String name) {
this(name, "spike.player");
}
@Override
public final boolean execute(CommandSender sender, String alias, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if(!player.hasPermission(permission)){
player.sendMessage(CC.color("&cYou do not have sufficient permissions to do this."));
return false;
}
}
execute(sender, args);
return true;
}
protected final void setAliases(String... aliases) {
if (aliases.length > 0) {
setAliases(aliases.length == 1 ? Collections.singletonList(aliases[0]) : Arrays.asList(aliases));
}
}
protected final void setUsage(String... uses) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < uses.length; i++) {
String use = uses[i];
builder.append(use);
if (i + 1 != uses.length) {
builder.append(LINE_SEPARATOR);
}
}
setUsage(builder.toString());
}
protected abstract void execute(CommandSender sender, String[] args);
public String getUsageMessage(){
return CC.color("&cInvalid usage: " + getUsage());
}
}

View File

@ -0,0 +1,26 @@
package zone.potion.commands;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.utils.message.CC;
public abstract class PlayerCommand extends BaseCommand {
protected PlayerCommand(String name, String permission) {
super(name, permission);
}
protected PlayerCommand(String name) {
super(name, "spike.player");
}
@Override
protected final void execute(CommandSender sender, String[] args) {
if (sender instanceof Player) {
execute((Player) sender, args);
} else {
sender.sendMessage(CC.RED + "Only players can perform this command.");
}
}
public abstract void execute(Player player, String[] args);
}

View File

@ -0,0 +1,35 @@
package zone.potion.commands.impl;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
import java.util.Collections;
public class ClearChatCommand extends BaseCommand {
private static final String BLANK_MESSAGE = String.join("", Collections.nCopies(150, "§8 §8 §1 §3 §3 §7 §8 §r\n"));
private final CorePlugin plugin;
public ClearChatCommand(CorePlugin plugin) {
super("clearchat", "spike.staff");
this.plugin = plugin;
setAliases("cc");
}
@Override
protected void execute(CommandSender sender, String[] args) {
for (Player player : plugin.getServer().getOnlinePlayers()) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (!profile.hasStaff()) {
player.sendMessage(BLANK_MESSAGE);
}
}
plugin.getServer().broadcastMessage(CC.GREEN + "The chat was cleared by " + sender.getName() + ".");
sender.sendMessage(CC.YELLOW + "Don't worry, staff can still see cleared messages.");
}
}

View File

@ -0,0 +1,40 @@
package zone.potion.commands.impl;
import com.google.common.collect.Maps;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.utils.StringUtil;
import java.util.Map;
public class DispatchCommand extends BaseCommand {
private CorePlugin plugin;
public DispatchCommand(CorePlugin plugin) {
super("dispatch", "spike.super");
setUsage("/dispatch <dispatched command>");
this.plugin = plugin;
}
@Override
protected void execute(CommandSender sender, String[] args) {
if (args.length < 1) {
sender.sendMessage(getUsage());
return;
}
String dispatchedCommand = StringUtil.buildString(args, 0);
Map<String, Object> map = Maps.newHashMap();
map.put("server", plugin.getServerName());
map.put("command", dispatchedCommand);
map.put("sender", sender.getName());
plugin.getRedisMessenger().send("dispatch-command", map);
sender.sendMessage(ChatColor.RED + "Command dispatched.");
}
}

View File

@ -0,0 +1,48 @@
package zone.potion.commands.impl;
import com.google.common.collect.Maps;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
import zone.potion.utils.timer.Timer;
import java.util.Map;
public class HelpOpCommand extends PlayerCommand {
private final CorePlugin plugin;
public HelpOpCommand(CorePlugin plugin) {
super("helpop");
this.plugin = plugin;
setUsage(CC.RED + "/helpop <help message>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 1) {
player.sendMessage(usageMessage);
return;
}
CoreProfile profile = plugin.getProfileManager().getProfile(player);
Timer cooldownTimer = profile.getReportCooldownTimer();
if (cooldownTimer.isActive()) {
player.sendMessage(CC.RED + "You can't request assistance for another " + cooldownTimer.formattedExpiration() + ".");
return;
}
String request = StringUtil.buildString(args, 0);
Map<String, Object> requestMap = Maps.newHashMap();
requestMap.put("server", plugin.getServerName());
requestMap.put("player", player.getName());
requestMap.put("request", request);
plugin.getRedisMessenger().send("help-op", requestMap);
player.sendMessage(CC.GREEN + "Request sent: " + CC.R + request);
}
}

View File

@ -0,0 +1,57 @@
package zone.potion.commands.impl;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
public class IgnoreCommand extends PlayerCommand {
private final CorePlugin plugin;
public IgnoreCommand(CorePlugin plugin) {
super("ignore");
this.plugin = plugin;
setAliases("unignore");
setUsage(CC.RED + "Usage: /ignore <player>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 1) {
player.sendMessage(usageMessage);
return;
}
Player target = plugin.getServer().getPlayer(args[0]);
if (target == null) {
player.sendMessage(Messages.PLAYER_NOT_FOUND);
return;
}
if (target.getName().equals(player.getName())) {
player.sendMessage(CC.RED + "You can't ignore yourself!");
return;
}
CoreProfile targetProfile = plugin.getProfileManager().getProfile(target);
if (targetProfile.hasStaff()) {
player.sendMessage(CC.RED + "You can't ignore a staff member. If this staff member is harrassing you " +
"or engaging in other abusive manners, please report this or contact a higher staff member.");
return;
}
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.hasPlayerIgnored(target.getUniqueId())) {
profile.unignore(target.getUniqueId());
player.sendMessage(CC.GREEN + "No longer ignoring " + target.getName() + ".");
} else {
profile.ignore(target.getUniqueId());
player.sendMessage(CC.GREEN + "Now ignoring " + target.getName() + ".");
}
}
}

View File

@ -0,0 +1,52 @@
package zone.potion.commands.impl;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.event.player.PlayerMessageEvent;
import zone.potion.player.CoreProfile;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
public class MessageCommand extends PlayerCommand {
private final CorePlugin plugin;
public MessageCommand(CorePlugin plugin) {
super("message");
this.plugin = plugin;
setAliases("msg", "m", "whisper", "w", "tell", "t");
setUsage(CC.RED + "Usage: /message <player> <message>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(usageMessage);
return;
}
CoreProfile profile = plugin.getProfileManager().getProfile(player);
Player target = plugin.getServer().getPlayer(args[0]);
if (target == null) {
player.sendMessage(Messages.PLAYER_NOT_FOUND);
return;
}
if (target.isRecording()) {
player.sendMessage(CC.RED + "That player is in recording mode and can't see your messages!");
return;
}
CoreProfile targetProfile = plugin.getProfileManager().getProfile(target);
if (targetProfile.hasPlayerIgnored(player.getUniqueId())) {
player.sendMessage(CC.RED + "That player is ignoring you!");
return;
}
plugin.getServer().getPluginManager().callEvent(new PlayerMessageEvent(player, target, StringUtil.buildString(args, 1)));
}
}

View File

@ -0,0 +1,28 @@
package zone.potion.commands.impl;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import zone.potion.commands.PlayerCommand;
import zone.potion.utils.message.CC;
public class PingCommand extends PlayerCommand {
public PingCommand() {
super("ping");
}
@Override
public void execute(Player player, String[] args) {
Player target = args.length < 1 || Bukkit.getPlayer(args[0]) == null ? player : Bukkit.getPlayer(args[0]);
int targetPing = target.spigot().getPing();
if (target == player) {
player.sendMessage(CC.PRIMARY + "Your ping is " + CC.SECONDARY + targetPing + CC.PRIMARY + " ms.");
} else {
int difference = targetPing - player.spigot().getPing();
String name = target.getDisplayName();
player.sendMessage(name + CC.PRIMARY + "'s ping is " + CC.SECONDARY + targetPing + CC.PRIMARY + " ms "
+ CC.ACCENT + "(" + (difference > 0 ? "+" : "") + difference + " difference)" + CC.PRIMARY + ".");
}
}
}

View File

@ -0,0 +1,46 @@
package zone.potion.commands.impl;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.event.player.PlayerMessageEvent;
import zone.potion.player.CoreProfile;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
public class ReplyCommand extends PlayerCommand {
private final CorePlugin plugin;
public ReplyCommand(CorePlugin plugin) {
super("reply");
this.plugin = plugin;
setAliases("r");
setUsage(CC.RED + "Usage: /reply <message>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 1) {
player.sendMessage(usageMessage);
return;
}
CoreProfile profile = plugin.getProfileManager().getProfile(player);
Player target = plugin.getServer().getPlayer(profile.getConverser());
if (target == null) {
player.sendMessage(CC.RED + "You are not in a conversation.");
return;
}
CoreProfile targetProfile = plugin.getProfileManager().getProfile(target);
if (targetProfile.hasPlayerIgnored(player.getUniqueId())) {
player.sendMessage(CC.RED + "That player is ignoring you!");
return;
}
plugin.getServer().getPluginManager().callEvent(new PlayerMessageEvent(player, target, StringUtil.buildString(args, 0)));
}
}

View File

@ -0,0 +1,74 @@
package zone.potion.commands.impl;
import com.google.common.collect.Maps;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.inventory.menu.impl.ReportMenu;
import zone.potion.player.CoreProfile;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
import zone.potion.utils.timer.Timer;
import java.util.Map;
public class ReportCommand extends PlayerCommand {
private final CorePlugin plugin;
public ReportCommand(CorePlugin plugin) {
super("report");
this.plugin = plugin;
setUsage(CC.RED + "Usage: /report <player> <reason>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(usageMessage);
return;
}
Player target = plugin.getServer().getPlayer(args[0]);
if (target == null) {
player.sendMessage(Messages.PLAYER_NOT_FOUND);
return;
}
if (player == target) {
player.sendMessage(CC.RED + "You can't report yourself!");
return;
}
CoreProfile targetProfile = plugin.getProfileManager().getProfile(target);
if (targetProfile.hasStaff()) {
player.sendMessage(CC.RED + "You can't report a staff member. If this staff member is harassing you or" +
" engaging in other abusive manners, please report this or contact a higher staff member.");
return;
}
CoreProfile profile = plugin.getProfileManager().getProfile(player);
Timer cooldownTimer = profile.getReportCooldownTimer();
if (cooldownTimer.isActive()) {
player.sendMessage(CC.RED + "You can't report a player for another " + cooldownTimer.formattedExpiration() + ".");
return;
}
String report = StringUtil.buildString(args, 1);
Map<String, Object> reportInformation = Maps.newHashMap();
reportInformation.put("server", plugin.getServerName());
reportInformation.put("reporter", player.getName());
reportInformation.put("reported", target.getName());
reportInformation.put("reason", report);
plugin.getRedisMessenger().send("report", reportInformation);
player.sendMessage(CC.GREEN + "Report sent for " + target.getDisplayName() + CC.GREEN + ": " + CC.R + report);
}
}

View File

@ -0,0 +1,36 @@
package zone.potion.commands.impl.staff;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
public class BroadcastCommand extends BaseCommand {
private final CorePlugin plugin;
public BroadcastCommand(CorePlugin plugin) {
super("broadcast", "spike.admin");
this.plugin = plugin;
setAliases("bc");
setUsage(CC.RED + "Usage: /broadcast <message> [-god]");
}
@Override
protected void execute(CommandSender sender, String[] args) {
if (args.length == 0) {
sender.sendMessage(usageMessage);
return;
}
String message = CC.D_RED + "[Alert] " + CC.WHITE
+ ChatColor.translateAlternateColorCodes('&', StringUtil.buildString(args, 0)).trim();
if (message.endsWith(" -god")) {
message = message.substring(12, message.length() - 5).trim();
}
plugin.getServer().broadcastMessage(message);
}
}

View File

@ -0,0 +1,46 @@
package zone.potion.commands.impl.staff;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import zone.potion.commands.PlayerCommand;
import zone.potion.utils.message.CC;
public class GameModeCommand extends PlayerCommand {
public GameModeCommand() {
super("gamemode", "spike.admin");
setAliases("gm");
setUsage(CC.RED + "Usage: /gamemode <mode|id>");
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 1) {
player.sendMessage(usageMessage);
return;
}
switch (args[0].toLowerCase()) {
case "1":
case "creative":
case "c":
player.setGameMode(GameMode.CREATIVE);
player.sendMessage(CC.GREEN + "Your game mode was set to creative.");
break;
case "0":
case "survival":
case "s":
player.setGameMode(GameMode.SURVIVAL);
player.sendMessage(CC.GREEN + "Your game mode was set to survival.");
break;
case "2":
case "adventure":
case "a":
player.setGameMode(GameMode.ADVENTURE);
player.sendMessage(CC.GREEN + "Your game mode was set to adventure.");
break;
default:
player.sendMessage(usageMessage);
break;
}
}
}

View File

@ -0,0 +1,23 @@
package zone.potion.commands.impl.staff;
import org.bukkit.command.CommandSender;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.toothless.ToothlessConfig;
import zone.potion.utils.message.CC;
public class ReloadKBCommand extends BaseCommand {
private final CorePlugin plugin;
public ReloadKBCommand(CorePlugin plugin) {
super("reloadkb", "spike.super");
this.plugin = plugin;
setUsage(CC.RED + "Usage: /reloadkb");
}
@Override
protected void execute(CommandSender sender, String[] args) {
ToothlessConfig.reload();
sender.sendMessage(CC.GREEN + "Reloaded knockback settings!");
}
}

View File

@ -0,0 +1,62 @@
package zone.potion.commands.impl.staff;
import org.bukkit.command.CommandSender;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.event.server.ServerShutdownCancelEvent;
import zone.potion.event.server.ServerShutdownScheduleEvent;
import zone.potion.task.ShutdownTask;
import zone.potion.utils.NumberUtil;
import zone.potion.utils.message.CC;
public class ShutdownCommand extends BaseCommand {
private final CorePlugin plugin;
public ShutdownCommand(CorePlugin plugin) {
super("shutdown", "spike.super");
this.plugin = plugin;
setUsage(CC.RED + "Usage: /shutdown <seconds|cancel>");
}
@Override
protected void execute(CommandSender sender, String[] args) {
if (args.length < 1) {
sender.sendMessage(usageMessage);
return;
}
String arg = args[0];
if (arg.equals("cancel")) {
ShutdownTask task = plugin.getServerSettings().getShutdownTask();
if (task == null) {
sender.sendMessage(CC.RED + "There is no shutdown in progress.");
} else {
plugin.getServer().getPluginManager().callEvent(new ServerShutdownCancelEvent());
task.cancel();
plugin.getServerSettings().setShutdownTask(null);
plugin.getServer().broadcastMessage(CC.GREEN + "The shutdown in progress has been cancelled by " + sender.getName() + ".");
}
return;
}
Integer seconds = NumberUtil.getInteger(arg);
if (seconds == null) {
sender.sendMessage(usageMessage);
} else {
if (seconds >= 5 && seconds <= 300) {
plugin.getServer().getPluginManager().callEvent(new ServerShutdownScheduleEvent());
ShutdownTask task = new ShutdownTask(plugin, seconds);
plugin.getServerSettings().setShutdownTask(task);
task.runTaskTimer(plugin, 0L, 20L);
} else {
sender.sendMessage(CC.RED + "Please enter a time between 5 and 300 seconds.");
}
}
}
}

View File

@ -0,0 +1,66 @@
package zone.potion.commands.impl.staff;
import org.bukkit.command.CommandSender;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.utils.message.CC;
public class SlowChatCommand extends BaseCommand {
private final CorePlugin plugin;
public SlowChatCommand(CorePlugin plugin) {
super("slowchat", "spike.staff");
this.plugin = plugin;
setUsage(CC.RED + "Usage: /slowchat <seconds|disable>");
}
private static Integer getInt(String arg) {
try {
int i = Integer.parseInt(arg);
if (i < 4 || i > 60) {
return null;
}
return i;
} catch (NumberFormatException e) {
return null;
}
}
@Override
protected void execute(CommandSender sender, String[] args) {
if (args.length < 1) {
sender.sendMessage(usageMessage);
return;
}
String arg = args[0];
switch (arg.toLowerCase()) {
case "off":
case "toggle":
case "disable":
int slowChatTime = plugin.getServerSettings().getSlowChatTime();
if (slowChatTime == -1) {
sender.sendMessage(CC.RED + "Slow chat is already disabled!");
} else {
plugin.getServerSettings().setSlowChatTime(-1);
plugin.getServer().broadcastMessage(CC.RED + "Slow chat has been disabled by " + sender.getName() + ".");
}
break;
default:
Integer time = getInt(arg);
if (time == null) {
sender.sendMessage(CC.RED + "You must enter a valid time between 4 and 60 seconds.");
} else {
plugin.getServerSettings().setSlowChatTime(time);
plugin.getServer().broadcastMessage(CC.YELLOW + "Slow chat has been enabled and set to " + time
+ " seconds by " + sender.getName() + ".");
}
break;
}
}
}

View File

@ -0,0 +1,57 @@
package zone.potion.commands.impl.staff;
import com.google.common.collect.Maps;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.StringUtil;
import zone.potion.utils.message.CC;
import java.util.Map;
public class StaffChatCommand extends BaseCommand {
private final CorePlugin plugin;
public StaffChatCommand(CorePlugin plugin) {
super("staffchat", "spike.staff");
this.plugin = plugin;
setAliases("sc");
setUsage("/staffchat [message]");
}
@Override
public void execute(CommandSender sender, String[] args) {
if (args.length == 0) {
if (sender instanceof Player) {
CoreProfile profile = plugin.getProfileManager().getProfile(((Player) sender));
boolean inStaffChat = !profile.isInStaffChat();
profile.setInStaffChat(inStaffChat);
sender.sendMessage(inStaffChat ? CC.GREEN + "You are now in staff chat." : CC.RED + "You are no longer in staff chat.");
return;
}
sender.sendMessage(CC.RED + getUsage());
return;
} else {
String message = StringUtil.buildString(args, 0);
Map<String, Object> redisMessage = Maps.newHashMap();
redisMessage.put("message", message);
redisMessage.put("sender", sender.getName());
if (sender instanceof Player) {
CoreProfile profile = plugin.getProfileManager().getProfile(((Player) sender));
redisMessage.put("format", profile.getPrimaryGroupPrefix() + sender.getName());
}
redisMessage.put("server", plugin.getServerName());
plugin.getRedisMessenger().send("staff-chat", redisMessage);
//plugin.getStaffManager().messageStaff(profile.getChatFormat(), message, plugin.getServerName());
}
}
}

View File

@ -0,0 +1,67 @@
package zone.potion.commands.impl.staff;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
public class TeleportCommand extends PlayerCommand {
private final CorePlugin plugin;
public TeleportCommand(CorePlugin plugin) {
super("tp", "spike.staff");
this.plugin = plugin;
setAliases("teleport");
setUsage(CC.RED + "Usage: /teleport <player> [player]");
}
private static boolean isOffline(Player checker, Player target) {
if (target == null) {
checker.sendMessage(Messages.PLAYER_NOT_FOUND);
return true;
}
return false;
}
private void teleport(Player to, Player from) {
to.teleport(from);
to.sendMessage(CC.GREEN + "You have been teleported to " + from.getName() + ".");
CoreProfile fromProfile = plugin.getProfileManager().getProfile(from);
if (fromProfile.hasStaff()) {
from.sendMessage(CC.GREEN + to.getName() + " has been teleported to you.");
}
}
@Override
public void execute(Player player, String[] args) {
if (args.length < 1) {
player.sendMessage(usageMessage);
return;
}
Player target = plugin.getServer().getPlayer(args[0]);
if (isOffline(player, target)) {
return;
}
if (args.length < 2) {
teleport(player, target);
} else {
Player target2 = plugin.getServer().getPlayer(args[1]);
if (isOffline(player, target2)) {
return;
}
teleport(target, target2);
player.sendMessage(CC.GREEN + "Teleported " + target.getName() + " to " + target2.getName() + ".");
}
}
}

View File

@ -0,0 +1,32 @@
package zone.potion.commands.impl.staff;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
public class VanishCommand extends BaseCommand {
private final CorePlugin plugin;
public VanishCommand(CorePlugin plugin) {
super("vanish", "spike.staff");
this.plugin = plugin;
}
@Override
protected void execute(CommandSender sender, String[] args) {
Player player = (Player) sender;
CoreProfile profile = plugin.getProfileManager().getProfile(player);
boolean vanished = !profile.isVanished();
profile.setVanished(vanished);
for (Player online : plugin.getServer().getOnlinePlayers()) {
plugin.getStaffManager().hideVanishedStaffFromPlayer(online);
}
player.sendMessage(vanished ? CC.GREEN + "Poof, you vanished." : CC.RED + "You're visible again.");
}
}

View File

@ -0,0 +1,59 @@
package zone.potion.commands.impl.staff.punish;
import com.google.common.collect.Maps;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.BaseCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
import java.util.Map;
public class FreezeCommand extends BaseCommand {
private CorePlugin plugin;
public FreezeCommand(CorePlugin plugin) {
super("freeze", "spike.staff");
this.plugin = plugin;
setUsage("/freeze <player>");
setAliases("ice", "frz");
}
@Override
protected void execute(CommandSender sender, String[] args) {
if (args.length < 1) {
sender.sendMessage(CC.RED + getUsage());
return;
}
Player target = Bukkit.getPlayer(args[0]);
if (target != null) {
CoreProfile targetProfile = plugin.getProfileManager().getProfile(target);
if (targetProfile.hasStaff()) {
sender.sendMessage(ChatColor.RED + "If you believe a staff member is cheating, please alert higher staff.");
return;
}
String server = plugin.getServerName();
String targetName = target.getName();
String senderName = sender.getName();
Map<String, Object> map = Maps.newHashMap();
map.put("server", server);
map.put("frozen", targetName);
map.put("sender", senderName);
if (targetProfile.freeze(sender)) {
map.put("isFrozen", true);
plugin.getRedisMessenger().send("freeze-listener", map);
return;
}
map.put("isFrozen", false);
plugin.getRedisMessenger().send("freeze-listener", map);
return;
}
sender.sendMessage(CC.RED + "That player is offline or does not exist.");
}
}

View File

@ -0,0 +1,26 @@
package zone.potion.commands.impl.toggle;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
public class ToggleCrossChat extends PlayerCommand {
private final CorePlugin plugin;
public ToggleCrossChat(CorePlugin plugin) {
super("togglecrosschat");
this.plugin = plugin;
setAliases("tcchat", "tcc");
}
@Override
public void execute(Player player, String[] args) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
boolean enabled = !profile.isCrossChat();
profile.setCrossChat(enabled);
player.sendMessage(enabled ? CC.GREEN + "Cross chat enabled." : CC.RED + "Cross chat disabled.");
}
}

View File

@ -0,0 +1,26 @@
package zone.potion.commands.impl.toggle;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
public class ToggleGlobalChat extends PlayerCommand {
private final CorePlugin plugin;
public ToggleGlobalChat(CorePlugin plugin) {
super("toggleglobalchat");
this.plugin = plugin;
setAliases("togglechat", "tgc");
}
@Override
public void execute(Player player, String[] args) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
boolean enabled = !profile.isGlobalChatEnabled();
profile.setGlobalChatEnabled(enabled);
player.sendMessage(enabled ? CC.GREEN + "Global chat enabled." : CC.RED + "Global chat disabled.");
}
}

View File

@ -0,0 +1,26 @@
package zone.potion.commands.impl.toggle;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
public class ToggleMessagesCommand extends PlayerCommand {
private final CorePlugin plugin;
public ToggleMessagesCommand(CorePlugin plugin) {
super("togglemessages");
this.plugin = plugin;
setAliases("tpm");
}
@Override
public void execute(Player player, String[] args) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
boolean messaging = !profile.isMessaging();
profile.setMessaging(messaging);
player.sendMessage(messaging ? CC.GREEN + "Messages enabled." : CC.RED + "Messages disabled.");
}
}

View File

@ -0,0 +1,26 @@
package zone.potion.commands.impl.toggle;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.commands.PlayerCommand;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
public class ToggleSoundsCommand extends PlayerCommand {
private final CorePlugin plugin;
public ToggleSoundsCommand(CorePlugin plugin) {
super("togglesounds");
this.plugin = plugin;
setAliases("sounds", "ts");
}
@Override
public void execute(Player player, String[] args) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
boolean playingSounds = !profile.isPlayingSounds();
profile.setPlayingSounds(playingSounds);
player.sendMessage(playingSounds ? CC.GREEN + "Sounds enabled." : CC.RED + "Sounds disabled.");
}
}

View File

@ -0,0 +1,39 @@
package zone.potion.event;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import java.util.UUID;
@RequiredArgsConstructor
@Getter
public class BanEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final CommandSender punisher;
private final UUID punishedId;
private boolean cancelled;
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
}

View File

@ -0,0 +1,28 @@
package zone.potion.event.player;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
@Getter
public class PlayerMessageEvent extends PlayerEvent {
private static final HandlerList HANDLERS = new HandlerList();
private final Player receiver;
private final String message;
public PlayerMessageEvent(Player sender, Player receiver, String message) {
super(sender);
this.receiver = receiver;
this.message = message;
}
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public HandlerList getHandlers() {
return HANDLERS;
}
}

View File

@ -0,0 +1,17 @@
package zone.potion.event.server;
import org.bukkit.event.HandlerList;
import org.bukkit.event.server.ServerEvent;
public class ServerShutdownCancelEvent extends ServerEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
}

View File

@ -0,0 +1,17 @@
package zone.potion.event.server;
import org.bukkit.event.HandlerList;
import org.bukkit.event.server.ServerEvent;
public class ServerShutdownScheduleEvent extends ServerEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
}

View File

@ -0,0 +1,63 @@
package zone.potion.inventory.menu;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import zone.potion.inventory.menu.action.Action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class Menu {
@Getter
private final Inventory inventory;
private final Map<Integer, Action> actions = new HashMap<>();
private final List<Menu> pages = new ArrayList<>();
protected Menu(int rows, String name) {
inventory = Bukkit.createInventory(null, 9 * rows, name);
}
protected void setItem(int slot, ItemStack item) {
inventory.setItem(slot, item);
}
protected void setActionableItem(int slot, ItemStack item, Action action) {
inventory.setItem(slot, item);
actions.put(slot, action);
}
protected ItemStack getItem(int slot) {
return inventory.getItem(slot);
}
public Action getAction(int slot) {
return actions.get(slot);
}
public void open(Player player) {
player.openInventory(inventory);
}
public void addPage(Menu page) {
pages.add(page);
}
public Menu getPage(int index) {
return pages.get(index);
}
protected void clear() {
actions.clear();
pages.clear();
inventory.clear();
}
public abstract void setup();
public abstract void update();
}

View File

@ -0,0 +1,7 @@
package zone.potion.inventory.menu.action;
import org.bukkit.entity.Player;
public interface Action {
void onClick(Player player);
}

View File

@ -0,0 +1,28 @@
package zone.potion.inventory.menu.impl;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import zone.potion.inventory.menu.Menu;
public abstract class PerPlayerMenu extends Menu {
protected PerPlayerMenu(int rows, String name) {
super(rows, name);
}
@Override
public final void update() {
for (HumanEntity entity : getInventory().getViewers()) {
Player player = (Player) entity;
updatePlayer(player);
player.updateInventory();
}
}
@Override
public final void open(Player player) {
super.open(player);
updatePlayer(player);
}
public abstract void updatePlayer(Player player);
}

View File

@ -0,0 +1,54 @@
package zone.potion.inventory.menu.impl;
import org.bukkit.Material;
import zone.potion.CorePlugin;
import zone.potion.inventory.menu.Menu;
import zone.potion.inventory.menu.action.Action;
import zone.potion.player.CoreProfile;
import zone.potion.utils.item.ItemBuilder;
import zone.potion.utils.message.CC;
import zone.potion.utils.timer.Timer;
public class ReportMenu extends Menu {
private final CorePlugin plugin;
public ReportMenu(CorePlugin plugin) {
super(1, "Select a Report Reason");
this.plugin = plugin;
}
private Action getAction(String reason) {
return player -> {
CoreProfile profile = plugin.getProfileManager().getProfile(player.getUniqueId());
Timer cooldownTimer = profile.getReportCooldownTimer();
if (cooldownTimer.isActive()) {
player.sendMessage(CC.RED + "You can't report a player for another " + cooldownTimer.formattedExpiration() + ".");
player.closeInventory();
return;
}
String targetName = profile.getReportingPlayerName();
plugin.getStaffManager().messageStaff("");
plugin.getStaffManager().messageStaff(CC.RED + "(Report) " + CC.SECONDARY + player.getName() + CC.PRIMARY
+ " reported " + CC.SECONDARY + targetName + CC.PRIMARY + " for " + CC.SECONDARY + reason + CC.PRIMARY + ".");
plugin.getStaffManager().messageStaff("");
player.sendMessage(CC.GREEN + "Report sent for " + targetName + CC.GREEN + ": " + CC.R + reason);
player.closeInventory();
};
}
@Override
public void setup() {
}
@Override
public void update() {
setActionableItem(1, new ItemBuilder(Material.DIAMOND_SWORD).name(CC.PRIMARY + "Combat Cheats").build(), getAction("Combat Cheats"));
setActionableItem(3, new ItemBuilder(Material.DIAMOND_BOOTS).name(CC.PRIMARY + "Movement Cheats").build(), getAction("Movement Cheats"));
setActionableItem(5, new ItemBuilder(Material.PAPER).name(CC.PRIMARY + "Chat Violation").build(), getAction("Chat Violation"));
setActionableItem(7, new ItemBuilder(Material.NETHER_STAR).name(CC.PRIMARY + "Assistance").build(), getAction("I need assistance related to this player"));
}
}

View File

@ -0,0 +1,37 @@
package zone.potion.listeners;
import lombok.RequiredArgsConstructor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
@RequiredArgsConstructor
public class HelpCommandListener implements Listener {
/**
* Commands we don't want players to be able to run(and or, display the help message for).
*/
private static final String[] DISALLOWED_COMMANDS = {
"?",
"help",
"version",
"ver",
"icanhasbukkit"
};
private final CorePlugin plugin;
@EventHandler
public void onHelpCommand(PlayerCommandPreprocessEvent event) {
CoreProfile profile = plugin.getProfileManager().getProfile(event.getPlayer());
boolean staff = profile.hasStaff();
for (String command : DISALLOWED_COMMANDS) {
if (event.getMessage().startsWith("/" + command) && !staff) {
event.getPlayer().sendMessage(CC.RED + "If you need help, require assistance by using /helpop.");
}
}
}
}

View File

@ -0,0 +1,52 @@
package zone.potion.listeners;
import lombok.RequiredArgsConstructor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import zone.potion.CorePlugin;
import zone.potion.inventory.menu.Menu;
import zone.potion.inventory.menu.action.Action;
import zone.potion.player.CoreProfile;
@RequiredArgsConstructor
public class InventoryListener implements Listener {
private final CorePlugin plugin;
@EventHandler
public void onClick(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
if (player.getGameMode() != GameMode.SURVIVAL || event.getClickedInventory() == null
|| event.getClickedInventory() == player.getInventory() || event.getCurrentItem() == null
|| event.getCurrentItem().getType() == Material.AIR) {
return;
}
Menu menu = plugin.getMenuManager().getMatchingMenu(event.getClickedInventory());
if (menu != null) {
Action action = menu.getAction(event.getSlot());
if (action != null) {
event.setCancelled(true);
action.onClick(player);
}
}
}
@EventHandler
public void onClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile != null && profile.getReportingPlayerName() != null) {
profile.setReportingPlayerName(null);
}
}
}

View File

@ -0,0 +1,52 @@
package zone.potion.listeners;
import lombok.RequiredArgsConstructor;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import zone.potion.CorePlugin;
import zone.potion.event.player.PlayerMessageEvent;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
@RequiredArgsConstructor
public class MessageListener implements Listener {
private final CorePlugin plugin;
private static void sendMessage(CoreProfile sender, CoreProfile receiver, Player player, String msg) {
receiver.setConverser(sender.getId());
player.sendMessage(msg);
}
@EventHandler
public void onMessage(PlayerMessageEvent event) {
Player sender = event.getPlayer();
CoreProfile senderProfile = plugin.getProfileManager().getProfile(sender);
if (!senderProfile.isMessaging() && !senderProfile.hasStaff()) {
sender.sendMessage(CC.RED + "You have messaging disabled.");
return;
}
Player receiver = event.getReceiver();
CoreProfile receiverProfile = plugin.getProfileManager().getProfile(receiver);
if (senderProfile.hasStaff()) {
// NO-OP
} else if (!receiverProfile.isMessaging()) {
sender.sendMessage(CC.RED + receiver.getName() + " has messaging disabled.");
return;
}
String toMsg = CC.GRAY + "(To " + receiverProfile.getPrimaryGroupPrefix() + receiver.getName() + CC.GRAY + ") " + event.getMessage();
String fromMsg = CC.GRAY + "(From " + senderProfile.getPrimaryGroupPrefix() + sender.getName()+ CC.GRAY + ") " + event.getMessage();
sendMessage(senderProfile, receiverProfile, receiver, fromMsg);
sendMessage(receiverProfile, senderProfile, sender, toMsg);
if (receiverProfile.isPlayingSounds()) {
receiver.playSound(receiver.getLocation(), Sound.NOTE_PLING, 1.0F, 2.0F);
}
}
}

View File

@ -0,0 +1,329 @@
package zone.potion.listeners;
import com.google.common.collect.Maps;
import lombok.RequiredArgsConstructor;
import org.bson.Document;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.player.*;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import zone.potion.storage.database.MongoStorage;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
import zone.potion.utils.time.TimeUtil;
import zone.potion.utils.timer.Timer;
import java.util.Iterator;
import java.util.Map;
@RequiredArgsConstructor
public class PlayerListener implements Listener {
private static final String[] DISALLOWED_PERMISSIONS = {
"bukkit.command.version", "bukkit.command.plugins", "bukkit.command.help", "bukkit.command.tps",
"minecraft.command.tell", "minecraft.command.me", "minecraft.command.help"
};
private final CorePlugin plugin;
private boolean isNotBanned(Document document, AsyncPlayerPreLoginEvent event) {
if (document != null && document.getBoolean("banned") != null && document.getBoolean("banned")) {
long expiry = document.getLong("ban_expiry");
long difference = expiry - System.currentTimeMillis();
if (expiry == -1L || difference > 0) {
String formattedDifference = TimeUtil.formatTimeMillis(difference);
String kickMessage = expiry == -1L ? Messages.BANNED_PERMANENTLY : String.format(Messages.BANNED_TEMPORARILY, formattedDifference);
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED, kickMessage);
return false;
}
}
return true;
}
@EventHandler(priority = EventPriority.LOWEST)
public void onLoginBeforeEnable(AsyncPlayerPreLoginEvent event) {
if (!CorePlugin.isServerEnabled()) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, CC.RED + "The server is still starting up.");
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPreLogin(AsyncPlayerPreLoginEvent event) {
if (plugin.getPlayerManager().isNameOnline(event.getName()) || plugin.getPlayerManager().getOnlineByIp(event.getAddress()) > 3) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, CC.RED + "You're already online!");
} else if (event.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED) {
MongoStorage storage = plugin.getMongoStorage();
boolean notBannedById = isNotBanned(storage.getDocument("punished_ids", event.getUniqueId()), event);
boolean notBannedByIp = isNotBanned(storage.getDocument("punished_addresses", event.getAddress().getHostAddress()), event);
if (notBannedById && notBannedByIp) {
plugin.getProfileManager().createProfile(event.getName(), event.getUniqueId(), event.getAddress().getHostAddress());
}
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onLogin(PlayerLoginEvent event) {
Player player = event.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile == null) {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, Messages.DATA_LOAD_FAIL);
return;
} else if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) {
plugin.getProfileManager().removeProfile(player.getUniqueId());
return;
}
if (profile.hasStaff()) {
plugin.getStaffManager().addCachedStaff(profile);
}
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
event.setJoinMessage(null);
Player player = event.getPlayer();
plugin.getPlayerManager().addPlayer(player);
CoreProfile profile = plugin.getProfileManager().getProfile(player);
plugin.getStaffManager().hideVanishedStaffFromPlayer(player);
if (profile.hasStaff()) {
Map<String, Object> message = Maps.newHashMap();
message.put("server", plugin.getServerName());
message.put("sender", profile.getPrimaryGroupPrefix() + player.getName());
plugin.getRedisMessenger().send("staff-join", message);
}
profile.setLastLocation(new int[]{player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()});
}
private void onDisconnect(Player player) {
plugin.getPlayerManager().removePlayer(player);
CoreProfile profile = plugin.getProfileManager().getProfile(player);
// in case disconnect is somehow called twice
if (profile == null) {
return;
}
if (profile.hasStaff()) {
plugin.getStaffManager().removeCachedStaff(profile);
Map<String, Object> message = Maps.newHashMap();
message.put("server", plugin.getServerName());
message.put("sender", profile.getPrimaryGroupPrefix() + player.getName());
plugin.getRedisMessenger().send("staff-quit", message);
//plugin.getStaffManager().messageStaffWithPrefix(profile.getChatFormat() + CC.PRIMARY + " left the server.");
}
profile.save(true);
plugin.getProfileManager().removeProfile(player.getUniqueId());
}
@EventHandler
public void onKick(PlayerKickEvent event) {
event.setLeaveMessage(null);
onDisconnect(event.getPlayer());
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
event.setQuitMessage(null);
onDisconnect(event.getPlayer());
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
String msg = event.getMessage();
if (!profile.hasStaff()) {
if (plugin.getServerSettings().getSlowChatTime() != -1) {
long lastChatTime = profile.getLastChatTime();
int slowChatTime = plugin.getServerSettings().getSlowChatTime();
long sum = lastChatTime + (slowChatTime * 1000);
if (lastChatTime != 0 && sum > System.currentTimeMillis()) {
event.setCancelled(true);
String diff = TimeUtil.formatTimeMillis(sum - System.currentTimeMillis());
player.sendMessage(CC.RED + "Slow chat is currently enabled. You can talk again in " + diff + ".");
return;
}
}
Timer timer = profile.getChatCooldownTimer();
if (timer.isActive()) {
event.setCancelled(true);
player.sendMessage(CC.RED + "You can't chat for another " + timer.formattedExpiration() + ".");
return;
}
} else if (profile.isInStaffChat()) {
event.setCancelled(true);
Map<String, Object> message = Maps.newHashMap();
message.put("server", plugin.getServerName());
message.put("format", profile.getPrimaryGroupPrefix() + player.getName());
message.put("message", event.getMessage());
message.put("sender", event.getPlayer().getName());
plugin.getRedisMessenger().send("staff-chat", message);
//plugin.getStaffManager().messageStaff(profile.getChatFormat(), msg);
return;
}
if (plugin.getFilter().isFiltered(msg)) {
if (profile.hasStaff()) {
player.sendMessage(CC.RED + "That would have been filtered.");
} else {
event.setCancelled(true);
String formattedMessage = profile.getPrimaryGroupPrefix() + player.getName() + CC.R + ": " + msg;
plugin.getStaffManager().messageStaff(CC.RED + "(Filtered) " + formattedMessage);
player.sendMessage(formattedMessage);
return;
}
}
Iterator<Player> recipients = event.getRecipients().iterator();
while (recipients.hasNext()) {
Player recipient = recipients.next();
CoreProfile recipientProfile = plugin.getProfileManager().getProfile(recipient);
if (recipientProfile == null) {
continue;
}
if (recipientProfile.hasPlayerIgnored(player.getUniqueId())
|| (!recipientProfile.isGlobalChatEnabled() && (!profile.hasStaff() || recipientProfile.hasStaff()))) {
recipients.remove();
} else if (recipient != player) {
String[] words = msg.split(" ");
boolean found = false;
StringBuilder newMessage = new StringBuilder();
for (String word : words) {
if (recipient.getName().equalsIgnoreCase(word) && !found) {
newMessage.append(CC.PINK).append(CC.I).append(word).append(CC.R).append(" ");
found = true;
} else {
newMessage.append(word).append(" ");
}
}
if (!found) {
continue;
}
if (recipientProfile.isPlayingSounds()) {
recipient.playSound(recipient.getLocation(), Sound.LEVEL_UP, 1.0F, 2.0F);
}
String mentionMessage = profile.getPrimaryGroupPrefix() + player.getName()+ CC.R + ": " + newMessage.toString();
recipient.sendMessage(mentionMessage);
recipient.sendMessage(player.getDisplayName() + CC.PRIMARY + " mentioned you!");
recipients.remove();
}
}
Map<String, Object> map = Maps.newHashMap();
map.put("message", event.getMessage());
map.put("format", profile.getPrimaryGroupPrefix() + player.getName());
map.put("region", plugin.getConfig().getString("region"));
map.put("uuid", event.getPlayer().getUniqueId().toString());
plugin.getRedisMessenger().send("cross-chat", map);
event.setFormat(profile.getPrimaryGroupPrefix() + player.getName() + CC.R + ": %2$s");
profile.updateLastChatTime();
}
@EventHandler
public void onCommand(PlayerCommandPreprocessEvent event) {
Player player = event.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.hasStaff()) return;
Timer timer = profile.getCommandCooldownTimer();
if (timer.isActive()) {
event.setCancelled(true);
player.sendMessage(CC.RED + "You can't use commands for another " + timer.formattedExpiration() + ".");
}
}
@EventHandler
public void onFreezeDamage(EntityDamageByEntityEvent e) {
if (e.getDamager() instanceof Player) {
Player player = (Player) e.getDamager();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (e.getEntity() instanceof Player && plugin.getProfileManager().getProfile((Player)e.getEntity()).isFrozen() || profile.isFrozen())
e.setCancelled(true);
}
}
@EventHandler
public void onFreezeCommand(PlayerCommandPreprocessEvent e) {
Player player = e.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.isFrozen()) {
player.sendMessage(CC.RED + "You cannot run commands while you are frozen.");
e.setCancelled(true);
}
}
@EventHandler
public void onFreezeInteract(PlayerInteractEvent e) {
Player player = e.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.isFrozen()) {
e.setCancelled(true);
}
}
@EventHandler
public void onFreezeSprint(PlayerToggleSprintEvent e) {
Player player = e.getPlayer();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.isFrozen()) {
e.setCancelled(true);
}
}
@EventHandler
public void onFoodLevelChange(FoodLevelChangeEvent e) {
if (!(e.getEntity() instanceof Player)) return;
Player player = (Player) e.getEntity();
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.isFrozen()) {
e.setCancelled(true);
}
}
}

View File

@ -0,0 +1,36 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
import java.util.UUID;
@RequiredArgsConstructor
public class ChatListener {
private final CorePlugin plugin;
@RedisHandler("cross-chat")
public void onChat(Map<String, Object> messageMap) {
String format = (String) messageMap.get("format");
String message = (String) messageMap.get("message");
String region = (String) messageMap.get("region");
UUID senderUUID = UUID.fromString((String) messageMap.get("uuid"));
if (plugin.getConfig().getString("region").equalsIgnoreCase(region)) return;
plugin.getServer().getOnlinePlayers().stream()
.map(player -> plugin.getProfileManager().getProfile(player))
.filter(player -> !player.hasPlayerIgnored(senderUUID))
.filter(CoreProfile::isCrossChat)
.filter(CoreProfile::isGlobalChatEnabled)
.map(profile -> Bukkit.getPlayer(profile.getId()))
.forEach(player -> player.sendMessage(CC.GRAY + "[" + region.toUpperCase() + "] " + CC.R + format + CC.R + ": " + message));
//Bukkit.broadcastMessage(CC.GRAY + "[" + region.toUpperCase() + "] " + CC.R + format + CC.R + ": " + message);
}
}

View File

@ -0,0 +1,34 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class DispatchCommandListener {
private final CorePlugin plugin;
@RedisHandler("dispatch-command")
public void onDispatch(Map<String, Object> map) {
String command = (String) map.get("command");
String server = (String) map.get("server");
String sender = (String) map.get("sender");
plugin.getServer().getScheduler().runTask(plugin, () -> {
plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), command);
for (Player player : plugin.getServer().getOnlinePlayers()) {
CoreProfile profile = plugin.getProfileManager().getProfile(player);
if (profile.hasStaff())
player.sendMessage(CC.D_AQUA + "[" + server + "] " + CC.RED + sender + CC.SECONDARY + " dispatched command " + CC.PRIMARY + "\"/" + command + "\"");
}
Bukkit.getConsoleSender().sendMessage(CC.D_AQUA + "[" + server + "] " + CC.RED + sender + CC.SECONDARY + " dispatched command " + CC.PRIMARY + "\"/" + command + "\"");
});
}
}

View File

@ -0,0 +1,23 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class FreezeListener {
private final CorePlugin plugin;
@RedisHandler("freeze-listener")
public void onFreeze(Map<String, Object> map) {
String sender = (String) map.get("sender");
String target = (String) map.get("frozen");
String server = (String) map.get("server");
boolean frozen = Boolean.valueOf((String) map.get("isFrozen"));
plugin.getStaffManager().messageStaffWithPrefix(CC.PRIMARY + sender + CC.SECONDARY + " has " + (frozen ? "frozen " : "unfrozen ") + target + ".", server);
}
}

View File

@ -0,0 +1,24 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class HelpopListener {
private final CorePlugin plugin;
@RedisHandler("help-op")
public void onHelpOp(Map<String, Object> map) {
String server = (String) map.get("server");
String player = (String) map.get("player");
String request = (String) map.get("request");
plugin.getStaffManager().messageStaff(CC.RED + "\n(HelpOp) " + CC.D_AQUA + "[" + server + "] " + CC.SECONDARY + player
+ CC.PRIMARY + " requested assistance: " + CC.SECONDARY + request + CC.PRIMARY + ".\n ");
}
}

View File

@ -0,0 +1,27 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class ReportListener {
private final CorePlugin plugin;
@RedisHandler("report")
public void onReport(Map<String, Object> map) {
String player = (String) map.get("reporter");
String target = (String) map.get("reported");
String report = (String) map.get("reason");
String server = (String) map.get("server");
plugin.getStaffManager().messageStaff("");
plugin.getStaffManager().messageStaff(CC.RED + "(Report) " + CC.D_AQUA + "[" + server + "] " + CC.SECONDARY + player + CC.PRIMARY
+ " reported " + CC.SECONDARY + target + CC.PRIMARY + " for " + CC.SECONDARY + report + CC.PRIMARY + ".");
plugin.getStaffManager().messageStaff("");
}
}

View File

@ -0,0 +1,25 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class StaffChatListener {
private final CorePlugin plugin;
@RedisHandler("staff-chat")
public void onStaffChatMessage(Map<String, Object> message) {
String sender = (String) message.get("sender");
if (sender.equalsIgnoreCase("CONSOLE")) {
plugin.getStaffManager().messageStaff(CC.D_RED + sender, (String) message.get("message"), "GLOBAL");
return;
}
plugin.getStaffManager().messageStaff((String) message.get("format"), (String) message.get("message"), (String) message.get("server"));
}
}

View File

@ -0,0 +1,25 @@
package zone.potion.listeners.redis;
import lombok.RequiredArgsConstructor;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.utils.message.CC;
import java.util.Map;
@RequiredArgsConstructor
public class StaffJoinListener {
private final CorePlugin plugin;
@RedisHandler("staff-join")
public void onJoin(Map<String, Object> message) {
plugin.getStaffManager().messageStaffWithPrefix(message.get("sender") + CC.PRIMARY + " joined the server.", (String) message.get("server"));
}
@RedisHandler("staff-quit")
public void onQuit(Map<String, Object> message) {
plugin.getStaffManager().messageStaffWithPrefix(message.get("sender") + CC.PRIMARY + " left the server.", (String) message.get("server"));
}
}

View File

@ -0,0 +1,41 @@
package zone.potion.managers;
import org.bukkit.inventory.Inventory;
import zone.potion.CorePlugin;
import zone.potion.inventory.menu.Menu;
import zone.potion.inventory.menu.impl.ReportMenu;
import java.util.HashMap;
import java.util.Map;
public class MenuManager {
private final Map<Class<? extends Menu>, Menu> menus = new HashMap<>();
public MenuManager(CorePlugin plugin) {
registerMenus(
new ReportMenu(plugin)
);
}
public Menu getMenu(Class<? extends Menu> clazz) {
return menus.get(clazz);
}
public Menu getMatchingMenu(Inventory other) {
for (Menu menu : menus.values()) {
if (menu.getInventory().equals(other)) {
return menu;
}
}
return null;
}
public void registerMenus(Menu... menus) {
for (Menu menu : menus) {
menu.setup();
menu.update();
this.menus.put(menu.getClass(), menu);
}
}
}

View File

@ -0,0 +1,51 @@
package zone.potion.managers;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import zone.potion.CorePlugin;
import java.net.InetAddress;
import java.util.*;
public class PlayerManager {
private final Map<InetAddress, Integer> onlinePerIp = new HashMap<>();
private final List<String> onlineNames = new ArrayList<>();
private final Map<UUID, BukkitTask> announcementTasks = new HashMap<>();
public void addPlayer(Player player) {
onlineNames.add(player.getName());
InetAddress address = player.getAddress().getAddress();
int count = onlinePerIp.getOrDefault(address, 0) + 1;
onlinePerIp.put(address, count);
}
public void removePlayer(Player player) {
onlineNames.remove(player.getName());
InetAddress address = player.getAddress().getAddress();
int count = onlinePerIp.getOrDefault(address, 0) - 1;
if (count == 0) {
onlinePerIp.remove(address);
} else {
onlinePerIp.put(address, count);
}
BukkitTask announcementTask = announcementTasks.get(player.getUniqueId());
if (announcementTask != null) {
announcementTask.cancel();
}
announcementTasks.remove(player.getUniqueId());
}
public int getOnlineByIp(InetAddress address) {
return onlinePerIp.getOrDefault(address, 0);
}
public boolean isNameOnline(String name) {
return onlineNames.contains(name);
}
}

View File

@ -0,0 +1,34 @@
package zone.potion.managers;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class ProfileManager {
private final Map<UUID, CoreProfile> profiles = new HashMap<>();
public CoreProfile createProfile(String name, UUID id, String address) {
CoreProfile profile = new CoreProfile(name, id, address);
profiles.put(id, profile);
return profile;
}
public CoreProfile getProfile(Player player) {
return (profiles.containsKey(player.getUniqueId()) ? profiles.get(player.getUniqueId()) : createProfile(player.getDisplayName(), player.getUniqueId(), player.getAddress().getAddress().getHostAddress()));
}
public void removeProfile(UUID id) {
profiles.remove(id);
}
public void saveProfiles() {
for (CoreProfile profile : profiles.values()) {
profile.save(false);
}
}
}

View File

@ -0,0 +1,74 @@
package zone.potion.managers;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import zone.potion.CorePlugin;
import zone.potion.player.CoreProfile;
import zone.potion.utils.message.CC;
import java.util.HashSet;
import java.util.Set;
@RequiredArgsConstructor
public class StaffManager {
@Getter
private final Set<CoreProfile> cachedStaff = new HashSet<>();
private final CorePlugin plugin;
public void addCachedStaff(CoreProfile profile) {
cachedStaff.add(profile);
}
public boolean isInStaffCache(CoreProfile profile) {
return cachedStaff.contains(profile);
}
public void removeCachedStaff(CoreProfile profile) {
cachedStaff.remove(profile);
}
public void messageStaff(String displayName, String msg, String server) {
String formattedMsg = CC.SECONDARY + "[Staff] " + ChatColor.DARK_AQUA + "[" + server + "] " + CC.SECONDARY + displayName + CC.R + ": " + msg;
messageStaff(formattedMsg);
}
public void messageStaff(String msg) {
for (CoreProfile profile : cachedStaff) {
Player loopPlayer = plugin.getServer().getPlayer(profile.getId());
if (loopPlayer != null && loopPlayer.isOnline()) {
loopPlayer.sendMessage(msg);
}
}
plugin.getServer().getConsoleSender().sendMessage(msg);
}
public void messageStaffWithPrefix(String msg, String server) {
msg = CC.SECONDARY + "[Staff] " + CC.D_AQUA + "[" + server + "] " + CC.R + msg;
for (CoreProfile profile : cachedStaff) {
Player loopPlayer = plugin.getServer().getPlayer(profile.getId());
if (loopPlayer != null && loopPlayer.isOnline()) {
loopPlayer.sendMessage(msg);
}
}
plugin.getServer().getConsoleSender().sendMessage(msg);
}
public void hideVanishedStaffFromPlayer(Player player) {
if (!plugin.getProfileManager().getProfile(player).hasStaff()) {
for (CoreProfile profile : cachedStaff) {
if (profile.isVanished()) {
Player loopPlayer = plugin.getServer().getPlayer(profile.getId());
if (loopPlayer != null && loopPlayer.isOnline()) {
player.hidePlayer(loopPlayer);
}
}
}
}
}
}

View File

@ -0,0 +1,181 @@
package zone.potion.player;
import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.User;
import me.lucko.luckperms.api.caching.MetaData;
import me.lucko.luckperms.api.caching.UserData;
import zone.potion.CorePlugin;
import zone.potion.storage.database.MongoRequest;
import zone.potion.utils.message.CC;
import zone.potion.utils.message.Messages;
import zone.potion.utils.time.TimeUtil;
import zone.potion.utils.timer.Timer;
import zone.potion.utils.timer.impl.DoubleTimer;
import zone.potion.utils.timer.impl.IntegerTimer;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Setter
@Getter
public class CoreProfile {
private final List<UUID> ignored = new ArrayList<>();
private final List<String> knownAddresses = new ArrayList<>();
private final String name;
private final UUID id;
private final Timer commandCooldownTimer = new DoubleTimer(1);
private final Timer reportCooldownTimer = new IntegerTimer(TimeUnit.SECONDS, 60);
private Timer chatCooldownTimer;
private UUID converser;
private String reportingPlayerName;
private boolean playingSounds = true;
private boolean messaging = true;
private boolean crossChat = true;
private boolean globalChatEnabled = true;
private boolean inStaffChat;
private boolean vanished;
private boolean frozen = false;
private long lastChatTime;
private int[] lastLocation = new int[]{0, 0, 0};
private int afkViolations = 0;
@SuppressWarnings("unchecked")
public CoreProfile(String name, UUID id, String address) {
this.name = name;
this.id = id;
this.knownAddresses.add(address);
CorePlugin.getInstance().getMongoStorage().getOrCreateDocument("players", id, (document, exists) -> {
if (exists) {
this.inStaffChat = document.getBoolean("staff_chat_enabled", inStaffChat);
this.messaging = document.getBoolean("messaging_enabled", messaging);
this.playingSounds = document.getBoolean("playing_sounds", playingSounds);
this.crossChat = document.getBoolean("cross_chat", crossChat);
List<UUID> ignored = (List<UUID>) document.get("ignored_ids");
if (ignored != null) {
this.ignored.addAll(ignored);
}
List<String> knownAddresses = (List<String>) document.get("known_addresses");
if (knownAddresses != null) {
for (String knownAddress : knownAddresses) {
if (knownAddress.equals(address)) {
continue;
}
this.knownAddresses.add(knownAddress);
}
}
}
save(false);
});
}
public void save(boolean async) {
MongoRequest request = MongoRequest.newRequest("players", id)
.put("name", name)
.put("staff_chat_enabled", inStaffChat)
.put("messaging_enabled", messaging)
.put("cross_chat", crossChat)
.put("playing_sounds", playingSounds)
.put("ignored_ids", ignored)
.put("known_addresses", knownAddresses);
if (async) {
CorePlugin.getInstance().getServer().getScheduler().runTaskAsynchronously(CorePlugin.getInstance(), request::run);
} else {
request.run();
}
}
public int getLastLocationX() {
return lastLocation[0];
}
public int getLastLocationY() {
return lastLocation[1];
}
public int getLastLocationZ() {
return lastLocation[2];
}
public void updateLastChatTime() {
lastChatTime = System.currentTimeMillis();
}
public boolean hasStaff(){
if(getPlayer() == null) return false;
return getPlayer().hasPermission("spike.staff");
}
public void ignore(UUID id) {
ignored.add(id);
}
public void unignore(UUID id) {
ignored.remove(id);
}
public boolean hasPlayerIgnored(UUID id) {
return ignored.contains(id);
}
public Player getPlayer() {
return Bukkit.getPlayer(id);
}
public boolean freeze(CommandSender executor) {
frozen = !frozen;
if (frozen) {
getPlayer().setWalkSpeed(0.0F);
getPlayer().setFlySpeed(0.0F);
getPlayer().setFoodLevel(0);
getPlayer().setSprinting(false);
getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 200));
Arrays.stream(Messages.FROZEN_MESSAGE).forEach(message -> Messages.sendCenteredMessage(getPlayer(), message));
executor.sendMessage(CC.RED + "Player frozen.");
return true;
}
getPlayer().setWalkSpeed(0.2f);
getPlayer().setFlySpeed(0.0001f);
getPlayer().setFoodLevel(20);
getPlayer().setSprinting(true);
getPlayer().removePotionEffect(PotionEffectType.JUMP);
getPlayer().sendMessage(CC.SECONDARY + "You have been unfrozen.");
executor.sendMessage(CC.RED + getPlayer().getName() + " has been unfrozen.");
return false;
}
public String getPrimaryGroupPrefix() {
User user = CorePlugin.getInstance().getLuckPermsApi().getUser(id);
UserData userData = user.getCachedData();
Contexts contexts = CorePlugin.getInstance().getLuckPermsApi().getContextForUser(user).get();
MetaData metaData = userData.getMetaData(contexts);
return metaData.getPrefix();
}
}

View File

@ -0,0 +1,102 @@
package zone.potion.redis;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.Getter;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPubSub;
import zone.potion.CorePlugin;
import zone.potion.redis.annotation.RedisHandler;
import zone.potion.redis.message.RedisMessage;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Getter
public class RedisMessenger {
private final JedisPool jedisPool;
private final CorePlugin plugin;
private Set<Object> listeners = new HashSet<>();
public RedisMessenger(CorePlugin plugin, String host, int port, int timeout, String password) {
this.plugin = plugin;
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(20);
this.jedisPool = new JedisPool(config, host, port, timeout, password);
}
public void initialize() {
//In order to avoid subscribing twice to the same redis channel, we add a simple set.
Set<String> subscribedChannels = Sets.newHashSet();
Map<String, Pair<Object, Method>> map = Maps.newHashMap();
//We schedule an asynchronous task to handle our subscriptions.
listeners.forEach(listener -> {
//After looping through each listener, we get that listener's methods, and try to find where the RedisHandler annotation is used, we add that to a set.
Set<Method> methods = getMethodsOfAnnotation(listener.getClass(), RedisHandler.class);
for (Method method : methods) {
//For each of these sets, we get the redis handler, check if we're already subscribed, if not, we subscribe to the channel.
RedisHandler handler = method.getAnnotation(RedisHandler.class);
if (!subscribedChannels.contains(handler.value())) {
map.put(handler.value(), new ImmutablePair<>(listener, method));
subscribedChannels.add(handler.value());
}
}
});
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
try (Jedis jedis = jedisPool.getResource()) {
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
map.forEach((c, pair) -> {
if (channel.equalsIgnoreCase(c)) {
try {
pair.getValue().invoke(pair.getKey(), RedisMessage.deserialize(message));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}, subscribedChannels.toArray(new String[0]));
}
});
}
public void send(String channel, Map<String, Object> message) {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> {
try (Jedis jedis = jedisPool.getResource()) {
jedis.publish(channel, RedisMessage.serialize(message));
}
});
}
public void registerListeners(Object... objects) {
for (Object object : objects) {
getListeners().add(object);
}
}
private Set<Method> getMethodsOfAnnotation(Class<?> clazz, Class<? extends Annotation> annotation) {
return Stream.of(clazz.getDeclaredMethods())
.filter(method -> method.isAnnotationPresent(annotation))
.collect(Collectors.toSet());
}
}

View File

@ -0,0 +1,14 @@
package zone.potion.redis.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RedisHandler {
String value();
}

View File

@ -0,0 +1,21 @@
package zone.potion.redis.message;
import com.google.gson.reflect.TypeToken;
import zone.potion.CorePlugin;
import java.lang.reflect.Type;
import java.util.Map;
public class RedisMessage {
public static Map<String, Object> deserialize(String string) {
Type type = new TypeToken<Map<String, String>>() {
}.getType();
return CorePlugin.GSON.fromJson(string, type);
}
public static String serialize(Map<String, Object> map) {
return CorePlugin.GSON.toJson(map);
}
}

Some files were not shown because too many files have changed in this diff Show More